空间坐标变换(Python&C++实现)

这篇具有很好参考价值的文章主要介绍了空间坐标变换(Python&C++实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

空间坐标变换可看作坐标点乘以一个齐次矩阵,其中,齐次矩阵可表示为:
空间坐标转换,python,线性代数
其中:
①区域的3×3矩阵产生三维图形的比例、对称、旋转、错切等基本变换;
②区域产生图形的透视变换;
③区域产生沿X、Y、Z三个轴的平移变换;
④区域产生图形的总比例变换。

平移变换

平移变换可表示为:
[ x y z 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 l m n 1 ] = [ x + l y + m z + n 1 ] \begin{gathered} \quad \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ l & m & n & 1 \end{bmatrix} = \begin{bmatrix} x+l & y+m & z+n & 1 \end{bmatrix} \end{gathered} [xyz1] 100l010m001n0001 =[x+ly+mz+n1]

绕X轴旋转

空间立体绕X轴旋转某个角度,实体上个点的X坐标不变,只有Y、Z坐标改变,可表示为:
[ x y z 1 ] [ 1 0 0 0 0 c o s ( θ ) s i n ( θ ) 0 0 − s i n ( θ ) c o s ( θ ) 0 0 0 0 1 ] = [ x y × c o s ( θ ) − z × s i n ( θ ) y × s i n ( θ ) + z × c o s ( θ ) 1 ] \begin{gathered} \quad \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos(\theta) & sin(\theta) & 0 \\ 0 & -sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} x & y \times cos(\theta) - z \times sin(\theta) & y \times sin(\theta) + z \times cos(\theta) & 1 \end{bmatrix} \end{gathered} [xyz1] 10000cos(θ)sin(θ)00sin(θ)cos(θ)00001 =[xy×cos(θ)z×sin(θ)y×sin(θ)+z×cos(θ)1]

绕Y轴旋转

空间立体绕Y轴旋转某个角度,实体上个点的Y坐标不变,只有X、Z坐标改变,可表示为:
[ x y z 1 ] [ c o s ( θ ) 0 − s i n ( θ ) 0 0 1 0 0 s i n ( θ ) 0 c o s ( θ ) 0 0 0 0 1 ] = [ x × c o s ( θ ) + z × s i n ( θ ) y − x × s i n ( θ ) + z × c o s ( θ ) 1 ] \begin{gathered} \quad \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} cos(\theta) & 0 & -sin(\theta) & 0 \\ 0 & 1 & 0 & 0 \\ sin(\theta) & 0 & cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} x \times cos(\theta) + z \times sin(\theta) & y & -x \times sin(\theta) + z \times cos(\theta) & 1 \end{bmatrix} \end{gathered} [xyz1] cos(θ)0sin(θ)00100sin(θ)0cos(θ)00001 =[x×cos(θ)+z×sin(θ)yx×sin(θ)+z×cos(θ)1]

绕Z轴旋转

空间立体绕Z轴旋转某个角度,实体上个点的Z坐标不变,只有X、Y坐标改变,可表示为:
[ x y z 1 ] [ c o s ( θ ) s i n ( θ ) 0 0 − s i n ( θ ) c o s ( θ ) 0 0 0 0 1 0 0 0 0 1 ] = [ x × c o s ( θ ) − y × s i n ( θ ) x × s i n ( θ ) + y × c o s ( θ ) z 1 ] \begin{gathered} \quad \begin{bmatrix} x & y & z & 1 \end{bmatrix} \begin{bmatrix} cos(\theta) & sin(\theta) & 0 & 0 \\ -sin(\theta) & cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} x \times cos(\theta) - y \times sin(\theta) & x \times sin(\theta) + y \times cos(\theta) & z & 1 \end{bmatrix} \end{gathered} [xyz1] cos(θ)sin(θ)00sin(θ)cos(θ)0000100001 =[x×cos(θ)y×sin(θ)x×sin(θ)+y×cos(θ)z1]

python代码

绕X轴旋转

def rotate_X(x, y, z, alpha):
    alpha = alpha * (np.pi / 180)
    x_r = x
    y_r = np.cos(alpha) * y - np.sin(alpha) * z
    z_r = np.sin(alpha) * y + np.cos(alpha) * z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)

绕Y轴旋转

def rotate_Y(x, y, z, beta):
    beta = beta * (np.pi / 180)
    x_r = np.cos(beta) * x + np.sin(beta) * z
    y_r = y
    z_r = -np.sin(beta) * x + np.cos(beta) * z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)

绕Z轴旋转

