【问题标题】:Determining whether triangles are facing each other确定三角形是否相互面对
【发布时间】:2014-07-02 11:14:15
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • 您能否提供一张图片,其中包含示例 2 个相互面对的三角形?
  • "每个三角形的法线方向朝向另一个平面" 你的意思是每个三角形的法线方向法线到另一个平面吗?

标签: c# geometry


【解决方案1】:

假设你的三角形是 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 )。

【讨论】:

  • 大概你还需要检查他们不在同一个平面上?
  • 嗯,如果它们都面向同一个方向,这似乎可行(所以面向另一个,但另一个背对)。但是,如果它们都背对着(因此,如果您将它们的法线彼此面对并反转它们),它似乎会返回相同的结果。
  • 啊,感谢更新。我实际上最终使用了一种不同的方法(只是从三角形的中心投射一条光线并查看它是否击中另一个平面)但是你的方法看起来很棒,所以我会在未来将它标记为对任何人都是正确的。感谢您花时间回答和更新,非常感谢!
  • 从一个三角形的中心投射光线需要计算叉积,所以我想你的解决方案非常相似。 Rq 你也可以发布它,甚至接受它,没问题。干杯!
  • 会的!不过,我会给你正确的答案。
【解决方案2】:

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

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;
}

方法改编自here!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2011-10-30
    • 2016-01-07
    • 1970-01-01
    • 2015-10-15
    • 2021-07-12
    相关资源
    最近更新 更多