2014年9月3日水曜日

KETpicで標準的単体の描画

久々にKETpicを使って作図をしてみました.
作図したのは2次元の標準的単体
$\Delta^2=\Big\{\,(x_0, x_1, x_2)\in \mathbb{R}^3 \mid x_0\geq 0, x_1\geq 0, x_2\geq 0,\, x_0+x_1+x_2=1\,\Big\}$
です.

KETpicでは3次元の曲面に斜線を入れたりする場合に,一度2次元の領域を3次元空間に埋め込む関数を作成して,2次元空間の閉曲面で囲まれた領域に斜線を引いたものを3次元空間に埋め込むといった操作を取る必要があるようでした.

3次元の座標系に矢印を付けることは出来ないですし,文字のラベルを入れるときに,3次元の座標で指定出来ないので,視点の変更をした場合などにラベルの位置を調整するのが面倒など不満点もあります.

追記:2014/09/07
ラベルを入れたい点の3次元座標を投影した点に名前をつけておけば、視点の変更を行っても望みの点付近にいラベルが表示されます。

今回作成したのは次のようになりました.

この図のソースであるsceファイルは次の通りです.

//四面体の頂点の定義
PO=[0,0,0]; PA=[1,0,0];
PB=[0,1,0]; PC=[0,0,1];

//頂点のリスト
VL=list(PO,PA,PB,PC);

//多面体の面の添字リスト
FL=list([1,2,3],[1,2,4],[1,3,4],[2,3,4]);

//アングルなどの設定
Setwindow([-1,2],[-1,2]);//ウインドウの設定
Setangle(70,-25);//視点の設定


//陰線処理された四面体の3次元データを作成する
P4=Phparadata(VL,FL);//四面体の3次元データ?
PHi=PhHiddenData();//陰線のデータを抜き出す
Pp4=Projpara(P4);//四面体の平行投影された2次元データを作成
PpHi=Projpara(PHi);//陰線データを平行投影した2次元データに直す



//空間の曲面に直接斜線を入れることが出来ないので,
//2次元の閉曲線で囲まれた部分に斜線を入れたものを3次元空間に埋め込む

//埋め込み関数の定義 XY平面をX+Y+Z=1で表される平面に埋め込む
deff('Out=Em(X,Y)','Out=[X,Y,1-X-Y]');

//平面側の曲線を定義 ここでは3点を結んでいった三角形の周囲
L1=Listplot([[0,0],[1,0],[0,1]]);

//平面の曲線で囲まれる領域に斜線を入れる
L1H=Hatchdata('i',list(L1),-30,0.5);

//斜線を入れた領域を埋め込み関数で3次元に埋め込んで得られたデータ
SH=Embed(L1H,Em);

PSH=Projpara(SH);//斜線を入れた領域を平行投影した2次元のデータを作成




//Xyzax3data 座標軸のPD3dのlistを作成
Sax=Xyzax3data('x_0=[-1,2]','x_1=[-1,1.8]','x_2=[-0.3,1.8]');

//空間曲線を面により陰線処理されたデータを作成
//ここでは四面体により隠れる座標軸のデータを作成
Pf=Faceremovaldata(list(VL,FL),Sax,'para');
Ppf=Projpara(Pf);//座標軸を平行投影した2次元データ作成
//このあとPhHiddenData()により,陰線部分のデータを抽出できるが,ここでは必要ない

//四面体の頂点を平行投影した点
PpA=Projpara(PA);
PpB=Projpara(PB);
PpC=Projpara(PC);

//ウィンドウに表示
Windisp(Pp4,PpHi,Ppf,PSH,'c');


//ここからTeX用のデータ作成
Openfile('simplex.tex');//データを収めるTeXファイルを開く
Setunitlen('2*10/12cm');//単位長を指定
Beginpicture('');//\begin{picture}コマンドを単位長を指定して書き出す
//平行投影した2次元データを書き出す
Drwline(Ppf,0.5);//実線はDrwline
Drwline(Pp4,0.7);
Drwline(PSH,0.5);
Setpen(0.7);//Invdashlineでは線の太さを変更出来ないので,Setpenコマンドで太さ指定
//両端がギャップになっている破線を描く,数字は実線部分とギャップ部分間隔
Invdashline(PpHi,0.5);

//3次元座標軸の名前
Xyzaxparaname('x_0=[-1,2]','x_1=[-1,1.8]','x_2=[-0.3,1.8]');

//図に書き入れたい数式など
Expr([0,0],'sw','O');
Expr(PpA,'sw','(1,0,0)');
Expr(PpB,'se','(0,1,0)');
Expr(PpC,'ne','(0,0,1)');

//斜線部分に白い円を描画して,その中に文字を入れる
C1=Circledata([0.42,0.3],0.14);//円のデータ
Shade(C1,0);//白い円を描画
Expr([0.42,0.3],'c','\Delta^{\!2}');//円の中に入れる文字
Endpicture(0);//picture環境を終了
Closefile();//ファイルを閉じる

うーん.図形に隠れる線の描画なんかは手動でも出来そうなので,このくらいの図だったらasymptoteで描いたほうが簡単かもです.多面体の書き方や,曲面の埋め込みなんかの練習になったからよしとしますか.