0

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)

回転前の画像は次のようになります。

ここに画像の説明を入力

そして、これがその後の様子です:

ここに画像の説明を入力

4

1 に答える 1

3

回転の中心がシステムの中心になるように、システム全体を平行移動する必要があります。

使用する回転に使用される方程式は、原点を中心に回転する場合にのみ機能します。

平行移動の場合、最後の行として平行移動の方向を持つ行列を乗算することもできます。

とにかく、変換全体は次のとおりですP' = inv(T) * R * T * P(Pは図の各点であり、P'は最終結果の場所です。例を参照してください) 変換行列の逆数については、変換コンポーネントの符号を単純に否定します。

編集(うまくいった例 -- すべてを転置する必要があるかもしれません -- 行と列を切り替えます):

次の場所に配置されたポイントから始めます。

atoms =
    90   140
   100   100
     1     1

で提示されている

2 つの水平ポイント

次に、行列で回転を適用します

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、原点を中心に回転することです。次の図では、2 本の青い線の間の角度は正確にpi/6

回転した

ここで、青い円を取得したいと思います。

最終結果

これを行うには、いくつかの手順が必要です。

  • 回転の中心が軸の中心になるように点を変換する並進行列を作成します。

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

    (-115-100は原子の中心のネガです)

  • 2 つの中心が重なるように点を移動します (赤い原子が得られます)。

    T * atoms =
      -25   25
        0    0
        1    1
    

    (新しい 2 点が原点に対して対称であることに注意してください)

  • 新しい点を回転させます (緑色の円が得られます)

    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 と3D の3x3行列を使用します。4x4基本的に、同次座標で作業します

  5. 最後に、その他の例と詳細については、変換マトリックスを参照してください。

于 2013-07-31T16:58:52.623 に答える