将点列表排序为多边形
Posted
技术标签:
【中文标题】将点列表排序为多边形【英文标题】:Sort point list into polygon 【发布时间】:2010-09-20 22:19:04 【问题描述】:我有一组点。这组点确实定义了一个(非凸)多边形,但它没有排序。
由于它不是有序的,我不能只是从点到点绘制来绘制它的边界。如何以可以遍历此点列表并绘制多边形的方式对其进行排序?
我的第一个想法是使用凸包,但我的多边形大部分时间都是凹的。
【问题讨论】:
当你说“一组多边形”是指一组点吗? @Beta 是的。谢谢,我已经更正了。 【参考方案1】:我认为对此没有明确的解决方案。考虑如下五点:
. .
.
. .
这里什么多边形是正确的?
【讨论】:
【参考方案2】:您必须对这些点进行排序,这样当您从一个点移动到另一个点时,您可以在左侧(或右侧)内部围绕多边形走动。凸或凹,这才是正确的做法。
但知道要点是不够的。您还必须知道每个边缘段的连通性。知道了这一点,您就可以从任意点开始,沿着外围走,直到再次到达起点。
【讨论】:
【参考方案3】:我不确定这是最快的方法,但它似乎有效。
整个想法是使用不相交的线段连接点(除了在点处,这比您想象的要复杂一些)。所以从原始的未排序列表开始,将它们按顺序连接起来——形成一条可能有许多交叉点的封闭路径——然后通过反转列表中点的子序列来逐个消除交叉点。
假设我们从 [a b c d e f g h] 开始,发现 b-c 边与 g-h 边相交。我们反转 c-g 序列以获得一个新列表:[a b g f e d c h]。删除了两条边,并创建了两条新边;其余的则不受干扰(尽管有些方向相反)。
我无法找到该进程将永远运行的情况(即,列表将返回到以前的状态),也无法证明这不会发生。
【讨论】:
以上是关于将点列表排序为多边形的主要内容,如果未能解决你的问题,请参考以下文章