Matplotlib 计算给定原始点和变换点的轴的旋转和平移

Matplotlib 计算给定原始点和变换点的轴的旋转和平移,matplotlib,geometry,coordinate-systems,coordinate-transformation,cartesian-coordinates,Matplotlib,Geometry,Coordinate Systems,Coordinate Transformation,Cartesian Coordinates,在变换之前和变换之后,如果给定点列表,我们如何推导原点旋转和轴移动的角度 例如: 在转换之前-[(-3173.241503.76), (-3173.24, 1599.98), (-2921.24, 1941.7), (-2777.24, 1941.7), (-2969.24, 1905.7), (-2969.24, 1941.7), (-3017.24, 1941.7), (-3065.24, 1905.7), (-3161.24, 2013.6), (-3179.24, 2049.6), (-

在变换之前和变换之后,如果给定点列表,我们如何推导原点旋转和轴移动的角度

例如:

在转换之前-[(-3173.241503.76), (-3173.24, 1599.98), (-2921.24, 1941.7), (-2777.24, 1941.7), (-2969.24, 1905.7), (-2969.24, 1941.7), (-3017.24, 1941.7), (-3065.24, 1905.7), (-3161.24, 2013.6), (-3179.24, 2049.6), (-2759.24, 1905.7), (-3017.24, 1803.81), (-3113.24, 1803.81), (-3161.24, 1803.81), (-3179.24, 1839.81), (-2759.24, 1803.81), (-2777.24, 1839.81), (-2789.24, 1623.98), (-2789.24, 1527.76), (-2760.861737.92)]

转换后- [(52.12, 146.39), (52.12, 242.61), (592.12, 584.33), (448.12, 584.33), (256.12, 548.33), (640.12, 584.33), (688.12, 584.33), (160.12, 548.33), (64.12, 656.22), (46.12, 692.22), (466.12, 548.33), (208.12, 446.44), (112.12, 446.44), (64.12, 446.44), (46.12, 482.44), (466.12, 446.44), (448.12, 482.44), (436.12, 266.61), (436.12, 170.39), (464.5380.54)]

我们如何生成这些点之间的相关性,以便给定一个较旧的点(x,y),我们可以找到导出点(x',y')


原产地详情不得而知。我们使用的是具有x轴和y轴的笛卡尔坐标系。

新编辑。

将numpy导入为np
将matplotlib.pyplot作为plt导入
x=np.数组([-3173.241503.76),(-3173.241599.98),(-2921.241941.7),(-2777.241941.7),(-2969.241905.7),
(-2969.24, 1941.7), (-3017.24, 1941.7), (-3065.24, 1905.7), (-3161.24, 2013.6), (-3179.24, 2049.6), 
(-2759.24, 1905.7), (-3017.24, 1803.81), (-3113.24, 1803.81), (-3161.24, 1803.81), (-3179.24, 1839.81), 
(-2759.24, 1803.81), (-2777.24, 1839.81), (-2789.24, 1623.98), (-2789.24, 1527.76), (-2760.86, 1737.92)])
y=np.数组([(52.12146.39),(52.12442.61),(592.12584.33),(448.12584.33),(256.12548.33),(640.12584.33),
(688.12, 584.33), (160.12, 548.33), (64.12, 656.22), (46.12, 692.22), (466.12, 548.33), (208.12, 446.44), 
(112.12, 446.44), (64.12, 446.44), (46.12, 482.44), (466.12, 446.44), (448.12, 482.44), (436.12, 266.61), 
(436.12, 170.39), (464.5, 380.54)])
def质心:
#集s的质心
c=np.和(s,轴=0)/len(s)
返回c[np.newaxis,:]
def旋转_平移(x,y):
#每组的质心
xG=质心(x)
yG=质心(y)
#每组的形状
Mx=(x-xG).T.dot(x-xG)
My=(y-yG).T.dot(y-yG)
#特征分解
ex,Ux=np.linalg.eig(Mx)
ey,Uy=np.linalg.eig(My)
#旋转矩阵
U=Uy.dot(Ux.T)
#平移向量
t=yG-xG.dot(U.t)
返回U、t、xG、yG
def矩阵_向量(x,y):
#每组的质心
xG=质心(x)
yG=质心(y)
#每组的形状
Mx=(x-xG).T.dot(x-xG)
My=(y-yG).T.dot(y-yG)
#特征分解:eigeinvalues,旋转矩阵
ex,Ux=np.linalg.eig(Mx)
ey,Uy=np.linalg.eig(My)
ex=np.sqrt(ex)
ey=np.sqrt(ey)
ex=ex[:,np.newaxis]
ey=ey[:,np.newaxis]
#线性矩阵,旋转-缩放-旋转
U=(ey/ex)*Ux.T
U=Uy.点(U)
#转换向量
t=yG-xG.dot(U.t)
返回U、t、xG、yG
def转换(v,mtrx_vctr):
返回v.dot(mtrx_vctr[0].T)+mtrx_vctr[1]
U、 t,xG,yG=旋转和平移(x,y)
z_rot=变换(x,(U,t))
U、 t,xG,yG=矩阵_向量(x,y)
z_aff=变换(x,(U,t))
plt.plot(x[:,0],x[:,1],'go')
plt.绘图(y[:,0],y[:,1],'bo')
plt.绘图(z_-rot[:,0],z_-rot[:,1],'ro')
plt.绘图(z_aff[:,0],z_aff[:,1],'yo')
plt.show()
初始答案。

这两个三角形不全等,即没有可以将x变换为y的平移和旋转。有一个仿射变换

将numpy导入为np
将matplotlib.pyplot作为plt导入
def仿射映射(之前、之后):
b0=before-before[0,:][np.newaxis,:]
b0=b0[1:3,:]
a0=after-after[0,:][np.newaxis,:]
a0=a0[1:3,:]
A=np.linalg.inv(b0).点(a0)
t=在[0,:]之后-在[0,:]之前。点(A)
返回A,t
x=np.数组([-46482144]、-43112155]、-3589357])
y=np.数组([[591157],[1073168],[1596,-223]]
A、 t=仿射映射(x,y)
#当y=x.dot(A)+t时应用贴图
打印(“”)
print('仿射变换矩阵:')
印刷品(A)
打印(“”)
打印('翻译向量:')
打印(t)
打印(“”)
打印('检查y=Ax+t')
打印(y-x.dot(A)-t)
打印(“”)
plt.绘图(x[:,0],x[:,1],'ro')
plt.绘图(y[:,0],y[:,1],'bo')
plt.show()

您正在寻找2x2旋转矩阵M和2x1平移向量T,例如:

(x',y') = M.(x,y) + B 
谢谢你的所有观点

假设M是以下矩阵:

( a b )
( c d )
T表示以下向量:

(Tx, Ty)
变换前和变换后的每个点都给出了两个方程:

P'x = a.Px + b.Py + Tx
P'y = c.Px + d.Py + Ty
  • a、b、c、d、Tx、Ty为未知元素

  • 收集所有点给出的所有方程,你可以使用优化算法(如Levenberg-Marquart或梯度下降法)找到这些未知元素

  • 注意,你有6个未知数,所以你至少需要3个点,这将给你6个方程来解决这个问题。(如果你想用笔和纸,你可以手工解决这个问题:P)

一旦解出方程组,就可以得到旋转角度θ,因为矩阵M是由以下公式定义的旋转矩阵:

( cos(theta) -sin(theta) )
( sin(theta)  cos(theta) )
  • 关于旋转矩阵以及角度θ和矩阵系数之间关系的更多详细信息:
注1:请注意,在一般情况下,“先旋转后平移”并不等同于“先平移后旋转”,原因很简单,如果您之前旋转,您将不会