第2章 グラフィックプログラミング

グラフィックス

さて,まず基本的なグラフィックスを復習しよう.

*Plot*コマンド

正弦曲線を描く.

In[1]:=

2graphicprog_1.gif

2graphicprog_2.gif

Out[1]=

2graphicprog_3.gif

複数のグラフを描くにはリスト形式にする.

In[2]:=

2graphicprog_4.gif

2graphicprog_5.gif

Out[2]=

2graphicprog_6.gif

パラメータ表示された曲線は次のコマンド.

In[3]:=

2graphicprog_7.gif

2graphicprog_8.gif

Out[3]=

2graphicprog_9.gif

練習:Doコマンドを用いて,曲線のアニメーションを作成しよう.

次は3次元曲面.

In[4]:=

2graphicprog_10.gif

2graphicprog_11.gif

Out[4]=

2graphicprog_12.gif

練習:Doコマンドを用いて,曲面のアニメーションを作成しよう.

In[5]:=

2graphicprog_13.gif

2graphicprog_14.gif

Out[5]=

2graphicprog_15.gif

以上が基本的なコマンドである.

練習:円錐を作成しよう.

Plotコマンドにオプションをつけてみよう。

Plotコマンドのオプションを調べるには次のようにする.

2graphicprog_16.gif

2graphicprog_17.gif

次は、x,y軸を等スケールにする.

In[6]:=

2graphicprog_18.gif

2graphicprog_19.gif

Out[6]=

2graphicprog_20.gif

プロット枠の縦横比を1:1にする.

In[7]:=

2graphicprog_21.gif

2graphicprog_22.gif

Out[7]=

2graphicprog_23.gif

格子枠を入れてみよう.

In[8]:=

2graphicprog_24.gif

2graphicprog_25.gif

Out[8]=

2graphicprog_26.gif

プロットの範囲(yのみ)を指定し、x,y軸の目盛りを設定する.

In[9]:=

2graphicprog_27.gif

2graphicprog_28.gif

Out[9]=

2graphicprog_29.gif

x,yの範囲を指定する.

In[10]:=

2graphicprog_30.gif

2graphicprog_31.gif

Out[10]=

2graphicprog_32.gif

In[11]:=

2graphicprog_33.gif

2graphicprog_34.gif

Out[11]=

2graphicprog_35.gif

長さ0.01とスペ-ス0.02の破線を指定する.

In[12]:=

2graphicprog_36.gif

2graphicprog_37.gif

Out[12]=

2graphicprog_38.gif

グラフに色をつける.(RGBColor[0,0,1],Hue[1,0.9,0.8])

In[13]:=

2graphicprog_39.gif

2graphicprog_40.gif

Out[13]=

2graphicprog_41.gif

グラフにラベルをつける

両軸にはラベルをつけ、x軸は度数法表示にした.

In[14]:=

2graphicprog_42.gif

2graphicprog_43.gif

Out[14]=

2graphicprog_44.gif

In[15]:=

2graphicprog_45.gif

さまざまなオプションをつけた.

In[16]:=

2graphicprog_46.gif

2graphicprog_47.gif

Out[16]=

2graphicprog_48.gif

練習問題1:上の三角関数のグラフに,元のSin Cosのグラフを破線で描き加えてみよう.

Plot3Dにオプションをつけてみよう.

3次元曲面の視点を設定する.これには、直接キー入力するよりも、Input→3D ViewPoint Selectorを使うと便利である.

In[17]:=

2graphicprog_49.gif

2graphicprog_50.gif

Out[17]=

2graphicprog_51.gif

ボックスと軸を消し,格子点の個数を変化させる.

In[18]:=

2graphicprog_52.gif

2graphicprog_53.gif

Out[18]=

2graphicprog_54.gif

照明や陰影のオプションを変える.

In[19]:=

2graphicprog_55.gif

2graphicprog_56.gif

Out[19]=

2graphicprog_57.gif

In[20]:=

