给定带顶点的三角形(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处的函数。有一类直角的三角形,它们确实包含很大一部分,但它们更容易使用,而且这种算法不适合它们。
答案 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位于中心三角形中。
如果你的三角形不是等边的,那么就忽略我的答案。