ステレオグラムの作成
空間曲線を例に、ステレオグラムを作成してみる
主な使用関数: SetstereoL, SetstereoR, Skeletonpara3data, Skeletonpersdata, Spacecurve.
空間曲線の用意
- トーラス結び目のバリエーションの生成, 森田 克己
という論文を参考にトーラス結び目 \begin{align*} C(t)=\bigl((a+b\cos(ct))\cos(et),\,(a+b\cos(ct))\sin(et),\,f\sin(gt)\bigr) \end{align*} を描いてみます。各定数は $a=5,\,b=3,\,c=12,\,e=5,\,f=1,\,g=48$ を選びました。空間曲線の描き方については sample:空間曲線の描画 を参考に。
Setangle(30,-65);
Setwindow([-10.5,10.5], [-12.5,8.5]);
function C=C(t);
C=[(a+b*cos(c*t))*cos(e*t),..
(a+b*cos(c*t))*sin(e*t),..
f*sin(g*t)];
endfunction
a=5;
b=3;
c=12;
e=5;
f=1;
g=48;
Curv=Spacecurve('C(t)', 't=[0,2*%pi]', 'N=1000');
//Windisp(Projpara(Curv));
sCurv=Skeletonpara3data(Curv, list(Curv), 3);
Windisp(Projpara(sCurv));
この曲線のひねりは激しいので、分割点の個数'N=1000'のオプションを加えます。これを描画すると右のようになります。
[このページのトップへ]ステレオグラムの作成
SetstereoR(20,30,-65,7)で、右視点の調整します。Rsk=Skeletonpersdata(Curv,Curv,3)により、一点透視図法のステレオグラム右視点側の、曲線の陰線処理をします。左視点側も同様に。
SetstereoR(20, 30, -65, 7);
Rsk=Skeletonpersdata(Curv, Curv, 3);
SetstereoL(20, 30, -65, 7);
Lsk=Skeletonpersdata(Curv, Curv, 3);
Windisp(Rsk);
Windisp(Lsk);
SetstereoRの引数は、SetstereoR(注視点から視点までの距離,theta,phi,delta)で、theta, phiは視点を表し、deltaは目の間の距離を表わします。
また、Rsk=Skeletonpersdata(陰線処理したい曲線,その曲線を隠す曲線のリスト,d)により、右視点側のプロットデータを得ます。dは、曲線の隠された部分を除く長さを表わし、Skeletonpara3dataの引数と全く同じ意味となります。
[このページのトップへ]TeXファイルの書き出し
各視点のプロットデータを別々のTeXファイルに書き出しておきましょう。また、Drwpt([0,-11])により、各視点の画像の下に黒丸を表示させて、ステレオグラムの視線調整の目安にすることができます。
Openfile('tex/stereo_sample.tex');
Beginpicture('0.5cm');
Drwline(Projpara(sCurv), 4.0);
Endpicture(0);
Closefile();
Openfile('tex/stereo_sampleL.tex');
Beginpicture('0.5cm');
Drwline(Lsk, 4.0);
Setpen(8);
Drwpt([0,-11]);
Setpen(1);
Endpicture(0);
Closefile();
Openfile('tex/stereo_sampleR.tex');
Beginpicture('0.5cm');
Drwline(Rsk, 4.0);
Setpen(8);
Drwpt([0,-11]);
Setpen(1);
Endpicture(0);
Closefile();
ステレオグラムの画像を作るため、次のTeXファイルを用意します。今、右視点stereo_sampleRを先にinputし、次に左視点stereo_sampleLをinputすることで交差法によるステレオグラムを作成できます。逆に、stereo_sampleLを先にinputすると、平行法のステレオグラムを作成できます。
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage[top=1cm, bottom=1cm, left=1cm, right=1cm, includefoot]{geometry}
\usepackage{euler}
\newlength{\Width}%
\newlength{\Height}%
\newlength{\Depth}%
\pagestyle{empty}
\begin{document}
\input{stereo_sampleR}
\input{stereo_sampleL}
\end{document}
[このページのトップへ]
ソースコード
ソース(.sce)のダウンロード
tic();
Setangle(30,-65);
Setwindow([-10.5,10.5], [-12.5,8.5]);
function C=C(t);
C=[(a+b*cos(c*t))*cos(e*t),..
(a+b*cos(c*t))*sin(e*t),..
f*sin(g*t)];
endfunction
a=5;
b=3;
c=12;
e=5;
f=1;
g=48;
Curv=Spacecurve('C(t)', 't=[0,2*%pi]', 'N=1000');
//Windisp(Projpara(Curv));
sCurv=Skeletonpara3data(Curv, list(Curv), 3);
//Windisp(Projpara(sCurv));
SetstereoR(20, 30, -65, 7);
Rsk=Skeletonpersdata(Curv, Curv, 3);
SetstereoL(20, 30, -65, 7);
Lsk=Skeletonpersdata(Curv, Curv, 3);
Windisp(Rsk);
Windisp(Lsk);
Openfile('tex/stereo_sample0.tex');
Beginpicture('0.5cm');
Drwline(Projpara(sCurv), 4.0);
Endpicture(0);
Closefile();
Openfile('tex/stereo_sampleL.tex');
Beginpicture('0.5cm');
Drwline(Lsk, 4.0);
Setpen(8);
Drwpt([0,-11]);
Setpen(1);
Endpicture(0);
Closefile();
Openfile('tex/stereo_sampleR.tex');
Beginpicture('0.5cm');
Drwline(Rsk, 4.0);
Setpen(8);
Drwpt([0,-11]);
Setpen(1);
Endpicture(0);
Closefile();
T=toc();
minute=floor(T/60);
second=floor(T-60*minute);
disp(strcat([string(minute), ' minutes ', string(second), ' seconds']));
曲線の分割点の個数が多いので、けっこう時間がかかります。うちの環境では7分。
[このページのトップへ]