2graphicprog_58.gif

2graphicprog_59.gif

Out[20]=

2graphicprog_60.gif

密度グラフ(DensityPlot)

デフォルトでの密度グラフである.

In[21]:=

2graphicprog_61.gif

2graphicprog_62.gif

Out[21]=

2graphicprog_63.gif

いろいろオプションをつける.

In[22]:=

2graphicprog_64.gif

2graphicprog_65.gif

Out[22]=

2graphicprog_66.gif

等高線グラフ(ContourPlot)

密度グラフと同様な出力を行うが,ここでは2つのGraphicオブジェクトを作成し,それを並べて表示する.左がデフォルトの等高線グラフ.DisplayFunction→Identityは表示抑止オプションである.

In[26]:=

2graphicprog_67.gif

Out[26]=

2graphicprog_68.gif

右図でいろいろオプションをつける.

In[27]:=

2graphicprog_69.gif

Out[27]=

2graphicprog_70.gif

GraphicsArrayコマンドで2つの図を並べる.

In[28]:=

2graphicprog_71.gif

2graphicprog_72.gif

Out[28]=

2graphicprog_73.gif

2次元グラフィックス・プリミティブ

Mathematicaでの基本的なグラフィックスの生成方法を述べます.これは次の3つの段階からなる.
・グラフィックスプリミティブの生成(用意されているいろいろなプリミティブ)
・グラフィックスオブジェクトの生成(関数Graphics使用)
・表示(関数Show)
このことを円で行う.

Circle

In[29]:=

2graphicprog_74.gif

In[30]:=

2graphicprog_75.gif

Out[30]=

2graphicprog_76.gif

In[31]:=

2graphicprog_77.gif

2graphicprog_78.gif

Out[31]=

2graphicprog_79.gif

オプションはPlotlコマンドのときと同様.

In[32]:=

2graphicprog_80.gif

2graphicprog_81.gif

Out[32]=

2graphicprog_82.gif

In[33]:=

2graphicprog_83.gif

Out[33]=

2graphicprog_84.gif

その他のプリミティブ(Point,Line,Disk)

基本的な点,線分,円板を描いてみる.

In[34]:=

2graphicprog_85.gif

In[35]:=

2graphicprog_86.gif

In[36]:=

2graphicprog_87.gif

In[39]:=

2graphicprog_88.gif

2graphicprog_89.gif

Out[39]=

2graphicprog_90.gif

オプションをつける.

In[38]:=

2graphicprog_91.gif

2graphicprog_92.gif

Out[38]=

2graphicprog_93.gif

3次元グラフィックス・プリミティブ

3次元図形を生成するステップも2次元と同様である.

In[50]:=

2graphicprog_94.gif

In[51]:=

2graphicprog_95.gif

In[52]:=

2graphicprog_96.gif

In[53]:=

2graphicprog_97.gif

Out[53]=

2graphicprog_98.gif

In[54]:=

2graphicprog_99.gif

2graphicprog_100.gif

Out[54]=

2graphicprog_101.gif

In[55]:=

2graphicprog_102.gif

Out[55]=

2graphicprog_103.gif

In[56]:=

2graphicprog_104.gif

2graphicprog_105.gif

Out[56]=

2graphicprog_106.gif

練習問題1:円錐を作ってみましょう.また,いろいろ視点を変えて描いてみよう.

プロットの仕組み

In[57]:=

2graphicprog_107.gif

2graphicprog_108.gif

Out[57]=

2graphicprog_109.gif

In[58]:=

2graphicprog_110.gif

Out[58]//InputForm=

