# surface_properties

3次元エンティティプロパティの説明

## 説明

Surfaceエンティティはグラフィックエンティティ階層の葉です. この型のエンティティの元には, プロットを行う関数またはデータの入力手段により 2つのクラス：`Plot3d` および `Fac3d` が現れます. `Fac3d` および `Plo3d` エンティティは 似ていますが,`Fac3d`はより完全で, `Plot3d`よりも多くのオプションを指定できます. `Fac3d`エンティティを常に有するようにするには, `plot3d`を使用する前に `genfac3d`により行列を事前に構築するか, `surf`コマンドを使用します.

以下にsurfaceエンティティに含まれるプロパティを示します:

parent:

  このフィールドには親のハンドルが含まれます. polylineエンティティの親は`"Axes"` 型または `"Compound"`型です.

children:

  このプロパティにはこのハンドルの`children` のベクトルが含まれます. しかし,現在,surfaceハンドルには`children`がありません.

visible:

  このフィールドはこのエンティティの`visible` プロパティの値を有します. 値は`"on"` または `"off"`となります. デフォルトで polyline は可視であり,プロパティの値は `"on"` となります. `"off"` の場合, この3次元グラフィックは画面に描画されません.

surface_mode:

  このフィールドは `surface_mode` プロパティのデフォルト値を有します. その値は `"on"` (曲面を描画 ) または `"off"` (曲面を描画しない)とします.

foreground:

  `color_mode >= 0`の場合, このフィールドは縁を描画する際に色インデックスを有します. そうでない場合,foregroundは全く使用されません. foregounrdの値には(カレントのカラーマップに基づく)整数の色インデックスを指定します.

thickness:

  このプロパティは正の実数で,小平面の輪郭の幅をピクセル単位で指定します. 実際の表示幅は指定した幅を最も近い整数に丸めることにより定義されます. 唯一の例外はベクトル単位のエキスポートで,全体の `thickness`の値が考慮されます.

mark_mode:

  このフィールドはsurfaceの`mark_mode` プロパティのデフォルト値を有します. この値は`"on"` (マーカを描画 drawn) または `"off"` (マーカを描画しない)となります.

mark_style:

  `mark_style`プロパティの値は `mark_mode`プロパティが`"on"`の場合に, 使用するマーカの種類を選択するために使用されます. この値は[0 14]の範囲の整数で,それぞれ以下の意味があります : ドット,プラス,十字,星,塗りつぶした菱形, 上向き三角形, 下向き三角形, 菱形プラス,円,アスタリスク, 正方形,右向き三角形,左向き三角形およびペンタグラム. 以下の図は,マーカのアスペクトが`mark_style`, `mark_foreground` および `mark_background`プロパティに依存する ことを示します.

mark_size_unit:

  このフィールは`mark_size_unit`プロパティのデフォルト値 を有します.`mark_size_unit`が`"point"` に設定された場合,`mark_size`の値はポイント単位で直接 指定されます. `mark_size_unit` に`"tabulated"`が 指定された場合,`mark_size`はfont size配列に相対的に 計算されます: この場合,この値は, 8pt, 10pt, 12pt, 14pt, 18pt および 24pt を意味する [0 5]の範囲の整数とします. xrectおよび Scilabのネーティブ関数は `tabulated`モードをデフォルトとします; plot関数を使用する場合, `point` モードが自動的に有効となります.

mark_size:

  `mark_size`プロパティは, `mark_mode`プロパティが`"on"`の時, マーカの大きさを選択するために使用されます. この値は, 8pt, 10pt, 12pt, 14pt, 18pt および 24pt を意味する [0 5]の範囲の整数です.

mark_foreground:

  このフィールドは,マーカの縁の色である`mark_foreground` プロパティの値を有します.この値は(カレントのcolor_mapに関連する)色インデックス または透過エッジを意味する 0 とします.

mark_background:

  このフィールドは,マーカの縁の色である`mark_foreground` プロパティの値を有します.この値は(カレントのcolor_mapに関連する)色インデックス または透過エッジを意味する 0 とします.

