找到包含给定点的三角形的最有效方法是什么?

时间:2010-04-16 22:01:11

标签: c# math

给定带顶点的三角形(a,b,c):

        c

      /   \

    /       \

  /           \

 a  -  -  -  -  b

然后通过将每个边缘减半来细分为四个三角形:

              c

            /    \

          /        \

     ca /            \ bc
           _   _   _
      /\              /\

    /    \          /    \

  /        \      /        \

a  -  -  -  - ab  -  -   -   -b

这导致四个三角形(a,ab,ca),(b,bc,ab),(c,ca,bc),(ab,bc,ca)。

现在给出一点p。如果p在外三角形(a,b,c)内,我如何确定哪个三角形p在哪?

目前我打算用ab作为起源。使用“ca - ab”的perp检查它是否在“ca - ab”行右侧的左侧,并检查符号“ab - a”的点积和perp向量以及向量“p - AB”。如果相同或点积为零则则必须在(a,ab,ca)中...继续此过程与其他外三角形(b,ba,ab)& (c,ca,ba)。最后,如果它与这些不匹配则必须包含在内三角形内(ab,bc,ca)。

有更好的方法吗?

修改

以下是该算法的预期应用的更多信息:

我正在使用它作为细分掩码来生成我打算插入的精细网格。每个三角形将被类似地细分到指定的深度。我想确定点p所在的三角形(在最大深度处)。有了这个,我可以使用三角形上的插值来评估点p处的函数。有一类直角的三角形,它们确实包含很大一部分,但它们更容易使用,而且这种算法不适合它们。

2 个答案:

答案 0 :(得分:2)

Triangles illustration http://i42.tinypic.com/wjxvya.png

  • 如果该点高于ca / bc(即在顶部灰色三角形中),则很容易。

  • 如果该点留在ca(即左灰色三角形),则很容易。

  • 如果该点位于bc的右侧(即右侧灰色三角形),则很容易。

  • 如果该点位于中间位置,您只需确定该点是高于还是低于黑色V.

    您可以通过为该点的x值计算线的y值并将结果与​​该点的y值进行比较来实现。

    if (y' > (y * x') / x)
    {
        // center triangle
    }
    else
    {
        // right triangle
    }
    

这是最有效的方法吗?我不知道。

答案 1 :(得分:0)

这是一个等边三角形吗?如果是,那么:

假设三角形的高度为H. 使用距离公式计算从c到p的距离。如果d(c,p)< H / 2,p在顶部三角形中。 如果d(a,p)< H / 2,p在左三角形中。 如果d(b,p)< H / 2,p在右三角形中。

如果以上都不成立,则p位于中心三角形中。

如果你的三角形不是等边的,那么就忽略我的答案。