【问题标题】:Coding algorithm needed for orienting lines of a polygon as counter clockwise将多边形的线定向为逆时针方向所需的编码算法
【发布时间】:2018-07-22 22:55:13
【问题描述】:

我遇到了另一个问题。我有一个算法,它实现了绕组数算法来检测一个点是否位于多边形内。该算法要求多边形的边缘以逆时针方向定向。我目前正在通过检查多边形的中心是否在边缘的左侧来做到这一点。如果不是,则按顺时针方向制作线条,并更改缠绕数算法结果的符号。

在大多数情况下,这种方法效果很好。但是,我遇到了中心在多边形之外的情况。在这一点上,我的算法中断了,因为一些边被记录为逆时针,而实际上它们是顺时针的。

我一直在寻找一些资源以获得一些灵感:

How to determine if a list of polygon points are in clockwise order?

Ordering CONCAVE polygon vertices in (counter)clockwise?

https://math.stackexchange.com/questions/340830/clockwise-or-anticlockwise-edges-in-a-polygon

http://jeffe.cs.illinois.edu/teaching/373/notes/x05-convexhull.pdf

但是,这些资源主要处理凸多边形。我需要开发一种可以同时处理凸多边形和凹多边形的通用算法。虽然,如果这不存在(或无法完成),那么我将解决创建两个单独的算法并检测多边形是否是凹/凸的。

理想的算法将简单地检测特定边的方向是顺时针还是逆时针。但我对算法持开放态度,这些算法将在多边形的逆时针流中使用边缘和顶点。

我一直在考虑一种不需要使用多边形中心点的算法,因为结果将取决于中心是在多边形内部还是外部。

如果您有任何问题,请随时在 cmets 中,我会尽快回答。谢谢!

编辑:

我应该注意线条的方向是随机的。有些会是逆时针的。其他顺时针方向

【问题讨论】:

  • 如果您知道边是顺时针或逆时针顺序,并且您的多边形很简单(即边不交叉)并且您想要的绕组数就是检测一个点是否是是否在多边形中,那么既然如果绕组数为零,那么一个点在外面,你为什么要关心顺序?
  • 行的顺序并不是什么大问题。我想如果它能让问题更容易思考的话。要点是线条的方向是逆时针方向。 IE,开始和结束节点的顺序是多边形的“流”方向顺时针/逆时针

标签: c++ algorithm geometry


【解决方案1】:

假设你有一个无序列表的行,并且每一行都有一个开始顶点和一个结束顶点:

  • 为您的有序行创建一个空列表。
  • 从无序列表中随机选择一行,将其从无序列表移到有序列表中,并使其成为当前行。
  • 虽然无序列表中还剩几行:
    • 在无序列表中查找起始或结束顶点等于当前行的结束顶点的行,并将其从列表中删除。将其称为下一行。
    • 如果下一行的起始顶点等于当前行的结束顶点,则按原样添加到有序列表的末尾
    • 否则,如果下一行的结束顶点等于当前行的结束顶点,则交换下一行的开始和结束顶点并将其添加到有序列表的末尾
    • 使下一行成为新的当前行
  • 完成后,使用 Yves Daoust 的回答中描述的鞋带公式检查整个列表的顺序,如果为负,则交换所有行的开始和结束顶点

您可以使用哈希表(使用顶点值作为键)来更快地找到匹配的行。如果这些行已经按顺序排列(但有些是错误的方式),那么只需依次检查每一行与前一行的对比,如果当前的开始顶点不等于结束顶点,则交换开始和结束以前的。

如果您有多条线共享一个顶点,则此算法将不起作用。

【讨论】:

  • 太好了,使用您的建议和 Yves 的回答,我想出了一个我想测试的初步算法的想法。不是最理想的,因为有一些额外的步骤,但我猜如果行有某种顺序,然后检查当前行的结束节点是否等于下一行的开始节点,算法会更快如果不是,则换行。
  • 感谢您的回答!我一直在寻找,大多数答案都假设你已经知道你的缠绕方向。我的数据很糟糕。这正在帮助我解决它!
【解决方案2】:

使用鞋带公式计算多边形面积就足够了(没有绝对值)。如果面积为负,则颠倒顺序。

【讨论】:

  • 您好,感谢您的回复!鞋带配方,没听说过。我去看看!
  • 快速提问,算法如何处理中心在多边形之外并且边缘相对于多边形顺时针方向的情况?
  • @philm:多边形的方向与“中心”无关。 (事实上​​,多边形的the中心甚至都没有定义。)
  • 对于一些检查直线方向的算法,您可以计算包含多边形边缘和中心的 2 个节点的三角形面积。如果结果是否定的,则边缘为 CCW。我发现如果中心在多边形之外,那么这种方法可以表明边缘相对于多边形是 CW 方向,但结果表明边缘应该是 CCW(请参阅我发布的 pdf 的第 2 页)我的问题)。我想知道您在此处发布的方法是否会出现类似情况
  • @philm:忘记“中心”,它没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多