2014年1月29日水曜日

OS X MavericksにScilabを導入

Mac OS X 10.9 MavericksにScilabをインストールしました.
公式ページのこちらからScilab-5.4.1.dmgをダウンロードします.
こちらのページの記述にあるように,起動時に警告が出ますがMavericksでもScilab 5.4.1を使うことが出来ます.

ただこのままインストールしただけでは起動はするものの,使用することが出来ませんでした.ScilabはJavaを利用しているようで,それが原因のようでした.Javaで動いているソフトを幾つかインストールしているので,そこはてっきり問題がないものと思い込んでいました.解決方法は,アップルのこちらのサポートページからJava for OS Xをダウンロードしインストールすることです.

Java for OS Xをインストール後Scilabを起動させると使用可能になりました.

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'とすれば境界が描画されます.

2014年1月25日土曜日

KETpicを試してみました.

KETpic(けとぴっく)は,Scilabなどの数値計算システムを用いたTeXのグラフ描画のためのツールです.色々なところでセミナーや研究会での発表を行って宣伝しているようで,Web上で論文などの断片的な情報が手にはいりますが,マニュアルが充実していないので敷居が高い印象がありました.

最近興味をもって「KETpicで楽々TeXグラフ」という書籍を購入たので,試用してみました.自分が試したのはScilabバージョンです.

上記の書籍は中の人が書いているようで,KETpic唯一のマニュアルみたいなものです.事情はわかりませんが,配布の際にマニュアルとしてpdfで添付したほうが研究会での報告よりも利用者の増加や普及が見込めるのではないでしょうか.何故そのような形態を取らなかったのかが不思議です.

さて,のっけから文句になりましたが,web上で幾つか見ることの出来るKETpicについての論文から,モノクロの図の出力がきれいだということで以前から興味を持っていました.ただScilabのMacへのインストールの仕方がよくわからなかったので試せていませんでした.曲面を2次元面に投影した際の稜線を描画したり,曲面に隠れた線の処理が出来るなど,通常の描画ソフトでは見かけない機能が特徴です.

今回はFriedrichsの軟化子の定義に使う釣鐘型関数(bell-shaped function)の描画を行ってみました.
座標軸は,曲面の外部は実線,内部は点線で描画するようにしてあります.また稜線描画の機能を使って,縁の部分を少し太い線にしてあります.曲面に隠れている奥の部分のフレームも描画出来ますが,今回は見苦しい出力になったのでやめました.

上の図を描くためのScilabのsceファイルのソースを貼付けます.
currentdir=pwd()

//eps=0.5;

//釣鐘型関数の定義
function z=F(x,y)
    t=x^2+y^2
    
    if t<1 then
        z=5*exp(-1/(1-t))
    else
        z=0        
    end
endfunction


//関数のデータ
Rad=2;
Fd=list("z=F(x,y)","x=R*cos(T)","y=R*sin(T)","R=[0,Rad]","T=[0,2*%pi]","");

//視点の設定
SetstereoR(20,40,40,0);

//FDのワイヤフレームデータを一点投影した2次元データ
Sb=Sfbdpersdata(Fd,60);
//一点投影して2次元データ化
PSb=Projpers(Sb);

//ワイヤフレームの本数
N=8;
M=12;
R=Rad/N;T=2*%pi/M;

RL=[1:N]*R;
TL=[0:M-1]*T;

//ワイヤデータの作成
Sw=Wirepersdata(Sb,Fd,RL,TL,50);


//陰線の3次元データ
//Swh=WireHiddenData();

PSw=Projpers(Sw);
//PSwh=Projpers(Swh);

//Xyzax3data 座標軸のPD3dのlistを作成
Sax=Xyzax3data("x=[-2.5,2.5]","y=[-2.5,2.5]","z=[0,2.3]");

//曲面外に出ている座標軸のデータ
Sax1=Crvsfpersdata(Sax,Sb,Fd);
//曲面によって隠される座標軸のデータ
Saxh1=CrvsfHiddenData();
PSax1=Projpers(Sax1);
PSaxh1=Projpers(Saxh1);

//スケルトンデータ
//Skax=Skeletonpersdata(list(Sax),list(Sb,Sw));

Setwindow([-3,3],[-2,2.3]);//ウィンドウ範囲を設定

Windisp(PSb,PSw,PSax1,"c")//画面を開き,PD(プロットデータ)列を表示 cは現在の画面を消去して表示


cd(currentdir);
Openfile("bell_shaped_function.tex")//書き出し用ファイルを開く
Beginpicture("10/12cm");//picture環境を始める
Drwline(PSax1,0.7);
//Invdashline(PSaxh1,0.5);
Drwline(PSw,0.5);
//Dottedline(PSwh,0.5,0.7);
Drwline(PSb,0.7);
Xyzaxpersname("x=[-2.5,2.5]","y=[-2.5,2.5]","z=[0,2.3]");

//一点投影で,各軸のラベルを書き入れる
Expr([1.5,1.8],"e2","\displaystyle z=\exp\Bigl(-\frac{1}{1-\lvert x\rvert^2}\Bigr)");
Endpicture(0);//picture環境を終える(座標軸を書かない)
Closefile();//書き出し用ファイルを閉じる
KETpicの公式ページには図のサンプルはありますが,ソースのサンプルがなく,書籍を買わない場合は添付されているコマンドリファレンスを見たり,Webで検索して論文にあるわずかな記述を参考にするしかなく,非常に使い辛いです.せめて公式ページに特徴的な図のソースのサンプルがおいてあれば,もっと使い易くなるのではないかと期待しています.

実線の描画では線の太さを指定出来るのに,破線は指定出来ない仕様は直して欲しいかな.
追記:2014/09/06
破線を描く命令DashlineやInvdashlineでは線の太さを指定できないので、破線の太さを調整するにはSetpenコマンドを使います。