按顺时针顺序对点数组进行排序
Sorting array of points in clockwise order
是否有这样一种算法可以按顺时针顺序对 3D 点数组进行排序?
在我的案例中,我专门处理直角三角形,所以只有 3 分。 (用于构建网格)
排序的算法并不难。问题是,这些点位于哪个平面上。它面向哪一边
只有一堆点不能单独顺时针或逆时针。你需要一个平面和一个侧面来参考那些点
edit : 其实我之前说的有点不准确。你真正需要的是参考的位置和方向,而不是平面
假设您有两条边连接三个顶点。
E1 = V2 - V1
E2 = V1 - V3
它们跨越一个三角形。您可以这样计算三角形的法线 N
:
N = cross(E1, E2)
这告诉你三角形朝向哪个方向。您可以通过将 N
投影到您的三角形与 P
.
的距离来计算三角形是面向还是背离某个视角 P
D = V1 - P
d = dot(N, D)
如果d
为正,三角形背向P
,如果为负,则面向P
。
你现在可以判断每组(V1,V2,V3)是否排序正确。如果不是,只需将 V2 和 V3 交换即可。
不过有一个陷阱。如果您尝试构建封闭网格的船体,则要求所有三角形都朝向外部。这不能通过尝试使所有三角形都面向某个点来建模,因为每个三角形的那个点必须不同。如果网格是凸透的,您可以通过要求所有三角形面向位于凸网格内部的某个点 远离 来对其建模。
是否有这样一种算法可以按顺时针顺序对 3D 点数组进行排序? 在我的案例中,我专门处理直角三角形,所以只有 3 分。 (用于构建网格)
排序的算法并不难。问题是,这些点位于哪个平面上。它面向哪一边
只有一堆点不能单独顺时针或逆时针。你需要一个平面和一个侧面来参考那些点
edit : 其实我之前说的有点不准确。你真正需要的是参考的位置和方向,而不是平面
假设您有两条边连接三个顶点。
E1 = V2 - V1
E2 = V1 - V3
它们跨越一个三角形。您可以这样计算三角形的法线 N
:
N = cross(E1, E2)
这告诉你三角形朝向哪个方向。您可以通过将 N
投影到您的三角形与 P
.
P
D = V1 - P
d = dot(N, D)
如果d
为正,三角形背向P
,如果为负,则面向P
。
你现在可以判断每组(V1,V2,V3)是否排序正确。如果不是,只需将 V2 和 V3 交换即可。
不过有一个陷阱。如果您尝试构建封闭网格的船体,则要求所有三角形都朝向外部。这不能通过尝试使所有三角形都面向某个点来建模,因为每个三角形的那个点必须不同。如果网格是凸透的,您可以通过要求所有三角形面向位于凸网格内部的某个点 远离 来对其建模。