`

VertexRenderer中获取与连线之间的交叉点的方法

 
阅读更多
getPerimeterPoint(VertexView view, Point2D source, Point2D p)

 是获取VertexView的边框与连线之间的交叉点的方法。

 

 

源码:

 

 

	/**
	 * Returns the intersection of the bounding rectangle and the straight line
	 * between the source and the specified point p. The specified point is
	 * expected not to intersect the bounds.
	 */
	public Point2D getPerimeterPoint(VertexView view, Point2D source, Point2D p) {
		Rectangle2D bounds = view.getBounds();
                Icon icon = GraphConstants.getIcon(view.getAllAttributes());
                
              
		double x = bounds.getX();
		double y = bounds.getY();
		double width = bounds.getWidth();
		double height = bounds.getHeight();
		double xCenter = x + width / 2;
		double yCenter = y + height / 2;
		double dx = p.getX() - xCenter; // Compute Angle
		double dy = p.getY() - yCenter;
		double alpha = Math.atan2(dy, dx);
		double xout = 0, yout = 0;
		double pi = Math.PI;
		double pi2 = Math.PI / 2.0;
		double beta = pi2 - alpha;
		double t = Math.atan2(height, width);
		if (alpha < -pi + t || alpha > pi - t) { // Left edge
			xout = x;
			yout = yCenter - width * Math.tan(alpha) / 2;
		} else if (alpha < -t) { // Top Edge
			yout = y;
			xout = xCenter - height * Math.tan(beta) / 2;
		} else if (alpha < t) { // Right Edge
			xout = x + width;
			yout = yCenter + width * Math.tan(alpha) / 2;
		} else { // Bottom Edge
			yout = y + height;
			xout = xCenter + height * Math.tan(beta) / 2;
		}
		return new Point2D.Double(xout, yout);
	}

 

 

如果想在连线连接图元对象时,连接到图元的图标范围上,而不是连接到图元的边框上(有些图元设置了小图标,而显示的名称很小,连线连到图元的边框时,看上去感觉不是连接到图元上)

 

 

连接到图标上,可以修改如下:

 

 

	/**
	 * Returns the intersection of the bounding rectangle and the straight line
	 * between the source and the specified point p. The specified point is
	 * expected not to intersect the bounds.
	 */
	public Point2D getPerimeterPoint(VertexView view, Point2D source, Point2D p) {
		Rectangle2D bounds = view.getBounds();
                //获取图标
                Icon icon = GraphConstants.getIcon(view.getAllAttributes());
                if (icon != null) {//图标不为空
                    //获取X坐标偏移的大小
                    double doubX = bounds.getX() + (bounds.getWidth()-icon.getIconWidth())/2;
                    //重新构建边框(图标的边框)
                    bounds = new Rectangle2D.Double(doubX, bounds.getY(), icon.getIconWidth(), icon.getIconWidth());
                }

		double x = bounds.getX();
		double y = bounds.getY();
		double width = bounds.getWidth();
		double height = bounds.getHeight();
		double xCenter = x + width / 2;
		double yCenter = y + height / 2;
		double dx = p.getX() - xCenter; // Compute Angle
		double dy = p.getY() - yCenter;
		double alpha = Math.atan2(dy, dx);
		double xout = 0, yout = 0;
		double pi = Math.PI;
		double pi2 = Math.PI / 2.0;
		double beta = pi2 - alpha;
		double t = Math.atan2(height, width);
		if (alpha < -pi + t || alpha > pi - t) { // Left edge
			xout = x;
			yout = yCenter - width * Math.tan(alpha) / 2;
		} else if (alpha < -t) { // Top Edge
			yout = y;
			xout = xCenter - height * Math.tan(beta) / 2;
		} else if (alpha < t) { // Right Edge
			xout = x + width;
			yout = yCenter + width * Math.tan(alpha) / 2;
		} else { // Bottom Edge
			yout = y + height;
			xout = xCenter + height * Math.tan(beta) / 2;
		}
		return new Point2D.Double(xout, yout);
	}

 

 

 

分享到:
评论

相关推荐

    python matplotlib 在指定的两个点之间连线方法

    为了找到matplotlib在两个点之间连线的方法真是费了好大功夫,最后还是决定用简单的 plt.plot 来解决。如果有好多对点,则可以通过循环实现连接,还可以用 plt.arrow 画箭头,具体可参考这里 import matplotlib....

    DIV+JS画图,DIV与DIV之间的连线!

    实现DIV与DIV之间的连线,工程流程图那样.使用DIV+JS! 我封装了一个基于vml/svg画线条的跨浏览器的函数 用法: var g = new FlowGraphic(); var arrow = g.drawArrow(5,26,200,300,"red"); var arrow = g.drawArrow...

    许多点之间连线最短 python实现

    标题中的“许多点之间连线最短 python实现”指的是在计算机科学中解决的一个经典问题,即在二维平面上找到一组点之间的最短路径网络。这个问题通常出现在图形算法、地理信息系统(GIS)或者网络优化等领域。Python...

    Unity NGUI制作的连线方法

    在这个"Unity NGUI制作的连线方法"的Demo中,我们将探讨如何通过Unity和NGUI来实现两点之间的连线效果,特别是使用UISprite来拼接成一条虚线。这个技术常应用于游戏的副本界面,为玩家提供路径指示或者状态连接等...

    js\vue版 工作流 节点 连线

    4. **连线(Connection)**:连线用于连接工作流中的节点,表示任务之间的流转路径。在Vue.js中,连线可能由自定义SVG图形或HTML元素实现,利用CSS和JavaScript来处理拖拽和连接操作。连线的起点和终点需要与节点上...

    Unity物体与UI连线插件

    简单实现物体与UI连线功能

    c#控件连线拖动

    总结起来,"c#控件连线拖动"涉及了C#中控件的动态创建、事件处理、图形绘制以及数据持久化等多个关键知识点,它提供了一种直观的方式来构建和可视化控件之间的关系。通过理解并实践这些技术,开发者可以创建出更富有...

    安卓百度地图实现多点连线

    在实际应用中,你可能需要动态获取多点数据,例如从服务器获取路径规划的坐标点。你可以创建一个方法来接收这些点并绘制: ```java public void drawRoute(List&lt;LatLng&gt; routePoints) { PolylineOptions options =...

    CASS展点框选连线

    在进行公路工程设计时,通常需要将野外测量获取的点数据导入到CASS中。这些点数据可能包含了地形高程、控制点坐标等信息。CASS提供了便捷的数据导入功能,可以快速将这些数据转化为可编辑的图形元素,便于后续的展点...

    安卓百度地图实现自定义多点连线

    地图、百度地图、自定义多点连线轨迹,安卓版

    canvas实现js、html连线

    本话题主要围绕如何使用canvas技术来实现JavaScript与HTML之间的连线功能,包括左右连线和上下连线。 首先,我们需要了解HTML5中的`&lt;canvas&gt;`元素。这是一个矩形区域,可以用于绘制2D图形,如线条、形状、文字等。...

    Android 画布Canvas之控件连线操作Demo

    1.在画布中的控件A长按能进行控件的连接,只有在控件B范围内抬起控件之间的连线才能连接成功; 2.当控件连线成功后,拖动控件AB之间的连线随着控件的拖动随之变化; 3.控件连线在屏幕上随着手势滑动触碰到连接则...

    connection连线样式走线方式

    标题中的“connection连线样式走线方式”主要涉及的是在图形用户界面(GUI)或软件开发中,特别是在绘制流程图、电路图或者数据流图时,如何处理元素之间的连接线,即连线的样式和布局方法。这通常涉及到图形库或者...

    html5做连线题

    2. **JavaScript初始化**:在JavaScript中获取canvas元素的2D渲染上下文,并定义一些变量来存储连线题的数据,如题目、答案等。 ```javascript var canvas = document.getElementById('myCanvas'); var ctx = ...

    彻底解决jtopo连线重合的问题.rar

    为了解决这一问题,压缩包中的"彻底解决jtopo连线重合的问题"很可能包含了一个定制的解决方案或者更新后的jtopo版本,其目的是优化连线的绘制策略,确保即使在有大量连线的情况下,每一条线都能清晰可见,不会与其他...

    matlab多点,matlab多点连线,matlab源码.zip

    总的来说,这个MATLAB源码库很可能是为了教学或实例演示目的,帮助学习者掌握如何在MATLAB中有效地处理和可视化多点数据,以及如何通过连线来描绘数据之间的关系。通过研究这些源码,用户不仅可以学习基本的绘图技巧...

    在线考试连线题 js demo

    在线考试连线题是一种常见的考核方式,它要求考生在指定的图形或文字之间建立正确的关联。在Web开发领域,实现这样的功能通常需要利用JavaScript、HTML5和ECMAScript等前端技术。本示例"在线考试连线题 js demo"显然...

    qt实现qgaphicsitem的拖动连线等操作

    本教程将深入探讨如何利用Qt实现QGraphicsItem的拖动、缩放以及它们之间的连线操作。 首先,我们需要创建自定义的QGraphicsItem类,继承自QGraphicsItem。在这个类中,我们将重写几个关键方法以实现拖动和缩放功能...

    Unity LineRenderer 连线功能示例工程

    Unity中的LineRenderer组件是用于创建线形图形的工具,它在游戏开发中有着广泛的应用,如绘制路径、连线、粒子轨迹等。在这个“Unity LineRenderer 连线功能示例工程”中,我们可以深入理解如何利用LineRenderer实现...

Global site tag (gtag.js) - Google Analytics