一个四元数的小python包

tinyquaternion的Python项目详细描述


四元数tinyquaternion

一个用于四元数的小python模块

作者:Reza Ahmadzadeh-2019

一。安装

克隆存储库。对于单独的项目,您需要将tinyQuaternion.py文件复制到源文件夹中,并按如下方式导入模块:

fromtinyQuaternionimportQuaternion

唯一的依赖项是numpy,因此按如下方式导入:

importnumpyasnp

2.文档

2.1定义四元数

在这个包中,有两种方法可以定义四元数:

  1. 使用4D数组表示四元数的元素q=[w,x,y,z]。使用numpy的ndarray定义数组。
q=Quaternion(q=np.array([0.,0.,1.,0.]))>>>qQuaternion(0.0,0.0,1.0,0.0)
    用轴角表示。在表示旋转的弧度时,要使用滚动条表示旋转轴和滚动条。
q=Quaternion(a=np.pi/3,n=np.array([0.,0.,1.]))qQuaternion(0.8660254037844387,0.0,0.0,0.49999999999999994)

2.2条。四元数元素

每个四元数是一个向量q=[w,x,y,z],包含四个元素wxyz。四元数的每个元素都可以按如下方式检索:

q.wq.xq.yq.z

示例:

>>>q.w0.8660254037844387>>>q.x0.0>>>q.y0.0>>>q.z0.49999999999999994>>>

2.3条。标量和矢量部分

要检索四元数的标量部分,w使用scalar方法如下:

q.scalar

要检索四元数的向量部分,[x,y,z]使用vector方法如下:

q.vector

示例:

>>>q.scalar0.8660254037844387>>>q.vectorarray([0.,0.,0.5])>>>

2.4条。震级

得到四元数的范数或大小,如下所示:

q.magnitude

示例

>>>q.magnitude1.0

2.5条。检查四元数是否规范化

要查看四元数是否规范化,可以使用is_unit()方法。如果四元数的大小等于1,则返回True,否则返回False

q.is_unit()

示例:

>>>q.is_unit()True

2.6条。正常化

要规范化四元数,请使用normalized方法。

q.normalized

示例:

>>>q.normalizedQuaternion(0.8660254037844387,0.0,0.0,0.49999999999999994)

2.7条。共轭

要检索四元数的共轭q=[w,x,y,z]作为q*=[w,-x,-y,-z],请使用conjugate方法,如下所示:

q.conjugate

示例:

>>>q.conjugateQuaternion(0.8660254037844387,-0.0,-0.0,-0.49999999999999994)

2.8条。逆

要检索四元数的逆,请使用inverse方法,如下所示:

q.inverse

示例:

>>>q.inverseQuaternion(0.8660254037844387,-0.0,-0.0,-0.49999999999999994)

2.9条。从四元数中提取轴角

提取四元数的轴角形式,采用如下方法:

q.axisangle()

示例:

>>>q.axisangle()(array([0.,0.,1.]),1.0471975511965974)

请记住,这不等于我们在上面定义的原始四元数。主要原因是我们对原来的四元数做了一些运算。

2.10条。主要业务

# additionq1.add(q2)# subtractionq1.sub(q2)# multiplicationq1.mul(q2)# divisionq1.div(q2)

示例:

>>>q1=Quaternion(np.array([1.,0.,0.,0.]))>>>q2=Quaternion(np.array([0.,0.,0.,1.]))>>>q1.add(q2)Quaternion(1.0,0.0,0.0,1.0)>>>q1.sub(q2)Quaternion(1.0,0.0,0.0,-1.0)>>>q1.mul(q2)Quaternion(0.0,0.0,0.0,1.0)>>>q1.div(q2)Quaternion(0.0,0.0,0.0,-1.0)

注意,这些操作不会隐式地执行规范化。

2.11条。四元数对数

要获取四元数的对数,请执行

q.log

示例:

>>>q=Quaternion(np.array([0.,1.,0.,0.]))>>>qQuaternion(0.0,1.0,0.0,0.0)>>>q.logQuaternion(0.0,1.5707963267948966,0.0,0.0)

2.12条。四元数exp

要获得四元数的指数,请执行

q.exp

