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);
}
分享到:
相关推荐
为了找到matplotlib在两个点之间连线的方法真是费了好大功夫,最后还是决定用简单的 plt.plot 来解决。如果有好多对点,则可以通过循环实现连接,还可以用 plt.arrow 画箭头,具体可参考这里 import matplotlib....
实现DIV与DIV之间的连线,工程流程图那样.使用DIV+JS! 我封装了一个基于vml/svg画线条的跨浏览器的函数 用法: var g = new FlowGraphic(); var arrow = g.drawArrow(5,26,200,300,"red"); var arrow = g.drawArrow...
标题中的“许多点之间连线最短 python实现”指的是在计算机科学中解决的一个经典问题,即在二维平面上找到一组点之间的最短路径网络。这个问题通常出现在图形算法、地理信息系统(GIS)或者网络优化等领域。Python...
在这个"Unity NGUI制作的连线方法"的Demo中,我们将探讨如何通过Unity和NGUI来实现两点之间的连线效果,特别是使用UISprite来拼接成一条虚线。这个技术常应用于游戏的副本界面,为玩家提供路径指示或者状态连接等...
4. **连线(Connection)**:连线用于连接工作流中的节点,表示任务之间的流转路径。在Vue.js中,连线可能由自定义SVG图形或HTML元素实现,利用CSS和JavaScript来处理拖拽和连接操作。连线的起点和终点需要与节点上...
简单实现物体与UI连线功能
总结起来,"c#控件连线拖动"涉及了C#中控件的动态创建、事件处理、图形绘制以及数据持久化等多个关键知识点,它提供了一种直观的方式来构建和可视化控件之间的关系。通过理解并实践这些技术,开发者可以创建出更富有...
在实际应用中,你可能需要动态获取多点数据,例如从服务器获取路径规划的坐标点。你可以创建一个方法来接收这些点并绘制: ```java public void drawRoute(List<LatLng> routePoints) { PolylineOptions options =...
在进行公路工程设计时,通常需要将野外测量获取的点数据导入到CASS中。这些点数据可能包含了地形高程、控制点坐标等信息。CASS提供了便捷的数据导入功能,可以快速将这些数据转化为可编辑的图形元素,便于后续的展点...
地图、百度地图、自定义多点连线轨迹,安卓版
本话题主要围绕如何使用canvas技术来实现JavaScript与HTML之间的连线功能,包括左右连线和上下连线。 首先,我们需要了解HTML5中的`<canvas>`元素。这是一个矩形区域,可以用于绘制2D图形,如线条、形状、文字等。...
1.在画布中的控件A长按能进行控件的连接,只有在控件B范围内抬起控件之间的连线才能连接成功; 2.当控件连线成功后,拖动控件AB之间的连线随着控件的拖动随之变化; 3.控件连线在屏幕上随着手势滑动触碰到连接则...
标题中的“connection连线样式走线方式”主要涉及的是在图形用户界面(GUI)或软件开发中,特别是在绘制流程图、电路图或者数据流图时,如何处理元素之间的连接线,即连线的样式和布局方法。这通常涉及到图形库或者...
2. **JavaScript初始化**:在JavaScript中获取canvas元素的2D渲染上下文,并定义一些变量来存储连线题的数据,如题目、答案等。 ```javascript var canvas = document.getElementById('myCanvas'); var ctx = ...
为了解决这一问题,压缩包中的"彻底解决jtopo连线重合的问题"很可能包含了一个定制的解决方案或者更新后的jtopo版本,其目的是优化连线的绘制策略,确保即使在有大量连线的情况下,每一条线都能清晰可见,不会与其他...
总的来说,这个MATLAB源码库很可能是为了教学或实例演示目的,帮助学习者掌握如何在MATLAB中有效地处理和可视化多点数据,以及如何通过连线来描绘数据之间的关系。通过研究这些源码,用户不仅可以学习基本的绘图技巧...
在线考试连线题是一种常见的考核方式,它要求考生在指定的图形或文字之间建立正确的关联。在Web开发领域,实现这样的功能通常需要利用JavaScript、HTML5和ECMAScript等前端技术。本示例"在线考试连线题 js demo"显然...
本教程将深入探讨如何利用Qt实现QGraphicsItem的拖动、缩放以及它们之间的连线操作。 首先,我们需要创建自定义的QGraphicsItem类,继承自QGraphicsItem。在这个类中,我们将重写几个关键方法以实现拖动和缩放功能...
Unity中的LineRenderer组件是用于创建线形图形的工具,它在游戏开发中有着广泛的应用,如绘制路径、连线、粒子轨迹等。在这个“Unity LineRenderer 连线功能示例工程”中,我们可以深入理解如何利用LineRenderer实现...