【问题标题】:Overlap checking between two lines两条线之间的重叠检查
【发布时间】:2015-10-16 06:16:28
【问题描述】:

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

用于绘制的数据:

第 1 行:

起始坐标:-121.001525, 632.378285

结束坐标:-125.106805, 625.773505

半径:1

第 2 行:

起始坐标:-121.116355, 632.866595

结束坐标:-133.183055, 631.490825

半径:2.5

我如何绘制这张图片:

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

现在进入正题,视觉上我们可以看到图像是相交的,但线没有相交。如果线相交,那么我们可以很容易地找到线是否相交。但在我的情况下,线条不相交,但图像相交,所以如何检查两个图像是否相交?

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

【问题讨论】:

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

标签: math geometry line intersection


【解决方案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 建立了一个括号,检查这三个括号是否兼容就足够了。

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

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

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

第一个关系是一个二次不等式,您可以通过求根轻松解决它,它会产生u 的括号。然后检查两个括号是否兼容。

另一个圆圈的测试很相似,只是平移中心。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      晚了很多年,但以防有人遇到同样的问题。

      一种经典的 3D 球柱算法是由 Vega 和 Lago 开发的算法。

      一种评估杆之间最短距离的快速算法。 C Vega, S Lago - 计算机与化学,1994 年。 https://doi.org/10.1016/0097-8485(94)80023-5

      您可以轻松找到该算法已经在 C 和 Fortran 中实现。简化为 2D 很简单。

      【讨论】:

        猜你喜欢
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多