2014年1月26日日曜日

KETpicでcyclideを描く

以前にAsymptoteで描いたcyclideをKETpicを使って描画してみました.
Asymptoteで描いたものはこちら
今回は3パターンの図を作ってみました.

まずは境界線と稜線のみ
境界線を消すにはどうすればいいのだろう?

次は稜線・境界線にワイヤデータを加えたものです.


穴だと思っていた部分に曲線が入り込んでいて,何か変だなと思いつつ,曲面に隠れた曲線も描画してみました.

なるほど.穴に見えていた部分は穴ではなかったようです.以下はこの図を描画するのに書いたScilabのsceファイルのソースです.
輪郭線線データの分割数を150にしていますが,時間がかかるので30くらいにして試すほうがよいと思います.

currentdir=pwd()
//パラメータの定義
a=3;
b=2.9;
c=0.7;
d=1.7;

//関数の定義
function z=H(u,v)
z=a-c*cos(u)*cos(v)
endfunction

function x=CX(u,v)
x=(d*(c-a*cos(u)*cos(v))+b^2*cos(u))/H(u,v)
endfunction

function y=CY(u,v)
y=(b*sin(u)*(a-d*cos(v)))/H(u,v)
endfunction

function z=CZ(u,v)
z=b*sin(v)*(c*cos(u)-d)/H(u,v)
endfunction

//視点の設定
Setangle(60,30);

//関数のデータリスト
FD=list('p','x=CX(U,V)','y=CY(U,V)','z=CZ(U,V)','U=[0,2*%pi]','V=[0,2*%pi]');

//平行投影した輪郭線データの作成
Sb=Sfbdparadata(FD,150);

//平行投影したワイヤデータの作成
Sw=Wireparadata(Sb,FD,8,8);

//平行投影したワイヤデータの内,曲面に隠れる部分のデータを作成
Swh=WireHiddenData();

//曲面データリストの3次元ワイヤフレームデータを作成
//Out=Sf3data(FD,200);

//空間曲線の平行投影による2次元射影プロットデータを作成
PSb=Projpara(Sb);
PSw=Projpara(Sw);
PSwh=Projpara(Swh);

Setwindow([-6,6],[-4.5,4.5]);//ウィンドウ範囲を設定

Windisp(PSb,PSw,'c')//ウィンドウに表示

cd(currentdir);

//稜線,境界線のみ
Openfile('cyclide_bd.tex')//書き出し用ファイルを開く
Beginpicture('10/12cm');//picture環境を始める
Drwline(PSb,1.2);
Endpicture(0);//picture環境を終える(座標軸を書かない)
Closefile();//書き出し用ファイルを閉じる

//稜線,境界線+ワイヤデータ
Openfile('cyclide1.tex')
Beginpicture('10/12cm');
Drwline(PSb,1.2);
Drwline(PSw,0.5);
Endpicture(0);
Closefile();

//稜線,境界線+ワイヤデータ+陰線
Openfile('cyclide.tex')
Beginpicture('10/12cm');
Drwline(PSb,1.2);
Drwline(PSw,0.5);
Dottedline(PSwh,0.5,0.7);
Endpicture(0);
Closefile();

追記:2015/04/03: 境界線を消した絵をつくってみました.
関数のlistで境界の設定のオプションを設定すればよいみたいです.
//関数のデータリスト
FD=list('p','x=CX(U,V)','y=CY(U,V)','z=CZ(U,V)','U=[0,2*%pi]','V=[0,2*%pi]',' ');
パラメータの範囲のあとに,半角スペースをシングルクォートで挟んだものを入れておけばよいようで,ここを'e'とすれば境界が描画されます.