旋转球体相对于z轴的集合

时间:2013-07-31 16:51:18

标签: python image-rotation rotational-matrices

我有一个存储在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)

以下是旋转前图像的样子:

enter image description here

以下是它的样子:

enter image description here

1 个答案:

答案 0 :(得分:3)

您必须翻译整个系统,以便旋转中心是系统的中心。

您使用的旋转方程只有在原点周围旋转时才有效。

对于平移,您还可以乘以具有平移方向的矩阵作为最后一行。

无论如何,整个转换是P' = inv(T) * R * T * P(其中P是图中的每个点,P'是最终结果的位置,请参见示例)翻译矩阵简单地否定了翻译成分的符号。

编辑(编写示例 - 您可能必须转置所有内容 - 使用列切换行):

您从以下位置开始:

atoms =
    90   140
   100   100
     1     1

出现在

Two horizontal points

然后使用矩阵

应用旋转
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

转化为(正如您所观察到的,红点是新点)

Rotated but not ok

问题在于,通过R * atoms我们围绕原点旋转。在下图中,两条蓝线之间的角度恰好是pi/6

Rotated

现在,我们想要获得蓝色圆圈:

Final result

为此,我们需要几个步骤:

  • 构建平移矩阵以转换点,使旋转中心成为轴的中心:

    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
    

最后评论

  1. 您获得的输出是可以解释的,因为我的原点位于图的下角/中间,而您的原点位于上角。

  2. 因此,您可能还必须颠倒乘法的顺序:point * translation * rotation * translation。检查哪些方法有效。

  3. 我作弊了一点,同时对两个点进行了转换。幸运的是,结果与依次对每个点进行转换的结果相同。

  4. 每个2D / 3D变换都可以用矩阵来编写。我们使用3x3矩阵表示2D,4x4表示3D。基本上,我们使用Homogenous coordinates

  5. 最后,请参阅Transformation matrix了解更多示例和详细信息。