我将计算从点到三角形的最短距离(3d)。我已经将该点投射到三角形的平面,而不是采用该点的投影的重心坐标。但我找不到一种方法来将坐标钳位在三角形内部。
搜索时我只发现0< = [u,v,w]和u + v + w = 1.但是如何解决?
答案 0 :(得分: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 );
}
Clamp01()
如果在t
和0
之间,则返回1
,如果是否为0
,则返回1
比1
。 Dot( a, b )
是两个向量a
和b
的点积。
答案 1 :(得分:1)
如果要找到从点到三角形的最短距离,则无法将点夹到三角形。距离在笛卡尔空间中,而重心坐标则不是。
为了确定一个点到三角形外部的三角形的距离,您需要确定该点最接近的三角形的哪个特征(线段或角),然后确定该特征的距离。以任何不考虑转换回笛卡尔空间的方式夹紧重心坐标根本不起作用。
答案 2 :(得分:0)
u
,v
和w
需要在0..1
之间进行限制。就是这样。
所以例如
[u,v,w] = [-0.17, 0.64, 1.85]
三角形上的将是
[u,v,w] = [0, 0.64, 1]
答案 3 :(得分:0)
尝试将u
和v
括起来0..1
,然后设置w = 1 - u - v
以保持规范化约束。
答案 4 :(得分:0)
如果有人想知道,我先解决了
压缩u
和v
以及w = 1 - u - v
比
压缩u
和w
以及v = 1 - u - w
比
压缩v
和w
以及u = 1 - v - w
其他2个建议的解决方案给了我奇怪的输出,并且dident似乎正确地夹紧。
可能有更好/更快的方法,但现在这项工作。