写这篇日志有两个目的:一来是想测试新装上去的LaTeX插件显示数学公式是否好用(不过貌似通过RSS获取到的日志是没有办法显示的……);二来是对于三维向量绕任意轴的旋转之前我都是用结论的,今天因为做计算机图形学的作业去推导了一下,发现计算量相当大,算了我一个早上,故特以此日志留念。

言归正传,首先我们讨论二维向量的旋转。

对于一个向量OP(x, y),我们如何得知其绕原点O,沿逆时针方向(注意,以下所说的旋转均指逆时针方向,并且对于三维的情况我们假定坐标系都是符合右手定则的)旋转θ后的向量OP'(x', y')呢?

我们采取参数方程进行推导。设向量OP的长度为r,其辐角为φ,则其可表示为OP(r cos(φ), r sin(φ)),这样其旋转θ后的向量就可表示为OP'(r cos(φ + θ), r sin(φ + θ)),由三角函数的合角公式即可得到OP'(x cos(θ) - y sin(θ), x sin(θ) + y cos(θ))。

我们知道,几何中的变换是可以用线性代数中的矩阵进行描述的,上述旋转变换如果用矩阵描述便如下所示:

[cosθsinθ−sinθcosθ]⋅[xy]=[xcosθ−ysinθxsinθ+ycosθ]

好,现在我们已经知道如何进行二维向量的旋转了,那么我们开始讨论三维向量的旋转。

与二维向量不同,三维向量的旋转必须首先确定转动轴。那么首先来看三种特殊情况:绕x轴旋转、绕y轴旋转、绕z轴旋转。

注意到这三种特殊情况和二维情况是类似的,因为向量总在某个坐标平面内进行旋转,因此我们可以很容易地把前面那个矩阵扩展到三维,即如下所示:

Rx(θ)=⎡⎣1000cosθsinθ0−sinθcosθ⎤⎦

Ry(θ)=⎡⎣cosθ0−sinθ010sinθ0cosθ⎤⎦

Rz(θ)=⎡⎣cosθsinθ0−sinθcosθ0001⎤⎦

现在,我们来看看如何推导向量绕任意轴向量OS(x, y, z)旋转的矩阵吧。

我们可以这样,先将向量OS通过旋转与x轴重合,这样绕向量OS的旋转就变为了绕x轴的旋转,之后我们再将向量OS转回原来的位置。

为此,我们首先将向量OS通过旋转与x轴重合。分为两步:首先将向量OS绕x轴旋转,直到向量OS处于yOz平面上;再将向量OS绕y轴旋转,直到向量OS与x轴重合。

事实上,通过简单的几何关系,我们可以得出两步中所需要转动角度的sin值和cos值。由此可以写出这两步变换分别对应的矩阵,如下所示(如果难以理解,可以画画图并对照前面绕坐标轴旋转的矩阵):

R1=⎡⎣⎢⎢⎢⎢⎢⎢1000zy2+z2−−−−−−√yy2+z2−−−−−−√0−yy2+z2−−−−−−√zy2+z2−−−−−−√⎤⎦⎥⎥⎥⎥⎥⎥

java 三维向量类_计算几何,三维向量的旋转 | 学步园相关推荐

  1. java 汽车加油问题_贪心算法 汽车加油问题 | 学步园

    / //一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效      // // // n和k个加油站位置,编程计算最少加油次数.并证明算法能产生一个最优解.    // //要求:   ...

  2. java计数器策略模式_策略模式与外观模式 | 学步园

    1.策略 :定义不同的 2. 例子:随机生成宠物,并统计各种宠物生成数量. a) 抽象类:PetCreator,用于随机生成宠物. package context; import java.util. ...

  3. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园

    搜索引擎中对于Q查询,都会涉及到字符串归一化这个步骤,以提高结果召回率.字符串的归一化包括三个方面:繁体转简体:全角字符转半角:大写字母转小写. 建倒排时,会先对字符串做归一化处理,然后再分词取ter ...

  4. java 三维向量类_三维向量类

    还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据<线性代数与空间解析几何>以及<计算机图形学>等课程的相关知识写了一个三维向量 ...

  5. python设计一个三维向量类_一个简单的三维向量类

    最近在看<3D数学基础:图形与游戏开发>.该书第六章实现了一个简单三维向量类.我看了一下代码,发现有些地方是错的,于是做了一些小修改.该三维向量类实现了一些常用的向量运算,如点乘.叉乘等. ...

  6. java自动生成类_自动生成优化的Java类专业知识

    java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...

  7. java 开源地图引擎_开源三维地图框架-Cesium

    简介 优点:有较多的demo,详细的api文档,有测试平台,比较丰富的展示特性和扩展. 效果展示 加载底图(天地图) 存在 飞行.复位等实用工具 数据的加载和显示 cesium支持topojson,G ...

  8. 三维重构 c++_超越三维:在电路网络中实现四维拓扑绝缘态 | NSR论文

    研究者利用电容和电感器件,构建了一个具有四维连接性质.满足经典时间反演对称的电路网络,该系统属于四维拓扑绝缘态. 半个世纪前固体能带理论的提出,让人们认识到材料为什么可以分为金属.绝缘体或者半导体,并 ...

  9. java rhino js类_让Rhino JS看Java类

    我正在玩 Rhino,我已经成功使用了stdlib中的Java类,但没有使用我编译的Java代码. 例如,这工作正常: print(new java.util.Date()); 但是使用NanoHTT ...

最新文章

  1. php接收不到ajax请求参数,我是否需要在ajax请求和接收该请求的php之间编码/解码查询参数?...
  2. Eclipse的设置、调优、使用(解决启动卡顿等问题)----转
  3. mysql覆盖数据_理解MySQL数据库覆盖索引
  4. NEO从源码分析看nep2与nep6
  5. 一文读懂:从 Python 打包到 CLI 工具
  6. 解决修改SQL SERVER 默认1433端口 访问出错的问题;
  7. Eureka集群部署
  8. 【转】解析.Net框架下的XML编程技术
  9. 分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?
  10. html中input里的time怎么用,HTML Input Time stepDown()用法及代码示例
  11. macbook2015年早期版本更换三星1T 980nvme遇坑过程
  12. lgv30刷android10,记一次LG V30系列手机完美刷入MIUI12系统和Flyme刷机教程
  13. el表达式设置option标签selected
  14. WindowsCMD配置代理
  15. 台式电脑经常碰到的一些问题
  16. Finger-一款红队在大量的资产中存活探测与重点攻击系统指纹探测工具
  17. 如何使用CE来修改游戏并制作一个修改器
  18. solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
  19. 在ie edge中消除默认出现的密码框小眼睛标志
  20. cglib BeanCopier 使用

热门文章

  1. 微信和钉钉网页分享流程
  2. 服务器硬件详解与RAID磁盘阵列
  3. 诊断功能第一讲-诊断基础知识
  4. 面向企业的终极物联网实施指南
  5. sdcms php源码,Sdcms - 源码下载|Windows编程|其他小程序|源代码 - 源码中国
  6. 360搜索再出新硬件
  7. (14)ROS学习-ROS工作空间覆盖
  8. 如何解决用户添加到AD Group仍然无法访问SharePoint网站的问题?
  9. N71005-第四周
  10. STC32G12K128-Beta 硬件USB直接ISP下载