栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

numpy对矩陣进行操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

numpy对矩陣进行操作

設定一個點,
将變換矩陣与此點進行相乘,
可得到對應變換後的點

在此, 設置四個點,圍成一個矩形,
并將四個點逐個與矩陣相乘,
最後将變換后的點都繪製出來,
即爲變換后的矩形

旋转矩陣

旋转参考:
旋转矩阵推导_wodownload2的博客-CSDN博客_旋转矩阵推导

Opengl-变换&矩阵_笃笃前行的博客-CSDN博客

矩陣与点相乘,即可得到旋转后的点

平移,缩放 等 矩陣

具体推导可自行搜索

坐标系转换与手眼标定_shabaobao816的博客-CSDN博客_labview标定

"""
Author: xx xx@ubuntu.com
Date: 2022-05-29 17:56:54
LastEditors: xx xx@ubuntu.com
LastEditTime: 2022-05-29 22:53:07
FilePath: numpyMatrix.py
Description: 点通过矩阵进行旋转, 并绘制出旋转前后的点
"""

# pip install numpy matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes

import numpy as np
import math

PI = 3.1415926

# 要进行操作的矩形 分别存儲的为x y点
ptXArray = [0, 10, 10, 0]
ptYArray = [0, 0, 10, 10]

###########################################
# 绕Z轴旋转 (原点旋转)

# 若要进行 非原点的旋转变换:
# 1. 将物体旋转要绕的点移动到原点,
# 2. 移到原点后做旋转变换
# 3. 旋转变换完成后平移回原来的位置

angle = 75  # 旋转角度
radian = angle * PI / 180

# 三角函数,度数的sin cos值
sinValue = math.sin(radian)
cosValue = math.cos(radian)

