AtCoder Beginner Contest 197(Sponsored by Panasonic)「D - Opposite」纏め
第4問も考え方が特殊だったので、一応メモを残して置きますφ(..)
この問題のポイント
・正N角形
・Nは偶数
・与えられるのは
この3つがこの問題のミソです。
何がミソかと言うと、p0とp(n/2)は対角線の位置になるということ。
もう一つのポイントは正N角形。正N角形は全ての角が1つの円の円周上にあるということ。
この2つを考慮すると、p0とp(n/2)の中点が正N角形に外接する円の中心と一致する
ということで、中心は
X座標:(x0+x(n/2))/2
Y座標:(y0+y(n/2))/2
となります。
地味な落とし穴:型には気を付けろ
今までint型ばっかり使っていたのですが、今回地味な落とし穴がありました。
それは小数点表示ができない…
3 / 2 = 1.5 にならず
3 / 2= 1となってしまいました。
これは小学生的に考えると分かりやすくて
3 / 2=1 余り 1なので、商は1と言うことですね
これを小数点表示にするにはdouble型にキャストしてあげる必要があります。
ちなみに面倒なら最初からdouble型にしてしまうのも手です。ちなみに私はそうした
そうすると、キャスト不要になるので、コードを短くできます♪
外接円の中心から答えを求める
では、目的のp1を求める方法を考えていきましょう。
自分がパッと思いついたのはp0からx軸方向ずらしてあげる。
この時ずらすのは、三角関数で求められそう、そんな構想で考えるが、2個目の解けない…
ここで気づいたのはp0とp1の直線はx軸に平行じゃない
そう、斜めも存在するのだ…
ということはy軸方向にもずらさないと行けないけど、そうなってくると、中心角から三角関数で求めてあげましょう
つまり、中心から角度を出して、360°/N反時計回りにずらしてあげる、というのが正しいっぽいです。
なお、中心角とp0、x軸の角度は、atan2(x1, y1, x2, y2)で求められるみたいです。
中心から(x0,y0)の角度θ+360°/n反時計回りにずれた位置が回答になります。
x1=xc - cos(θ+360°/n) * r
y1=yc - sin(θ+360°/n) * r(rは半径)
今回は一発合格できました。
めでたしめでたし。
Submission #21523661 - AtCoder Beginner Contest 197(Sponsored by Panasonic)