In [1]: import numpy as np
In [2]: T0 = np.array([[0, 0, 1], [0, -1, 0],[0, 1, 0]], np.float32)
In [3]: T1 = np.array([[1, 0, 1], [0, -1, 0], [0, 1, 0]], np.float32)
In [4]: D0 = np.mean(T0, axis=-2)
In [5]: D1 = np.mean(T1, axis=-2)
In [6]: A0B0 = T0[1]-T0[0]
In [7]: A0C0 = T0[2]-T0[0]
In [8]: v0 = np.cross(A0B0, A0C0)
In [9]: v0 /= np.linalg.norm(v0)
In [10]: v1 = T1[0]-D1
In [11]: v1 /= np.linalg.norm(v1)
In [12]: v2 = np.cross(v0, v1)
In [13]: v2 /= np.linalg.norm(v2)
In [14]: M1 = np.vstack((v0, v1, v2))
In [15]: M1 = M1.T
In [16]: iM1 = np.linalg.inv(M1)
In [17]: cost = np.dot(v0, v1)/np.linalg.norm(v0)/np.linalg.norm(v1)
In [18]: M0 = np.array([[0, 0, 1], [0, np.sqrt(1 - cost**2), 0], [1, cost, 0]])
In [19]: R = np.dot(M0, iM1)
In [20]: R
Out[20]:
array([[ 0.00000000e+00, -1.00000000e+00, 0.00000000e+00],
[ 0.00000000e+00, 0.00000000e+00, 9.99999916e-01],
[ 1.00000000e+00, 0.00000000e+00, 5.00651538e-08]])
In [21]: np.dot(R, v0)
Out[21]: array([0., 0., 1.])
In [22]: np.dot(R, v1)
Out[22]: array([0. , 0.70710671, 0.7071068 ])
In [23]: np.dot(R, v2)
Out[23]: array([1., 0., 0.])
In [24]: np.dot(R, T1[0]-D1)
Out[24]: array([0. , 0.66666657, 0.66666666])
In [25]: np.dot(R, T1[1]-D1)
Out[25]: array([ 1. , -0.33333332, -0.33333336])
In [26]: np.dot(R, T1[2]-D1)
Out[26]: array([-1. , -0.33333332, -0.33333336])
作者ID:DechinPhy