将多边形的定位线作为逆时针而定向线所需的编码算法

Coding algorithm needed for orienting lines of a polygon as counter clockwise

本文关键字:编码 算法 逆时针 定位 多边形      更新时间:2023-10-16

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

在大多数情况下,此方法效果很好。但是,我遇到了中心在多边形外面的情况。在这一点上,我的算法断开,因为当一些边在顺时针方向时将某些边缘记录为逆时针。

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

如何确定多边形点是否顺时针顺序?

在(反(顺时针方面订购凹入多边形顶点?

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

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

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

理想的算法将简单地检测到特定的边缘是顺时针方向或顺时针顺时针方向而定。但是我对算法开放,该算法将在多边形的逆时针流中求和边缘和顶点。

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

如果您有任何疑问,请随时以评论中的评论,我会尽快回答。谢谢!

编辑:

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

假设您有一个无序的行列表,并且每个线都有一个启动顶点和一个端顶点:

  • 为您的有序行创建一个空列表。
  • 随机从未排序的列表中选择一条行,将其从未排序的列表中移动到订购列表,并将其作为当前行。
  • 虽然无序列表中仍有行:
    • 在未排序的列表中找到一条线,该线的起点或结尾顶点等于当前行的末端顶点并将其从列表中删除。将其称为下一行。
    • 如果下一行的启动顶点等于当前行的末端顶点,请将其添加到订购列表的末尾
    • 否则下一行的末端顶点等于当前行的末端顶点,请交换下一行的开始和结束顶点,然后将其添加到订购列表的末尾
    • 使下一行新的当前行
  • 完成后,请使用Yves Daoust的答案中所述的鞋款公式检查整个列表的排序,如果是负面的,请交换所有行的启动和结束顶点

您可以使用哈希表(使用顶点值作为密钥(使查找匹配线更快。如果线已经按顺序(但有些是错误的(以前的。

如果您有一个以上的线共享一个顶点,那么此算法将无法正常工作。

使用鞋带公式(无绝对值(计算多边形区域就足够了。如果该区域为负,请转换订单。