99.33 隠線処理 (hidden3d)

set hidden3d コマンドは曲面描画 (以下参照: splot (p. [*])) で隠線処理を行な うように指示します。その処理の内部アルゴリズムに関する追加機能もこのコ マンドで制御できます。

書式:

     set hidden3d {defaults} |
                  { {front|back}
                    {{offset <offset>} | {nooffset}}
                    {trianglepattern <bitpattern>}
                    {{undefined <level>} | {noundefined}}
                    {{no}altdiagonal}
                    {{no}bentover} }
     unset hidden3d
     show hidden3d

gnuplot の通常の表示とは異なり、隠線処理では与えられた関数、またはデー タの格子線を、実際の曲面がその曲面の背後にあって隠されている描画要素は 見せないのと同じように処理します。これが機能するためには、その曲面が '格子状' (以下参照: splot datafile (p. [*])) である必要があり、またそれらは with lineswith linespoints で描かれていなければいけません。

hidden3d が有効なときは、格子線だけでなく、面部分や土台の上の等高線 (以下参照: set contour (p. [*])) も隠されます。複数の面を描画している場合は、 各曲面は自分自身と他の曲面で隠される部分も持ちます。曲面上への等高線の 表示 (set contour surface) は機能しません。

グラフ上に曲面が一つもない状態でも、hidden3d は points, labels, vectors, impulses の 3 次元の描画スタイルに影響を与えます。 vectors は、隠されない部分は線分 (矢先なし) として表示されます。グラ フ内の各々の描画をこの処理から明示的に除外したいときは、with 指定に 特別のオプション nohidden3d を追加してください。

hidden3d は、pm3d モードで描画された、単色塗りの曲面には影響を与えませ ん。pm3d の曲面に対して同様の効果を純粋に得たいならば、これの代わりに set pm3d depthorder を使ってください。複数の pm3d 曲面に通常の hidden3d 処理を組み合わせるには、オプション set hidden3d front を 使用してください。これは、hidden3d 処理の全ての要素を、pm3d 曲面を含む 残りの他の描画要素の後に強制的に描画するものです。

関数値は格子孤立線の交点で評価されます。見ることの出来る線分を求めると きは個々の関数値、あるいはデータ点の間はそのアルゴリズムによって線形補 間されます。これは、hidden3d で描画する場合と nohidden3d で描画す る場合で関数の見かけが異なることを意味します。なぜならば、後者の場合関 数値は各標本点で評価されるからです。この違いに関する議論については、 以下参照: set samples (p. [*]), set isosamples (p. [*])

曲面の隠される部分を消去するのに使われるアルゴリズムは、このコマンドで 制御されるいくつかの追加オプションを持っています。defaults を指定す ればそれらはすべて、以下で述べるようなデフォルトの値に設定されます。 defaults が指定されなかった場合には、明示的に指定されたオプションの みが影響を受け、それ以外のものは以前の値が引き継がれます。よって、それ らのオプションの値をいちいち修正することなく、単に set {no}hidden3d のみで隠線処理をオン/オフできることになります。

最初のオプション offset は '裏側' の線を描画する線の線種に影響を与え ます。通常は曲面の表裏を区別するために、裏側の線種は、表側の線種より一 つ大きい番号の線種が使われます。offset <offset> によって、その追加す る値を、デフォルトの 1 とは異なる増分値に変更できます。nooffset オプ ションは offset 0 を意味し、これは表裏で同じ線種を使うことになります。

次のオプションは trianglepattern <bitpattern> です。<bitpattern> は 0 から 7 までの数字で、ビットパターンと解釈されます。各曲面は三角形に 分割されますが、このビットパターンの各ビットはそれらの三角形の各辺の表 示を決定します。ビット 0 は格子の水平辺、ビット 1 は格子の垂直辺、ビッ ト 2 は、元々の格子が 2 つの三角形に分割されるときの対角辺です。デフォ ルトのビットパターンは 3 で、これは全ての水平辺と垂直辺を表示し、対角 辺は表示しないことを意味します。対角辺も表示する場合は 7 を指定します。

オプション undefined <level> は、定義されていない (欠けているデータ または未定義の関数値) か、または与えられた x,y,z の範囲を超えているデ ータ点に適用させるアルゴリズムを指示します。そのような点は、それでも 表示されてしまうか、または入力データから取り除かれます。取り除かれて しまう点に接する全ての曲面要素は同様に取り除かれ、よって曲面に穴が生 じます。<level> = 3 の場合、これは noundefined と同じで、どんな点も 捨てられません。これは他の場所であらゆる種類の問題を引き起こし得るので 使わないべきです。<level> = 2 では未定義の点は捨てられますが、範囲を超 えた点は捨てられません。<level> = 1 では、これがデフォルトですが、範囲 を超えた点も捨てられます。

noaltdiagonal を指定すると、undefined が有効のとき (すなわち <level> が 3 でない場合) に起こる以下の場合のデフォルトでの取扱いを変更できます。入力曲面の各格子状の部分は一方の対角線によって 2 つの三角形に分割 されます。通常はそれらの対角線の全てが格子に対して同じ方向を向いていま す。もし、ある格子の 4 つの角のうち一つが undefined 処理によりとり除 かれていて、その角が通常の方向の対角線に乗っている場合は、その両方の三 角形が取り除かれてしまいます。しかし、もしデフォルトの設定である altdiagonal が有効になっている場合、その格子については他方向の対角線 が代わりに選択され、曲面の穴の大きさが最小になるようにします。

bentover オプションは今度は trianglepattern とともに起こる別のこと を制御します。かなりしわくちゃの曲面では、下の ASCII 文字絵に書いたよ うに、曲面の 1 つの格子が 2 つに分けられた三角形の表と裏の反対側が見え てしまう場合 (すなわち、元の四角形が折り曲げられている ('bent over') 場合) があります:


                                                             C----B
        元の 4 角形:     A--B      表示される 4 角形:        |\   |
     ("set view 0,0")    | /|    ("set view 75,75" perhaps)  | \  |
                         |/ |                                |  \ |
                         C--D                                |   \|
                                                             A    D

曲面の格子の対角辺が <bitpattern> の 2 bit によって見えるようにはなっ てはいない場合、上の対角辺 CB はどこにも書かれないことになり、それが結 果の表示を理解しにくいものにします。デフォルトで定義される bentover オプションは、このような場合それを表示するようにします。もしそうしたく ないなら、nobentover を選択してください。 以下も参照 隠線処理のデモ (hidden.dem)

および 複雑な隠線のデモ (singulr.dem).

竹野茂治@新潟工科大学
2020-05-27