# plot3d

曲面の3次元プロット

## 呼び出し手順

    plot3d(x,y,z,[theta,alpha,leg,flag,ebox])
                plot3d(x,y,z,<opt_args>)

                plot3d(xf,yf,zf,[theta,alpha,leg,flag,ebox])
                plot3d(xf,yf,zf,<opt_args>)

                plot3d(xf,yf,list(zf,colors),[theta,alpha,leg,flag,ebox])
                plot3d(xf,yf,list(zf,colors),<opt_args>)

## 引数

x,y

  大きさ n1 および n2の行ベクトル (x軸およびy軸座標). これらの座標は単調である必要があります.

z

  大きさ (n1,n2)の行列. `z(i,j)` は点(x(i),y(j))における 曲面の値です.

xf,yf,zf

  大きさ (nf,n)の行列. 曲面を描画する際に使用される小平面を定義します. `n`個の小平面があります. 各小平面 `i` は`nf`個の点を有するポリゴンで定義されます. i番目の小平面の点のx軸,y軸,z軸座標はそれぞれ`xf(:,i)`, `yf(:,i)` および `zf(:,i)`により指定されます.

colors

  大きさnのベクトルで,各小平面の色を指定します,もしくは, 大きさ(nf,n)の行列で各小平面の境界近傍の色を指定します (小平面の色は補間されます).

<opt_args>

  一連の命令`key1=value1, key2=value2` ,...を表し, `key1`, `key2,...` は以下のどれかとすることができます: theta, alpha ,leg,flag,ebox (以下の定義を参照).

theta, alpha

  観測点の球座標を指定する実数値(単位:度).

leg

  各軸のラベルを定義する文字列. @ をフィールドセパレータとし, "X@Y@Z"のようになります.

flag

  大きさ3の実数ベクトル. `flag=[mode,type,box]`.

  mode

    整数 (曲面の色).

    mode>0

      曲面は色`"mode"`で塗られます ; 小平面の境界はカレントの線種と色で描画されます.

    mode=0:

      曲面のメッシュが描画されます.

    mode<0:

      曲面は色`"-mode"`で塗られます ; 小平面の境界は描画されません.

      曲面の色の取り扱いは, surfaceエンティティプロパティによる `color_mode`および `color_flag`オプションを用いて 行われることに注意してください (surface_properties参照).

  type

    整数 (スケール).

    type=0:

      プロットは (前の`param3d`, `plot3d`, `contour` または `plot3d1`のコールで設定された) カレントの3次元スケールで行われます.

    type=1:

      3次元ボックスのスケールがアスペクト比の最大値に基づき 自動的に調整され, 境界はオプションの引数`ebox`の値で 指定されます.

    type=2:

      3次元ボックスのスケールがアスペクト比の最大値に基づき 自動的に調整され, 境界は指令したデータにより計算されます.

    type=3:

      オプション`ebox`で指定したボックス境界を有する 3次元等軸プロットで,`type=1`に似ています.

    type=4:

      データで定義された境界に基づく3次元等軸プロットで, `type=2`に似ています.

    type=5:

      オプション`ebox`で指定されたボックス境界で 定義された境界に基づく3次元拡張等軸プロットで, `type=1`に似ています.

    type=6:

      データで定義された境界に基づく3次元拡張等軸プロットで, `type=2`に似ています. 軸の境界は axes エンティティプロパティによりカスタマイズできる ことに注意してください(axes_properties参照).

  box

    整数 (プロットの周囲のフレーム).

    box=0:

      プロットの周囲に何も描画されません.

    box=1:

      実装されていません (box=0と同様).

    box=2:

      曲面の背後の軸のみが描画されます.

    box=3:

      曲面を囲うボックスが描画され,キャプションが追加されます.

    box=4:

      曲面を囲うボックスが描画され,キャプションと軸が追加されます.

      軸のアスペクトもaxesエンティティのプロパティによりカスタマイズ できることに注意してください (axes_properties参照).

