以讨论here和here为基础。我正在尝试计算3D线和3D三角形之间的最短距离。
我正在使用barycentric coordinates to determine whether or not the point is inside the triangle。因此,给定由顶点UVW
定义的三角形和由点AB
定义的线,我首先计算线AB
与UVW
定义的平面的交点。让我们将此交点称为P
,并假设我已经进行了检查以验证该点是否实际上与平面相交。
然后,我计算重心坐标(S,T)
,以使S
沿边UV
定义,而T
沿边UW
定义。自然,如果0≤S
和0≤T
和S+T≤1
,则P
在三角形(或其边缘)上,而我到三角形的距离显然为零。
如果不正确,则P
在三角形之外,我需要计算距离。从第一个链接开始的指导说,将点P
投影到所有三个边上以获得三个候选点。将这些点加到三个三角形的顶点上,即可得到六个要测试的点。
可不是比这容易吗?如果是T<0
,那么您是否不知道UV
是最接近的边,您只需要检验P在那条线上的投影?同样,如果S<0
,则UW
将是最接近的边。如果T>0
和S>0
,则VW
是最近的边。
因此,根据S
和T
的符号,您已经知道最接近的边缘,只需计算从P
到其在那个边缘上的投影的距离。如果投影不在三角形内,则最接近的点是任一顶点。因此,您的计算量大约是所提出方法的1/3。
我在这里缺少什么吗,或者这是有效的优化吗?我对重心坐标及其属性还很陌生。
答案 0 :(得分:0)
事实证明,距点和距直线最近的问题非常相似,并且都可以简化为纯2D问题。
通过毕达哥拉斯(Pythagoras),从一点到三角形的点的平方距离是到三角形支撑平面的平方距离与该点到该平面的投影的平方距离之和。
后一个距离恰好是从法线到三角形的距离。
从直线方向看,您会看到投影的三角形,并且直线缩小为单个点。请求的3D距离等于投影上看到的2D距离。
要获得所需的坐标,请使用辅助坐标系,以使Z在直线方向上(XY为垂直平面)。为了方便起见,请选择要在线的新框架的原点。然后,仅忽略Z即可得到XY中的平面问题。坐标的变化是仿射变换。
考虑由原点(点/线的投影)和一对三角形顶点(以循环顺序拍摄)形成的三个三角形。这些三角形的正负号面积仅是2x2的行列式。
如果三个区域的符号相同,则该点在内部。否则,标志会告诉您您在六个周边区域中的位置,无论是通过边缘还是通过顶点。
在上方的图上,该点位于内部(三个正区域)。在另一幅图上,它在右上边缘(一个负区域)之外。还要注意,将区域除以相应边的长度,就可以得到到该边的距离。 (省略了因子2。)
总工作量是