AtCoderで座標回転が出題されたときに苦労したので、ここで整理しておく。
まず、以下のように記号を定める。
:回転前の座標
:回転後の座標
:反時計回りに回転させる角度
すると、原点を中心とした反時計回りの回転はこのように計算できる。
整理して...
次に、原点ではなく任意の点を中心とした回転を考える。
上記に追加で、以下のように記号を定める。
:中心の座標
最初に、中心の座標が原点になるように全ての座標を平行移動させる。
すると、原点を中心とした回転に帰着する。
あとは上記の計算に当てはめると...
整理して...
C言語で計算プログラムを書いてみた。
#include <math.h> #include <stdio.h> int main() { double X, Y; // Original coordinates double Xc, Yc; // Center coordinates or rotation double Xr, Yr; // Coordinates after rotation double angle; // Angle of rotation (Radian) X = 5.0, Y = 3.0, Xc = 6.0, Yc = 3.5; // Example of coordinates angle = 2.0 * acos(-1) / 6; // Example of angle (60 deg) // Calculate rotation Xr = (X - Xc) * cos(angle) - (Y - Yc) * sin(angle) + Xc; Yr = (X - Xc) * sin(angle) + (Y - Yc) * cos(angle) + Yc; printf("Xr=%lf, Yr=%lf\n", Xr, Yr); // Xr = 5.933, Yr = 2.384 return 0; }
本番で解きたかったけど解けなかった問題
D - Opposite