ebox

  プロットの境界をベクトル `[xmin,xmax,ymin,ymax,zmin,zmax]`で指定します. この引数は,`flag`の`type`が`1`, `3` または `5`に設定された場合, 使用されます (対応する動作については上記参照). `flag` が指定されない場合 `ebox` は無視されます.

  指定された場合, `ebox`引数は, `data_bounds`に基づいて動作し, axesエンティティのプロパティによりリセットすることも可能であることに 注意してください. ebox のデフォルト値は[0,1,0,1,0,1]です.(axes_properties参照)

## 説明

`plot3d(x,y,z,[theta,alpha,leg,flag,ebox])` は パラメータ表現の曲面 `z=f(x,y)`を描画します.

`plot3d(xf,yf,zf,[theta,alpha,leg ,flag,ebox])` は小平面の集合で定義された曲面を描画します. `xf`, `yf` および `zf`を `[xf1 xf2 ...]`, `[yf1 yf2 ...]` および `[zf1 zf2 ...]`のように行単位で集約した 複数の行列で置き換えることにより 複数のプロットを描画することができます. データはsurfaceエンティティパラメータにより設定または取得できること に注意してください (surface_properties参照).

小平面の色を`zf`ではなく`list(zf,colors)` により指定することができます. ただし,`colors` は大きさ`n`の ベクトルです. `colors(i)` が正の場合,この値が小平面`i`の 色を指定し,小平面の境界はカレントの線種と色で描画されます. `colors(i)` が負の場合, 色ID `-colors(i)`が使用され,小平面の境界は描画されません.

小平面に補間された色を適用することも可能です. この場合, color 引数は nf x n の行列とする必要があり,その要素は 各小平面の極回近傍の色を指定します. この場合, 正の値の色は境界が描画されないことを意味します. 色は( `tlist` affectationsにより) surface エンティティプロパティでも設定可能であり, `color_flag`オプションにより編集可能です ( surface_properties参照).

オプションの引数 `theta, alpha, leg ,flag, ebox` ,を一連の命令 `key1=value1, key2=value2`, ...により指定することができます. この場合,順番は任意です. これらの`flag`以外のオプションの引数は axesエンティティプロパティによりカスタマイズできます (see axes_properties参照). 前述の通り, `flag` オプションは `mode`についてはsurfaceエンティティプロパティ( surface_properties参照) , `type` および`box`については axes プロパティ (axes_properties参照) で扱うことができます.

曲面`z=f(x,y)`から4角形の小平面を計算する際に 関数`genfac3d`を使用することができます. `eval3dp` も使用できます.

コマンド `plot3d()` を入力するとデモを参照できます.

## 例

plot3d();

