Edit

【pythonでABC197を解説】D - Opposite

問題概要

問題ページ

D - Opposite
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コード

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()

-Edit
-