我有球体中心的坐标(x,y,z)存储在numpy数组中。我希望能够旋转球体相对于z轴,但是得到了奇怪的结果。我的代码执行旋转,但它似乎也在向上和向右移动。也许这是轮换的结果,但我不这么认为。 这是我的代码:
theta = math.pi/6
ct = math.cos(theta)
st = math.sin(theta)
z = np.array([[ct, -st, 0], [st, ct, 0], [0, 0, 1]])
self.atoms = np.array([[90,100, 1], [140,100, 1]])
self.atoms = self.atoms.dot(z)
以下是旋转前的图像:
以下是之后的情况:
你必须平移整个系统,这样旋转的中心就是系统的中心。在
仅当绕原点旋转时,用于旋转的方程式才起作用。在
对于平移,您也可以将平移方向作为最后一行的矩阵相乘。在
总之,整个转换是
P' = inv(T) * R * T * P
(其中P
是图形的每个点,P'
是它在最终结果中的位置,请参见示例),因为平移矩阵的逆运算只需对平移分量的符号求反。在编辑(举了一个例子,你可能不得不用列来交换所有的开关行):
从放置在以下位置的点开始:
这在
然后用矩阵进行旋转
^{pr2}$得到的结果是
也就是说(正如你所观察到的,红点是新的)
问题是通过做
R * atoms
我们绕原点旋转。{cd5>后面两条线之间的夹角现在,我们想得到蓝色圆圈:
为此,我们需要几个步骤:
构建平移矩阵以转换点,使旋转中心为轴的中心:
(}是原子中心的负数)
-115
和{平移这些点,使两个中心重叠(我们得到红色原子)
(请注意,我们的新两点围绕原点对称)
旋转新的点(我们得到绿色的圆圈)
最后,把所有的东西都翻译回来
^{7美元最后评论:
你得到的输出是可以解释的,因为我的原点在图的下角/中间,而你的原点在上角。
因此,您可能还必须颠倒乘法的顺序:
point * translation * rotation * translation
。检查哪些工作正常。我在这两个点上都做了些小动作。幸运的是,结果与依次对每个点进行转换相同。
每一个2D/3D变换都可以用矩阵表示。我们使用}表示3D。基本上,我们使用Homogenous coordinates
3x3
矩阵来表示2D,而{最后,请参见Transformation matrix以获取更多示例和详细信息。
相关问题 更多 >
编程相关推荐