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; /* スケールの調整 */
- z:2次元配列
- y:2次元配列
- x:2次元配列
- edges=:メッシュの線の有無(0/1)
- shade=:塗りつぶしの有無(0/1)
補足
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; /* スケールの調整 */
- nv:1次元ベクトル(曲面を構成する各々の多角形の頂点数)
- xyzv:3×[nvに対応する頂点数]の2次元ベクトル(各頂点の3次元座標)
- mypal=:パレットの指定(指定しない場合は、デフォルトのパレット(この場合はgray)が使われる。)mypalの値は0や1も可能。
補足
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; /* スケールの調整 */
- nv:1次元ベクトル(曲面を構成する各々の多角形の頂点数)
- xyzv:3×[nvに対応する頂点数]の2次元ベクトル(各頂点の3次元座標)
- mypal=:パレットの指定(指定しない場合は、デフォルトのパレット(この場合はgray)が使われる。)mypalの値は0や1も可能。
補足
以下のように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; /* スケールの調整 */