Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 相对于z轴旋转球体集合_Python_Image Rotation_Rotational Matrices - Fatal编程技术网

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

Python 相对于z轴旋转球体集合,python,image-rotation,rotational-matrices,Python,Image Rotation,Rotational Matrices,我将球体中心的坐标(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

我将球体中心的坐标(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'
是最终结果中的位置,请参见示例),因为平移矩阵的逆矩阵只是对平移分量的符号求反

编辑(制定了一个示例——您可能需要转置所有内容——用列切换行):

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

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*原子
我们围绕原点旋转。在下图中,两条蓝线之间的角度正好是
pi/6

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

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

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

    T =
     1     0  -115
     0     1  -100
     0     0     1
    
    (原子中心的负片是
    -115
    -100

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

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

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

  • 最后,把所有的东西都翻译回来

    inv(T) * R * T * atoms =        
        93.3494   136.6506
        87.5000   112.5000
         1.0000     1.0000
    
最后的评论

  • 您获得的输出是可以解释的,因为我的原点在图的下角/中间,而您的原点在上角

  • 因此,您可能还必须颠倒乘法的顺序:
    点*平移*旋转*平移
    。检查什么工作正常

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

  • 每个2D/3D变换都可以用矩阵表示。我们使用
    3x3
    矩阵表示2D,使用
    4x4
    表示3D。基本上,我们与

  • 最后,有关更多示例和详细信息,请参见


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

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

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

    无论如何,整个变换是
    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*原子
    我们围绕原点旋转。在下图中,两条蓝线之间的角度正好是
    pi/6

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

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

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

      T =
       1     0  -115
       0     1  -100
       0     0     1
      
      (原子中心的负片是
      -115
      -100

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

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

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

    • 最后,把所有的东西都翻译回来

      inv(T) * R * T * atoms =        
          93.3494   136.6506
          87.5000   112.5000
           1.0000     1.0000
      
    最后的评论

  • 您获得的输出是可以解释的,因为我的原点在图的下角/中间,而您的原点在上角

  • 因此,您可能还必须颠倒乘法的顺序:
    点*平移*旋转*平移
    。检查什么工作正常

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

  • 每个2D/3D变换都可以用矩阵表示。我们使用
    3x3
    矩阵表示2D,使用
    4x4
    表示3D。基本上,我们与

  • 最后,有关更多示例和详细信息,请参见


  • 对不起,你把我弄丢了。现在可以理解为什么我的旋转也会导致后续的平移(我是围绕矩阵的中心而不是结构的中心旋转)。然而在那之后我迷路了。我将是b