2015-10-16 142 views
1

我想检查两条线是否相交。我知道如何检查两条线的交点的算法,但在我的情况下,我有一些不同的问题。为了解释我的问题,我在这里附上图片。两条线之间的重叠检查

enter image description here

数据用于绘制:

行 - 1:

起始坐标:-121.001525,632.378285

结束坐标:-125.106805,625.773505

半径:1

线 - 2:

起始坐标:-121.116355,632.866595

结束坐标:-133.183055,631.490825

半径:2.5

如何得出这样的形象:

在图像你可以看到中线是黑色的。并使用此半径绘制图像轮廓。

现在来看看,我们可以看到图像相交但线条不相交。如果线条相交,那么我们可以很容易地找到线条相交或不相交。但在我的情况下,线不相交,但图像相交,以便如何检查两个图像是否相交?

任何建议如何解决这个问题?

+0

如何检查两段是否相交? – Nyavro

+0

我已经开发了算法来找到两条线的交点。这不是问题。 –

+0

您需要创建一些虚拟线 - 垂直于每条实线的半径偏移1/2的线。这些线条由包围图片中红色区域的直线段表示。如果在任何实线或虚拟线之间存在交叉点,那么就有一个交点。 – enhzflep

回答

1

如果我理解你的问题,你想检查两个体育场形状(两个半盘和一个矩形)的交集,它们对应于给定距离到两条线段。

为了简化问题,您可以先将R1减小到零,同时将R2增加到R=R2+R1。然后你需要检查线段与体育场形状的交点。

旋转并翻译所有端点,以便体育场形状的起点和终点在X轴上到达原点(0, 0)和点(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一个包围并就足够了检查,这三个bracketings是兼容的。

然后你需要检查两个(半)圆的交点。

为原点的循环,必须有

Px²+Py²=((1-u)P0x+uP1x)²+((1-u)P0y+uP1)²≤R², 0≤u≤1. 

第一关系是二次不等式,你可以很容易地通过查找根源并解决它产生的u一个包围。然后检查两个支架是否兼容。

其他圆圈的测试非常相似,只是翻译中心。

1

您可以通过检查一个段到另一个段的距离是否小于每个段的组合半径r来快速检查两个由半径r膨胀的段是否相交。 因此,在你的情况下,如果从段1到段2的距离小于半径1 +半径2,那么形状1与形状2相交。 当然,通过这样做,你不知道它们确实彼此相交,但是你知道他们做到了。