【初心者向け】Mathematicaグラフィックス入門 3:多角形のグラフィックス・プリミティブ 

Mathematica

要約:Mathematica グラフィックス入門となる面のグラフィックス・プリミティブPolygonについて解説する。

面を表わすグラフィクス・プリミティブ

 面を表わすグラフィクス・プリミティブとしては、Rectangle[]等があるが、直接操作してしようするには、Polygon[]が最も操作しやすいので、その使用法を解説する。使用法は、Line[]で折れ線を使うときとほぼ同じである。先の図18が折れ線の例であるが、その時、最初と最後の点が結ばれていないことに注目していただきたい。Polygon[]の場合は点で囲まれる範囲が塗りつぶされるので、前回と同じ天馬のリストaをPolygon[]に与えてやれば、多角形が作られる。

図1:塗りつぶした天馬

<<プログラム1>>

a={{0.3, 0}, {0.1, 0.2}, {0.2, 0.6}, {0.9, 0.8}, {0.6, 1.5}, {0.33, 1.3}, {0.5, 1.1}, {0.25, 1}, {0, 1.4}, {0.3, 1.8}, {0.7, 1.8}, {1.2,2.5}, {0.3, 2.5}, {0.6, 2.7}, {0.4, 2.7}, {0.45, 3.0}, {1, 3}, {1.2, 3.3}, {1.9, 3}, {1.4, 1.8}, {1.8, 1.6}, {2.3,2.5}, {3.5,2.5}, {3.2,1.9}, {2.75,1.8}, {2.5,1.4}, {2.75,1}, {3,1.1}, {2.85,1.3}, {3, 1.5}, {3.1,1.5}, {3.4,0.8}, {2.7,0.6}, {2.6,0.2}, {2.8,0}, {2.25, 0}, {2, -0.25},

{1.8,-0.95}, {1.5, -0.7}, {1.9, 0.5},{1.15, 0.75}, {1, 0.6}, {0.5, 0.5}, {0.4, 0.25}, {0.5, 0}};

Show[Graphics[Polygon[a]]]

 プログラム1は、グラフィクス・プリミティブPolygon[]に点のリストを与えただけである。

 ところで、折れ線が交差した場合にも、図2で分かるように多角形として描くことが出来る。なお、2点しか与えない場合には、描けないので注意する必要がある。

図2:折れ線が交差した場合

<<プログラム2>>

a={{0, 0}, {1, 0}, {1,1}, {0.5, -1}, {0, 1}};

Show[Graphics[Polygon[a]]]

多角形

 まず、一番簡単な多角形である三角形を描いてみよう。

図3:三角形  図4:三角形の並び

<<プログラム3>>

a={{0,0},{0.5,1},{1,0}};

Show[ Graphics[Polygon[a]],AspectRatio->1] (*図3*)

p=Table[{Hue [Mod[i+j,11]/10],

Polygon[Table[a[[k]]+{i,j},{k,1,3}]]},{i,0,5},{j,0,5}];

Show[ Graphics[p],AspectRatio->1](*図4*)

 プログラム3では、aは三角形の座標のリストであるが、それをそのまま図3に表示した。図4では、その三角形の座標のリストをもとに、複数並べて出力したリストpを作り、出力している。そのリストの作り方を解説する。まず、リストaの要素を取り出したい場合、a[[k]],a[[i,j]]の形式で呼び出すことができる。例えば、

a={{0,0},{0.5,1},{1,0}}の時に、a[[2]]で{0.5,1}、a[[2,1]]で0.5が呼び出される。

 次に点{x0,y0}を横にx1、縦にy1だけずらして描きたい場合、それぞれの座標にそれぞれずらしたい量を加えればよい、つまり、{x0+x1,y0+y1}がずらした後の座標となる。従って、プログラムでは、a[[k]]+{i,j}

でk番目の座標を呼び出し、それぞれにずらす量i,jを加えているわけである。

 三角形の次は四角形、それ以上の正n角形を描いてみよう。

図5:4角形の並び 図6:3~8角形の並び

<<プログラム4>>

npolygon[n_Integer]:=

Table[N[{Sin[i/n*2*Pi]/2+.5,Cos[i/n*2*Pi]/2+.5}],{i,1,n}];(*正n角形を定義*)

a=npolygon[4];

