关于c#:判断三角形是否正对

Determining whether triangles are facing each other

我试图找出两个三角形是否相互面对。我有形成三角形的点和它们所在的顺序(所以我可以使用叉积和左手拇指规则来衡量方向)。

我应该澄清我所说的面对是什么意思。三角形不需要直视对方,只要它们共享的平面平行并且每个三角形的法线方向朝向另一个平面的意义上面对即可。

这有点棘手,因为我允许每个三角形有几度的余地,所以平面不一定是平行的。

我的问题是,如何检查三角形是否相互朝向? (即使只是检查法线是否在另一个三角形平面的任一侧的 90 度内,我遇到的问题是angular计算只是给出这些计算的内角)。

我不确定我对问题的描述有多好。如果有任何其他我可以提供的信息或我可以澄清的事情,请询问。

谢谢。


假设你的三角形是 A : A1A2A3 和 B : B1B2B3

1) 计算 N1,即 A1A2 和 A1A3 的归一化叉积。
2) 测试 B 是否被 A"查看",即 N1 ? A1B1 > 0。
3) 计算 N2,即 B1B2 和 B1B3 的归一化叉积。

如果您想测试"严格面对",请测试 N1?N2 == -1(其中 ? 是点积)。

对于不太严格的面,您可以测试 N1?N2 - (-1) < 一些小的值。

正如@BenAaronson 指出的那样,您可能想通过测试 (A1A2,A1A3) 与 (B1B2,B1B3) 共面来测试矩形是否在同一平面上。
如果 O 是原点,则测试 N1?OA1 = - N2?OB1
( rq 这里 N2 = - N1 所以你可以测试 N1?OA1 = N1?OB1 )。


最终采用了这个解决方案,从一个三角形投射光线并检查它是否与另一个三角形的平面发生碰撞。效果很好!

1
2
3
4
5
6
7
8
9
10
11
12
13
private static bool RayIntersectsPlane(Vector normal, Vector rayVector, Point planePoint, Point rayOrigin)
{
    double denom = normal.Dot(rayVector);

    if (denom < 1E-6))
    {
        Vector rayPlaneVector = planePoint - rayOrigin;
        double intersectionCheck = rayPlaneVector.Dot(normal) / denom;
        return intersectionCheck >= 0;
    }

    return false;
}

方法改编自这里!