print('------ 旋转矩阵')
rotateMatrix = np.array([
    [cosValue, -sinValue, 0, 0],
    [sinValue, cosValue, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

print(rotateMatrix)

ptXRotateArray = [] # 旋转后的结果值 x坐标
ptYRotateArray = []

# 将矩形的点,逐個与旋转矩陣相乘
for i in range(len(ptXArray)):
    rotatePt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])

    ptRes = rotateMatrix.dot(rotatePt)
    ptXRotateArray.append(ptRes[0][0])
    ptYRotateArray.append(ptRes[1][0])

###########################################
# 缩放
print('------ 缩放矩阵')
xScale = 0.8
yScale = 0.6
scaleMatrix = np.array([
    [xScale, 0, 0, 0],
    [0, yScale, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

print(scaleMatrix)

ptXScaleArray = []
ptYScaleArray = []

for i in range(len(ptXArray)):
    scalePt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])

    ptRes = scaleMatrix.dot(scalePt)
    ptXScaleArray.append(ptRes[0][0])
    ptYScaleArray.append(ptRes[1][0])

###########################################
# 平移 
print('------ 平移 矩阵')
xMov = 15
yMov = 15
transMatrix = np.array([
    [1, 0, 0, xMov],
    [0, 1, 0, yMov],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

print(transMatrix)

ptXTransArray = []
ptYTransArray = []

for i in range(len(ptXArray)):
    transPt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])
    ptRes = transMatrix.dot(transPt)
    ptXTransArray.append(ptRes[0][0])
    ptYTransArray.append(ptRes[1][0])

###########################################
# 旋转 缩放 平移
print('------ 旋转 缩放 平移 组合操作')

angle = 45  # 旋转角度
radian = angle * PI / 180

# 三角函数,度数的sin cos值
sinValue = math.sin(radian)
cosValue = math.cos(radian)

rotateMatrix = np.array([
    [cosValue, -sinValue, 0, 0],
    [sinValue, cosValue, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

xScale = 2
yScale = 2
scaleMatrix = np.array([
    [xScale, 0, 0, 0],
    [0, yScale, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

xMov = -20
yMov = 20
transMatrix = np.array([
    [1, 0, 0, xMov],
    [0, 1, 0, yMov],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

# 旋转矩阵×平移矩阵×缩放矩阵×相机矩阵×投影矩阵 反过来
mixMatrix = transMatrix.dot(scaleMatrix)
mixMatrix = scaleMatrix.dot(transMatrix)
mixMatrix = scaleMatrix.dot(transMatrix).dot(rotateMatrix)

ptXMixArray = []
ptYMixArray = []

for i in range(len(ptXArray)):
    transPt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])
    ptRes = mixMatrix.dot(transPt)
    ptXMixArray.append(ptRes[0][0])
    ptYMixArray.append(ptRes[1][0])

###########################################
# 镜像

# 以指定直线进行镜像
# https://blog.csdn.net/cuixiping/article/details/11934085

print('------ 镜像 矩阵')
mirrorMatrix = np.array([
    [-1, 0, 0, 0],
    [0, 1, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])
print(mirrorMatrix)

ptXMirrorArray = []
ptYMirrorArray = []

for i in range(len(ptXArray)):
    mirrorPt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])

    ptRes = mirrorMatrix.dot(mirrorPt)
    ptXMirrorArray.append(ptRes[0][0])
    ptYMirrorArray.append(ptRes[1][0])

###########################################
# 切变 Shearing
# 切变是坐标系的变换,非均匀的拉伸。切变时候,角度变化,但是面积或体积不变。也可以理解为坐标轴间的角度变化,造成的扭曲。
# 剪切变换(shear transformation)是空间线性变换之一,是仿射变换的一种原始变换。
# 它指的是类似于四边形不稳定性那种性质,方形变平行四边形,任意一边都可以被拉长的过程

print('------ 切变矩阵')
s = 0.3  # y坐标根据x坐标的切变
t = 0.3  # x坐标根据y坐标的切变

shearMatrix = np.array([
    [1, s, 0, 0],
    [t, 1, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 1]])

print(shearMatrix)

ptXShearArray = []
ptYShearArray = []

for i in range(len(ptXArray)):
    shearPt = np.array([[ptXArray[i]], [ptYArray[i]], [0], [1]])

    ptRes = shearMatrix.dot(shearPt)
    ptXShearArray.append(ptRes[0][0])
    ptYShearArray.append(ptRes[1][0])

    print(ptRes[0][0])
    print(ptRes[1][0])
    print('------')

###########################################
# 对上边的切变求逆,即还原

print('------ 切变矩阵的逆矩陣')
invShearMatrix = np.matrix(shearMatrix).I
print(invShearMatrix)
print(invShearMatrix.shape)
print('----n')

ptXInvShearArray = []  # 乘以逆矩陣后的点,即还原成最初的原始矩形
ptYInvShearArray = []

for i in range(len(ptXShearArray)):
    invShearPt = np.array([[ptXShearArray[i]], [ptYShearArray[i]], [0], [1]])
    print(invShearPt.shape)

    ptRes = invShearMatrix.dot(invShearPt)

    ptXInvShearArray.append(float(ptRes[0][0]))
    ptYInvShearArray.append(float(ptRes[1][0]))


######################################################
# 绘图

# 原图
ptXArray.append(ptXArray[0])
ptYArray.append(ptYArray[0])

plt.plot(ptXArray, ptYArray, label='origin', linewidth=4, color='green',
         marker='o', markerfacecolor='green', markersize=4)

# 旋转
ptXRotateArray.append(ptXRotateArray[0])  # 加入起点,使图形闭合
ptYRotateArray.append(ptYRotateArray[0])
plt.plot(ptXRotateArray, ptYRotateArray, label='rotate', linewidth=1, color='blue',
         marker='o', markerfacecolor='blue', markersize=4)

# 缩放
ptXScaleArray.append(ptXScaleArray[0])
ptYScaleArray.append(ptYScaleArray[0])
plt.plot(ptXScaleArray, ptYScaleArray, label='scale', linewidth=1, color='#998866',
         marker='o', markerfacecolor='yellow', markersize=4)

# 平移
ptXTransArray.append(ptXTransArray[0])
ptYTransArray.append(ptYTransArray[0])
plt.plot(ptXTransArray, ptYTransArray, label='trans', linewidth=1, color='#AABBCC',
         marker='o', markerfacecolor='red', markersize=4)

# 旋转 缩放 平移
ptXMixArray.append(ptXMixArray[0])
ptYMixArray.append(ptYMixArray[0])
plt.plot(ptXMixArray, ptYMixArray, label='Mix', linewidth=1, color='#FF00FF',
         marker='o', markerfacecolor='red', markersize=4)

# 镜像
ptXMirrorArray.append(ptXMirrorArray[0])
ptYMirrorArray.append(ptYMirrorArray[0])
plt.plot(ptXMirrorArray, ptYMirrorArray, label='Mirror', linewidth=1, color='#775599',
         marker='o', markerfacecolor='red', markersize=4)

# 切变
ptXShearArray.append(ptXShearArray[0])
ptYShearArray.append(ptYShearArray[0])
plt.plot(ptXShearArray, ptYShearArray, label='Shearing', linewidth=1, color='red',
         marker='o', markerfacecolor='red', markersize=4)

# 切变逆
print(ptXInvShearArray)
print(ptYInvShearArray)

ptXInvShearArray.append(ptXInvShearArray[0])
ptYInvShearArray.append(ptYInvShearArray[0])
plt.plot(ptXInvShearArray, ptYInvShearArray, label='InvShearing', linewidth=1, color='white',
         marker='o', markerfacecolor='red', markersize=4)

plt.show()

矩陣變換说明:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938263.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号