math - 映射 3D 空间中两个三角形之间的点

标签 math geometry computational-geometry

编辑

我不知道这是否重要,但目标三角形角度可能与源三角形角度不同。这个事实是否使转换非仿射? (我不确定)

alt text

我在 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 的问题。找到一个独特的解决方案。

也就是说,这里有一些可能的方法:

  • 继续使用凸规划来解决问题。虽然比线性问题更难解决,但它们并不是那么难解决。
  • 恢复到 2D 情况,而不是 3D 情况。这可以在不求助于那些距离测量施加的非线性约束的情况下完成。
  • 选择第四个点,而不是处理三角形,而是处理四面体。这再次消除了问题的非线性。

  • 更新:我已经对此进行了一些思考,并且看到了一种无需使用凸编程即可生成正确仿射变换的方法。这可以通过为每个三角形生成第四个顶点来完成,称为 yy' :

    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/

    相关文章:

    c++ - 在 std::floor 之后转换为 int 可以保证正确的结果吗?

    CSS - 同心圆

    computational-geometry - 多边形三角剖分反射顶点

    python - Bentley-Ottman 与纯叉积交集的性能非常密集的 2D 段分布

    javascript - 在 JavaScript 中将字符串计算为数学表达式

    math - 在 Coq 中形式化可计算性理论

    algorithm - 查找光线是否与体素相交而不行进

    geometry - 如何将凸多边形分割成给定比例的两个区域?

    algorithm - 完整图中的路径

    c++ - 如何进行笛卡尔变换