ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC197 D - Opposite【Python解答例】

f:id:ebisuke33:20210328104732p:plain
AtCoder Beginner Contest197のD - OppositeについてPythonの解答例を記事にしていきます。
atcoder.jp


AtCoder Beginner Contest197 D - Opposite

D - Opposite

問題文

x 軸の正の向きを右、y 軸の正の向きを上とする 2 次元座標平面上に、p0,p1,p2,…,pN−1 の N 個の頂点からなる正 N 角形があります。
ここで N は偶数であることが保証され、頂点 p0,p1,p2,…,pN−1 はこの順に反時計回りに並んでいます。
pi の座標を (xi,yi) とします。
x0,y0,xN2,yN2 が与えられるので、x1,y1 を求めてください。

制約

・4≤N≤100
・N は偶数
・0≤x0,y0≤100
・0≤xN2,yN2≤100
・(x0,y0)≠(xN2,yN2)
・入力に含まれる値は全て整数である

解答例

import math
from math import pi

n = int(input())

x0, y0 = map(int,input().split())
x_half, y_half = map(int,input().split())

# n角形の中心座標
center_x = (x_half + x0) / 2

center_y = (y_half + y0) / 2

# n角形の中心から各頂点までの距離
r_tmp = (x_half - x0)**2 + (y_half - y0)**2

r = pow(r_tmp,0.5) / 2

# 中心から(x1,y1)への角度
angle_0 = math.atan2(y0 - center_y, x0 - center_x)

angle_tmp = 2 * pi / n

angle_target = angle_0 + angle_tmp

# x1,y1の座標を求める
x1 = center_x + r * math.cos(angle_target)

y1 = center_y + r * math.sin(angle_target)


print(x1,y1)

解説

正n角形のx0,y0とちょうど半分の頂点座標が与えられてとき、x0,y0の次の頂点x1,y1の座標を答える問題です。

この問題の答えは計算で求まりますので、コードの順にそって説明していきます。

問題の条件から正n角形の中心座標が求まりますので、(center_x,center_y)座標とおいて求めました。

この頂点から各頂点までの距離をrとおいて、この距離も三平方の定理から求まります。

続いて中心から(x0,y0)に向かう角度を調べました。
これをベクトルと考えればx成分はx0 - center_x、y成分はy0 - center_yです。
mathモジュールをインポートし、アークタンジェントを用いると中心から(x0,y0)への角度が計算できます。
正n角形の中心から各頂点を結ぶ線分のつくる角はそれぞれ2π/nであり、先ほど求めた角度に2π/nを足した値が、中心から(x1,y1)へ向かう角度angle_targetとなります。

rにcos(angle_target)をかけた値と中心座標のxを足した値がx1、rにsin(angle_target)をかけた値と中心のy座標を足した値が求めるy1となります。

最後にx1,y1を出力してACでした。




ABC197の関連記事はこちら
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com