Graphics[{{Line[{{2.617993877991494*^-7, 2.6179938779914644*^-7}, {0.25488992540742256, 0.25213889196341294},
     {0.5328694051959508, 0.5080069997492929}, {0.7939393140028285, 0.7131204212611485}, {1.04500937601917, 0.864929243756943},
     {1.1741328775392965, 0.9223551787683757}, {1.2403657810942001, 0.945902740516237},
     {1.3122595300248905, 0.9667651045914426}, {1.3813635222545473, 0.9821111970586465},
     {1.4117228339769037, 0.9873744690915617}, {1.4451622129766026, 0.9921184097818952},
     {1.4766489532819624, 0.9955714086329677}, {1.506146165787852, 0.997910906131906}, {1.5224109849781302, 0.9988296577034247},
     {1.5372920787446114, 0.9994387851828285}, {1.545504331691776, 0.9996801745413599},
     {1.5498430840253508, 0.9997804888400486}, {1.554468381268543, 0.9998667020589397},
     {1.5629353652700015, 0.9999691028010596}, {1.5707960649955088, 0.9999999999999657}}]}},
{PlotRange -> Automatic, AspectRatio -> GoldenRatio^(-1), DisplayFunction :> $DisplayFunction, ColorOutput -> Automatic,
  Axes -> Automatic, AxesOrigin -> Automatic, PlotLabel -> None, AxesLabel -> None, Ticks -> Automatic, GridLines -> None,
  Prolog -> {}, Epilog -> {}, AxesStyle -> Automatic, Background -> Automatic, DefaultColor -> Automatic,
  DefaultFont :> $DefaultFont, RotateLabel -> True, Frame -> False, FrameStyle -> Automatic, FrameTicks -> Automatic,
  FrameLabel -> None, PlotRegion -> Automatic, ImageSize -> Automatic, TextStyle :> $TextStyle, FormatType :> $FormatType}]

実はLine文で書かれている.

リストの操作

Mathematicaではリストはもっとも基本的なデータ構造である.Mathematicaにはリストを操作する関数が多くある.特に、グラフィックス、個数の処理、確率を考えるときに便利だ.

リストを作る(その1)

組み込み関数でリストを作る.

In[59]:=

2graphicprog_111.gif

Out[59]=

2graphicprog_112.gif

In[60]:=

2graphicprog_113.gif

Out[60]=

2graphicprog_114.gif

In[61]:=

2graphicprog_115.gif

Out[61]=

2graphicprog_116.gif

In[62]:=

2graphicprog_117.gif

Out[62]=

2graphicprog_118.gif

第2引数で刻み幅を指定できる.

In[63]:=

2graphicprog_119.gif

Out[63]=

2graphicprog_120.gif

乱数も作成できる.

In[64]:=

2graphicprog_121.gif

Out[64]=

2graphicprog_122.gif

練習:Table文で3から31までの奇数列を作ろう.

リストを作る(その2)

多次元配列のリストを作成する.

In[103]:=

2graphicprog_123.gif

Out[103]=

2graphicprog_124.gif

複数の反覆子がある場合、その順序は重要である.内側のそれぞれ i に対して、外側の j の値が増加してリストを付け加える.

In[104]:=

2graphicprog_125.gif

Out[104]=

2graphicprog_126.gif

行列として表示できる.

In[105]:=

2graphicprog_127.gif

Out[105]//TableForm=

1
1
2
1
1
2
2
2
1
3
2
3

練習:Tableを用いて {{2,3,4},{3,4,5}}を作ろう.

In[106]:=

2graphicprog_128.gif

Out[106]=

2graphicprog_129.gif

In[107]:=

2graphicprog_130.gif

Out[107]=

2graphicprog_131.gif

練習:Tableを用いて {{2},{3,4},{4,5,6}}を作ろう.

In[108]:=

2graphicprog_132.gif

Out[108]=

2graphicprog_133.gif

リストの大きさ

In[109]:=

2graphicprog_134.gif

Out[109]=

2graphicprog_135.gif

In[110]:=

2graphicprog_136.gif

Out[110]=

2graphicprog_137.gif

Lengthはもっとも浅いレベルの大きさを返す.各レベルの大きさを見るには  Dimensions を用いる.

In[111]:=

2graphicprog_138.gif

Out[111]=

2graphicprog_139.gif