## 例

    //  z=f(x,y) による簡単な例
    t=[0:0.3:2*%pi]';
    z=sin(t)*cos(t');
    plot3d(t,t,z)
    // genfac3dにより計算された小平面を用いて同じ図をプロット
    [xx,yy,zz]=genfac3d(t,t,z);
    clf()
    plot3d(xx,yy,zz)
    // 複数のプロット
    clf()
    plot3d([xx xx],[yy yy],[zz 4+zz])
    // カラーで複数のプロット
    clf()
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    // 視点とキャプションを指定してプロット
    clf()
    plot3d(1:10,1:20,10*rand(10,20),alpha=35,theta=45,flag=[2,2,3])
    // eval3dp で計算された小平面により球をプロット
    deff("[x,y,z]=sph(alp,tet)",["x=r*cos(alp).*cos(tet)+orig(1)*ones(tet)";..
         "y=r*cos(alp).*sin(tet)+orig(2)*ones(tet)";..
         "z=r*sin(alp)+orig(3)*ones(tet)"]);
    r=1; orig=[0 0 0];
    [xx,yy,zz]=eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
    clf();plot3d(xx,yy,zz)
    clf();
    f=gcf();
    f.color_map = hotcolormap(128);
    r=0.3;orig=[1.5 0 0];
    [xx1,yy1,zz1]=eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
    cc=(xx+zz+2)*32;cc1=(xx1-orig(1)+zz1/r+2)*32;
    clf();plot3d1([xx xx1],[yy yy1],list([zz,zz1],[cc cc1]),theta=70,alpha=80,flag=[5,6,3])

    delete(gcf());
    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)]))
    e=gce();
    f=e.data;
    TL = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,6*rand(f.z)); // ランダムな色の行列
    e.data = TL;
    TL2 = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,4*rand(1,800)); // ランダムな色のベクトル
    e.data = TL2;
    TL3 = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,[20*ones(1,400) 6*ones(1,400)]);
    e.data = TL3;
    TL4 = tlist(["3d" "x" "y" "z"],f.x,f.y,f.z); // no color
    e.data = TL4;
    e.color_flag=1 // 高度 (z座標)に比例する色インデックス
    e.color_flag=2; // デフォルトモードに戻る
    e.color_flag= 3; // 補間陰影モード (デフォルト色の青に基づく)
    clf()
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    h=gce(); //カレントのエンティティ(ここでは曲面)のハンドルを取得
    a=gca(); //カレントの軸を取得
    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];
    h.color_flag=1; //色は zに比例
    h.color_mode=-2;  //color_modeを白色に設定することにより小平面の境界を削除
    h.color_flag=2; //指定した色に基づく色
    h.color_mode = -1; //color_modeを黒色に設定することにより小平面の境界を戻す
    f=gcf();//親のfigureのハンドルを取得
    f.color_map=hotcolormap(512);
    c=[1:400,1:400];
    TL.color = [c;c+1;c+2;c+3];
    h.data = TL;
    h.color_flag=3; // 補間陰影モード

一連のパッチ(3角形,4角形,など)をプロットする際にplot3d関数を使用することができます.

    // パッチを描画するe plot3d 関数:
    // patch(x,y,[z])
    // patch(x,y,[list(z,c)])
    // x の大きさ: パッチの点の数 x パッチの数
    // y および z は x と同じ大きさ
    // c:
    // - パッチの数を大きさとするベクトル: パッチの色
    // - 大きさがパッチの点の数 x パッチの数の行列
    //   : 各パッチの各点の色

    // 例 1: 3角形パッチの集合

    x = [0 0;
         0 1;
         1 1];

    y = [1 1;
         2 2;
         2 1];

    z = [1 1;
         1 1;
         1 1];

    tcolor = [2 3]';

    subplot(2,2,1);
    plot3d(x,y,list(z,tcolor));
    xtitle('A triangle set of patches');

    // 例2: 3角形および4角形パッチが混在

    xquad = [5, 0;
             10,0;
             15,5;
             10,5];

    yquad = [15,0;
             20,10;
             15,15;
             10,5];

    zquad = ones(4,2);

    xtri = [ 0,10,10, 5, 0;
            10,20,20, 5, 0;
            20,20,15,10,10];

    ytri = [ 0,10,20, 5,10;
            10,20,20,15,20;
             0, 0,15,10,20];

    ztri = zeros(3,5);

    subplot(2,2,3);
    plot3d(xquad,yquad,zquad);
    plot3d(xtri,ytri,ztri);
    xtitle('Mixing triangle and quadrangle set of patches');

    // 例3: いくつかのうさぎ

    rabxtri = [ 5,  5, 2.5,  7.5, 10;
                5, 15, 5,   10,   10;
               15, 15, 5,   10,   15];

    rabytri = [10, 10, 9.5,  2.5, 0;
               20, 10, 12,   5,   5;
               10   0   7    0    0];
    rabztri = [0,0,0,0,0;
               0,0,0,0,0;
               0,0,0,0,0];

    rabtricolor_byface = [2 2 2 2 2];

    rabtricolor = [2,2,2,2,2;
                   3,3,3,3,3;
                   4,4,4,4,4];

    rabxquad = [0, 1;
                0, 6;
                5,11;
                5, 6];

    rabyquad = [18,23;
                23,28;
                23,28;
                18,23];

    rabzquad = [1,1;
                1,1;
                1,1;
                1,1];

    rabquadcolor_byface = [2 2];

    rabquadcolor = [2,2;
                    3,3;
                    4,4;
                    5,5];

    subplot(2,2,2);
    plot3d(rabxtri, rabytri, list(rabztri,rabtricolor));
    plot3d(rabxquad,rabyquad,list(rabzquad,rabquadcolor));
    h = gcf();
    h.children(1).background = 1;
    xtitle('A psychedelic rabbit set of patches');

    subplot(2,2,4);
    plot3d(rabxtri, rabytri, list(rabztri,rabtricolor_byface));
    plot3d(rabxquad,rabyquad,list(rabzquad,rabquadcolor_byface));
    h = gcf();
    h.children(1).background = 1;
    xtitle('A standard rabbit set of patches');

