坐标变换(二维、三维)

文章目录

  • 一、四种空间
    • 1.1 定义和对比
    • 1.2 齐次坐标系
  • 二、刚性变换
    • 2.1 定义
    • 2.2 平移
    • 2.3 旋转
      • 2.3.1 二维
        • 2.3.1.1 绕原点
        • 2.3.1.2 绕任意点
      • 2.3.2 三维
        • 2.3.2.1 绕x轴
        • 2.3.2.2 绕y轴
        • 2.3.2.3 绕z轴

一、四种空间

1.1 定义和对比

  • 标量空间:只有标量;
  • 向量空间(Vector space):除了标量,还有向量;
  • 仿射空间(Affine space):除了标量、向量,还有点。向量空间没有位置的概念,所以不能表述几何物体,因此需要用到仿射空间;(对应齐次坐标系)
  • 欧几里得空间(Euclidean space):除了标量、向量,还有距离。仿射空间定义了点,包含了构建几何模型的必要元素,但是仿射空间没有定义长度的概念,欧几里得空间引入了这个概念。(对应欧几里得坐标系)
    在这里插入图片描述

1.2 齐次坐标系

若在三维空间中有一个向量表示为 v = ( a , b , c ) v=(a, b, c) v=(a,b,c),即 v = a i + b j + c z v=ai+bj+cz v=ai+bj+cz,那么表示为在三维仿射空间中的一个数学对象 o b j e c t = a i + b j + c z + d O object=ai+bj+cz+dO object=ai+bj+cz+dO。当 d=0 时,object 就是一个向量;当 d≠0 时,object 就是一个向量加上一个点,也就是一个点。因此,在齐次坐标系下,既可以表示向量,又可以表示点。在齐次坐标系中,向量的坐标形式为 v = ( x , y , z , 0 ) v=(x, y, z, 0) v=(x,y,z,0)用以表示 v = a i + b j + c z v=ai+bj+cz v=ai+bj+cz;点的坐标形式为 P = ( a , b , c , d ) P=(a, b, c, d) P=(a,b,c,d)用以表示 v = ( a / d ) i + ( b / d ) j + ( c / d ) z + O v=(a/d)i+(b/d)j+(c/d)z+O v=(a/d)i+(b/d)j+(c/d)z+O。也就是说,在三维空间中可以认为 ( x , y , z ) (x, y, z) (x,y,z)是点,也可以认为是向量,

齐次坐标:使用 N+1 维坐标来表示 N 维坐标。齐次坐标具有规模不变性,同一点可以被无数个齐次坐标表达 ( X , Y , 1 ) → ( a x , a y , a ) (X, Y, 1)\rightarrow(ax, ay, a) (X,Y,1)(ax,ay,a)齐次坐标转化为笛卡尔坐标可以通过同除最后一项得到。在计算机图形学中,为了统一将平移、旋转、缩放等用矩阵表示,需要引入齐次坐标。比如使用 2 ∗ 2 2*2 22的矩阵没有办法描述平移操作,需要引入 3 ∗ 3 3*3 33的矩阵,才能统一描述二维中的平移、旋转、缩放等操作。同理,必须使用 4 ∗ 4 4*4 44的矩阵才能描述三维变换。

二、刚性变换

2.1 定义

只有平移和旋转,物体的形状不发生改变的变换。

2.2 平移

假如三维空间中存在点 (x, y),分别对 x 和 y 向右移动 a, b 的单位长度,那么变换后为:
x ′ = x − a y ′ = y − b x'=x-a\\y'=y-b x=xay=yb
表示为矩阵形式有:
[ x ′ y ′ 1 ] = [ 1 0 − a 0 1 − b 0 0 1 ] = [ x y 1 ] \left [ \begin{matrix} x' \\ y' \\ 1 \end{matrix} \right]=\left[\begin{matrix} 1\quad 0\quad -a \\ 0\quad 1\quad -b \\ 0 \,\quad 0\quad\quad1 \end{matrix}\right]=\left[\begin{matrix}x\\y\\1\end{matrix}\right] xy1 = 10a01b001 = xy1
为了使用矩阵表示平移变换,需要将坐标的维度增加一维,因为二维的矩阵无法表示二维空间的平移变换,这就叫做齐次坐标。

