2015年9月17日木曜日

ketpicで曲面を斜線塗りする

ketpicのEmbed関数を利用して曲面上の領域を斜線塗りする試みをしました。
今回作成したのは、円の内部の領域$x^2+y^2\leq 1$に斜線を入れたものを曲面$z=x^2-y^2$に持ち上げた図です。
この図を作成するためのソースは次の通りです。
currentdir=pwd()

tic();

//視点のアングル
phi=60;
theta=40;
Setangle(theta,phi);
//


//曲面の関数
function z=Sfc(x,y)
  z=x^2-y^2
endfunction

//曲面のデータ
Fd=list('Z=Sfc(X,Y)','X=[-1.5,1.5]','Y=[-1.5,1.5]');
Sb=Sfbdparadata(Fd);//境界線の3dデータ
Sbh=BorderHiddenData();//曲面に隠れる境界線の3dデータ

//曲面に埋め込む円
GC=Paramplot('[cos(T),sin(T)]','T=[0,2*%pi]');
deff('Out=Emb(X,Y)','Out=[X,Y,Sfc(X,Y)]');
GH=Hatchdata(list('i'),list(GC));
SC=Embed(GC,Emb);
SH=Embed(GH,Emb);

Setwindow([-3,3],[-3.5,3]);

Windisp(Projpara(Sb,Sbh,SH,SC));

Openfile('test.tex')//書き出し用ファイルを開く
Beginpicture('1cm');//picture環境を始める。引数は単位長
Drwline(Projpara(Sb,SH,SC));
Dottedline(Projpara(Sbh));
Endpicture(0);//picture環境を終える(座標軸を書かない)
Closefile();//書き出し用ファイルを閉じる


T=toc();
minute=floor(T/60);
second=floor(T-60*minute);
disp(strcat([string(minute), ' minutes ', string(second), ' seconds']));

ここでは曲面に隠れるべき部分も描かれてしまっていますが、どうやって対処すべきかまだ理解できていません。