我有三点: 3D空间中的A, B, C
。C= BC长度。它们表示一个称为T
的三角形对象。每个点都是表示其坐标的浮点数的元组。T
被放置,如A
和B
的中间点已经位于轴原点。
在我的API中,我可以全局地旋转T
,也就是针对任何一个全局轴一次旋转。此API的伪代码类似于:
T.rotate('x', angle)
用于旋转T
的全局x
轴的角度值,用右手规则。
我的问题是代码要旋转T
,例如:
A
和B
在x
轴上C
在y
轴上我想我需要连续调用3个调用来旋转每一个轴。但是我很难用初始点坐标来计算角度。
发布于 2017-07-21 16:05:27
编辑的包括角度计算.
由于您的问题中没有提供任何真正的代码,我只提供一个算法和角度。如果你用代码改进你的问题,我可以添加一些我自己的代码。
为了澄清,我们必须有长度AC
等于长度BC
,而边AB
的中点必须是原点。后者意味着点A
和B
的坐标是相互否定的。(实际上,真正的要求是向量OC
,其中O
是原点,垂直于向量AB
,而原点是直线AB
)。你的条件比这更严格。)
假设在任何时候,A
的坐标都是(Ax, Ay, Az)
,B
和C
的坐标也是这样。
首先,将点A
移动到xy平面。用所有三个点围绕x轴旋转来做这件事。由于条件的原因,点B
也将在xy平面上。旋转的一个可能的角度是-atan2(Az, Ay)
,而其他的也是可能的。检查Az
和Bz
的结果值是否为零或接近浮点精度。
第二,围绕z轴旋转,将点A
移动到x轴(以及其他适当的点)。点B
现在也将在x轴上.旋转的一个角度是-atan2(Ay, Ax)
。检查生成的Ay
和By
。
第三,也是最后一步,绕x轴旋转,将点C移动到y轴.A
和B
点不会受到最后一次旋转的影响。旋转的一个角度是-atan2(Cz, Cy)
。检查产生的Cx
(在上次旋转之前应该是零)和Cz
。
你的三角形现在是在理想的位置,只要你原来的三角形实际上符合条件。注意,这个算法没有使用任何围绕y轴的旋转:它是不需要的,但是如果你想的话,你可以用y周围的旋转代替我的初始旋转。
https://stackoverflow.com/questions/45241469
复制相似问题