编辑
我不知道这是否重要,但目标三角形角度可能与源三角形角度不同。这个事实是否使转换非仿射? (我不确定)
我在 3D 空间中有两个三角形。鉴于我知道第一个三角形中点的 (x,y,z) 并且我知道向量 V1,V2,V3。我需要找到点 (x',y',z')。我应该用向量 V1,V2,V3 指向 (x,y,z) 进行什么变换才能得到第二个三角形中的变换点?
感谢帮助 !!!
最佳答案
简短的回答是,这比最初看起来更复杂,并且您对问题施加的约束的性质需要一些比您想象的更先进的技术。
所以,作为一个解释,我将稍微改变你的符号。考虑 3 对向量(它们对应于问题中两个三角形的顶点):
u =
u' =
v =
v' =
w =
w' =
通常,您的问题将通过识别以下形式的线性变换来解决:
|a0,0 a0,1 a0,2 a0,3|
A = |a1,0 a1,1 a1,2 a1,3|
|a2,0 a2,1 a2,2 a2,3|
|0 0 0 1 |
使得:
金 = u'
Av = v'
噢 = w'
这个公式是必要的,因为变换似乎是一个 3-D 仿射变换,而不是一个 3-D 线性变换。如果是线性变换,则任何包含原点的三角形都必须映射到另一个包含原点的三角形。扩展到 4-D 空间允许使用 4-D 线性变换来执行 3-D 仿射变换。
也就是说,首先要注意的是这个问题是欠约束的(9 个方程有 12 个未知数);没有唯一的解决方案。其实有无穷多个。然而,你的问题比这更受限制,所以有一些希望。给定一个向量,你有额外的约束
p =
找
Ap = p' =
这样(使用您的定义向量 a、b 和 c)
|u - p| |u' - p'|
------- = ---------
|u - a| |u' - Aa|
|v - p| |v' - p'|
------- = ---------
|v - b| |v' - 抗体|
|w - p| |w' - p'|
------- = ---------
|w - c| |w' - Ac|
虽然这对您的问题提出了额外的限制,但它将它从使用线性方法可以轻松解决的问题更改为需要 Convex Programming 的问题。找到一个独特的解决方案。
也就是说,这里有一些可能的方法:
更新:我已经对此进行了一些思考,并且看到了一种无需使用凸编程即可生成正确仿射变换的方法。这可以通过为每个三角形生成第四个顶点来完成,称为 y
和 y'
:
y = u + (v-u)×(w-u)
y' = u' + (v'-u')×(w'-u')
哪里×
是两个向量的 3-D 叉积(即省略每个向量中的最后一个 1;但记住在计算后将 1 附加到 y 和 y' 上)。从那里,您可以应用从列向量创建矩阵 M 和 M' 的标准技术:
M =
M' =
并使用 Steve Emmerson 建议的方法(在 4-D 而不是 3-D 中):
上午 = M'
AMM-1 = M'M-1
A = M'M-1
关于math - 映射 3D 空间中两个三角形之间的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3780493/