Math 两行之间的重叠检查

Math 两行之间的重叠检查,math,geometry,line,intersection,Math,Geometry,Line,Intersection,我想检查两条线是否相交。我知道如何检查两条线之间的交点的算法,但在我的例子中,我有一些不同的问题。为了解释我的问题,我在此附上图片 用于绘制的数据: 第1行: 起始坐标:-121.001525、632.378285 端部坐标:-125.106805、625.773505 半径:1 第2行: 起始坐标:-121.116355632.866595 端部坐标:-133.183055631.490825 半径:2.5 我如何绘制这幅图像: 在图像中,您可以看到中心线为黑色。然后用这个半径画出图像的轮廓

我想检查两条线是否相交。我知道如何检查两条线之间的交点的算法,但在我的例子中,我有一些不同的问题。为了解释我的问题,我在此附上图片

用于绘制的数据:

第1行:

起始坐标:-121.001525、632.378285

端部坐标:-125.106805、625.773505

半径:1

第2行:

起始坐标:-121.116355632.866595

端部坐标:-133.183055631.490825

半径:2.5

我如何绘制这幅图像:

在图像中,您可以看到中心线为黑色。然后用这个半径画出图像的轮廓

现在说到这里,从视觉上我们可以看到图像是相交的,但直线是不相交的。如果直线相交,那么我们可以很容易地找到该直线是否相交。但在我的例子中,直线不相交,但图像是相交的,因此如何检查两个图像是否相交


如何解决这个问题有什么建议吗

如果我理解您的问题,您需要检查两个体育场形状(两个半圆盘和一个矩形)的交点,这两个形状对应于两条线段的给定距离

为了简化问题,您可以首先将
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
的括号,足以检查这三个括号是否兼容

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

对于原点的圆,我们必须有

Px²+Py²=((1-u)P0x+uP1x)²+((1-u)P0y+uP1)²≤R², 0≤u≤1.
第一个关系是一个二次不等式,你可以很容易地通过求根来解决,它产生了一个
u
的括号。然后检查两个支架是否兼容


另一个圆的测试非常相似,只需平移中心。

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

很多年后,但万一有人用同样的问题来讨论这个话题

Vega和Lago开发了一种用于3D球形容器的经典算法

一种计算杆间最短距离的快速算法。 C Vega,S Lago-计算机与化学,1994年。


您很容易发现这个算法已经用C和Fortran实现了。简化为2D很简单。

如何检查两条线段是否相交?我已经开发了算法来查找两条直线之间的交点。这不是问题所在。您需要创建一些虚拟线-与每条实际线垂直偏移1/2半径的线。这些线由包含图片中红色区域的直线段表示。如果任何一条实线或虚拟线之间有交点,你就有了交点。我不能这样做。我有理由。如果我要创建一条虚拟线,那么我必须为两条线创建4条虚拟线。然后,我必须对所有相交或不相交的线进行调整,以降低性能,这就是为什么我试图以这种方式处理中心线。@Shiladittyacharaborty:不管你喜欢与否,如果你想精确解决这个问题,有一个你无法避免的最小成本。此成本大致等于有利情况下的两条直线相交操作,在其他情况下,您必须添加两条圆直线相交。