132

数理解析研究所講究録
第2067巻 2018年 132-141

KETCindyの C 呼び出し機能と曲線・曲面論の教材の作成
東邦大学理学部 野田 健夫 (Takeo Noda)
高遠 節夫 (Setsuo Takato)
Faculty of Sciences,Toho University

1

はじめに

高専大学における数学教育では,平面図形空間図形による直観的理解は非常に重要であり,正確で見やすい挿図が常に求められている.著者の一人 (高遠) をはじめとする開発チームは, $\Psi$ 文書の挿図作成用のマクロパッケージである \mathrm{I}w_{\mathrm{P} \mathrm{i}\mathrm{c} と動的幾何ソフトウェアCinderella を連携させ,インタラクティブな作図環境 \mathrm{I} $\Phi \Gamma$ Cindy を構築
した [1, 2].
\mathrm{I}\mathfrak{g} $\Gam a$ Cindy によって作成される曲面は輪郭線からなる線画であり,シンプルで必要な情報が絞り込まれているので概念的に把握しやすい.しかし,従来のシステムでは陰線処理の複雑な計算をScilabや \mathrm{R} などのインタプリタ型言語で処理しているので,出力を得るのにある程度の時間を要する.

他方において,現在 $\Phi$rCindyは動画入りPDF スライド教材を作ることが可能になっており [3] , 動画のために一度にたくさんの図形データを作成する需要が生じ,処理速度の向上が期待されていた.

今回の研究では,IwCindy からの \mathrm{C} コンパイラの呼び出しを実装し,それにより曲面描画にかかる時間を大幅に短縮することに成功した.本稿ではまず \mathrm{C} 呼び出しの実装と使用について説明し,描画の高速化を活かして作成した曲面の動画を含む PDF スラ
イド教材の例を紹介する.

2\mathrm{C} 呼び出し

” 他ソフトウェア\grave{}\grave{}$\Phi \Gamma$ \mathrm{p}\mathrm{i}\mathrm{c} は,Tffl 描画用の Tpic

ソースとバッチ | \downarow 結果 (テキスト)$\iota$ \mathfrak{B} $\Gam a$ \mathrm{C}\dot{\mathrm{m} \mathrm{d}\mathrm{y} での利用

special コードを生成する Scilab
または \mathrm{R} のマクロパッケージである.なお,海外では pdfflIfflが広く用いられていることに鑑

み,pict 2\mathrm{e} コードの出力にも対応している. \mathrm{I}\mathfrak{g}$\Gam a$ Cindy は,Cin‐derella のプログラム言語である

CindyScript のマクロパッケー
ジで,そのコマンドを記述して\backslash示

図1: $\iota \Phi \Gamma$ Cindy のチャート

133

いくことでスクリーンに描画することができる.さらに,バッチ処理のボタンを押すことにより $\eta$入の描画ファイルを作成する.
最近は,同様なバッチファイルを作成実行することでMaxima, Scilab, \mathrm{R} などのソ
フトウエアを \mathrm{I}\mathfrak{g}_{$\Gam a$\mathrm{C}\mathrm{i}\mathrm{n}\mathrm{d}\mathrm{y} から利用するコマンドを順次追加している.例えば,
Mxfim \langle^{\mathrm{I}1 ^{\mathfrak{l}\mathfrak{l} , “ integrate 1\mathfrak{l}. [^{\mathfrak{l}1}\sin(\mathrm{x})^{\sim}2^{\mathfrak{l}\mathrm{I}\mathrm{I} \mathrm{x}^{\mathrm{I}1} ], [^{1\mathrm{I}\mathrm{I}\mathfrak{l} ]) ;を実行すると,以下の手順でMaximaを実行して,結果がCinderellaに戻される.

(1) integrate ( \mathrm{s} in (\mathrm{x})^{-}2,\mathrm{x} ) を主コードとする Maxima のソースファイルを作成(2) Maxima を呼び出して,結果をテキストファイルに書き出すバッチ処理を実行(3) Cinderella に戻って,ファイルから必要な文字列を抽出して変数 \mathrm{m}\mathrm{x}\mathrm{l} に代入
mxl\langle \mathrm{x}-\sin\langle 2*\mathrm{x})/2)/2^{1\mathfrak{l}}空間図形の描画については,空間曲線や多面体などの描画の場合,現TCindyで直接データを生成するが,曲面描画の場合は,陰線処理の計算が複雑であるため,従来はScilab の現T‐pic パッケージをそのまま用いて,Maxima と同様な呼び出しを行っていた.
しかし,Scilab はインタプリタ型の言語であるが故に,多くの計算時間を要する.例えば,Scilab5.5.2によって図2のグラフを作成するには,著者 (高遠) のMacbook Air 2015年モデルでは100秒程度の時間がかかっていた.実は,2007年には理Tpic の開発を始め,程なくして曲面描画のコマンドを実装したのであるが,当時から描画の高速化が課題であった. \mathrm{I}\mathrm{q}$\Gam a$\mathrm{p}\mathrm{i}\mathrm{c} では
関数データを次のような文字列で与える.
1\mathrm{z}=3*(1-(2*\mathrm{u}^{\rightarrow}2+\mathrm{v}^{\sim}2)*\exp(-\mathrm{u}^{-}2-\mathrm{v}^{\sim}2))^{||}
それを Scilab の文字列評価関数 execstr で関数値を求めるが, \mathrm{C} などのコンパイル型言語にとって

図2: \mathrm{z}=3(1-(2x^{2}+y^{2})\mathrm{e}^{-x^{2}-y^{2}})は難しい処理であった.

最近になって,gcc などの \mathrm{C} コンパイラが考えていた以上に速いことを知り,ヘッダファイルとメインファイルを書き出して,コンパイラに渡せばよいことに考え至った.
すなわち,Maxima の呼び出しなどと同様にバッチ処理を利用すればよい.具体的には,(1) Cindy Script で関数データ, \mathrm{C} での実行コマンド,表示オブジェクトのリストを定義する.
$\Gamma$ \mathrm{d}\mathrm{C}=[ ^{11} double \mathrm{u}2_{$\Gamma$^{-} \mathrm{o}\mathrm{w}(\mathrm{u},2.0).\mathrm{v}2=\mathrm{p}\mathrm{o}\mathrm{w}(\mathrm{v}.2.0)_{i}^{\mathrm{I}\prime 1}\mathrm{x}=\mathrm{u}^{\prime 1||}\mathrm{y}=\mathrm{v}^{ $\iota \iota$}.
\{|\mathrm{z}=3* (1-(2*\mathrm{u}2+\mathrm{v}2)*\exp(-\mathrm{u}2-\mathrm{v}2))^{\mathrm{I}/}].| \mathrm{u}=[-1.5, 1.5]^{\mathfrak{l}\downarrow},\vee-[-1.5, 1.5]^{\mathfrak{l}11\mathfrak{l}1\mathrm{I}}](2) ヘッダとメインファイルの書き出し,バッチ処理,画面表示のコマンドを記述して実行する.
CheaderO; Cmain () ; \mathrm{k}\mathrm{c}\mathrm{C}() ; DisplayCO;作成されるヘッダファイルとメインファイルは次のようになる.
\bulletヘッダファイル

134

const double Urng[2] =\{\rightarrow 1.5.1.5\} . Vmg[2] =\{-1.5.1.5\} :const double XMIN=-4 . 500000. XMAX=3 . 593115;
const double THETA=1 . 311622, PHI =1 . 047198;// THETA : 75.15, \mathrm{P}\mathrm{H}\mathrm{I}:60.00 ;const int DrawW=1 . DrawE=1 . DrawS =1 . DrawN=1 ;const int Mdv=50 , Ndv =50 :#define DsizeLL 5000

#define DsizeL 3000
#define DsizeM 500#define DsizeS 200

const double Eps =0 . 00001, Epsl =0.02 . Eps2=0.1 , Eps3

void surffun(doubledouble\mathrm{u}, double\mathrm{v}. double pt [3] ) \{\mathrm{u}2=\mathrm{o}\mathrm{w}(\mathrm{u},2.0\rangle.\mathrm{v}2=\langle \mathrm{v}.2.0)

pt [0]=\mathrm{u} :pt [1]=\mathrm{v} :pt [2]=3*(1-(2*\mathrm{u}2+\mathrm{v}2)*\exp(-\mathrm{u}2-\mathrm{v}2)\rangle :\}\bulletメインファイル#include < stdio. \mathrm{h}>#include くmath. \mathrm{h}>#include|\downar ow

mantheader. \mathrm{h}^{\mathrm{l}1}#include “ketcommon. \mathrm{h}^{\mathrm{l}\mathrm{I}#include “surflibhead. \mathrm{h}^{\mathrm{I}\mathrm{I}#include “‘ surflib. \mathrm{h}^{\mathfrak{l}\mathrm{I}double cutfuml(double \mathrm{u} , double \mathrm{v} ) \{double \mathrm{p}[3].\mathrm{v}\mathrm{a}\mathrm{l} :surffun (\mathrm{u},\mathrm{v},\mathrm{p}) :val =1 ;return val:\}

double cutfum(int ch. double \mathrm{u} , double \mathrm{v} ) \{double val:if(ch==1 ){val cutftml (\mathrm{u}.\mathrm{v})_{1} }=return val;\}
int main(void){

double out [DsizeL] [3]. data[DsizeLL] [3] :int \mathrm{i}. \mathrm{j}_{$\iota$} nall. din[DsizeS] [2];double sfbd[DsizeL] [3];sfbdparadata (\mathrm{s}\mathrm{f}\mathrm{b}\mathrm{d}\rangle_{1}

=1:

135

output 3\mathrm{h} (^{\mathfrak{l}1}\mathrm{s}\mathrm{f}\mathrm{b}\mathrm{d}3\mathrm{d}^{\mathrm{l}1\mathrm{I}1}\mathrm{s}\mathrm{f}\mathrm{b}\mathrm{d}\mathrm{h}3\mathrm{d}^{\mathfrak{l}1} , ‘tmantsfbd. txt”, sfbd) ;dataindexd3(3, sfbd. din) :Surf [0] [0]=0 ;appendd3(2. din[1] [0] , din [1] [1]. sfbd, Surf) :(中略)
return 0 :\}実際に実行すると,1度目は \mathrm{C} のライブラリを読み込むため15秒程度かかるが,図を少し変化させて続けて行う場合は,ほんの数秒である.

3曲線・曲面論の教材の例

この節では,高速化を活かして作成した,曲面の動画を含む PDF スライド教材の例を紹介する.PDF 動画には自動で再生されるムービー型と,手動でページ操作をしてコマ送りを実現するパラパラ型がある [3]. 手動操作の方が途中で止めたり逆に戻したり再生の自由度が高いこと,また PDF ビューアによ.らず利用できることから,今回はパラパラ型を用いた.

題材には初等微分幾何の話題からガウス曲率の定義を選んだ.3次元空間内の曲面は視覚化可能な図形であり,適切な図解を提供すればガウス曲率が何を測ろうとしているのか学習者は直観的に理解できると信じるからである.曲線曲面の微分幾何の詳細については[5] などを参照せよ.
3.1

曲線の曲率

まず,ガウス曲率の定義のための準備段階として,平面曲線 C(t)=(x(t), y(t)) の曲率について説明する.曲線 C 上に任意に1点 \mathrm{P} をとり, \mathrm{P} において C に2次の接触をする円 $\Gamma$ が一意に定まる.これを曲率円とよび,その半径 R を曲率半径と定める.ただし曲率円が退化して直線になるとき,曲率半径は \infty であるものとする.
いま, \mathrm{P} における C の単位接ベクトル e_{1} をパラメータ t が増加する向きにとり, e_{1} を正の方向に \displayte\frac{$\pi}{2 回転して得られる単位法ベクトルを e_{2} とおく.このとき,曲線 C の点 \mathrm{P}における曲率 $\kappa$ は次で定めることができる.

(1) | $\kap a$|=\displaystyle \frac{1}{R}(2) 曲率円が C に対し e2側にあるとき $\kappa$ の符号は正,逆側にあるとき負とする.
(3)

R=\infty のとき $\kappa$=0

図3は \mathrm{I} $\Phi \Gamma$Cindy で作図している.曲線 C の成分 x(t) , y(t) を4次多項式におくと,与えられた5点を通る曲線 C は一意に決まる.Cinderella上で作図した5つの幾何点

P_{1)}\cdots, 鳥を通る曲線として C を定めれば,マウスで幾何点を動かして曲線の形と曲率136

関数 $\kappa$ のグラフの形を見ながら,説明に都合の良いように変形して選ぶことができる.

このように一般性のある曲線を扱いながら数学的に正確な図を作れるのは $\Phi$rCindyの利点である.

図3: 曲率の符号

さらに,Cinderella を用いて作図したコンテンツは,CmdyJS により描画手続き込みでHTML形式にフォーマットし,ブラウザ上で操作可能にできる [4]. これにより学習者たちが自ら制御点を調整して曲線の形を自由に変え,曲線の形状が曲率関数にどう反映されるかを体感して学ぶ教材も得られる.

図4: CindyJS による動的コンテンツ

3.2

曲面のガウス曲率

次に,3次元空間内の曲面 S を考える.
を経て定義される :(1) 断面曲線の曲率として法曲率を定義

S の各点 \mathrm{P} におけるガウス曲率は,次の段階

137(2) 法曲率の最大値最小値として主曲率を定義(3) 主曲率の積としてガウス曲率を定義
以下,順を追って説明しよう.
3.2.1

法曲率

曲面 S 上の点 \mathrm{P} を固定し, \mathrm{P} における S の単位接ペクト
ル e_{1} と単位法ベクトル e_{2} をとる.ここで, e_{2} は曲面 S の向きづけを固定しておけば一意に決まる.他方, e_{1} は接点\mathrm{P} を始点とし \mathrm{P} における接平面上大きさ1のベクトルなので円周分の自由度があり,適当な起点をとれば $\theta$\in [0, 2 $\pi$]でその向きを表すことができる.

すると,各 $\theta$ に対して \mathrm{P} を通り e_{1}( $\theta$) , e_{2} によって張られる平面 $\Pi$_{ $\theta$} が定まる.平面 $\Pi$_{ $\theta$} 上曲面 S との共通部分は \mathrm{P} を通り e_{1}, e_{2} をそれぞれ単位接ベクトル,単位法ベクトルとする曲線なので,平面曲線としての曲率が定まる.これを$\kap a$_{ $\nu$}( $\theta$) で表し, S の \mathrm{P} における $\theta$ 方向の法曲率という.
図5: 法曲率

3.2.2

主曲率

定義より法曲率 $\kappa$_{ $\nu$}(0) は単位接ベクトル e_{1} と同じく円周上の関数になる.PDF スラ
イド教材ではこの1周分を24 コマのパラパラ型動画で表した.

\rightarrow\rightarrow

図6: 主曲率のパラパラ型動画

円周はコンパクトなので, $\kap a$_{ $\nu$}( $\theta$) は必ず最大値と最小値をとる.これを主曲率と定義
し,$\kappa$_{1}, $\kappa$_{2} で表す.次は主曲率を説明するスライドである.

138

6Principal Curvatures$\kappa$_{1} =\displaystyle \max$\kappa$_{ $\nu$}( $\theta$) , $\kappa$_{2} =\min$\kappa$_{ $\nu$}( $\theta$)

図7: 主曲率の定義

3.2.3

ガウス曲率

主曲率 $\kappa$_{1}, $\kappa$_{2} に対し,その積 K=$\kappa$_{1}$\kappa$_{2} を曲面 S の点 \mathrm{P} におけるガウス曲率という.
上に挙げた図の例のように鞍点においては $\kappa$_{1}>0, $\kappa$<0 なので K<0 が分かる.

また,図8のように凸な点においては K>0 , 柱面の点においては K=0 になることも図を見ればすぐわかるであろう.

図8: ガウス曲率

139

3.3

パラパラ型 PDF 動画の作成

最後に,パラパラ型動画の作成方法について簡単に触れておこう.今回の教材を作る

ために埒 $\varphi$ Cindy のCindyScript として以下のリストを書いた.ただし,簡単のため曲面と法曲率をとる平面以外の図形は省略してある :FheadCorg-\prime|\mathrm{n}\mathrm{c}' ’ :// 曲面の定義$\Gamma$ \mathrm{d}\mathrm{C}=[[' \mathrm{x}=\mathrm{u}^{1\prime}, $\Gamma$-\mathrm{v}^{1\prime}, P0.5*\mathrm{p}\mathrm{o}\mathrm{w}(\mathrm{u},2.0)-0.5*\mathrm{p}\mathrm{o}\mathrm{w}(\mathrm{v},2.0)+1.0' ],|\prime \mathrm{u}=[-1.5, 1.5] ”. \prime\prime \mathrm{v}=[-1.5.1.5] ‘’ , “ nwes”.
[100, 100], [5000.3000. 500]. [0.01.0. 1]]_{j}
Ctr 1 ;
\mathrm{m}\mathrm{f} (§)$\Gamma$headCeFheadCorg+text(Ctr):\mathrm{C}\mathrm{h}\mathrm{a}\mathrm{n}\mathrm{g}\mathrm{e}\mathrm{s}\mathrm{t}\mathrm{y}\mathrm{l}\mathrm{e}3\mathrm{d} (Datalist 3\mathrm{d}\langle ). [’nodisp“]) :// 曲面の接ベクトルel と法ペクトルe2で張られる平面
Defvar (^{1\prime}\mathrm{e}1\sim[\cos(\mathrm{s}),\sin(\mathrm{s}),0]; Defvar (^{ $\iota$\prime}\mathrm{e}2=[0,0,1]^{0} ):\mathrm{p}1=[0.0.1]+2*\mathrm{e}\mathrm{l}+3*\mathrm{e}2 ; \mathrm{p}2=[0.0.1]-2*\mathrm{e}\mathrm{l}+3*\mathrm{e}2 :\mathrm{p}3=[0.0.1]+2*\mathrm{e}\mathrm{l}-3*\mathrm{e}2 ; \mathrm{p}4=[0.0, 1] -2*\mathrm{e}\mathrm{l}-3*\mathrm{e}2 :Spaceline ( ’ 1” . [\mathrm{p}1, \mathrm{p}2, \mathrm{p}4. \mathrm{p}3 . pl] . [”nodisp”] ) :+pln
text (sln (s)) \star'' ) *\mathrm{x}+(^{\mathfrak{l}\prime}*text ( -\cos\langle \mathrm{s}) ) +'' ) *\mathrm{y}^{1\prime} ;MainCx[‘‘writesfbd”,sfbd,“ writewire”, [^{1\prime} wire |\prime.4. [[-1.0.0, 1. 0]. [-1.0.0, 1. 0]] ],“writecut”. [^{\mathfrak{n} \mathrm{s}\mathrm{f}\mathrm{c}\mathrm{u}\mathrm{t}^{n} .pln], ‘‘writesc”, \mathrm{s}\mathrm{l}3\mathrm{d}\mathrm{l}];\mathrm{D}\mathrm{i}\mathrm{s}\mathrm{p}\mathrm{C}*[sfbd”. [''\mathrm{d}x'' . black]. “ sfbdh1/. [' \mathrm{d}o^{\downar ow\prime} , red].
“ wire”, [’tdr, 0.3'' , black],’ sf cut”. [ndr. 2”, red].
“ sf cuth”. [”do. 2^{1\prime} . red]. “ \mathrm{s}\mathrm{l}3\mathrm{d}\mathrm{l} ”. [”dr. 1”. blue],“ \mathrm{s}\mathrm{l}3\mathrm{d}\mathrm{l}\mathrm{h} ”. [”do”. blue] ] :|||Cheader () :Caatn () ;\mathrm{k}\mathrm{c}\mathrm{C}() ;DisplayCO;\mathrm{C}\mathrm{t}\mathrm{r}-\mathrm{C}\mathrm{t}\mathrm{r}+1 ;):Setpara(”nomal‐curvature .‘‘mf(s) \mathfrak{n}.|\prime \mathrm{s}=[0,2*\mathrm{p}\mathrm{i}]^{1\prime}. [''\mathrm{m}'' , “ \mathrm{D}\mathrm{i}\mathrm{v}\approx 24\mathfrak{n}):mf (s) として定義した部分が \mathrm{C} 呼び出しによる曲面描画に相当し.最後の Setpara がパラパラ型動画作成を行う.
Cinderella の画面上の ParaF ボタンを押すことでパラパラ用ファイルの作成が実行さ140

れ,ketwork 1\mathrm{f}\mathrm{i}\mathrm{g} フォルダ下の normal‐cuxvatureフォルダを作成し,区間 [0, 2 $\pi$] を24
2 $\pi$ に対応する25個の tex ファイルを出力する.
等分して \mathcal{S}=0, \displayst le\frac{2$\pi$}{24},\ldots,PDF スライド作成機能も \mathrm{I} $\Phi \Gamma$ Cindy には用意されている.Beamer 風の簡易的なコードをテキストファイルで書いておくと,CinderellaのSlide ボタンを押すことにより対応する tex ファイルを自動生成しコンパイルする.たとえば,上述のパラパラ型動画に含まれる25個のファイルからPDF スライドを作るには以下のようなファイルを用意すればよい :new: :Noral Curvature///0 $\Gamma$ \mathrm{e}\mathrm{p}\mathrm{e}\mathrm{a}\mathrm{t}= ,para=\mathrm{n}\mathrm{o}\mathrm{r}\mathrm{m}\mathrm{a}1_{-} cuxvature : \{0\}:\mathrm{s}\{25\}\{10\} : input: 0.8//

スライ ド作成に関するより詳しい説明は,ketsample \backslash \mathrm{s}\mathrm{a}\mathrm{n}\mathrm{p}\mathrm{l}\mathrm{e}\mathrm{s}\backslash \mathrm{s}07 slides フォルダ
内の howtouseslideJ に書かれている.

図9: Cinderella の画面

4

まとめと今後の課題

今回の曲面描画の高速化により,PDF 動画スライドの表現の幅が確実に広がった.本稿ではガウス曲率の教材の例を挙げたが,同様に多変数関数の微積分や,ベクトル解析においても曲面と動画表現を組み合わせて分かりやすい教材ができるようになるだろう.

また,出力がPDF であることからファイルサイズが小さく,ビューアの他に特殊なアプリケーションを必要としないことから,学習者はスマートホンなど携帯端末で容易にスライドを自ら操作することができるのは利点であろう.

今後は描画の精度を上げていくとともに,実際の教育で印刷教材,スライド教材,動的幾何ソフトの操作などを組み合わせることにより,高い教育効果の実現を模索してい
きたい.

141

謝辞

本研究は,京都大学数理解析研究所共同事業 「数学ソフトウェアとその効果的教育利用に関する研究」 による成果である.

参考文献[1] 高遠節夫,KeTCindy 開発チーム,KeTCindy の開発について,数理解析研究所講究録1978, pp. 173‐182, 2015[2] Takato S.,What is and How to Use KeTCindy—Linkage Between Dynamic Geom‐etry Software and LaTeX Graphics Capabilities— , Lecture Notes in Computer
Science 9725, Springer, pp.371‐279, 2016

[3] 山下哲,lwCin \mathrm{d}\mathrm{y} による図入り PDF 教材の作成,数理解析研究所講究録2022, pp.
5昏{34, 2016

[4] 金子真隆,CindyJS によるアクティブラーニングの可能性,数理解析研究所講究録
2022, pp. 48‐58, 2016

[5] 小林昭七,曲線と曲面の微分幾何,裳華房,1995[6] https: // sites. google. \mathrm{c}\mathrm{o}\mathrm{m}/\mathrm{s}\mathrm{i}\mathrm{t}\mathrm{e}/ ketcindy[7] http: //\mathrm{w}\mathrm{w}\mathrm{w}65 . atwiki. jp/ketcindy[8] http: / \mathrm{w}\mathrm{w}\mathrm{w} . cinderella. de