数理解析研究所講究録
第 1780 巻 2012 年 154-159

154

陰影を付けた立体図の KETpic による描画

長野工業高等専門学校一般科

前田

善文 (Yoshifumi Maeda)

Fuculty of General Education,
Nagano National College of Technology
東邦大学薬学部 高遠 節夫 (Setsuo Takato)
Fuculty of Pharmaceutical Science,
Toho University

1

はじめに教材によっては，図やグラフがあれば容易に理解を深めることができるものがある．
教材に必要な図やグラフを手軽に作成でき，簡単に位置を指定して文書中に張り付けることができるツールとして KETpic はとても便利である．KETpicには豊富なコマンドがあり，さらに図を作成する上でのきめ細かな設定も行うこともでき，平面図形は勿論のこと立体図形も簡単に思い通りの作図をすることができる．

Scilab 版の $Iqr_{P}ic$ を使って，まず始めに正確な立体図があれば理解が深まるような教材について作成を行った．例として，3 次元極座標の説明のために作成した図を右に示す．次に 2 重積分の求積問題における立体図を作成したが，立体感が少し乏しかったため，立体図に陰影を付けるこ

3 次元極座標とを試みた．

2

研究の内容陰影を付けるにあたって，考慮したことは次の 2 点である．

(1) 印刷教材の作成を目的とする．
(2) すべてを TEX 文書として作成する．
3 次元コンピュータグラフィックス (CG) のような精緻な陰影のついた図 (画面) の作成を目的とするのではなく，学生が印刷された図を見て，立体的に見えることによって内容の理解が深まるような立体図を作成することが目的である．

また，すべてが Tffi 文書という作成のための制限があるが，逆に大きな画像ファイルを取り込む必要がなく，作成された PDF ファイルの大きさは小さなものになるという利点がある．

155$Iw_{P}ic$ のコマンド Shade を用いた．いくっかの閉陰影を付けるための方法として，曲線のリストを作り Shade によって閉曲線の内部を濃さを変えながら塗りつぶしていくという方法で陰影を付けることにした．立体図に陰影を付ける基本的な方法として円柱と球面に陰影を付ける例で 3 通りの方法を紹介する．

2.1

方法 1

外側から内側に向かって明度を上げながら塗りつぶす方法(図は水平に光があたっている円柱を正面から見た場合)

Scilab のプログラムを次に示す．
Setwindow $([-5,5],[-3,3])$ ;: 横幅 8, 円の半径 2$LnX=4;LnY=2$ ;Shd $=1;ShdO=0.1$ ; Shdl $=0.5$ ; Shd2 $=0.4$ ; Spw $=2$ ;: 明度を計算する定数: 図形データを保存するリスト
LO list ;$=50$;
KO: 分割数
Th %pi/2;TO Th/KO;:TO は分割された角度
for $k=0$ : KO-1,: 長方形の縦の長さの半分$Py=LnY*\cos(k*$ TO ;LO ($ 1) Framedata([-LnX, $LnX]$ , [-Py, Py]) ;: 長方形の図形データ
end
Openfile(‘shadel.tex‘) ;: ファイル shadel tex をオープン
Beginpicture (‘ lcm’) ;for $k=0$ : KO-1,Ts %pi/2 (1-k/(KO-1)); : 円柱の法線と光のなす角
TpTs;: 反射光と視線のなす角
if Tp %pi/2 then Tp %pi/2; end
Mc $=ShdO+$ Shd $1*\cos$ (Ts) Shd $2*(\cos(Tp))^{\wedge}$ Spw ;: 明度 (注参照): 塗りつぶす濃さ
Mc Shd (1-Mc);‘Texcom { color [cmyk] $0,0,0,’+$ string (Mc) $+’\}’)$ ;: 色指定 (黒の濃さ)
Shade $(LO(k+1),1)$ ;:LO(k l) は長方形のデータ，内部を塗りつぶす
Texcom ’}’ ;end
Endpicture(0) ; Closefile ;$=$$()$$=$$=$$)$

$=$

$+$

$=$

$*$

