問題概要
問題ページ
-
D - Opposite
問題ページへ移動する
問題文
\(\mathrm{x}\) 軸の正の向きを右、\(\mathrm{y}\) 軸の正の向きを上とする \(2\) 次元座標平面上に、\(p_0, p_1, p_2, \dots, p_{N - 1}\) の \(N\) 個の頂点からなる正 \(N\) 角形があります。
ここで \(N\) は偶数であることが保証され、頂点 \(p_0, p_1, p_2, \dots, p_{N - 1}\) はこの順に反時計回りに並んでいます。
\(p_i\) の座標を \((x_i, y_i)\) とします。
\(x_0, y_0, x_{\frac{N}{2}}, y_{\frac{N}{2}}\) が与えられるので、\(x_1, y_1\) を求めてください。
制約
- \(4 \le N \le 100\)
- \(N\) は偶数
- \(0 \le x_0, y_0 \le 100\)
- \(0 \le x_{\frac{N}{2}}, y_{\frac{N}{2}} \le 100\)
- \((x_0, y_0) \neq (x_{\frac{N}{2}}, y_{\frac{N}{2}})\)
- 入力に含まれる値は全て整数である
問題の考察
座標の回転の問題。
問題文には正\(n\)角形の頂点を求めるように指示がある。
しかし、問題文をよく読むと求める座標\((x_1, y_1)\) は、座標\((x_0, y_0)\) を\((x_0, y_0)\) と\((x_{\frac{N}{2}}, y_{\frac{N}{2}})\)の中点を中心にして\(360 \div n\)度だけ回転させたものだと分かる。
今回は回転した座標を次のように求めてみた。
座標の回転
- 座標\((x_0, y_0)\) を原点\((0,0)\)を中心に\(\theta\)だけ座標を回転させた座標を\((X,Y)\)とする
- \(X=x\cos{\theta}-y\sin{\theta}\)
- \(Y=x\sin{\theta}+y\cos{\theta}\)
たびすけ
三角関数の加法定理で座標の回転はできるけど・・・
とりあえず公式を覚えてしまいましょう!(私もACした後に理解しました・・・)
とりあえず公式を覚えてしまいましょう!(私もACした後に理解しました・・・)
ACコード
import sys
import math
def solve():
input = sys.stdin.readline
mod = 10 ** 9 + 7
n = int(input().rstrip('\n'))
x0, y0 = list(map(int, input().rstrip('\n').split()))
x2, y2 = list(map(int, input().rstrip('\n').split()))
xm, ym = (x0 + x2) / 2, (y0 + y2) / 2
rd = 360 / n
x1 = (x0 - xm) * math.cos(math.radians(rd)) - (y0 - ym) * math.sin(math.radians(rd)) + xm
y1 = (x0 - xm) * math.sin(math.radians(rd)) + (y0 - ym) * math.cos(math.radians(rd)) + ym
print(x1, y1)
if __name__ == '__main__':
solve()