|
2.10.11 3D曲面のプロット
3Dグラフィックス関数 Graphics3Dを使い適切なプリミティブを与えることで,どんな立体でも構築することができる.例えば,立体が多面体として構成されるなら,隣接する多角形をリスト形式で Graphics3Dに与えることで立体を形成することができる.
折り返したり自分自身と交差したりする複雑な曲面を構築する場合でも, ParametricPlot3Dと同様に Graphics3Dで多角形のリストを指定することが唯一の方法である.
ただし,多くの場合,形成する曲面は単純なものである.例えば, Plot3Dや ListPlot3Dの生成する曲面は折り返すことはないし,各( , )のプロット点において必ずある 値(高さ)を持っている.そのような曲面は多角形のリストで指定しなくても,もっと簡単な方法で構築することができる.つまり,各( , )のプロット点における 値を結んでいくことでプロット面が与えられるとすれば, ( , , )座標を配列形式で指定するだけでよくなる. SurfaceGraphics[array]を使った曲面の生成はこの方法に基づいている.

3Dグラフィックスオブジェクト
描画する座標点を 要素の配列として作っておく.
In[1]:= moda = Table[Mod[i, j], {i, 4}, {j, 4}]
Out[1]= 
配列の 点を結び面を形成する.
In[2]:= Show[SurfaceGraphics[moda]]

Out[2]= 
Plot3Dと ListPlot3Dのプロット機能は SurfaceGraphicsのオブジェクトを生成するようになって いる.

曲面の変換
SurfaceGraphicsのオブジェクトに Graphics3Dを適用し一般形に変換させると,もとの曲面が多角形の集合体として再定義されリスト形式で保存される.また,2つの SurfaceGraphicsの曲面を融合させた場合も同様な Graphics3Dの一般形オブジェクトに変換される.
SurfaceGraphicsの曲面を作って おく.
In[3]:= Plot3D[(1 - Sin[x]) (2 - Cos[2 y]), {x, -2, 2}, {y, -2, 2}]

Out[3]= 
そして,もう1つ作る.
In[4]:= Plot3D[(2 + Sin[x]) (1 + Cos[2 y]), {x, -2, 2}, {y, -2, 2}]

Out[4]= 
2つの曲面を一緒に描画する.すると,2つの曲面に対応した多角形のリストからなる Graphics3Dのオブジェクトに変換 する.
In[5]:= Show[%, %%]

Out[5]= 

SurfaceGraphicsのメッシュ設定
SurfaceGraphicsで曲面を作成するとき,デフォルトでは,曲面の表面に網状のメッシュ(四辺形の集まり)が引かれる. 1.9.6にあるように,メッシュを入れると面がどうなっているか分かりやすくなる.メッシュが不必要なら, Mesh -> Falseと指定し表示禁止にしておく.また,表示するなら MeshStyleを設定すると,メッシュの線の太さ,色等の指定ができるようになる.
SurfaceGraphicsオブジェクトは( , , )の座標配列からなり,各座標点は( , )プロット点における曲面の高さ位置( 値)を示す.また,メッシュ範囲のオプション MeshRangeを設定すれば,メッシュの四隅の点を実座標で指定することができる. SurfaceGraphicsオブジェクトの生成に Plot3D[f, x, xmin, xmax , y, ymin, ymax ]を使うと, MeshRange ->  xmin, xmax , ymin, ymax の設定が自動的に行われる. SurfaceGraphicsオブ ジェクトを Graphics3Dの多角形オブジェクトに変換する場合に MeshRangeのこの設定が使われる.

ClipFillのオプション設定
SurfaceGraphicsにおけるプロット範囲のオプション PlotRangeの働き方は他のグラフィックスオブジェクトの場合と同じである.つまり,範囲の外にはみ出た曲面の部分は表示から除外される. ClipFillのオプションで,除去した後の空白部をどう描画処理するかを指定することができる.
天井部と底部で表示上除外される部分がでるような曲面プロットをしておく.デ フォルトの ClipFill設定では,表示上除 外した部分には面があったときと同じ シェーディングが施される.
In[6]:= Plot3D[Sin[x y], {x, 0, 3}, {y, 0, 3}, PlotRange -> {-.5, .5}]

