【问题标题】:Sorting array of points in clockwise order按顺时针顺序对点数组进行排序
【发布时间】:2016-01-21 05:58:39
【问题描述】:

是否有这样一种算法可以按顺时针顺序对 3D 点数组进行排序? 在我的情况下,我专门处理直角三角形,所以只有 3 分。 (用于构建网格)

【问题讨论】:

  • 为了对数组进行排序,您将定义一个默认向量,然后您将获得该向量与 (position - vector.origin) 之间的角度。这将得到一个介于 0 和 180 之间的浮点数。如果位置在默认向量的左侧,那么你有 180。 forum.unity3d.com/threads/… 最后按角度结果排序。
  • 如果任何答案对您有用,如果您接受该答案,对其他人会有所帮助。如果没有,请随时评论给出的答案,或更新您的问题。

标签: unity3d mesh


【解决方案1】:

假设你有两条边连接你的三个顶点。

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 即可。

不过有一个陷阱。如果您尝试构建封闭网格的外壳,则要求所有三角形都面向外部。这不能通过尝试使所有三角形都面向某个点来建模,因为每个三角形的该点必须不同。如果网格是凸面的,您可以通过要求所有三角形远离远离位于凸面网格内的某个点来对其进行建模。

【讨论】:

    【解决方案2】:

    排序算法并不难。问题是,这些点位于哪个平面上。它面向哪一侧

    只有一堆点本身不能顺时针或逆时针。你需要一个平面和一个边来参考这些点

    edit : 其实我以前说的有点不准确。您真正需要的是参考的位置和方向,而不是平面

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 2011-10-16
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多