126

大島スプライン曲線の応用とKeTCindy プログラミング
東邦大学・理学部

高遠節夫

Setsuo Takato, Faculty of Sciences, Toho University

1

はじめに
Cinderella ([1]) は動的幾何ソフト (DGS) の1つであり,他の DGS と同様に図形表示の画面 (CindyScreen) 上に幾何要素を描き,動かすことができる.さらに,CindyScriptというプログラミング言語をもっている.これは,幾何要素の操作にとどまらず,一般のプログラミング言語のように,いろいろな要素を扱う関数を作ることができる.実際,私たちが開発している KETCindy はCindyScript のマクロパッケージであり,D丁自 をベースとし,様々な図を教材や研究論文に挿入するための教材作成支援ツールである.
([8],[9] ) . CindyScreen と CinsyScript エディタの画面は図1のようになっている.

. . c\cdot\cdot 1-\cdot uu\cdot\cdot

g\cdot n\cdot , ote Lcstplot sgABCA

r\cdot od IUsersltokotoosetsuolketcindychonge txt

i_{9} \mathfrak{o} lreody exists/\ltimes c.sh executoble
g\cdot n\cdot\ulcorner ate Lcstplot sgARCA-\cdot \mathfrak{a}d IUsersltokatoosetsuolkttcindychonge txt,19\mathfrak{o}treody exists/kc . ih extcutable

図1 CindyScreen と CindyScript エディタ

数学の教員は,印刷教材を作成して授業で配付することが多い.その際,大学初年級高専では L^{A}T\int X がしばしば用いられるが,それは,彼らは普段から論文を作成するために聾 E を使うことが理由と考えられる. \iota\Phi j\Gamma|Cindy を用いれば,それらの教材に必要な図を容易に作成することができる. I\Phi j\Gamma Cindy は,ketpic com ([4]) のトップページにある Link List から OS ごとのInstaller に行けば,無償でダウンロードすることができるようになっているが,最近では CTAN (Comprehensive TEX Archive Network) [5]からもダウンロード可能である.すなわち,CTAN のページに行って,ketcindy でキーワード検索すればよい.ただし, I\not\in j\Gamma Cindy のパッケージ以外に,必須のソフトとしてCinderella [1], R[2] および数式処理を利用するのであれば Maxima [3] をインストールする必要がある.

一例として,ここでは自由曲線を用いた教材の作成方法を示すことにする.自由曲線は数学の教材作成にしばしば有用であるが, \iota\Phi j\Gamma Cindy は,Bezier, Mkbezierptcrv,CRspline, Ospline など,Bézier 曲線に関するい \langle つかのコマンドを実装している.
れらのうち,Bezier とMkbezierptcrv では,通過点 (節点) とそれ以外の制御点をすべて与える必要があるが,CRspline と Ospline は通過点を与えるだけでスムーズな曲こ127
線を作るものである.ここでは,Catmul‐Rom スプラインを描 \langle CRspline を用いることにする. I\Phi j\Gamma Cindy で BT\mathbb{R} 用図データ (以下,プロットデータ) を作成する手順は次の通りである.

1. I\Phi j\Gamma Cindy をインストールしてできた作業ディレクトリにある template またはサンプルファイルをダブルクリックする.このとき画面上に現れる白い枠は L^{A}IEXのpicture 環境の描画領域を表している.
2. 画面上の点 SW と NE を動かせば,描画領域を変えることができる (図2).さらに,画面上に点 A, B, C, D を追加する (図3).これらの点も動かすことができる.

図2初期画面

図3点の追加

3. CindyScript エディタにコマンドCRspline (^{1\prime}1^{11}, [A,B,C,D]) ; を書き込むと自由曲線が画面上に現れる (図4).画面上で点 A, B, C, D を動かして曲線の形状を変えることができる.

4. CindyScreen の左上の Figure ボタンを押すと, R, BT\ovalbox{\t \smal REJECT} X およびPDF ビュアーが順に実行されて,図5のプロットデータが作成表示される.

図4 CR スプラインの描画

図5 プロットデータの表示

