我有一套积分。这组点确定了一个(非凸)多边形,但它没有排序。
由于它没有被命令,我不能只是从一个点到另一个点绘制它的边界。如何以可以遍历此点列表并绘制多边形的方式对其进行排序?
我的第一个想法是使用凸包,但我的多边形大多数时候是凹的。
答案 0 :(得分:5)
我认为没有明确定义的解决方案。考虑以下五点:
. .
.
. .
这里的多边形是正确的吗?
答案 1 :(得分:0)
当您从一个点移动到另一个点时,您必须对点进行排序,以便在左边(或右边)的内部走动多边形。凸或凹,这是正确的方法。
但知道这些观点是不够的。您还必须知道每个边缘段的连通性。知道这一点,你可以从任何一点开始,沿着周边走,直到你再次到达起点。
答案 2 :(得分:0)
我不确定这是最快的方式,但似乎有效。
整个想法是使用不相交的线段连接点(除了在点之外,这比你想象的要复杂一点)。因此,从原始未排序列表开始,按顺序连接它们 - 形成可能有许多交叉的封闭路径 - 然后通过反转列表中的点的子序列逐个消除交叉。
假设我们从[a b c d e f g h]开始,并发现b-c边缘穿过g-h边缘。我们反转c-g序列以得到一个新列表:[a b g f e d c h]。已删除两条边,并创建了两条新边;其余部分没有受到干扰(尽管有些人已经改变了方向)。
我无法找到这个过程将永远运行的情况(也就是说,列表将返回到先前的状态),也不能证明这不会发生。