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

C# 如何检查三角形的三个顶点是循环顺序还是反循环顺序?,c#,3d,geometry,coordinate-systems,C#,3d,Geometry,Coordinate Systems,我的目标是检查STL文件中三角形的法线方向是否一致??? 例如。 STl文件如下所示,我想检查所有面是否在同一方向,即向外 面法线0-1 outer loop vertex -20.5411 -4.36615 0 vertex -16.9894 -12.3435 0 vertex -19.1845 -8.54147 0 endloop 端面 面法线-0.994522 0.104528 0 outer loop vertex -21 0 0 vertex -21 0 2

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

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

面法线0-1

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

面法线-0.994522 0.104528 0

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

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

我读过“循环单位向量的叉积是正的。”但我该如何在我的问题中使用这个规则呢


有人能帮我吗??我真的被卡住了:(

检查法线的点积和两个边缘方向的叉积的符号,例如给定法线
N
和点
A
B
C

((B - A) x (C - A)) * N
由于两个向量
S
T
的点积为

S * T = |S| * |T| * cos(theta)
其中,
theta
是向量之间的角度,当且仅当方向正确时,该角度才应为正。(此处假设三角形的两个点不在同一位置)

Java代码示例(使用):


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


一旦您访问了所有三角形,请停止。

谢谢Fabian,但我不明白这将如何帮助我检查stl文件的所有三角形是否在同一方向(如果顶点在逆时针方向,则根据右手法则,朝向向外)??还有一件事,在少数STL文件中,默认情况下没有给定的法线,因此我将使用叉积进行计算,然后对其进行规格化。给定的函数由您比较两个三角形…但我如何知道给定三角形集中哪个三角形的方向正确(即哪个三角形朝外??)因此,我将把那个法线作为参考三角形,并检查所有剩余的三角形。请让我知道…我一整天都很困惑几乎向外或向内的方向是什么意思??你能告诉我如何知道给定的三角形是向外还是向内?你需要检查t之间的角度世界Z方向和最高三角形的法线接近于零。
boolean check(Point3D normal, Point3D p1, Point3D p2, Point3D p3) {
    return p2.subtract(p1)
            .crossProduct(p3.subtract(p1))
            .dotProduct(normal) > 0;
}