$=2^{*}$$>$$=$$+$$=$$*$$($$\yen$$($$)$$+$$()$《注》明暗のコントラストにより立体感を与える技法としての Phong shading に準じて明度の計算を行っているが，教材作成を主目的としているためこの方法によらず立体の特徴が分かるような簡単な shading 方法でよいと考える．

156
2.2

方法 2

区分求積法と同様に立体の表面を細長い帯状 (短冊) に切って塗りつぶす方法(水平に光があたっている円柱を視点を $22 °$ 横にずらして見た場合): 視角 Phi $=22 °$: は楕円の短軸の長さ: 明度を計算する定数$LnX=4;LnY=2$ ; Phi $=$ 22/180 %pi;$*$

$A=LnY;B=\tan$ (Phi) $*LnY$ ;$B$

Shd $=1;ShdO=0.1$ ; Shdl $=0.5$ ; Shd2 $=0.4$ ; Spw $=2$ ;: 図形データを保存するリスト
LO list ;: 分割数
KO $=50$ ;Th %pi/2;TO Th/KO;:TO は分割された角度: 初期値 分割点 に設定
XO $=LnX;YO=LnY$ ;for $k=0:2^{*}K0-1$ ,$TsO=k*$ TO; Tsl $=(k+1)*$ TO;: 分割点 1
X $1=LnX-B*\sin$ (Ts 1) ;Yl $=A*\cos$ (Ts 1) ;:2 点を結ぶ線分
G Listplot $([XO,YO],[XI,Y1])$ ;G Joincrvs(G,Listplot([Xl,Yl], $[X1-2*LnX$ ,Yl])) ; : 線分の連結
G Joincrvs $(G$ , Listplot ( $[X1-2*LnX$ , Yl], $[XO-2*LnX$ , YO]) ;G Joincrvs ( , Listplot ( $[XO-2*LnX$ , YO], [XO,YO])) ; : 閉曲線を作成$=$$()$

$=$

$=$

$0$

$=$$=$$=$$)$$G$$=$: 短冊形のデータ: 分割点 1 を分割点LO($ I) $=G$ ;$+$$XO=X1;YO=Y1$ ;$0$に設定

endOpenfile(’shade2.tex’); Beginpicture(’lcm‘);
for $k=0:KO-1$ ,Ts %pi/2 (1-k/(KO-1)); Tp $=2*$ Ts;
if Tp %pi/2 then Tp %pi/2; end: 反射光と視線のなす角の余弦
Sc2 $=\cos$ (Tp) $*\cos$ (Phi) ;: 明度
Mc $=Shd0+$ Shd $1*\cos(Ts)+$ Shd $2*$ Sc Spw ;: 塗りつぶす濃さ
Mc Shd (1-Mc);: 色指定 (黒の濃さ)
Texcom(‘ { color [cmykl 0,0,0,’ $+string$ (Mc) $+’\}’)$ ;: 内部を塗りつぶす
Shade $(LO(k+1),1)$ ; Shade $(LO(2*K0-k),1)$ ;: 注参照
Drwline(LO(k 1));
Drwline $(L0(2*K0-k))$ ; Texcom ‘}‘ ;endEndpicture(0); Closefile ;
$=$

$*$

$>$

$=$

$2^{\wedge}$

$=$

$*$

$\yen$$+$$($$)$$()$《注》幅の狭い図形の内部を塗りっぶすとき，塗り残しが無いように境界線も描画する．

157
2.3

方法 3

2 重積分と同様に領域を微小領域 (矩形) に分割し，対応する微小曲面を塗りつぶす方法(左上から光があたっている球を正面から見た場合): 球面の半径: 光がくるの方向$R=2$ ;

$ThO=60;PhiO=-20$ ;Th ThO/180 %pi; Phi PhiO/180 %pi;$(\theta=60 °, \varphi=-20 °)$Vd [ (Th) $*\cos$ (Phi), (Th) sin (Phi), (Th)] ;: 光線の方向ベクトル$=[1,0,0]$Ve;: 視線の方向ベクトル
Shd $=1;ShdO=0.2$ ; Shdl $=0.45$ ; Shd2 $=0.35$ ; Spw $=2$ ;: 明度を計算する定数$KO=35$ ;Kl $=90$ ;:の 2 方向の分割数$=$$=$$*$$=$ $\sin$$*$$\sin$$\cos$$*$$\theta,$$\varphi$$\theta$は $x$軸と動径のなす角， は$\varphi$$yz$

平面への正射影とDth %pi/2/KO;Dph 2 %pi/Kl;
Openfile $(’ shade3$ .tex’ ; Beginpicture(‘lcm‘);$DthO=0$ ; RO $=R*\sin(DthO)$ ;: 初期値$j=1:KO$for,$DphO=0$ ; Dthl $=DthO+Dth$ ; Rl $=R*\sin(Dthl)$ ;
$=$

$=$

$y$

$*$

軸とのなす角を表す: 分割された角度$d\theta,$$d\varphi$$)$$\varphi_{0}=0,$$\theta_{0}=0,$$r_{0}=0$: 初期値$\theta_{1}=\theta_{0}+d\theta,$$r_{1}=R\sin(\theta_{1})$$P0=R0*[\cos(Dph0),\sin(Dph0)];Pl=Rl*[\cos(Dph0),\sin(Dph0)]$ ;for $k=1:K1$ ,:Dphl Dph $0+$ Dph;$=$$\varphi_{1}=\varphi_{0}+d\varphi$[ (Dphl), (Dphl)] ; $P3=R0^{*}$ [ (Dphl), (Dphl)] ;G Listplot (PO,Pl,P2, P3,PO) ;: 閉曲線を作成$PO=P3$ ; Pl $=P2;DphO=Dphl$ ;$Vn=$ [ $\cos(DthO)$ , sin(DthO) cos $(DphO),\sin$ (DthO)
sin $(DphO)$ ] ;Kd Dotprod(Vn,Vd);:Vn は球面の法線ベクトル
Vs $=2*$ Kd $*Vn-$ Vd;:Vs は反射光の方向ベクトル
if Kd $<0$ then Kd $=0$ ; end
Ks Dotprod(Ve,Vs); if Ks $<0$ then $Ks=0$ ; end :Ve は視線方向
Mc $=ShdO+$ Shdl Kd Shd $2*$ Ks Spw ;: 明度
Mc Shd (1-Mc);: 塗りつぶす濃さ
Texcom { color $[cmyk]0,0,0,’+string$ (Mc) $+\}’)$ ;: 色指定 (黒の濃さ)
Shade $(G,1)$ ;Drwline(G) ;: の内部と境界線を塗りつぶす
Texcom ‘}‘ ;$P2=R1^{*}$ $\cos$$\sin$$\sin$$\cos$

