旋转矩阵-rotation matrix简介

该文章通过Python的numpy和matplotlib库展示了如何进行二维和三维空间中的旋转。首先,文章解释了二维旋转的原理并提供了一个动态的GIF演示。接着,详细介绍了绕x、y、z轴的三维旋转,并定义了相应的旋转矩阵。最后,作者创建了一个Rotate类来实现多维度旋转,并用实例展示了旋转效果。
摘要由CSDN通过智能技术生成

转载自:https://zhuanlan.zhihu.com/p/533911656,仅作学习记录

一、 二维旋转

在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

#define canvas
fig, ax = plt.subplots()
line, = ax.plot([],[])

x0 = np.array([i for i in range(10)])
y0 = np.array([0 for i in range(10)])
#rotate
def rotate(x,y,theta):
    return x*np.cos(theta) + y *(-np.sin(theta)), x * np.sin(theta) + y * np.cos(theta)

def update(theta):
    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    ax.axis('equal')
    x,y = rotate(x0, y0, theta)
    line.set_data(x,y)
    return line

animation = FuncAnimation(fig, update, frames = np.linspace(0,np.pi*2, 200), interval = 50)

animation.save("rotate.gif", writer = "imagegick", fps = 10)
plt.show()

二、三维旋转

设距离旋转中心的距离为 ρ

1. 绕x轴旋转

在这里插入图片描述
在这里插入图片描述

2. 绕y轴旋转

在这里插入图片描述
在这里插入图片描述

3. 绕z轴旋转

在这里插入图片描述
在这里插入图片描述

三、例子

import numpy as np
import matplotlib.pyplot as plt

class Rotate(object):
    def __init__(self, dim = 2, x = 0, y = 0, alpha = 0, beta = 0, gamma = 0):
        self.dim = dim
        self.x = x
        self.y = y
        self.alpha = alpha
        self.beta = beta
        self.gamma = gamma
    def R2(self,alpha):
        return np.array([
            [np.cos(alpha), -np.sin(alpha)], 
            [np.sin(alpha), np.cos(alpha) ]
            ])
    def Rx(self, beta):
        return np.array([
            [1,            0,             0],
            [0, np.cos(beta), -np.sin(beta)],
            [0, np.sin(beta), np.cos(beta) ]
            ])
    def Ry(self, beta):
        return np.array([
            [np.cos(beta) , 0, np.sin(beta)],
            [0            , 1, 0           ],
            [-np.sin(beta), 0, np.cos(beta)]
            ])
    def Rz(self, beta):
        return np.array([
            [np.cos(beta), -np.sin(beta), 0],
            [np.sin(beta),  np.cos(beta), 0],
            [0           , 0            , 1]
            ])
    def R(self):
        pass

    def show(self):
        X = np.array([[1],[2]])
        
        Y = np.matmul(self.R2(np.pi/2), X)
        plt.scatter(X[0],X[1], color = "red")
        #plt.show()
        plt.scatter(Y[0],Y[1], color = "green")
        x1 = X[0,0]
        y1 = X[1,0]
        x2 = Y[0,0]
        y2 = Y[1,0]
        plt.plot([x1, 0], [y1, 0])
        plt.plot([x2, 0], [y2, 0])
        plt.axvline(x = 0, color = "blue", ls = "--", lw = 1)
        plt.axhline(y = 0, color = "blue", ls = "--", lw = 1)
        

        plt.axis("equal")
        plt.legend(["X","Y"])
        plt.show()
        
R = Rotate()
R.show()
'''
X = np.array([[1,0]]).T
print("X: ",X)
print("R: ",R.R2(np.pi/2))
print("ans: ", np.matmul(R.R2(np.pi/2), X))
'''

在这里插入图片描述

X = np.array([[1],[2]])
        Y = np.matmul(self.R2(np.pi/2), X)
        plt.scatter(X[0],X[1], color = "red")
        #plt.show()
        plt.scatter(Y[0],Y[1], color = "green")
        x1 = X[0,0]
        y1 = X[1,0]
        x2 = Y[0,0]
        y2 = Y[1,0]
        plt.plot([x1, 0], [y1, 0])
        plt.plot([x2, 0], [y2, 0])
        plt.axvline(x = 0, color = "blue", ls = "--", lw = 1)
        plt.axhline(y = 0, color = "blue", ls = "--", lw = 1)
        

        plt.axis("equal")
        plt.legend(["X","Y"])
        plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值