【问题标题】:How to detect if a line is coinciding with another figure?如何检测一条线是否与另一个图形重合?
【发布时间】:2012-11-14 14:30:03
【问题描述】:

我正在尝试编写一个程序来找到两点之间的最短路径。

我想出的是将起点连接到每个形状的所有顶点。这些点中的每一个都将连接到所有其他点 - 从而形成一种树。在圆形的情况下 - 线将达到与圆或弧相切的点(因为这是围绕对象的最短路径)。但是,那些穿过其他对象的线被丢弃。其余路径进行 *A** 搜索。

但是现在我如何让程序识别通过其他图形的线?我正在使用 Visual C++,所以我可以通过将某些坐标传递给相应的函数 (eg LineTo(21,23)) 在客户区绘制形状。它如何知道一条线何时进入另一个图形?

【问题讨论】:

  • 你需要一种光线追踪器 :-)
  • @ISTB 光线追踪器,线追踪器——不是吗?那么我该如何追踪一条线呢?

标签: algorithm visual-c++ geometry


【解决方案1】:

考虑到您迄今为止所做的简单算法:

  1. 对于每个形状,将所有顶点存储在一个数组(或列表)中,以便它们出现在形状上(顺时针或逆时针没有区别)。这使您可以轻松地迭代任何给定对象的边缘,因为在这种情况下边缘是 (P1, P2), >(P2, P3), ... (PN, P1) 其中 N 是顶点数。
  2. 对于您要检查的每条线是否与任何对象碰撞,请遍历您指定的所有边,以及您要检查的线是否与任何边缘相交 - 线与给定对象发生碰撞。

检查线与边缘的交叉是一个几何问题。如果我们正在检查的线的边界点是 P1=(x1,y1) 和 P2=(x2,y2),边缘的边界点为P3=(x3,y3)P4=(x4,y4) 那么你应该求解线性系统:

(x2 - x1) y + (y1 - y2) x = x1 y2 - x2 y1 ,
(x4 - x3) y + (y3 - y4) x = x 3 y4 - x4 y3

在获得 (x, y) 的值后,您应该检查它是否位于两条线(我们正在检查的线和边缘)的边界点之间的部分上。如果这是真的,那么你们的线会相互交叉。

注意:您可以通过在检查碰撞时不迭代每个对象的边缘来缩短运行时间,而只迭代那些位于直线路径中的对象。例如,这可以通过计算包含每个对象的最小矩形来完成,并检查您的线是否通过矩形,如果没有,则将对象从进一步检查中解散。

【讨论】:

  • 我不明白公式(x1 - x0) y + (y0 - y1) x = x0 y1 - x1 y0 - 你是怎么理解的?还有x0y0是什么?
  • @Ghost 那是我的一个错误......修复了它。它是由两点确定的直线方程;并且拥有其中两个意味着您拥有线性系统,其解决方案为您提供两条线的交点。
  • 我不确定您所说的顶点边界点是什么意思。一个顶点不就是一个点吗?这使它只是一个坐标?
【解决方案2】:

你可以区分两种情况:

其中一条线正在通过另一条线进入一个图形。在这种情况下,最简单的方法是用它们的方程来表示你的线(包括障碍物的边界)(它们看起来像a*x + b*y +c = 0)。那么判断两条线是否相交是一件很简单的事情:

  • 两条线 ax+by+c=0 和 dx+ey+f=0 相交当且仅当它们不平行时,即当且仅当 a*e-b*d != 0

  • 然后您必须检查这两条线的交点是否在您实际考虑的线段内。交点有坐标:

    • y = ( cd - af ) / (ae - db)
    • x = ( bf - ec ) / (ae - db)
  • 剩下的唯一任务是检查这些 x 和 y 是否属于段(如果它们在定义段的区间内) 然后对定义障碍的所有部分重复此操作。

如果你有圆圈,它会变得更棘手(这就是为什么你通常只将多边形视为障碍物),但基本上它是相同的想法: - 你有一条线 ax+by+c=0 和一个圆 (x-a)^2 + (y-b)^2 = r^2 (圆心 (a,b) 和半径 r)。然后你必须确定它们是否相交、相交点以及它是否属于你考虑的线段。我会把计算留给你。

如果您对在有障碍物的两点之间寻找路径的不同方法感兴趣,您可以使用其他算法,虽然这些算法不会为您提供最短路径,但只能提供路径:

与您正在构建的可见性图相比,这些算法的兴趣在于,这两个在您的任何维度上都有效:如果您想将算法升级到维度,您的算法将具有更高的复杂性(需要更多time to find a path) 然后这两个并不会产生最短路径。

【讨论】:

  • 我不太明白你是如何得到y = ( cd - af ) / (ae - db) 的。
  • 借助第二个等式,您可以在 x 和 y 之间建立关系:dx+ey+f=0 因此 x = ( - f - ey ) / d (假设 d 不为空) 然后插入x in ax+by+c=0, a * (- f - ey) / d + by + c = 0, y ( bd - ae ) / d = af / d - c, 最后是 y = (cd - af ) / (ae - bd)
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多