角記号の応用編
平面に角度記号を描く関数は用意されていますが、空間の中に書き込むには工夫が必要です
主な使用関数: Anglemark, Embed, Setangle, Spaceline, Xyzax3data, Xyzaxparaname.
回転行列の用意
z軸を中心としx軸からy軸へと $\varphi$ だけ回転させる行列をA、y軸を中心としz軸からx軸へと $\theta$ だけ回転させる行列をBとします。すなわち、 \begin{align*} A= \left( \begin{array}{ccc} \cos(\varphi) & -\sin(\varphi) & 0 \\ \sin(\varphi) & \cos(\varphi) & 0 \\ 0 & 0 & 1 \\ \end{array} \right),\quad B= \left( \begin{array}{ccc} \cos(-\theta) & 0 & -\sin(-\theta) \\ 0 & 1 & 0 \\ \sin(-\theta) & 0 & \cos(-\theta) \\ \end{array} \right). \end{align*} ただし、ソース上では、列ベクトルよりも行ベクトルの方が扱いやすいので(リストの形が行ベクトル)、それに合わせて転置させた形に書いています。 \begin{align*} T_A&:(x,y,z)\mapsto \left( \begin{array}{ccc} x & y & z \\ \end{array} \right) \left( \begin{array}{ccc} \cos(\varphi) & \sin(\varphi) & 0 \\ -\sin(\varphi) & \cos(\varphi) & 0 \\ 0 & 0 & 1 \\ \end{array} \right)\\[2mm] T_B&:(x,y,z)\mapsto \left( \begin{array}{ccc} x & y & z \\ \end{array} \right) \left( \begin{array}{ccc} \cos(-\theta) & 0 & \sin(-\theta) \\ 0 & 1 & 0 \\ -\sin(-\theta) & 0 & \cos(-\theta) \\ \end{array} \right) \end{align*}
Setangle(70,30);
Setwindow([-1,1], [-1,1.5]);
axis=Xyzax3data('x=[0,1.2]', 'y=[0,1.2]', 'z=[0,1.2]');
phi=60*2*%pi/360;
theta=40*2*%pi/360;
A=[ cos(phi), sin(phi), 0;..
-sin(phi), cos(phi), 0;..
0, 0, 1];
B=[ cos(-theta), 0, sin(-theta);..
0, 1, 0;..
-sin(-theta), 0, cos(-theta)];
Scilabでは、行列はA=[a,b,c;d,e,f]のように書きます。セミコロンは行の区切りを表わします。
C=B*A; //行列の積
Q=[0,0,1];
Pxy=[1, 0, 0;..
0, 1, 0;..
0, 0, 0];
L=Spaceline([[0,0,0], Q*C]);
Lxy=Spaceline([[0,0,0], Q*C*Pxy]);
addL=Spaceline([Q*C, Q*C*Pxy]);
C=B*Aは行列BとAとの積を表わします。Lは方向ベクトルの線分を表し、Lxyは方向ベクトルのxy平面への射影、addLは方向ベクトルからxy平面への垂線を表わします。
[このページのトップへ]
角度記号を空間に埋め込む
空間内の角に角度記号を描く関数は用意されていません。そこで、平面に角度記号を描いてから埋め込み関数で空間内にプロットするようにします。
まず、下図のように、平面上の角度記号のデータAG1,AG2を用意しましょう。
AG1=Anglemark([1,0], [0,0], [cos(phi), sin(phi)], 0.6);
AG2=Anglemark([cos(%pi/2-theta), sin(%pi/2-theta)], [0,0], [0,1], 0.6);
関数Em1,Em2を用意します。Em1はxy平面からxyz空間への写像 $(x,y)\mapsto (x,y,0)$、Em2はxz平面からxyz空間への写像 $(x,z)\mapsto (x,0,z)$に回転行列Aを合成した写像。これらの埋め込み関数で角度記号AG1,AG2をそれぞれ移します。
function Em1=Em1(x,y); Em1=[x,y,0]; endfunction
function Em2=Em2(x,z); Em2=[x,0,z]*A; endfunction
Angle_phi=Embed(AG1,Em1);
Angle_theta=Embed(AG2,Em2);
Angle_phi=Embed(AG1,Em1)は、方向ベクトルのxy平面への射影とx軸との間の角度記号で、Angle_theta=Embed(AG2,Em2)は方向ベクトルとz軸との間の角度記号となります。
[このページのトップへ]
座標軸にラベルを付ける
3次元空間の座標軸にラベルを付けるには、Xyzaxparanameを使います。今、軸のデータaxisに、x, y, zとラベルを振りたいので、Beginpicture以下でXyzaxparaname(axis,'x','y','z')とします。
Openfile('tex/angle_mark.tex');
Beginpicture('1.5cm');
...(中略)
Xyzaxparaname(axis, 'x', 'y', 'z');
...(中略)
Endpicture(0);
Closefile();
[このページのトップへ]
ソースコード
scilabファイル(.sce)のダウンロード
Setangle(70,30);
Setwindow([-1,1], [-1,1.5]);
axis=Xyzax3data('x=[0,1.2]', 'y=[0,1.2]', 'z=[0,1.2]');
phi=60*2*%pi/360;
theta=40*2*%pi/360;
A=[ cos(phi), sin(phi), 0;..
-sin(phi), cos(phi), 0;..
0, 0, 1];
B=[ cos(-theta), 0, sin(-theta);..
0, 1, 0;..
-sin(-theta), 0, cos(-theta)];
C=B*A;
Q=[0,0,1];
Pxy=[1, 0, 0;..
0, 1, 0;..
0, 0, 0];
L=Spaceline([[0,0,0], Q*C]);
Lxy=Spaceline([[0,0,0], Q*C*Pxy]);
addL=Spaceline([Q*C, Q*C*Pxy]);
AG1=Anglemark([1,0], [0,0], [cos(phi), sin(phi)], 0.6);
AG2=Anglemark([cos(%pi/2-theta), sin(%pi/2-theta)], [0,0], [0,1], 0.6);
function Em1=Em1(x,y); Em1=[x,y,0]; endfunction
function Em2=Em2(x,z); Em2=[x,0,z]*A; endfunction
Angle_phi=Embed(AG1,Em1);
Angle_theta=Embed(AG2,Em2);
//Windisp(Projpara(L, Lxy, addL, axis, Angle_phi, Angle_theta));
Openfile('tex/angle_mark.tex');
Beginpicture('1.5cm');
Drwline(Projpara(L), 1.2);
Drwline(Projpara(Lxy), 0.8);
Dashline(Projpara(addL), 0.5, 0.4);
Drwline(Projpara(Angle_phi, Angle_theta), 0.5);
Drwline(Projpara(axis), 1);
Xyzaxparaname(axis, 'x', 'y', 'z');
Expr([0,-0.25], 'c', '\varphi');
Expr([0.13,0.45], 'c', '\theta');
Endpicture(0);
Closefile();
[このページのトップへ]