<p>如果它只是一个平移和旋转,那么这是一个称为<a href="http://en.wikipedia.org/wiki/Affine_transformation" rel="nofollow noreferrer">affine transformation</a>的变换。</p>
<p>它的基本形式是:</p>
<pre><code>secondary_system = A * primary_system + b
</code></pre>
<p>其中<code>A</code>是一个3x3矩阵(因为你在3D中),而<code>b</code>是一个3x1转换。</p>
<p>这可以等价地写成</p>
<pre><code>secondary_system_coords2 = A2 * primary_system2,
</code></pre>
<p>其中</p>
<ul>
<li><code>secondary_system_coords2</code>是载体<code>[secondary_system,1]</code></li>
<li><code>primary_system2</code>是向量<code>[primary_system,1]</code>,并且</li>
<li><p><code>A2</code>是4x4矩阵:</p>
<pre><code>[ A b ]
[ 0,0,0,1 ]
</code></pre></li>
</ul>
<p>(有关详细信息,请参见wiki页面)。</p>
<p>所以基本上,你需要解这个方程:</p>
<pre><code>y = A2 x
</code></pre>
<p>对于<code>A2</code>,其中<code>y</code>由<code>secondary_system</code>中的点组成,1卡在末端,<code>x</code>是<code>primary_system</code>中的点,1卡在末端,<code>A2</code>是4x4矩阵。</p>
<p>现在,如果<code>x</code>是一个正方形矩阵,我们可以这样求解:</p>
<pre><code>A2 = y*x^(-1)
</code></pre>
<p>但是<code>x</code>是4x1。但是,您很幸运,有4个<code>x</code>集合和4个对应的<code>y</code>集合,因此您可以构造一个<code>x</code>,即4x4,如下所示:</p>
<pre><code>x = [ primary_system1 | primary_system2 | primary_system3 | primary_system4 ]
</code></pre>
<p>其中<code>primary_systemi</code>中的每一个都是4x1列向量。与<code>y</code>相同。</p>
<p>一旦有了<code>A2</code>,要将点从system1转换为system 2,只需执行以下操作:</p>
<pre><code>transformed = A2 * point_to_transform
</code></pre>
<p>您可以这样设置(例如在<code>numpy</code>中):</p>
<pre><code>import numpy as np
def solve_affine( p1, p2, p3, p4, s1, s2, s3, s4 ):
x = np.transpose(np.matrix([p1,p2,p3,p4]))
y = np.transpose(np.matrix([s1,s2,s3,s4]))
# add ones on the bottom of x and y
x = np.vstack((x,[1,1,1,1]))
y = np.vstack((y,[1,1,1,1]))
# solve for A2
A2 = y * x.I
# return function that takes input x and transforms it
# don't need to return the 4th row as it is
return lambda x: (A2*np.vstack((np.matrix(x).reshape(3,1),1)))[0:3,:]
</code></pre>
<p>然后像这样使用:</p>
<pre><code>transformFn = solve_affine( primary_system1, primary_system2,
primary_system3, primary_system4,
secondary_system1, secondary_system2,
secondary_system3, secondary_system4 )
# test: transform primary_system1 and we should get secondary_system1
np.matrix(secondary_system1).T - transformFn( primary_system1 )
# np.linalg.norm of above is 0.02555
# transform another point (x,y,z).
transformed = transformFn((x,y,z))
</code></pre>
<p><strong>注意:</strong>这里当然有数值误差,这可能不是解决变换的最佳方法(您可能可以做一些最小二乘法的事情)。</p>
<p>此外,将<code>primary_systemx</code>转换为<code>secondary_systemx</code>的错误(在本例中)为10^(-2)阶。</p>
<p>您必须考虑这是否可以接受(它看起来确实很大,但与您的输入点(都是10^6阶)相比,它可能是可以接受的)。</p>