示例:

>>>q=Quaternion(np.array([0.,1.,0.,0.]))>>>qQuaternion(0.0,1.0,0.0,0.0)>>>q.expQuaternion(0.5403023058681398,0.8414709848078965,0.0,0.0)

2.13条。使用四元数(轴角)< EH3>三维空间中的旋转点
q.rotatePoint(p)

示例:

该点应使用3d numpy数组定义如下:

>>>q=Quaternion(a=np.pi/3,n=np.array([0.,0.,1.]))>>>p=np.array([1.,2.,-1.])>>>q.rotatePoint(p)array([-1.23205081,1.8660254,-1.])

三。教程

3.1条。使用四元数旋转

代码可以在test文件夹中找到。首先导入所有必需的软件包:

importnumpyasnpfromtinyQuaternionimportQuaternionfromplotCubeimportplot_cube

要执行此测试,我们首先使用测试文件夹中提供的函数plotCube.py绘制多维数据集。

# plot the initial cubep1=np.array([0.,0.,0.])p2=np.array([0.,.1,0.])p3=np.array([2.,0.,0.])p4=np.array([0.,0.,.1])cube1=[(p1[0],p1[1],p1[2]),(p2[0],p2[1],p2[2]),(p3[0],p3[1],p3[2]),(p4[0],p4[1],p4[2])]plot_cube(cube1)

这将生成以下多维数据集:

"initial cube"

现在,我们定义一个已知的四元数。假设,我们想要绕y轴旋转90度。四元数将如下所示:

# define a known quaternionq=Quaternion(a=np.pi/2,n=np.array([0.,1.,0.]))

通过使用{{CD6>}和^ {CD5>}关键字,我们通过定义旋转的角度和轴来告诉我们表示四元数的函数。

现在,我们使用四元数通过方法rotatePoint旋转每个点,如下所示:

# rotate the cubep1r=q.rotatePoint(p1)p2r=q.rotatePoint(p2)p3r=q.rotatePoint(p3)p4r=q.rotatePoint(p4)

并绘制旋转的立方体

cube2=[(p1r[0],p1r[1],p1r[2]),(p2r[0],p2r[1],p2r[2]),(p3r[0],p3r[1],p3r[2]),(p4r[0],p4r[1],p4r[2])]plot_cube(cube2)

"rotated cube"

现在让我们使用四元数执行两个旋转。我们考虑指定一个新的旋转,然后将其与上一个旋转合并。 我们以前的旋转大约是Y轴90度。对于这个,我们想要绕X轴旋转90度。四元数将如下所示:

q2=Quaternion(a=np.pi/2,n=np.array([1.,0.,0.]))# rotate about x by 90

现在,我们应该把这两个四元数结合起来。规则是“第一轮应该是最后一轮”,所以我们可以写

q=q2.mul(q)

这个四元数具有y轴的旋转效应,然后是x轴的旋转。

现在执行旋转:

p1r=q.rotatePoint(p1)p2r=q.rotatePoint(p2)p3r=q.rotatePoint(p3)p4r=q.rotatePoint(p4)

并绘制旋转的立方体:

cube3=[(p1r[0],p1r[1],p1r[2]),(p2r[0],p2r[1],p2r[2]),(p3r[0],p3r[1],p3r[2]),(p4r[0],p4r[1],p4r[2])]plot_cube(cube3)

"rotated cube"

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将日期字符串解析为整数变量?   java如何在Spring3+WS2+中使用注释、JibxMarshalling或使用xml配置配置JibxMarshalling和unmarshalling?   安装Oracle Jdeveloper时mac中出现java安装错误。   设置自动保存计时器以在java中定期保存文件(但不使用任何JavaFXAPI)的最佳策略是什么?   模板获取handlebar java中迭代器列表的长度   java如何在特定JAX RS调用中排除对象中的字段?   在Struts 2中抛出NullPointerException的java getText()方法   java比较捐献者和接受者的血型   fedora Java向后兼容性   字符串Java替换多个字符   复制BuffereImage时出现java数组索引错误   并行处理Java 8并行流findFirst   java关闭应用程序后如何离开服务?   Java:Tesseractocr:如何查找单词坐标?