リストを操作する

マウスでデ-タリストを取得し,それらを操作する.

In[142]:=

2graphicprog_140.gif

2graphicprog_141.gif

Out[142]=

2graphicprog_142.gif

グラフィック枠内において,CTRL+マウスクリック(左下に座標が表示される)で点がプロットされる.この状態でCTRL+C,そしてセルにマウスを移動してCTRL+Vとすると,デ-タがインポ-トできる.

In[143]:=

2graphicprog_143.gif

In[144]:=

2graphicprog_144.gif

2graphicprog_145.gif

Out[144]=

2graphicprog_146.gif

In[145]:=

2graphicprog_147.gif

Out[145]=

2graphicprog_148.gif

In[146]:=

2graphicprog_149.gif

2graphicprog_150.gif

Out[146]=

2graphicprog_151.gif

多次元配列のリストを操作する.

In[147]:=

2graphicprog_152.gif

次は,配列の値を高さとする密度プロット.

In[148]:=

2graphicprog_153.gif

2graphicprog_154.gif

Out[148]=

2graphicprog_155.gif

次は等高線プロット.

In[149]:=

2graphicprog_156.gif

2graphicprog_157.gif

Out[149]=

2graphicprog_158.gif

次は3次元曲面を生成する.

In[150]:=

2graphicprog_159.gif

2graphicprog_160.gif

Out[150]=

2graphicprog_161.gif

以上のようにリストを視覚化できる.これは後の画像処理で詳しく述べる.

練習:自分でリストを作成し、曲面を作成する.

In[152]:=

2graphicprog_162.gif

2graphicprog_163.gif

Out[152]=

2graphicprog_164.gif

Mathematicaでのパターン [ x_ ] (付録)

Mathematicaで関数を定義するときには少し工夫がいる.

In[153]:=

2graphicprog_165.gif

In[154]:=

2graphicprog_166.gif

Out[154]=

2graphicprog_167.gif

これは、記号xのみにしか動作せず、不都合である.これに対し、Mathematicaには,パタ-ンマッチングという考え方があり,x_とすることでパタ-ンに適合する変数に対応する関数ができる.

In[155]:=

2graphicprog_168.gif

Out[155]=

2graphicprog_169.gif

In[156]:=

2graphicprog_170.gif

Out[156]=

2graphicprog_171.gif

Mathematicaでの等号=と:= (付録)

定義する関数がもう少し複雑になると、さらに工夫する必要がある.

In[157]:=

2graphicprog_172.gif

In[158]:=

2graphicprog_173.gif

In[159]:=

2graphicprog_174.gif

Out[159]=

2graphicprog_175.gif

=は即時定義(Set) といい、左辺の内容を右辺に代入する.つまり代入の規則を優先して評価するだけである.これに対して、:= は遅延定義(SetDelayed)といい、右辺をすぐには評価せず、Expand[x^2]全体を保持するので、関数が実際に使われるときに初めて評価する.特に:=は関数を定義するときに非常に有効である.

In[160]:=

2graphicprog_176.gif

Global`ff

2graphicprog_177.gif

In[161]:=

2graphicprog_178.gif

Global`gg

2graphicprog_179.gif

この辺の詳細は,また後のプログラミングのところで説明する.

いろいろな平面曲線

陰関数表示( ImplicitPlot )

まずパッケージをロードする.

In[162]:=

2graphicprog_180.gif

In[163]:=

2graphicprog_181.gif

2graphicprog_182.gif

Out[163]=

2graphicprog_183.gif

パラメータ表示( ParametricPlot )

リストを作成して曲線をプロットする.これは表計算ソフトでの描画方法である.サイクロイドを例に説明します。

In[178]:=

2graphicprog_184.gif

In[179]:=

2graphicprog_185.gif

2graphicprog_186.gif

Out[179]=

2graphicprog_187.gif

組み込み関数を用いると、

In[180]:=

2graphicprog_188.gif

2graphicprog_189.gif