5. 図に追加したい他の要素を作成するコマンドを,例えば次のように書き込む.
CRspline (^{\prime 1}1^{11} , [A , B, C,D]) ;pt= [ C.x , B . y ];Listplot (^{11}1^{11} , [ B , pt , C , B ]);Bowdata (^{1 }1^{\ovalbox{\t\smal REJECT}\prime} , [ B , pt] , [^{1\prime}do^{1\prime} , 11E=\backslash Delta x]);Bowdata (" 2" , [pt , C] , [1.5 , |do" , |1E=\backslash Delta y ]) ;Letter (B , ` ` n `, ` ` p') ) ;Ht ickmark ([B. x , llllx , C. x , 11\backslash xi^{I1}]) ;Vt i ckmark ( [B. y , 11f(x)^{1\prime} , C. y , 11f(\backslash xi)^{11}]) ;128
再び Figure ボタンを押せば,教材用のプロットデータが完成する.

図6他の要素の追加

効果的な印刷教材のためには,図や文などの要素を適切に配置することが必要である.
私たちが開発した ketpic.sty, ketlayer.sty には,layer という T[X の環境が定義されていて,教材を構成する要素 (特に図) を教材の中に自由に配置することができる.
\backslash begin\{layer\}\{150\}\{0\}\backslash putnotese\{80\}\{5\} { \backslash inputf\{fig/ graphl. tex}}\backslash end\{layer\}
図7はこのようして作成された図を用いた教材例である.
関数 y=f(x) のグラフ上に点 P(x, f(x))

をとり,P の近 \langle の点を(\xi, f(\xi)) とお \langle.

\triangle x=\xi-x, \triangle y=f(\xi)-f(x)\frac{dy}{dx}=\lim_{\xiar owx}\frac{\triangley}{\trianglex} を微分係数という.
問 ; f(x)=x^{2} のとき\frac{dy}{dx} を求めよ.のとき

図7教材例

Catmul‐Rom スプライン曲線はよ \langle 知られており,自由曲線を描いたり非線形補間を行うときにしばしば用いられている.しかし,その補間が有効でない場合も少な \langle ない.
例えば,図8のように,楕円上の4点 A, B, C, D で作られる Catmul‐Rom スプライン
曲線は楕円から大き \langle ずれている.

Paramplot (^{\prime 1}1^{1\prime} , 1[3*\cos(t), 2*sin(t)]^{1\prime} , 11t=[0 , 2*pi]^{11} , [^{11}da^{1\prime} ]);// to show the ellipse by dashed line.
A=[3 , 0];B=[0 , 2 ] ;C=[-3 , 2] ;CRspline (^{11}1^{11} , [A,B , C,D,A]) ;D=[0 , -2] ;129
ここで,黒点は Catmul‐Rom スプライン曲線の制御点である.

図8楕円を近似する Catmul‐Rom スプライン曲線

そこで,大島利雄氏は制御点のとり方を工夫して,より精度の高い近似を与えるスプライン曲線を求める方法を提案した ([6]). I\not\in j\Gamma Cindy では,このスプライン曲線を描 \langle
コマンドOspline を実装した.次節では,その詳細と応用について述べることにする.

2

大島スプライン曲線
P_{j-1} , P_{j} , P_{j+1}, P_{j+2} は曲線の通過点 (節点) とし,区間 P_{j}P_{j+1} の制御点を Qj, Rj

とおく.Catmul‐Rom スプライン曲線の場合は,これらの制御点はarrow 1arrow arrow 1arrow

P_{j}Q_{j}=\overline{6}^{p_{j-1}p_{j+1}}, P_{j+1}R_{j}=\overline{6}^{p_{j+2} p_{j}によって定められる.上の方程式で係数は定数\frac{1}6 であることに注意する.このため,図8の点 A, B の近 \langle で見られるように,曲線の曲がり具合の大きい部分が現れる.これを改良するために,大島氏は次の方程式を提唱した.

ar ow \frac{P_{j}Q_{j}+R_{j}P_{j+1} {P_{j}P_{j+1} =\frac{4}{3(1+ \cos\frac{\theta}{2})}\vec{P_{j}Q_{j}}=cP_{j-1}P_{j+1}arrow,\vec{P_{j+1}R_{j}}=cP_{j+2}P_{j},ただし,\theta は線分 P_{j-1}P_{j+1} とP_{j}P_{j+2} の間の角である.

+2P_{j}

図9 Catmul‐Rom スプライン

図10大島スプライン

130

図9と図10はそれぞれ Catmul‐Rom スプライン曲線と大島スプライン曲線を同一の節点と制御点で描いたものであり,後者の曲線が全体としてふっ \langle らしているのが見られる.また,図11は先の例の楕円 (図8の破線) について大島スプライン曲線を重ねたものであり,2つの曲線はほとんど重なっている.
大島スプライン曲線が常に最良の非線形補間を与えるとは言えないにしろ,多 \langle の場合において,Catmul‐Rom スプライン曲線に比してより良好な近似が得られる.私たちは大島スプライン曲線を用いて,数値積分 Integrate と数値微分 Derivative,Findareaのアルゴリズムを改良した.なお,大島氏は,複素積分を含む数値積分および不定積分の計算ライブラリをRisa / Asir で開発し,公開している ([7]).
Integrate

点 P_{j}, P_{j+1}, P_{j+2}, P_{j+3} で定まる Bézier

曲線を C とし,各恥の座標を (x_{k}, y_{k})とお \langle.

C の方程式は次のようになる.

P=P_{j}(1-t)^{3}+3P_{j+1}(1-t)^{2}t+3P_{j+2}(1-t)t^{2}+P_{j+3}t^{3}(0\leqq t\leqq 1)

積分\int_{x_{j} ^{x_{j+3} ydx は次で計算される.図12 Bézier 曲線の積分\int_{x_{j} ^{x_{j+3} ydx=\int_{0}^{1}y\frac{dx}{dt}dt

ただし P(x, y)(1)

I\Phi j\Gamma Cindy はMaxima を呼んで数式の計算をし,結果を文字列として受け取るコマンドを実装している ([9]). これらのうち,Mxfun およびCalcbyM は,それぞれ単独および複数の Maxima コマンド用であり,上の (1) はCalcbyM を用いて次のように計算される.
cmdL=[1P : [xl,yl ] *(1-t)^{\wedge}3+3*[x2, y2]*(1-t)^{arrow}2*t+3 * [ x3 ,y3 ] *(1-t)*t^{\wedge}2+[x4, y4]*t^{\wedge}3^{11} , [],1f:P[2]* diff (p [1] , t)^{11} , [],“‘ ans: integrate” , [^{\prime 1}f^{1\prime} , 11t^{11} , 0 , 1],

131
131
1anS^{11}, []] ;CalcbyM (^{11} an s^{11} , cmdL) ;println(ans) ;結果は以下の文字列として得られる.

((10*x4-6*x3-3*x2-xl)*y4+(6*x4-3*x2-3*xl)*y3+(3*x4+3*x3-6*xl)*y2+(x4+3*x3+6*x2-10*xl)*yl)/20

この式を組み込んで修正した integrate の計算例をい \langle つか示すことにする.

例1\int_{0} アx^{2}\sin xdx

Plotdata (^{11}1^{11} , 1\prime x^{\wedge}2*sin(x)^{11} , 1x= [ -pi , pi] , [^{11}Num=50^{\prime 1} ]);ans Integrate (^{1\prime}grl^{1\prime} , [ 0 , pi] ) ;println(Sprintf (ans , 6));11=

結果は5.869063であり,Maxima によって確認することができる.
Mxfun (^{11}1^{11} , “ integrate” , [^{1\prime}x^{\wedge}2*sin(x)^{11} , 11x^{\prime 1} , 0 , 11\%pi^{11} ]);Mxfun (^{11}2^{11} , “ float” , [mxl]);

Maxima による計算結果は%p i^{\wedge}2-4 で,浮動小数点では5.869604401089358である.
例2楕円\frac{x^{2} {3^{2} +\frac{y^{2} {2^{2} =1 で囲まれた領域の面積

Findarea は,閉曲線で囲まれた領域の面積を求めるコマンドである.
Paramplot (^{1\prime}1^{11} , 1\prime[3*\cos(t) , 2*sin(t)]^{11} , 11t=[0 , 2*pi]1 , [^{11}Num=50^{11} ]);ans =\Gamma indarea ( gpl^{11}) ;println(Sprintf ( ans/(6*pi) , 6));

結果は0.999998であり,\frac{S}{\piab} の良好な近似を与えている.

注上の例に大島氏のライブラリ ([7]) を適用するとeval (os‐md. areabezier( [[-3*\cos(x) , 2*sin(x)],-50 ,[0 , 2 * @pi]])/@pi/6);で計算され,結果は0.999999828426758とさらに精密になる.

Integrate は,単に関数だけではな \langle プロットデータにも適用できることを注意してお \langle . 実際,例1のgrl や例2の gpl は,51個の点からなるリストである.
例3陰関数の積分

I\Phi j\Gamma Cindy のコマンドImplicitplot によって,陰関数で定義される関数のデータが得られる.そのときの積分は次のスクリプトで求められる.

132
Implicitplot (^{1\prime}1^{11} , 118*x^{arrow}2-4* sqrt ( 2)*x*y+y^{\wedge}2-3*x-6* sqrt ( 2)*y+2=0^{11} ,1\prime X^{=[-2,2]^{1111}y^{=[-2,2.5]^{1\prime})};}
P= Ptstart ( imp l^{11} ) ;Q= Ptend ( imp l^{11} ) ;Letter ([P , n^{11} , ||p^{11} , Q , ||||n , |1Q^{11}]) ;ans Integrate (^{1\prime} imp l^{11} , [Q‐l , P‐l]);println(Sprintf (ans, 6));=

結果は1.699186である.

図13陰関数の場合の積分

Derivative

プロットデータを大島スプライン曲線で近似することによって,その数値微分を求めることもできる.図12の点 P_{j} における微分は,式(1) を t で微分して t=0 とおけば\frac{dP}{dt}=-3P_{j}+P_{j+1}
これを用いて,コマンドDerivative およびプロットデータの接線を描 \langle Tangentplotを実装した.以下は,例3の曲線に Tangentplot を適用して接線を引 \langle 例である.
dx=(Q_{-}1-P_{-}1)/10 ;f orall (0 . . 10 , ii,

name text (ii) ;=v=P_{-}1+ii*dx ;rng =1x=+f ormat (v , 6 ) ;Tangentplot (name , “ impl” , rng, [^{11}dr , 0.2^{11}] ) ;) ;3曲面の描画への応用

図14陰関数の場合の接線

数学の授業では,空間曲面を入れた教材がしばしば必要となる.その際,印刷教材には線画が適している.線画であれば,学生自身が式や補助線を書き入れることができるからである (図15).

\iota\Phi j\Gamma Cindy はこのような線描画をサポートしている.

図15曲面の線描画

図16曲線の分割

133
I\Phi j\Gamma Cindy の線画の作成手順は以下の通りである.

Step 1) まず,曲面 x=x(u, v), y=y(u, v), z=z(u, v) の輪郭線 (シルエットライン)
を次の陰関数から求める.

J(u, v)= \frac{dX}{du}\frac{dY}{dv}-\frac{dX}{dv}\frac{dY}{du}=0
ここで,(X, Y)= Proj (x, y, z) は投射面への射影である.

Step 2) 次に,輪郭線および境界線と射影された平面曲線との交点を求める (図16).
Step 3) これらの交点によって平面曲線を分割し,各部分が曲面で隠されているかどうかを決定する.

上に挙げた手順のうち,陰線処理のためには Step 2が本質的であるが,曲線どうしが接するような場合は,プロットデータの実態は多角形であるため,交点を求めることが難し \langle なる (図17参照).

図17曲線が接する場合

そこで,Step 2の計算を精密化するために,接点の近 \langle の曲線部分 (線分) を大島ス
プライン曲線によって補間することにし,そのアルゴリズムを平面曲線の交点を求める
コマンドIntersectcurves に組み込むことにした (図18).

図18大島スプライン曲線の利用

134
この結果,交点を求め損なう場合は大幅に減少し,陰線処理の精度は大き \langle 改善された.接点の近 \langle では,一般には近隣にある複数の点が返されることになるが,上記の円錐の例では,求められた交点の1つは次のようである.
P=[-1.65827, 1.20578](1)

この例については,Maxima で正確な交点を求めることができる.結果は

P=[-1.656701299244927, 1.210755779027779](2)であり,(1) が良好な近似を与えていることが見られる.
さらに,陰線処理にかかる時間を短縮するために, \iota\Phi j\Gamma Cindy から C コンパイラgccを呼ぶコマンドを実装していたが,それを改良した.gcc によって図17左図の \Psi X ファ
イルを生成する CindyScript のスクリプトは以下の通りであり,CindyScript や R では数分かかっていたのが,数秒程度で図が作成されるようになった.
fd=[11z=4-(x^{A}2+y^{\sim}2)^{\prime 1},||x=R*\cos(T)^{11} , |1y=R*sin(T)^{11}||R=[0 , 2 ] ’ , |T=[0 , 2*pi]^{11} , ||1e,|] ;St art surf () ;Sfbdparadata (^{1 }1^{\prime\ovalbox{\t\smal REJECT} , fd) ;Crvsfparadata (^{1\prime}1^{11} , ax3d' , “‘ sfbd3dl ” , fd);
Wireparadata (^{11}1^{\prime 1} , “‘ sfbd3dl ” , fd, 5 , 2*pi/6*(0. .5) );ExeccmdC (^{11}1^{11} , [^{1111} ] , [] ) ;\iota\Phi j\Gamma Cindy はパラパラ動画や animate.sty によるアニメーションを作成する機能を持っており,gcc による高速化は空間曲面の動画を作成することをも容易にした.
では,Möbius の帯の例を紹介することにする.まず,動画を作るときの CindyScreen はここ次の図19のようになっている.

図19空間図形のCindyScreen

135
また,以下のスクリプトをCindyScript エディタに書き込む.
Start3d ([A , B , C , S , Sl , Sr]) ;mf (s) :=(regional (tmp) ;Start surf () ;fd=[^{1\prime}p^{11},|1x=2*\cos(t)*(2+r*\cos(t/2)) ” ,|1y=2*sin(t)*(2+r*\cos(t/2)) ” ,||z=2*r*sin(t/2) ” , ||r=[-0.4 , 0.4]^{11} , |\prime t=[0 , |1+text ( s)+^{11}]^{11} , “ nsew”] ;Sfbdparadata (^{11}1^{11} , fd) ;tmp select ( (1. . 12)/12*2*pi, \#<=s) ;Wireparadata (^{11}1^{11} , 1\prime sfbd3dl ” , fd, 5 , tmp) ;ExeccmdC (^{|1\prime\prime} , [^{| \prime 1} ] , [^{\prime 1} nodis p^{11} ]) ;=) ;Setpara (^{\ovalbox{\t \small REJECT}\ovalbox{\t \small REJECT}}mobius" , 11mf(s) ^{1\prime} , 1s=[0,2*pi]^{11} , [^{11}Div=24^{11} ]);パラパラ動画では Flip ボタン,アニメーションでは Anime ボタンを押せば,動画を構成する各スライドが生成される.

図20 Möbius の帯のスライド

4

まとめ大島スプライン曲線は,多 \langle の場合において非線形補間の精度が高 \langle , 本稿で取り上げたようにいろいろな応用が考えられる.教員が数学ソフトウェアを用いて教材を作ろうとするとき,そのソフトウェアが提供する機能だけでは足らない場合も多い.そのた136
めに普通の教員が容易に使えるプログラミング言語は重要な要素であり,CindyScript はそのような言語の1つである.加えて,図17や図18のように,画面上で確認しながらプログラミングを進めることができる点も大きな長所である. I\Phi j\Gamma Cindy は,CindyScriptを用いることで,多 \langle の機能拡張がなされている.また, I\Phi j\Gamma Cindy から R , Maxima, Cなどの呼び出しができることは,より適切な教材を作るために有用である場面も少な \langleない.現時点では,ベジェ曲線どうしの交点を数値的な方法により求めることで接点の近似値を得ているが,大島氏から,さらに工夫の余地があるのではないか,との助言をいただいた.これについては C との整合性の検討と合わせて,今後の課題としたい.
謝辞本研究は JSPS 科研費 16K0115,18K02948,18K02872 の助成を受けている.

参考文献[1] Cinderella, http: //www . cinderella. de/tiki ‐index. php[2]

R , https: //www.r ‐project. org[3] Maxima, http://maxima.sourceforge.net[4] KeTpic, http://ketpic.com[5] CTAN, https://ctan.org[6] Oshima T., Drawing Curves, Mathematical Progress in Expressive Image SynthesisIII, edited by Y. Dobashi and H. Ochiai, Mathematics for Industry, 24, 95‐106,Springer, 2016 ISBN : 9789811010750.

[7] Oshima, T., os muldif.rr, a library for a computer algebra Risa/Asir,

2008 ‐ 2018,

ftp: // akagi. ms. u ‐tokyo. ac. jp/pub/math/muldif/[8] Takato S., What is and how to Use KeTCindy— Linkage Between Dynamic Ge‐
ometry Software and Collaborative Use of KetCindy and Free Computer Algebra

Systems and 聾丁庄 Graphics Capabilities−, Mathematical Software −ICMS 2016,LNCS 9725, 371‐379, Springer, 2016.

[9] Takato S , McAndrew, Vallejo J , Kaneko M., Collaborative use of KeTCindy andfree Computer Algebra Systems, Mathematics in Computer Science 113‐4 , 503‐514, 2017.

[10] TakatoS,VallejoJ,

Interfacing Free Computer Algebra Systems andCwithKeTCindy, Computer Algebra Systems in Teaching and Research, Siedlce Uni‐
versity of Natural Sciences and Humanities Volume 6, 172‐185, 2017[11] Takato S , Vallejo J , Hamiltonian dynamical systems: symbolical, numerical andgraphical study, to appear in Mathematics in Computer Science,2018.