在3-D空间中,我有6个点的无序集合。像这样的东西:
(A)* (C)* (E)* (F)* (B)* (D)*
这些点形成3D轮廓,但它们是无序的。对于无序,我的意思是它们存储在
unorderedList = [A - B - C - D - E - F]
我只想从一个任意位置(例如A点)开始重新组织此列表,然后顺时针或逆时针遍历这些点。像这样:
orderedList = [A - E - B - D - F - C]
要么
orderedList = [A - C - F - D - B - E]
我正在尝试实现一种尽可能简单的算法,因为提到的点集对应于〜420000个点的网格上每个顶点的N环邻域,因此我必须对网格上的每个点进行此操作。
一段时间以前,关于2-D点的讨论也类似,但是对于我而言,目前尚不清楚如何从这种方法过渡到3-D场景。
没有轴和方向,“顺时针”或“逆时针”的概念定义不明确!(证明:例如,如果您从显示器屏幕的另一侧查看这些点或将它们翻转,该怎么办!)
您必须定义轴和方向,并将其指定为附加输入。指定它的方法包括:
1x=2y=3z
(A_x, A_y, A_z)
为了确定方向,您必须更深入地研究问题:必须定义网格的“向上”和“向下”大小。然后,对于每组点,必须取形心(或另一个“内部”点)并构造指向垂直于表面的“上”的单位向量。(执行此操作的一种方法是找到最小二乘拟合平面,然后找到通过该点的两个垂直向量,并沿“向上”方向拾取一个。)
您将需要使用以上任何建议来确定轴。这将使您可以按如下方式重新编写问题:
输入:
建立:
算法:
一旦有了角度,就可以对其进行排序。