Out[180]=

2graphicprog_190.gif

もっと一般的にサイクロイドを定義する.

In[181]:=

2graphicprog_191.gif

In[182]:=

2graphicprog_192.gif

2graphicprog_193.gif

Out[182]=

2graphicprog_194.gif

課題:定数a ,bにいろいろな値を代入して、サイクロイドを描いてみよう.
課題:レムニスケート,カージオイド,シッソイド,トラクトリクス,リマソンなどの曲線を描いてみよう.

In[183]:=

2graphicprog_195.gif

In[184]:=

2graphicprog_196.gif

In[185]:=

2graphicprog_197.gif

In[186]:=

2graphicprog_198.gif

In[187]:=

2graphicprog_199.gif

極座標表示( PolarPlot )

極座標系とは,平面上では,原点を基準に1つの動径 r と1つの偏角 θ を対応させる座標系のことである.直交系( x, y )と( r, θ )の関係は,x = cosθ, y = sinθ が成り立つ.

Mathematicaでこれを実現するには,次のパッケージをロードする必要がある.

In[188]:=

2graphicprog_200.gif

らせんを描くには次のようにする.

In[189]:=

2graphicprog_201.gif

2graphicprog_202.gif

Out[189]=

2graphicprog_203.gif

次はリマソンの極表示.

In[190]:=

2graphicprog_204.gif

In[191]:=

2graphicprog_205.gif

2graphicprog_206.gif

Out[191]=

2graphicprog_207.gif

課題:定数 a, b, n にいろいろ値を代入して,リマソンを描いてみよう.

アニメーションに挑戦

ここではサイクロイド例に少し高度なアニメ-ションに挑戦しよう.

Append

In[192]:=

2graphicprog_208.gif

In[193]:=

2graphicprog_209.gif

In[194]:=

2graphicprog_210.gif

Out[194]=

2graphicprog_211.gif

In[195]:=

2graphicprog_212.gif

Out[195]=

2graphicprog_213.gif

AppendTo

In[196]:=

2graphicprog_214.gif

In[197]:=

2graphicprog_215.gif

Out[197]=

2graphicprog_216.gif

In[198]:=

2graphicprog_217.gif

Out[198]=

2graphicprog_218.gif

今度は,リストが再設定される.この原理をアニメーションに使う.

サイクロイドのアニメーション

次がサイクロイドを表すパラメータ表示.

In[210]:=

2graphicprog_219.gif

ころがる線分を設定する.

In[211]:=

2graphicprog_220.gif

接円の中心.

In[212]:=

2graphicprog_221.gif

接円を設定する.

In[214]:=

2graphicprog_222.gif

In[215]:=

2graphicprog_223.gif

In[216]:=

2graphicprog_224.gif

アニメーション ( 残像つき )

In[217]:=

2graphicprog_225.gif

2graphicprog_226.gif

2graphicprog_227.gif

2graphicprog_228.gif

2graphicprog_229.gif

2graphicprog_230.gif

2graphicprog_231.gif

2graphicprog_232.gif

2graphicprog_233.gif

2graphicprog_234.gif

2graphicprog_235.gif

2graphicprog_236.gif

2graphicprog_237.gif

2graphicprog_238.gif

In[218]:=

2graphicprog_239.gif

In[218]:=

2graphicprog_240.gif

In[218]:=

2graphicprog_241.gif

In[219]:=

2graphicprog_242.gif

リマソンのアニメーション

In[245]:=

2graphicprog_243.gif

2graphicprog_244.gif

2graphicprog_245.gif

2graphicprog_246.gif

2graphicprog_247.gif

2graphicprog_248.gif

2graphicprog_249.gif

課題:いろいろな曲線のアニメーションを描いてみよう.

いろいろな曲面(Plot3D, ParametricPlot3D)

3次元曲面も平面曲線を描く要領とほぼ同じである.ここではいろいろな曲面を鑑賞しよう.基本的な曲面(球面やトーラス,円錐,円柱など)はパッケージ(Graphics`Shapes`)を活用するとよい.ここではそれ以外の曲面を取り上げる.

