3次元グラフ(工事中)

以下の解説は私のカスタマイズ用ファイルの使用を前提とします。

yorickのデフォルトの3次元曲面プロット関数はplwf, pl3surf, pl3treeがあります.
plwfは2次元メッシュ(x-y)の各頂点に値(z)がある場合にzを高さとして表示します. それに対してpl3surfは3次元の多角形の集合として曲面を表現するので閉曲面など も表示できます. pl3treeは複数の3次元物体を樹構造にまとめて隠面処理を行ってくれます.

描画関数

簡易曲面:plwf
曲面:pl3surf
複数の曲面:pl3tree
・関数z=f(x,y)のプロット:fp2
・チューブ:tube3
・コーン:corn3
・曲線:plg3
・曲面をその曲面上の関数の等高線で色分け表示:lcontour
・ポリゴン曲面のスムージング表示:lcon3
・高さで色分けされた曲面:plfc3
など(追加予定)

その他の関数

・マウスで回転させる:ro
・ポリゴン曲面の切断:slice2
・3次元等高面の生成:slice3
・ポリゴン曲面データの読み書き:read_poly, write_poly
など(追加予定)

plwf:簡易曲面

win2,400,400;   /* ウィンドウを表示(既に表示されている場合は不要) */
win3; /* 3Dグラフ用のウィンドウの初期設定 */
x= span(-3,3,128)(,-:1:128); /* xの値の2次元配列を作る  */
y= transpose(x); /* xを転置してyの2次元配列を作る  */
z= 0.5*sin(3*sqrt(x^2+y^2)+0.2)*cos((x-y+sin(0.1))); /* zをxとyの関数として計算  */
fma; /* キャンバスのクリア  */
plwf,z,y,x,shade=1,edges=0; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
limit3,-3,3,-3,3,-1,1; /* 箱の指定 */
cage3,1; /* 箱の表示  */
limits; /* 最大表示にする  */
orient3; /* 角度の調整  */
draw3,1; /* 描画 */
scale,0.9; /* スケールの調整 */

補足


pl3surf:曲面

win2,400,400;   /* ウィンドウを表示(既に表示されている場合は不要) */
win3; /* 3Dグラフ用のウィンドウの初期設定 */
read_poly,nv,xyzv,"~/Yorick/poly/kuti.poly"; /* ポリゴン曲面のデータの読み込み  */
pal,"cr"; /* パレットの指定  */
fma; /* キャンバスのクリア  */
pl3surf,nv,xyzv; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
limits; /* 最大表示にする  */
lim3,1.5; /* 箱の大きさの指定 */
cage3,1; /* 箱の表示  */
orient3; /* 角度の調整  */
setz3,7; /* 遠近法の適用 */
draw3,1; /* 描画 */
scale,0.9; /* スケールの調整  */

補足

plwfの例で描画した曲面は、以下のようにpl3surfで描画することもできます。
win2,400,400;   /* ウィンドウを表示(既に表示されている場合は不要) */
win3; /* 3Dグラフ用のウィンドウの初期設定 */
x= span(-3,3,128)(,-:1:128); /* xの値の2次元配列を作る  */
y= transpose(x); /* xを転置してyの2次元配列を作る  */
z= 0.5*sin(3*sqrt(x^2+y^2)+0.2)*cos((x-y+sin(0.1))); /* zをxとyの関数として計算  */
pal,"sunrise"; /* パレットの指定 */
fma; /* キャンバスのクリア  */
make_xyz,z,y,x,nv,xyzv; /*_/_/_/_/ ポリゴン形式に変換  _/_/_/_/*/
pl3surf,nv,xyzv; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
limits; /* 最大表示にする  */
limit3,-3,3,-3,3,-2,2; /* 箱の指定  */
cage3,1; /* 箱の表示  */
orient3; /* 角度の調整  */
setz3,7; /* 遠近法 */
draw3,1; /* 描画 */
scale,0.9; /* スケールの調整 */


pl3tree:複数の曲面

win2,400,400;   /* ウィンドウを表示(既に表示されている場合は不要) */
win3; /* 3Dグラフ用のウィンドウの初期設定 */
read_poly,nv,xyzv,"~/Yorick/poly/kuti.poly"; /* ポリゴン曲面のデータの読み込み  */
read_poly,nvb,xyzvb,"~/Yorick/poly/surface.poly"; /* ポリゴン曲面のデータの読み込み  */
spal,"gg","heat"; /* パレットの指定(2つのパレットを指定)  */
clear3; /* キャンバスと曲面情報のクリア  */
pl3tree,nv,xyzv+[0,0,2],mypal=0; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
pl3tree,nvb,xyzvb,mypal=1; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
limits; /* 最大表示にする  */
limit3,-3,3,-3,3,-1.5,1.5,aspect=[1,1,0.5]; /* 箱の大きさの指定 */
cage3_front=1; /* 箱の手前のフレームの描画をON  */
cage3,1; /* 箱の表示  */
orient3; /* 角度の調整  */
setz3,3; /* 遠近法の適用 */
draw3,1; /* 実際に描画 */
scale,0.9; /* スケールの調整  */

補足

以下のように3つ以上のパレットを使うこともできます.
win2,400,400;   /* ウィンドウを表示(既に表示されている場合は不要) */
win3; /* 3Dグラフ用のウィンドウの初期設定 */
mypal_rr=make_mypal("rr"); /*_/_/_/_/ パレットをベクトルとして格納  _/_/_/_/*/
mypal_bb=make_mypal("bb"); /*_/_/_/_/ パレットをベクトルとして格納  _/_/_/_/*/
mypal_gg=make_mypal("gg"); /*_/_/_/_/ パレットをベクトルとして格納  _/_/_/_/*/
read_poly,nv,xyzv,"~/Yorick/poly/kuti.poly"; /* ポリゴン曲面のデータの読み込み  */
read_poly,nvb,xyzvb,"~/Yorick/poly/surface.poly"; /* ポリゴン曲面のデータの読み込み  */
read_poly,nvc,xyzvc,"~/Yorick/poly/tetra.poly"; /* ポリゴン曲面のデータの読み込み  */

clear3; /* キャンバスと曲面情報のクリア  */
pl3tree,nv,xyzv+[1,1,2],mypal=mypal_gg; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
pl3tree,nvc,xyzvc*1.5+[-1,-1,2],mypal=mypal_bb; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
pl3tree,nvb,xyzvb,mypal=mypal_rr; /*_/_/_/_/ 曲面の描画  _/_/_/_/*/
limits; /* 最大表示にする  */
limit3,-3,3,-3,3,-2,4; /* 箱の大きさの指定 */
cage3_front=0; /* 箱の手前のフレームの描画をOFF  */
cage3,1; /* 箱の表示  */
orient3,-0.2*pi,0.4; /* 角度の調整  */
setz3,3; /* 遠近法の適用 */
draw3,1; /* 実際に描画 */
scale,0.9; /* スケールの調整  */