ステレオグラムの作成

Last modified: 2018 年 12 月 30 日 03 時

空間曲線を例に、ステレオグラムを作成してみる

主な使用関数: 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_sampleLinputすることで交差法によるステレオグラムを作成できます。逆に、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分。

[このページのトップへ]