如何检查三角形的三个顶点是循环顺序还是反循环顺序?

时间:2016-02-15 09:51:45

标签: c# 3d geometry coordinate-systems

我的目标是检查STL文件中三角形的正常方向是否一致?

例如。 STl文件如下所示,我想检查所有方面是否在同一方向,即向外。??

facet normal 0 0 -1

outer loop
  vertex -20.5411 -4.36615 0
  vertex -16.9894 -12.3435 0
  vertex -19.1845 -8.54147 0
endloop

endfacet

facet normal -0.994522 0.104528 0

outer loop
  vertex -21 0 0
  vertex -21 0 2
  vertex -20.5411 4.36615 0
endloop

endfacet

我想通过顶点的叉积来计算法线,但我怎么知道方向?

我读过"循环单位向量的交叉积是正数。"但是我应该如何在我的问题中使用这个规则?

任何人都可以帮助我吗?我真的被困在这里:(

2 个答案:

答案 0 :(得分:1)

检查正常的点积和2个边缘方向的叉积的符号,例如给定正常A和点BC((B - A) x (C - A)) * N

S

交叉积应生成与法线方向相同的向量,因为2个向量TS * T = |S| * |T| * cos(theta) 的点积为

theta

其中boolean check(Point3D normal, Point3D p1, Point3D p2, Point3D p3) { return p2.subtract(p1) .crossProduct(p3.subtract(p1)) .dotProduct(normal) > 0; } 是向量之间的角度,当且仅当方向正确时,这应该是正的。 (这里假设三角形中没有2个点位于同一位置)

Java代码示例(使用javafx.geometry.Point3D):

{{1}}

答案 1 :(得分:0)

找到Z坐标较高的三角形,检查法线是否几乎向外(Z +方向)或几乎向内(Z方向)。一旦你知道这一点,只需移动到未访问的相邻三角形,检查正常翻转并将它们标记为已访问。

访问完所有三角形后,停止。