領域のハッチング

Last modified: 2019 年 01 月 21 日 13 時

曲線で囲まれた領域をハッチングする。KeTCindy版はこちら

主な使用関数: Drwline, Drwpt, Hatchdata, Listplot, Paramplot.

300x302(13670bytes)

曲線の描画

定数をxmin=-2.4,xmax=2.4,ymin=-2.4,ymax=2.4とおいて、表示する枠をSetwindow([xmin,xmax],[ymin,ymax])で指定しておきます。

中心を原点、半径を$\displaystyle\sqrt{2}$とする円C1、中心を(1,0)、半径を1とする円C2Paramplotを使って用意しておきます:

xmin=-2.4;
xmax=2.4;
ymin=-2.4;
ymax=2.4;

Setwindow([xmin,xmax], [ymin,ymax]);

C1=Paramplot('[2*cos(t), 2*sin(t)]', 't=[0,2*%pi]');
C2=Paramplot('[cos(t)+1, sin(t)]', 't=[0,2*%pi]');

ここで、Paramplot('[x(t), y(t)]', 't=[a,b]')は、曲線 $c(t)=(x(t),y(t))\;(a\leq t\leq b)$ のプロットデータを返します。オプションとしては、Paramplot('[x(t), y(t)]', 't=[a,b]', 'N=300')とすると、よりなめらかな描画が得られます。このNの値は曲線の分割点の個数で、デフォルトでは'N=50'となっています。

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

ハッチング

ここで描きたい領域は $\bigl\{(x,y)\mid x^2+y^2\leq 2,\,(x-1)^2+y^2\geq 1,\,x\geq 0,\,y\geq 0\bigr\}$です。
補助線として、y=0, x=0の直線L1, L2を用意しておきます:

L1=Listplot([xmin,0], [xmax,0]);
L2=Listplot([0,ymin], [0,ymax]);

Listplot(点1,点2,...)の構文で、点1点2...を結ぶ折れ線のプロットデータを得ることができます。 Hatchdata(領域のパターンの指定,曲線と示したい領域,角度,斜線の密度)で領域をハッチングできます:

H=Hatchdata('ioii', list(C1, [0,0]), list(C2, [1,0]),..
                    list(L1, 'n'), list(L2, 'e'), 30, 0.6);

領域の指定の仕方はいくつかあって、list(C1,[0,0])は曲線C1の分断する領域のうち、点(0,0)を含む方を意味し、list(L1,'n')は直線L1の分断する領域の北側(東西南北 ewsn)を意味します。他2つも同様で、最後の、領域のパターンの指定'ioii'list(C1,[0,0])の示した領域、list(C2,[1,0])の示した領域ではないほうlist(L1,'n')の示した領域、list(L2,'e')の示した領域、これらの共通部分をハッチングします ("inner"と"outer"の略のようだ)。

ここで、3行目末の" .. "は式の途中で改行するときに行末に付けます (tips: よくあるエラー)。

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

TeXファイルの書き出し

最後に、現在のsceファイルのあるディレクトリの下のtexディレクトリにTeXファイルを書き出しして終わりです。

Openfile('tex/hatch_sample.tex');
Beginpicture('1cm'); //図の単位長を1cmに
//Setax(6,' ');
Drwline(C1, C2, 1.2);
Drwline(H, 0.5);
Setpen(4); //線の太さの倍率を4に
Drwpt([1,0]);

Expr([2*cos(%pi/4),2*sin(%pi/4)], 'ne', 'D');
Expr([2,0], 'se', '2');
Expr([1,0], 's2', '1');
Setpen(1);
Endpicture(1);
Closefile();

Beginpicture('1cm')で、図の単位長を1cmに指定し、Drwline(プロットデータ,線の太さ)で、与えられたプロットデータを描画します。Setpen(4)で、一旦、線の太さの倍率を4にしてから、Drwpt([1, 0])で、(1,0)のところに点を打ちます。

Expr(座標,'方向','数式')で、図中に数式が書き込めます。"方向"は座標から見て数式をずらす方向を指定します (ewsnc)。'c'とすれば、指定した座標を中心に数式が置かれます。'ne'などと組み合わせも可能で、's2'は南に2目盛りずらすことを意味します。数式ではなく、テキストを入れたければ、Letter(座標,'方向','文字')とします。

Endpicture(1)で座標軸を描いて終わります。座標軸を描きたくない場合は Endpicture(0)とします。ちなみに、原点Oを書きたくなければ、Setax(6,' ');を入れればよいです。
Endpicture(1)の前に、Setpen(1)を置いて、線の太さの倍率をもとに戻しておくことを忘れずに。このままだと、座標軸が太くなります。

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

ソースコード

scilabファイル(.sce)のダウンロード
xmin=-2.4;
xmax=2.4;
ymin=-2.4;
ymax=2.4;

Setwindow([xmin,xmax], [ymin,ymax]);

C1=Paramplot('[2*cos(t), 2*sin(t)]', 't=[0,2*%pi]');
C2=Paramplot('[cos(t)+1, sin(t)]', 't=[0,2*%pi]');

L1=Listplot([xmin,0], [xmax,0]);
L2=Listplot([0,ymin], [0,ymax]);

H=Hatchdata('ioii', list(C1, '[0,0]'), list(C2, [1,0]),..
                  list(L1, 'n'), list(L2, 'e'), 30, 0.6);

Windisp(C1, C2, H);

Openfile('tex/hatch_sample.tex');
Beginpicture('1cm');
//Setax(6,' ');
Drwline(C1, C2, 1.2);
Drwline(H, 0.5);
Setpen(4);
Drwpt([1,0]);

Setpen(0.8);
Expr([2*cos(%pi/4),2*sin(%pi/4)], 'ne', 'D');
Expr([2,0], 'se', '2');
Expr([1,0], 's2', '1');
Setpen(1);
Endpicture(1);
Closefile();

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