昨日に続いてですが問題です.
辺の長さがすべて等しく,角の大きさはすべて異なる十角形を描いてください.
さっそくですが解答です.
図形の左上について,180度に近いのが見てとれると思います.右側は正十角形,と思いきや微妙に角度は異なります.
正十角形と比較すると次のようになります.
簡単にいうと,最上部(時計の12時の位置)から時計回りに頂点を決定しているのですが,内角を少しずつ大きく(外角を小さく)していき,最後の頂点で,辺の長さが等しくなるよう,つじつまを合わせています.
頂点数nを入力にとり,「正n角形」「辺の長さがすべて等しく,角の大きさはすべて等しいわけではないn角形」「辺の長さがすべて等しく,角の大きさはすべて異なるn角形」の座標を算出するプログラム(polygon-plotter.rb)を,Gistに公開しました.
このプログラムを実行すると,3≦n≦10の各nに対して,3つのn角形の座標を求め,座標・辺の長さ・角の大きさを出力するとともに,SVGファイルを作成します(外角の線の有無を入れて,実行したディレクトリに48個のファイルが作られます).
n=10のとき,3つの図形の出力は次の通りです(手作業で,改行位置を変えています).
==== Regular, n=10, prec=3 ==== point: [[0.000, 1.000], [0.588, 0.809], [0.951, 0.309], [0.951, -0.309], [0.588, -0.809], [0.000, -1.000], [-0.588, -0.809], [-0.951, -0.309], [-0.951, 0.309], [-0.588, 0.809]] side: [0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618] angle: [144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 144.000]: 1440.0 ==== Fake 1, n=10, prec=3 ==== point: [[0.000, 1.000], [0.588, 0.809], [0.951, 0.309], [0.951, -0.309], [0.588, -0.809], [0.000, -1.000], [-0.588, -0.809], [-0.951, -0.309], [-0.951, 0.309], [-0.363, 0.500]] side: [0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618] angle: [144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 144.000, 108.000, 216.000, 108.000]: 1440.0 ==== Fake 2, n=10, prec=3 ==== point: [[0.000, 1.000], [0.588, 0.809], [0.952, 0.309], [0.954, -0.309], [0.595, -0.811], [0.009, -1.010], [-0.582, -0.830], [-0.958, -0.340], [-0.980, 0.278], [-0.554, 0.725]] side: [0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618, 0.618] angle: [144.072, 144.144, 144.216, 144.288, 144.360, 144.432, 144.504, 134.349, 160.011, 135.624]: 1440.0
いずれも,座標は「[0.000, 1.000]」から始まっています.正多角形(Regular)については,この座標を含め,単位円上にn個の点をとっています.他の2つ(Fake 1,Fake 2)も,単位円の円周に近いところで座標を求めるようにしています.
またsideは辺の長さの配列で,angleは内角の大きさ(度数法)の配列です.辺の長さはいずれも等しいのに対し,角度に違いがあるのも確認できます.
角度の計算については,以下のページの情報を採用し,ソースコードのコメントにURLを記載しました.内積と外積と,atan2関数を組み合わせた「θ = atan2(A×B,A・B)」を使用して求めています.