def rotate_Z(x, y, z, gamma):
    gamma = gamma * (np.pi / 180)
    x_r = np.cos(gamma) * x - np.sin(gamma) * y
    y_r = np.sin(gamma) * x + np.cos(gamma) * y
    z_r = z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)

为了更直观的显示,使用matplotlib将旋转前后的点显示出来

def plot_3D(x, y, z, x1, y1, z1):
    a, b, c = [0, x, x1], \
              [0, y, y1], \
              [0, z, z1]
    d, e, f, g, h, i = [0], [0], [0], [0], [0], [0]
    d.append(x)
    e.append(y)
    f.append(z)
    g.append(x1)
    h.append(y1)
    i.append(z1)

    dd, ee, ff = [x, 0, 0, x, x, x], \
                 [y, y, 0, 0, y, y], \
                 [z, z, z, z, z, 0]

    dd1, ee1, ff1 = [0, x, x, 0, 0, 0], \
                    [0, 0, y, y, 0, 0], \
                    [0, 0, 0, 0, 0, z]
    dd2, ee2, ff2 = [x, x], \
                    [0, 0], \
                    [0, z]
    dd3, ee3, ff3 = [0, 0], \
                    [y, y], \
                    [0, z]

    gg, hh, ii = [x1, 0, 0, x1, x1, x1], \
                 [y1, y1, 0, 0, y1, y1], \
                 [z1, z1, z1, z1, z1, 0]
    gg1, hh1, ii1 = [0, x1, x1, 0, 0, 0], \
                    [0, 0, y1, y1, 0, 0], \
                    [0, 0, 0, 0, 0, z1]
    gg2, hh2, ii2 = [x1, x1], \
                    [0, 0], \
                    [0, z1]
    gg3, hh3, ii3 = [0, 0], \
                    [y1, y1], \
                    [0, z1]

    ax = plt.axes(projection='3d')  # 创建一个三维的绘图工程
    ax.scatter3D(a, b, c, c='r')  # 绘制数据点 c: 'r'红色,'y'黄色,等颜色
    ax.text(x, y, z, (x, y, z), c='r')  # 显示点坐标
    ax.text(x1, y1, z1, (x1, y1, z1), c='r')
    ax.plot3D(d, e, f, c='b')
    ax.plot3D(dd, ee, ff, c='b', linestyle='--')
    ax.plot3D(dd1, ee1, ff1, c='b', linestyle='--')
    ax.plot3D(dd2, ee2, ff2, c='b', linestyle='--')
    ax.plot3D(dd3, ee3, ff3, c='b', linestyle='--')
    ax.plot3D(g, h, i, c='y')
    ax.plot3D(gg, hh, ii, c='y', linestyle='--')
    ax.plot3D(gg1, hh1, ii1, c='y', linestyle='--')
    ax.plot3D(gg2, hh2, ii2, c='y', linestyle='--')
    ax.plot3D(gg3, hh3, ii3, c='y', linestyle='--')

    ax.set_xlabel('X')  # 设置x坐标轴
    ax.set_ylabel('Y')  # 设置y坐标轴
    ax.set_zlabel('Z')  # 设置z坐标轴
    ax.grid(False)  # 关闭网格

    plt.show()

现设初始点为P0(0,0,6),P0先绕X轴旋转6°,再绕Y轴旋转45°得到P2
空间坐标转换,python,线性代数
完整代码:

import numpy as np
import matplotlib.pyplot as plt


# 1、绕Z周旋转gamma角
def rotate_Z(x, y, z, gamma):
    gamma = gamma * (np.pi / 180)
    x_r = np.cos(gamma) * x - np.sin(gamma) * y
    y_r = np.sin(gamma) * x + np.cos(gamma) * y
    z_r = z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)


# 2、绕Y轴旋转beta角
def rotate_Y(x, y, z, beta):
    beta = beta * (np.pi / 180)
    x_r = np.cos(beta) * x + np.sin(beta) * z
    y_r = y
    z_r = -np.sin(beta) * x + np.cos(beta) * z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)


# 3、绕X轴旋转alpha角
def rotate_X(x, y, z, alpha):
    alpha = alpha * (np.pi / 180)
    x_r = x
    y_r = np.cos(alpha) * y - np.sin(alpha) * z
    z_r = np.sin(alpha) * y + np.cos(alpha) * z
    return round(x_r, 4), round(y_r, 4), round(z_r, 4)


