作为对我的帖子的扩展和部分回答,我编写了一个简单的算法,可以给定一组具有xy坐标的点形成非自交多边形。
声明:给定任意不同坐标的点集,总是可以构造正则或非正则、无自交多边形。
算法:
假设存在包含所有顶点的集合V
1)按x坐标对V中的所有顶点进行排序
2)想象一条与x轴平行的直线(我们称之为“分隔符”),从第一个节点开始向无限扩展,并将顶点分成两个集合。
3)现在考虑这两个集合:
A = 所有在分隔符线上方或在其上方的顶点的集合
B = 所有剩余的顶点的集合
4)从A的最左侧的顶点开始连接所有在A中的顶点,直到到达最右侧的顶点
5)如果排序后的集合V中最右侧的顶点(具有最大的x坐标的顶点)不在A中,则连接该最后一个顶点(A中最右侧的顶点)与它相连。
6)倒序工作,从排序后的集合V中最右侧的顶点(具有最大的x坐标的顶点)开始连接所有在B中的顶点
7)将B的第一个(最左侧的B顶点)顶点与A的最左侧顶点连接起来。
我认为该算法是正确的,找不到它会失败的测试,但也许我漏掉了什么。
如果可以的话,我希望你能看一下并给我一个例子,证明它无法工作(我相信一定有)。
声明:给定任意不同坐标的点集,总是可以构造正则或非正则、无自交多边形。
算法:
假设存在包含所有顶点的集合V
1)按x坐标对V中的所有顶点进行排序
2)想象一条与x轴平行的直线(我们称之为“分隔符”),从第一个节点开始向无限扩展,并将顶点分成两个集合。
3)现在考虑这两个集合:
A = 所有在分隔符线上方或在其上方的顶点的集合
B = 所有剩余的顶点的集合
4)从A的最左侧的顶点开始连接所有在A中的顶点,直到到达最右侧的顶点
5)如果排序后的集合V中最右侧的顶点(具有最大的x坐标的顶点)不在A中,则连接该最后一个顶点(A中最右侧的顶点)与它相连。
6)倒序工作,从排序后的集合V中最右侧的顶点(具有最大的x坐标的顶点)开始连接所有在B中的顶点
7)将B的第一个(最左侧的B顶点)顶点与A的最左侧顶点连接起来。
我认为该算法是正确的,找不到它会失败的测试,但也许我漏掉了什么。
如果可以的话,我希望你能看一下并给我一个例子,证明它无法工作(我相信一定有)。