java 三维向量类_计算几何,三维向量的旋转 | 学步园
写这篇日志有两个目的:一来是想测试新装上去的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 三维向量类_计算几何,三维向量的旋转 | 学步园相关推荐
- java 汽车加油问题_贪心算法 汽车加油问题 | 学步园
/ //一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效 // // // n和k个加油站位置,编程计算最少加油次数.并证明算法能产生一个最优解. // //要求: ...
- java计数器策略模式_策略模式与外观模式 | 学步园
1.策略 :定义不同的 2. 例子:随机生成宠物,并统计各种宠物生成数量. a) 抽象类:PetCreator,用于随机生成宠物. package context; import java.util. ...
- java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
搜索引擎中对于Q查询,都会涉及到字符串归一化这个步骤,以提高结果召回率.字符串的归一化包括三个方面:繁体转简体:全角字符转半角:大写字母转小写. 建倒排时,会先对字符串做归一化处理,然后再分词取ter ...
- java 三维向量类_三维向量类
还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据<线性代数与空间解析几何>以及<计算机图形学>等课程的相关知识写了一个三维向量 ...
- python设计一个三维向量类_一个简单的三维向量类
最近在看<3D数学基础:图形与游戏开发>.该书第六章实现了一个简单三维向量类.我看了一下代码,发现有些地方是错的,于是做了一些小修改.该三维向量类实现了一些常用的向量运算,如点乘.叉乘等. ...
- java自动生成类_自动生成优化的Java类专业知识
java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...
- java 开源地图引擎_开源三维地图框架-Cesium
简介 优点:有较多的demo,详细的api文档,有测试平台,比较丰富的展示特性和扩展. 效果展示 加载底图(天地图) 存在 飞行.复位等实用工具 数据的加载和显示 cesium支持topojson,G ...
- 三维重构 c++_超越三维:在电路网络中实现四维拓扑绝缘态 | NSR论文
研究者利用电容和电感器件,构建了一个具有四维连接性质.满足经典时间反演对称的电路网络,该系统属于四维拓扑绝缘态. 半个世纪前固体能带理论的提出,让人们认识到材料为什么可以分为金属.绝缘体或者半导体,并 ...
- java rhino js类_让Rhino JS看Java类
我正在玩 Rhino,我已经成功使用了stdlib中的Java类,但没有使用我编译的Java代码. 例如,这工作正常: print(new java.util.Date()); 但是使用NanoHTT ...
最新文章
- php接收不到ajax请求参数,我是否需要在ajax请求和接收该请求的php之间编码/解码查询参数?...
- Eclipse的设置、调优、使用(解决启动卡顿等问题)----转
- mysql覆盖数据_理解MySQL数据库覆盖索引
- NEO从源码分析看nep2与nep6
- 一文读懂:从 Python 打包到 CLI 工具
- 解决修改SQL SERVER 默认1433端口 访问出错的问题;
- Eureka集群部署
- 【转】解析.Net框架下的XML编程技术
- 分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?
- html中input里的time怎么用,HTML Input Time stepDown()用法及代码示例
- macbook2015年早期版本更换三星1T 980nvme遇坑过程
- lgv30刷android10,记一次LG V30系列手机完美刷入MIUI12系统和Flyme刷机教程
- el表达式设置option标签selected
- WindowsCMD配置代理
- 台式电脑经常碰到的一些问题
- Finger-一款红队在大量的资产中存活探测与重点攻击系统指纹探测工具
- 如何使用CE来修改游戏并制作一个修改器
- solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
- 在ie edge中消除默认出现的密码框小眼睛标志
- cglib BeanCopier 使用