Math 将点列表排序为多边形

Math 将点列表排序为多边形,math,polygon,computational-geometry,Math,Polygon,Computational Geometry,我有一套观点。这组点确实定义了一个(非凸)多边形,但它不是有序的 因为它不是有序的,我不能从一个点到另一个点去画它的边界。我如何对它进行排序,以便遍历此点列表并绘制多边形 我的第一个想法是使用凸面外壳,但我的多边形在大多数情况下是凹面的。我认为没有明确的解决方案。考虑这样的五点: . . . . . 这里什么多边形是正确的?我认为没有明确的解决方案。考虑这样的五点: . . . . . 这里哪个多边形是正确的?您必须对点进行排序,以便在从一点移动到另一点时,在多边形周

我有一套观点。这组点确实定义了一个(非凸)多边形,但它不是有序的

因为它不是有序的,我不能从一个点到另一个点去画它的边界。我如何对它进行排序,以便遍历此点列表并绘制多边形


我的第一个想法是使用凸面外壳,但我的多边形在大多数情况下是凹面的。

我认为没有明确的解决方案。考虑这样的五点:

.   .
  .
.   .

这里什么多边形是正确的?

我认为没有明确的解决方案。考虑这样的五点:

.   .
  .
.   .

这里哪个多边形是正确的?

您必须对点进行排序,以便在从一点移动到另一点时,在多边形周围行走,内部位于左侧(或右侧)。凸或凹,这是正确的方法


但仅仅了解要点是不够的。您还必须知道每个边段的连通性。知道了这一点,你可以从任何一点开始沿着周长行走,直到再次到达起点。

你必须对这些点进行排序,以便在从一点到另一点移动时,沿着多边形行走,内部在你的左侧(或右侧)。凸或凹,这是正确的方法


但仅仅了解要点是不够的。您还必须知道每个边段的连通性。知道了这一点,你可以从任何一点出发,沿着周界走,直到你再次到达起点。

我不确定这是最快的方法,但它似乎有效

整个想法是使用不相交的线段连接点(除了在点上,这比你想象的要复杂一些)。因此,从原始未排序列表开始,按顺序连接它们--形成一条可能有许多交叉点的闭合路径--然后通过颠倒列表中点的子序列,逐个消除交叉点

假设我们从[ABCDEFGH]开始,发现b-c边与g-h边相交。我们反转c-g序列以获得一个新列表:[a b g f e d c h]。已删除两条边,并创建了两条新边;其余的都没有受到干扰(尽管有些人的方向颠倒了)


我无法找到这样一种情况,即该进程将永远运行(即列表将返回到以前的状态),也无法找到这样一种情况不会发生的证据

我不确定这是不是最快的方法,但似乎有效

整个想法是使用不相交的线段连接点(除了在点上,这比你想象的要复杂一些)。因此,从原始未排序列表开始,按顺序连接它们--形成一条可能有许多交叉点的闭合路径--然后通过颠倒列表中点的子序列,逐个消除交叉点

假设我们从[ABCDEFGH]开始,发现b-c边与g-h边相交。我们反转c-g序列以获得一个新列表:[a b g f e d c h]。已删除两条边,并创建了两条新边;其余的都没有受到干扰(尽管有些人的方向颠倒了)


我无法找到这样一种情况,即该进程将永远运行(即列表将返回到以前的状态),也无法找到这样一种情况不会发生的证据

你说的“一组多边形”是指一组点吗?@Beta是的。谢谢,我已经更正了。当你说“一组多边形”是指一组点吗?@Beta是的。谢谢,我已经改正了。