algorithm - 如何检测一条线是否与另一个图形重合?

标签 algorithm visual-c++ geometry

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

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

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

最佳答案

考虑到您到目前为止所做的事情的直接算法:

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

检查线与边的交叉是一个几何问题。如果我们正在检查的线的边界点是 P1=(x1,y1) 和 < strong>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 = x3 y4 - x4 y3 .

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

注意:您可以通过在检查碰撞时不遍历每个对象的边缘,而只遍历在线路径中的那些对象来缩短运行时间。例如,这可以通过计算包含每个对象的最小矩形来完成,并检查您的线是否穿过矩形,如果不通过则取消对象进一步检查。

关于algorithm - 如何检测一条线是否与另一个图形重合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13304575/

相关文章:

c# - 帮我优化这个平均计算片段

java - 多个坐标之间的距离

c# - 检查一个点是否在旋转的矩形中(C#)

algorithm - 给定一个实数列表。什么是将它们分组在一起以使组中的最大值和最小值小于 5 的好算法?

python - 如何在 N 个较小的矩形上拆分一个大矩形以使其看起来随机?

c - cl : array type has incomplete element type => why warning and not error?

winapi - 增加GetOpenFileName文件选择对话框的文件名字段中的字符数

c++ - 如何在 __asm 中使用变量?

css - 仅在一侧的 css 圆周围添加白色轮廓

algorithm - 动态规划——修改自下而上的切杆算法