我想检查两条线是否交叉。我知道如何检查两条线之间交叉的算法,但在我的情况下,我有一些不同的问题。为了解释我的问题,我在这附加图像。
用于绘制的数据:
Line - 1:
开始坐标:-121.001525,632.378285
结束坐标:-125.106805,625.773505
半径:1
Line - 2:
开始坐标:-121.116355,632.866595
结束坐标:-133.183055,631.490825
半径:2.5
我如何绘制此图片:
在图像中,您可以看到中心线为黑色。并使用此半径绘制图像轮廓。
现在来到这一点,从视觉上我们可以看到图像相交但线不相交。如果线相交,那么我们可以很容易地发现线是否相交。但在我的情况下,线条不相交,但图像相交,所以如何检查两个图像是否交叉?
有任何建议如何解决这个问题?
答案 0 :(得分:1)
如果我理解你的问题,你想要检查两个体育场形状(两个半圆盘和一个矩形)的交叉点,它们对应于两个线段的给定距离。
要简化问题,您可以先将R1
缩减为零,同时将R2
增加到R=R2+R1
。然后你需要检查一个线段与体育场形状的交叉点。
旋转并平移所有端点,以便体育场形状的起点和终点到达原点(0, 0)
和X轴上的点(L, 0)
。
设P0和P1为线段的端点。参数方程是
P = (1-u) P0 + u P1,
0≤u≤1
。
通过评估线性不等式的兼容性来检查与矩形的交点
0≤Px=(1-u)P0x+uP1x≤L, -R≤Py=(1-u)P0y+uP1≤R, 0≤u≤1.
这三个关系确定每个u
的包围,并且足以检查三个支架是否兼容。
然后你需要检查两个(半)圆的交点。
对于原点的圆圈,我们必须
Px²+Py²=((1-u)P0x+uP1x)²+((1-u)P0y+uP1)²≤R², 0≤u≤1.
第一个关系是二次方不等式,你可以通过找到根来轻松解决它,并产生u
的括号。然后检查两个支架是否兼容。
另一个圆圈的测试非常相似,只需翻译中心。
答案 1 :(得分:1)
通过检查从一个段到另一个段的距离是否小于每个段的组合半径r,可以快速检查由半径r膨胀的两个段是否相交。 因此,在您的情况下,如果从段1到段2的距离小于半径1 +半径2,则形状1与形状2相交。 当然,通过这样做,你不知道他们确实在哪里相互交叉,但你知道他们确实相互交叉。
答案 2 :(得分:0)
很多年迟了,但是以防万一有人遇到同样的问题。
Vega和Lago开发的一种经典的3D球面圆柱体算法。
一种快速算法,用于评估杆之间的最短距离。 C Vega,S Lago-计算机与化学,1994年。 https://doi.org/10.1016/0097-8485(94)80023-5
您可以轻松地找到已经在C和Fortran中实现的算法。缩小为2D很简单。