頂点と面により一連のパッチをプロットするために plot3d関数を使用することもできます.

    // 頂点 / 面の例: 3次元の例

    // 各パッチを構成するユニークな点の一覧を有する頂点のリスト
    // 2つのパッチに共通な点は頂点のリストで反復されません

    vertex = [0 1 1;
              0 2 2;
              1 2 3;
              1 1 4];

    // 頂点のリストはどの点がパッチを構成するかを示します.
    face = [1 2 3;
            1 3 4];

    tcolor = [2 3]';

    // x, y, z のリストで表された頂点/面を変換する際に使用される式

    xvf = matrix(vertex(face,1),size(face,1),length(vertex(face,1))/size(face,1))';
    yvf = matrix(vertex(face,2),size(face,1),length(vertex(face,1))/size(face,1))';
    zvf = matrix(vertex(face,3),size(face,1),length(vertex(face,1))/size(face,1))';

    scf();
    subplot(2,1,1);
    plot3d(xvf,yvf,list(zvf,tcolor));
    xtitle('A triangle set of patches - vertex / face mode - 3d');

    // 2次元のテスト
    // 0 Z 値を有する3次元表現を使用した後, 2次元表現に切り替えます

    // 頂点/面の例: 3次元の例

    // 頂点のリストには各パッチを構成するユニークな点の一覧を有します
    // 2つのパッチに共通する点は頂点のリスト内で繰り返されません

    vertex = [0 1;
              0 2;
              1 2;
              1 1];

    // 頂点のリストはどの点がパッチを構成するかを示します.
    face = [1 2 3;
            1 3 4];

    // x, y, z のリストで表された頂点/面を変換する際に使用される式

    xvf = matrix(vertex(face,1),size(face,1),length(vertex(face,1))/size(face,1))';
    yvf = matrix(vertex(face,2),size(face,1),length(vertex(face,1))/size(face,1))';
    zvf = matrix(zeros(vertex(face,2)),size(face,1),length(vertex(face,1))/size(face,1))';

    subplot(2,1,2);
    plot3d(xvf,yvf,list(zvf,tcolor));
    xtitle('A triangle set of patches - vertex / face mode - 2D');
    a = gca();
    a.view = '2d';

マニュアルで目盛を設定する方法

    plot3d();
    h = gca();
    h.x_ticks = tlist(['ticks','locations','labels'],[-2,-1,0,1,2],['-2','-1','0','1','2']);
    h.y_ticks = tlist(['ticks','locations','labels'],[-4,-3-2,-1,0,1,2,3,4],['-4','-3','-2','-1','0','1','2','3','4']);
    h.z_ticks = tlist(['ticks','locations','labels'],[-1,0,1],['Point 1','Point 2','Point 3']);

## 参照

- eval3dp
- genfac3d
- geom3d
- param3d
- plot3d1
- clf
- gca
- gcf
- xdel
- delete
- axes_properties