在3d三角形上的重心坐标夹紧

时间:2013-01-22 20:20:16

标签: c++ math geometry

我将计算从点到三角形的最短距离(3d)。我已经将该点投射到三角形的平面,而不是采用该点的投影的重心坐标。但我找不到一种方法来将坐标钳位在三角形内部。

搜索时我只发现0< = [u,v,w]和u + v + w =​​ 1.但是如何解决?

5 个答案:

答案 0 :(得分:6)

我意识到这是一个古老的问题,但它还没有真正得到解答,而且它是目前谷歌首次出现的“钳位重心坐标”。

在下文中,p0p1p2是三角形的顶点,uvw是点p = p0*u + p1*v + p2*w的重心坐标。我假设u+v+w = 1

正如MSN所指出的那样,三角形上最近的点取决于三角形,因此对uvw的任何操作都无效。

如果uvw都是正数,则该点位于三角形中,无处可做。

如果它们中的任何一个是负数,则该点位于相应边的错误一侧。我们需要将这一点移到那边。对于相应的重心坐标,三角形边缘上的点为零。另外两个就是从一端到另一端的距离。

if ( u < 0)
{
    float t = Dot(p-p1,p2-p1)/Dot(p2-p1,p2-p1);
    t = Clamp01( t );
    return Vector3( 0.0f, 1.0f-t, t );
}
else if ( v < 0 )
{
    float t = Dot(p-p2,p0-p2)/Dot(p0-p2,p0-p2);
    t = Clamp01( t );
    return Vector3( t, 0.0f, 1.0f-t );
}
else if ( w < 0 )
{
    float t = Dot(p-p0,p1-p0)/Dot(p1-p0,p1-p0);
    t = Clamp01( t );
    return Vector3( 1.0f-t, t, 0.0f );
}
else
{
    return Vector3( u, v, w );
}

Clamp01()如果在t0之间,则返回1,如果是否为0,则返回11Dot( a, b )是两个向量ab的点积。

答案 1 :(得分:1)

如果要找到从点到三角形的最短距离,则无法将点夹到三角形。距离在笛卡尔空间中,而重心坐标则不是。

为了确定一个点到三角形外部的三角形的距离,您需要确定该点最接近的三角形的哪个特征(线段或角),然后确定该特征的距离。以任何不考虑转换回笛卡尔空间的方式夹紧重心坐标根本不起作用。

答案 2 :(得分:0)

uvw需要在0..1之间进行限制。就是这样。

所以例如

[u,v,w] = [-0.17, 0.64, 1.85]
三角形上的

将是

[u,v,w] = [0, 0.64, 1]

答案 3 :(得分:0)

尝试将uv括起来0..1,然后设置w = 1 - u - v以保持规范化约束。

答案 4 :(得分:0)

如果有人想知道,我先解决了 压缩uv以及w = 1 - u - v比 压缩uw以及v = 1 - u - w比 压缩vw以及u = 1 - v - w

其他2个建议的解决方案给了我奇怪的输出,并且dident似乎正确地夹紧。

可能有更好/更快的方法,但现在这项工作。