学习四元数笔记
- 格式:doc
- 大小:482.00 KB
- 文档页数:25
第四单元认识物体和图形1.认识立体图形认识“正方体”“长方体”“圆柱”“球”知道他们的名称学会辨认这几种形状的物体和图形。
能够初步感知这些物体的一些基本特点。
球:圆乎乎的,没有平平的面,放在桌子上可以任意滚动。
圆柱:直筒筒的,上下一样粗,两头是平平的一样大的圆形。
躺在桌子上是可以滚动的,立在桌子上就不能滚动了。
正方体:四四方方的,不能滚动。
有6个面,每个面的大小都是一样的,都是正方形。
长方体:长长方方的,无法滚动。
有6个面,每个面都是长方形,有时也可能有2个面是正方形。
重难点:(1)可以正确数出图形中物体的个数,包括能正确找出隐藏的物体。
图1:7 图2:5 图3:8(2)能够正确找出每种立体图形对应的平面图形。
(注意:根据一年级所学习的内容,球是不可以直接画出圆形的,因为球是曲面,和平面接触的部分只是一个点。
)第一行:选第三个第二行:选第二个第三行:选第一和第二个第四行:选第一个(3)认识正方体展开图理解与面1相对的是面3,两个面要相隔一个格子才能相对面。
(另附:三维展开图。
)2.认识平面图形认识“正方形”“长方形”“圆形”“三角形”知道他们的名称学会辨认这几种形状的物体和图形。
能够初步感知这些图形的一些基本特点。
圆:平平的圆圆的面正方形:四四方方的,有四个直直的角,四条边,并且每条边都相等长方形:长长方方的,也有四个直直的角,四条边,但边有长有短。
三角形:有三个角,三条边。
重难点:(1)能够正确的将图形折叠成其他图形A. 将正方形分成两个长方形B.将正方形分成两个三角形C.将三角形分成两个直角三角形D.将长方形分成两个正方形3.学会拼图能够将被分开的图形的两部分找出来,再拼成整体的图形。
(例如:半圆和半圆可以拼成整圆)教学方法:自制正方形,长方形,圆形,三角形的纸片,将他们剪开,放在一起,让孩子在其中找出被剪开的部分,然后拼起来。
以游戏的形式让孩子掌握知识。
第五单元分类1.单一标准的分类感知分类,观察课本38页图,发现:相同的东西放在一起,就叫分类。
四元数简介在我之前,⽹上各个博客各⼤⽹站都有很多关于四元数的介绍与讲解!但我总结了⼀下接三个字:看不懂!说实话!这真的是实话!举个例⼦:1.旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的⼀种了。
⼤家应该都听过,有⼀种旋转的表⽰⽅法叫四元数。
按照我们的习惯,我们更加熟悉的是另外两种旋转的表⽰⽅法——矩阵旋转和欧拉旋转。
矩阵旋转使⽤了⼀个4*4⼤⼩的矩阵来表⽰绕任意轴旋转的变换矩阵,⽽欧拉选择则是按照⼀定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转⼀定⾓度来变换坐标或向量,它实际上是⼀系列坐标轴旋转的组合。
那么,四元数⼜是什么呢?简单来说,四元数本质上是⼀种⾼阶复数(听不懂了吧。
),是⼀个四维空间,相对于复数的⼆维空间。
我们⾼中的时候应该都学过复数,⼀个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。
⽽四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即⼀个四元数可以表⽰为x = a + bi + cj + dk。
那么,它和旋转为什么会有关系呢?怎么样,看得懂吗?反正⼩编是被现实胖揍⼀顿!那么,今天我们要怎么来介绍这个四元数呢?我们来最简单暴⼒的!重新定义⼀下这个怪物四元数!Quaternion(四元数)⽤于计算和表⽰Unity旋转。
它们计算紧凑⾼效,不受万向节死锁的困扰,并且可以很⽅便快速地进⾏球⾯插值。
Unity内部使⽤四元数来表⽰所有的旋转。
注意重点:1,不受万向节死锁的困扰。
2,⽅便快速地进⾏球⾯插值。
3, Unity内部使⽤四元数来表⽰所有的旋转。
好了,现在你得重定义应该是这样的:定义:Quaternion(四元数)⽤于计算和表⽰Unity旋转。
就像当初数学⽼师告诉你∏(pai)⽤来表⽰圆周率⼀样!你有探究过∏(pai)是怎么算出来的吗?但是你们是不是都知道怎么利⽤圆周率计算圆的⾯积呢?类似的,对于初学者的我们,最重要的是现在要学会和记住四元数的使⽤⽅法。
四元数运动学笔记(1)旋转的表⽰1.参考资料Quaternion kinematics for the error-state KFbarfoot《state estimation forrobotics》袁信、郑锷《捷联式惯性导航原理》以上书籍的下载链接链接:密码:jdsz2.旋转矩阵的性质2.1旋转矩阵定义frame1到frame2的旋转矩阵为,旋转矩阵是单位正交矩阵。
对于旋转矩阵的下标可以这样理解,等式右边是旋转矩阵转化后的新位置坐标,左右是上⼀时刻的位置坐标,因此旋转的叠加(积分)即在原来的基础上再左乘新的旋转矩阵。
z-y-x即图中3-2-1,是我看很多导航的书的表⽰⽅式,barfoot的书中以1-2-3旋转⽅式作为航空中常⽤的旋转⽅式,对⽐袁信的捷联惯导书和barfoot的书,两者每次旋转对应的旋转矩阵是相通的,只不过定义的旋转次序不同使得旋转矩阵的形式不太⼀样-欧拉⾓的⼤⼩和⽅向定义:barfoot书中每次旋转的旋转矩阵定义,和袁信书中⼀致。
以袁信书中的z-y-x即3-2-1的旋转⽅式表⽰的旋转矩阵,,这⾥frame1看作是n系,frame2看作是b系,则导航系n到机体系b的旋转矩阵()旋转矩阵的⼩⾓度表⽰:当旋转⾓都⽐较⼩时,利⽤三⾓函数的与欧拉⾓的近似,省略⼩量的⼆次以上部分,得到:2.2旋转矩阵的奇异点barfoot书中以1-2-3的旋转⽅式为例,如果中间那次旋转,则旋转就会变成绕1轴旋转,即旋转耦合在⼀起,即这次旋转的欧拉⾓⽆法恢复。
2.3旋转矩阵的微分⽅程哥⽒定理利⽤哥⽒定理推导旋转矩阵的微分⽅程3.向量叉乘与斜对称矩阵向量叉乘可以表⽰成向量的叉乘矩阵和向量相乘,叉乘矩阵是斜对称矩阵,这种表⽰在旋转相关公式⾥经常⽤到。
对于列向量a,b有:4.四元数4.1四元数表⽰四元数有很多表⽰⽅法,这⾥采⽤标量+向量的形式表⽰(scalar+vector)4.2四元数乘法两个四元数等于各个元素分别相乘,表⽰旋转的积分四元数乘法不满⾜交换律(commutative)四元数乘法满⾜结合律(associative)和分配律(distributive)两个四元数相乘可以表⽰为矩阵的形式利⽤四元数的结合律得到4.3四元数的性质单位1 四元数(Identity):共轭四元数:虚数部分符号相反单位四元数的逆等于其共轭四元数Loading [MathJax]/jax/output/HTML-CSS/jax.js。
四元数的初步总结(一)前一阵子,以前公司的一位同事向我请教一段计算机图形程序中的算法,其中涉及齐次坐标和四元数。
齐次坐标问题到好讲解,但四元数方面以前所知几乎为零。
正好我看到齐民友在《复分析,可视化方法》译后记中提到的一本书:《高观点下的初等数学》([德]克莱因著,以下简称《初等数学》)当中有一段讲到四元数,于是就细读了一遍,把这个专题的整理笔记写下来。
但是那本书里有很多结果依靠繁杂的机械运算,让人看了不知道这样的结果是怎么得出来的。
因此我们这里用向量代数的观点重新审视四元数的一些结果,让四元数的特性看起来更直观,更自然。
另外还有一些我认为重要的有关四元数引入的背景知识,例如数域的扩充问题的证明,那本书里只有一部分提示,这里也试着补全一些。
一、四元数引入的理论背景将实数域扩充到复数域,并用复数来表示平面向量,用复数的加、乘运算表示平面向量的合成、伸缩和旋转变换,这些观念已经在中学课程中学过了。
那么,很自然的问题就是,在三维,或更高维空间中是否也有复数的类似物?也就是说,像扩充实数那样,在复数域的基础上添加一个或几个新的元素,并且让它们跟原来的复数做加减乘除,是否就可以得到一个新的数集,并且其中的元素还可以像复数域那样做加、减、乘、除运算,并满足通常复数的那些运算律,包括加法和乘法的交换律与结合律、乘法对加法的分配律等待?更进一步,我们是否可以期望用这样的数来表示三维或更高维空间中的伸缩和旋转,就像用复数表示平面向量的伸缩旋转那样方便?把问题说得明确一些,即是说,我们是否可以像得到复数域那样,在复数域中再添加一个新的元素(因此也是在实数基础上添加两个元素和),得到一个类似于复数集合,这个集合中的元素当时就是普通的复数,当时就是普通的实数,并且通常数的加减乘除运算及其性质都可以在这个集合上保持,即满足:1、对于任意两个数,它们的和是唯一确定的。
2、对于任意两个数,它们的积是唯一确定的。
3、存在一个数0,它具有性质:对于任意a,均有a+0=a。
四元数解析一、四元数是啥呢?嘿呀,四元数这个东西啊,可有点小神秘又有点小酷呢。
它就像是数学这个大乐园里一个超级独特的小天地。
四元数啊,其实是一种复数的扩展啦。
就好像我们本来有个小房子,然后突然给它加盖了好几层,变得超级酷炫。
二、四元数的构成它是由一个实数部分和三个虚数部分组成的哦。
这就好像是一个小团队,有一个队长(实数部分),还有三个特别的小伙伴(虚数部分)。
这三个虚数部分还都有着自己独特的小标识,它们可不是随便凑在一起的,而是有着非常奇妙的组合规则呢。
三、四元数的历史在数学的发展长河里,四元数的出现也是一段很有趣的故事。
有好多聪明的数学家们不断探索,就像探险家在未知的大陆上寻找宝藏一样。
经过很多人的努力,四元数才逐渐被发现和完善。
它在数学发展中可是有着很重要的地位,就像一颗璀璨的星星照亮了数学天空的一角。
四、四元数的用途1. 在计算机图形学里它可厉害了呢。
比如说在3D游戏的制作中,要让那些虚拟的角色动起来,转圈圈,四元数就能很好地来处理旋转的问题。
就像一个超级小助手,默默地在背后让游戏画面变得更加流畅和逼真。
2. 在物理学领域它也有自己的小舞台。
像是在研究一些物体的旋转运动的时候,四元数就可以简洁又高效地描述物体的状态。
这可比其他的方法有时候要方便很多呢。
五、四元数的计算它的计算规则有点像我们玩一种特别的数学游戏。
比如说加法、乘法之类的运算,都有着自己独特的小算法。
这些算法虽然刚开始学的时候可能有点绕,但只要你耐心去探索,就会发现其中的乐趣。
就像解开一道道有趣的小谜题一样。
六、四元数和其他数学概念的关系四元数和复数、向量这些数学概念都有着千丝万缕的联系。
它就像是一个大家庭里的一员,和其他成员之间有着相互的影响和作用。
复数可以说是四元数的小前辈,而四元数又对向量的发展有着一定的启发呢。
为什么使用四元数为了回答这个问题,先来看看一般关于旋转(面向)的描述方法-欧拉描述法。
它使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。
需要注意的是,这里的旋转是针对世界坐标系说的,这意味着第一次的旋转不会影响第二、三次的转轴,简单的说,三角度系统无法表现任意轴的旋转,只要一开始旋转,物体本身就失去了任意轴的自主性,这也就导致了万向轴锁(Gimbal Lock)的问题。
还有一种是轴角的描述方法(即我一直以为的四元数的表示法),这种方法比欧拉描述要好,它避免了Gimbal Lock,它使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(x,y,z,angle),一般表示为(x,y,z,w)或者(v,w)。
但这种描述法却不适合插值。
那到底什么是Gimbal Lock呢?正如前面所说,因为欧拉描述中针对x,y,z的旋转描述是世界坐标系下的值,所以当任意一轴旋转90°的时候会导致该轴同其他轴重合,此时旋转被重合的轴可能没有任何效果,这就是Gimbal Lock,这里有个例子演示了Gimbal Lock,点击这里下载。
运行这个例子,使用左右箭头改变yaw 为90°,此时不管是使用上下箭头还是Insert、Page Up键都无法改变Pitch,而都是改变了模型的roll。
那么轴、角的描述方法又有什么问题呢?虽然轴、角的描述解决了Gimbal Lock,但这样的描述方法会导致差值不平滑,差值结果可能跳跃,欧拉描述同样有这样的问题。
什么是四元数四元数一般定义如下:q=w+xi+yj+zk其中w是实数,x,y,z是虚数,其中:i*i=-1j*j=-1k*k=-1也可以表示为:q=[w,v]其中v=(x,y,z)是矢量,w是标量,虽然v是矢量,但不能简单的理解为3D空间的矢量,它是4维空间中的的矢量,也是非常不容易想像的。
四元数计算法则
四元数是一种数学结构,用于描述三维空间的旋转和变换。
它由一个实部和三个虚部组成,可以表示为q = a + bi + cj + dk,其中i、j、k是虚数单位,满足i=j=k=ijk=-1。
四元数的加减法与复数相似,但是乘法则更加复杂。
四元数的乘法遵循以下法则:
1. 实部相乘,虚部相乘时,i=j=k=ijk=-1
2. i乘以j等于k,j乘以k等于i,k乘以i等于j
3. j乘以i等于-k,k乘以j等于-i,i乘以k等于-j
4. 任意两个虚数乘积可以表示为一个实数加上一个虚数
四元数的除法需要用到逆元,即q=q*/(q*q*),其中q*表示q的共轭。
四元数的共轭表示为q* = a - bi - cj - dk。
四元数的旋转可以通过四元数的乘法来实现。
以欧拉角为例,将欧拉角转换为四元数后,进行旋转就是将原始四元数与旋转四元数相乘。
同时,四元数也可以用于描述变换(如平移、缩放等),可以通过矩阵的方式表示。
总之,四元数是一种非常有用的数学工具,广泛应用于计算机图形学、虚拟现实、机器人控制等领域。
掌握四元数的计算法则,对于进行三维空间中的旋转和变换非常有帮助。
- 1 -。
四元数有限域-概述说明以及解释1.引言1.1 概述四元数是一种数学结构,由四个实数构成,可以表示三维空间中的旋转和变换。
它在计算机图形学、机器人学和物理学等领域有着广泛的应用。
在传统的三维空间表示中,我们通常使用欧拉角或旋转矩阵来描述物体的旋转。
然而,这些表示方法存在一些缺点,比如欧拉角存在万向锁问题,旋转矩阵存在运算复杂和数值稳定性差的问题。
而四元数作为一种更加高效和稳定的表示方法,逐渐被应用到各个领域中。
四元数的优势在于其具备旋转和线性插值的可逆性、运算速度快、占用的内存空间小等特点。
同时,四元数的运算也相对简单,只需要进行四个实数的乘法和加法运算即可得到旋转的结果。
然而,四元数也存在一些局限性。
首先,四元数的概念对于一般人来说比较抽象和难以理解,需要一定的数学基础才能深入理解其原理。
其次,绕不同轴的旋转可以用不同的四元数表示,存在多个等效的表示方法,导致旋转的唯一性问题。
此外,四元数的运算并不能直接映射到物理世界的旋转运动,需要进行适当的转换。
未来,随着计算机图形学和机器人学等领域的发展,对于更加高效和准确的旋转表示方法的需求将不断增加。
四元数作为一种优秀的表示方法,其研究和应用将会进一步深入和广泛。
同时,结合其他数学理论和技术手段,继续改进和扩展四元数的应用范围也是未来的发展方向。
1.2文章结构文章结构:本文将分为引言、正文和结论三个部分来介绍四元数和有限域的相关内容。
- 引言部分将对本文的主题进行简要的概述,介绍四元数和有限域的基本概念和背景,并说明本文的目的和意义。
- 正文部分将分为两个子节:四元数的定义和性质、四元数在计算机图形学中的应用。
- 在四元数的定义和性质的部分,将介绍四元数的基本定义,包括四元数的表示形式和运算规则,以及四元数的基本性质,如共轭、模长等。
同时,将介绍四元数的加法、减法、乘法和除法运算规则,以及四元数的单位元、逆元等概念。
- 在四元数在计算机图形学中的应用的部分,将重点介绍四元数在旋转表示和插值、刚体变换、相机视角变换等方面的重要应用。
闵可夫斯基四元数【实用版】目录1.闵可夫斯基四元数的概念2.闵可夫斯基四元数的基本运算3.闵可夫斯基四元数在物理学和计算机科学中的应用4.闵可夫斯基四元数的发展历程5.闵可夫斯基四元数的未来发展前景正文1.闵可夫斯基四元数的概念闵可夫斯基四元数是一种数学概念,由俄国数学家闵可夫斯基于 19 世纪末提出。
四元数是一种扩展了复数的概念,它可以表示为一个实数和三个虚数的组合,通常记为 q = a + bi +cj + dk,其中 a、b、c、d 都是实数,i、j、k 是三个虚数单位,满足以下关系:i^2 = j^2 = k^2 = ijk = -1。
2.闵可夫斯基四元数的基本运算闵可夫斯基四元数的基本运算包括加法、减法、乘法和乘积。
其中,四元数的乘法运算是基于实数和虚数部分的分别运算,而乘积运算则是将两个四元数按照实部、虚部进行组合,然后再进行乘法运算。
3.闵可夫斯基四元数在物理学和计算机科学中的应用闵可夫斯基四元数在物理学中有广泛的应用,特别是在相对论中。
它可以用来表示洛伦兹变换,这是描述不同参考系下物理量之间关系的重要工具。
在计算机科学中,闵可夫斯基四元数也被广泛应用,特别是在三维图形学和机器人学中,它可以用来表示三维旋转和姿态。
4.闵可夫斯基四元数的发展历程闵可夫斯基四元数是由闵可夫斯基在 19 世纪末提出的,但在当时并未引起广泛的关注。
直到 20 世纪初,随着相对论的提出,闵可夫斯基四元数的重要性才开始被人们认识到。
在随后的岁月中,闵可夫斯基四元数在物理学、数学和计算机科学等领域都得到了广泛的应用和发展。
5.闵可夫斯基四元数的未来发展前景随着科技的发展,闵可夫斯基四元数在未来的发展前景十分广阔。
在物理学领域,它将继续在相对论的研究中发挥重要作用。
复数是由实数加上虚数单位i 组成,其中i^2 = -1 \,。
相似地,四元数都是由实数加上三个元素i、j、k 组成,而且它们有如下的关系:i^2 = j^2 = k^2 = ijk = -1 \,每个四元数都是1、i、j 和k 的线性组合,即是四元数一般可表示为a + bi + cj + dk \,。
四元数不像实数或复数那样,它的乘法是不可交换的,看乘数表四元数的优点是:表达式无奇点(和例如欧拉角之类的表示相比)比矩阵更简炼(也更快速)单位四元数的对可以表示四维空间中的一个转动。
以矩陣表示四元數[编辑]有兩種方法能以矩陣表示四元數,並以矩陣之加法、乘法應用於四元數之加法、乘法。
第一種是以二階複數矩陣表示。
若h = a + bi + cj + dk 則它的複數形式為:這種表示法有如下優點:所有複數(c = d = 0) 就相應於一個實矩陣。
四元數的絕對值的平方就等於矩陣的行列式。
四元數的共軛值就等於矩陣的共軛轉置。
對於單位四元數(|h| = 1) 而言,這種表示方式給了四維球体和SU(2)之間的一個同型,而後者對於量子力學中的自旋的研究十分重要。
(請另見泡利矩陣)第二種則是以四階實數矩陣表示:其中四元數的共軛等於矩陣的轉置。
(转载)四元数入门(2012-02-14 00:52:24)转载▼标签:computer graphic quaternion 四元数it 分类:学习(转载)四元数入门---------------------------------------------------------------------/showthread.asp?threadid=735114元数宝典这是国内找不到的超好文章。
(为什么大陆的4元数文章很垃圾呢?)(翻译中。
奉献给大家~~)70秒即懂,能使用,用四元数,4元数,阔特尼恩,Quaternion旋转(C) 中田亨(独立行政法人产业技术综合研究所数字人类研究中心研究员博士(工学))2003年11月25日★这个页面的对象读者想把三次元的旋转,用CG等定量地处理的人使用欧拉角(Euler Angles)的话,不懂得其道理的人卡尔丹角和欧拉角(Cardan Angles)不能区别的人对吉恩瓦尔洛克很困惑的人但是,对数学之类麻烦的事情很讨厌的人想要实例程序的人没有时间的人★旋转篇:我将说明使用了四元数(si yuan shu, quaternion)的旋转的操作步骤(1)四元数的虚部,实部和写法所谓四元数,就是把4个实数组合起来的东西。
4个元素中,一个是实部,其余3个是虚部。
比如,叫做Q的四元数,实部t而虚部是x,y,z构成,则像下面这样写。
Q = (t; x, y, z)又,使用向量V=(x,y,z),Q = (t; V)也可以这么写。
正规地用虚数单位i,j,k的写法的话,Q = t + xi + yj + zk也这样写,不过,我不大使用(2)四元数之间的乘法虚数单位之间的乘法ii = -1, ij = -ji = k (其他的组合也是循环地以下同文)有这么一种规则。
(我总觉得,这就像是向量积(外积),对吧)用这个规则一点点地计算很麻烦,所以请用像下面这样的公式计算。
A = (a; U)B = (b; V)AB = (ab - U·V; aV + bU + U×V)不过,“U·V”是内积,「U×V」是外积的意思。
注意:一般AB<>BA所以乘法的左右要注意!(3)3次元的坐标的四元数表示如要将某坐标(x,y,z)用四元数表示,P = (0; x, y, z)则要这么写。
另外,即使实部是零以外的值,下文的结果也一样。
用零的话省事所以我推荐。
(4)旋转的四元数表示以原点为旋转中心,旋转的轴是(α, β, γ)(但α^2 + β^2 + γ^2 = 1),(右手系的坐标定义的话,望向向量(α, β, γ)的前进方向反时针地)转θ角的旋转,用四元数表示就是,Q = (cos(θ/2); αsin(θ/2), βsin(θ/2), γsin(θ/2))R = (cos(θ/2); -αsin(θ/2), -βsin(θ/2), -γsin(θ/2))(另外R 叫Q 的共轭四元数。
)那么,如要实行旋转,则R P Q = (0; 答案)请像这样三明治式地计算。
这个值的虚部就是旋转之后的点的坐标值。
(另外,实部应该为零。
请验算看看)*未完。
instemast_REAL 2007-2-24 19:04:57注册: 2007-2 状态: Offline 1 Topinstemast_REALExp:124侦察兵发表于: 2007-2-24 19:06:00 档案| 短信| 树状| 收藏| 编辑| 删除| 引用--------------------------------------------------------------------------------Re:4元数宝典/// Quaternion.cpp/// (C) Toru Nakata, toru-nakata@aist.go.jp/// 2004 Dec 29#include <math.h>#include <iostream.h>/// Define Data typetypedef struct{double t; // real-componentdouble x; // x-componentdouble y; // y-componentdouble z; // z-component} quaternion;//// Kakezan 乘quaternion Kakezan(quaternion left, quaternion right) {quaternion ans;double d1, d2, d3, d4;d1 = left.t * right.t;d2 = -left.x * right.x;d3 = -left.y * right.y;d4 = -left.z * right.z;ans.t = d1+ d2+ d3+ d4;d1 = left.t * right.x;d2 = right.t * left.x;d3 = left.y * right.z;d4 = -left.z * right.y;ans.x = d1+ d2+ d3+ d4;d1 = left.t * right.y;d2 = right.t * left.y;d3 = left.z * right.x;d4 = -left.x * right.z;ans.y = d1+ d2+ d3+ d4;d1 = left.t * right.z;d2 = right.t * left.z;d3 = left.x * right.y;d4 = -left.y * right.x;ans.z = d1+ d2+ d3+ d4;return ans;}//// Make Rotational quaternion 求旋转四元quaternion MakeRotationalQuaternion(double radian, double AxisX, double AxisY, double AxisZ){quaternion ans;double norm;double ccc, sss;ans.t = ans.x = ans.y = ans.z = 0.0;norm = AxisX * AxisX + AxisY * AxisY + AxisZ * AxisZ;if(norm <= 0.0) return ans;norm = 1.0 / sqrt(norm);AxisX *= norm;AxisY *= norm;AxisZ *= norm;ccc = cos(0.5 * radian);sss = sin(0.5 * radian);ans.t = ccc;ans.x = sss * AxisX;ans.y = sss * AxisY;ans.z = sss * AxisZ;return ans;}//// Put XYZ into quaternion 把XYZ到四元quaternion PutXYZToQuaternion(double PosX, double PosY, double PosZ) {quaternion ans;ans.t = 0.0;ans.x = PosX;ans.y = PosY;ans.z = PosZ;return ans;}///// mainint main(){double px, py, pz;double ax, ay, az, th;quaternion ppp, qqq, rrr;cout << "Point Position (x, y, z) " << endl;cout << " x = ";cin >> px;cout << " y = ";cin >> py;cout << " z = ";cin >> pz;ppp = PutXYZToQuaternion(px, py, pz);while(1) {cout << "/nRotation Degree ? (Enter 0 to Quit) " << endl;cout << " angle = ";cin >> th;if(th == 0.0) break;cout << "Rotation Axis Direction ? (x, y, z) " << endl;cout << " x = ";cin >> ax;cout << " y = ";cin >> ay;cout << " z = ";cin >> az;th *= 3.1415926535897932384626433832795 / 180.0; ///Degree -> radian;qqq = MakeRotationalQuaternion(th, ax, ay, az);rrr = MakeRotationalQuaternion(-th, ax, ay, az);ppp = Kakezan(rrr, ppp);ppp = Kakezan(ppp, qqq);cout << "/nAnser X = " << ppp.x<< "/n Y = " << ppp.y<< "/n Z = " << ppp.z << endl;}return 0;}*未完。