线性代数-坐标系变换

2023-10-27

问题描述:

已知一个全局坐标系,还有若干局部坐标系,如何将局部坐标系的坐标转成全局坐标系的坐标?反过来又如何进行?

这里的坐标系都是直角坐标系。

本文通过下面几个方面的研究来回答上面的问题。

1、简单示例

2、求解过程

3、nodejs编程验证

简单示例

已知点A(6,6),B(14,14),C(-2,14),G(12,12),求当A为原点 ,AB为X轴,AC为Y轴时 G点的坐标。可以见下图:

通过查看图形,我们可以很快的计算出点G新的坐标如下:

但是如果G为任意一点,我们还能轻松求出来么?显然我们不行。我们需要一种通用的方法来一次到位,这里就引入了矩阵变换的概念。

求解过程

重新理解坐标系的(x,y)。看下图:

我们的某个点的坐标实际上表达的是坐标轴单位向量的个数。x表示X轴单位向量个数,y表示Y轴单位向量个数。有了这个概念之后,我们重新来看待上面的问题:

假设AB单位向量为p(px,py),AC单位向量为q(qx,qy)。点G在新坐标系下为(x1,y1)

换成矩阵计算的写法:

由于AG向量可以很容易的求出来,单位向量p,q也很容易求出来,所以我们的新的坐标系下面的(x1,y1)也可以很容易求出来。通过逆矩阵变换可以求出下面公式:

就这样,我们通过重新理解坐标x和y的含义,通过引入了一个变换矩阵就轻松解决了坐标系的变换,是不是非常简单?这也是出乎我意料之外的,开始我也觉得好难好难。不过上述方法每次需要先求出AG的向量再进行计算,我们能否做到一步到位?当时答案是肯定的,我们通过引入一个三维矩阵,就可以轻松搞定。

我们将上述变换矩阵由二维扩展到三维,如下:假设A点的坐标为(Ax,Ay)。点G新坐标下(x1,x2),老坐标下(x0,y0)

这里我们换成三维矩阵的表达形式:

最左边的三维变换矩阵可以很容易求出来,那么我们可以根据G新坐标求出老坐标。再通过逆矩阵也可以根据老坐标求出新坐标。

总结:

解决这个问题非常简单只需要两步就搞定了。

第一步:我们需要求出新坐标系的x轴和y轴的单位向量,

第二步:构建一个三维变换矩阵,完成坐标的转换。

nodejs编程验证

这里通过编程的方式来验证变换矩阵的正确性,验证的示例就是上面简单示例。

这里矩阵计算我们采用gl-matrix库,github地址如下:

https://github.com/toji/gl-matrix

安装如下:这个库不需要再安装ts的定义,已经自带了。

npm i gl-matrix

第一步:定义点

let A = gl.vec3.fromValues(6, 6, 1)
let B = gl.vec3.fromValues(14, 14, 1)
let C = gl.vec3.fromValues(-2, 14, 1)
let G = gl.vec3.fromValues(12, 12, 1)

第二步:求新坐标系的X轴和Y轴的单位向量

let AB: gl.vec3 = gl.vec3.create()
let AC: gl.vec3 = gl.vec3.create()


gl.vec3.subtract(AB, B, A)
gl.vec3.subtract(AC, C, A)


let UnitAB: gl.vec3 = gl.vec3.create()
let UnitAC: gl.vec3 = gl.vec3.create()


gl.vec3.normalize(UnitAB, AB)
gl.vec3.normalize(UnitAC, AC)

第三步:构造计算矩阵

let mat = gl.mat3.fromValues(
  UnitAB[0],
  UnitAB[1],
  UnitAB[2],
  UnitAC[0],
  UnitAC[1],
  UnitAC[2],
  A[0],
  A[1],
  A[2]
)

第四步:求逆矩阵

let matInvert: gl.mat3 = gl.mat3.create()
gl.mat3.invert(matInvert, mat)

第五步:求新坐标系下的坐标G1

let G1: gl.vec3 = gl.vec3.create()
gl.vec3.transformMat3(G1, G, matInvert)

第六步:根据新求出的坐标反过来求原坐标系坐标G2

let G2 = gl.vec3.create()
gl.vec3.transformMat3(G2, G1, mat)

第七步:设置人工算出的值G3

let G3 = gl.vec3.fromValues(3 * Math.sqrt(8), 0, 1)

输出结果如下:验证矩阵变换结果符合预期

G:12,12,1
G1:8.485280990600586,0,1
G2:12,12,1
G3:8.485280990600586,0,1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性代数-坐标系变换 的相关文章

