ABC197 D問題 Opposite 座標問題を解く
ABC197 D問題 Oppositeを解いて振り返ります。
2次元座標に正N角形があって、各頂点が与えられています。
Nは偶数。との座標が与えられた時にの座標を求める問題です。
高校数学を駆使して解ける問題です。
サンプルのように正六角形の場合、との座標が与えられます。
との中点が正六角形の中心になるので、そこを中心に度時計回りに回転したところがの座標になります。
座標を反時計回りに回転させるときは、
となります。
を回転させる前に、座標が原点に来るように中点の分だけ平行移動させて、回転した後に中点の分だけ平行移動して戻します。
回転する度数としては、度を2回分時計回りに回転します。時計回りなのでに-1をかけます。
座標を求める式は以下のようになります。
なので、x座標を求める式は以下のようになります。
y座標を求める式は以下のようになります。
from math import pi, cos, sin N = int(input()) x0, y0 = map(int, input().split()) x_N_2, y_N_2 = map(int, input().split()) x_mid = (x0 + x_N_2) / 2 y_mid = (y0 + y_N_2) / 2 deg = (2*pi/N) - pi cos_deg = cos(deg) sin_deg = sin(deg) ans_x = cos_deg * (x_N_2 - x_mid) - sin_deg * (y_N_2 - y_mid) + x_mid ans_y = sin_deg * (x_N_2 - x_mid) + cos_deg * (y_N_2 - y_mid) + y_mid print(ans_x, ans_y)
反省点は2つ。
解説を読んで思ったのですが、
こういう2次元座標を回転するパターンはけっこうあるらしいので、皆さん関数としてあらかじめ仕込んであったりするんですね。。。
反省して次回までに仕込んでおこうと思います。
あと複素数を使った方がもっともっとシンプルに解けます。
使おうか迷ったのですが、使ったことないので時間のことを考えて尻込みしてしまいました。。。