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是的。谢谢,我已经改正了。