p=Table[Polygon[Table[a[[k]]+{i,j},{k,1,4}]],{i,0,5},{j,0,5}];

Show[Graphics[{GrayLevel[0.5],p}],AspectRatio->1,

Background->GrayLevel[0];(*図5*)

p=Table[{Hue [Mod[i+j,10]/10],Polygon[Table[

npolygon[Mod[i*j,7]+2][[k]]+{i,j},{k,1,Mod[i*j,7]+2}]]},

{i,1,6},{j,1,6}];

Show[Graphics[p,

PlotRange->{{1,7},{1,7}}],AspectRatio->1](*図6*)

 プログラム4では、まず、正n角形を作る関数npolygon[n]を定義した。この正n角形を作る関数npolygon[n]であるが、この描き方は半径1の円を考えていただきたい。この円の中心の角度2πをn等分したそれぞれの円周上の点を結べば、正n角形ができるわけである。つまり、{Sin[2*Pi*i/n],Cos[2*Pi*i/n]}でiを1~nまで変えて計算すると円周上の点がもとまることになる。なお、プログラムでは更に2分の1にして0.5を足すことで、辺の長さが1の正方形に納まるようにして、並べるときに取り扱いやすくしている。

 図5では、上の定義で算定した正方形の座標を図21と同じ方法で並べている。なお、このとき、図形の背景色をオプションBackgroundによりGrayLevel[0]、つまり、黒に指定している。

 図6も同様であるが、3~8角形の図形と陰影をそれぞれに算定して配置している。

 

天馬の並び:黒の天馬に気がついて下さい!

 ここまで来れば、前述の天馬のデータを使って、多角形と同様に並べられることが分かっていただけると思う。

図7:天馬の並び

<<プログラム5>>

a={{0.3, 0}, {0.1, 0.2}, {0.2, 0.6}, {0.9, 0.8}, {0.6, 1.5}, {0.33, 1.3}, {0.5, 1.1}, {0.25, 1}, {0, 1.4}, {0.3, 1.8}, {0.7, 1.8}, {1.2,2.5}, {0.3, 2.5}, {0.6, 2.7}, {0.4, 2.7}, {0.45, 3.0}, {1, 3}, {1.2, 3.3}, {1.9, 3},

{1.4, 1.8}, {1.8, 1.6}, {2.3,2.5}, {3.5,2.5},{3.2,1.9},{2.75,1.8},

{2.5,1.4}, {2.75,1}, {3,1.1}, {2.85,1.3}, {3, 1.5}, {3.1,1.5}, {3.4,0.8}, {2.7,0.6}, {2.6,0.2}, {2.8,0}, {2.25, 0}, {2, -0.25}, {1.8,-0.95}, {1.5, -0.7}, {1.9, 0.5},{1.15, 0.75}, {1, 0.6}, {0.5, 0.5},

{0.4, 0.25}, {0.5, 0}};(*天馬のデータ*)

p=Table[{Hue [(Mod[i+j,10]+1)/10],Polygon[Table[

a[[k]]+{2.5*i-2.5*Floor[Mod[j,2]-1/2]-12.5,2.5*j-12.5},{k,1,45}]]},

{i,1,10,2},{j,0,9}];

Show[Graphics[p],AspectRatio->Automatic,

Background->RGBColor[0,0,0]](*図7*)

 図7は、陰影を使ったので、バックの黒い天馬が目立たないが思ったよりも面白いものになった。

参考文献:Mathematicaグラフィックスの入門書

中村健蔵「Mathematicaで絵を描こう」1997東京電機大学出版局

ノートブックのダウンロード

ノートブックを下からダウンロードのページへ行き、ダウンロードできます。但し、ダウンロードのページに入るには、下で問い合わせて、メールしで送られて来るパスワードが必要です。なお、ダウンロードのページでノートブック全てが管理されています。つまり、1度メールを送れば、その他の記事のノートブックもダウンロード出来ます。さらに新しい記事をアップロードした際にお知らせいたします。また、ノートブックは配布可能ですので、Mathematicaを使っている友人等で興味のある方に配布して下さい。

パスワードが必要な方は、下の問い合わせからメールをお送りください。

なお、新しい記事をアップロードした際にお知らせいたします。また、お名前、メールアドレスはサーバーに残さず、管理していますので、ご安心ください。


    スパム防止のためにチェックを入れてください!

    タイトルとURLをコピーしました