わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

辺の長さがすべて等しい多角形を描く(2)

 昨日に続いてですが問題です.

 辺の長さがすべて等しく,角の大きさはすべて異なる十角形を描いてください.

 さっそくですが解答です.
f:id:takehikom:20210515060706p:plain
 図形の左上について,180度に近いのが見てとれると思います.右側は正十角形,と思いきや微妙に角度は異なります.
 正十角形と比較すると次のようになります.
f:id:takehikom:20210515060712p:plain
 簡単にいうと,最上部(時計の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)」を使用して求めています.