三维空间:(x, y, z, 1) 经过平移变换后变成 (x+a, y+b, z+c, 1),写成矩阵的形式为:
[ x ′ y ′ z ′ 1 ] = [ 1 0 0 a 0 1 0 b 0 0 1 c 0 0 0 1 ] [ x y z 1 ] \left[\begin{matrix}x'\\y'\\z'\\1\end{matrix}\right]= \left[\begin{matrix}1\quad0\quad0\quad a\\ 0\quad1\quad0\quad b\\ 0\quad0\quad1\quad c\\0\quad0\quad0\quad1\end{matrix}\right]\left[\begin{matrix}x\\y\\z\\1\end{matrix}\right] xyz1 = 100a010b001c0001 xyz1

2.3 旋转

二维旋转是围绕一个点进行旋转,三维旋转是围绕一个轴进行旋转。

一文读懂图像中点的坐标变换(刚体变换,相似变换,仿射变换,投影变换)

Python 3D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

2.3.1 二维

2.3.1.1 绕原点

在这里插入图片描述

向量 v 绕原点旋转至 v’,那么旋转前后坐标可分别表示为:
在这里插入图片描述
即:
{ x ′ = r c o s ϕ c o s θ − r s i n ϕ s i n θ = x c o s θ − y s i n θ y ′ = r s i n ϕ c o s θ + r c o s ϕ s i n θ = y c o s θ + x s i n θ \begin{cases} x'=rcos\phi cos\theta-rsin\phi sin\theta=xcos\theta-ysin\theta \notag\\ y'=rsin\phi cos\theta +rcos\phi sin\theta=ycos\theta+xsin\theta\notag \end{cases} {x=rcosϕcosθrsinϕsinθ=xcosθysinθy=rsinϕcosθ+rcosϕsinθ=ycosθ+xsinθ

矩阵形式为:
[ x ′ y ′ ] = [ c o s θ − s i n θ s i n θ c o s θ ] = [ x y ] \left [ \begin{matrix} x' \\ y' \end{matrix} \right]=\left[\begin{matrix} cos\theta\,\,\,-sin\theta\\ sin\theta\,\,\,\quad cos\theta\\ \end{matrix}\right]=\left[\begin{matrix}x\\y\end{matrix}\right] [xy]=[cosθsinθsinθcosθ]=[xy]

2.3.1.2 绕任意点

绕任意点旋转可以转换为绕原点的旋转,处理思路:①首先将旋转点移动到原点处;②执行绕原点旋转;③再将旋转点移回到原来位置。也就是说,绕任意点的旋转可以处理为:平移+绕原点旋转+平移。因此,绕任意点旋转的旋转矩阵为:
M = [ 1 0 t x 0 1 t y 0 0 1 ] [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] [ 1 0 − t x 0 1 − t y 0 0 1 ] = [ c o s θ − s i n θ ( 1 − c o s θ ) t x + t y s i n θ s i n θ c o s θ ( 1 − c o s θ ) t y − t x s i n θ 0 0 1 ] \begin{align}M&=\left[\begin{matrix} 1\quad0\quad t_x\\ 0\quad1\quad t_y\\ 0\quad 0 \quad\,\, 1 \end{matrix}\right]\left[\begin{matrix} cos\theta\quad-sin\theta\quad 0\\ sin\theta\qquad cos\theta\quad 0\\ 0\qquad\,\,\,\,\, 0 \qquad\,\,\,\,\, 1 \end{matrix}\right] \left[\begin{matrix} 1\quad0\quad -t_x\\ 0\quad1\quad -t_y\\ 0\quad 0 \qquad\,\,\, 1 \end{matrix}\right]\notag\\ &\notag\\ &=\left[\begin{matrix} cos\theta\quad-sin\theta\quad (1-cos\theta)t_x+t_ysin\theta\\ sin\theta\qquad cos\theta\quad (1-cos\theta)t_y-t_xsin\theta\\ 0\qquad\qquad\qquad 0 \qquad\qquad\qquad 1 \end{matrix}\right] \notag\end{align} M= 10tx01ty001 cosθsinθ0sinθcosθ0001 10tx01ty001 = cosθsinθ(1cosθ)tx+tysinθsinθcosθ(1cosθ)tytxsinθ001
在这里插入图片描述

2.3.2 三维

绕那个轴旋转,哪个轴的坐标值不变。(注意:坐标顺序要符合右手坐标系!!!x-front,y-right,z-up)
在这里插入图片描述

3维旋转矩阵推导与助记

2.3.2.1 绕x轴

绕x轴旋转,旋转前后x的坐标值不变,三维旋转可理解为 zOy 平面上的向量绕原点 O 旋转,因此旋转过程为:
{ x ′ = x y ′ = y c o s β − z s i n β z ′ = z c o s β + y s i n β \left \{\begin{equation}\begin{aligned} &x'=x\notag\\ &y'=ycos\beta-zsin\beta \notag \\ &z'=zcos\beta+ysin\beta\notag\\ \end{aligned}\end{equation}\right . x=xy=ycosβzsinβz=zcosβ+ysinβ
矩阵形式为:
[ x ′ y ′ z ′ ] = [ 1 0 0 0 c o s β − s i n β 0 s i n β c o s β ] [ x y z ] \left[\begin{matrix}x'\\y'\\z'\end{matrix}\right]= \left[\begin{matrix} &1\quad &0\quad &0\\ &0\quad &cos\beta\quad &-sin\beta\\ &0\quad &sin\beta\quad &cos\beta\\ \end{matrix}\right] \left[\begin{matrix}x\\y\\z\end{matrix}\right] xyz = 1000cosβsinβ0sinβcosβ xyz

2.3.2.2 绕y轴

绕y轴旋转,旋转前后y的坐标值不变,三维旋转可理解为 xOz 平面上的向量绕原点 O 旋转,旋转过程为:
{ x ′ = x c o s β + z s i n β y ′ = y z ′ = z c o s β − x s i n β \left \{\begin{equation}\begin{aligned} &x'=xcos\beta+zsin\beta \notag\\ &y'=y\notag \\ &z'=zcos\beta-xsin\beta \notag\\ \end{aligned}\end{equation}\right . x=xcosβ+zsinβy=yz=zcosβxsinβ
矩阵形式为:
[ x ′ y ′ z ′ ] = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] [ x y z ] \left[\begin{matrix}x'\\y'\\z'\end{matrix}\right]= \left[\begin{matrix} &cos\beta\quad &0\quad &sin\beta\\ &0\quad &1\quad &0\\ &-sin\beta\quad &0\quad &cos\beta\\ \end{matrix}\right] \left[\begin{matrix}x\\y\\z\end{matrix}\right] xyz = cosβ0sinβ010sinβ0cosβ xyz

2.3.2.3 绕z轴

绕z轴旋转,旋转前后z的坐标值不变,三维旋转可理解为 yOx 平面上的向量绕原点 O 旋转,旋转过程为:
{ x ′ = x c o s β − y s i n β y ′ = y c o s β + x s i n β z ′ = z \left \{\begin{equation}\begin{aligned} &x'=xcos\beta-ysin\beta\notag\\ &y'=ycos\beta+xsin\beta\notag \\ &z'=z\notag\\ \end{aligned}\end{equation}\right . x=xcosβysinβy=ycosβ+xsinβz=z
矩阵形式为:
[ x ′ y ′ z ′ ] = [ c o s β − s i n β 0 s i n β c o s β 0 0 0 1 ] [ x y z ] \left[\begin{matrix}x'\\y'\\z'\end{matrix}\right]= \left[\begin{matrix} &cos\beta\quad &-sin\beta\quad &0\\ &sin\beta\quad &cos\beta\quad &0\\ &0\quad &0\quad &1\\ \end{matrix}\right] \left[\begin{matrix}x\\y\\z\end{matrix}\right] xyz = cosβsinβ0sinβcosβ0001 xyz

 
(本文完整的pdf请关注公众号“张张学算法”,并回复“020”获取~)
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用gnvm下载nodejs和npm

目录 前言 一、下载gnvm 二、利用gnvm下载nodejs 三、下载对应版本的npm 四、gnvm常用的命令 总结 前言 由于之前下载的版本过低,需要升级版本。但在使用gnvm升级node版本时遇到了一系列的问题,索性就把nodejs全部删除,重新用gnvm在下…

网络请求与数据解析

urllib是Python自带的标准库中用于网络请求的库 ,无需安装,直接引用即可。通常用于爬虫开发、API(应用程序编程接口)数据获取和测试。 urllib库的几个模块: urllib.request :用于打开和读取URLurllib.error:包含提出…

羊大师揭秘羊奶滋养,养生的新黄金选择

羊大师揭秘羊奶滋养,养生的新黄金选择 羊奶,这个自古以来的天然营养佳品,近年来逐渐受到现代人的青睐,成为养生的新黄金选择。它以其独特的营养价值和滋养功效,为追求健康生活的我们提供了全新的养生视角。 羊奶的滋…

LeetCode # 1161. 最大层内元素和

1161. 最大层内元素和 题目 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。 请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。…

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 动态导入图标参考 https://blog.csdn.net/ruancexiaoming/article/details/136568219 导入…

几个redis常用命令

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 ping:测试连接是否存活 例如:测试当前redis数据库是否存活 127.0.0.1:6379> ping #返回PONG&am…

python学习28

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

不会还有人判断字符是否为数字或字母还用Ascii吧

不会还有人判断字符是否为数字或字母还用Ascii吧 c > a && c < z) || (c > 0 && c < 9当然&#xff0c;也可也用&#xff0c;下面给大家分享几个方法快速判断。 Character.isLetter(ch) 判断ch是否为字母 Character.isDigit(ch) 判断ch是否为数字…

导入空管基础数据

1、首先将data.tar.gz解压到自定义目录中 注意&#xff1a;由于数据文件的压缩包比较大&#xff0c;解压过程可能会持续3~5分钟&#xff0c;请耐心等待。 [rootnode3 ~]# cd /opt/software/ [rootnode3 software]# tar -xzf data.tar.gz -C /opt/ 2、利用SQLyog或者其他数据库…

9、设计模式之组合模式(Composite)

一、什么是组合模式 组合模式也成为整体部分模式&#xff0c;是一种结构型设计模式。它将对象组合成树形的层次结构&#xff0c;用来表示“整体-部分”的关系。通过组合模式&#xff0c;我们可以使用相同的方式处理单个对象和多个对象组合。 二、角色组成 组件&#xff08;Com…

ROS机器人程序设计课程进度安排-2023-2024-2

进度安排由人工智能审核制定。 课程 教学进度表预期效果与课程内容详细描述 一、预期效果 此教学进度表旨在确保《ROS机器人程序设计》课程在2023&#xff5e;2024学年度第二学期内&#xff0c;按照预定的教学计划和进度&#xff0c;有序、高效地进行。通过本课程的教学&…

第二十一天-NumPy

目录 什么是NumPy NumPy使用 1.数组的创建 2.类型转换 3.赠删改查 4.数组运算 5.矩阵运算 什么是NumPy 1.NumPy操作的是多维数组&#xff0c;什么是纬度&#xff1f; NumPy使用 1. 安装 pip install numpy import numpy as np 2.官网&#xff1a; 中文官网&#xff1a…

蝙蝠避障:我生活中的一道光

盲人的世界&#xff0c;是无尽的黑暗。看不见光&#xff0c;看不见色彩&#xff0c;甚至看不见自己的手。但在这个黑暗的世界里&#xff0c;我找到了一个光明的出口&#xff1a;一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;三&#xff09;&#xff1a;使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…

使用cmd命令运行java

1.普通项目(不带lib文件夹) 1.在桌面上建一个名为com的文件夹&#xff0c;在文件夹中用记事本写两个类文件&#xff0c;后缀改为.java。两个类文件的内容如下图所示&#xff1a; 2.使用javac命令编译主函数&#xff0c;命令行为javac TestMain.java。结果可以看到自动生成了两…

Pygame教程07:键盘常量+键盘事件的2种捕捉方式

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

理论学习 BatchNorm2d

import torch import torch.nn as nn# With Learnable Parameters m nn.BatchNorm2d(100) # Without Learnable Parameters m nn.BatchNorm2d(100, affineFalse) input torch.randn(20, 100, 35, 45) output m(input)print(output) print(output.shape)这段代码展示了如何使…

2024蓝桥杯每日一题(二分)

一、第一题&#xff1a;教室 解题思路&#xff1a;二分差分 对天数进行二分&#xff0c;在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

你还可以通过“nrm”工具,来自由管理“npm”的镜像

你还可以通过“nrm”工具&#xff0c;来自由管理“npm”的镜像 nrm&#xff08;npm registry manager&#xff09;是npm的镜像管理工具&#xff0c;有时候国外的资源太慢&#xff0c;使用这个就可以快速地在npm源间切换。 1.安装nrm 在命令行执行命令&#xff0c;npm install…