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

2024-06-01 01:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是旋转前的图像:

enter image description here

以下是之后的情况:

enter image description here


Tags: 代码selfnumpynppimath数组中心
1条回答
网友
1楼 · 发布于 2024-06-01 01:40:59

你必须平移整个系统,这样旋转的中心就是系统的中心。在

仅当绕原点旋转时,用于旋转的方程式才起作用。在

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

总之,整个转换是P' = inv(T) * R * T * P(其中P是图形的每个点,P'是它在最终结果中的位置,请参见示例),因为平移矩阵的逆运算只需对平移分量的符号求反。在

编辑(举了一个例子,你可能不得不用列来交换所有的开关行):

从放置在以下位置的点开始:

atoms =
    90   140
   100   100
     1     1

这在

Two horizontal points

然后用矩阵进行旋转

^{pr2}$

得到的结果是

R * atoms =
    27.9423    71.2436
   131.6025   156.6025
     1.0000     1.0000

也就是说(正如你所观察到的,红点是新的)

Rotated but not ok

问题是通过做R * atoms我们绕原点旋转。{cd5>后面两条线之间的夹角

Rotated

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

Final result

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

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

    T =
     1     0  -115
     0     1  -100
     0     0     1
    

    -115和{}是原子中心的负数)

  • 平移这些点,使两个中心重叠(我们得到红色原子)

    T * atoms =
      -25   25
        0    0
        1    1
    

    (请注意,我们的新两点围绕原点对称)

  • 旋转新的点(我们得到绿色的圆圈)

    R * T * atoms
      -21.6506   21.6506
      -12.5000   12.5000
        1.0000    1.0000
    
  • 最后,把所有的东西都翻译回来

    ^{7美元

最后评论

  1. 你得到的输出是可以解释的,因为我的原点在图的下角/中间,而你的原点在上角。

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

  3. 我在这两个点上都做了些小动作。幸运的是,结果与依次对每个点进行转换相同。

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

  5. 最后,请参见Transformation matrix以获取更多示例和详细信息。

相关问题 更多 >