回転の中心がシステムの中心になるように、システム全体を平行移動する必要があります。
使用する回転に使用される方程式は、原点を中心に回転する場合にのみ機能します。
平行移動の場合、最後の行として平行移動の方向を持つ行列を乗算することもできます。
とにかく、変換全体は次のとおりです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 * 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
最後に:
あなたが得た出力は、私の原点が図の下隅/中央にあり、あなたの原点が上隅にあるという事実により説明できます。
このため、乗算の順序を逆にする必要がある場合もあります: point * translation * rotation * translation
. 正常に動作するものを確認してください。
少しごまかして、両方のポイントで同時に変換を行いました。幸いなことに、各ポイントを順番に変換した場合と同じ結果が得られます。
すべての 2D/3D 変換は行列で記述できます。これには、2D と3D の3x3
行列を使用します。4x4
基本的に、同次座標で作業します
最後に、その他の例と詳細については、変換マトリックスを参照してください。