- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我要计算一个点到一个三角形 (3d) 的最短距离。我已经将该点投影到三角形的平面上,然后取该点投影的重心坐标。但我找不到一种方法来将坐标固定在三角形内。
在搜索时,我只找到了 0 <= [u,v,w] 和 u+v+w = 1。但这将如何解决?
最佳答案
我意识到这是一个老问题,但它还没有真正得到解答,它目前是谷歌上“夹紧重心坐标”的第一个命中。
下面,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 )
是两个 vector a
和 b
的点积。
关于c++ - 重心坐标夹紧在 3d 三角形上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467296/
我刚刚开始学习 OpenGL 中的纹理并遇到了这个问题: 怀疑:函数 glEnableVertexAttribArray() 或 glVertexAttribPointer() 有问题 对于 Vert
我有一个 div 列表,我在其中显示较长文档的预览。这些文档使用不同的字体样式。所以我没有固定的行高。这是一个例子:http://jsfiddle.net/z56vn/ 我只需要显示每个文档的前几行。
我是一名优秀的程序员,十分优秀!