投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/9/21 23:55:50
> 三角関数と言っても、教科書を見れば分かるだろうと思っていた自分が恥ずかしくなりました。

やっていることは、それほど難しい計算ではありません。

しかしたとえ教科書レベルの理解はあったとしても、さらにそこから、
.NET に置き換えるための知識も必要になってくるとは思いますので、
画像を踏まえて、追加で解説しておきます。


まず、るきおさんが
> n角形の場合、360÷n 度 です。
と書かれていましたよね。これが一番重要な点です。

『正多角形の外接円』に対する中心角を、図で表すとこうなります。
八角形なら、360°÷8=45°というわけですね。



中心角をθ、半径をr で示すと、頂点座標Pはこのように求められます。


あとは、『For n = 0 To (頂点数 - 1)』でループさせながら、
 「頂点座標 Pn の X 座標」 = 「半径r」× Cos(n×θ)
 「頂点座標 Pn の Y 座標」 = 「半径r」× Sin(n×θ)
を求めていくだけの単純作業です。既出のサンプルコードと見比べてみてください。


一方、私が書いた
> 正多角形の頂点数N(3以上)
> 正多角形の外接円の中心座標O
> 正多角形の第一頂点の座標P
>あるいは、
> 正多角形の頂点数N(3以上)
> 正多角形の外接円の中心座標O
> 正多角形の外接円の半径R
> 正多角形の第一頂点の中心角θ
については、「前者の O と P」を後者の「R と θ」に変換しています。
そうすれば、さっきと同じループ処理によって多角形の頂点が求まります。


このパラメータ変換に使うのは、こちらの計算式。


上図において、
 a → 「頂点P の X 座標」
 b → 「頂点P の Y 座標」
 c → 「半径R」
に相当します。

実際には、中心点Oの座標も使って、
 「水平の長さ a」 =「中心点O の X 座標」と「頂点座標 P の X 座標」の差
 「垂直の高さ b」 =「中心点O の Y 座標」と「頂点座標 P の Y 座標」の差
となります。

この引き算した値を、上図公式のアークタンジェントに当てはめて中心角 θ を求めているのが、
先の私のコードでいうところのこの行にあたります。
>> Dim radian As Double = Math.Atan2(point.Y - origin.Y, point.X - origin.X)

※ Math.Atan メソッドでも求められますが、今回は Math.Atan2 メソッドを利用しました。


そして、今求めた 中心角θを使って半径 R を求める式がこちら。
やはり上の図に描かれているのと、同じ計算式ですよね。
>> Dim radius As Double = (point.X - origin.X) / Math.Cos(radian)


これにより、頂点座標 P を、半径R と 中心角θに置き換えられたので、
あとはさっきの方法と同様に For ループして、すべての頂点座標を算出したというわけです。