Mathematica 9 is now available

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / グラフィックスとサウンド オブジェクトの構造  /

2.10.14 発展:低レベルの描画機能

Show Plot等のグラフィックス関数では,グラフィックスオプション DisplayFunctionを使い表示のしかたを指定する. DisplayFunctionを設定すると,自動的に各グラフィックスオブジェクトに適用される.

表示関数 DisplayFunctionの設定

カーネル内では,グラフィックスは常にグラフィックスプリミティブからなるオブジェクトとして存在する.そして,描画の命令があると,描画処理を実際に担当するフロントエンドや他の外部プログラムが直接扱えるよう,各オブジェクトのプリミティブを低レベルのデータ形式に変換する.

Mathematicaで標準的な低レベル形式とはPostScript形式のことである.グラフィックスオブジェクトに関数 Displayを適用すると,まず,オブジェクトの内容がPostScript形式の記述文に変換される.次に,その記述文がファイルや外部プログラムもしくは他の出力ストリームに送られる.

グラフィックスのPostScript形式への変換

大域変数 $DisplayFunctionのデフォルト値は Function[ Display[$Display, #] ]になっている.この設定で Show Plot等の関数を使いグラフィックスオブジェクトを生成すると,描画内容がPostScript 形式に変換され,大域変数 $Displayに指定してあるストリームに出力される.変数 $Display Mathematicaのセッションの初期化時に適切な値に設定される.

PostScript記述文の逐語的挿入

PostScriptで得られるグラフィックス機能のほとんどは, Mathematicaの標準的な2Dグラフィックスプリミティブを使い実現することができる.しかし,直接PostScriptの命令を使う必用がある場合もある.そのようなときは,Mathematica2Dグラフィックスプリミティブ PostScriptを使うことができる.

PostScriptに引数として与えた各構文(文字列)は Display関数の生成するPostScriptコードにそのまま追加されていく. PostScriptを使う際は細心の注意を払う必要ある. PostScriptの処理終了時には処理開始時のスタック状態になっていなければいけない.また,描画位置を指定するにはPostScript出力に使う Mathematicaの座標尺度が分からないとできない.さらに,特殊なPostScriptのプリミティブを使うと,実際の表示処理を行うPostScriptインタープリタが対応していないためうまく表示されない場合もある.

ベジェ曲線を引かせるPostScriptの命令文をグラフィックスのオブジェクトに加えておく.

In[1]:= Show[Graphics[ {
PostScript[".008 setlinewidth"],
PostScript[".1 .1 moveto"],
PostScript["1.1 .6 -.1 .6 .9 .1 curveto stroke"] },
Frame -> True]]

Out[1]=

Graphics3DのオブジェクトがPostScript記述に変換されると,2つある出力形式のどちらかが使われる.使われる形式はオプション RenderAllで指定しておくことが可能である.

基本的には,3Dオブジェクトを形成している多角形をどう描画するかで出力形式が決まる.デフォルトの RenderAll -> Trueの条件だと,指定したすべての多角形が描画される.また,奥の方にある多角形から描画されるので,描画終了時には手前の方にある多角形だけが見えることになる.それでも,モニター上に表示するときは,描画中には後方の多角形も一瞬は見えるだろう.

しかし,この方法だと,多角形が多く重なるオブジェクトではPostScriptの出力コードに最終表示に現れない余計な多角形が多数含まれてしまい非効率的である.そこで,これを回避するため, RenderAll -> Falseと指定し, Mathematicaに実際に表示される多角形だけを出力するよう指示できるようになっている.交差する多角形が少ないときはこの方法でPostScriptの出力コード量を減らすことができる.ただし,処理時間は余計にかかるかもしれない.

3Dグラフィックスの描画形態の指定

3DオブジェクトをPostScriptで記述するとオブジェクトの奥行きに関する情報が失われてしまう.しかし時には外部プログラムに奥行きに関する情報を送りたい場合もあるだろう.多くの場合は Graphics3Dオブジェクトをそのままの形で出力するだけでうまくいくが,使うプログラムによっては交差した多角形を扱えないものもある.そこで,関数 Graphics3Dは, PolygonIntersectionsと呼ばれるオプションを使い交差部の処理をするかしないかの指定ができるようになっている. Showで表示させる際に,このオプションをオフにしておけば(PolygonIntersections -> False) ViewPoint等の条件により交差してしまう多角形があると,小さな部分に分解し交差部分が解消した形に変換される.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.