锁定老帖子 主题:图形间连线算法
精华帖 (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; } } |
|
返回顶楼 | |