ベクトル場を描く
for文を使い、各点で矢印を描画して、ベクトル場の図示を再現する
主な使用関数: Arrowline.
格子の調整
ここでは、$[-1,1]\times[-1,1]$の範囲にベクトル場を描いてみましょう。Setwindow([-1.2,1.2], [-1.2,1.2])で、表示する枠を$[-1.2,1.2]\times[-1.2,1.2]$に設定します。
ベクトル場の矢印の濃度を調整するために、まずはベクトル場の起点の格子を調節する定数Nを用意します。領域をxy方向それぞれN=20個に分割し、各格子点を中心とする半径0.02の円のデータCircledata([x,y],0.02)をリストCLに格納します。
N=20;
xmin=-1;
xmax=1;
ymin=-1;
ymax=1;
Setwindow([-1.2,1.2], [-1.2,1.2]);
// 格子点
CL=list();
for i=0:N
for j=0:N
x=xmin+(xmax-xmin)/N*i; //格子点の計算
y=ymin+(ymax-ymin)/N*j; //
CL($+1)=Circledata([x,y], 0.02);
end
end
//Windisp(CL);
//は、Scilabのコメントアウトの記法です。Windisp(CL)を実行し、格子点の様子を見ながら、定数Nを調節することとします。
[このページのトップへ]ベクトル場の定義
ここで描きたいベクトル場は $X=(-y,-x)$ で、ベクトル場の成分関数fx, fyを次のように定義します:
function fx=fx(X,Y); fx=-Y; endfunction
function fy=fy(X,Y); fy=-X; endfunction
[このページのトップへ]
TeXファイルの書き出し
現在のsceファイルのあるディレクトリの下のtexディレクトリにTeXファイルを書き出し。
Beginpicture('3cm')で、図の単位長を3cmに指定。Setax(6,' ')で、原点の記号Oを描画しないようにしています。
R=12として、ベクトル場の長さを調整する定数を用意します。(x0,y0)が格子点の座標で、L=norm([fx(x0,y0),fy(x0,y0)])でベクトル場のノルムを計算します。
(x1,y1), (x2,y2)をそれぞれ始点と終点とするような矢印を描画には、Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l')を使います。他の矢印の付け方は次を参照してください: sample:矢印の描画
Openfile('tex/vector_field_sample.tex');
Beginpicture('3cm');
Setax(6, ' ');
R=12; // ratio
for i=0:N
for j=0:N
x0=xmin+(xmax-xmin)/N*i; // 格子点
y0=ymin+(ymax-ymin)/N*j; //
L=norm([fx(x0,y0),fy(x0,y0)]); //ベクトル場のノルム
if L==0 then //ベクトル場のノルムが0のときは除外する
continue;
else
x1=x0-fx(x0,y0)/R; // 矢印の始点
y1=y0-fy(x0,y0)/R; //
x2=x0+fx(x0,y0)/R; // 矢印の終点
y2=y0+fy(x0,y0)/R; //
Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l');
end
end
end
Endpicture(1);
Closefile();
構文はArrowline(始点,終点,矢じりの大きさ,矢じりの開き角(度数法),矢じりの位置,矢印の太さ,矢じりの形状と配置)。矢じりの位置は、0から1の範囲の実数で指定、例えば、0.5なら、真ん中に矢じりがくるようになります。矢じりと形状と配置は、'f'で塗りつぶした三角形の矢じり、'l'で折れ線の矢じり、'c'は矢じりの中心が棒の終点に一致するようになります(デフォルトは矢じりの先端と棒の終点が一致)。これは'lc'などと組み合わせることができます。
L=0となる点、すなわち、ベクトル場が消える点でArrowlineを実行するとエラーになるので、if構文で取り除いていておきます。
[このページのトップへ]ソースコード
ソース(.sce)のダウンロード
N=20;
xmin=-1;
xmax=1;
ymin=-1;
ymax=1;
Setwindow([-1.2,1.2], [-1.2,1.2]);
// lattice
CL=list();
for i=0:N
for j=0:N
x=xmin+(xmax-xmin)/N*i;
y=ymin+(ymax-ymin)/N*j;
CL($+1)=Circledata([x,y], 0.02);
end
end
//Windisp(CL);
function fx=fx(X,Y); fx=-Y; endfunction
function fy=fy(X,Y); fy=-X; endfunction
Openfile('tex/vector_field_sample.tex');
Beginpicture('3cm');
Setax(6, ' ');
R=12; // ratio
for i=0:N
for j=0:N
x0=xmin+(xmax-xmin)/N*i; // 格子
y0=ymin+(ymax-ymin)/N*j; //
L=norm([fx(x0,y0),fy(x0,y0)]); //ベクトル場のノルム
if L==0 then //ベクトル場のノルムが0のときは除外する
continue;
else
x1=x0-fx(x0,y0)/R; // 矢印の終点
y1=y0-fy(x0,y0)/R; //
x2=x0+fx(x0,y0)/R; // 矢印の始点
y2=y0+fy(x0,y0)/R; //
Arrowline([x1,y1], [x2,y2], 0.5, 30, 1, 1, 'l');
end
end
end
Endpicture(1);
Closefile();
[このページのトップへ]