论坛首页 Web前端技术论坛

图形间连线算法

浏览 18218 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-16  
我用写了一个,楼主参考,是画指定点到矩形边框的,两个矩形的情况可以看成是另一个矩形中心到这个矩形的边的连线。
这样考虑的好处是,你可以扩展成带转折点的连线。
程序运行后,点击屏幕画出指定点到矩形边的连线
package net.bookong.test;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class RectTest extends JFrame {

	/**
	 * 矩形的区域
	 */
	private Rectangle rect = new Rectangle(200,200,100,100);
	
	/**
	 * 指定点
	 */
	private Point point = null;
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String args[]) {
		try {
			
			RectTest frame = new RectTest();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the frame
	 */
	public RectTest() {
		super();
		setBounds(100, 100, 500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addMouseListener(new MouseAdapter(){
			public void mouseReleased(MouseEvent e){
				point = e.getPoint();
				repaint();
			}
		});
	}
	
	@Override
	public void paint(Graphics g){
		//画矩形
		g.drawRect(rect.x, rect.y, rect.width, rect.height);
		
		
		if(point != null){
			//画指定点
			g.drawOval(point.x-5, point.y-5, 10, 10);
		
			Point pt = getIntersection();
			g.drawLine(pt.x, pt.y, point.x, point.y);
		}
	}
	
	/**
	 * 计算指定点与矩形边的焦点
	 * @return  Point
	 */
	private Point getIntersection(){
		//矩形中心点坐标
		Point cR = new Point();
		cR.x = rect.x + rect.width/2;
		cR.y = rect.y + rect.height/2;
		
		Point pos = new Point();

		double halfW = rect.getWidth() / 2;
		double halfH = rect.getHeight() / 2;

		// 角alpha为矩形中心到右上角的线与矩形中心到右侧边垂线的夹角
		double alpha = Math
				.atan2((rect.getHeight() / 2), (rect.getWidth() / 2));
		// 角theta为矩形中心与指定点连线与矩形中心到右侧边垂线的夹角
		double theta = Math.atan2(rect.getY() + halfH - point.getY(), 
				point.getX() - rect.getX() - halfW);
		if (theta < 0) {
			theta += 2 * Math.PI;
		}

		if (theta <= alpha || theta >= 2 * Math.PI - alpha) {
			// 连线与右侧边有交点
			double h = halfW * Math.tan(theta);

			pos.setLocation(rect.getX() + rect.getWidth(), 
					rect.getY() + halfH - h);
		} else if (theta > alpha && theta <= Math.PI - alpha) {
			// 连线与上侧边有交点
			double w = halfH / Math.tan(theta);

			pos.setLocation(rect.getX() + halfW + w, rect.getY());
		} else if (theta > Math.PI - alpha && theta < Math.PI + alpha) {
			// 连线在左侧边有交点
			double h = halfW * Math.tan(theta);

			pos.setLocation(rect.getX(), rect.getY() + halfH + h);
		} else {
			// 连线在下侧边有交点
			double w = halfH / Math.tan(theta);

			pos.setLocation(rect.getX() + halfW - w, 
					rect.getY() + rect.getHeight());
		}

		return pos;
	}

}

  • 描述: 程序运行的截图
  • 大小: 35.9 KB
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics