查找包含点的多边形的算法 - 仅定义线

时间:2013-05-10 16:36:53

标签: algorithm lines polygons point-in-polygon autocad-plugin

我有一个有许多直线的2D绘图。 所有这些线都是数学上已知的。而且他们独立于其他人。

你可以认为我知道每条线的起点和终点,我可以让它们相交以找到所有的交点。 (详细地说,它们属于Autocad,但我只能通过代码工作。所以,我希望Algorythm不仅仅是Autocad解决方案,尽管也欢迎Autocad解决方案。)

问题是:给定一个点(任何地方),我想找到包含它的较小多边形。该多边形将由最近的线形成。


详细说明:

我没有声明的多边形。只是线条。 任意数量的线,任何大小,任何位置。一个给定的点。

这些线可以形成一个多边形,很多或没有。所以多边形看起来没有规则。任意数量的方面,没有规律性。 (形成多边形的点是通过相交线找到的。线条是有限的,如果它们不相交,它们就不会形成多边形。)

我的答案是可能包含给定点的最小多边形。

2 个答案:

答案 0 :(得分:2)

好的,我一直在思考这个问题,我已经制定了一个backtracking 算法,我相信它会起作用。我们的想法是,您将尝试以逆时针方式构建多边形。我们将设置问题,使我们找到的第一个多边形最小。这样,我们就不必找到所有这些。

<强>算法:

  1. 按照它们与目标点的接近程度对线段进行排序。
    • 从此以后,只要你需要循环遍历这些行,就按照这个排序顺序循环遍历
    • 在计算距目标点的距离时,将线段视为无限线。 point/line distance
  2. 使用沿着“逆时针”方向的线的第二个交叉点,使用最近的线段执行步骤3
    • “逆时针”表示将目标点放在线条左侧的方向。
    • 注意:第一个交叉点有望成为我们在目标点周围工作的最终结果
  3. 在新发现的一行......

    一个。遍历所有其他线路,这些线路尚未成为您正在构建的形状的一部分,找到与此线路的交点 B.相对于目标点逆时针对交点排序 counter-clockwise sorting

  4. 在当前行上逆时针查找下一个交叉点。如果这是我们检查这一行的第一点,那么“下一个”点就是将我们带到这一行的交叉点之后的那一点。

    一个。如果没有这样的观点(这可能意味着我们已经检查了当前行的所有点),那么当前的候选解决方案是不可行的......

    • 回溯到上一行并重复步骤4 ,并在该行的下一个点。
    • 如果没有上一行(即,您在开始形状的行上), Backtrack 并使用下一个最近的行执行第2步 ,开始一个新的形状。

    B中。如果形成交点的线在其左侧(逆时针)没有目标点,则它将形成的多边形不包围目标点。 对下一个点的当前行重复步骤4 C.如果形成交叉点的线是您开始的线,那么我们找到了解决方案
    D.如果上述情况均不属实,则对构成交叉点的直线执行步骤3

  5. <强>优化:

    1. 如果少于3行,则没有解决方案。不要做任何工作。
    2. 您可能希望在找到它们时缓存交叉点,这样就不必重新计算它们
      • 如果您选择这样做,我建议使用2D数组
    3. 当你知道它们不是解决方案的一部分时,我建议抛弃线条。
      • 示例:如果您已经尝试过最接近目标点的线,但它没有找到解决方案,那么在其他线上找到交叉点时包含该线是没有意义的。
    4. <强>说明:

      • 这种算法最容易递归实现。
      • 如果目标点在 其中一行
      • ,您必须决定该怎么办

答案 1 :(得分:1)

我相信以下算法可行:

  1. 如果少于3行,则退出。没有解决方案。
  2. 确定最接近目标点的线。这条线保证是解决方案的一部分。
  3. 设P1为目标点在L1上的垂直投影。
  4. 找到其他线的两个交叉点,其中L1最靠近P1并位于其两侧。这两点保证是解决方案的一部分。
    • 让我们称这些点为P2&amp; P3,并拨打第L2和L3行
    • 如果没有这些要点,则无法解决。
  5. 找到距离P2和L3最近的L2和L3的最近点。 P3分别与L1位于目标点的同一侧。
  6. 重复步骤4和5,直至:
    • 从两个方向找到的行是同一行
    • 从两个方向找到的交点是同一点
    • 没有符合条件的要点。这意味着没有解决方案。