0

我将球体中心的坐标 (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)

这是旋转前的图像:

在此处输入图像描述

这是之后的样子:

在此处输入图像描述

4

1 回答 1

3

您必须平移整个系统,以使旋转中心成为系统的中心。

您使用的用于旋转的方程仅在围绕原点旋转时才有效。

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

无论如何,整个变换是P' = inv(T) * R * T * PP图中的每个点在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
    

最后的评论

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

  2. 因此,您可能还必须颠倒乘法的顺序:point * translation * rotation * translation. 检查什么工作正常。

  3. 我作弊了一点,同时在两个点上进行了转换。幸运的是,结果就像在每个点上依次进行转换一样。

  4. 每个 2D/3D 变换都可以用矩阵表示。我们为此使用2D 和3D3x3矩阵。4x4基本上,我们使用同质坐标

  5. 最后,有关更多示例和详细信息,请参阅转换矩阵

于 2013-07-31T16:58:52.623 回答