data:

  このフィールドは,"3次元"型の`tlist`データ構造体 を定義します. この構造体は, x, yおよびz座標をそれぞれ `data.x`,`data.y` および `data.z` に含む各要素の行および列インデックスから構成されます. 実際のcolorベクトルまたは行列が指定された場合, `data.color`という名前の相補フィールドが利用可能です. 指定されない場合,`data.color`は利用できません. 曲面は`color_mode` および`color_flag` プロパティに基づき塗りつぶされます.

color_mode:

  `[-size(colormap) ; size(colormap)]`の範囲の整数で, `color_flag`の値が`0`の時, 小平面の色を定義します. 前記のように, `color_mode > 0` の時, `foreground`色により,縁が描画されます. `color_mode` が `0`に設定された場合, 曲面のメッシュが描画されます: 表面には色がありません. 最後に,`color_mode < 0`の時, 表面は色`-color_mode`で塗られますが, 縁は表示されません.

color_flag:

  このフィールドは小平面の色を設定するために使用される アルゴリズムを指定する際に使用されます.

  `color_mode`, `foreground` および `hiddencolor`に 関する規則はこの場合にも適用されます.

  - `color_flag == 0`

    - 全ての小平面はcolorインデックスおよび `color_mode`で定義された手法により 塗りつぶされます(上記参照).

  - `color_flag == 1`

    - 全ての小平面は `z`に比例する小平面毎に1つのインデックスを 用いて塗りつぶされます. `z`の最小値はインデックス1の色で塗られ, `z`の最大値は最も大きなインデックスの色で塗られます. 加えて,小平面の縁も`color_mode`の値に基づき 塗られます(上記参照).

  - 残る3つのケース(`color_flag``== 2,3 または 4` )は,`Fac3d`エンティティを指定した場合のみ 利用可能です. 次に,`data.color`の値は(存在する場合,)小平面の色を (カレントのカラーマップのインデックスで) 設定するために使用されます そうでない場合, 小平面を塗りつぶす際に カレントの`color_mode`が使用されます.

  - `color_flag == 2 ('フラット' シェーディング)`

    - 全ての小平面は`data.color`プロパティで 指定した色インデックスにより塗りつぶされます (小平面毎に1つの色が必要):

    - `data.color` は `color`ベクトルを 有します: `color(i)` が正の場合, 小平面`i`の色を指定します. 小平面の境界はカレントの線種と色で描画されます. `color(i)` が負の場合,色id `-color(i)` が使用され,小平面の境界は描画されません.

      `data.color` は大きさ(nf,n)のcolor行列を 有します.ただし,`n` は小平面の数, `nf`はポリゴン小平面を定義する点の数を意味します. `nf`個の頂点が各小平面を定義する場合, アルゴリズムは(colorインデックス行列の)各色インデックスの `平均値`を計算します: 同じ小平面の`nf`個の頂点は同じ色インデックスの値を有します.

  - `color_flag == 3 ('補間' シェーディング)`

    - 小平面は頂点の色を補間した結果に基づき塗りつぶされます. 頂点の色のインデックスは`data.color`プロパティで 指定されます (各頂点毎に1つの色が必要). 以下の2種類のケースがありえます:

    - `data.color` が `colors` ベクトルを有する場合 : この場合, 補間シェーディングモードを完成するにはデータが少なすぎます. この処理を行うには,大きさ (nf,n) のcolor行列が必要です (ただし, `n` は小平面の数, `nf`はポリゴン小平面を定義する点の数を意味します). 各小平面について,このアルゴリズムは, 単一の小平面のcolorインデックスの値を,小平面の境界を定義する `nf`個の頂点の色インデックスにコピーします.

      `data.color` が大きさ(nf,n)の色行列を有する場合 (前記の `nf` および `n`の定義参照), 補間シェーディングモードはこれらの色インデックスにより完了することが できます.

  - `color_flag == 4 (Matlabライクな 'フラット' シェーディング)`

    - `color_flag==2`と同じですが, `data.color`が行列の場合,わずかな違いがあります. 全ての小平面は`data.color`プロパティで 指定された色インデックスにより塗りつぶされます (各小平面について1つの色が必要). 以下の2つのケースがありえます:

    - `data.color` が `colors` ベクトルを有する場合 : `color(i)`が正の場合, この値は小平面`i`の色を指定し, 小平面の境界はカレントの線種と色で描画されます. `color(i)`が負の場合, 色ID `-color(i)` が使用され,小平面の境界は 描画されません.

      `data.color` は大きさ(nf,n)の色行列を有します. ただし, `n` は小平面の数, `nf`はポリゴン小平面を定義する点の数を意味します. `nf` 個の頂点が各小平面を定義する場合, アルゴリズムはパッチ(小平面)を定義する最初の頂点の色を使用します.

