我有一个存储在numpy数组中的球体中心的坐标(x,y,z)。我希望能够相对于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)
以下是旋转前图像的样子:
以下是它的样子:
答案 0 :(得分:3)
您必须翻译整个系统,以便旋转中心是系统的中心。
您使用的旋转方程只有在原点周围旋转时才有效。
对于平移,您还可以乘以具有平移方向的矩阵作为最后一行。
无论如何,整个转换是P' = inv(T) * R * T * P
(其中P
是图中的每个点,P'
是最终结果的位置,请参见示例)翻译矩阵简单地否定了翻译成分的符号。
编辑(编写示例 - 您可能必须转置所有内容 - 使用列切换行):
您从以下位置开始:
atoms =
90 140
100 100
1 1
出现在
中
然后使用矩阵
应用旋转R =
0.86603 -0.50000 0.00000
0.50000 0.86603 0.00000
0.00000 0.00000 1.00000
并获得
的结果R * atoms =
27.9423 71.2436
131.6025 156.6025
1.0000 1.0000
转化为(正如您所观察到的,红点是新点)
问题在于,通过R * atoms
我们围绕原点旋转。在下图中,两条蓝线之间的角度恰好是pi/6
现在,我们想要获得蓝色圆圈:
为此,我们需要几个步骤:
构建平移矩阵以转换点,使旋转中心成为轴的中心:
T =
1 0 -115
0 1 -100
0 0 1
(-115
和-100
是原子中心的负数)
翻译点,使两个中心重叠(我们得到红色原子)
T * atoms =
-25 25
0 0
1 1
(观察我们的新两点在原点周围是对称的)
旋转新点(我们得到绿色圆圈)
R * T * atoms
-21.6506 21.6506
-12.5000 12.5000
1.0000 1.0000
最后,将所有内容翻译回来
inv(T) * R * T * atoms =
93.3494 136.6506
87.5000 112.5000
1.0000 1.0000
最后评论:
您获得的输出是可以解释的,因为我的原点位于图的下角/中间,而您的原点位于上角。
因此,您可能还必须颠倒乘法的顺序:point * translation * rotation * translation
。检查哪些方法有效。
我作弊了一点,同时对两个点进行了转换。幸运的是,结果与依次对每个点进行转换的结果相同。
每个2D / 3D变换都可以用矩阵来编写。我们使用3x3
矩阵表示2D,4x4
表示3D。基本上,我们使用Homogenous coordinates
最后,请参阅Transformation matrix了解更多示例和详细信息。