Out[6]= 
ClipFill->Noneと設定すると表示から除外した部分は空白のまま残される.いわゆる「シースルー」の状態である.Mathematicaはプロットしている関数の値が実数ではない部分に相当する表面部分は常に表示しないでおく.
In[7]:= Show[%, ClipFill -> None]

Out[7]= 
底部で表示上除外された部分は白(グレーレベル 1)で,また,天井部で除外された部分は黒で色付けする.
In[8]:= Show[%, ClipFill -> {GrayLevel[1], GrayLevel[0]}]

Out[8]= 
曲面を描画するには,各プロット座標における高さだけでなく曲面の色も指定しなければいけない.デフォルトでは照明効果が有効になっているので(設定は Lighting -> True),擬似照明法に基づいた色付けが自動的に行われる.逆に照明効果を禁止にした場合は(Lighting -> False),「色指定関数」を使い曲面の色付け処理が行われる.
デフォルトの色指定関数では,0から 1の範囲にスケールされた曲面の高さをグレースケールのレベル値とした陰影処理を曲面に施す.デフォルト処理が適していなければ,次に説明する2種類の色付け法が取れる.
第1の方法は, ColorFunction -> cの書式を使いユーザ定義の色指定関数 cを指定する方法である.曲面の高さ値を関数cに与え,曲面を塗る色の値を求めさせる.例えば, ColorFunction -> Hueとすれば,ある色範囲で曲面が色付けされる.

色指定関数の指定
照明効果を禁止にする.すると,デフォルト処理の曲面の高さ値に対応したグレー スケールで曲面が色付けされる.
In[9]:= exp = Plot3D[Exp[-Sqrt[x^2 + y^2]], {x, -2, 2}, {y, -2, 2}, Lighting -> False]

Out[9]= 
引数について0.5の幅で交代に黒色・白色の値を返す色指定関数を定義しておく.
In[10]:= stripes[f_] := If[Mod[f, 1] > 0.5, GrayLevel[1], GrayLevel[0]]
色指定関数を使い再度描画する.今度は,曲面が白黒のストライプで色付けされる.
In[11]:= Show[exp, ColorFunction -> (stripes[5 #]&)]

Out[11]= 
第2の方法は,曲面の高さ指定の配列データと一緒に2次的な配列データを色指定関数(ColorFunction)に与える方法である.この場合,色指定関数は2次データに適用され高さデータは使われない.この方法をうまく使うと色の指定で第4の次元を表すことが可能になる.つまり,各プロット点における高さ の曲面で,そこに塗る色で第4の座標を示すようになる.
プロット書式 Plot3D[ f, s , ... ]を使えば,自動的に色の配列データを生成することができる.この方法で作った色データは ListPlot3Dや SurfaceGraphicsの指定に使えるが,高さデータが 要素の配列の場合,色データは 要素の配列になることに注意する.1つ減ってしまう理由は,高さ値が各プロット点に1つずつあるのに対して,色の値は隣接する4つのプロット点で指定される四角形領域につき1つずつあるためである.
色指定関数や色データの配列を Plot3Dや ListPlot3D等のプロット関数に与えると,色指定関数の設定はデフォルトで自動設定になる(ColorFunction -> Automatic).自動設定が有効になるには,色指定関数や色データの配列に GrayLevelや RGBColor等の所定の色指定のための指示子が入っていなければいけない.また, ColorFunction -> Hueのように特定の色スケールの関数を使うよう指定しておくと,色指定関数や色データに指示子を使った所定の色指定を入れる必要がなくなる.つまり,色指定は純粋な数値で行ってもよいし,色指定関数の適用で色の値に変換するようなデータを使ってもよい.

曲面の色指定
座標から決まるグレースケールのレベルによって曲面を塗る.
In[12]:= Plot3D[{Sin[x] Sin[y]^2, GrayLevel[y/3]}, {x, 0, 3}, {y, 0, 3}]

Out[12]= 
乱数で作ったグレースケールのレベル値で曲面の色付けを行う.色データの配列は 要素なのに対して高さデータは 要素であることに注目.
In[13]:= ListPlot3D[ Table[i/j, {i, 10}, {j, 10}], Table[GrayLevel[Random[ ]], {i, 9}, {j, 9}] ]

Out[13]= 
|