我有两组点(x,y)用matplotlib绘制的
从视觉上看,我可以看到,它们之间似乎有某种旋转。
我想围绕某个点旋转一组点(想尝试几个旋转点),然后再绘制它们。
用python旋转一组点的最佳方法是什么?
我已经读过,也许可以使用外形,但一个简单的例子可以帮助我理解如何。
发布于 2022-11-21 14:08:16
使用numpy存储点
例如,如果您有一个nx2数组,那么每一行都是一个点,如下所示
xy=np.array([[50, 60],
[10, 30],
[30, 10]])你可以这样画它们
plt.scatter(xy[:,0], xy[:,1])要旋转它们,你需要一个旋转矩阵
def rotateMatrix(a):
return np.array([[np.cos(a), -np.sin(a)], [np.sin(a), np.cos(a)]])您可以将此矩阵应用于您的xy点集,如下所示
newxy = xy @ rotateMatrix(a).T请注意,我转换旋转矩阵,以保持敏锐。但是,在这种情况下,由于旋转矩阵的特定形式,您可以通过传递-a直接生成转置矩阵。
newxy = xy @ rotateMatrix(-a)如果您不需要围绕中心旋转(x0,y0)而不是(0,0),只需旋转,而不是xy-(x0,y0) (即从中心到点的位移向量),然后将旋转的向量添加到中心。
newxy = (xy-[x0,y0]) @ rotateMatrix(-a) + [x0,y0]应用程序
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib
import time
def rotateMatrix(a):
return np.array([[np.cos(a), -np.sin(a)], [np.sin(a), np.cos(a)]])
xy=np.random.randint(0,100, (200,2))
fig=plt.figure()
plt.plot(xy[:,0], xy[:,1], 'o')
plt.xlim(-30,130)
plt.ylim(-50,110)
plotdata,=plt.plot(xy[:,0], xy[:,1],'o')
x0=20
y0=50
def anim(i):
newxy=(xy-[x0,y0]) @ rotateMatrix(-2*i*np.pi/180) + [x0,y0]
plotdata.set_data(newxy[:,0], newxy[:,1])
return [plotdata]
theAnim=animation.FuncAnimation(fig, anim, interval=40, blit=False, frames=360, repeat=False)
#theAnim.save('rotate.nosync.gif')
plt.show()

https://stackoverflow.com/questions/74519927
复制相似问题