矢印の描画

Last modified: 2019 年 01 月 08 日 10 時

曲線に沿うような曲がった矢印を描画し、角度記号を付ける。KeTCindy版はこちら

主な使用関数: Anglemark, Arrowheaddata, Paramark.

矢印の描画

平面図形の用意

sample:領域のハッチングと同様に、原点を中心とし、半径がそれぞれ2と1の円のプロットデータをC1,C2とします。また、直線 $\displaystyle \theta=\frac{\pi}{3}$ と円C1,C2との交点P=(x0,y0), Q=(x1,y1)を図のように定めます。Listplotにより、線分OQ,PA,PQのデータL1,L2,L3を用意しておきます。

xmin=-2.2;
xmax=2.2;
ymin=-2.2;
ymax=2.2;

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

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


theta=%pi/3;
x0=2*cos(theta)*cos(theta);
y0=2*cos(theta)*sin(theta);
x1=2*cos(theta);
y1=2*sin(theta);

L1=Listplot([0,0], [x1,y1]);    //OQ
L2=Listplot([x0,y0], [2,0]);    //PA
L3=Listplot([x0,y0], [x1,y1]);  //PQ

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

角度記号

解説図AOPと直角OPAにそれぞれ角度記号を書き込みましょう。

3点A,B,Cがあるとき、Anglemark(点A,点B,点C,大きさ)により、線分ABから線分CBへ反時計回りに引かれた、∠ABCの角度記号のプロットデータを得ることができます(最後にDrwlineします)。最後のオプション 大きさ はデフォルトで0.5で、省略が可能です。また、直角記号はParamarkにより得られます。

AG1=Anglemark([2,0], [0,0], [x0,y0], 0.4);
AG2=Paramark([0,0], [x0,y0], [2,0], 0.3);

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

矢じり (矢印)

直線・曲線上の矢印は、sample:ベクトル場の描画で書いた方法とは別の、Arrowheaddataを使います。矢じりのみのプロットデータを用意して、矢印を付けたい直線・曲線に矢じりを書き込むという方法を取ります。

解説図 まず、時計回りに半径0.6の円弧C3を描いて、その両端に矢じりを付けます。Arrowheaddata([0,a],C3,1.2,25,1.5,'l')によって、C3の端点(0,a)における矢じりのプロットデータを得ることができます。この矢じりは、有向曲線C3の向きになります。ただし、曲線 $C(t)\;(t\in[a,\,b])$ の向きは、始点 $C(a)$ から終点 $C(b)$ に向かう向きとしています。

次に、C3のもうひとつの端点(a,0)に矢じりを描くために、C3と逆向きの曲線invC3を用意して、Arrowheaddataで矢じりのプロットデータを得ます。

a=0.6;
C3=Paramplot('[a*cos(t), a*sin(t)]', 't=[0,%pi/2]', 'N=150');


invL3=Listplot([x1,y1], [x0,y0]);  // L3と逆向きの線分
invC3=Paramplot('[a*cos(-t), a*sin(-t)]', 't=[-%pi/2, 0]');  //C3と逆向き
Ah1=Arrowheaddata([x0,y0], invL3, 1.2, 25, 1.5, 'l');  // 矢じり
Ah2=Arrowheaddata([x1,y1], L3, 1.2, 25, 1.5, 'l');     //
Ah3=Arrowheaddata([a,0], invC3, 1.2, 25, 1.5, 'l');    //
Ah4=Arrowheaddata([0,a], C3, 1.2, 25, 1.5, 'l');       //

構文はArrowheaddata(曲線上の点の座標,曲線のプロットデータ,矢じりの大きさ,矢じりの開き角,矢印の太さ,矢じりの種類と位置)です。矢じりの種類では、'f'は黒で塗りつぶされた三角形の矢じり、'l'は線状の矢じりを意味し、矢じりの位置に'c'を指定すると、第一引数の点の位置が矢じりの中心となります。'c'を指定しなければ、点の座標が矢じりの先端の位置と一致します。矢じりの種類と位置のオプションは、'lc'などと組み合わせて指定することができます。また、曲線のプロットデータよりも後の引数は、省略可能なオプションです。

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

ソースコード

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

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

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


theta=%pi/3;
x0=2*cos(theta)*cos(theta);
y0=2*cos(theta)*sin(theta);
x1=2*cos(theta);
y1=2*sin(theta);

L1=Listplot([0,0], [x1,y1]);
L2=Listplot([x0,y0], [2,0]);
L3=Listplot([x0,y0], [x1,y1]);
AG1=Anglemark([2,0], [0,0], [x0,y0], 0.4);
AG2=Paramark([0,0], [x0,y0], [2,0], 0.3);
a=0.6;
C3=Paramplot('[a*cos(t), a*sin(t)]', 't=[0,%pi/2]', 'N=150');

//Windisp(C1, C2, C3, L1, L2, AG1, AG2);


invL3=Listplot([x1,y1], [x0,y0]);  // L3と逆向きの線分
invC3=Paramplot('[a*cos(-t), a*sin(-t)]', 't=[-%pi/2, 0]');  //C3と逆向き
Ah1=Arrowheaddata([x0,y0], invL3, 1.2, 25, 1.5, 'l');  // 矢じり
Ah2=Arrowheaddata([x1,y1], L3, 1.2, 25, 1.5, 'l');     //
Ah3=Arrowheaddata([a,0], invC3, 1.2, 25, 1.5, 'l');    //
Ah4=Arrowheaddata([0,a], C3, 1.2, 25, 1.5, 'l');       //


Openfile('tex/arrow_sample.tex');
Beginpicture('1.2cm');
Drwline(C1, C2, 1.2);
Drwline(L1, L2, AG1, AG2, 1);
Drwline(L3, C3, Ah1, Ah2, Ah3, Ah4, 1.5);

Setpen(3);
Drwpt([x0,y0]);
Drwpt([x1,y1]);
Drwpt([2,0]);
Setpen(0.8);
Expr([x0,y0], 'nw', 'P');
Expr([x1,y1], 'ne', 'Q');
Expr([0.3,0.2], 'c', '\theta');
Expr([2,0], 'se', 'A');
Setpen(1);
Endpicture(1);
Closefile();

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