パラメータ付けされた曲面の描画

Last modified: 2018 年 12 月 30 日 03 時

パラメータ付けされた曲面 $p(u,v)=(x(u,v), y(u,v), z(u,v))$ を陰線処理して表示する

主な使用関数: Crv3onsfparadata, Crv3onsfHiddenData, Sf3data, Sfbdparadata, Spacecurve, Wireparadata.

トーラス トーラス上の曲線

曲面のプロットデータを得る記法をまとめると、次のようになります:

グラフ型の曲面 $z=f(x,y)\;\left((x,y)\in\left[a,b\right]\times\left[c,d\right]\right)$:

fd=list('z=f(x,y)','x=[a,b]','y=[c,d]','ewsn')
(cf. sample:曲面の陰線処理)

領域上のグラフ型の曲面 $z=f(x(u,v),y(u,v))\;\left((u,v)\in\left[a,b\right]\times\left[c,d\right]\right)$:

fd=list('z=f(x,y)','x=x(u,v)','y=y(u,v)','u=[a,b]','v=[c,d]','ewsn')
(cf. sample:曲面上の曲線の描画)

パラメータ付けされた曲面 $p(u,v)=(x(u,v), y(u,v), z(u,v))\;\left((u,v)\in\left[a,b\right]\times\left[c,d\right]\right)$ :

fd=list('p','x=x(u,v)','y=y(u,v)','z=z(u,v)','u=[a,b]','v=[c,d]',' ')
(cf. 本稿 — sample:パラメータ付けされた曲面の描画)

トーラスの描画

ここではトーラス \begin{align*} &\left\{ \begin{aligned} x&=(R+r\cos(v))\cos(u)\\ y&=(R+r\cos(v))\sin(u)\\ z&=r\sin(v)\\ \end{aligned} \right. & &\left(u=\left[0,2\pi\right],\, v=\left[0,2\pi\right]\right) \end{align*} を描画します。トーラスのプロットデータは

Setangle(65,45);
Setwindow([-2.5,2.5], [-1.5,1.5]);

r=0.5;
R=1.5;
fd=list('p', 'x=(R+r*cos(v))*cos(u)',..
             'y=(R+r*cos(v))*sin(u)',..
             'z=r*sin(v)',..
             'u=[0,2*%pi]', 'v=[0,2*%pi]', ' ');
surface=Sf3data(fd, 50, 50);

//Windisp(Projpara(surface));

で取得します。トーラスの場合は、境界がないので、境界の指定' 'とします。 一般に、曲面のパラメータ表示 $p(u,v)=(x(u,v),y(u,v),z(u,v))\;((u,v)\in[a,b]\times[c,d])$ に対し、fd=list('p','x=x(u,v)','y=y(u,v)','z=z(u,v)','u=[a,b]','v=[c,d]', '境界の指定')により、曲面のプロットデータを得ます。境界の指定ewsnから選ぶか、もしくは指定しない' 'かのいずれかです (cf. sample:曲面の陰線処理)。

また、outline=Sfbdparadata(fd,100)により、トーラスの輪郭線を得、wire=Wireparadata(outline,fd,LR,Lr,100)により、トーラスのワイヤーフレームのデータを得ます。

outline=Sfbdparadata(fd, 100);

Lr=(1:10)*2*%pi/10; //Lr=[K,2*K,...,10*K] (K=2*%pi/10)
LR=(1:10)*2*%pi/10;
wire=Wireparadata(outline, fd, LR, Lr, 100);

//Windisp(Projpara(outline, wire));

ここで、Lr=(1:10)*2*%pi/10, LR=(1:10)*2*%pi/10とおき、wire=Wireparadata(outline,fd,LR,Lr,100)と、Wireparadata関数を呼び出しています。Lr,LRはワイヤーの座標を指定しています。注意すべきは、sample:曲面の陰線処理の場合のようにwire=Wireparadata(outline,fd,10,10)とすると、2*%piにあたるワイヤーが抜けてしまう仕様があります。

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

トーラス上の曲線

トーラス上の曲線Cを定義して、Crv=Crv3onsfparadata(C, outline, fd)により、陰線処理します。hCrv=Crv3onsfHiddenData()により、トーラスにより隠れる曲線の部分のデータを得ます。

function v=v(t)
  v=8*t;
endfunction
function f=f(t)
  f=[(R+r*cos(v(t)))*cos(t),..
     (R+r*cos(v(t)))*sin(t),..
      r*sin(v(t))];
endfunction

C=Spacecurve('[f(t)]', 't=[0,2*%pi]', 'N=300');
Crv=Crv3onsfparadata(C, outline, fd);
hCrv=Crv3onsfHiddenData();

Windisp(Projpara(Crv, outline));

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

TeXファイルの書き出し

現在のsceファイルのあるディレクトリの下のtexディレクトリにTeXファイルを書き出し。前者はトーラスのワイヤーの描画、後者はトーラス上の曲線の描画になります。

Openfile('tex/surface_sample3_1.tex');
Beginpicture('1.5cm');
Drwline(Projpara(outline), 1.5);
Drwline(Projpara(wire), 0.5);
Endpicture(0);
Closefile();

Openfile('tex/surface_sample3_2.tex');
Beginpicture('1.5cm');
Drwline(Projpara(outline), 2.0);
Drwline(Projpara(Crv), 1.0);
Setpen(0.5);
Dashline(Projpara(hCrv), 1, 0.5);
Endpicture(0);
Closefile();

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

ソースコード

scilabファイル(.sce)のダウンロード
tic();

Setangle(65,45);
Setwindow([-2.5,2.5], [-1.5,1.5]);

r=0.5;
R=1.5;
fd=list('p', 'x=(R+r*cos(v))*cos(u)',..
             'y=(R+r*cos(v))*sin(u)',..
             'z=r*sin(v)',..
             'u=[0,2*%pi]', 'v=[0,2*%pi]', ' ');
surface=Sf3data(fd, 50, 50);
//
//Windisp(Projpara(surface));

outline=Sfbdparadata(fd, 100);

Lr=(1:10)*2*%pi/10;
LR=(1:10)*2*%pi/10;
wire=Wireparadata(outline, fd, LR, Lr, 100);

//Windisp(Projpara(outline, wire));

function v=v(t)
  v=8*t;
endfunction
function f=f(t)
  f=[(R+r*cos(v(t)))*cos(t),..
     (R+r*cos(v(t)))*sin(t),..
      r*sin(v(t))];
endfunction

C=Spacecurve('[f(t)]', 't=[0,2*%pi]', 'N=300');
Crv=Crv3onsfparadata(C, outline, fd);
hCrv=Crv3onsfHiddenData();

Windisp(Projpara(Crv, outline));


Openfile('tex/surface_sample3_1.tex');
Beginpicture('1.5cm');
Drwline(Projpara(outline), 1.5);
Drwline(Projpara(wire), 0.5);
Endpicture(0);
Closefile();

Openfile('tex/surface_sample3_2.tex');
Beginpicture('1.5cm');
Drwline(Projpara(outline), 2.0);
Drwline(Projpara(Crv), 1.0);
Setpen(0.5);
Dashline(Projpara(hCrv), 1, 0.5);
Endpicture(0);
Closefile();

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

うちの環境では、9分半。陰線処理にはけっこう時間がかかります。

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