Math 将三维三角形内的点插值到二维三角形内的点
有人能告诉我解决这个问题的算法吗: 给定一个三维三角形(p0,p1,p2)和该三角形(px)内/上的一个三维点以及一个二维三角形(p0',p1',p2'),函数将返回一个二维点,以便:Math 将三维三角形内的点插值到二维三角形内的点,math,language-agnostic,3d,Math,Language Agnostic,3d,有人能告诉我解决这个问题的算法吗: 给定一个三维三角形(p0,p1,p2)和该三角形(px)内/上的一个三维点以及一个二维三角形(p0',p1',p2'),函数将返回一个二维点,以便: 如果px==p0,则返回p0' 如果px==p1,则返回p1' 如果px==p2,则返回p2' 基本上,你想把一个3D点投影到一个2D矩阵上,对吗 这方面有很多资源(在这里查看维基百科),但这是一个很好的介绍 编辑:这篇最近的文章也是一篇非常易懂的介绍我理解。在(p0,p1,p2)平面上的任何点px)都可以用
- 如果px==p0,则返回p0'
- 如果px==p1,则返回p1'
- 如果px==p2,则返回p2'
基本上,你想把一个3D点投影到一个2D矩阵上,对吗 这方面有很多资源(在这里查看维基百科),但这是一个很好的介绍
编辑:这篇最近的文章也是一篇非常易懂的介绍我理解。在(
p0
,p1
,p2
)平面上的任何点px
)都可以用坐标a0
,a1
,a2
表示,使得所有坐标中的px=a0*p0+a1*p1+a2*p2
。如果您知道a0
,a1
,a2
的值,那么您可以将它们应用于(p0'
,p1'
,p2'
)以查找px'=a0*p0'+a1*p1'+a2*p2'
)
要获得重心坐标,需要解一个3x3
线性方程组
| px[0] | | p0[0] p1[0] p2[0] | | a[0] |
| px[1] | = | p0[1] p1[1] p2[1] | | a[1] |
| px[2] | | p0[2] p1[2] p2[1] | | a[2] |
在C
中,解决方案是
d = p0[0]*p1[1]*p2[2]-p0[0]*p1[2]*p2[1]-p0[1]*p1[0]*p2[2]+p0[1]*p1[2]*p2[0]+p0[2]*p1[0]*p2[1]-p0[2]*p1[1]*p2[0];
a0 = (p1[0]*p2[1]*px[2]-p1[0]*p2[2]*px[1]-p1[1]*p2[0]*px[2]+p1[1]*p2[2]*px[0]+p1[2]*p2[0]*px[1]-p1[2]*p2[1]*px[0])/d;
a1 = -(p0[0]*p2[1]*px[2]-p0[0]*p2[2]*px[1]-p0[1]*p2[0]*px[2]+p0[1]*p2[2]*px[0]+p0[2]*p2[0]*px[1]-p0[2]*p2[1]*px[0])/d;
a2 = (p0[0]*p1[1]*px[2]-p0[0]*p1[2]*px[1]-p0[1]*p1[0]*px[2]+p0[1]*p1[2]*px[0]+p0[2]*p1[0]*px[1]-p0[2]*p1[1]*px[0])/d;
二维点的坐标为:
px'[0] = a0*p0'[0] + a1*p1'[0] + a2*p2'[0]
px'[1] = a0*p0'[1] + a1*p1'[1] + a2*p2'[1]
px'[2] = a0*p0'[2] + a1*p1'[2] + a2*p2'[2]
挑战:做一个不是2d的三角形…“以及介于两者之间的一切”:这意味着什么?如果你用重心坐标表示你的点,其余的应该是微不足道的。除非我不明白你的要求。