def plot_3D(x, y, z, x1, y1, z1):
    a, b, c = [0, x, x1], \
              [0, y, y1], \
              [0, z, z1]
    d, e, f, g, h, i = [0], [0], [0], [0], [0], [0]
    d.append(x)
    e.append(y)
    f.append(z)
    g.append(x1)
    h.append(y1)
    i.append(z1)

    dd, ee, ff = [x, 0, 0, x, x, x], \
                 [y, y, 0, 0, y, y], \
                 [z, z, z, z, z, 0]

    dd1, ee1, ff1 = [0, x, x, 0, 0, 0], \
                    [0, 0, y, y, 0, 0], \
                    [0, 0, 0, 0, 0, z]
    dd2, ee2, ff2 = [x, x], \
                    [0, 0], \
                    [0, z]
    dd3, ee3, ff3 = [0, 0], \
                    [y, y], \
                    [0, z]

    gg, hh, ii = [x1, 0, 0, x1, x1, x1], \
                 [y1, y1, 0, 0, y1, y1], \
                 [z1, z1, z1, z1, z1, 0]
    gg1, hh1, ii1 = [0, x1, x1, 0, 0, 0], \
                    [0, 0, y1, y1, 0, 0], \
                    [0, 0, 0, 0, 0, z1]
    gg2, hh2, ii2 = [x1, x1], \
                    [0, 0], \
                    [0, z1]
    gg3, hh3, ii3 = [0, 0], \
                    [y1, y1], \
                    [0, z1]

    ax = plt.axes(projection='3d')  # 创建一个三维的绘图工程
    ax.scatter3D(a, b, c, c='r')  # 绘制数据点 c: 'r'红色,'y'黄色,等颜色
    ax.text(x, y, z, (x, y, z), c='r')  # 显示点坐标
    ax.text(x1, y1, z1, (x1, y1, z1), c='r')
    ax.plot3D(d, e, f, c='b')
    ax.plot3D(dd, ee, ff, c='b', linestyle='--')
    ax.plot3D(dd1, ee1, ff1, c='b', linestyle='--')
    ax.plot3D(dd2, ee2, ff2, c='b', linestyle='--')
    ax.plot3D(dd3, ee3, ff3, c='b', linestyle='--')
    ax.plot3D(g, h, i, c='y')
    ax.plot3D(gg, hh, ii, c='y', linestyle='--')
    ax.plot3D(gg1, hh1, ii1, c='y', linestyle='--')
    ax.plot3D(gg2, hh2, ii2, c='y', linestyle='--')
    ax.plot3D(gg3, hh3, ii3, c='y', linestyle='--')

    ax.set_xlabel('X')  # 设置x坐标轴
    ax.set_ylabel('Y')  # 设置y坐标轴
    ax.set_zlabel('Z')  # 设置z坐标轴
    ax.grid(False)  # 关闭网格

    plt.show()


if __name__ == '__main__':
    x, y, z = 0, 0, 6
    x1, y1, z1 = rotate_X(x, y, z, 6)
    x2, y2, z2 = rotate_Y(x1, y1, z1, 45)
    print(x2, y2, z2)
    plot_3D(x, y, z, x2, y2, z2)

C++代码:文章来源地址https://www.toymoban.com/news/detail-645235.html

#include<iostream>
#include <iomanip>
#include<math.h>
#define PAI acos(-1)

using namespace std;
void  rotate_Z(double x, double y, double z, double theta);
void  rotate_Y(double x, double y, double z, double theta);
void  rotate_X(double x, double y, double z, double theta);

 
int main() 
{
	double x = 0;
	double y = 0;
	double z = 6;
	rotate_Z(x,y,z,45);
	return 0;
}

void  rotate_Z(double x, double y, double z, double theta)
{
	double theta_r = theta * (PAI/180);
	double x_r = cos(theta_r) * x - sin(theta_r) * y;
	double y_r = sin(theta_r) * x + sin(theta_r) * y;
	double z_r = z;
	
	cout.setf(ios::fixed);
	cout << "X:" << setprecision(4) << x_r << endl;
	cout << "Y:" << setprecision(4) << y_r << endl;
	cout << "Z:" << setprecision(4) << z_r << endl;
 } 
 
void  rotate_Y(double x, double y, double z, double theta)
{
	double theta_r = theta * (PAI/180);
	double x_r = cos(theta_r) * x + sin(theta_r) * z;
	double y_r = y;
	double z_r = -sin(theta_r) * x + cos(theta_r) * z;
	
	cout.setf(ios::fixed);
	cout << "X:" << setprecision(4) << x_r << endl;
	cout << "Y:" << setprecision(4) << y_r << endl;
	cout << "Z:" << setprecision(4) << z_r << endl;
 } 
 