放物面

In[221]:=

2graphicprog_250.gif

双曲放物面

In[222]:=

2graphicprog_251.gif

猿の腰掛け

In[223]:=

2graphicprog_252.gif

ホイットニ-の傘

In[224]:=

2graphicprog_253.gif

8の字曲面

In[225]:=

2graphicprog_254.gif

3次元曲面を描く.

In[226]:=

2graphicprog_255.gif

2graphicprog_256.gif

Out[226]=

2graphicprog_257.gif

課題:いろいろ変数を変えて,オリジナル曲面を描いてみよう.(名前をつけるといいかもしれません)

円錐曲線の切断

円錐を平面で切断してできる曲線を実際にMathematicaで実現させよう.まず、円錐面を媒介変数で定義する.

In[227]:=

2graphicprog_258.gif

次に切断面を定義する.

In[228]:=

2graphicprog_259.gif

xy平面に平行な平面で切断する.(アニメーション)

In[229]:=

2graphicprog_260.gif

2graphicprog_261.gif

2graphicprog_262.gif

2graphicprog_263.gif

2graphicprog_264.gif

2graphicprog_265.gif

2graphicprog_266.gif

2graphicprog_267.gif

2graphicprog_268.gif

2graphicprog_269.gif

2graphicprog_270.gif

2graphicprog_271.gif

2graphicprog_272.gif

課題:平面をいろいろ変えて、切断面を観察しよう.

Module:局所変数と大域変数

In[230]:=

2graphicprog_273.gif

これは変数 x が大域変数として値2であると定義している.

In[231]:=

2graphicprog_274.gif

In[232]:=

2graphicprog_275.gif

Out[232]=

2graphicprog_276.gif

In[233]:=

2graphicprog_277.gif

Out[233]=

2graphicprog_278.gif

どうしてこうなるかというと,xは依然として2のままであるからでる.

In[234]:=

2graphicprog_279.gif

Global`x

x=2

シンボルの値を解放するにはClearを用いる.

In[235]:=

2graphicprog_280.gif

In[236]:=

2graphicprog_281.gif

Global`x

さらに,Moduleを用いて局所的にのみ有効な変数を定義することができる. (下の式は複合式といって、最後のみ出力する)

In[237]:=

2graphicprog_282.gif

Out[237]=

2graphicprog_283.gif

これは大域変数と独立に扱うことができる.

In[238]:=

2graphicprog_284.gif

Out[238]=

2graphicprog_285.gif

演習課題1:サイクロイドのアニメーション(発展)

サイクロイドをいろいろ変形するために,変数a ,b でコントロールする関数を作るためには,次のプログラムでは不十分だ.どのように修正すればいいだろうか.

In[2]:=

2graphicprog_286.gif

In[4]:=

2graphicprog_287.gif

これはうまくいく.しかし,次はうまくいかない.

In[247]:=

2graphicprog_288.gif

演習課題2: いろいろなアニメーションを作ってみよう.

例:いろいろな図形をいろいろ曲線上で転がしてみよう.

MathematicaのWeb化

gifファイルの生成

簡単なアニメーションを作り、javascript でweb化してみよう.Mathematicaで作成したアニメーションは、ファイル保存形式をHTMLと指定すると、自動的にgifファイル( index_i .gif ) が生成される.

In[242]:=

2graphicprog_289.gif

2graphicprog_290.gif

javascriptの利用

javascriptに関しては,別紙資料を参考にして下さい.また、gif アニメーション作成に関しては、専用ソフト(フリーウエアもしくはホームページビルダーのWebアニメータなど)が利用できます.

サイクロイドのアニメーション(発展)

In[243]:=

2graphicprog_291.gif

In[244]:=

2graphicprog_292.gif

2graphicprog_293.gif

Spikey Created with Wolfram Mathematica 7.0