cdata_mapping:

  `Fac3dハンドルの仕様`. `'scaled'` または `'direct'`を値とする文字列. `data.color` が設定されている場合, 各インデックス色データは各頂点に単一の値を指定します. `cdata_mapping` は, これらのインデックスをカレントのカラーマップに線形にマップするようにスケーリングするか (`'scaled'` モード), このカラーマップを直接参照するか(`'direct`' モード)のどちらかを 選択します. このプロパティは`color_flag`が `2`,`3` または `4`に等しい時に有用です.

hiddencolor:

  このフィールドは曲面の小平面の背景を描画する際に使用される 色インデックスを有します. この値は正の整数(カレントのカラーマップの色インデックス)とします. この値が負の場合,"visible"平面以外に同じ色が背面側に適用されます.

clip_state:

  このフィールドはsurfaceの`clip_state`プロパティの 値を有します. 値は以下となります:

  - `"off"` surfaceはクリップされません.

  - `"clipgrf"` surfaceはAxesボックスの外側でクリップ されます.

  - `"on"`surfaceはclip_boxプロパティで 指定された矩形の外側でクリップされます.

clip_box:

  このフィールドは`clip_box`プロパティを定義します. clip_state が "off" の場合, デフォルトで,この値は空の行列です. その他の場合, ベクトル`[x,y,w,h]` (左上の点 幅 高さ) は表示する曲面の部分を定義しますが, `clip_state`プロパティの値が変更されます.

user_data:

  このフィールドはsurfaceデータ構造体に任意のScilab変数を 保存し,再度取得する際に使用できます.

## 例

    //図を作成
    t=[0:0.3:2*%pi]'; z=sin(t)*cos(t');
    [xx,yy,zz]=genfac3d(t,t,z);
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    h=get("hdl") //カレントのエンティティ(ここではsurface)のハンドルを取得
    a=gca(); //get current axes
    a.rotation_angles=[40,70];
    a.grid=[1 1 1];
    //グリッドを作成
    a.data_bounds=[-6,0,-1;6,6,5];
    a.axes_visible="off";
    //軸は隠されている a.axes_bounds=[.2 0 1 1];
    f=get("current_figure");
    //親の図のハンドルを取得
    f.color_map=hotcolormap(64);
    //図のカラーマップを変更
    h.color_flag=1;
    //z に基づく色
    h.color_mode=-2;
    //小平面境界を削除
    h.color_flag=2;
    //指定色に基づく色
    h.data.color=[1+modulo(1:400,64),1+modulo(1:400,64)];
    //影付き
    h.color_flag=3;

    scf(2); // 2番目のウインドウを作成し,surfコマンドを使用
    subplot(211)
    surf(z,'cdata_mapping','direct','facecol','interp')

    subplot(212)
    surf(t,t,z,'edgeco','b','marker','d','markersiz',9,'markeredg','red','markerfac','k')
    e=gce();
    e.color_flag=1 // 高度 (z座標)に比例する色インデックス
    e.color_flag=2; // デフォルトモードに戻す
    e.color_flag= 3; // 補間影モード (data.colorフィールドが指定されていないため,デフォルトの青色に基づく)

## 参照

- set
- get
- delete
- plot3d
- plot3d1
- plot3d2
- surf
- graphics_entities