gpt4 book ai didi

c++ - 重心坐标夹紧在 3d 三角形上

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:59 24 4
gpt4 key购买 nike

我要计算一个点到一个三角形 (3d) 的最短距离。我已经将该点投影到三角形的平面上,然后取该点投影的重心坐标。但我找不到一种方法来将坐标固定在三角形内。

在搜索时,我只找到了 0 <= [u,v,w] 和 u+v+w = 1。但这将如何解决?

最佳答案

我意识到这是一个老问题,但它还没有真正得到解答,它目前是谷歌上“夹紧重心坐标”的第一个命中。

下面,p0p1p2是三角形的顶点,uv, w 是点 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() 返回 t 如果它在 01 之间,0 如果它是负数,或者 1 如果它大于 1Dot( a, b ) 是两个 vector ab 的点积。

关于c++ - 重心坐标夹紧在 3d 三角形上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com