随机推荐

  • QT——创建一个智慧家居界面

    1 新建项目注意 在创建一个项目时 我们要根据需要选择一个基类 如下图所示 根据需要合理选择 2 初始代码解读 这里我选择的基类是Qwidget include widget h 自动引入widget这个类的头文件 widget继承了Qwi
  • 群晖服务器共享文件忘记密码,群晖synology NAS ds 1815+忘记google authenticator二次验证密码...

    群晖synology NAS为了登录安全起见 设置了google的二次验证 当换手机或者刷机前没有解除二次验证时 就悲剧了 输入帐号密码后 就要输入6位google的二次验证吗 群晖登录不了 让你联系管理员 我就是管理员 点手机丢失 没有开
  • How to Debug the Eclipse C/C++ Indexer

    This page will guideline you to debug the C C Indexer in Eclipse when you meet C C Indexer Issues like below 1 Eclipse t
  • pthread_cond_wait pthread_cond_broadcast条件变量时要注意

    include
  • 应用服务器、开源框架常见实际问题记录

    eclipse 运行问题 1 The type javax servlet jsp PageContext cannot be resolved It is indirectly referenced from required class
  • exce中让两列数据一一对应_EXCEL让两个表格中的两列数据一一对应:

    WPS两个EXCEL中数据如何相对应的放在一起 例如 1 选中姓名这一列的数据中的标志就是表格的粗黑线 之后 依次在 开始 选项选择 编辑 排序和筛选 自定义排序 2 这时 会弹出 排序 窗口 在列的主要关键字中选择 姓名 排序依据 和 次
  • 终端对平台推送拉取数据选型

    开会讨论了一个问题 就是我们平台从终端获取到数据 经过我们的处理后 传输给另一个平台做展示 这个是实时的 要求必须经过我们平台 所以杠精住嘴 在这个传输过程中 给出了一下三个方案来传输数据 tcp websocket API 最后还是选取了
  • SpringBoot整合MyBatis

    SpringBoot整合MyBatis 转载请在文章最上方加上此句话 原文地址 http www cnblogs com zhuxiaojie p 5836159 html 前言 这段时间用springboot感觉确实挺好用的 很大程度上的
  • SQL查询优化——表分区

    1 表分区 在建表的时候将表建成分区表 2 好处 a1 提高对数据检索或操作的效率 a2 不同的分区可以保存到不同的表空间 磁盘 提高数据的安全性 a3 可以将数据分到不同的分区 a4 每个分区的数据可以独立的备份和恢复 3 表分区的方法
  • 【计算机科学】【2017.12】图像分类与回归的深度神经网络模型

    本文为意大利特伦托大学 作者 Salim MALEK 的博士论文 共98页 深度学习是机器学习的一个分支 在许多研究领域和实际中都得到了广泛应用 这种持续的发展主要可以追溯到潜在处理设施的可用性和可负担性 例如 仅在十年前 这些设施还没有普
  • np.quantile()详解

    numpy quantile numpy quantile a q axis None out None overwrite input False interpolation linear keepdims False import nu
  • Linux下的虚拟化部署

    文章目录 1 kvm安装条件 2 kvm虚拟化安装 3 kvm虚拟化相关信息 4 手动安装虚拟机 5 虚拟机管理命令 6 虚拟机在linux系统中传输 7 虚拟机快照 8 脚本执行新建 快照 修复虚拟机 9 虚拟机网络配置 1 kvm安装条
  • 硬盘的几点真相

    因为想自己修下硬盘 所以先找了远古时代的笔记本硬盘拆了看看结构 结果发现几个很有意思的地方 首先就是那个 do not cover 的小孔 相信很多人都注意到了硬盘上有个很小的小孔 从外面看进去好像是个微型可调电容 周围一圈文字 do no
  • Matlab 随机森林工具箱的配置使用

    总结一下Matlab随机森林工具箱的配置和使用 配置环境Matlab2019a windows10 vs2017 1 下载Matlab随机森林工具箱 下载地址http www buaapress com cn mzs file detail
  • java持久层框架数据源加密

    学习目标 java持久层框架数据源加密 文章目录 学习目标 1 mybatis框架数据源加密 https www cnblogs com melovemingming p 10699613 html 这里是引用https www cnblo
  • 基于HAL库的stm32的OLED显示屏显示(模拟I2C,四脚,0.96寸)

    参考视频 江科大oled程序移植stm32hal库 freertos学习 cpu使用率 哔哩哔哩 bilibili STM32入门教程 2023持续更新中 哔哩哔哩 bilibili 第一步 STM32CubeMX配置 一 时钟树配置 高速
  • vs2012配置python_Visual Studio 2012 Ultimate 上安装 Python 开发插件 PTVS

    1 我的环境 操作系统 32位 Win7 旗舰版 Service Pack 1 VS版本 Microsoft Visual Studio Ultimate 2012 版本 11 0 50727 1 RTMREL Python解释器版本 Py
  • CAD颗粒密堆积2D插件 球体重力堆积 离散元建模 分子热运动

    插件简介 CAD颗粒密堆积2D插件可用于生成二维状态下重力堆积的随机颗粒 插件可指定投放区域 颗粒的粒径范围 颗粒间的间距 颗粒个数等信息 同时可模拟颗粒弹性及摩擦摩擦系数 插件采用物理引擎对颗粒行为进行模拟 可实现颗粒在力场作用下的堆积
  • c语言小游戏 精简_C语言实现消消乐小游戏

    本文实例为大家分享了C语言实现消消乐小游戏的具体代码 供大家参考 具体内容如下 代码 include include include include include include include include using namespa
  • 线性代数-坐标系变换

    问题描述 已知一个全局坐标系 还有若干局部坐标系 如何将局部坐标系的坐标转成全局坐标系的坐标 反过来又如何进行 这里的坐标系都是直角坐标系 本文通过下面几个方面的研究来回答上面的问题 1 简单示例 2 求解过程 3 nodejs编程验证 简