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

las*_*vig 2 c++ math geometry

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

搜索时,我只找到了0 <= [U,V,W]和u + V + W = 1,但如何将这种解决呢?

小智 6

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

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

由于MSN指出,在三角形的最近点取决于三角形,所以刚上的任何操作u,v,w不能工作.

如果所有的u,v,w是积极的,则该点是在三角形并没有什么做的.

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

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 );
}
Run Code Online (Sandbox Code Playgroud)

Clamp01()t如果它在0和之间1,0如果是负数,或者1如果它是大于,则返回1.Dot( a, b )是两个矢量的点积ab.


MSN*_*MSN 3

如果你想找到一个点到一个三角形的最短距离,你就不能用这种方式将一个点夹在一个三角形上。距离位于笛卡尔空间中,而重心坐标则不是。

为了确定点到三角形外部的三角形的距离,您需要确定该点最接近三角形的哪个特征(线段或角),然后确定到该特征的距离。以任何不考虑到笛卡尔空间变换的方式限制重心坐标将根本行不通。