<p>您正在寻找的映射似乎是仿射变换。四个不在一个平面上的三维点是恢复仿射变换所需的点的确切数目。后者,粗略地说,是用矩阵相乘并加上一个向量</p>
<pre><code>secondary_system = A * primary_system + t
</code></pre>
<p>这个问题现在被简化为找到合适的矩阵A和向量t。我想,这段代码可能会帮助你(对不起,糟糕的代码风格——我是数学家,不是程序员)</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
# input data
ins = np.array([[3531820.440, 1174966.736, 5162268.086],
[3531746.800, 1175275.159, 5162241.325],
[3532510.182, 1174373.785, 5161954.920],
[3532495.968, 1175507.195, 5161685.049]]) # <- primary system
out = np.array([[6089665.610, 3591595.470, 148.810],
[6089633.900, 3591912.090, 143.120],
[6089088.170, 3590826.470, 166.350],
[6088672.490, 3591914.630, 147.440]]) # <- secondary system
p = np.array([3532412.323, 1175511.432, 5161677.111]) #<- transform this point
# finding transformation
l = len(ins)
entry = lambda r,d: np.linalg.det(np.delete(np.vstack([r, ins.T, np.ones(l)]), d, axis=0))
M = np.array([[(-1)**i * entry(R, i) for R in out.T] for i in range(l+1)])
A, t = np.hsplit(M[1:].T/(-M[0])[:,None], [l-1])
t = np.transpose(t)[0]
# output transformation
print("Affine transformation matrix:\n", A)
print("Affine transformation translation vector:\n", t)
# unittests
print("TESTING:")
for p, P in zip(np.array(ins), np.array(out)):
image_p = np.dot(A, p) + t
result = "[OK]" if np.allclose(image_p, P) else "[ERROR]"
print(p, " mapped to: ", image_p, " ; expected: ", P, result)
# calculate points
print("CALCULATION:")
P = np.dot(A, p) + t
print(p, " mapped to: ", P)
</code></pre>
<p>此代码演示如何将仿射变换恢复为矩阵+向量,并测试初始点是否映射到它们应该映射的位置。您可以使用<a href="https://colab.research.google.com/notebooks/welcome.ipynb" rel="nofollow noreferrer">Google colab</a>测试此代码,这样就不必安装任何东西。</p>
<p>关于这段代码背后的理论:它基于“<a href="https://www.researchgate.net/publication/332971934_Workbook_on_mapping_simplexes_affinely" rel="nofollow noreferrer">Beginner's guide to mapping simplexes affinely</a>”中给出的方程,矩阵恢复在“标准符号的恢复”一节中进行了描述,在“我们需要多少点”一节中讨论了精确仿射变换所需的点数章节。同一作者发表了“<a href="https://www.researchgate.net/publication/332410209_Beginner%27s_guide_to_mapping_simplexes_affinely" rel="nofollow noreferrer">Workbook on mapping simplexes affinely</a>”,其中包含许多此类的实际例子。</p>