$=$

$*$

$*$

$=$$=$$\wedge$

$*$

$=$

$+$

$*$

$(’$$\yen$$G$$($$)$

end$RO=R1;DthO=Dthl$ ;end
Endpicture(0) ; Closefile ;$()$: 次のループのための初期設定

158《注》 この例では，2 重に for 文を実行しているため，分割数の 35 と 90 に対して$35\cross 90$ すなわち 3150 回の繰り返しが必要となる．ファイルをオープンする前に図形のデータを作成してリストに保存していると，繰り返しの回数が 2 倍になり，実行時間がその分長くなる．実行時間を短縮するために閉曲線を作成すると同時に内部と周の塗りつぶしを行って陰影を付けている．作成された現 X ファイルは 887KB,実行時間はパソコンの機種により異なるが 1 分程度である．作成された図をよく見ると，鱗のように筋が入っている．これは分割数を増やせば目立たなくなるが，作成された TEX ファイルが大きくなり，実行時間も長くなる．印刷したときの状態をみて分割数を決めればよい．

2.4

各方法の利点と欠点

方法 1 と方法 2 は円柱や円錐などの簡単な図形の場合には，プログラムの作成も容易であり，印刷教材に立体感を表現するためには適しているといえる．球面の場合も視線の方向と光源の方向が一致している場合は方法 1 または方法 2 で作成することができる．

また，方法 1 と方法 2 では $Iqr_{P}ic$ によって作成された Tffl ファイルの大きさも小さなものとなる．しかし，複雑な立体図形には対応できない．
方法 3 は複雑な立体図形や光の方向光源の数にも対応できるが，2 重のループを考える必要があるため，Scilab のプログラムも複雑になる．また，作成された Tffl ファイ

ルの大きさも画像ファイル程ではないが方法 1 や方法 2 と比べてはるかに大きくなる．
.

このことから，印刷教材を作成するにあたって，どの程度に陰影を付けて立体感を表現する必要があるかを見極めて，必要に応じて陰影を付ける方法を選択することが大切であると考える．

3

陰影を付けた立体図の作成例(2)

上面と側面の陰影は光の方向が異なるが，立体の特徴を表すために敢えて方向を変えて方法 1 によって作図した．

$z$

線画では上面が凹んで見えるが，陰影を付けることによって円錐面と同じように膨らんで見えるようになる．

159
(3)

曲面

(4)

曲面

$: \frac{x^{2}}{4^{2}}+\frac{y^{2}}{5^{2}}+\frac{z^{2}}{3^{2}}=1$

視線の方向角 : $\theta=70 °,$ $\varphi=25 °$ ,分割数 :4$:z= \frac{x^{2}}{4}-\frac{y^{2}}{4}$

視線の方向角 : $\theta=75 °,$ $\varphi=-70 °$
分割数 : $70\cross 25$$35\cross 90$

考察と今後の課題$oe\Gamma pic$を使う以前には，教材作成をするにあたり，図を挿入すると理解が深まると思われる内容についても作図が困難であったため，文章だけで説明するか教科書等の図をコピーして貼り付けて使用していた．
を使い始めてからは，教材の内容に適した図を工夫して簡単に作成することできるようになり，わかり易い図入り教材を作成することが可能になった．さらに，教材作成の負担も軽減され，新しい教材作成の意欲も増して楽しく教材作成ができるようになったといえる．
これまで比較的単純な立体図形に陰影を付けることを試みたが，今後はさらに様々な立体図形に陰影を付けることと，より立体的に感じられるための方法について検討して$I\Phi r_{P}ic$いきたいと考えている．さらに，現在は立体ごとに立体の特徴から陰影を付けることを行ってきたが，一般に曲面の方程式等を与えることによって自動的に陰影を付ける手法についても考えていきたい．

また，学生たちに立体感覚を養わせるためにも，$\Phi Fpic$ は有効であると考えられる．
作図をすることによって，立体や数学への理解が深まり，数学に対する興味や関心も強くなると思われる．機会を捉えを紹介し，興味を持った学生に指導をしていき$I\Phi r_{P}ic$

たいと考えている．

参考文献[1] CASTffi 応用研究会 : $FI\Phi^{r}pic$ で楽々丁自 x グラフ』，イーテキスト研究所，2011.