void  rotate_X(double x, double y, double z, double theta)
{
	double theta_r = theta * (PAI/180);
	double x_r = x;
	double y_r = cos(theta_r) * y - sin(theta_r) * z;
	double z_r = sin(theta_r) * y + cos(theta_r) * z;
	
	cout.setf(ios::fixed);
	cout << "X:" << setprecision(4) << x_r << endl;
	cout << "Y:" << setprecision(4) << y_r << endl;
	cout << "Z:" << setprecision(4) << z_r << endl;
 } 

到了这里,关于空间坐标变换(Python&C++实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 空间坐标(系)如何进行变换?

      要描述某一物体在现实场景的位置,通常以三维空间坐标系下的坐标进行说明,当物体位置或自身进行变化时,可以用放射变换说明物体的变化情况。仿射变换中的基本变换包括平移、旋转、缩放、剪切。本文研究的物体为刚体,涉及的变换为平移和旋转,下文将以平移

    2024年02月06日
    浏览(25)
  • 【线性代数-3Blue1Brown】- 5 三维空间的线性变换

    飞书原文档:Docs  

    2024年02月11日
    浏览(30)
  • 【Python&RS】遥感影像的像素坐标转地理坐标(仿射变换)

    ​         GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。         Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数

    2024年02月08日
    浏览(33)
  • 向量空间中的基底和基变换以及坐标变换

    基底的每一个成员称作是基向量, n 维空间中的基底由 n 个基向量构成,这些基向量需要满足线性无关的条件,这样的话n 维空间中的任何向量 v都能表示成n个基向量的线性组合且表示方式是唯一的。 参考链接 :https://zhuanlan.zhihu.com/p/247915130 基变换就是把一组基变到另一组基

    2024年02月16日
    浏览(32)
  • 线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)

    目录 1 从颜色说起 1.1 用简单的枚举 → 一一映射到某种颜色 1.1.1  自然语言里的颜色对应 1.1.2 举个例子:VB里的colorindex 1.1.3 接下来的关键问题就是:如何对应更多的颜色,无限穷举么? 1.2 升级版的颜色映射思路:RGB颜色 1.2.1 RGB颜色大家都明白原理 1.2.2 表达方式1:用一个

    2024年02月10日
    浏览(30)
  • Unity Shader 开发入门3 —— 坐标空间变换

    ​ 在 Shader 开发中存在不同的坐标空间,包括: 模型空间。 世界空间。 观察空间。 裁剪空间。 屏幕空间。 ​ 在渲染管线中,需要将坐标数据在这些空间中进行变换计算。 ​ 在设计模型时,使用模型空间。模型导入 Unity 后,最终显示在屏幕上,依次经历了如下空间的坐标

    2024年01月16日
    浏览(33)
  • 齐次坐标变换的理解以及在无人机相机定位坐标系转换中的应用

    4*4矩阵的右边三个数表示平移,如果原来的向量u的w=0,那么就是u+(ai+bj+ck) 对应xyz三个轴的循环变换,注意负号的位置 用描述空间一点的变换方法来描述物体在空间的位置和方向。 先变换的矩阵乘在右边。 A p = B p + A p B o {}^{A}p={}^{B}p+{}^{A}p_{B_{o}} A p = B p + A p B o ​ ​ 从

    2024年04月15日
    浏览(49)
  • CCF-CSP真题《202309-1 坐标变换(其一)》思路+python,c++,java满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202309-1 试题名称: 坐标变换(其一) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标 (x,y),小 P 定义了一个包含 n 个操作的序列 T=(t1,t2,⋯,tn)。其中每个操作 

    2024年02月08日
    浏览(25)
  • 坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

    业务上通过GIS软件将空间数据导入到数据库时,因为不同的数据来源和软件设置,可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系,只是在geoserver单纯的设置坐标系只是改了定义并没有实际执行坐标转换,所以需要在数据

    2024年02月14日
    浏览(40)
  • 坐标变换基础-欧拉角&固定角与位姿矩阵的相互转换

    空间中一个坐标系相对于另一个坐标系的变换关系用新坐标系的三个坐标轴相对于原坐标系的方向矢量来确定,可用 矩阵来描述。用齐次矩阵(4x4)来统一描述刚体的位置和姿态: 其中,R便是描述姿态的旋转矩阵。 和沿着三个坐标轴的平移运动不一样,旋转矩阵显得很不直

    2024年02月04日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包