diff options
Diffstat (limited to 'texmf-dist/doc/support/ketcindy/source/ketmanual/KeTCindyReferenceJ.tex')
-rw-r--r-- | texmf-dist/doc/support/ketcindy/source/ketmanual/KeTCindyReferenceJ.tex | 5841 |
1 files changed, 5841 insertions, 0 deletions
diff --git a/texmf-dist/doc/support/ketcindy/source/ketmanual/KeTCindyReferenceJ.tex b/texmf-dist/doc/support/ketcindy/source/ketmanual/KeTCindyReferenceJ.tex new file mode 100644 index 00000000..e004a0ea --- /dev/null +++ b/texmf-dist/doc/support/ketcindy/source/ketmanual/KeTCindyReferenceJ.tex @@ -0,0 +1,5841 @@ +\documentclass[papersize,a4paper,12pt,uplatex]{jsarticle} +\usepackage{ketpic,ketlayer} +\usepackage{amsmath,newtxmath} +\usepackage[dvipdfmx]{graphicx,color} +\usepackage{wrapfig} +\usepackage[dvipdfmx,bookmarks=false,colorlinks=true,linkcolor=blue]{hyperref} +\setmargin{20}{20}{15}{25} +\usepackage{setspace} + + +\begin{document} +\title{\ketcindy リファレンスマニュアル} +\author{\ketcindy\ Project Team} +\maketitle + + +\tableofcontents + +\newpage + + +\section{\ketcindy について} +\subsection{システムの構成} +\ketcindy は,Cinderella での作図データをScilab版 \ketpic に渡し,\LaTeX ファイルを作成するためのスクリプトライブラリである。Cinderella によるインタラクティブな作図機能と,CindyScript によるプログラミングにより,\LaTeX 文書の挿入図を効率よく作成することができる。また,R,Maxima,Risa/Asirなどの数式処理ソフトと連携して計算を行うことができる。 + +\input{Fig/concept} + + Cinderellaで作図した図のデータは,Scilabのファイル(拡張子 sci)に書き出される。これをScilabで処理して\TeX ファイルを作成する( Scilab版 \ketpic)。できた\TeX ファイルを,本文中に inputコマンド で挿入すれば図が表示される。\\ + CinderellaとScilabやその他のソフトウェアとの連携には,バッチファイル(Macではシェルファイル)を用いている。(概念図の両方向矢印) バッチファイルは kc.bat,シェルファイルは kc.sh で,KeTCindy が目的に応じてこれらのファイルを書き出し,プラグイン KetCindyPlugin.jar でそれらを実行する手順になっている。\\ + \\ +\subsection{Cindyscriptのスロットの概念} +CindyscriptはCinderellaのプログラミング言語で,スクリプトエディタで記述する。スクリプトエディタは,「スクリプト」メニューの「Cindyscript」を選択して開くか,Ctrl+9 (Windows) / ⌘+9 (Mac) で開く。\\ + スクリプトエディタの左方に並んでいるフォルダアイコンのメニュー風のものを「スロット」といい,Cindyscriptの実行タイミングによりスクリプトを書き分けることができる。通常は Initialzation スロットと Draw スロットを使う。\\ + Initialzation スロットは,スクリプトを実行すると最初に一度だけ実行される。従って,関数定義や変数の初期設定などを書く。ひな形やサンプルの cdy ファイルではここに KETlib というページがあり,パス名の設定やライブラリの読み込みなど,KeTCindyの初期設定に関する記述がある。\\ + Draw スロットは,Cinderellaの画面上でなにか操作が行われるたびに実行される。通常はここにスクリプトを書く。ひな形のcdyファイルでは,Ketinit() などが記述された figures ページが用意されている。\\ + \\ + \includegraphics[bb=0 0 1076 392 , width=10cm]{Fig/slot.png}\\ + \\ + 1つのスロットに複数のページを作ることができる。KETlib以外に初期設定のスクリプトを書く場合は,Initialzation スロットに新しいページを作るのがよい。\\ + + +\subsection{プロットデータ} +プロットデータ(Plot Data) とは,関数のグラフや幾何要素を描くデータのことであり,KeTCindyの処理の中核をなしている。本マニュアルでは PD と略すことがある。たとえば曲線は,描画範囲を分割して線分の集まりとして描画しており,このときのプロットデータはそれらの線分の端点のリストである。\\ + プロットデータの名称はKeTCindyが自動的に命名する。その命名規則は次の通りである。\\ +\\ +・名称の頭部は,プロットデータを作成する関数ごとに決まっている。\\ +・第1引数に name が与えられる場合,name を頭部に付加する。\\ + 例:\verb|Listplot("1",[[0,0],[1,2]]);| のとき,sg1\\ +・関数によっては,第1引数の name を略すことができる。この場合,引数で用いられた点の名前を頭部に付加する。\\ + 例:\verb|Listplot([A,B,C]);| のとき,sgABC\\ + \\ + プロットデータを生成したときは,Cindyscriptエディタのコンソールにその名称を表示する。上の例では,\\ + \verb|generate Listplot sgABC|\\ +と表示される。プロットデータを操作する関数では,このPDの名称を用いる。\\ + プロットデータの内容を知りたい場合は,Cindyscriptの\\ + println(プロットデータ名)\\ +でコンソールに表示することができる。\\ + プロットデータは,Cindyscriptによるプログラムで作成してそれをKeTCindyで利用することもできる。Listplot()の例を参照のこと。ただし,要素の数が大きいとScilabでエラーとなるので,1つのプロットデータの要素は200程度とするのがよい。これより多い場合は分割する。\\ + +\subsection{Cinderellaの作図ツール} + \\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/move.png} 動かすモード(選択モード)にする:標準状態\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/single-add.png} 点を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-line.png} 直線を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/segment.png} 線分を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/middle.png} 中点を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/intersection.png} 交点を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-parallel.png} 平行線を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-perp.png} 垂線を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/bisector.png} 角の二等分線を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-circle.png} 円を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/circle-by-radius.png} 半径つき円を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/ellipse-by-foci.png} 焦点と通る点で決まる楕円\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/hyperbola-by-foci.png} 焦点と通る点で決まる双曲線\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/parabola-by-foci.png} 焦点と準線で決まる放物線\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/polygon.png} 多角形を加える\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/angle-mark.png} 角に印をつける\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/angle.png} 角度を測る\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/delete.png} 選択した要素を消去する\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/select-points.png} 点をまとめて選択する\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/select-lines.png} 線分をまとめて選択する\\ + \\ +設定メニューから「上のツールバーのカスタマイズ」を選び,「すべて表示」にすると現れるツール\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/mirror.png} 鏡映\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/polar-of-point.png} 点の極線を描く\\ + \\ +画面ツール(下のツールバー)\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/translate-view.png} 原点を移動する\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/zoom-in.png} 矩形領域を画面サイズに拡大\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/zoom-out.png} 画面を矩形領域サイズに縮小\\ +\includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/snap.png} 軸と方眼を表示し格子点にスナップする\\ + +\subsection{用語解説} +インシデント\\ + 点が曲線上に乗っている状態を表す。\\ +インスペクタ\\ + 幾何要素の属性などを管理するウィンドウ。\\ +幾何要素 \\ + Cinderellaの作図ツールで作図した点や直線などの要素\\ +幾何点 \\ + 幾何要素としての点。マウスドラッグで動かすことができる。\\ +固定点\\ + マウスドラッグで移動することのできない点\\ +コンソール\\ + スクリプトエディタの右下のエリア。\\ +自由点\\ + マウスドラッグで任意に動かすことのできる点。\\ +スロット \\ + Cindyscriptで,スクリプトを書くとき,実行タイミングによりに分類するもの\\ +スナップ \\ + マウスポイントが格子点の近くに来ると格子点上にぴったり移動する。\\ + Cinderellaの画面の下方ツールのうち,磁石アイコンによりこのモードになる。\\ + +\newpage +%======================= +\section{定数と変数} +KeTCindy は Cindyscript で記述されている。CindyScriptでは,変数名は大文字と小文字を区別するが,関数名は大文字小文字を区別しない。Cindyscriptのマニュアルでは組み込み関数名はすべて小文字で表記されている。例示されたスクリプトでは,変数も小文字である。そこで,KeTCindyでは,組み込みの変数名・関数名と区別しやすいように,次の規則により名前を付けている。\\ + \\ + ・グローバルな変数はすべて大文字か,大文字で始まるものとする。\\ + ・局所変数は小文字で,関数定義の冒頭で regional() により局所変数として宣言する。\\ + ・関数名は大文字で始まる。\\ + \\ + なお,CindyScriptは関数型プログラミング言語であり,命令はすべて関数を用いて行われるが,本マニュアルでは,文脈により「コマンド」という表現も用いる。\\ + \\ +{\bf 定数} \\ + つぎのものがCindyScriptに予約されており,小文字で表されている。\\ + +\begin{tabbing} +12345678\=\kill + pi \>:円周率。Scilabには \% pi で書き出される。\\ + i \> :虚数単位。Scilabには \% i で書き出される。\\ +\end{tabbing} + 一般のプログラミングでは変数 i をループ変数としてよく使うが,CindyScript では i は予約定数と考え,変数として用いないことを勧める。ただし,変数としてまったく使えないわけではなく,変数として用いた後,必要があれば \verb|i=complex([0,1])| を実行することにより虚数単位として再定義することができる。\\ + \\ +{\bf 予約変数}\\ + KeTCindy が内部的に使用する予約変数がある。そのうち次のものはユーザーが値を変更または設定することができる。設定は Initalization スロットの「KETlib」ページでおこなうが,Fhead とTexparent は Draw スロットでもよい。\\ +\begin{tabbing} +1234567890123\=45678989012345678901234567890123\=\kill + Fhead \>書き出されるファイル名の頭部\\ + Texparent \>親プロセスのファイル名\\ + Dirhead \>パスの頭部\\ + Dirlib \>ライブラリ ketlib のパス\\ + Dirbin \>ketbin のパス\\ + Dirwork \>作業ディレクトリのパス\\ + Shellfile \>シェルファイル名\\ +\end{tabbing} + 以下の予約変数は,ライブラリが使用するグローバル変数であるので,ユーザーはこれらの変数名を使ってはいけない。なお,変数は大文字小文字を区別するので,小文字で書く分には支障はない。したがって,ユーザーが作るプログラムでは,すべて小文字か,先頭だけが大文字の変数を使うことを勧める。\\ + \\ +ADDAXES, ArrowlineNumber, ArrowheadNumber, BezierNumber,\\ +COM0thlist, COM1stlist, COM2ndlist, Dq, FUNLIST,\\ +Fnamesc ,Fnamescibody,Fnameout,Fnametex,GDATALIST,\\ +GLIST, GCLIST, GOUTLIST, KCOLOR, KETPICCOUNT, \\ +KETPICLAYER, LETTERlist, LFmark, MilliIn, PenThick, \\ +PenThickInit, POUTLIST, SCALEX, SCALEY, SCIRELIST, \\ +SCIWRLIST, TenSize, TenSizeInit, ULEN, XMAX, XMIN, YaSize,\\ +YaThick, YMAX, YMIN, VLIST + +\newpage + +%設定・定義 ================================== +\section{関数リファレンス} +\subsection{設定・定義} + +\begin{description} + +\hypertarget{addax}{} +\item[関数] Addax(0または1) +\item[機能] 座標軸を書くかどうかを定める +\item[説明] ScilabのClosefile() の引数に対応する。\\ + 引数が0のとき座標軸を書かない(デフォルトは1) +\begin{verbatim} + Listplot([B,A,C]); + Letter([A,"ne","A",B,"se","B",C,"se","C"]); +\end{verbatim} + \\ + \input{Fig/addax1} +\begin{verbatim} + Listplot([B,A,C,B]); + Letter([A,"ne","A",B,"sw","B",C,"se","C"]); + Addax(0); +\end{verbatim} + \input{Fig/addax2}\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ +\hypertarget{addcolor}{} +\item[関数] Addcolor(描画コマンド , カラーコード) +\item[機能] 描画コマンドで描かれる線を指定色で描く +\item[説明] 描画コマンドはダブルクウォートでくくって文字列とする。描画コマンド内にダブルクウォートがある場合は,シングルクウォートにする。optionのある描画コマンドでoptionを指定しない場合は,必ず空リストをoptionとして書く。描画色は,RGBまたはCMYK。描画色は画面と図版の両方に有効。\\ + \\ + 例:\verb|Addcolor("Plotdata('2','x^2','x',[])",[1,1,0]);|\\ + \\ + \\ +\hypertarget{colorcode}{} +\item[関数] Colorcode(文字1,文字2, カラーコード) +\item[機能] 文字1から文字2へカラーコードを変換する。戻り値は変換されたコード。 +\item[説明] 文字は,"rgb","cmyk","hsv"のいずれか。\\ + \\ +例:\verb|Colorcode("rgb","cmyk",[1,0,0]); |\\ + RGBコードの[1,0,0]をCMYKに変換したコードを返す\\ + \verb|Colorcode("cmyk","rgb",[0,1,1,0]);|\\ + CMYKコードの[0,1,1,0]をRGBに変換したコードを返す\\ + \verb|Colorcode("rgb","hsv",[1,0,0]);|\\ + RGBコードの[1,0,0]をHSVに変換したコードを返す\\ + \\ + \\ +\hypertarget{deffun}{} +\item[関数] Deffun(関数名 , 定義のリスト) +\item[機能] 関数を定義する +\item[説明] 関数定義は,CindyScript の関数定義 f(x):=式 でもできるが,Deffun()を使うことにより,Scilab 側に渡すファイルに\\ + function 定義式 endfunction;\\ + が記述されるので,Scilab側でこの関数を利用することができる。目的に応じて使い分けるとよい。\\ + 式のリストには if文を用いた場合分けの関数式を記述することもできる。\\ + \\ +例:$f(x)=\dfrac{1}{x^2+1}$ を定義し,グラフを描いてx=1 における微分係数を求める。 +\begin{verbatim} + Deffun("f(x)",["regional(y)","y=1/(x\verb|^|2+1)","y"]); + Plotdata("1","f(x)","x"); + coeff=Derivative("f(x)","x",1); +\end{verbatim} + 点Aを作図しておくと,点Aをドラッグしたとき常に曲線上に乗せ,その点での\\ + 接線を引くことができる。 +\begin{verbatim} + A.xy=[A.x,f(A.x)]; + coeff=Derivative("f(x)","x",A.x); + Lineplot("1",[A,[A.x+1,A.y+coeff]]); +\end{verbatim} + \input{Fig/deffun}\\ + + 例:$f(x)=\left\{\begin{array}{l}1 (x\geqq 0)\\ -1 (x<0)\\ \end{array}\right.$ を定義する。 +\begin{verbatim} + Deffun("f(x)",["regional(y)","if(x>=0,y=1,y=-1)","y"]); +\end{verbatim} + if 文はネストすることができる。 +\begin{verbatim} + Deffun("f(x)",["regional y","if(x>1,y=1, + if(x>-1,y=x,y=-1))","y"]); +\end{verbatim} + \\ + + +\hypertarget{defvar}{} +\item[関数] Defvar(文字列) +\item[機能] 変数を定義する +\item[説明] 変数の定義をScilabと共有する。また,ScilabのAssignリストに追加する。\\ + \\ + 例:\verb|Defvar("const=3");| + \\ +\hypertarget{drwxy}{} +\item[関数] Drwxy() +\item[機能] 座標軸を描く +\item[説明] 座標軸はデフォルトでは最後に描かれるが,座標軸上に白抜きの点を表示するなど,先に描くことが必要な場合に用いる。\\ + +例:点$(-\pi,\ 0)$と$(\pi,\ 0)$を白抜きの点で表示する。 +\begin{verbatim} + Setax([7,"se"]); + Setpt(8); + Drwpt([-pi,0],0); + Drwxy(); + Plotdata("1","sin(x)","x",["dr","Num=300"]); + Drwpt([[pi,0],0]); +\end{verbatim} + + このスクリプトでは,Drwpt([-pi,0],0); を実行したのち座標軸を描き,次に,$y=\sin x$ のグラフを描いてから Drwpt([pi,0],0);を実行するので,点($-\pi$,0) の上を座標軸が通り,点($\pi$,0)は座標軸とグラフの上を通るので白抜きになる。\\ + +\input{Fig/drwxy} + \\ + \\ +\hypertarget{fontsize}{} +\item[関数] Fontsize(記号) +\item[機能] フォントサイズを設定する +\item[説明] 次に Fontsize() を実行するまで有効\\ + 記号は,"t" , "ss" , "f", "s" , "n" , "la", "La", "LA", "h" , "H"\\ + +例:小さい方からいくつか表示する。 +\begin{verbatim} + Ptsize(2); + Drawpoint([A,B,C,D,E,F,G]); + Fontsize("t"); Letter([A,"s2","A"]); + Fontsize("ss"); Letter([B,"s2","B"]); + Fontsize("s"); Letter([C,"s2","C"]); + Fontsize("la"); Letter([D,"s2","D"]); + Fontsize("La"); Letter([E,"s2","E"]); + Fontsize("h"); Letter([F,"s2","F"]); + Fontsize("H"); Letter([G,"s2","G"]); +\end{verbatim} + \input{Fig/fontsize} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{ketinit}{} +\item[関数] Ketinit(options) +\item[機能] \ketcindy を初期化する +\item[説明] opution 縦方向の倍率と描画領域を設定\\ + + 例:\verb|Ketinit()| :倍率1,描画領域 $-5 \leqq x \leqq 5 , -5 \leqq y \leqq 5$(デフォルト)\\ + \verb|Ketinit(2)| : 倍率2,描画領域 $-5 \leqq x \leqq 5 , -5 \leqq y \leqq 5$\\ + \verb|Ketinit(2,[-2,3],[-2,4])| : 倍率2,描画領域 $-2 \leqq x \leqq 3 , -2 \leqq y \leqq 4$\\ + + 描画領域(TeXに出力する領域)は制御点SW(左下)とNE(右上)を対角とする矩形領域。描画領域を指定すると,制御点がなければその位置に作り,すでに存在する場合は何もしない。作成された制御点はドラッグして描画領域を変更することができる。\\ + 倍率は,Setscaling(倍率)を実行するのと同じ。ただし,Cinderellaで作図した幾何要素に対しては無効。(Setscaling()の項参照)\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{ptsie}{} +\item[関数] Ptsize(n) , Setpt(n) +\item[機能] 表示する点の大きさを設定する。 +\item[説明] Ptsize() と Setpt() は同じである。デフォルトは1\\ + Ptsize()はCindyScript風の語法,Setpt() は \ketpic 風の語法\\ + 全体の点の大きさを設定する。点の大きさを個々に変えたい場合は,sizeオプションを用いる。\\ + +例:1から4までの点の大きさ\\ + あらかじめ,Cinderellaの作図ツールで点A,B,C,Dを作図しておく。 +\begin{verbatim} + Pointdata("1",A,["size=1"]); + Pointdata("2",B,["size=2"]); + Pointdata("3",C,["size=3"]); + Pointdata("4",D,["size=4"]); +\end{verbatim} + +\input{Fig/pointsize}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{setax}{} +\item[関数] Setax() +\item[機能] 座標軸の書式を設定する。 +\item[説明] Scilabのみで実行する。Cinderellaの描画面に反映されない。\\ +引数は順番に\\ + 1. 軸の形状(直線は "l" ,矢印は "a")デフォルトは直線\\ + 2. 横軸名 デフォルトは $x$ \\ + 3. 横軸名の位置\\ + 4. 縦軸名 デフォルトは$y$\\ + 5. 縦軸名の位置\\ + 6. 原点名 デフォルトはO\\ + 7. 原点名の位置\\ +それぞれダブルクウォートでくくる。\\ +7つの引数のうちn番目だけを指定する場合は,[n,"内容"]で指定できる。\\ +また,後方はデフォルトなら省略できる。\\ + + 例:座標軸の先端を矢印にし,原点の北西にOを書く。\\ + \verb|Setax(["a","","","","","","nw"]);|\\ + + 例:原点の北西にOを書く。\\ + \verb|Setax([7,"nw"]);|\\ + + 例:先端を矢印にし,横軸をθ,縦軸を$x$にして矢じりの左側に書く。\\ + \verb|Setax(["a","θ","","x","w"]);|\\ + \\ + \input{Fig/setax(theta)} + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{definecolor}{} +\item[関数] Definecolor(色名 , 定義のリスト) +\item[機能] 色名を定義する +\item[説明] ユーザー命名の色名を定義する。定義リストは RGBまたはCMYKのリスト\\ + 各色0〜1の範囲で指定する。定義した色名は,Setcolor(color,options) で使うことができる。なお,KeTCindyでは,68色を色名で使うことができる。次の Setcolor(color,options) 参照)\\ + \\ + 例:暗い紫色を darkmaz の名称で定義して使う。 +\begin{verbatim} + Definecolor("darkmaz",[0.8,0,0.8]); + Setcolor("darkmaz"); +\end{verbatim} +\hypertarget{setcolor}{} + \\ + \\ +\item[関数] Setcolor(color,options) +\item[機能] 描画色の設定 +\item[説明] 引数colorはカラーコードまたは色の名称。\\ + カラーコードはRGBまたはCMYKをリストで与える。各色0〜1。\\ + 色の名称は次頁の68色が指定できる。ただし,Cinderellaの画面には色は反映されない。\\ + colorに色の名称を用いた場合は,option として,透明度を0〜1の数で指定できる。1が最も濃く,0は結果として色塗りをしない。\\ + \\ +例 Cinderellaの描画ツールとCindyScriptで線分AB,ACを60°の角をなすように描いておき,点DとEを弧の両端になるように設定して +\begin{verbatim} + Setcolor([1,0,0]); + Circledata([A,D],["Rng=[0,pi/3]"]); + Arrowhead(E,[-1,0.8],[2,1]); +\end{verbatim} + を実行すると,矢じりつきの弧を赤で表示することができる。\\ + 1行目は,\verb|Setcolor("red");| でもよい。\\ + ただし,Cinderellaの描画面では着色されない。\\ + 描画面でも着色したい場合は,オプション \verb|"color->[R,G,B]"| を用いる。\\ + 上の例の場合, +\begin{verbatim} + Circledata([A,D],["Rng=[0,pi/3]","color->[1,0,0]"]); + Arrowhead(E,[-1,0.8],[2,1,"color->[1,0,0]"]); +\end{verbatim} + とすれば,描画面でも赤で表示される。\\ + + \includegraphics[width=3.5cm,bb=0 0 161 134]{Fig/setcolor.pdf} + \\ + \\ +\scalebox{0.9}{\input{Fig/colortable1-34}} + +\newpage + \\ + \\ + \\ +\scalebox{0.9}{\input{Fig/colortable35-68}} + \\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{setmarklen}{} +\item[関数] Setmarklen(数) +\item[機能] 座標軸の目盛の長さを設定する +\item[説明] Htickmark() , Vtickmark() で座標軸に目盛を入れるとき,その長さを設定する。 \\ + ⇒ \hyperlink{htickmark}{Htickmark([横座標 , 方向 , 文字])}\\ + +\hypertarget{setorigin}{} +\item[関数] Setorigin(座標) +\item[機能] 描画する座標軸の原点を設定(移動)する +\item[説明] 描画する座標軸の原点を引数の座標とする。座標は点の識別名でもよい。\\ + + 例:原点を (3,2) として座標軸を描く。\\ + \verb|Setorigin([3,2]);|\\ + 原点を点Aの位置にして座標軸を描く。\\ + \verb|Setorigin(A);| \\ + + 注意:座標軸とともに,原点のO,軸名なども移動するが,座標系が変更される\\ + わけではない。\\ + + 例:原点は(3,2)に移動するが,スクリプトではもとの座標系を使う。 +\begin{verbatim} + Setorigin([3,2]); + Listplot([A,B,C,A]); + Ptsize(3); + Drawpoint([1,1]); + Letter([[1,1],"s2","P"]); +\end{verbatim} + 左が実行時のCinderellaの画面,右が\TeX の結果。\\ + + \includegraphics[bb=0 0 227 205 , width=4cm]{Fig/setorigin.png} \input{Fig/setorigin}\\ + \\ +\hypertarget{setpen}{} +\item[関数] Setpen(数) +\item[機能] 線の太さを設定する\\ + \\[-5mm] +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ +\hypertarget{setpt}{} +\item[関数] Setpt(数) +\item[機能] 表示する点の大きさを設定する\\ + +\hypertarget{setscaling}{} +\item[関数] Setscaling(倍率) +\item[機能] 縦方向の倍率を設定する +\item[説明] 2次関数の応用問題などでは,グラフが縦に大きくなる場合があり,$y$軸方向のスケーリングを変えることがよくある。次のスクリプトは,$f(x)=-x^2+10x$ のグラフを縦軸方向を半分にして描くものである。\\ +\begin{layer}{150}{0} +\putnotese{80}{0}{\input{Fig/setscaling}} +\end{layer} + \\ +\begin{verbatim} + Setscaling(0.5); + A.xy=[0,25/4]; + B.xy=[5/2,25/4]; + C.xy=[5/2,0]; + Listplot([A,B],["do"]); + Listplot([C,B],["do"]); + Plotdata("1","-2*x^2+10*x","x"); + Letter([[5,0],"s2w","5",[0,25/2],"w2", + "$\frac{25}{2}$",C,"s4","$\frac{5}{2}$"]); +\end{verbatim} +% \input{Fig/setscaling}\\ + ここで,点A,Bの座標が +\begin{verbatim} + A.xy=[0,25/4]; + B.xy=[5/2,25/4]; +\end{verbatim} +となっていることに注意されたい。$y$座標をあらかじめ半分にしている。すなわち,Cinderellaで作図した幾何要素に対してはSetscalingは無効である。これは,Putpoint関数を用いて点の位置を決めても同じである。\\ + たとえば,次のスクリプトでは,Cinderellaの画面上では2本の線分が点Bでつながるが,書き出された\TeX の図では離れてしまう。 +\begin{verbatim} + Setscaling(0.5); + Putpoint("A",[0,2]); + Putpoint("B",[2,2]); + Listplot([A,B]); + Listplot("1",[[0,0],[2,2]]); +\end{verbatim} + \\ + \\ +%\newpage +\hypertarget{setunitlen}{} +\item[関数] Setunitlen(文字列) +\item[機能] 単位長を設定する。デフォルトは 1cm\\ + \\ + \\ +\hypertarget{setwindow}{} +\item[関数] Setwindow() +\item[機能] 出力する描画領域を設定する\\ +\item[説明] 出力する描画領域は,通常は2点SWとNEを対角とする矩形領域である。 +この2点をドラッグすることによりビジュアルに描画領域を決められる。\\ +しかし,これとは別に出力範囲を設定したい場合にこの関数を用いる。\\ +また,表を作成したときは,表の範囲が出力範囲として優先される(Tabledata()を実行したとき)ので,表外に図を描いた場合は,最後にこの関数で出力範囲を指定して書き出す。\\ + \\ +\end{description} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +%第5節================================= +\subsection{描画} + +描画関数は曲線などを作図する関数である。\\ + 基本的な書式は\\ + 関数名(name , 点リストなど , options);\\ +であるが,nameの不要なものもある。\\ + nameは,プロットデータの名称を指定するもので,関数ごとに決められた頭部のあとに付けられる。nameが不要の場合は \ketcindy が自動的に名称を作成する。\\ + 点リストなどは,点の座標,点の識別名,複数の点のリスト,複数の点を示す文字列などがあり,関数によって異なる。点はCinderellaで作図した幾何要素の点を利用できる。\\ + \\ + optionsは,線種・表示する文字列・解像度・出力の有無などを指定するオプション群。 +\begin{tabbing} +1234567890123\=\kill + 線種はつぎの4通り。デフォルトは実線。\\ + "dr, n" \>太さnの実線で描く。Scilab のファイルに Drwline() を出力する。\\ + "da,m,n" \>破線を描く。Scilab のファイルに Dashline() を出力する。\\ + \> mは破線の長さ,nは破線の間隔 (m,nは省略可)\\ + \>m,n オプションはCinderellaの描画面には反映されない。\\ + "id,m,n" \>ギャップからはじまる破線を描く。Scilab のファイルに Invdashline() を出力する。\\ + "do,m,n" \>点線で描く。Scilab のファイルに Dottedline() を出力する。\\ + \>mは点の間隔,nは太さ (m,nは省略可)\\ + 描画色指定は,Cindyscriptの表記と同様で,RGBのリストで指定するか,色名を用いる。\\ + 例:\verb|"color->[0,0.7,0]"| で暗い緑になる。\\ + 出力の有無は\\ + "notex" \>Cinderella画面上で補助線として用いた図形をScilabに出力しない\\ + "nodisp" \>Cinderella画面上にも出力しない\\ + + "nodisp"は画面上にも,Scilabへのデータにも出力されないが,プロットデータは作成され,\\ + それを戻り値とするので,プロットデータだけを利用したい場合に有効である。\\ + 例 \verb|pdata=Circledata([A,B],["nodisp"]);|\\ + として,プロットデータ pdata を処理する。\\ +\end{tabbing} + +\newpage +\begin{description} + +\hypertarget{anglemark}{} +\item[関数] Anglemark(点リスト , options) +\item[機能] 点リスト[A,B,C]で示された角に弧の形状の角の印をつける。 +\item[説明] optionsは次の通り。\\ + 数値 角の印の大きさ。デフォルトは1\\ + 線種 "dr, n" , "da,m,n" , "do,m,n"\\ + "Expr=文字" : 文字を入れる\\ + "Expr=位置 , 文字" : 位置を指定して文字を入れる。位置は頂点からの距離。\\ + +例:三角形の内角に印をいれ,文字を書き込む。 +\begin{verbatim} + Listplot([A,B,C,A]); + Letter([A,"n1","A",B,"w1","B",C,"e1","C"]); + Anglemark([B,A,C]); + Anglemark([C,B,A],["Expr=\theta"]); + Anglemark([A,C,B],[2,"dr,3","Expr=2,\alpha"]); +\end{verbatim} + \input{Fig/anglemark} + +※角の印には平行四辺形の形状のものもある。Paramark() を参照のこと。\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{arrowdata}{} +\item[関数] Arrowdata(name,[始点 , 終点] , options) +\item[機能] 2点間を結ぶ矢線を描く。プロットデータ名の頭部は ar +\item[説明] name は,座標を数値で与えるときに必要。幾何要素の識別名で与えるときはなくてもよい。\\ + optionsは矢じりの形状などの指定で\\ + [ 矢じりの大きさ, 開き角, 矢じり位置, 線種,線の表示色] + のリストで与える。\\ + 開き角は60分法で与える。ただし,° はつけない。5未満の時は18°の倍数指定とする。\\ + 矢じり位置は,線分の長さを1とした始点からの距離。\\ + ただし,Cinderellaの画面上には全ては反映されない。たとえば,太さ指定をしても太さは同じ。\\ + + 例:線分ABを矢線にする。\\ + \verb|Arrowdata([A,B]);|\\ + 始点が(2,0) , 終点が(4,3) ,開き角45°,EFの中点に矢じりの先端\\ + \verb|Arrowdata("1",[[2,0],[4,3]],[1,45,0.5]);|\\ + 大きさ2,太さ2\\ + \verb|Arrowdata([C,D],[2,1,1,"dr,2"]);|\\ + 破線で太さ0.5\\ + \verb|Arrowdata([E,F],["da,0.5"]);|\\ + 少し間が空いて太い点線で,Cinderellaの画面上では赤で表示する。\\ + \verb|Arrowdata([G,H],[2,1,"do,2,3","color-$>$[1,0,0]"]);| \\ + + \input{Fig/arrowdata}\\ +\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{arrowhead}{} +\item[関数] Arrowhead(点 , 方向 , options) , Arrowhead(点 , プロットデータ,options) +\item[機能] 点に矢じりだけを描く +\item[説明] 指定された位置に,指定された方向を向いた矢じりだけを描く。\\ + 点は座標または幾何要素名。方向は原点から見て座標[a,b]の方向。\\ + optionsは [大きさ,矢じりの開き角,形状と位置] のリスト。\\ + 矢じりの開き角は60分法で片側半分の角。\\ + 形状は, "f" :塗りつぶしの三角形(デフォルト)または " l " : ラインのみ。\\ + 位置は,"t"(デフォルト)または "c" , "b"\\ + "t" は矢じりの先端が終点に一致,"c" は三角形の中心が終点と一致,"b" は終点が矢じりの底辺にのる。\\ + プロットデータを指定したときは,曲線上の点に矢じりをつける。\\ + 曲線には向きがあり,それによって矢じりの向きが決まる。" Invert(プロットデータ) " とすると反対向きの矢じりになる。\\ + 曲線の向きとは,曲線を描くときの順序で,プロットデータの順序でもある。invert() はこのプロットデータを逆順にするものである。\\ + +例: + +\vspace{-8mm} +\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{0}{0}{点 A が下図の位置のとき} +\putnotese{0}{8}{\input{Fig/ForRef-Arrowhead-1}} +\putnotese{40}{0}{(ア) Arrowhead(A,[-1,1]);} +\putnotese{40}{7}{(イ) Arrowhead([1,1],[-1,1],[2,60]);} +\putnotese{40}{14}{(ウ) Arrowhead(A,[-1,1],[2,30,"b"]);} +\putnotese{40}{21}{(エ) Arrowhead([1,1],[-1,1],[2,20,"lc"]);} +\end{layer} + +\vspace{2mm} +\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{0}{0}{\input{Fig/ForRef-Arrowhead-ya1}} +\putnotese{95}{55}{D の座標がわかれ} +\putnotese{95}{60}{ば,それでもよい} +\putnotese{12}{27}{(ア)} +\putnotese{42}{27}{(イ)} +\putnotese{72}{27}{(ウ)} +\putnotese{102}{27}{(エ)} +\putnotese{0}{30}{\input{Fig/ForRef-Arrowhead-2}} +\putnotese{30}{30}{\input{Fig/ForRef-Arrowhead-3}} +\putnotese{60}{30}{\input{Fig/ForRef-Arrowhead-4}} +\putnotese{90}{30}{\input{Fig/ForRef-Arrowhead-5}} +\end{layer} + +\vspace{56mm} +\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{0}{0}{曲線 crBC 上の点 D が} +\putnotese{0}{5}{下図のようなとき} +\putnotese{0}{7}{\input{Fig/ForRef-Arrowhead-6}} +\putnotese{16}{22}{crBC} +\putnotese{40}{0}{(オ) Arrowhead(D,"crBC");} +\putnotese{40}{7}{(カ) Arrowhead(D,"crBC",[2]);} +\putnotese{40}{14}{(キ) Arrowhead(D,"crBC",[2,30,"l"]);} +\putnotese{40}{21}{(ク) Arrowhead(D,"Invert(crBC)");} +\end{layer} + +\vspace{3mm} +\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{12}{27}{(オ)} +\putnotese{42}{27}{(カ)} +\putnotese{72}{27}{(キ)} +\putnotese{102}{27}{(ク)} +\putnotese{0}{28}{\input{Fig/ForRef-Arrowhead-7}} +\putnotese{30}{28}{\input{Fig/ForRef-Arrowhead-8}} +\putnotese{60}{28}{\input{Fig/ForRef-Arrowhead-9}} +\putnotese{90}{28}{\input{Fig/ForRef-Arrowhead-10}} +\end{layer} + +\vspace{70mm} +\hypertarget{bezier}{} +\item[関数] Bezier(名前,節点リスト,制御点リスト,[オプション] ) +\item[機能] 単独のベジエ曲線を描く +\item[説明] 制御点は,各区間に対して,3次の場合2個,2次の場合1個のリストで与える。 + + [ [F,G] , [H], ... ] + +オプション + +"Num=..." : 節点間の分割数(分点数 $-1$)を指定できる。(デフォルトは10) + +\vspace{5mm} + +例: + +\begin{layer}{150}{0} +\putnotese{50}{15}{bz1} +\putnotese{60}{-15}{\input{Fig/checkbe1}} +\end{layer} + +2次ベジエ曲線 + +Bezier("1",[A,B],[C]); + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{50}{20}{bzc} +\putnotese{60}{-10}{\input{Fig/checkbe2}} +\end{layer} + +3次ベジエ曲線 + +Bezier("c",[A,B],[C,D]); + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{50}{20}{bz3} +\putnotese{60}{-10}{\input{Fig/checkbe3}} +\end{layer} + +つなげる + +Bezier("3",[A,B,C],[[D],[E,F]]); + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{50}{20}{bzS} +\putnotese{60}{5}{\input{Fig/checkbe4}} +\end{layer} + +D,B,E を1直線上にとると,滑らかにつながる + +Bezier("S",[A,B,C],[[D],[E,F]]); + +\vspace{25mm} + + +\begin{layer}{150}{0} +\putnotese{16}{27}{bzname} +\putnotese{15}{10}{\input{Fig/checkbe7}} +\end{layer} + +全て同じ次数の場合,次のようにしてもよい. + +Bezier("name", [A,B,C,D], [E,F,G,H,K,L] ); + +\vspace{30mm} + +\begin{layer}{150}{0} +\putnotese{50}{20}{bz1a} +\putnotese{60}{5}{\input{Fig/checkbe5}} +\end{layer} + +オプション + +Bezier("1a",[A,B,C],[[D],[E,F]],["Num=3"]); + +\vspace{30mm} + +\begin{layer}{150}{0} +\putnotese{50}{20}{bzd5e} +\putnotese{60}{5}{\input{Fig/checkbe6}} +\end{layer} + +Bezier("d5e",[A,B,C],[[D],[E,F]],["Num=200","da"]); + +\vspace{35mm} + + +\begin{layer}{150}{0} +\putnotese{20}{32}{bz1} +\putnotese{15}{15}{\input{Fig/checkbe8}} +\end{layer} + +Numを(ベクトルとして)区間ごとに与えることもできる。 + +Bezier("1", [A,B,C,D], [E,F,G,H,K,L] , [ "Num=[2,3,4]"]); + +\vspace{30mm} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +\hypertarget{beziersmooth}{} +\item[関数] Beziersmooth(名前,節点リスト,[オプション] ) +\item[機能] 節点間を3次ベジエ曲線でスムーズに結んだ曲線を描く +\item[説明] 節点をはさむ制御点は1直線上にとる(したがって,1つは半自由点で,直線上しか動けない)。 +制御点は自動的に配置される。その後,節点や制御点を動かして,描きたいものにする。 + +例: + +\begin{layer}{150}{0} +\putnotese{70}{25}{bz1} +\putnotese{40}{-5}{\input{Fig/checksm1}} +\end{layer} + +Beziersmooth("1",[A,B,C,D]); + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{70}{35}{bz1} +\putnotese{40}{10}{\input{Fig/checksm2}} +\end{layer} + +その後,節点や制御点\\ +を動かして,描きたい\\ +ものにする。ただし,\\ +C2p は C1q と B を通\\ +る直線上しか動けない。\\ +C3p は C2q と C を通\\ +る直線上しか動けない。 + +\vspace{10mm} + + +\hypertarget{beziersym}{} +\item[関数] Beziersym(名前,節点リスト,[オプション] ) +\item[機能] 節点間を3次ベジエ曲線でスムーズに結んだ曲線を描く +\item[説明] 節点をはさむ制御点は節点に関し対称(片方は表示されず,動かせない)。 +制御点は自動的に配置される。その後,節点や制御点を動かして描きたいものにする。 + +例: + +\begin{layer}{150}{0} +\putnotese{70}{20}{bz1} +\putnotese{40}{-5}{\input{Fig/checksy1}} +\end{layer} + +Beziersym("1",[A,B,C,D]);\\ +C2p と C3p は表示され\\ +ない。 + +\vspace{10mm} + +\begin{layer}{150}{0} +\putnotese{70}{30}{bz1} +\putnotese{40}{0}{\input{Fig/checksy2}} +\end{layer} + +その後,節点や制御点\\ +を動かして,描きたい\\ +ものにする。\\ +C2p と C3p は表示さ\\れず,動かせない。 + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{bowdata}{} +\item[関数] Bowdata(点リスト , options) +\item[機能] 弓形を描く +\item[説明] 点リストで与えられた2点を結ぶ弓形を描く。\\ + 2点を反時計回りに回る方向に弓形を描く。\\ + optionsは,[曲がり , 空白サイズ , 文字, 線種]\\ + 曲がり は弧の曲がり具合の指定。デフォルトは1\\ + 空白サイズ は中央にあける空白の大きさ\\ + 文字は,"Expr=文字" \\ + また,"Expr=位置 , 文字" で位置を指定して文字を入れる。位置はe,w,n,s,c\\ + +例 三角形ABCの各辺に弓形マークをつけ記号を入れる。 +\begin{verbatim} + Listplot([A,B,C,A]); + Letter([A,"n1","A",B,"w1","B",C,"e1","C"]); + Bowdata([A,B]); + Bowdata([B,C],[1,"Expr=s3,a"]); + Bowdata([C,A],[2,1.2,"Expr=10","da"]); +\end{verbatim} + \input{Fig/bowdata}\\ + + 以上が基本。これに加え,文字を回転して表示する方法がある。\\ + ただし,Cinderellaの画面には反映されない。\\ + 文字をを回転するには次のように書く。\\ + "Exprrot=微小移動 , 文字"\\ + 微小移動は t , n ,u \\ + t は線分方向の微小移動。移動量は数字をつける。正負が可。\\ + n は線分と垂直方向の微小移動\\ + u は上下反転\\ + t , n , u は組み合わせることができる。 + 以下にいくつか例を示す。 +\begin{verbatim} + Bowdata([B,A],[1,1,"Exprrot=a"]); + Bowdata([D,C],[1,1,"Exprrot=t3,a"]); + Bowdata([F,E],[1,1,"Exprrot=t-3,a"]); + Bowdata([H,G],[1,1,"Exprrot=n3,a"]); + Bowdata([L,K],[1,1,"Exprrot=u,a"]); + Bowdata([N,M],[1,1,"Exprrot=t3u,a"]); +\end{verbatim} + \input{Fig/bowdata2}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{bspline}{} +\item[関数] Bspline(名前,制御点リスト,[オプション] ) +\item[機能] 2次B-spline曲線を描く +\item[説明] 節点は自動的に計算され,表示されない\\ + + +例:\verb|Bspline("1",[A,B,C,D,E]);|\\ + \verb|Bezier("1",[A,(B+C)/2,(C+D)/2,E],[B,C,D]);|\\ + と同じ。曲線の名前が bz1 ではなくbzb1 となる。\\ + 通常のB-spline曲線の端の制御点の代わりに,端点を動かせるようにしている。\\ + \input{Fig/checkbs1} + + +例:\verb|Bspline("1",[A,B,C,D,A]);|\\ + リストの最初と最後が同じ場合は閉曲線になる。\\ + \verb|Bezier("1",[(D+A)/2,(A+B)/2,(B+C)/2,(C+D)/2,(D+A)/2],[A,B,C,D]);| と同じ。\\ + \\ + \input{Fig/checkbs2} + \\ +\hypertarget{crspline}{} +\item[関数] CRspline(名前,節点リスト,[オプション] ) +\item[機能] 単独のCatmull-Rom スプライン曲線を描く +\item[説明] + 自由点は,節点のみで,制御点は節点から作られ移動はできない。\\ + オプションに,通常のオプションのほか,次の2つが使える。\\ + "size-$>$n" 画面上での線の太さを指定する。\\ + "pointsize-$>$n" 制御点の大きさを指定する。0のとき非表示となる。\\ + +例:\verb|CRspline("3",[A,B,C,D]);|\\ + \input{Fig/checkCR} + \\ +\hypertarget{circledata}{} +\item[関数] Circledata(name,リスト,options) +\item[機能] 円または多角形を描く。 +\item[説明] 中心の点と,円周上の1点,または3点をリストで与えて円を描く。\\ + プロットデータの名前は,"cr" に引数の name を付加したものとなる。\\ + 中心と円周上の点を,座標ではなく幾何要素名で指定する場合は name は省略可。\\ + optionsは以下のものをリストで与える。省略した場合は実線で円が描かれる。 +\begin{tabbing} +1234567890123456789012\=\kill + "Rng=[$θ_1,θ_2$]" \>角$θ_1$から$θ_2$の範囲の弧を描く。角は弧度法で与える。\\ + "Num=分割数" \>円を描くときの分割数。値が小さい場合は多角形になる。\\ + 線種 \>"dr, n" , "da,m,n" , "do,m,n"\\ + +\end{tabbing} +例:原点中心,半径2の円を描く \verb|Circledata("1",[[0,0],[2,0]]);|\\ + A中心,半径ABの円 を描く \verb|Circledata([A,B]);|\\ + A中心,半径2の円 を描く \verb|Circledata([A,A+[2,0]]);|\\ + 3点A,B,Cを通る円を描く \verb|Circledata([A,B,C]);|\\ + この場合,できた円の中心を \verb|Pointdata("1",[crABCcenter]);| で\\ + 作図できる。\\ + 下図左より,A中心,半径ABの円 を\\ + 太さ2の実線で描く \verb|Circledata([A,B],["dr,2"]);|\\ + 破線で描く \verb|Circledata([A,B],["da"]);|\\ + 点線で描く \verb|Circledata([A,B],["do"]);|\\ + \\ +\input{Fig/circledata1} + \\ +例:A中心,半径AB,中心角60°の弧を描く。\\ + \verb|Circledata([A,B],["Rng=[0,pi/3]"]); |\\ + このとき,扇型を描くのであれば,2本の半径を引く必要がある。そのためには,Aが原点,Bがx軸上にあれば,点A,B以外にもうひとつ点Cをとり,その位置を CindyScript を用いて +\begin{verbatim} + C.xy=|A,B|*[cos(pi/3),sin(pi/3)] +\end{verbatim} + で指定し,扇型ができたのを確かめてから,\verb|Listplot([B,A,C])| を付加すればよい。\\ +\\ + \input{Fig/circledata2}\\ +\\ + 辺ABが$x$軸と平行でない場合は,角の範囲は0からではなく,ABが$x$軸となす角から始める必要があり,ちょっとした工夫が必要である。中心Aが原点でない場合も含め,次のようなスクリプトで実現できる。\begin{verbatim} + th=arctan2(B.xy-A.xy); + str="Rng=["+text(th+0)+","+text(th+pi/3)+"]"; + C.xy=A.xy+|A,B|*[cos(th+pi/3),sin(th+pi/3)]; + Circledata([A,B],[str]); + Listplot([B,A,C]); +\end{verbatim} +1行目は,ABが$x$軸となす角を arctan2 関数 によって求めている。\\ +2行目は引数の文字列を作っている。th+0 , th+pi/3 により弧度法にしている。ここで,+0 が必要である。\\ +\\ + \input{Fig/circledata3}\\ +\\ + +複数のオプションをリストで与えることもできる。\\ + +例:弧を太く描く\\ + \verb|Circledata([C,D],["dr,3","Rng=[0,pi/3]"]);|\\ + + 円はNが大きな値の正N多角形として描いている。optionの ["Num=数値"] によってその細かさを指定できる。Nの値が小さければ正多角形が描けることになる。\\ +例:A中心,半径ABの円と,その円に内接する正六角形 +\begin{verbatim} + Circledata("1",[A,B]); + Circledata("2",[A,B],["Num=6"]); +\end{verbatim} + \input{Fig/circledata4}\\ +ここで,同じ[A,B]を使うため,nameを付与して区別する必要がある。\\ +また,頂点の位置を変えるのであれば,Rng= オプションを使う。\\ + \verb|Circledata("2",[A,B],["Num=6","Rng=[pi/6,13/6*pi]"]);|\\ + \input{Fig/circledata5}\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{crosspoint}{} +\item[関数] Crosspoint(name , PD1 ,PD2 , 範囲) +\item[機能] 2曲線の交点を作る +\item[説明] 曲線1と曲線2の範囲にある交点を作る。曲線1と曲線2はプロットデータの名称。\\ +範囲は,交点が存在する範囲を指定する。\\ + +例:3次曲線の接線がその曲線と交わる点を求める。\\ +2点A,Bを作図ツールで適当なところにとり,次のスクリプトで3次曲線を描く。 +\begin{verbatim} + f(x):=x^3-4*x; + g(x):=d(f(#),A.x)*(x-A.x)+A.y; + A.y=f(A.x); + B.y=g(B.x); + Plotdata("1","f(x)","x"); + Lineplot([A,B]); +\end{verbatim} +1行目と2行目で3次曲線とその接線を定義し,点A,Bをその上に乗せている。\\ +Plotdata() と Lineplot() により,3次曲線と接線のプロットデータができる。\\ +それぞれの名称はコンソールに出力される。3次曲線は gr1 , 接線は lnAB である。\\ +また,図を見て,交点のある場所を確認して範囲を決める。\\ +プロットデータ名と範囲を用いて次のスクリプトを追加する。\\ + + \verb|Crosspoint("C",gr1,lnAB,[1,2]);|\\ + +これで,交点Cが新たに作られる。\\ +必要に応じ,Letter関数で点の名前を表示すると次のようになる。\\ +\\ + \input{Fig/crosspoint}\\ + \\ +交点が存在しない場合,PD1の端点に点が作られる。\\ +2曲線の交点を作るのに,\hyperlink{putintersect}{Putintersect(点名,PD1,PD2)} 関数を用いることもできる。\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\hypertarget{deqplot}{} +\item[関数] Deqplot(name,式,変数名,初期値,options) +\item[機能] 微分方程式の解曲線を描く +\item[説明] 微分方程式と初期値を与えて解曲線を描く。\\ + \\ +例:$y''=-y$で,初期値が$x=0$のとき$y=1,y'=0$ の解曲線\\ + + \verb|Deqplot("1","y``=-y","x",0, [1,0]); |\\ + + \input{Fig/deqplot1}\\ + +例:$y'=y*(1-y)$で,$x=0$のとき,$y=0.5$の解曲線\\ + + \verb|Deqplot("2","y`=y*(1-y)","x",0, 0.5,["Num=100"]);| \\ + + \input{Fig/deqplot2}\\ + +例:$[x,y]'=[x(1-y),0.3y(x-1)]$で,変数は$t$,$t=0$(区間の左端)のときの$x, y$の値が1と0.5 であるときの解曲線 +\begin{verbatim} + Deqplot("3","[x,y]`=[x*(1-y),0.3*y*(x-1)]","t=[0,20]", + [1,0.5],["Num=200"]); +\end{verbatim} + \\ + \input{Fig/deqplot3}\\ + \\ + なお,この例では,Cinderellaの画面上の図は誤差が大きくて正確な図にはならないが,\TeX に出力する図は正確な図になる。解像度を上げる(Numの数を大きくする)ことにより,Cinderellaの画面上の図も正確な図に近づく。\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{drwpt}{} +\item[関数] Drwpt(点,option), Drawpoint(点,options) +\item[機能] 点を表示する +\item[説明] 座標または幾何点の識別名を与えて点を表示する。これだけではCinderellaの描画面には描かれないので,描画面にも表示するにはCinderellaの作図ツールで作図するか,Pointdata() または Putpoint() を用いる。\\ + 複数の点の場合は座標または識別名はリストで与える。\\ + optionに数字 0 を入れると,白抜きで表示する。なお白抜きの場合は,Ptsize()で点の大きさを少し大きめにとるとよい。\\ + 可読性を高めるときはDrawpointを推奨する。\\ + +例:座標(1,1)と(4,3)に点を表示する。Cinderellaの描画面には描かれない。\\ + \verb|Drwpt([[1,1],[4,3]]);|\\ + +例:Cinderellaで点A,B,Cを作図しておき,\TeX で表示する。\\ + \verb|Drwpt([A,B,C]); |\\ + +例:線分ABの右端(B)を白抜きで表示する +\begin{verbatim} + Ptsize(5); + Listplot([A,B]); + Drawpoint(B,0); +\end{verbatim} + \\ + \input{Fig/drawpoint}\\ +※ Drawpoint([A,B],0); とすれば,両端が白抜きになる。\\ +\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{drawsegmark}{} +\item[関数] Drawsegmark(name,リスト,options)または Segmark(name,リスト,options) +\item[機能] 線分に印をつける +\item[説明] リストで与えられた2点を端点とする線分に印をつける。印には4種類がある。\\ + optionsは,\\ + Type=n:n=1〜4:印の種類\\ + Width:二本線のときの線の幅\\ + 例:Listplot()で四角形ABCDを描き線分に印をつけた。 +\begin{verbatim} + Segmark("1",[A,B],["Type=1"]); + Segmark("2",[B,C],["Type=2","Width=1.5"]); + Segmark("3",[C,D],["Type=3"]); + Segmark("4",[D,A],["Type=4"]); +\end{verbatim} + \input{Fig/segmark} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{expr}{} +\item[関数] Expr([座標 , 位置 , 文字列]) +\item[機能] \TeX 記法の文字列を与えて数式を書く。 +\item[説明] Letterで文字列の前後に\$ \$をおくのと同じ。\\ + 導関数の記号(シングルクウォート)$'$は,Scilab でのシングルクウォートの使用とぶつかるので,$`$(バッククウォート)を用いる。\\ + 複数の箇所に文字を書く場合は,Letter() と同様,引数をリストにして与える。\\ + +例 $f(x)=\dfrac{1}{4} x^2$ とその導関数 $f'(x)=\dfrac{1}{2} x$ の式,軸上に必要な数を入れる。 +\begin{verbatim} + Expr([[-3,3],"e","f(x)=\frac{1}{4} x^2",[3,1.5],"s2e2", + "f‘(x)=\frac{1}{2}x",[2,0],"s","2",[0,1],"w","1"]); +\end{verbatim} + \\ + \input{Fig/expr}\\ + + ※原点Oが線と重なっている。位置をずらすには,Setax() の項を参照のこと。\\ + +例 対数関数の定積分の記号および積分値を図に書き込む。\\ + 下図で,定積分の表示の部分は矢線をPQとして, +\begin{verbatim} + Arrowdata(Q,P); + Expr([Q+[0.2,0],"ne","\displaystyle \int_a^b \log x\,dx="+ + text(L.x*(log(L.x)-1)-G.x*(log(G.x)-1)) ]); +\end{verbatim} + で表示している。\\ + \verb|L.x*(log(L.x)-1)-G.x*(log(G.x)-1)| は,点L,G(図の$a,b$)をドラッグして\\ + 積分範囲を決めるようにしているので,そこから計算した値。\\ +\\ + + \input{Fig/intlog} + +\hypertarget{exprrot}{} +\item[関数] Exprrot([座標 , 向き , 文字列]) +\item[機能] \TeX 記法の文字列を与えて傾いた数式を書く。 +\item[説明] 「座標」の位置に,指定された向きで数式を書く。\\ + 向きはベクトルで与える。\\ + 座標,向きとも,Cinderellaで作図した幾何点を用いることができる。\\ + A(1,1),B(3,2),C(0,2) のとき,次の2つのスクリプトは同じ結果になる。 +\begin{verbatim} + Exprrot(C,B-A,"\sqrt{3}"); + Exprrot([0,2],[2,1],"\sqrt{3}"); +\end{verbatim} + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{ellipseplot}{} +\item[関数] Ellipseplot(name,点リスト ,定義域, options) +\item[機能] 焦点と通る点を与えて楕円を描く。 +\item[説明] 点リストで2つの焦点と通る点を与える。点はCinderellaの幾何点が使える。\\ + また,通る点のかわりに,焦点からの距離の和を実数で与えることもできる。\\ + 実際には,媒介変数表示$x=a \cos \theta,x=b \sin \theta$ を,回転・平行移動して描いている。定義域はこのときの$t$の定義域で,省略も可能。省略したときの初期値は[-5,5]\\ + +例:点A,Bを焦点とする楕円を描く。\\ + \verb|Ellipseplot("1",[A,B,C]);| 点Cを通る楕円を描く。\\ + \verb|Ellipseplot("1",[A,B,4]);| 焦点からの距離の和が4である楕円を描く。\\ + \verb|Ellipseplot("1",[A,B,C],"[0,pi]");| 楕円の半分を描く。\\ + \\ +例:Cinderellaの作図ツールに,焦点と通る点で楕円を描くものがある。また,点の極線を描くツールがある。これを利用すると,楕円上にとった点をインシデントにできるので,インタラクティブに図を変更することができる。このCinderellaの作図機能と合わせて,一方の焦点から出た光が楕円上で反射して他方の焦点に至る,という図を次のようにして描くことができる。\\ + まず,3つの点A,B,Cを作図する。次に「焦点と通る点で決まる楕円」ツールを選び,点A,B,Cを順に指定すると,楕円が描かれる。\\ + + モードメニューの「直線」から「点の極線」を選び,点Cと楕円を順に指定すると接線が引かれる。\\ + 「垂線を加える」ツールを用いて,点Cで垂線,すなわち法線を引く。\\ + 「点を加える」ツールを用いて,接線,法線上に適当に点を取る。(D,Eとなったとする)\\ + 次のスクリプトを書いて実行すると,楕円に関して入射角と反射角が等しくなるように光が反射する様子を図にすることができる。 +\begin{verbatim} + Ellipseplot("1",[A,B,C]); + Lineplot([C,D]); + Lineplot([C,E]); + Arrowdata([A,C]); + Arrowdata([C,B]); + Anglemark([A,C,B]); + Expr([A,"s2","F_1",B,"s2","F_2"]); +\end{verbatim} + \\ + \input{Fig/ellipseplot1}\\ + + また,接線,法線を描かず,この楕円上に点D,E,・・をとり(個数は任意)次のスクリプトを書けば,何本かの光線が一方の焦点を出て他方の焦点に集まる様子を描くことができる。 +\begin{verbatim} + Ellipseplot("1",[A,B,C]); + Listplot([A,C,B]); + Listplot([A,D,B]); + Listplot([A,E,B]); + Expr([A,"s2","F_1",B,"s2","F_2"]); +\end{verbatim} + \\ + \input{Fig/ellipseplot2}\\ + \\ + +\hypertarget{framedata}{} +\item[関数] Framedata(name , リスト) +\item[関数] Framedata2(name ,[P1,P2]) +\item[機能] 矩形を描く +\item[説明] 中心の座標,横,縦をリスト[中心 ,横 , 縦]で与え,矩形を描く。横,縦は中心からの距離。\\ + 中心の座標は点の名前でもよい。\\ + 中心を座標で与える場合はnameは省略できない。\\ + 横,縦は,矩形の頂点を示す点にすることもできる。\\ + 中心,横,縦を省略した場合は,描画範囲と同一の矩形を描く\\ + Framedata2() では,対角点(左下P1と右上P2)をリストで与える。\\ + 以下にいくつか例を示す\\ + \verb|Framedata("1");| 描画範囲と同一の矩形を描く\\ + \verb|Framedata("2",[[0,0],2,2]);| 原点を中心とする縦横幅4の正方形を描く\\ + \verb|Framedata("3",[A,3,2]);| 点Aを中心とする横6,縦4の矩形を描く\\ + \verb|Framedata([A,3,2]);| 中心が点の名称の場合はnameは省略できる。\\ + \verb|Framedata([A,B]);| 点Aを中心,点Bを頂点のひとつとする矩形を描く\\ + 矩形の角を丸めたい場合は,Ovaldata(name, 点リスト,options)を使う。\\ + \verb|Framedata2("1",[A,B]);| 点A,Bを対角点とする矩形を描く\\ + \\ + +\hypertarget{hyperbolaplot}{} +\item[関数] Hyperbolaplot(name,点リスト ,定義域, options) +\item[機能] 焦点と通る点を与えて双曲線を描く。 +\item[説明] 点リストで2つの焦点と通る点を与える。点はCinderellaの幾何点が使える。また,通る点のかわりに,焦点からの距離の差を実数で与えることもできる。\\ + 実際には,ハイパボリック関数を用いた媒介変数表示 $x=\cosh t,y=\sinh t$を回転・平行移動している。 + optionとして,"Asy=線種" を与えると,漸近線を指定した線種で表示する。デフォルトでは漸近線は非表示。\\ + +例:点A,Bを焦点とする双曲線を描く。\\ + \verb|Hyperbolaplot("1",[A,B,C]);| 点Cを通る双曲線を描く。\\ + \verb|Hyperbolaplot("1",[A,B,2]);| 焦点からの距離の差が2の双曲線を描く。\\ + \verb|Hyperbolaplot("1",[A,B,C],["Asy=do"]);| 漸近線を点線で描く。\\ + + \input{Fig/hyper1}\\ + +\hypertarget{parabolaplot}{} +\item[関数] Parabolaplot(name,点リスト ,定義域, options) +\item[機能] 点リスト[A,B,C]で示された焦点,準線で決まる放物線を描く。 +\item[説明] 焦点Aと準線BCで決定する放物線を描く。\\ + 実際には,2次関数 $y=x^2$のグラフを回転・平行移動して描いており,定義域は,$y=x^2$での定義域と考えてよい。定義域は省略することもできる。省略したときの初期値は[-5,5]\\ + +例:点Aを焦点,直線BCを準線とする放物線を描く\\ + \verb|Parabolaplot("1",[A,B,C]); |\\ + \verb|Parabolaplot("1",[A,B,C],"[-5,5]");| 定義域を $-5 \leqq x \leqq 5$ とする。\\ + 点(0,1)を焦点,直線$y=-1$を準線とする放物線を描く\\ + \verb|Parabolaplot("1",[[0,1],[-1,-1],[1,-1]]);|\\ + \\ +例:放物線上の2点で引かれた接線と放物線で囲まれた領域を斜線で描く。\\ + Cinderellaの作図ツールに,焦点と準線で放物線を描くものがある。また,点の極線を描くツールがある。これを利用すると,放物線上にとった点をインシデントにできるので,インタラクティブに図を変更することができる。このCinderellaの作図機能と合わせて,次の手順で図を描く。\\ + まず,焦点A(0,1)と準線$y=1$:BCを作図する。次に「焦点と準線で決まる放物線」ツールを選び,点Aと直線BCを指定すると,放物線が描かれる。方程式では$y=\dfrac{1}{4}x^2$の放物線である。\\ + 次に,放物線上に点D,Eをとる。Cinderellaの作図機能を用いているので,この2点は放物線上だけを動かすことができる。(インシデント)\\ + モードメニューの「直線」から「点の極線」を選び,点Dと放物線,点Eと放物線を順に指定すると接線が引かれる。その交点に点を取る。\\ + \\ + \includegraphics[bb=0 0 964 826 , width=6cm]{Fig/parabolaplot.png}\\ + \\ + 以上で作図ができたので,次のスクリプトを書いて実行する。 +\begin{verbatim} + Parabolaplot("1",[A,B,C]); + Lineplot([D,F]); + Lineplot([E,F]); + Listplot([E,F,D]); + Hatchdata("1",["ii"],[["gr1para","s"],["sgEFD","n"]]); +\end{verbatim} + \\ + これで,次図ができる。このあと,文字などは適当に追加する。\\ + \\ + \input{Fig/parabolaplot} + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ +\hypertarget{ovaldata}{} +\item[関数] Ovaldata(name, 点リスト,options) +\item[機能] 角を丸くした矩形を描く +\item[説明] 中心と対角の1点を指定し,角を丸くした矩形を描く\\ + optionsは,角の落とし具合と線種など。デフォルトは0.2 \\ + +例:いくつかの例を示す。 +\begin{verbatim} + Ovaldata("1", [A,B]); + Ovaldata("2", [C,D],[0]); + Ovaldata("3", [E,F],[1,"dr,3"]); + Ovaldata("4", [G,H],[1.5,"da"]); +\end{verbatim} + \input{Fig/ovaldata}\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{htickmark}{} +\item[関数] Htickmark([横座標 , 方向 , 文字]) +\item[機能] 横軸に目盛を書く。 +\item[説明] Scilabのみで実行する。Cinderellaの描画面には反映されない。引数は位置(横座標),方向,文字。複数点の情報を[ ]内にまとめて記入できる。\\ + +例 点$(2,\ 0)$の南西側に$2$を表示する。\\ + \verb|Htickmark([2,"sw","2"]);|\\ + +例 -5から5までの目盛を打つ。\\ + Cindyscriptのリスト処理を使って,次のように引数のリストを作って渡す。 +\begin{verbatim} + memori=apply(-5..5,x,[x,"s",text(x)]); + memori=flatten(remove(memori,[[0,"s","0"]])); + Htickmark(memori); +\end{verbatim} + 1行目,apply のカッコ内の -5..5 でリスト[-5,-4,-3,-2,-1,0,1,2,3,4,5] ができる。\\ + それを用いて,applyで[数, "s",数の文字] からなるリストができる。text(x) はxを文字にする関数。\\ + 2行目で,このリストから,[0,"s","0"]を除き,リストを平滑化する。\\ + 結果は次のようになる。\\ + +\input{Fig/htickmark}\\ + +\hypertarget{vtickmark}{} +\item[関数] Vtickmark([横座標 , 方向 , 文字]) +\item[機能] 縦軸に目盛を書く。 +\item[説明] Htickmarkと同様。縦軸に目盛を書く。\\ + +例:点$(0,\ 1),\ (0,\ 2)$の西側に$1,\ 2$を表示する。\\ + \verb|Htickmark([1,"w","1",2,"w","2"]);|\\ +\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{implicitplot}{} +\item[関数] Implicitplot(name,式,xの定義域,yの定義域, options) +\item[機能] 陰関数のグラフを描く。 +\item[説明] 陰関数の式を与えてグラフを描く。式,定義域とも文字列。\\ + options は,"r","m","Wait=n" が指定できる。Wait の初期値は10。\\ + "r","m"に関しては,オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ + +例:楕円を描いて,中にハッチをかける。 +\begin{verbatim} + Implicitplot("1","x^2+2*y^2=4","x=[-2,2]","y=[-2,2]"); + Hatchdata("1","i",["imp1"]); +\end{verbatim} + 注)ここで,yの定義域は実際より広くとってある。"y=[-1,1]" とすると,上下が欠けた楕円になる。曲線だけならそれでよいが,その場合,閉曲線ではないのでHatchdata() で無用に時間がかかってしまうので要注意。\\ + \\ + +\hypertarget{letter}{}\item[関数] Letter([位置, 方向, 文字列]) +\item[機能] 文字列を表示する +\item[説明] 「位置(座標)」と方向で指定された場所に文字を書き込む。\\ + 位置(座標)は点の名前で指定することもできる。場所は上下左右中央( n/s/w/e/c )の方向で表す。(n/s/w/e は東西南北の記号)\\ + \\ + \input{Fig/letter4}\\ + 指定位置からの距離を,数値で与えることもでき,e2, e3 は e より少し離して置く。\\ + 複数の文字列をリストの形にして渡すことができる。\\ + 注)導関数の記号$'$は,数式モード(\$ ではさむ)で$`$(バッククウォート)を用いる。\\ + +例:座標 (2,1) の南東にPを表示\\ + \verb|Letter([2,1] ,"se","P");|\\ + 点Cを中央としてCを表示\\ + \verb|Letter(C ,"c", "C");|\\ + 点Aの南西にA,Eの南に数式を表示\\ + \verb|Letter([A,"sw","A",E,"s","$ f(x)=\frac{1}{4} x^2 $"]);| \\ + \\ +%\input{Fig/letter3} + +\hypertarget{letterrot}{}\item[関数] Letterrot(座標, 方向ベクトル,移動量, 文字列) +\item[機能] 文字列を回転して表示する +\item[説明] 座標で示された位置に,方向ベクトルで指定された向きに回転して文字を書き込む。\\ + 第3引数は微小移動量で,略すこともできる。\\ + A(1,1),B(3,2),C(0,2) のとき,次のスクリプトは同じ結果になる。 +\begin{verbatim} + Letterrot([0,2],[2,1],2,5,"AB"); + Letterrot([0,2],B-A,2,5,"AB"); + Letterrot(C,B-A,2,5,"AB"); + Letterrot(C,B-A,"t2n5","AB"); +\end{verbatim} + 移動量を略して\\ + \verb|Letterrot(C,B-A,"AB");|\\ + とすることもできる。この場合は,微小な移動はされない。\\ + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{lineplot}{} +\item[関数] Lineplot(name , 2点のリスト , options) +\item[機能] 2点のリストで示された点を結ぶ直線を描く。プロットデータ名の頭部は ln +\item[説明] 2点のリストは座標または幾何要素の名前で与える。\\ + options は次の通り。\\ + 線種 "dr, n" , "da,m,n" , "do,m,n"\\ + "+" 半直線を描く。\\ + "dr" , "da" , "do" と "+" はリストにして両方指定することができる。\\ + 点のリストが,座標ではなく幾何要素名のリストの場合は,nameは省略できる。\\ + いくつか例を示す。\\ + 各座標を結ぶ直線を引く\\ + \verb|Lineplot("1",[[0,0],[1,2]])| \\ + Cinderellaの描画ツールで2点A,Bをとっておき,直線ABを引く\\ + \verb|Lineplot([A,B]);| \\ + optionの働きの例\\ + \verb|Lineplot([A,B],["dr,0.5","+"]);| Aを端点とする半直線を引く\\ + \verb|Lineplot([C,D],["dr,2"]);| 直線CDを太さ2で描く\\ + \verb|Lineplot([E,F],["da"]);| 直線EFを破線で描く\\ + \verb|Lineplot([G,H],["do"]);| 直線GHを点線で描く\\ + 結果は,次図左上から。\\ + + \input{Fig/lineplot}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage + +\hypertarget{listplot}{} +\item[関数] Listplot(name , 点のリスト , options) +\item[機能] 点のリストで示された点を結ぶ。プロットデータ名の頭部は sg +\item[説明] 点のリストは座標または幾何要素名のリストで与える。点が,座標ではなく幾何要素名の場合は,nameは省略可 \\ + プロットデータの名前は,"sg" に引数の name を付加したものとなる。\\ + options は次の通り。\\ + 線種 "dr, n" , "da,m,n" , "do,m,n" +\begin{tabbing} +1234567890123456789012345678901234\=\kill + optionsの使用例\\ + \verb|Listplot([A,B]);| \>線分ABを描く。太さはデフォルト。\\ + \verb|Listplot([C,D],["dr,2"]);| \>線分ABを描く。太さ2\\ + \verb|Listplot([E,F],["da"]);| \>線分ABを破線で描く\\ + \verb|Listplot([G,H],["da,3,1"]);| \>線分ABを破線で描く。線を長く\\ + \verb|Listplot([K,L],["da,1,3"]);| \>線分ABを破線で描く。間隔を空ける\\ + \verb|Listplot([M,N],["do"]);| \>線分ABを点線で描く。\\ + \verb|Listplot([O,P],["do,3"]);| \>線分ABを点線で描く。間隔を空ける\\ + \verb|Listplot([Q,R],["do,3,3"]);| \>線分ABを点線で描く。間隔を空けて太く\\ + 結果は次図左から。 +\end{tabbing} + \input{Fig/listplot3} + + 例 : Cinderellaの作図ツールで三角形ABCを描いておく。 +\begin{verbatim} + Listplot([A,B,C,A]); + Addax(0); +\end{verbatim} + \input{Fig/listplot1}\\ + 各座標を頂点とする三角形を描く\\ + \verb|Listplot("1",[[0,0],[2,0],[1,2],[0,0]]);| +\\ + プロットデータは点の座標のリストである。したがって,プロットデータを自作してListplot()で表示することができる。\\ + \\ +例:有限フーリエ級数展開\\ + \[\cfrac{\pi}{2}+\sum_{n=0}^{30} \cfrac{1-(-1)^n}{n}\sin nx\] +次のようにCindyscriptで関数を定義し,プロットデータpd を作って引数に渡す。 +\begin{verbatim} + f(x):=( + s=pi/2; + repeat(30,n,s=s+(1-(-1)|^n)/n*sin(n*x)); + ); + pd=apply(0..200,t, + x=-2*pi+t*4*pi/200; + [x,f(x)]; + ); + Listplot("1",pd); + Expr([[-2*pi,-0.5],"s","-2\pi",[-pi,-0.5],"s","-\pi",[pi,-0.5],"s", + "\pi",[2*pi,-0.5],"s","2\pi",[0,pi],"w2","\pi"]); +\end{verbatim} + \\ +\begin{center} +\input{Fig/fourier} +\end{center} + \\ + リストの長さには制限があるため,あまり長いリストを用いたり,何度も用いたりすることができない。たとえば,タートルグラフィクスを用いたシェルピンスキーのギャスケットでは,次のサイズくらいは可能だが,植物の成長モデルでは分岐が多いためあまり大きな図はできない。スクリプトを工夫して,200くらいずつのリストに分割する。\\ + \input{Fig/listplot2} + \\ + \\ +\hypertarget{mesegmets}{} +\item[関数] Mksegments() +\item[機能] 幾何線分のすべてのPD を作成 +\item[説明] Ketinit() の直後に置くことにより,Cinderellaの作図ツールで描いたすべての線分をそのままプロットデータとする。たとえば,線分ABを作ると,プロットデータsgABが作成される。その後,インスペクタで点Bの識別名を変更(たとえばQに)すると,プロットデータ名も変更される。線分はすでに描かれていてもよい。\\ + +\hypertarget{mkcircle}{} +\item[関数] Mkcircles() +\item[機能] 幾何円のすべてのPD を作成 +\item[説明] Ketinit() の直後に置くことにより,Cinderellaの作図ツールの「円を加える」で描いたすべての円をそのままプロットデータとする。たとえば,中心A,円周上の点をBとした円を作ると,プロットデータcrABが作成される。その後,インスペクタで点Bの識別名を変更(たとえばQに)すると,プロットデータ名も変更される。円はすでに描かれていてもよい。\\ +\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{mkbeziercrv}{} +\item[関数] Mkbeziercrv(名前,[[節点リスト,制御点リスト],[節点リスト,制御点リスト],...],\\ +\hfill[オプション] ) +\item[機能] 複数のベジエ曲線を描く +\item[説明] 単独のベジエ曲線の場合はリストの外側の[ ]はなくてもよい。\\ +Mkbeziercrv|(名前,[節点リスト,制御点リスト],[オプション] ) は\\ +Bezier(名前,節点リスト,制御点リスト,[オプション] ) と同じ。 + + +\vspace{2mm} + +例:\verb|Mkbeziercrv("n",[[A,B,C],[[D],[E,F]]]);| は\\ + \verb|Bezier("n",[A,B,C],[[D],[E,F]]);| と同じ。\\ + 曲線の名前が bzn ではなく bzn1 となる。 + +\vspace{2mm} + +\begin{layer}{150}{0} +\putnotese{30}{45}{bz51} +\putnotese{90}{45}{bz52} +\putnotese{0}{5}{\input{Fig/checkmc1}} +\end{layer} + +複数の場合は,\verb|[ [ptlist1,ctrlist1], [ptlist2,ctrlist2],... ]| + +\verb|Mkbeziercrv("5",[[[A,B,C],[[D],[E,F]]],[[G,H,K,L],[[M],[N,O],[P]]]]);| + +\vspace{40mm} +\begin{verbatim} +ptlist1=[A,B,C];ctrlist1=[[D],[E,F]];list1=[ptlist1,ctrlist1]; +ptlist2=[G,H,K,L];ctrlist2=[[M],[N,O],[P]];list2=[ptlist2,ctrlist2]; +list=[list1,list2]; +Mkbeziercrv("5",list); +\end{verbatim} +などとしても同じ。 + \\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{mkbezierptcrv}{} +\item[関数] Mkbezierptcrv(節点リストptlist,[オプション] ) +\item[機能] ベジエ曲線を描く +\item[説明] 制御点は,自動的に配置される。その後,節点や制御点を動かして, +描きたいものにする。 + +複数の場合は [ ptlist1, ptlist2.... ] + +名前は,A から順に自動的につける。 + +オプション + +"Deg=...” 次数指定ができる。(デフォルトは3次) + +"Num=..." 各区間の区間数(分点数ー1)を指定できる。(デフォルトは10) + +\vspace{5mm} + +例: + +\begin{layer}{150}{0} +\putnotese{50}{15}{bzA} +\putnotese{50}{-5}{\input{Fig/checkb8}} +\end{layer} + +\verb|Mkbezierptcrv([A,B,C]);| + + +\vspace{25mm} + +\begin{layer}{150}{0} +\putnotese{50}{15}{bzA} +\putnotese{60}{-10}{\input{Fig/checkb11}} +\end{layer} + +その後,節点や制御点を動かして, + +描きたいものにする。 + +\vspace{30mm} + +\begin{layer}{150}{0} +\putnotese{80}{25}{bzA} +\putnotese{50}{-5}{\input{Fig/checkb9}} +\end{layer} + +\verb|Mkbezierptcrv([A,B,C],["Deg=2"]);| + +Deg=2 とすると2次になる。 + +制御点は各区間に1個ずつできる。 + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{20}{45}{bzA} +\putnotese{80}{45}{bzB} +\putnotese{0}{10}{\input{Fig/checkb10}} +\end{layer} + +複数の場合は [ ptlist1, ptlist2.... ] + +\verb|Mkbezierptcrv([[A,B,C],[D,E,F,G]]);| + +\vspace{25mm} + \\ + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\hypertarget{paramark}{} +\item[関数] Paramark(点リスト , options) +\item[機能] 点リスト[A,B,C]で示された角に平行四辺形の形状の角の印をつける。 +\item[説明] optionsは次の通り。\\ + 数値 角の印の大きさ。デフォルトは1\\ + 線種 "dr, n" , "da,m,n" , "do,m,n"\\ + "Expr=文字" : 文字を入れる\\ + "Expr=位置 , 文字" : 位置を指定して文字を入れる。位置は頂点からの距離。\\ + +例:三角形の内角に印をいれ,文字を書き込む。 +\begin{verbatim} + Paramark([B,A,C]); + Paramark([C,B,A],[3,"Expr=B"]); + Paramark([A,C,B],["dr,2","Expr=2,C"]); +\end{verbatim} + \input{Fig/paramark}\\ + +※角の印には弧の形状のものもある。Anglemark() を参照のこと。\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{paramplot}{} +\item[関数] Paramplot(name , 式 , 変数と定義域,options) +\item[機能] 媒介変数表示の曲線を描く。プロットデータの頭部は gp +\item[説明] 式は""でくくった媒介変数表示のリストで与える。\\ + 定義域も " " でくくって文字列とし,t=に続いてリストで指定する。\\ + options は線種が有効\\ + +例:サイクロイド曲線を描く。\\ + \verb|Paramplot("1","[t-sin(t),1-cos(t)]","t=[0,2*pi]");|\\ + +\input{Fig/paramplot1}\\ +\begin{verbatim} + Deffun("fx(t)", ["regional(x)","x=t-sin(t)","x"]); + Deffun("fy(t)", ["regional(y)","y=1-cos(t)","y"]); + Paramplot("1","[fx(t),fy(t)]","t=[0,2*pi]"); +\end{verbatim} +とすれば,関数定義も Scilab に引き継がれる。\\ + \\ +optionsの使用例。左から,デフォルト,太線,破線,点線の楕円 +\begin{verbatim} + Paramplot("1","[2*cos(t),sin(t)]","t=[0,2*pi]"); + Paramplot("2","[2*cos(t)+5,sin(t)]","t=[0,2*pi]",["dr,2"]); + Paramplot("3","[2*cos(t),sin(t)+3]","t=[0,2*pi]",["da"]); + Paramplot("4","[2*cos(t)+5,sin(t)+3]","t=[0,2*pi]",["do"]); +\end{verbatim} +\input{Fig/paramplot2} +\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{plotdata}{} +\item[関数] Plotdata(name , 式 , 変数と定義域 , options) +\item[機能] 関数のグラフを描く。プロットデータの名前は,gr +\item[説明] 式で表された関数のグラフを,指定された定義域で描く。\\ + 式,定義域は " " でくくって文字列とする。定義域はx=に続いてリストで指定。\\ + options は次の通り。 +\begin{tabbing} +12345678901234567890123\=\kill + 線種 \>"dr, n" , "da,m,n" , "do,m,n"\\ + "Num=数値" \>描画時の分割数\\ + "Dis=数値" \>値が指定数値以上ジャンプする場合は不連続点とみなす。\\ + "Exc=数値リスト \>リストで示された点は除外する。\\ + "Exc=関数" \>関数の零点は除外する。\\ +\end{tabbing} + 例:2次関数 $f(x)=x^2-2x$ のグラフを定義域指定なしで描く。\\ + \verb|Plotdata("1","x^2-2*x","x");|\\ + \\ + \input{Fig/plotdata1} + \\ + \\ + 例:三角関数 $2\sin \left(2x-\dfrac{\pi}{4} \right)$ のグラフを,定義域 $0 \leqq x \leqq 2 \pi$で描く。\\ + \verb|Plotdata("3","2*sin(2*x-pi/4)","x=[0,2*pi]");|\\ + \\ + \input{Fig/plotdata2} + \\ + CindyScript では,plot( 式 , 定義域 ); で描くが, \ketcindy を用いるときは,CindyScript のplot 関数のかわりに,このPlotdata を使えばよい。\\ + 軸に数字を入れるのであれば,Letter() を用いる。\\ + +optionsの使用例\\ + \verb|Plotdata("1","sin(x)","x");| $f(x)=$sin$x$ のグラフを描く(デフォルト)\\ + \verb|Plotdata("2","sin(x)+1","x",["dr,2"]);| 同じく,太さ2で描く\\ + \verb|Plotdata("3","sin(x)+2","x",["da"]);| 同じく,破線で描く\\ + \verb|Plotdata("4","sin(x)+3","x",["do"]);| 同じく,点線で描く\\ +結果は次図上から。\\ + \\ + \input{Fig/plotdata3}\\ + + Num=分割数の指定\\ + グラフの描画は,区間を分割して関数値をとり,各点を結ぶという通常の方法によっている。Nの指定はこの分割数の指定である。デフォルトは50。思うような結果が得られない場合はこの値を大きく指定するとよい。\\ + 下図左はデフォルト,右は Num=200 とした。\\ + + \input{Fig/plotdata4}\\ + + 不連続点の指定\\ + Dis オプションにより,値がジャンプする不連続点を線で結ばないようにする。Numオプションと合わせて使うと効果が上がる。\\ + + 例:$f(x)=$tan$x$ のグラフは,そのままではあたかも漸近線が描かれたようになるが,これは,不連続点をそのまま結んでいるためである。 +\begin{verbatim} + Deffun("f(x)", ["regional(y)","y=tan(x)","y"]); + Plotdata("1","f(x)","x",["Num=200","Dis=50"]); +\end{verbatim} +で漸近線が描かれなくなる。\\ + + 例:ガウス記号 [$x$] で表される関数のグラフは,不連続な階段状になる。この関数は天井関数 floor()であるので, +\begin{verbatim} + Deffun("f(x)", ["regional(y)","y=floor(x)","y"]); + Plotdata("1","f(x)","x",["Num=100","Dis=0.9"]); +\end{verbatim} +できれいに描ける。\\ + + \input{Fig/plotdata5}\\ + + 関数に文字係数がついており,文字係数の値を変化させながらグラフを描くには,Assign を使う。\\ + \\ + 例:直線 $y=bx-b^2$ の係数$b$を変化させて描き,包絡線をうかびあがらせる。 +\begin{verbatim} + repeat(50,t, + cb=t/5-5; + Plotdata(text(t),Assign("b*x-b\verb|^|2","b",cb),"x");\\ + ); +\end{verbatim} + \\ + \input{Fig/assign}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{pointdata}{} +\item[関数] Pointdata(name , 点リスト , optionss) +\item[機能] 点を作ってScilabに点のリスト Pointdata(list)を出力する。 +\item[説明] 点データを作成する。この点は,幾何要素ではない。プロットデータの頭部は pt\\ + 例:\verb|Pointdata("1",[[1,2],[-2,3]]);|\\ + 2つの点データを作る。Cinderellaの描画面では緑の点で表示される。\\ + \verb|Pointdata("1",[A,B]);|\\ + 作図した点A,Bについて,点データを作る。\\ + Cinderellaの描画面上では既存の点A,Bに緑の点が重なって表示される。\\ + \verb|Pointdata("1",A,["size=4"]);|\\ + Aの位置に大きさ4で点を作る。Ptsize(Setpt) の項を参照のこと。\\ + \verb|Pointdata("1",[A,B],[0]);|\\ + 点データを作り,TeXにオプション0(白抜き)で描く\\ + \verb|Pointdata("1",[[3,4],[5,6]],["notex"]);|\\ + 点データを作るが,TeXには描かない\\ + \verb|Pointdata("1",[A,B],["nodisp"]);|\\ + 点データを作らない.(戻り値として返す)\\ + + 生成されるリストは,座標のリストがネストした形になっている。\\ + その内容は,println()を用いてコンソールに表示することができる。たとえば + \begin{verbatim} + Pointdata("1",[[1,2],[3,4],[6,2]]); + println(pt1); +\end{verbatim} + で,コンソールに次のように表示される。 +\begin{verbatim} + generate pointdata pt1 + [[[1,2]],[[3,4]],[[6,2]]] +\end{verbatim} + ネストされたリストは,Cindyscriptの flatten() 関数を利用して平滑化(ネストを解除)することにより,Listplot()で利用することができる。\\ + \\ + 例:\verb|Ptsize(3);|\\ + \verb|Pointdata("1",[[1,2],[3,4],[6,2]]);|\\ + \verb|Listplot("1",flatten(pt1));|\\ + これで,節点を明示した折れ線が描ける。(下図左)\\ + \verb|Listplot("1",[[1,2],[3,4],[6,2]]);|\\ + では線分のみが描かれる。(下図右)\\ + \input{Fig/pointdata}\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{polygonplot}{} +\item[関数] Polygonplot(name , 点リスト , 整数,optionss) +\item[機能] 2点を指定して正多角形を描く。 +\item[説明] 円に内接する正多角形を描き,頂点の幾何点を作る。\\ + 例:\verb|Polygonplot("1",[A,B],12);|\\ + 点Aを中心とし,半径ABの円周上に,点Bからスタートして正十二角形の頂点B1〜B11を反時計回りに作り,これを結んだ正多角形を描く。頂点は幾何点。\\ + 整数でない数を指定した場合は,きちんと閉じない折れ線が描かれる。\\ + + +\hypertarget{putintersect}{} +\item[関数] Putintersect(点名 , PD1 ,PD2,[No] ) +\item[機能] 2曲線の交点を作る +\item[説明] 2曲線はプロットデータ名で指定する。指定した点名で交点を作る。この点は幾何点。\\ + 交点が2つ以上ある場合でも,描画範囲にそのうち1つだけが存在するなら,その点となる。描画範囲に2つ以上の交点がある場合は,それらのうちいずれかになる。このとき,コンソールに交点の座標のリストと,「Choose point number 」というガイドが表示される。引数のNoとして,その番号を指定すると,その点が採用される。\\ + この関数で作成されるのは幾何点だけなので,\TeX の図に点として明示するためにはPointdata()で書き出す必要がある。\\ + 次の例は,3次曲線と直線の交点を3つとも取ったものである。 +\begin{verbatim} + Plotdata("1","x^3-4*x","x",["Num=200"]); + Plotdata("2","1/2*x+1","x"); + Putintersect("P","gr1","gr2",1); + Putintersect("Q","gr1","gr2",2); + Putintersect("R","gr1","gr2",3); + Pointdata("1",[P,Q,R],["size=4"]); +\end{verbatim} + \\ + \input{Fig/putintersect}\\ + \\ + 交点が存在しない場合は,「No intersect point」がコンソールに表示される。\\ + 2曲線の交点を作るのに,\hyperlink{crosspoint}{Crosspoint()} 関数を用いることもできる。\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +\hypertarget{putpoint}{} +\item[関数] Putpoint(点名 , 座標1 ,座標2 ) +\item[機能] 点を作る +\item[説明] 識別名が点名の点を,既存でなければ座標1に作る。既存ならば座標2に移動する。Texには出力されない。\\ + +例:(1,1) に固定点Aを作る。 この点は動かすことができない。\\ + \verb|Putpoint("A",[1,1]);|\\ + (1,1)に自由点を作る。\\ + \verb|Putpoint("A",[1,1],[A.x,A.y]);|\\ + この点は座標2の効果により,自由点となり,ドラッグして動かすことができる。\\ + +実際には,Cinderellaの作図ツールで点を取り,インスペクタで名前を変更すればよいわけだが,この形でとればスクリプトの可読性が増す意味がある。\\ +注)点名は半角アルファベットとする。数字や漢字でもCinderellaでは点ができるが,Scilabでエラーとなる。\\ + +\hypertarget{putonline}{} +\item[関数] PutonLine(点名 , 座標1 ,座標2 ) +\item[機能] 直線上に点を作る +\item[説明] 座標1,座標2を通る直線上に点名の点を作る。できた点は直線に対してインシデントとなる。\\ +例 点A,Bを通る直線上に点Pをとる。\\ + \verb|PutonSeg("P",A,P);|\\ + +\hypertarget{putonseg}{} +\item[関数] PutonSeg(点名 , 座標1 ,座標2 ) +\item[機能] 線分上に点を作る +\item[説明] 座標1,座標2を通る線分上に点名の点を作る。できた点は線分に対してインシデントとなる。\\ +例 点A,Bを通る線分上に点Pをとる。\\ + \verb|PutonSeg("P",A,P);|\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{reflextpoint}{} +\item[関数] Reflectpoint(点,対称点または対称軸) +\item[機能] 点の鏡映を作成 +\item[説明] 点を指定された点または軸に関して対称移動する。対称軸は[ 点1, 点2 ]で指定\\ + \\ +例:CはBに関してAと対称な点\\ + Dは点(2,3)に関してAと対称な点\\ + Eは点(1,0) に関して (-1,1) と対称な点\\ + Fは直線CEに関してAと対称な点\\ +\begin{verbatim} + C.xy=Reflectpoint(A,B); + D.xy=Reflectpoint(A,[[2,3]]); + E.xy=Reflectpoint([-1,1],[[1,0]]); + F.xy=Reflectpoint(A,[C,E]); + Lineplot([C,E],["do"]); +\end{verbatim} + \\ + \input{Fig/reflectpoint}\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{rotatepoint}{} +\item[関数] Rotatepoint(点 ,角度 , 中心) +\item[機能] 点の位置を回転する +\item[説明] 点を,中心で示された点の周りに回転する。角度は弧度法で与える\\ +\begin{spacing}{1.5} +例:点CはAを,Bに関して$\dfrac{2}{3}\pi $だけ回転した点\\ + 点Dは点(5,2)を,Bに関して$\dfrac{\pi}{3}$ だけ回転した点\\ + 点Eは点(3,0)をAに関して $-\dfrac{\pi}{4} $だけ回転した点 +\end{spacing} +\begin{verbatim} + C.xy=Rotatepoint(A,2*pi/3,B); + D.xy=Rotatepoint((5,2),pi/3,B); + E.xy=Rotatepoint([3,0],-pi/4,A); +\end{verbatim} + \\ + \input{Fig/rotatepoint}\\ + \\ +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{rulerscale}{} +\item[関数] Rulerscale(始点 ,横軸目盛 , 縦軸目盛) +\item[機能] 目盛を打つ +\item[説明] 始点の位置を縦横の起点として目盛りを打つ。\\ + 目盛はリストで与える。\\ + ["r",a,b,c] の形式では,aからbまでc間隔で目盛を打つ。\\ + ["f",n1,"str",n2,"str",・・] の形式では,nと"str"がセットで,nの位置に"str"を書く。ただし,位置はCinderellaの描画面の原点を0とする。\\ + Framedata() または Framedata2() とともに用いると矩形に目盛を打つことができる。\\ + \\ +例:Aを原点に置いた矩形枠を描き,横に0,1,2,3,4,5,縦に d1,d2 の目盛を打つ。 +\begin{verbatim} + Framedata2("1",[A,B]); + Rulerscale(A,["r",0,5,1],["f",1,"d1",3,"d2"]); +\end{verbatim} + \input{Fig/ruler}\\ + \\ + +\hypertarget{scalepoint}{} +\item[関数] Scalepoint(点,比率ベクトル,中心) +\item[機能] 点の位置を拡大・縮小する +\item[説明] 点を,指定された中心を原点とする座標系で,比率ベクトルの分だけ拡大・縮小した位置に置く。\\ + +例:点Cを,点Aを原点中心に横に3倍,縦に2倍した位置に置く。\\ + 点Dを,点Aを点B中心に横に3倍,縦に2倍した位置に置く。\\ + 点Fを,点Aを原点中心にベクトル$\overrightarrow{OE} $で示された比率の位置に置く。 +\begin{verbatim} + C.xy=Scalepoint(A,[3,2],[0,0]); + D.xy=Scalepoint(A,[3,2],B); + F.xy=Scalepoint(A,E.xy,[0,0]); +\end{verbatim} + \input{Fig/scalepoint}\\ + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{translatepoint}{} +\item[関数] Translatepoint(点 , 移動ベクトル) +\item[機能] 点を平行移動する +\item[説明] 点を移動ベクトルで示された分だけ平行移動する。\\ +\\ +例:点Cは点Aを$x$軸方向に2 , $y$軸方向に3だけ平行移動した点\\ + 点Dは点Aをベクトル$\overrightarrow{OB} $だけ平行移動した点 +\begin{verbatim} + C.xy=Translatepoint(A,[2,3]); + D.xy=Translatepoint(A,B.xy); +\end{verbatim} + \\ + \input{Fig/translatepoint} +\end{description} + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +% ==プロットデータの操作=================== +\subsection{プロットデータの操作} + +% 描画関数で作成されたプロットデータを用いて描画をおこなう。なお,本節では,該当する図形のことを「プロットデータ」と表記する場合がある。\\ + +\begin{description} + +\hypertarget{changestyple}{} +\item[関数] Changestyle(PDリスト, optionss) +\item[機能] 描画オプションを変更する +\item[説明] 複数の図形の描画オプションを一括して変更する。\\ + +例:線分AB,円ABの線を破線にして\TeX に書き出さないようにする。\\ + \verb|Changestyle(["sgAB","crAB"],["da","notex"]);|\\ + \\ + +\hypertarget{enclosing}{} +\item[関数] Enclosing(name , PDリスト , [位置,方向,数式]) +\item[機能] 複数の曲線から閉曲線を描く。 +\item[説明] 引数の位置,方向,数式は,複数点の情報を[ ]内にまとめて +記入できる。以下は一例。 +\begin{verbatim} + Circledata([A,B],["do"]); + Scaledata("1","crAB",1.5,1/1.5,["do"]); + Scaledata("2","crAB",1/1.5,1.5,["do"]); + Tmp1=Intersectcrvs(sc2,crAB); + Putpoint("C",Tmp1\_1); + Enclosing("1",["sc2","crAB","sc2","Invert(sc1)"],[C]); + Hatchdata("1","i",[["en1"]],["dr,0.5"]); +\end{verbatim} + \input{Fig/enclosing} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ + +\hypertarget{addgraph}{} +\item[関数] AddGraph(name ,プロットデータのリスト,option) +\item[機能] 複数のプロットデータをまとめる +\item[説明] 複数のプロットデータをまとめて扱う。たとえば,円と,円周上の点の2つのプロットデータをまとめて扱えば,スライダを用いたり動画にするときに,個々に移動や回転をしなくてすむ。Joincrvs()では,プロットデータをつなげて1つのプロットデータにするが,AddGraph()では,プロットデータをリスト化して扱うという違いがある。\\ + プロットデータのリストは,プロットデータ名を文字列化して渡す。たとえば,円のプロットデータが cr1 のとき,"cr1" とする。\\ + \\ +例:サイクロイドの図を描く。 +\begin{verbatim} + Setpt(3); + Circledata("1",[[0,1],[0,0]]); + Pointdata("1",[0,0]); + AddGraph("1",["[pt1]","cr1"],["nodisp"]); + nn=32; + forall(1..nn, + t=2*pi/nn*#; + Rotatedata(text(#),"ad1",-t,[[0,1],"nodisp"]); + Translatedata(text(#),"rt"+text(#),[t,0],["dr,0.3"]); + ); +\end{verbatim} + +\begin{center} +\input{Fig/addgraph} +\end{center} + ここで,AddGraph()の引数で与えるプロットデータのリストで,点のプロットデータ pt1 を"[pt1]" としていることに注意。円のプロットデータが,点の座標のリストであるのに対し,点のプロットデータは一つの座標だけなので,このようにしてリスト化して渡す。\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ + +\hypertarget{hatchdata}{} +\item[関数] Hatchdata(name , 方向リスト , プロットデータ , optionss) +\item[機能] 閉曲線の内部に斜線を引く。 +\item[説明] 引数は,曲線名,内部外部のパターンを与える''i'',''o''の文字列,閉曲線を与える曲線分と領域の内部を定める方向のリストとオプション。\\ + Scilabでハッチデータを作成して読み込む。同じ名前のハッチデータがすでにある場合,"m"をつけるとハッチデータを強制的に更新することができる。\\ + \\ +例:円の内部。(下図左) +\begin{verbatim} + Circledata([A,B],["dr"]); + Hatchdata("1",["i"],[["crAB"]],["dr,0.7","out"]); +\end{verbatim} + +例:3つの閉曲線の内側・外側のパターンが同一である領域(下図右) +\begin{verbatim} + Circledata([A,B],["dr"]); + Paramplot("1","[4*cos(t),2*sin(t)]","t=[0,2*pi]"); + Paramplot("2","[2*cos(t),4*sin(t)]","t=[0,2*pi]"); + Hatchdata("1",["ioi"],[["crAB"],["gp1"],["gp2"]],["dr,0.7","out"]); + Hatchdata("2",["iio"],[["crAB"],["gp1"],["gp2"]],["dr,0.7","out"]); +\end{verbatim} + \\ + \input{Fig/hatch1} \input{Fig/hatch2} +\newpage + +例:複数のパターンに分かれた領域。 +\begin{verbatim} + Plotdata("1","2*sin(x)","x=[-pi,3*pi]",["Num=100"]); + Listplot([A,B]); + Listplot([A,C]); + io="out"; + Hatchdata("1",["ii"],[["sAB","n"],["gr1","s"]],["dr,0.7",io]); + Hatchdata("2",["ii"],[["sAC","s"],["gr1","n"]],["dr,0.7",io]); +\end{verbatim} +\begin{center} +\input{Fig/hatch3} +\end{center} + +複数領域の斜線塗の場合,それらの領域をまとめて出力するか, +まとめてCinderellaに読み込む場合が多く,そのような場合には +4行目のような指定の仕方もある。\\ + +例:描画範囲とあわせて閉領域となる場合。 +\begin{verbatim} + Plotdata("1","2*sin(x)","x=[-pi,3*pi]",["Num=100"]) + Listplot([A,B]); + Listplot([A,C]); + Hatchdata("1",["iio"],[["sAB","s"],["sAC","n"],["gr1","[0,2]"]], + ["dr,0.7","out"]); +\end{verbatim} +\begin{center} +\input{Fig/hatch4} +\end{center} + +\newpage + +例:接線で囲まれた領域の場合。 +\begin{verbatim} + Deffun("f(x)",["regional(y)","y=x^2*(x-3)","y"]); + Plotdata("1","f(x)","x"); + PutonCurve("A",gr1,-1); + coef=Derivative("f(x)","x","A.x"); + Defvar("DC=coef"); + Deffun("g(x)",["regional(y)","y=DC*(x-A.x)+A.y","y"]); + Plotdata("2","g(x)","x"); + Tmp=Intersectcrvs(gr1,gr2); + Partcrv("1",A,Tmp_3,"gr1"); + Partcrv("2",A,Tmp_3,"gr2"); + Hatchdata("1",["ii"],[["part1","n"],["part2","s"]],["dr,0.7","out"]); +\end{verbatim} +\begin{center} +\input{Fig/hatch5} +\end{center} + \\ +斜線の向きや間隔を変えることもできる。\\ + +\noindent +%¥Ltab{10mm}{文} +例:円の内部または円と直線で区切られた図形\\ +\verb|Circledata([A,B]);| で円データの名前が crABとなる。これを用いて\\ +\verb|Hatchdata("1",["i"],[["crAB"]]);| +円内に傾き$45^{\circ}$の斜線を引く(下図ha1)\\ +\verb|Hatchdata("2",["i"],[["crAB"]],[-40,2]);| 傾き$-40^{\circ}$,間隔を2倍に(ha2)\\ + (間隔は実数で指定できる)\\ +\verb|Hatchdata("3",["i"],[["crAB"]],["dr,0.5"]);| 線の太さを0.5倍に(ha3)\\ +\verb|Hatchdata("4",["i"],[["crAB"]],[-45,2,"dr,0.5"]);| (ha4)\\ + + \input{Fig/HatchZuKita1.tex} \input{Fig/HatchZuKita2.tex}\\ + 図ha1 図ha2\\ + \input{Fig/HatchZuKita3.tex} \input{Fig/HatchZuKita4.tex}\\ + 図ha3 図ha4\\ + \\ + +この円に直線を加え領域を分ける。\\ + \verb|Lineplot("1",[A,B]);| 直線データの名前は ln1\\ + \verb|Lineplot("2",[A,C]);| 直線データの名前は ln2\\ +円の内部で右上(ln1とln2の北側)(下図ha5)\\ + \verb|Hatchdata("5",["iii"],[["crAB"],["ln1","n"],["ln2","n"]]);|\\ +円の内部で右上と左下(下図ha6)\\ +\verb|Hatchdata("6",["iii","ioo"],[["crAB"],["ln1","n"],["ln2","n"]]);|\\ + + \input{Fig/HatchZuKita5.tex} \input{Fig/HatchZuKita6.tex}\\ + 図ha5 図ha6\\ + \\ +円データcrABを作るが描かなければ境界線が含まれない。(下図ha7)\\ + \verb|Circledata([A,B],["notex"]);|\\ + \verb|Hatchdata("7",["i"],[["crAB"]]);|\\ +境界線を破線で描くと開集合のようになる(下図ha8)\\ + \verb|Circledata([A,B],["da"]);|\\ + \verb|Hatchdata("8",["i"],[["crAB"]]);|\\ + + \input{Fig/HatchZuKita7.tex} \input{Fig/HatchZuKita8.tex}\\ + 図ha7 図ha8\\ + +問題:次図のように上と下で斜線の描き分けをするには? 答は図の後に\\ + + \input{Fig/HatchZuKita9.tex}\\ + \\ +問題の答:次のように2つのデータを作り両方描く +\begin{verbatim} + Hatchdata("9a",["iii"],[["crAB"],["ln1","n"],["ln2","n"]]); + Hatchdata("9b",["ioo"],[["crAB"],["ln1","n"],["ln2","n"]],[90,2]); +\end{verbatim} + (この答は図ha7と図ha8との関係と同じ) + \\ +\hypertarget{dotfilldata}{} +\item[関数] Dotfilldata(name , 方向リスト , プロットデータ , optionss) +\item[機能] 領域を点で敷き詰める。 +\item[説明] Scilabとデータの授受をおこなって描画する。書式はHatchdata()と同じ\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ + +\hypertarget{joincrvs}{} +\item[関数] Joincrvs(name, プロットデータのリスト, options) +\item[機能] 隣接する曲線プロットデータ のリストを繋いで1本の曲線を作る。 +\item[説明] 曲線のリストは隣接する順番で指定する。プロットデータ名の頭部はjoin。\\ +optionsは線種 "dr, n" , "da,m,n" , "do,m,n"\\ + \\ +例:線分$y=x\ (-\sqrt{2} \leqq x \leqq \sqrt{2})$と半円を繋いで得られる閉曲線を描く。\\ +\begin{verbatim} + Plotdata("1","x","x=[-sqrt(2),sqrt(2)]"); + Putpoint("B",[sqrt(2),sqrt(2)]); + Circledata("2",[A,B],["Rng=[pi/4,pi/4*5]"]); + Joincrvs("3",["gr1","cr2"]); +\end{verbatim} + \\ + \input{Fig/joincrvs.tex} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + \\ +\hypertarget{partcrv}{} +\item[関数] Partcrv(name, A, B, プロットデータ, options) +\item[機能] 曲線プロットデータ上の点A, B の間の部分曲線を描く。 +\item[説明] プロットデータ名の頭部はpart。\\ +optionsは線種 "dr, n" , "da,m,n" , "do,m,n"\\ + +例1:2点A, Bの順序と曲線の向きによって部分曲線が決まる。 +曲線の向きは,$y=f(x)$のグラフではx座標が増加する向き。ここで,PDname="gr1"のように""で囲むことが必要。\\ + \verb|Plotdata("1", "x^2", "x", ["do"]);| (放物線の名前はgr1)\\ + \verb|Partcrv("1", [0,0], [1,1], "gr1");| (部分曲線の名前はpart1)\\ + \verb|Partcrv("2", [1,1], [0,0], "gr1");| (部分曲線の名前はpart2)\\ + +\begin{minipage}{35mm} +\begin{center} +\input{Fig/partcrv1}\\ +part1 の図 +\end{center} +\end{minipage} +\hspace{10mm} +\begin{minipage}{35mm} +\begin{center} +\input{Fig/partcrv2}\\ +part2 の図 +\end{center} +\end{minipage} +\vspace{5mm} + +例2:閉曲線の例.パラメータ表示曲線はパラメータの増える向きをもつ。 +\begin{verbatim} + Circledata([A,B], ["do"]); + Plotdata("1", "x^2", "x", ["do"]); + tmp=Intersectcrvs(crAB, gr1); + P.xy=tmp_1; + Q.xy=tmp_2; + Partcrv("1", P, Q, "crAB"); + Partcrv("2", Q, P, "crAB"); +\end{verbatim} +\vspace{5mm} + +\begin{minipage}{45mm} +\begin{center} +\input{Fig/partcrv3}\\ +part1 の図 +\end{center} +\end{minipage} +\hspace{10mm} +\begin{minipage}{45mm} +\begin{center} +\input{Fig/partcrv4}\\ +part2 の図 +\end{center} +\end{minipage} +\\ +\\ + +例3:放物線$y=x^2$が円で切り取られる部分を描く。 +\begin{verbatim} + Circledata([A,B]); + Deffun("f(x)",["regional(y)","y=x^2","y"]); + Plotdata("1","f(x)","x",["do"]); + tmp3=Intersectcrvs("crAB","gr1"); + Partcrv("2",tmp3_2,tmp3_1,"gr1",["dr,2"]); +\end{verbatim} +\input{Fig/partcrv} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +\hypertarget{putoncurve}{} +\item[関数] PutonCurve(点の名前, プロットデータ, options) +\item[機能] 曲線上に点を乗せる。 +\item[説明] 点が存在しない場合は新たに作る。すでにその点が存在する場合は,その点の$x$座標を使う。初期値の$x$座標のデフォルトは 0。\\ +optionsは[$x$座標の範囲]。\\ + +例:アステロイド上の動点P をとる。 +\begin{verbatim} + Deffun("fx(t)", ["local(x)","x=2*cos(t)^3","x"]); + Deffun("fy(t)", ["local(y)","y=2*sin(t)^3","y"]); +\end{verbatim} +で関数を定義し,\\ + \verb|Paramplot("1","[fx(t),fy(t)]","t=[0,2*pi]");|\\ +でアステロイドを表示する。プロットデータは gp1 となる。\\ +そこで\\ + \verb|PutonCurve("P","gp1",[-1,1]); |\\ +で$x$座標が $-1$ である点Pがアステロイド上にでき,この点はドラッグするとアステロイド上を $-1 \leqq x\leqq 1$ の範囲で動かすことができる。\\ + + \input{Fig/putoncurve.tex} + +なお\\ + \verb|fx(t):=2*cos(t)^3;|\\ +で関数を定義すると Scilab に関数定義情報が渡されないので\\ + \verb|Deffun("fx(t)", ["local(x)","x=2*cos(t)^3","x"]);|\\ +で f(x) を定義する必要がある。 + \\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{reflextdata}{} +\item[関数] Reflectdata(name , プロットデータ , 対称点または対称軸,options) +\item[機能] プロットデータの鏡映を作成 +\item[説明] プロットデータを指定された点または軸に関して対称移動する。\\ + 対称点は座標または,点の識別名。ただし,対称点を座標で示すときは要素がひとつのリストにする。\\ + 対称軸はリスト[ 点1, 点2 ] で指定\\ + optionsは線種\\ +\\ +例:中心A , 半径ABの円を描き,そのプロットデータを用いて,\\ + 点Cに関して対称な円を\\ + 点(-1,2)に関して対称な円を太い実線で\\ + 直線DEに関して対称な円を破線で\\ + それぞれ描く。\\ + 作成されるプロットデータの名称を rf1 ,rf2 ,rf3 とする。 +\begin{verbatim} + Circledata([A,B]);\\ + Reflectdata("1","crAB",[C]);\\ + Reflectdata("2","crAB",[[-1,2]],["dr,2"]);\\ + Reflectdata("3","crAB",[D,E],["da"]);\\ +\end{verbatim} + \\ + \input{Fig/reflectdata} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{rotatedata}{} +\item[関数] Rotatedata(name , プロットデータ ,角度 , [中心 , options]) +\item[機能] プロットデータの位置を回転する +\item[説明] 図形を,中心で示された点の周りに回転する。角度は弧度法で与える\\ + 中心とoptionsはまとめてリストで与える。optionsは線種\\ + +\begin{spacing}{1.5} +例:中心A , 半径ABの円のプロットデータを描き,\\ + 点Cを中心に$\dfrac{\pi}{2} $だけ回転した円\\ + 点(1,5)を中心に$\dfrac{\pi}{3}$ だけ回転し,線を太くした円\\ + 点Dを中心に $-\dfrac{\pi}{3} $だけ回転し,破線にした円\\ + をそれぞれ描く。\\ + 作成されるプロットデータの名称を rt1 ,rt2 ,rt3 とする。 +\end{spacing} +\begin{verbatim} + Circledata([A,B]);\\ + Rotatedata("1","crAB",pi/2,[C]);\\ + Rotatedata("2","crAB",pi/3,[[1,5],"dr,2"]);\\ + Rotatedata("3","crAB",-pi/3,[D,"da"]);\\ +\end{verbatim} + \\ + \input{Fig/rotatedata} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{scaledata}{} +\item[関数] Scaledata(name , プロットデータ,x方向比率 , y方向比率 , [中心 , options]) +\item[機能] 図形の位置を拡大・縮小する +\item[説明] 図形の位置をプロットデータを用いて指定された比率で拡大・縮小する\\ + 中心とoptionsはまとめてリストで与える。optionsは線種\\ + +例:中心A,半径ABの円を描いておく。プロットデータ名は crABとなる。\\ + この円を\\ + 原点中心に$x$軸方向に3,$y$軸方向に2だけ平行移動する。\\ + Cを中心に$x$軸方向に3,$y$軸方向に2だけ平行移動し,実線で太く描く。\\ + 原点中心にベクトル$\overrightarrow{OD} $だけ平行移動し,破線で描く。 +\begin{verbatim} + Circledata([A,B]); + Scaledata("1","crAB",3,2,[[0,0]]); + Scaledata("2","crAB",3,2,[C,"dr,2"]); + Scaledata("3","crAB",D.x,D.y,[[0,0],"da"]); +\end{verbatim} + \input{Fig/scaledata}\\ + \\ +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\hypertarget{shade}{} +\item[関数] Shade(プロットデータのリスト , optionss) +\item[機能] 閉曲線で囲まれた領域を塗りつぶす。 +\item[説明] 第1引数には,閉曲線を与える曲線分のリストを並べる。\\ + optionssは,Cinderellaの画面上での描画色,濃さをリストで与える。\\ + +例:$y=2\sin x$のグラフと直線$y=1$(直線ABの一部)とで囲まれた部分に0.5の濃さで色を塗る。 +\begin{verbatim} + Setax([7,"nw"]); + Plotdata("1","2*sin(x)","x",["Num=100"]); + Plotdata("2","2*sin(x)","x=[5*pi/6,13*pi/6]",["Num=100"]); + Lineplot("1",[[0,1],[1,1]]); + Listplot("1",[[5*pi/6,1],[13*pi/6,1]]); + Shade(["gr2","sg1"],[0.5]); +\end{verbatim} +\begin{center} +\input{Fig/shade} +\end{center} + +例:2つの放物線で囲まれた部分に0.2の濃さで色を塗る。Cinderellaの画面では赤で少し薄く塗る。 +\begin{verbatim} + Plotdata("1","x^2-1","x=[-sqrt(2),sqrt(2)]",["Num=100"]); + Plotdata("2","x^2/2","x=[-sqrt(2),sqrt(2)]",["Num=100"]); + Shade(["gr2","gr1"],[0.2,"color->[1,0,0]","alpha->0.4"]); +\end{verbatim} +\begin{center} +\input{Fig/shade01} +\end{center} + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{translatedata}{} +\item[関数] Translatedata(name , プロットデータ , 移動ベクトル , options) +\item[機能] プロットデータを平行移動する +\item[説明] プロットデータを移動ベクトルで示された分だけ平行移動する。\\ + nameはこれによってつくるプロットデータの名称を設定。単なる番号は不可。\\ + optionsは線種\\ +\\ +例:中心A,半径ABの円を描いておく。プロットデータ名は crABとなる。\\ + この円を\\ + x軸方向に2,y軸方向に3だけ平行移動する。\\ + ベクトル$\overrightarrow{OC} $だけ平行移動し,実線で太く描く。\\ + ベクトル$\overrightarrow{OD} $だけ平行移動し,破線で描く。\\ + 作成されるプロットデータの名称を tr1 , tr2 , tr3 とする。 +\begin{verbatim} + Circledata([A,B]); + Translatedata("tr1","crAB",[2,3]); + Translatedata("tr2","crAB",C,["dr,2"]); + Translatedata("tr3","crAB",D,["da"]); +\end{verbatim} + \\ + \input{Fig/translatedata} + +\end{description} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +% =============================== +\subsection{微積分など} + +\begin{description} + +\hypertarget{derivative}{} +\item[関数] Derivative(関数式 , 変数 , 値) +\item[機能] 関数の微分係数を求める +\item[説明] 関数式で与えられた関数の,「変数=値」における微分係数を求める。\\ +値は,点の座標を用いることができる。点Aのx座標であれば, A.x とする。\\ + +例:3次曲線上の点Aで接線を引く。点A,Bは作図ツールでとっておく。 +\begin{verbatim} + Deffun("f(x)",["regional(y)","y=x^3-4*x","y"]); + coef=Derivative("f(x)","x",A.x); + A.y=f(A.x); + B.y=coef*(B.x-A.x)+A.y; + Plotdata("1","f(x)","x",["Num=200"]); + Lineplot([A,B]); + Letter([A,"ne","A"]); +\end{verbatim} + \\ + \input{Fig/derivative}\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{integrate}{} +\item[関数] integrate(関数式 , 変数 , 範囲 , options) +\item[関数] integrate(PD , 範囲 , options) +\item[機能] 関数式またはプロットデータで与えられた曲線の積分値を求める +\item[説明] 関数式またはプロットデータで与えられた曲線の,指定された範囲の定積分の値を求める。\\ +関数を与えたときのoptionsは次の通り。\\ + "Rule=s" : シンプソン法による。デフォルトは台形公式。\\ + "R=s"と略記できる。\\ + "Num=数値" : 分割数の指定。初期値は 100 \\ + 一般にはシンプソン法の方が精度がよいが,そうではない場合もある。\\ + \\ +例:$f(x)=x^3-2x^2+2$ について,0から3までの定積分の値を求める。\\ + CindyScriptでは,guess()関数を用いると,可能な場合は値を分数表記にする。 +\begin{verbatim} + f(x):=x^3-2*x^2+2; + println(guess(Integrate("f(x)","x",[0,3],["Num=200"]))); + println(guess(Integrate("f(x)","x",[0,3],["Num=5","Rule=s"]))); +\end{verbatim} +を実行すると,コンソールに結果が表示される。シンプソン法では 33/4 と表示される。 +整関数の場合,シンプソン法では分割数がかなり少なくても高い精度が得られる。\\ +整関数でない場合,分割数を区間幅の10の整数倍にするとよい精度になる。\\ +たとえば,$f(x)=\sqrt{x} $の場合,区間が [2,9] であれば,Num=100 よりも Num=70 の方が精度がよい。\\ + \\ + プロットデータを与えたときは,アルゴリズムが異なるので上記オプションは無効。\\ +例:上の例と同じ関数をプロットデータで指定する。 +\begin{verbatim} + plotdata("1","x^3-2*x^2+2","x"); + println(Integrate("gr1",[0,3])); +\end{verbatim} + \\ + プロットデータで与える方法は,Rを利用して正規分布曲線を描いたときなどに記述が楽になる。\hyperlink{plotdatar}{PlotdataR()} の項を参照のこと。\\ + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{invesefun}{} +\item[関数] Inversefun(関数 , 範囲 , 値) +\item[機能] 関数の逆関数値を求める +\item[説明] 関数は文字列で,関数式もしくは定義された関数名とする。\\ + 指定された範囲の中で逆関数値を求める。存在しない場合は一方の端点を戻り値とし,コンソールに「not found」と表示される。\\ + 数式処理ではなく数値探索のアルゴリズムを使っているので,単調関数でない場合は範囲をできるだけ狭くとるとよい。値が複数ある場合は,小さいほうが返される。\\ + +例:\verb|x=Inversefun("sin(x)","x=[0,pi/2]",0.5);|\\ + 実行すると $x=\dfrac{\pi}{6}$ となる。 +\begin{verbatim} + Deffun("f(x)", ["regional(y)","y=sin(x)","y"]); + x=Inversefun("f(x)","x=[0,pi/2]",0.5); +\end{verbatim} + でも同じ結果が返される。\\ + \verb|x=Inversefun("f(x)","x=[pi/3,pi]",0.97);|\\ + は区間設定が不適切で正しい結果が得られない。\\ + \\ +例:アステロイド上に点Pをとり,Pの$x$座標から,逆関数値$t$を求めて接線を引く。\\ + できた点Pはドラッグしてアステロイド上を動かすことができる。 +\begin{verbatim} + Deffun("fx(t)", ["regional(x)","x=2*cos(t)^3","x"]); + Deffun("fy(t)", ["regional(y)","y=2*sin(t)^3","y"]); + Paramplot("1","[fx(t),fy(t)]","t=[0,2*pi]"); + PutonCurve("P",gp1,1); + if(P.y>=0,range="t=[0,pi]",range="t=[pi,2*pi]"); + t0=Inversefun("fx(t)",range,P.x); + dx=Derivative("fx(t)","t",t0); dy=Derivative("fy(t)","t",t0); + Putpoint("Q",[0,0],P.xy+[dx,dy]); + Lineplot([P,Q]); + Drawpoint(P); + Letter(P,"ne","P"); +\end{verbatim} + \input{Fig/inversefun} + +\end{description} +\newpage +%=================================== +\subsection{作表} + +\begin{description} + +\hypertarget{tabledata}{} +\item[関数] Tabledata(name , 縦横データ, 除外線 , options) +\item[機能] 表の枠を作成し,表のデータlist を返す +\item[説明] Cinderellaの描画面上に左下を原点とする表を作成する。\\ + 他の関数との引数の整合性,\ketpic のコマンドとの整合性などから,先頭にnameの引数をつけるが,実際にはあまり利用しないので,空文字""でもよい。\\ + optionsは線種と"notex"など。\\ + 縦横データには,次の2通りの書式がある。\\ + \\ +(1) 横のセル数 , 縦のセル数 , 表の横幅 , 表の縦幅 を指定する。\\ + 例: \verb|Tabledata("",4,5,80,50,[]);|\\ +(2) 横と縦の幅を指定したリストを使う\\ + 例: \verb|Yoko=[20,20,20,20];|\\ + \verb|Tate=[10,10,10,10,10];|\\ + \verb|Tabledata("",Yoko,Tate,[]);|\\ + 上の2つのスクリプトは同じ表を作成する。幅はCinderellaの描画面の0.1を単位とする。\\ + 作成された表には,行,列の制御点がつく。画面上では,横罫線の番号 r0,r1,・・・ 縦罫線の番号 c1,c2,・・・と見ることもできる。また,縦幅,横幅が数字で示される。ただし,これらは\TeX には出力されない。\\ + また,作表はCinderellaの描画面上では座標平面上に置かれるが,\TeX への出力は座標平面上には置かないことが多いので,座標軸は非表示としている。\\ + +\includegraphics[bb=0 0 807 499 , width=6cm]{Fig/table01.png} → +\input{Fig/table02}\\ + + 表のサイズ,行幅,列幅は,作成後にそれぞれの制御点をドラッグすることにより任意に変えることができる。\\ + + 除外線は,除外するセルの罫線を,rとc で位置指定する。\\ + 横罫線の場合,横罫線の番号,範囲(から,まで)\\ + 縦罫線の場合,縦罫線の番号,範囲(から,まで)\\ +とする。\\ + + 例:\verb|Rmv=["r1c0c1","c3r0r1","c3r3r5","r4c2c4"];|\\ + \verb|Tabledata("",4,5,80,50,Rmv);|\\ + で,次の表ができる。\\ + \\ + \includegraphics[bb=0 0 784 503 , width=6cm]{Fig/table03.png}\\ + 除外する罫線がない場合は,空リストとする。\\ + + 例:\verb|Tabledata("",Yoko,Tate,[]);|\\ +\\ + Tabledata()関数は,制御点r0,r1,・・・,c0,c1,・・・ がなければ新しく作り,すでに存在する場合はそのままとする。したがって,一度表を作成したのち,行数・列数を修正して作り直す場合は,一度既存の点を消去する必要がある。そのためには,「すべての点を選択する」ツールをクリックして点を消去するのがよい。クリックすると,消去後すぐに新規作成される。\\ + すでに他の点を描画してしまった場合は,表示メニューの「式による表示」で一覧表を出して,制御点を選択して消去する。\\ + ただし,行数,列数が多すぎた場合は,必ずしも作り直す必要はない。Settable() 関数により,実際に書き出す表の範囲を指定できるからである。\\ + + なお,表を作成したときは,表の範囲が出力範囲として優先される(Tabledata()を実行したとき)ので,表外に図を描いた場合は,最後にこの関数で出力範囲を指定して書き出す。\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{tabledatalight}{} +\item[関数] Tabledatalight(name , 縦横データ, 除外線 , options) +\item[機能] 幾何点を持たない表の枠を作成し,表のデータlist を返す +\item[説明] Tabledata()がCinderellaの幾何点を生成するのに対し,こちらは幾何点を生成しない。\\ + 幾何点を作成しないメリットは,スクリプトだけで縦横幅を変更できること。デメリットはインタラクティブな微調整ができないこと。\\ + optionとして,ラベルのスキップ値(スキップするところは表示されない)を指定することができる。ただし,ラベルはCinderellaの画面上だけの問題。\\ + \\ + 例: \verb|Yoko=[20,20,20,20];|\\ + \verb|Tate=[10,10,10,10,10];|\\ + \verb|Tabledatalight("",Yoko,Tate,[],[2]);|\\ + とすると,r1,r3,c1,c2 が非表示となる。\\ + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{tableseg}{} +\item[関数] Tableseg( 罫線リスト, 線種) +\item[機能] 罫線の線種を指定する +\item[説明] 罫線リストを与えて線種を指定する\\ + 罫線リストは,["r1c0c1","r4c2c4"] のように与える。\\ + 破線・点線にする場合は,Tabledata()であらかじめ除外しておく。\\ + + 例: \verb|Rmv=["r1c0c1","c3r0r1","c3r3r5","r4c2c4"];|\\ + \verb|Tabledata("",4,5,80,50,Rmv);|\\ + \verb|Tableseg(["r1c0c1","r4c2c4"],["da"]);|\\ + + \input{Fig/tableseg}\\ + + 注)R0,C0,・・は実際には表示されない\\ + \\ +\hypertarget{changetablestyle}{} +\item[関数] ChangeTablestyle(罫線リスト, 変更オプション) +\item[機能] Table の罫線の描画オプションを変更 +\item[説明] 罫線を部分的に指定して描画オプションを変更できる。\\ + \\ +例:\verb|ChangeTablestyle(["r0c0c3"],["da"]);| + \\ + \\ +\hypertarget{findcell}{} +\item[関数] Findcell(列番号, 行番号) +\item[機能] セルの情報list(中心,横幅/2,縦幅/2)を返す +\item[説明] 列番号,行番号は左上のセルを1列1行として数える。 \\ + +例:\verb|Tabledata(4,5,80,50,[]);|\\ + \verb|println(Findcell(tb,2,1));|\\ + とすると,2列1行のセルの中心の座標と横幅の半分,縦幅の半分の値がリストとしてコンソールに表示される。結果は [[3,4.5],1,0.5]\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{putcell}{} +\item[関数] Putcell (列番号, 行番号, 位置, 文字データ) +\item[機能] セルに文字列を入れる +\item[説明] 複数のセルにまたぐ位置指定の場合,列番号,行番号は,セル左上と右下の制御点の名称で指定する。\\ + 位置は c, r, l, t, b (中央center , 右right , 左left , 上top , 下bottom )\\ + 位置の例を以下に示す。 +\begin{verbatim} + Tabledata("",5,2,100,40,["c1r1r2","c4r1r2"]); + Putcell(1,1,"c","A"); + Putcell(2,1,"r","B"); + Putcell(3,1,"l","C"); + Putcell(4,1,"t","D"); + Putcell(5,1,"b","E"); + Putcell(c0r1,c2r2,"c","F"); + Putcell(c2r1,c3r2,"lb","G"); + Putcell(c3r1,c5r2,"rt","H"); +\end{verbatim} + \\ + \input{Fig/putcell}\\ + ※R0,C0,・・は実際には表示されない\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{putcol}{} +\item[関数] PutcoL (列番号, 文字位置,文字列リスト) +\item[機能] 1列に順に文字を書き入れる +\item[説明] 列番号で指定した列に,第1行から順に文字列リストの文字を書き入れる\\ + 数の場合はダブルクウォートでくくらなくてもよい。\\ + セルを飛ばす場合は,ヌル文字列 "" を書く。\\ + + +\hypertarget{putcolexpr}{} +\item[関数] PutcoLexpr (列番号, 文字位置,文字列リスト) +\item[機能] 1列に順に文字を書き入れる +\item[説明] 文字列に\TeX 書式を使うことができる\\ + +\hypertarget{putrow}{} +\item[関数] Putrow (行番号, 文字位置,文字列リスト) +\item[機能] 1行に順に文字を書き入れる +\item[説明] 行番号で指定した行に,第1列から順に文字列リストの文字を書き入れる。\\ + + +\hypertarget{putrowexpr}{} +\item[関数] Putrowexpr (行番号, 文字位置,文字列リスト) +\item[機能] 1行に順に文字を書き入れる +\item[説明] 文字列に\TeX 書式を使うことができる\\ + +文字を入れる例を示す。 +\begin{verbatim} + Tabledata("",5,3,100,45,["c1r1r2","r1c2c3","r2c2c3"]); + PutcoL(3,"c",["A","B","C"]); + PutcoLexpr(4,"l",["x^2","y=\sqrt{x^3}"]); + Putrow(1,"c",[1,"二"]); + Putrowexpr(3,"c",["","\frac{\pi}{2}","","","\sum{x^2}"]); +\end{verbatim} + + \input{Fig/putcol}\\ + + ※ R0,C0,・・は実際には表示されない\\ + また,この例では,C4列の罫線を,制御点C4をドラッグすることにより\\ + 右にずらしている。\\ +\\ + +グラフや文を入れた表の作成例\\ + + PutcoLexpr(),Putrowexpr() では,数式だけでなく,一般の\TeX の文を入れることができる。\\ + また,グラフの位置を適当に合わせて描画することにより,表のセルの中にグラフを入れることができる。\\ + + 例:2次関数のグラフと2次方程式の判別式の関係\\ + セルの中にグラフを描く例。実際には,セルの位置にグラフを描いているだけ。 +\begin{verbatim} + Tabledata("",3,3,120,90,["r1c0c3","r2c0c3"],["dr,2"]); + Tableseg(["r1c0c3"],["dr"]); + Tableseg(["r2c0c3"],["da"]); + Plotdata("1","(x-2)^2+1.5","x=[0.5,3.5]"); + Plotdata("2","(x-6)^2+2","x=[4.5,7.5]"); + Plotdata("3","(x-10)^2+2.5","x=[8.5,11.5]"); + Listplot([A,B]); + Listplot([C,D]); + Listplot([E,F]); + Putrowexpr(1,"c",["D>0","D=0","D<0"]); + Putrow(2,"c",["2点で交わる","接する","共有点なし"]); + Letter(G,"c","判別式と$x$軸の交点"); +\end{verbatim} + \\ + \input{Fig/tablesample1}\\ +\\ +注意:この例を実行するとわかるが,セルのサイズと文字サイズの関係などにより,Cinderellaの画面上と\TeX への書き出しは必ずしも同一にはならない。\\ + +\newpage + 例:増減表とグラフ\\ + + 関数の増減表とグラフを1つの表の中に入れた例。 +\begin{verbatim} + Tate=[6,6,10,6,10,6,40]; + Yoko=[30,6,6,6]; + Rmv=["c1r0r1","c2r0r1","c3r0r1","c4r0r1","c5r0r1", "r1c6c7","r2c6c7","r3c6c7"]; + Tabledata("",Tate,Yoko,Rmv,["dr"]); + Tlistplot("23d",["c1r2","c2r3"]); + Tlistplot("23u",["c1r3","c2r2"]); + Putrowexpr(2,"c",["x",0,"\cdots","\tfrac{1}{4}","\cdots",4]); + Putrowexpr(3,"c",["y`","","-",0,"+"]); + Putrowexpr(4,"c",["y",0,"\searrow","-\tfrac{1}{4}","\nearrow",2]); + Putcell(1,1,"l2t2","{\small\begin{minipage}{44mm}$y=x-\sqrt{x}$\\$y`= + \dfrac{2\sqrt{x}-1}{2\sqrt{x}}=0$|より\vspace{1mm}\\\hspace*{2zw}$x= + \dfrac{1}{4}$\vspace{1mm}\\増減表は次のようになる\end{minipage}}" ); + Plotdata("1","x-sqrt(x)","x=[0,3]",["do","notex"]); + Listplot("2",[[0,0],[3,0]],["do","notex"]); + Listplot("3",[[0,-0.5],[0,3]],["do","notex"]); + Translatedata("1","gr1",[4.9,1],["dr"]); + Translatedata("2","sg2",[4.9,1],["dr"]); + Translatedata("3","sg3",[4.9,1],["dr"]); + Letter(Ptend(tr2),"e1","\small{$x$}"); + Letter(Ptend(tr3),"n1","\small{$y$}"); + Letter(Ptstart(tr2),"w1","\small O"); + Expr(Ptend(tr1),"nw-2","y=x-\sqrt{x}"); +\end{verbatim} + \input{Fig/tablesample2} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{settable}{} +\item[関数] Settable((左上) , 右下) +\item[機能] 表データを書き出す +\item[説明] 指定された範囲で表の枠線を書き出す。指定しなければ全体が書き出される。\\ + 表の出力範囲は,NE,SWによる描画範囲にかからわず,全体もしくはSettable()で指定した範囲となる。\\ + 位置は,制御点による位置表示で,c2r3 のように指定する。\\ + c,rは小文字で c,r の順。\\ + 左上を省略すると,デフォルトの c0r0 と解釈される。\\ + +例:\verb|Tabledata("",4,5,80,50,[]);|\\ + \verb|repeat(5,s, Putrow(s,"c",[s*4-3,s*4-2,s*4-1,s*4]));|\\ + \verb|Settable(c4r5);|\\ + + 2行目で各セルに数字を入れている。\\ + 左上と右下(罫線C4とR5の交点)を対角とする範囲,すなわち全体を書き出す。\\ + \verb|Settable(c3r4);|\\ + とすると,左上と右下(罫線C3とR4の交点)を対角とする範囲。\\ + 出力するのは罫線だけなので,セルの中身はそのまま表示される。(下図左)\\ + \verb|Settable(c1r1,c3r4);|\\ + とすると,左上(罫線C1とR1の交点)と右下(罫線C3とR4の交点)を対角とする範囲。\\ + 罫線だけなので,セルの中身はそのまま表示される。(下図右)\\ +\\ + \input{Fig/settable1} \input{Fig/settable2}\\ + \\ + \\ +\hypertarget{tgrid}{} +\item[関数] Tgrid(セルラベル) +\item[機能] 表のセルの座標を返す +\item[説明] 指定されたセルの左上の座標を返す。実際には,セルラベルは罫線を示しているので,指定した罫線の交点(格子点)ということもできる。\\ + \\ +\hypertarget{tlistplot}{} +\item[関数] Tlistplot(セルラベル1,セルラベル2) +\item[機能] 指定された2つの格子点を線分で結ぶ +\item[説明] セルに斜線を引くのに用いる。\\ + 例:\verb|Tlistplot(["c0r1","c1r2"]);| + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +\newpage + +%=================================== +\subsection{値の取得と入出力} + + 計算値やプロットデータの値を取得したり,Scilab用とのデータのやりとりをする。\\ +\begin{description} + +\hypertarget{crossprod}{} +\item[関数] Crossprod(リスト,リスト) +\item[機能] 2つのベクトルの外積を求める。 +\item[説明] Cindyscriptの組み込み関数 cross(リスト,リスト)と同じ。\\ + 例:\verb|Crossprod([1,0,0],[1,1,1]);|\\ + 結果は [0,-1,1]\\ + +\hypertarget{dotprod}{} +\item[関数] Dotprod(リスト,リスト) +\item[機能] 2つのベクトルの内積を求める。 +\item[説明] Cindyscriptでは,積の演算で内積が求められる。\\ + 例:\verb|Dotprod([1,2,3],[1,-1,1]);|\\ + 結果は 2\\ + [1,2,3]*[1,-1,1] でも同じ結果を得る。\\ + +\hypertarget{findarea}{} +\item[関数] Findarea(プロットデータ) +\item[機能] プロットデータで囲まれる部分の面積を求める。 +\item[説明] 閉曲線をなすプロットデータで囲まれる部分の面積を求める。\\ +例:ベジェ曲線で囲まれた部分の面積を求めて表示する。\\ + \verb|Bezier("1",[A,B,C],[[D],[E,F]]);|\\ + \verb|drawtext([2,1],Findarea("bz1"));|\\ + +\hypertarget{findlength}{} +\item[関数] Findlength(プロットデータ) +\item[機能] プロットデータの曲線の長さを求める。 +\item[説明] プロットデータが描く曲線の長さを求める。\\ +例:ベジェ曲線で描いた曲線の長さを求めて表示する。\\ + \verb|Bezier("1",[A,B,C],[[D],[E,F]]);|\\ + \verb|drawtext([2,1],Findlength("bz1"));|\\ + + +\hypertarget{intersectcrvs}{} +\item[関数] Intersectcrvs(プロットデータ1, プロットデータ2, optionss) +\item[機能] 2曲線の交点リストを取得する。 +\item[説明] オプションは共有点があるかどうかを判断するための限界値\\ +ただし,オプションは通常は使わないので気にしなくてよい。\\ + \\ +例:円と曲線の交点をP,Qとする。 +\begin{verbatim} + Plotdata("1", "sin(x)", "x", ["Num=100"]); + Circledata([A, B]); + tmp=Intersectcrvs(gr1, crAB); + P.xy=tmp_1; + Q.xy=tmp_2; + \end{verbatim} + + リスト内に2交点のデータが tmp=[ [ $-0.37$, $-0.36$ ], [ 2.13, 0.85 ] ] のように入っている。交点の順序は PD1, PD2 の順序と曲線の向きによって決まる。曲線の向きは,$y=f(x)$のグラフではx座標が増加する向きで,パラメーター表示曲線ではパラメータの増加する向き。また,PD1 上から探し始めて PD2 との交点を拾ってゆく。\\ + 交点がひとつの場合も tmp=[ [ 2.45, 0.63 ] ] と2重のリストに入っているので,点として取出すには P=tmp\verb|_|1; とする。\\ +\begin{center} +\input{Fig/Intersectcrvs1}\\ +\end{center} + +\hypertarget{invert}{} +\item[関数] Invert(PD) +\item[機能] プロットデータの点を逆順にする(reverseと同じ) +\\ + +\hypertarget{meetcurve}{} +\item[関数] MeetCurve(曲線,x0, y0) +\item[機能] 曲線上の点を返す。 +\item[説明] x座標がx0で,点(x0, y0)に近い曲線上の点を返す。\\ +注)x0, y0 は文字列でもよい。\\ + +\hypertarget{lcrd}{} +\item[関数] Lcrd() +\item[機能] 幾何点,リスト点の論理座標を取得する。 +\\ + +\hypertarget{pcrd}{} +\item[関数] Pcrd() +\item[機能] 幾何点,リスト点の物理(表示)座標を取得する。 +\\ + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{nearestpt}{} +\item[関数] Nearestpt(PD1,PD2) +\item[機能] 2曲線に対し,最も近い点とそのパラメータ,距離のリストを返す +\item[説明] 戻り値は,それぞれの曲線上の点の座標とプロットデータ中の位置,その距離からなるリスト。\\ +例:2つの放物線上の点の最短距離とその位置を求める。点A,Bを作図ツールでとっておく。 +\begin{verbatim} + Plotdata("1", "x^2+2", "x=[-2,2]"); + Plotdata("2", "-(x-2)^2","x=[0,3]"); + plist=Nearestpt("gr2","gr1"); + B.xy=plist_1; + A.xy=plist_3; + Listplot([A,B],["do"]); + Ptsize(4); + Drwpt([A,B]); + Letter([A,"nw","A",B,"n2e","B",(A+B)/2,"e",text(plist_5)]); +\end{verbatim} + \input{Fig/Nearestpt}\\ +\\ +ここで plistに代入されたリストは次の形である。5番目の要素が2点間の距離,すなわち最短距離。\\ + [[1.68,-0.1],29,[0.32,2.1],30,2.59] \\ + \\ +\hypertarget{nearestptcrv}{} +\item[関数] Nearestptcrv(座標, プロットデータ) +\item[機能] 第1引数の座標に最も近い曲線プロットデータ上の点座標を返す +\item[説明] 次に例示する。中心A,半径ABの円と点C,DはCinderellaで作図しておく。 +\begin{verbatim} + Circledata([A, B]); + Plotdata("1", "x^2", "x"); + pCr=Nearestptcrv(C.xy, "crAB") + pC1=Nearestptcrv(C.xy, "gr1") + pDr=Nearestptcrv(D.xy, "crAB"); + pD1=Nearestptcrv(D.xy, "gr1"); +\end{verbatim} +ぞれぞれ,点C,点D から最も近い曲線上の点を表す。\\ + \\ + \input{Fig/Nearestpt1}\\ + + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{numptcrv}{} +\item[関数] Numptcrv (プロットデータ) +\item[機能] 曲線の節点の個数を返す +\item[説明] Cindyscript の length(PD)と同じ\\ + +例: 曲線上のいくつかの点で分割し破線で図示する。\\ +区間$[-1, 2]$に対する2次関数のグラフを描く\\ + \verb|Deffun("f(x)",["regional(y)","y=-x^2+4","y"]);|\\ + \verb|Plotdata("1","f(x)","x=[-1,2]",["Num=200"]);|\\ +曲線の端点を結ぶ直線を描く\\ + \verb|Lineplot("3",[Ptstart(gr1),Ptend(gr1)],["do"]);|\\ +節点の4分の1で曲線を分割して破線を描く\\ + \verb|Lineplot("4",[Ptstart(gr1),Ptcrv(0.25*Numptcrv(gr1),gr1)],["da"]); |\\ +節点の2等分で曲線を分割して破線を描く\\ + \verb|Lineplot("5",[Ptstart(gr1),Ptcrv(0.5*Numptcrv(gr1),gr1)],["da"]); |\\ +節点の4分の3で曲線を分割して破線を描く\\ + \verb|Lineplot("6",[Ptstart(gr1),Ptcrv(0.75*Numptcrv(gr1),gr1)],["da"]);| \\ +曲線上の点Aの接線を引く。 +\begin{verbatim} + coef=Derivative("f(x)","x",G.x); + Defvar("DC=coef"); + Deffun("g(x)",["regional(y)","y=DC*(x-G.x)+G.y","y"]); + Plotdata("2","g(x)","x",["dr,2"]); +\end{verbatim} + \\ +\input{Fig/numptcrv}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{paramoncrv}{} +\item[関数] Paramoncrv(点の座標, 曲線の名前) +\item[機能] 曲線上の点のパラメータ値を返す。 +\item[説明] 曲線は折れ線として描かれるが,曲線上の各点はこの折れ線の節点を基準としたパラメータ値を持つ。パラメータ値は整数部分が節点の番号,小数部分が節間の位置を表す。\\ + +例:図のような点PからQに至る円周上の5等分点を節点とする折れ線sg1において, +$n$番目の線分上の点は$n\leqq t\leqq n+1$の範囲のパラメータ値を持つ。\\ +図の点$\mathrm{A}$は2番目の線分上にあり,パラメータ値は2.45である。この値は\\ + \verb|Paramoncrv(A.xy,"sg1");|\\ +によって得られる。\\ + \\ + \input{Fig/paramoncrv}\\ + +\hypertarget{pointcrv}{} +\item[関数] Pointoncrv(点のパラメータ値, PD) +\item[機能] 曲線上のパラメータ値を持つ点の座標を返す。 +\item[説明] 曲線(折れ線)上の節点を基準としたパラメータ値により点の位置が定まる。\\ + +例:図のような点$\mathrm{P}$から$\mathrm{Q}$に至る半円周上の5等分点を節点とする折れ線sg1において,パラメータ値$4.5$を持つ点$\mathrm{A}$は4番目の線分の中点である。したがって\\ + \verb|A.xy=Pointoncrv(4.5,"cr1");|\\ +によって,点Aを中点に置くことができる。\\ + \\ + \input{Fig/pointoncrv} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +\hypertarget{ptcrv}{} +\item[関数] Ptcrv(n,プロットデータ) +\item[機能] 曲線プロットデータのn 番目の節点を返す +\item[説明] Cindyscript の PD\_n と同じ\\ + +例:楕円上の点で分割する。あからじめ必要な点を作図しておく。 +\begin{verbatim} + Circledata([O,P],["do","Num=100","notex"]); + Scaledata("1","crOP",4/3,1); + F.xy=[-sqrt(7),0]; + A=Ptcrv(9,sc1); + B=Ptcrv(16,sc1); + Listplot("1",[A,F,B],["da"]); + Partcrv("1",A,B,"sc1",["dr,3"]); + Shade(["part1","sg1"],0.1); + Arrowhead(B,"sc1",[1.5]); + Letter([A,"ne","A",B,"ne","B",F,"s2","F"]); +\end{verbatim} + \input{Fig/ptcrv} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{ptstart}{} +\item[関数] Ptstart(プロットデータ) , Ptend(プロットデータ) +\item[機能] プロットデータの最初の点,最後の点を取得する。 +\item[説明] プロットデータの最初の点,最後の点の座標を返す。\\ + \\ +例:定義域を限定したグラフの両端の点を取得し線分ABを引く。\\ +\begin{verbatim} + Deffun("f(x)",["regional(y)","y=x^2","y"]); + Plotdata("1","f(x)","x=[-1,2]",["dr"]); + Lineplot("2",[Ptstart(gr1),Ptend(gr1)]); +\end{verbatim} + \input{Fig/ptstart}\\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + \\ + +\hypertarget{readoutdata}{} +\item[関数] ReadOutData(ファイル名) +\item[機能] 外部データを読み込む +\item[説明] ScilabのWriteOutDataで作ったプロットデータ列のデータファイルを読み込む。\\ +引数を省略した場合は,Fheadで定義したファイル名のテキストファイルから読み込む。 +ファイル名にはコンマで区切ってパスを与えることができる。たとえば,\\ + \verb|ReadOutData("/datafolder","file.txt"); |\\ + \\ + \\ +\hypertarget{sprintf}{} +\item[関数] Sprintf(実数,長さ) +\item[機能] 小数点以下の長さを固定した文字列に変換 +\item[説明] 実数を,小数点n位までの数とした文字列に変換する\\ + \\ +例 Sprintf(pi,2) は 3.14 を返す\\ + Sprintf(pi,7) は 3.1415927 を返す\\ +注)pi は Cindyscriptの予約変数で,円周率を表す。 \\ + +\hypertarget{writetosci}{} +\item[関数] WritetoSci(引数) ,WritetoScibody(引数) +\item[機能] Scilab用のソースファイルに書き出す +\item[説明] ソースファイルへの書き出し方に3つのタイプがある\\ + +・引数なしの場合\\ + Fheadで定義したファイル名に拡張子 .sci を付加して全体を書き出す。\\ + 末尾にコメントアウトした quit() を付加する。\\ +・WritetoSciの引数に次の数を渡す \\ + \verb|WritetoSci(1)|: WritetoSci() と同じ\\ + \verb|WritetoSci(2)|: 全体を書き出し,末尾に quit() を付加する。\\ + \verb|WritetoSci(3)|: WritetoScibody() と同じ。body部分のみを書き出す。\\ +・ファイル名を引数とする\\ + 引数のファイル名で書き出す。ただし,拡張子 .sci をつける必要がある。\\ +・引数を "sh" とする\\ + WritetoSci(2) と同じ。\\ +・\verb|WritetoSci(filename,"sh")|\\ + 引数のファイル名でshell(bat)コマンド用のファイルを書き出す。\\ +・\verb|WritetoSci(数字 ,filename)| は不可(エラーとなる)\\ +\\ + +\hypertarget{makeshell}{} +\item[関数] Makeshell(ファイル名) / Makebat(ファイル名) +\item[機能] Macの場合はシェルファイル,Windowsの場合はバッチファイルを書き出す。 +\item[説明] 書き出されるファイルは次の通り。\\ +・書き出される場所とファイル名は, Shellparent / Batparent で指定したもの。\\ +・内容は,Shellchild / Batchild に,子プロセスの引数として Fhead と引数のファイル名を付加したもの。たとえば,Shellchild="sh ketcindy.sh" で,Fhead="fig" , 引数が "fig2tex" であれば +\begin{verbatim} + #!/bin/sh + cd /Users/Hoge/Desktop/KeTCindy + sh ketcindy.sh fig fig2tex + exit 0 +\end{verbatim} +が書き出される。2行目のディレクトリ(フォルダ)名は,Dirwork で指定したもの。\\ +ただし,上記の fig は fig.sci のことだが,fig.sci は出力されないので,別途 WritetoSci(2) で書き出す必要がある。\\ + \\ + +\hypertarget{textformat}{} +\item[関数] Textformat(数,桁数) +\item[機能] 小数点以下の桁数を指定して数を文字列化する。 +\item[説明] Cindyscriptの組み込み関数にも,format()という同様の関数があるが,こちらは,数のリストにも対応する。\\ + +例:円周率を小数点以下5位までで文字列化する。\\ + \\ + \verb|Textformat(pi,5);|\\ + \\ + 戻り値は,3.14159\\ + \\ +例:円周率と,ネピア数をリストにして,共に小数点以下5位までで文字列化したリストを返す。\\ + \\ + \verb|Textformat([pi,exp(1)],5);|\\ + \\ + 戻り値は,[3.14159,2.71828] \\ + \\ + +\hypertarget{viewtex}{} +\item[関数] Viewtex() +\item[機能] \TeX のソースファイルを書き出す。引数なし。 +\item[説明] グローバル変数Fheadで定義したファイル名に "main" を付加した\TeX のソースファイルとバッチファイル(Macの場合はシェルファイル)を作成する。\\ +Fhead のほか,ディレクトリ指定などのため,次のグローバル変数に必要事項が代入されていることが条件である。\\ + \\ + Dirwork=作業フォルダのパス\\ + Shellparent=親プロセス (kc.sh / kc.bat )を置くディレクトリのパス\\ + Shellchild=子プロセス名\\ + Libname=Scilabのライブラリ ketpicsciL5 へのパス\\ + \\ +たとえば,Fhead="fig" とすると\\ +・図を表示する fig.sci を Dirwork で指定したフォルダにを生成する。(すでにある場合は上書き)\\ +・Dirwork で指定したフォルダに figmain.tex を生成する。(すでにある場合は上書き)\\ + figmain.tex は \TeX のプリアンブルと \verb|begin{document}| を設定したソースファイルで,中には \verb|input{"fig.tex"}| が書かれており,これをコンパイルすれば作成した図を表示することができる。\\ +・親プロセスの生成(すでにある場合は上書き)\\ + ketcindy.sh (Mac) ketcindy.bat(Windows) を子プロセスとして figmain.tex と fig.tex を引数として実行するプロセス kc.sh(Mac) kc.bat (Windows) を作業ディレクトリに生成する。これを実行すると図を表示するPDFファイルが作られる。\\ + 以上の手続きにより,Viewtex() を実行すれば,デスクトップ上に生成された kc.sh / kc.bat を使って,fig.sci の生成から,fig.tex の作成,\TeX のコンパイルまでの一連の操作を自動実行して,図を表示することができることになる。kc.sh / kc.bat の実行は,kc() で行うことができる。\\ + \\ + + \hypertarget{workprocess}{} +\item[関数] Workprocess() +\item[機能] 作図の経過を取得する +\item[説明] 作図ツールを用いた作図の経過を取得する。\\ + \verb|println(Workproccess());|\\ + とすると,コンソールに作図手順が表示される。\\ + +\end{description} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage + +%=================================================== +\subsection{その他} +\begin{description} + +\hypertarget{assign}{} +\item[関数] Assign(文字列,文字,文字) +\item[機能] 文字列の中のある文字を他の文字で置き換える +\item[説明] 第1引数の文字列中の第2引数の文字を,第3引数の文字で置き換える。\\ + 第3引数が数値の場合,文字列に変換される。\\ + 第2引数と,第3引数をリストにして,複数の置き換えをすることができる。\\ + \\ + 例:a*x を1.3*x とした文字列を返す。次のいずれも同じ結果になる。 +\begin{verbatim} + Assign("x^2+a*x","a","1.3"); + Assign("x^2+a*x","a",1.3); +\end{verbatim} + \\ + 例:直線 $y=bx-b^2$ の係数$b$を変化させて描き,包絡線をうかびあがらせる。 +\begin{verbatim} + repeat(50,t, + cb=t/5-5; + Plotdata(text(t),Assign("b*x-b^2","b",cb),"x"); + ); +\end{verbatim} + \\ + \input{Fig/assign}\\ + \\ + 例:文字で表された $x$ と $y$ の係数をまとめて数値で置き換える。\\ + \verb|Assign("a*x^2+b*x",["a",1,"b",2]);|\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{bbdata}{} +\item[関数] BBdata(ファイル名,option) +\item[機能] 画像ファイルのサイズを求める +\item[説明] TeX文書において,inputgraphics コマンドで画像を貼り込むときのBBサイズを求める。\\ + TeX処理系の extractbb を用いて画像ファイルからBBデータを作り,テキストファイルとして作業ディレクトリに書き出す。これを読んで,コンソールに ingludegarphics のコマンドを書き出す。\\ + optionは,幅または高さの指定。\\ + "w=40mm" で width=40mm が,"h=40mm" で height=40mm が付加される。\\ + \\ +例:pic.pdf のサイズを求める。\\ + \verb|BBdata("pic.pdf")|\\ + を実行すると,コンソールに ingludegarphics のコマンド文\\ + \verb|\includegraphics[bb=・・・・]{pic.pdf} |\\ + が表示される。これをそのままコピーすればよい。\\ + なお,bbの値は整数値ではなく,高精細の値を小数点以下2桁に四捨五入して示される。\\ + 画像ファイルは,PDFに限らず,PNG,JPGなどでもよい。\\ + \\ +例:\verb|BBdata("fig.jpg",["h=40mm"]);|\\ + で\\ + \verb|\includegraphics[bb=0.00 0.00 578.16 592.56,height=40mm]{fig.jpg} |\\ + が表示される。\\ + \\ + +\hypertarget{changework}{} +\item[関数] Changework(パス名) +\item[機能] 作業ディレクトリを指定(変更)する +\item[説明] 作業ディレクトリは,InitializationスロットのKETlibページに Dirwork= で指定されているが,これを変更する。Drawスロットの,Ketinit() の前に記述することにより,Ketlibページの記述を変更しなくてすむ。\\ + これにより,作成したファイルを他の人とやり取りしやすくなる。\\ + +\hypertarget{com0th}{} +\item[関数] Com0th(文字列) +\item[機能] ScilabのOpenfileの前に置くコマンド(文字列)を定義する。 +\item[説明] 例:\verb|Com0th("Setax('a')");|\\ + Openfileの前の部分の先頭に書き出す。これにより, \ketcindy でサポートされていないScilab版\ketpic のコマンドを利用することができる。\\ + \\ +\hypertarget{com1st}{} +\item[関数] Com1st(文字列) +\item[機能] ScilabのOpenfileの前に置くコマンド(文字列)を定義する。 +\item[説明] 例:\verb|Com1st("Setax('a')");|\\ + これにより, \ketcindy でサポートされていないScilab版\ketpic のコマンドを利用することができる。 +\\ +\hypertarget{com2nd}{} +\item[関数] Com2nd(文字列) +\item[機能] ScilabのOpenfileのあとに置くコマンド(文字列)を定義する。 +\\ + +\hypertarget{com2ndpre}{} +\item[関数] Com2ndpre(文字列) +\item[機能] ScilabのOpenfileのあとに置くコマンド(文字列)を定義する。 + Openfileの直後(グループの先頭に)書き出す。\\ + +\hypertarget{figpdf}{} +\item[関数] Figpdf(option) +\item[機能] 出力枠サイズのPDFを作る。 +\item[説明] KeTCindyでは,通常,出力された fig.tex ファイルを閲覧するPDFをA4サイズで作成する。これに対し,Figpdf()を実行すると,出力サイズのPDFを作成する。閲覧用だけではなくワープロなどにに貼り込むときにそのまま使用できるので便利である。ただし,そのための親子プロセスを生成して実行するため,次の手続き(1)(2)が必要となる。\\ +(1) 変数 Texparent を設定する。\\ + これは,出力するPDFのファイル名の指定である。たとえば, +\begin{verbatim} + Fhead="fig"; + Texparent="pic"; +\end{verbatim} + とすると,fig.tex を表示した pic.pdf が作成される。pic.pdf が目的のPDF。\\ + Texparent は Fhead とは異なるものにする。\\ +(2) 出力は,「Parent」「Exekc」の順にボタンを押す。「Texview」は押さない。\\ + なお,これらのボタンを使わずにスクリプトで実行するか,オリジナルのボタンを作る場合は,次のコマンドを実行する。 +\begin{verbatim} + Writetosci(2); + Makeshell(); + kc(); +\end{verbatim} + Writetosci(2); と Makeshell(); で fig.sce とpic.tex が作成される。\\ + Windowsの場合は Makebat(); とする。\\ + \verb|kc();| により kc.sh が実行され,Scilabで fig.sceからfig.tex を作るところからPDF作成までの一連の作業が行われる。\\ + \\ +optionは,マージン(余白)と平行移動量。指定しない場合はデフォルト値。\\ +引数が1つの実数の場合は,左右上下同一の指定した余白となる。\\ +引数が4つの数をコンマで区切った文字列を要素とするリストの場合,左右上下の余白指定となる。\\ +引数が2つの数をコンマで区切った文字列を要素とするリストの場合,右,下方向への平行移動指定となる。\\ +余白指定と平行移動指定は同時に行うことができる。\\ +例: \verb|Figpdf(10);| 上下左右10mmの余白\\ + \verb|Figpdf(["5,5,10,10"]);| 左右に5mm,上下10mmの余白\\ + \verb|Figpdf(["5,10"]);| 右に5mm,下に10mm平行移動して表示\\ + \verb|Figpdf(["5,8,10,10","5,-5"]);| 左5mm,右8mm,上下10mmの余白,\\ + 右に5mm,上に5mm平行移動して表示\\ +なお,座標軸を表示する場合,右側は最低3mmの余白を設定しないと軸の文字が入らない。\\ + +\hypertarget{texcom}{} +\item[関数] Texcom(\TeX コード) +\item[機能] \TeX のコードを書き出す +\item[説明] 任意の\TeX のコードを書き出す\\ + ScilabのTeXcomにそのまま引き渡しているだけ。\\ + +\hypertarget{windispg}{} +\item[関数] Windispg() または Windisp(データのリスト) +\item[機能] 定義されているプロットデータをCinderella画面に黒線で描く +\item[説明] Windispg()は,スクリプトの最後に置くことで,出力される部分だけが黒で描かれるので,出力図を確認することができる。ただし,Letter()関数で表示した点の名称などがCinderellaで作図したラベルと重なって表示されて見にくくなることもある。この関数を実行しなくても出力には影響しない。\\ + Windisp(データのリスト)は,Scilabから \ketcindy 用に出力されたファイルを ReadOutData()関数で読み込んだときに,必要なプロットデータ列だけを表示するのに用いる。\\ + ReadOutData("filename.txt") でデータを読み込むと,そのデータに含まれるプロットデータ列が,コンソールに\\ +Outdata of filename.txt : [Gfn,Gdfn,Gh] \\ +のように表示される。\\ +このうち,GfnとGhだけを表示するのであれば\\ +Windispg([Gfn,Gh]);\\ + とする。引数なしで\\ +Windispg();\\ +とすればすべてのプロットデータ列が表示される。\\ +なお,いずれの場合も,作図したプロットデータも同時に表示される。\\ + 作図した図を全てではなく選択して表示する場合は,それらのプロットデータ名をリストにして引数とする。\\ + たとえば,sg1, gr1, crABが定義されているとき,\\ + \verb|Windispg(["sg1","gr1"]);| +とすれば,sg1,gr1のみが表示される。 + 次の3つの関数は,プロットデータの操作で,単独で用いることもできるが,描画関数,プロットデータの操作関数のオプションに組み込まれているので,特殊な場合を除いてはほとんど利用しないと思われる。\\ + +\hypertarget{drwline}{} +\item[関数] Drwline(プロットデータ) +\item[機能] プロットデータ(文字列)を実線で描く +\item[説明] ScilabのDrwlineを書き出す\\ + 例:\verb|Drwline("sABCA,1");|\\ +\\ + +\hypertarget{dashline}{} +\item[関数] Dashline(プロットデータ) +\item[機能] プロットデータ(文字列)を破線で描く +\item[説明] ScilabのDashlineを書き出す\\ + 例:\verb|Dashline("sABCA");|\\ +\\ +\hypertarget{dottedline}{} +\item[関数] Dottedline(プロットデータ) +\item[機能] プロットデータ(文字列)を点線で描く +\item[説明] ScilabのDottedlineを書き出す\\ + 例:\verb|Dottedline("sABCA");|\\ + +\hypertarget{helplist}{} +\item[関数] helplist() +\item[機能] ヘルプデータを作成する +\item[説明] 関数の簡単な説明データを作成する。\\ + この関数は,Initialization スロットに書く。\\ + \\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\hypertarget{help}{} +\item[関数] Help(文字列) +\item[機能] 関数の使用例を取得する +\item[説明] 文字列で始まる関数の使用例をコンソールに表示する。\\ + \verb|println(Help("C"));|\\ + のようにすると,コンソールに,次のように「C」で始まる関数の使用例が表示される。 +\begin{verbatim} + CRspline("1",[A,B,C,A]); + ChangeTablestyle(["r0c0c3"],["da"]);\ + Changestyle("sgAB",["da"]); + Changstyle("geoseg3","ax3d"],["notex"]);\ + Circledata([A,B,C]); + Circledata([A,B],["Rng=[0,pi/2]"]);\ + Com2nd("\color[cmyk]{0,0,0,0.5}");\ + Crossprod(vec1,vec2); \\ +\end{verbatim} + + さらに,\\ + \verb|println(Help("Ci"));| とすると +\begin{verbatim} + Circledata([A,B,C]); + Circledata([A,B],["Rng=[0,pi/2]"]); +\end{verbatim} + だけが表示される。\\ + \verb|println(Help("*"));| + とすると,すべての関数の使用例が表示される。\\ + 引数がない場合は,\verb|Helplist(Dirlib,["+","+3d"],"helpJ”);| とみなされる。+はketcindylibの意味。\\ +\\ + +\hypertarget{helpkey}{} +\item[関数] Helpkey(文字列) +\item[機能] 関数の使用例をキーワードで検索する +\item[説明] 文字列に与えたキーワードで関数の使用例を検索し,コンソールに表示する。\\ + 例:\verb|Helpkey("直線");| とすると,コンソールに次のように表示される。 +\begin{verbatim} + IntersectsgpL("",[p1,p2],[p3,p4,p5],"draw"); + IntersectsgpL("R","P-Q","A-B-C"); + IntersectsgpL("R","P-Q","A-B-C","put"); + 空間の直線と平面の交点 + Lineplot("1",[[2,1],[3,3]]); + Lineplot([A,B]); + 直線データを作成 + PtonLine("C",pA,pB); + 直線上に点をとる +\end{verbatim} + \\ +\hypertarget{indexall}{} +\item[関数] Indexall(str1,str2); +\item[機能] 文字列 str1 から str2 を検索しその位置をすべて返す +\item[説明] Cindyscriptの indexof() の拡張版。indexof() が最初に見つかった位置を返すのに対し,Indexall()は存在する位置をすべてリストにして返す。\\ + \\ +例:str="abcabcabc" から "b"を検索する。\\ + \verb|indexof(str,"b")| では,2 が返る。\\ + \verb|Indexall(str,"b")| では,[2,5,8]が返る。\\ + \\ + +\hypertarget{ketcindylogo}{} +\item[関数] Ketcindylogo() +\item[機能] \ketcindy のロゴを書き出す +\item[説明] \ketcindy のロゴを表示する\TeX のコマンド行を書き出す。\\ + 内容は\\ +\verb|\|def\verb|\|ketcindy\{\{K\verb|\|kern-.20em \verb|\|lower.5ex\verb|\|hbox\{E\}\verb|\|kern-.125em\{TCindy\}\}\}" + \\ +\hypertarget{op}{} +\item[関数] Op(n,list or str) +\item[機能] リストまたは文字列から要素を抜き出す +\item[説明] 第2引数のリストまたは文字列のn番目の要素(文字)を返す。\\ +Cindyscriptの アンダーバーの演算子 (list\_n , str\_n) と同様。Silabとの整合性のため追加\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage + +\end{description} +\newpage + +%第11節 他の数式処理ソフトとの連携 ============================= +\section{他の数式処理ソフトなどとの連携} +\subsection{Rとの連携} +Rは主に統計解析のためのソフトウェアで, binorm(二項分布),pois(ポアソン),unif(一様分布),chisq(カイ2乗),f(F分布),t(t分布)など,多くの確率分布をサポートしている。\\ +正規分布(normal distribution)では\\ + dnorm 確率密度関数\\ + pnorm 分布関数\\ + qnorm 分布関数の逆関数\\ + rnorm 乱数発生\\ +というように,分布名の頭にd, p, q, r をつけると上記4つの関数が得られる。\\ + 各分布には,自由度などの引数があり,たとえば,平均m, 標準偏差sの正規分布(の密度関数)は dnorm(x, m ,s ) となる。\\ + \\ + KeTCindyでは,kc.bat/shによってコマンドをRに渡し,結果をテキストファイルで受け取る。このとき,Rとのやりとりで,次のようなファイルが作業ディレクトリに作成される。\\ +拡張子 r :r用のファイル\\ +拡張子 dat,拡張子 txt:データファイル\\ +このデータのやり取りに関する次のオプションがある。\\ + オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ + このとき,ファイルの読み書きで不具合があると,数秒の後「==$>$ file.txt not generated (5 s ) 」のようなエラーメッセージがコンソールに表示される。このような場合は作業ディレクトリの設定などを確認していただきたい。この待ち時間については,Waitオプションで設定することもできる。\\ + \\ + +\begin{description} +\hypertarget{boxplot}{} +\item[関数] Boxplot(名前,データ,垂直位置,高さ,option) +\item[機能] 箱ひげ図を描く +\item[説明] データは,直接的に変数で渡す場合とファイルから読み込む場合がある。\\ +例:乱数で作成した5未満の実数のデータを箱ひげ図にする。\\ +\begin{verbatim} + dt1=apply(1..100,5*random()); + Boxplot("1",dt1,1,1/2); +\end{verbatim} + \\ +例:外部ファイルとして用意したデータを読み込んで箱ひげ図にする。データファイルはcsv形式とする。\\ +\begin{verbatim} + Boxplot("2","datafile.csv",3,1/2); + Boxplot("1",dt1,1,1/2); +\end{verbatim} + \\ + 複数列から成るcsvファイルを読み込むには,Readcsvを使う。読み込んだファイルは,Readcsv()で指定した名前のリストに入る。(頭部はrc)\\ + データの値を画面に入るように調節するには,次のようにリストの計算を利用すればよい。\\ + また,Framedata2(),Rulerscale() を併用することで目盛を入れることができる。Framedata2() のために,表示領域の対角点A,BをCinderellaの作図ツールで作図しておく。\\ +\begin{verbatim} + Readcsv("1","datafile.csv"); + dt1=apply(rc1,#_1); + dt2=apply(rc1,#_2); + Boxplot("1",dt1/20,1,1/2); + Boxplot("2",dt2/20,3,1/2); + Framedata2("1",[A,B]); + Rulerscale(A,["r",0,6,1],["f",1,"\mbox{dt1}",3,"\mbox{dt2}"]); +\end{verbatim} + \\ + \input{Fig/boxplot}\\ + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{calcbyr}{} +\item[関数] CalcbyR(変数名,コマンド列,option) +\item[機能] Rのコマンドを実行して結果を返す +\item[説明] バッチファイル kc.bat / シェルファイル kc.sh を利用してRとデータをやり取りし,計算結果を取得する。\\ + \\ +例:Rを用いて標準正規分布から10個の乱数を発生し,平均値と標準偏差を求めてコンソールに表示する。 +\begin{verbatim} + cmdL=[ "=rnorm",[10] ]; + CalcbyR("dt",cmdL); + nx=length(dt); + mx=sum(dt)/nx; + sx=sqrt(dt*dt/nx-mx^2); + println("データ:"+dt); + println("平均:"+format(mx,4)+" 標準偏差:"+format(sx,4)); +\end{verbatim} +1行目の cmdL=[ "=rnorm",[10] ] で,標準正規分布から10個の乱数を発生するコマンド列を定義。\\ +2行目で,Rで計算した結果がリスト dt に入る。\\ + \\ +例:Rを用いてN(50,$5^2$)から10個の乱数を発生し,平均と不偏分散もRで計算してその結果をコンソールに表示する。 +\begin{verbatim} + cmdL=[ + "tmp1=rnorm",[10,50,5], + "tmp2=mean",["tmp1"], + "tmp3=var",["tmp1"], + "=c(tmp1,tmp2,tmp3)",[] + ]; + CalcbyR("rd",cmdL); + dt=rd_(1..(length(rd)-2)); + mx=rd_(-2); + vx=rd_(-1); + println("データ:"+dt); + println("平均:"+format(mx,4)+" 不偏分散:"+format(vx,4)); +\end{verbatim} + CalcbyR()によって,データと平均,不偏分散からなるリストが作成されるので,mxに平均,vxに不偏分散を代入している。\verb|rd_(-1)| は,リスト rd の末尾の要素。\\ + \\ +例:Rでポアソン分布から200個の乱数をとり,標本平均の分布の様子=分散が小さくなって,正規分布に近づいている様子=をヒストグラムで見る。 +\begin{verbatim} + cmdL=[ + "tmp1=rpois",[200,5], + "tmp2=mean",["tmp1"], + "tmp3=var",["tmp1"], + "=c(tmp2,tmp3,tmp1)",[] + ]; + CalcbyR("rd",cmdL); + dt=rd_(3..length(rd)); + nn=length(dt); + mx=rd_1; + vx=rd_2*(nn-1)/nn; + sx=sqrt(vx); + println(dt); + println(["m="+format(mx,4),"v="+format(vx,4)]); + Setscaling(1/5); + Histplot("1",dt,["Breaks=seq(0,14,1)","dr,0.5"]); +\end{verbatim} + \\ + \input{Fig/poison01}\\ + \\ +例:ポアソン分布で乱数を2000個発生させ,10個ずつの平均をRで計算し, +\begin{verbatim} + cmdL=[ + "tmp1=rpois",[2000,5], + "tmp2=c()",[], + "for(k in 1:200){",[], + " tmp=tmp1[(10*(k-1)+1):(10*k)]",[], + " tmp2=c(tmp2,mean(tmp))",[], + "}",[], + "=tmp2",[] + ]; + CalcbyR("rd2",cmdL); + Setscaling(1/10); + Histplot("2",rd2); +\end{verbatim} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\hypertarget{histplot}{} +\item[関数] Histplot(name,data,option) +\item[機能] Rを利用してヒストグラムを描く +\item[説明] dataはリストにして作成するか,外部ファイルからReadcsv()で読み込む。\\ +階級範囲(ブレークポイント)は,通常スタージェスの公式によるが,オプションで,\\ + "breaks=[0,10,20,30,40,50,60,70,80,90,100]"\\ +などと指定することもできる。\\ + この他のオプションは\\ + "Den=yes/no":密度の指定(初期値は no)\\ + "Rel=yes/no":相対度数にする/しない(初期値は no)\\ + \\ +例:csvファイル(datafile.csv)を読み込み,ヒストグラムを作る。Framedata2() と Rulerscale()を併用して,目盛付きの枠の中に表示する。表示枠の対角点A,BはCinderellaの作図ツールで作図しておく。 +\begin{verbatim} + Addax(0); + Setscaling(5); + Setunitlen("0.6mm"); + Readcsv("1","datafile.csv",[""]); + Histplot("1",dt1,[""]); + Framedata2("1",[A,B]); + Rulerscale(A,["r",0,100,10],["r",0,15,5]); +\end{verbatim} + \input{Fig/histgram}\\ + +2行目と3行目は,データに合わせて縦方向を5倍にし,TeXの単位長を0.6mmにしている。\\ +Den,Rel オプションをyes にしたときは,Setscaling(100)くら いにするのがよい。\\ +csvファイルが複数のデータからなる場合は,\\ + \verb|dt1=apply(rc1,#_1);| +として,リストの第1要素を取得する。第2要素のヒストグラムであれば \verb|#_2| とする。\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{plotdatar}{} +\item[関数] PlotdataR(name,式,変数) +\item[機能] Rの関数のグラフを描く +\item[説明] Cindyscriptの組み込み関数にはない関数のグラフをRを利用して描く。\\ + +例:平均5, 標準偏差2の正規分布の密度関数と分布関数のグラフを描く。 +\begin{verbatim} + PlotdataR(“1”, “dnorm(x,5,2)”, ”x=[0,10]”); + PlotdataR(“2”, ”pnorm(x,5,2)”, ”x=[0,10]”); +\end{verbatim} + +例:標準正規分布のグラフ上の点とx軸を結んだ線分を描く。\\ +点A,BはCinderellaの作図ツールで作図しておき,点Aをグラフ上のおよその位置に置いてから実行する。 +\begin{verbatim} + PlotdataR("1","dnorm(x)","x=[-5,5]"); + Putoncurve("A","grR1",[-3,3]); + Putpoint("B",[A.x,0]); + Listplot("1",[A,B]); +\end{verbatim} +2行目の最後の引数の[-3,3]は,その範囲を動かすことを意味する。\\ +Aはグラフ上を動かすことができて,Bはそれに伴って動く。ただし,少し動かす度に バッチ/シェル ファイルを実行するので,煩雑な場合は,Plotdata() の行をコメント化してから点Aを動かしたあと再実行するとよい。\\ + \\ +例:上と同様で,x軸上の点を自由点Aとし,曲線上にBを置く。 +\begin{verbatim} + PlotdataR("1","dnorm(x)","x=[-5,5]"); + PlotdataR("1","dnorm(x)","x=[-5,5]"); + A.xy=[A.x,0]; + Lineplot("1",[A,A+[0,1]],["nodisp"]); + Putintersect("B","grR1","ln1"); + Listplot("1",[A,B]); +\end{verbatim} + \\ +例:前の例のグラフで,ABの左側にShadeをかけ,Shadeの部分の面積を求める。Pの値を表示する位置に,Cinderellaの作図ツールで点Cをとっておく。 +\begin{verbatim} + tmp1=[0.2,0,0,0]; + tmp2=Colorcmyk2rgb(tmp1); + Setcolor(tmp1); + Setcolor([0.2,0,0,0]); + Shade(["en1"],["color->"+text(tmp2)]); + Setcolor("black"); + PlotdataR("1","dnorm(x)","x=[-5,5]",["Num=100"]); + Putpoint("A",[0,0],[A.x,0]); + Lineplot("1",[A,A+[0,1]],["nodisp"]); + Putintersect("B","grR1","ln1"); + Listplot("1",[A,B]); + Listplot("2",[[-5,0],[5,0]],"nodisp"); + Enclosing("1",["Invert(grR1)","sg2","sg1"],[B,"notex"]); + tmp=0.5+Integrate("grR1",[0,A.x]); + Expr([A,"s",text(A.x),C,"e","P="+text(tmp)]); +\end{verbatim} + \\ + \input{Fig/rshade}\\ + \\ +Shade() はプロットデータを定義しないので,先に書いておくと塗ってから線を描くので,にじみがなくきれいに仕上がる。("en1"はEnclosing("1"・・)でできるプロットデータ)\\ + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{plotdiscr}{} +\item[関数] PlotdiscR(name,式,変数) +\item[機能] Rを利用して離散型のグラフを描く +\item[説明] dbinom (二項分布),dpois(ポアソン分布),dgeom(幾何分布)など離散型確率分布のグラフを描く。\\ + \\ +例:二項分布のグラフと正規分布のグラフを比較する。 +\begin{verbatim} + Setscaling(20); + PlotdiscR("1","dbinom(k,10,0.4)","k=[0,10]"); + PlotdataR("1","dnorm(x,10*0.4,sqrt(10*0.4*0.6))","x=[0,10]",["do"]); +\end{verbatim} + \\ + \input{Fig/binvsnormal}\\ + \\ +関数部分が長くなるときは,Assign()を利用して次のように書くこともできる。 +\begin{verbatim} + tmp="dnorm(x,n*p,sqrt(n*p*(1-p)))"; + tmp=Assign(tmp,["n",10,"p",0.4]); + PlotdataR("2",tmp,"x=[0,10]",["do"]); +\end{verbatim} + +次は,ポアソン分布および幾何分布のグラフ。 +\begin{verbatim} +PlotdiscR("2","dpois(k,4)","k=[0,10]"); +PlotdiscR("3","dgeom(k,0.3)","k=[0,10]"); +\end{verbatim} + \\ +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{readcsv}{} +\item[関数] Readcsv(name,filename,option) +\item[機能] Rを利用してcsvファイルを読む。 +\item[説明] Rを使ってcsvファイルを読み,KeTCindyに引き渡す。\\ +利用例は Boxplot() などの例を参照のこと。\\ + \\ + +\hypertarget{scatterplot}{} +\item[関数] Scatterplot(name,filename,option) +\item[機能] 2次元データを読み込み,散布図を描く +\item[説明] 外部ファイル filename(csv形式)を読み,散布図を描く。\\ +オプションは "Reg=no" : 回帰直線を描くかどうか(yes/no) 初期値は yes\\ + A, B 表示枠の対角点(左下と右上の点)(Cinderellaで作図)\\ + C 相関係数と回帰直線の式を表示する点\\ + "Size=n" :点の大きさ。Cinderellaの描画面には反映されない。\\ + 描画面の点も大きくする場合は,"size-$>$n"オプションを追加する。\\ +例:data.csv を読んで散布図を描き,回帰直線を引く。 +\begin{verbatim} + Scatterplot("1","data.csv",["Reg=yes",A,B,C,"Size=5"]); + Rulerscale(A,["r",0,10,1],["r",1,10,1]); +\end{verbatim} + optionの点A,BはCinderellaの作図ツールでとった表示領域の対角点。( Aが左下。なお,対角点の名称はA,Bには限らない。)\\ + 回帰直線を描く場合("Reg=yes")は,回帰直線が枠からはみ出すので,AをSW,BをNEに一致させるとよい。\\ + Cは相関係数と回帰直線の式を表示する点としてCinderellaの作図ツールで取る。これも,名称はCには限らない。\\ + \verb|Rulerscale(A,["r",0,10,1],["r",1,10,1]);|\\ + で表示枠に目盛を打っている。"r" は等幅,"f"は Tickmark と同じ指定。\\ + \\ + \input{Fig/scatter}\\ +\end{description} +\newpage + +% Maximaとの連携 ================================== +\subsection{Maximaとの連携} +Maximaは数式処理ソフトで,KeTCindyにおいては微積分の計算など,Cindyscriptでは不十分な点を補うことができる。\\ + KeTCindyでは,kc.bat/shによってコマンドをMaximaに渡し,結果をテキストファイルで受け取る。このとき,Maximaとのやりとりで,次のようなファイルが作業ディレクトリに作成される。\\ +拡張子 max :Maxima用のファイル\\ +拡張子 txt:データファイル\\ +このデータのやり取りに関する次のオプションがある。\\ + オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ + このとき,ファイルの読み書きで不具合があると,数秒の後「==$>$ file.txt not generated (5 s ) 」のようなエラーメッセージがコンソールに表示される。このような場合は作業ディレクトリの設定などを確認していただきたい。この待ち時間については,Waitオプションで設定することもできる。\\ + +\begin{description} + +\hypertarget{calcbyM}{} +\item[関数] CalcbyM(name,コマンド,option) +\item[機能] Maximaのスクリプトを実行する +\item[説明] 第2引数はMaximaで実行するコマンド。\\ + コマンドと引数リストの繰り返しからなるリスト(例えばcmdL)を作って,一度に実行する。\\ + 戻り値はない。(未定義値) 結果は,コマンドリストの最後に記述した変数(引数は空リスト)の値がname で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにして代入される。\\ + \\ +例:$\sin x$ とその導関数を表示する。結果は 変数 fdf に f とdf のリストが代入される。 +\begin{verbatim} + cmdL=[ + "f:sin(x)", [], + "df:diff",["sin(x)","x"], + "f::df",[] + ]; + CalcbyM("fdf",cmdL); + println(fdf); +\end{verbatim} + \\ + 実行すると,コンソールに,[sin(x),cos(x)] と表示される。\\ + \\ +例:2次方程式 $x^2-x-4=0$の解を求める。 +\begin{verbatim} + cmdL=[ + "ans:solve",["x^2-x-4","x"], + "ans",[] + ]; + CalcbyM("ans",cmdL); + println("ans="+ans); +\end{verbatim} + コンソールには\\ + ans=[x = -(sqrt(17)-1)/2,x = (sqrt(17)+1)/2] \\ + が表示される。\\ + \\ +{\bf 応用例1:曲線の接線を引く}\\ + \\ + $f(x)=\dfrac{e^x+e^{-x}}{2}$ の,$x=a$における接線の方程式を作る。\\ +Maximaでその処理を行うコマンドを定義し,CalbyMで実行する。 +\begin{verbatim} + fx="(exp(x)+exp(-x))/2"; + cmdL=[ + "df:diff",[fx,"x"], + "c:ev",["df","x=a"], + "b:ev",[fx,"x=a"], + "eq:c*(x-a)+b",[], + "eq",[] + ]; + CalcbyM("tn1",cmdL); + println(tn1); +\end{verbatim} + コンソールには +\begin{verbatim} + (%e^a-%e^-a)*(x-a))/2+(%e^a+%e^-a)/2 +\end{verbatim} +が表示される。\\ + この,CalbyMの戻り値 tn1 を用いて,曲線上の1点Aにおける接線のグラフを描く。以下のスクリプトを追加する。なお,点AをCinderellaの作図ツールで適当なところにとっておく。 +\begin{verbatim} + tn1=Assign(tn1,["%e^a","exp(a)","%e^-a","exp(-a)"]); + Plotdata("1",fx,"x"); + Putoncurve("A","gr1"); + tmp=Assign(tn1,["a",A.x]); + plotdata("2",tmp,"x",["Num=2"]); +\end{verbatim} +1行目ではMaximaで作成した式を,Cindyscriptでプロットできる式にしている。\\ + \\ + \input{Fig/maxfun01}\\ + \\ + なお,接線の方程式を求めるだけであれば,Mxfun()を使うこともできる。Mxfun()の解説を参照のこと。\\ + \\ +{\bf 応用例2:パラメトリックの場合の接線}\\ + \\ + 媒介変数の値を決めるために,点AをCinderellaの描画面のx軸上にとっておき,その$x$座標を媒介変数$t$の値とする。スライダを作ってもよい。 +\begin{verbatim} + fn="3*cos(t)^2*[cos(t),sin(t)]"; + cmdL=[ + "f:",[fn], + "df:diff",["f","t"], + "df:trigsimp",["df"], + "tn:f+s*df",[], + "tn",[] + ]; + CalcbyM("tn2",cmdL); + Paramplot("1",fn,"t=[0,2*pi]",["Num=100"]); + gn=Assign(tn2,["t",A.x]); + Paramplot("2",gn,"s=[-3,3]"); +\end{verbatim} + \\ + \input{Fig/maxfun02}\\ + \\ + cmdLで定義しているMaximaのコマンド(trigsimp など)については,Maximaの解説書などを参照されたい。\\ + \\ +\hypertarget{example}{} +\item[関数] Example("Mxfun",文字) +\item[機能] Mxfunの使用例を表示。文字は "a","b",など。 +\item[説明] たとえば,\verb|Example("Mxfun","a")| とすると,Mxfunの使用例がコンソールに表示される。\\ + \\ + +\hypertarget{mxbatch}{} +\item[関数] Mxbatch(ファイル名) +\item[機能] Maximaのファイルを実行するコマンド作る +\item[説明] Dirlibで指定されたフォルダの中の maximaL フォルダにあるファイルを実行するための,CalcbyM用のコマンドを作成する。\\ +例:\verb|cmd=Mxbatch("fourier_sec")|\\ + を実行すると,cmdに\\ + \verb|[batch,["/Applications/ketcindy/ketlib/maximaL/fourier_sec.max"]] |\\ + が代入される。そこで,\\ + \verb|CalcbyM("ret",cmd,[]);|\\ + を実行すれば,fourier\_sec.max が実行されて,結果を ret に取得できる。\\ + fourier\_sec.max に続けて,コマンド列 cmd2 を実行することもでき,その場合は +\begin{verbatim} + cmdL=Concat(Mxbatch("fourier_sec"),cmd2); + CalcbyM("ret",cmdL,[]); +\end{verbatim} +とする。(Concat() はリストを結合するCindyscriptの関数)\\ + \\ + +\hypertarget{mxfun}{} +\item[関数] Mxfun(name,式,リスト,option) +\item[機能] Maximaの関数を実行する +\item[説明] 第2引数の「式」はMaximaの関数名。第3引数のリストは関数に渡す引数のリスト。\\ + 戻り値は,第1引数の式に1つでも文字があると文字列となる。すべて数字(+,-, . を含む)の場合は +16桁以下であれば数,それ以上の場合は文字列となる。また,戻り値は,変数 mxname にも代入される。\\ +オプションに "Disp=no" をつけると,結果をコンソールに表示しない。\\ + \\ +例:$10!$を求める。\\ + \verb|Mxfun("1","10!",[],[""]);|\\ + を実行すると,コンソールに mx1 is 362880 と表示される。この値は変数 mx1 に代入されているので,\\ + \verb|drawtext([0,1],mx1);|\\ +とすればCinderellaの描画面上に表示される。\\ + また,戻り値を別の変数に代入して使うこともできる。 +\begin{verbatim} + fact10=Mxfun("1","10!",[],[""]); + drawtext([0,1],fact10); +\end{verbatim} + \\ +例:$f(x)=\sin x$ を微分する\\ + \verb|Mxfun("1", "diff",["sin(x)","x"])|\\ + とすると\\ + diff(sin(x),x)\\ + というコマンドをMaximaに渡して,戻り値をCindyの変数mx1に代入する。\\ + \verb|Mxfun("1", "diff(sin(x),x)",[]])|\\ + と,第1引数にまとめても同じ結果になる。ただし,この場合,第2引数は空リストとする。\\ + 文字列を引数とする場合,例えば,文字列を連結するコマンドconcatでは,\\ + concat("a","b")\\ + とするが,Cindyscriptの文字列の処理の関係で,第1引数ではこの形で記述できない。\\ + したがって,このような場合は,第2引数を使って\\ + \verb|Mxfun("1","concat",["a","b"])| + とすればよい。\\ + \\ +{\bf Cindyscriptの微分との違い}\\ + Cindyscriptでも微分はできる。たとえば, +\begin{verbatim} + f(x):=sin(x); + g(x):=d(f(#),x); + plot(g(#)); +\end{verbatim} + とすると,cos(x)のグラフが描かれる。\\ + しかし,Cindyscriptの微分が,微分の定義による数値計算であるのに対し,Maximaでは数式処理として微分ができる。\\ + その意味の違いは,次のスクリプトで確かめられる。 +\begin{verbatim} + f(x):=sin(x); + g(x):=d(f(#),x); + println(g(x)); +\end{verbatim} + では,コンソールに表示されるのは未定義値(\_ \_ \_) である。\\ +一方, +\begin{verbatim} + Mxfun("1", "diff",["sin(x)","x"]); + println(mx1); +\end{verbatim} +では,コンソールに \verb|cos(x)| と表示される。\\ +mx1は文字列であるので, +\begin{verbatim} + g(x):=parse(mx1); +\end{verbatim} +とすれば,g(x)を導関数とすることができ,\verb|plot(g(#))| でグラフを描くことができる。\\ + また,Cindyscriptの微分では,3階か4階までの導関数が計算上の限度であるのに対し,Maximaなら何階でも微分ができるので,テイラー展開などで有利である。\\ + \\ + \\ +例 $\sin x$ の テイラー展開を行い,グラフを表示する。 +\begin{verbatim} + Mxfun("1","taylor",["sin(x)","x",0,7],[""]); + Plotdata("1","sin(x)","x",["da"]); + Plotdata("2",mx1,"x"); +\end{verbatim} + \\ + \input{Fig/taylor} + \\ +Mxtex() を用いて,Mxfun()の結果の mx1をTeX書式にして表示することもできる。\\ + \verb|Expr([[1,2],"e",Mxtex("1",mx1)]);|\\ +を追加すれば[1,2]の位置に式が表示される。\\ + \\ + \\ +{\bf 応用例:接線の方程式を作る}\\ + \\ + $f(x)=\dfrac{e^x+e^{-x}}{2}$ の,$x=a$における接線の方程式を作る。\\ + 関数式を文字列にしておき,Assign() を用いて変数$x$を$a$に変えれば,$f(a)$の式を作ることができる。導関数についても同様にする。\\ +\begin{verbatim} + fx="(exp(x)+exp(-x))/2"; + gx=Mxfun("1","diff",[fx,"x"]); + fa=Assign(fx,["x","a"]); + ga=Assign(gx,["x","a"]); + tf=ga+"*(x-a)+("+fa+")"; + println(tf); +\end{verbatim} + コンソールには +\begin{verbatim} + (%e^a-%e^-a)/2*(x-a)+((exp(a)+exp(-a))/2) +\end{verbatim} +が表示される。\\ + \\ + +\hypertarget{mxtex}{} +\item[関数] Mxtex(name,式) +\item[機能] 式をTeX書式にする +\item[説明] 第2引数の式は,直接書いた式もしくはMxfunの戻り値。これをTeXの書式にする。\\ +戻り値は,変数 txname にも代入される。\\ + \\ +例:部分分数への分解 +\begin{spacing}{1.5} + 部分分数$\dfrac{x^3}{(x+1)(x+2)}$の分解をMaximaで行い,その結果をTeX書式にして画面に表示する。画面に表示された結果はそのままKeTCindyで出力できる。 +\end{spacing} + +\begin{verbatim} + Mxfun("1","partfrac",["x^3/((x+1)*(x+2))","x"]); + Mxtex("1",mx1); + Expr([0,1],"e",tx1); +\end{verbatim} + ここで,mx1,tx1はそれぞれMxfun("1",・・) , Mxtex"1",・・) の結果(戻り値)である。mx1,tx1 はコンソールにも表示され,tx1は次のようになっている。 +\begin{verbatim} + \frac{8}{x+2}-\frac{1}{x+1}+x-3 +\end{verbatim} + CindyscriptはTeX書式をサポートしているのでこれで描画面に分数式が表示されるが,Texの文書では,\verb|\frac{}{}| ではなく,\verb|\dfrac{}{}|を使うことが多い。そこで,Assign()を用いて,"frac" を "dfrac" に変えれば,そのままTex文書で使える。ただし,Cindyscriptは \verb|\dfrac{}{}| をサポートしていないので,画面上では分数表記にならない。そのあたりの事情を次のスクリプトで示す。 +\begin{verbatim} + fx="x^3/((x+1)*(x+2))"; + pfx=Mxfun("1","partfrac",[fx,"x"]); + form=Mxtex("1",fx)+"="+Mxtex("2",pfx); + dform=Assign(form,["frac","dfrac"]); + Letter([0,5],"e","部分分数への分解 $"+form+"$"); + Letter([0,3],"e","部分分数への分解 $"+dform+"$"); +\end{verbatim} +Cinderellaの描画面では次のように表示される。\\ + \\ + \includegraphics[bb=0 0 694 232 , width=8cm]{Fig/mxtex01.png}\\ + \\ +出力したTeX挿入図では次のようになる。\\ + \\ + \input{Fig/mxtex02}\\ + \\ +なお,文字列を置換するのに,\verb|Assign(form,["frac","dfrac"])| ではなく,\\ +Cindyscriptの文字列の関数 replace を用いて,\\ + \verb|dform=replace(form,"frac","dfrac");| \\ +としてもよい。\\ + \\ +例:2次関数のグラフを表示し,$x$軸との交点の$x$座標を表示する。 +\begin{verbatim} + fx="x^2-x-3"; + cmdL=[ + "ans:solve",[fx,"x"], + "ans",[] + ]; + CalcbyM("ans",cmdL); + p1=indexof(ans,"["); + p2=indexof(ans,","); + p3=indexof(ans,"]"); + s1=substring(ans,p1,p2-1); + s2=substring(ans,p2,p3-1); + s1=replace(s1,"x =",""); + s2=replace(s2,"x =",""); + Mxtex("1",s1); + Mxtex("2",s2); + Plotdata("1",fx,"x"); + Expr([-2,-0.5],"e",tx1); + Expr([2,-0.5],"e",tx2); +\end{verbatim} + \\ + \input{Fig/mxtex03}\\ + \\ + ここで,\verb|CalcbyM("ans",cmdL);| で得られるansは,次のような文字列である。\\ + \verb|"[x = -(sqrt(13)-1)/2,x = (sqrt(13)+1)/2] "|\\ +そこで,ここから2つの式だけを抽出する作業を行ったのち,Mxtex() でTeXの式を得ている。\\ + さらに応用として,点AをCinderellaの作図ツールで作図し, +\begin{verbatim} + if(A.y<0, + fx="(x-"+text(A.x)+")^2"+guess(A.y), + fx="(x-"+text(A.x)+")^2+"+guess(A.y); + ); +\end{verbatim} +とすると,点Aを頂点とする放物線と軸との交点の座標が描かれる。Maximaとのデータのやり取りをするためのタイムラグがあるが,インタラクティブに放物線の位置を変えることができる。\\ + \\ +<参考>\\ + 2次関数のような簡単な関数であれば,Cindyscriptの roots() 関数を用いて2次方程式が解けるので,次のスクリプトでほぼ同じ動作をするものを作ることができる。「ほぼ」というのは点Aの位置によっては,guess()で解釈しきれないことがあるためである。Maximaを使えば数式処理で解を求めるので,Aがどこにあってもきれいに表示できる。 +\begin{verbatim} + fx="x^2-2*A.x*x+A.x^2+A.y"; + cf=[A.x^2+A.y,-2*A.x,1]; + sol=roots(cf); + s1=guess(sol_2); + s2=guess(sol_1); + Mxtex("1",s1); + Mxtex("2",s2); + Plotdata("1",fx,"x"); + Expr([-2,-0.5],"e",tx1); + Expr([2,-0.5],"e",tx2); +\end{verbatim} + +\end{description} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage + + +% Scilabとの連携 ================================== +\subsection{Scilabとの連携} + KeTCindyは,もともと Scilab と連携して,Cinderellaからの出力をTeXのテキストとするシステムである。しかし,それだけでなく,Maximaなどとの連携と同様,Scilab の関数を実行して,データをやりとりすることができる。\\ + KeTCindyでは,kc.bat/shによってコマンドをScilabに渡し,結果をテキストファイルで受け取る。このとき,Scilabとのやりとりで,次のようなファイルが作業ディレクトリに作成される。\\ +拡張子 sci :Scilab用のファイル\\ +拡張子 txt:データファイル\\ +このデータのやり取りに関する次のオプションがある。\\ + オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ + このとき,ファイルの読み書きで不具合があると,数秒の後「==$>$ file.txt not generated (5 s ) 」のようなエラーメッセージがコンソールに表示される。このような場合は作業ディレクトリの設定などを確認していただきたい。この待ち時間については,Waitオプションで設定することもできる。\\ + +\begin{description} + +\hypertarget{calcbyS}{} +\item[関数] CalcbyS(name,コマンド,option) +\item[機能] Scilabのコマンドスクリプトを実行する +\item[説明] 第2引数はScilabで実行するコマンドのリスト。\\ + \\ +\hypertarget{plotdataS}{} +\item[関数] PlotdataS(name,関数,変数) +\item[機能] Plotdataと同様の書式で,Scilabの関数を実行する +\item[説明] Cindyscriptの組込関数にない関数のグラフを描くことができる。\\ + \\ +例:ベッセル関数のグラフを描く +\begin{verbatim} + PlotdataS("1","besselj(1,x)","x"); +\end{verbatim} + +\end{description} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +% Risa/Asirとの連携 ================================== +\subsection{Risa/Asirとの連携} + +\begin{description} + +\hypertarget{calcbyA}{} +\item[関数] CalcbyA(name,コマンド,option) +\item[機能] Risa/Asirのスクリプトを実行する +\item[説明] 第2引数はRisa/Asirで実行するコマンド。\\ + コマンドと引数リストの繰り返しからなるリスト(例えばcmdL)を作って,一度に実行する。\\ + 戻り値はない。(未定義値) 結果は,コマンドリストの最後に記述した変数(引数は空リスト)の値がname で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにして代入される。\\ + +\hypertarget{asirfun}{} +\item[関数] Asirfun(name,式,リスト,option) +\item[機能] Risa/Asirの関数を実行する +\item[説明] 第2引数の「式」はRisa/Asirの関数名。第3引数のリストは関数に渡す引数のリスト。\\ + 戻り値は,第1引数の式に1つでも文字があると文字列となる。すべて数字(+,-, . を含む)の場合は +16桁以下であれば数,それ以上の場合は文字列となる。また,戻り値は,変数 asname にも代入される。\\ +オプションに "Disp=no" をつけると,結果をコンソールに表示しない。\\ + +\end{description} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\newpage +% FriCASとの連携 ================================== +\subsection{FriCAS(Axiom)との連携} + +\begin{description} + +\hypertarget{calcbyF}{} +\item[関数] CalcbyF(name,コマンド,option) +\item[機能] FriCASのスクリプトを実行する +\item[説明] 第2引数はFriCASで実行するコマンド。\\ + コマンドと引数リストの繰り返しからなるリスト(例えばcmdL)を作って,一度に実行する。\\ + 戻り値はない。(未定義値) 結果は,コマンドリストの最後に記述した変数(引数は空リスト)の値がname で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにして代入される。\\ + +\hypertarget{frfun}{} +\item[関数] Frfun(name,式,リスト,option) +\item[機能] FriCASの関数を実行する +\item[説明] 第2引数の「式」はFriCASの関数名。第3引数のリストは関数に渡す引数のリスト。\\ + 戻り値は,第1引数の式に1つでも文字があると文字列となる。すべて数字(+,-, . を含む)の場合は +16桁以下であれば数,それ以上の場合は文字列となる。また,戻り値は,変数 friname にも代入される。\\ +オプションに "Disp=no" をつけると,結果をコンソールに表示しない。\\ + +\end{description} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\newpage +% 表計算ソフトとの連携 ================================== +\subsection{表計算ソフトとの連携} + 表計算ソフトでは,複数のセルを選択してコピー(Windowsでは Crtl+ C ,Macでは Command+C)すると,セルの内容はtab区切りのテキストデータとしてクリップボードにコピーされる。これをCindyscriptエディタにペーストすることで表計算ソフトのデータをKeTCindyで利用できる。逆に,Cindyscriptのコンソールへの出力を表計算ソフトのシートにコピーすることもできる。 + +\begin{description} +\hypertarget{tab2list}{} +\item[関数] Tab2list(str,option) +\item[機能] str の内容をリストに変換する +\item[説明] tab区切りになっている文字列 str をリストに変換する。\\ + optionは,NULLのセルの置き換え。リストで表す。デフォルトは[0]。\\ +次のような手順で表計算ソフトからデータをKeTCindyに写すことができる。\\ + \\ +(1) 表計算ソフトで,適当な範囲を指定しクリップボードにコピーする。\\ + Windowsなら Ctrl+C,Macなら Command+C\\ + \\ +\includegraphics[bb=0 0 742 308 , width=8cm]{Fig/tab2list01.png}\\ + \\ +(2) Cindyscriptエディタで,適当な文字変数を用意する。\\ + たとえば,data="";\\ + \\ +\includegraphics[bb=0 0 858 298 , width=10cm]{Fig/tab2list02.png}\\ + \\ +(3) ここにペーストすると,文字列にコピーされる。\\ + もし,右のようになったら(表計算ソフトによります)左のように,最後の "" の前で改行しておく。\\ + \\ +\includegraphics[bb=0 0 748 276 , width=6cm]{Fig/tab2list001.png} \includegraphics[bb=0 0 738 236 , width=6cm]{Fig/tab2list00.png}\\ + + \\ +(4) この文字変数 data に対し,Tab2list(data) を実行すると,行列を表すリストが返される。\\ + これを適当な変数に代入し,作表コマンドで表にするなど,目的に応じて利用する。\\ + 数値だけなら行列として計算もできる。\\ + \\ +\includegraphics[bb=0 0 1245 457 , width=10cm]{Fig/tab2list03.png} + +\hypertarget{dispmat}{} +\item[関数] Dispmat(list) +\item[機能] リストを行列の形でtab区切りにしてコンソールに表示する。 +\item[説明] 行列を表すリスト (たとえば dlist) を引数としてDispmat(dlist) を実行すると,コンソールに行列型で内容が表示される。\\ + 実際にはTAB区切りの文字列。(println としなくても直接コンソールに表示される)\\ + これを表計算ソフトのシートにコピーする。\\ + \\ +\includegraphics[bb=0 0 855 395 , width=8cm]{Fig/tab2list04.png}\ + +\end{description} +\newpage +% MeshLabとの連携 ================================== +%\subsection{MeshLabとの連携} + +% アニメーション ================================== +\section{アニメーションPDF:KeTCindymv} +\subsection{概要} +アニメーションのできるPDFを作る。 + +Cinderellaの作図機能とCindyscriptを用いてアニメーションができるが,PDFにすることでCinderellaがなくてもPDFビュアーがあればアニメーションを実行できるので,プレゼンテーションや教材の受け渡しなどに便利である。 + +KeTCindymvの画面は次のようになっている。(templatemv.cdy)\\ + \\ + \includegraphics[bb=0 0 1594 710 , width=12cm]{Figmv/mvgaiyou01.png} + +画面上方のボタンには,次のようなスクリプトが割り当てられているので,ボタンを自作することもできる。 + +\begin{tabbing} + 12345678978\=1234567897890123\=\kill + Texview \>: Viewtex(); \>現在の画面のPDFデータを作る\\ + TexMv \>: Texmovie(); \>アニメーションPDFデータを作る\\ + Texpara \>: Texpara(); \>フレームに分割したPDFデータを作る\\ + Exekc \>: kc(); \>バッチファイルを実行する +\end{tabbing} + +アニメーションの作成は,フレームを定義する関数を作成し,Moviedata() 関数を実行する。実行後,TexMv,Exekc のボタンを順に押すことで,Fhead+"moviefigs.tex" と Fhead+"moviemain.tex",Fhead+"moviemain.pdf" が生成されて表示される。たとえば,Fhead が "abc" の場合,TeX の文書には\\ + \verb|\input{abcmoviefigs.tex}|\\ +で動画を挿入することができる。 + +ただし,動画のできるPDFを作成するには,ドキュメントクラスと使用パッケージについて注意が必要である。 + +ドキュメントクラスは,article または jarticle とする。jsarticle は使えない。 + +パッケージは animate に dvipdfmx オプションをつける。\\ + \verb|\usepackage[dvipdfmx]{animate}| + +また,アニメーションPDFでアニメーションを行うにはAdobe Acrobat Reader など,アニメーションに対応したPDFリーダーが必要である。WindowsのSumatraPDF,Macの プレビューでは動かない。\\ + +次に,Texpara,Exekc のボタンを順に押すことで,フレームに分割した Fhead+"parafigs.tex" と Fhead+"paramain.tex" ,Fhead+"paramain.pdf" が生成されて表示される。この図を利用するにはパッケージの指定がやや面倒である。 Fhead+"mvparamain.tex" を参照されたい。 \\ + +画面下方のスライダによりアニメーションの途中図を描くことができる。Texview と Exekc ボタンによりその図のファイルが作成される。 + + +\subsection{設定} +KeTCindymvでは,KeTCindyと若干異なる設定が必要である。 + +まず,Initialization スロットでは,KeTCindy で\\ + \verb|Shellfile="";|\\ +になっているのを\\ + \verb| Shellfile="mv";|\\ +とする。 + +次に,Draw スロットでは,次のように \verb|Ketinit();| に加え,\verb|Ketinitmv();| が必要である。また,画面表示のために,\verb|Windispg();| のかわりに \verb|Mvdispg();| を用いる。 +\begin{verbatim} + Fhead="templatemv"; + Texparent=""; + Ketinit(); + Ketinitmv(); + + ここにスクリプトを書く + + Mvdispg(); +\end{verbatim} +なお,ひながたの templatemv.cdy ではこの設定がすでにしてある。 + +\newpage +\subsection{描画} +\begin{description} + +\hypertarget{moviedata}{} +\item[関数] Moviedata(str1,str2,options) +\item[機能] アニメーションデータを作る +\item[説明] str1 はアニメーションを定義する関数名を文字列とする。str2 は定義域。\\ + optionsは,Cut と Div \\ + Cut : 1秒のフレーム数。初期値は20。\\ + Civ : 全体のフレーム数。初期値は80。\\ + したがって,初期値では4秒間のアニメーションとなる。\\ + \\ +【例】定円上を動く点Pと,定点Aを結ぶ線分の中点をQとして動きを見る。\\ +まず,定円を,原点中心、半径2として描いておく。\\ +アニメーションを定義する関数は,時間を $t$ とすれば,時刻 $t$ における図(動くものだけ)を定義する。時刻は単なる媒介変数であるので,$t$ でなく $s$ などでもよい。 +\begin{verbatim} + Mf(t):=( + pt=2*[cos(t),sin(t)]; + Listplot("2",[[4,0],pt]); + Pointdata("2",mid(pt,[4,0])); + Letter([[4,0],"s","A",pt,"en","P",mid(pt,[4,0]),"ne","Q"]); + ); +\end{verbatim} +ここで,\verb|Mf(t)| の中で使っているユーザー定義関数\verb|mid()| は,端点を引数として線分の中点を返すもので,\\ + \verb|mid(p1,p2):=(p1+p2)/2;|\\ +として定義しておく。\\ +また,点の大きさを適宜設定しておく。\\ +以上の準備の後,\\ + \verb|Moviedata("Mf(t)","t=[0,2*pi]");|\\ +を実行する。\\ +ここでは,角度を媒介変数としているので,時間の$t$ でなく$s$ として\\ + \verb|Moviedata("Mf(s)","s=[0,2*pi]");|\\ +としてもよい。\\ +次のようにオプションを指定すると,5秒間のアニメーションとなる。\\ + \verb|Moviedata("Mf(s)","s=[0,2*pi]",["Div=50","Cut=10"]);|\\ +\verb|["Div=150","Cut=30"]|とすると,やはり5秒間のアニメーションとなるが,1秒間のフレーム数が多いためなめらかな動きとなる。ビデオのフレームレートである。ただし,ファイルサイズは約3倍となる。\\ +Cinderellaの画面は次のようになる。\\ + \\ + \includegraphics[bb=0 0 1054 706 , width=8cm]{Figmv/moviedata01.png}\\ + \\ +TexMvボタン または TexParaボタンを押すと画面上でもアニメーションが実行される。その後 Exekc ボタンを押すとファイルが作成される。 + +この図では,点が明示されるのは Q だけである。A,Pとも点を明示する場合のスクリプトの全体を示しておく。 +\begin{verbatim} + Fhead="mid"; + Texparent=""; + Ketinit(); + Ketinitmv(); + mid(p1,p2):=(p1+p2)/2; + Circledata("1",[[0,0],[2,0]]); + Ptsize(4); + Pointdata("1",[4,0]); + Mf(t):=( + pt=2*[cos(t),sin(t)]; + Listplot("2",[[4,0],pt]); + Pointdata("2",pt); + Pointdata("3",mid(pt,[4,0])); + Letter([[4,0],"s","A",pt,"en","P",mid(pt,[4,0]),"ne","Q"]); + ); + Moviedata("Mf(s)","s=[0,2*pi]",["Div=30","Cut=10"]); + Mvdispg(); +\end{verbatim} +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +\newpage + + +%== 3D =============== +\section{\ketcindy 3D} +\subsection{概要} +\ketcindy 3Dの画面は次のように構成される。 + +Cinderellaの描画面に,白の矩形で囲んだ領域が2つできる。NE,SWを対角とする左側の領域を主画面,右側の領域を副画面という。\\ + + \includegraphics[bb=0 0 1776 998 , width=8cm]{Fig3d/3dstart.png}\\ + +主画面は平面の場合と同様,TeXに出力される範囲を示し,NE,SWの2点をドラッグすることにより変更できる。 + +副画面は,Start3d() 関数により作成される。座標軸は,Xyzax3data() 関数によって描くことができる。主画面の下方のスライダで視点が移動でき,主画面上では軸が回転する。副画面は,xy平面上に視点を置いたものと考えればよい。 + +主画面上にCinderellaの作図ツールで点や線分を作図すると,Start3d() 関数により副画面に対応する点が作図される。主画面上の点をドラッグするとx,y座標を変更でき,副画面上の点をドラッグするとz座標を変更できる。空間内の点は,Putpoint3d()関数によって座標を指定して作成することもできる。次のような図はCinderellaの作図ツールだけでも作ることができるし,Putpoint3d()関数を用いても作ることができる。\\ + + \includegraphics[bb=0 0 1892 840 , width=10cm]{Fig3d/3dscreen.png}\\ + +主画面と副画面の対応する点をドラッグすることにより,インタラクティブに図形を描くことができるが、実際には描画関数を用いて図形を描き,スライダで視点を変えて見やすい図をTeXに出力することになるだろう。 + +KeTCindy3Dでは,点・直線・曲線・面の描画を描画関数を用いて行うことができる。線や面については陰線処理を行い,立体的な図を作成することができる。しかし,陰線処理は処理にかなりの時間がかかるので,CindyscriptではなくScilabで行っているが,それでも相当時間がかかることを覚悟しなければならない。Scilabでの計算は,バッチファイル/シェルファイルで行っているが,Cindyscriptではその計算結果が出るのを待つため一時的に反応がなくなる。したがって,反応がなくなってもハングアップではないので,Cinderellaを強制終了しないように。 + +一例を示すと,球面をメッシュ入りで座標軸とともに陰線処理して描いた場合,次のような図が画面に表示されるまでの時間は,MacBookPro13' (Late 2013) Core i7 2.8GHz 8GB (OSX 10.11.6) の場合で約124秒であった。スクリプトは \hyperlink{wireparadata}{Wireparadata() } の例を参照されたい。\\ + \input{Fig3d/wirepara4} + +\newpage +\subsection{設定・定義} + +\begin{description} + +\hypertarget{ketinit3d}{} +\item[関数] Ketinit3d() +\item[機能] KeTCindy3Dの使用宣言 +\item[説明] Cinderellaの画面を3Dモードにする。\\ + Cinderellaの描画面に,視点移動のための2つのスライダを作る。スライダは初期位置が左端になる。\\ + KeTCindyの使用宣言 Ketinit() とともに用いるが,この関数は一度だけ実行すればよいので,通常は Initialization スロットに置く。Ketinit() も,平面の場合と異なり Initialization スロットに置けばよい。ただし,平面の関数を多用する場合は,Ketinit() は Drawスロットに書いておく。場合によって変数の初期化などが必要なためである。KeTCindy3Dにおける変数の初期化などは,Start3d()で行われる。\\ + \\ + +\hypertarget{start3d}{} +\item[関数] Start3d() +\item[機能] 3Dの画面設定と空間点の認識 +\item[説明] 副画面を作り,幾何点を3Dの点として認識する。この関数は必須で,Drawスロットのはじめの方に置く。\\ + Cinderellaの作図ツールで,点・線分を作図すると,内部関数の Ptseg3data() によってそれらを空間の点として認識し,副画面上に対応する点をとる。ただし,始めはz座標を0とする。点の名前がAであれば,副画面上の点はAzとなる。点をポイントして選択すると副画面の上に座標が表示される。\\ + 作図した点の名称をインスペクタで変更した場合,新しい名称に対応する点を副画面上に作成するが,以前の点は消えないので要注意。たとえば,点Aを作図した後,主画面上の点Aをインスペクタで点Dに変えた場合,副画面上に新たにDzができるが,以前のAzも残る。残ったAzは,選択しておいて作図ツールの消去ボタン \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/delete.png}で消すことができる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +\newpage +\subsection{描画} +\begin{description} + +\hypertarget{bezier3d}{} +\item[関数] Bezier3d(name,リスト1,リスト2) +\item[機能] 空間ベジェ曲線を描く +\item[説明] 引数はリスト1が端点リスト,リスト2が制御点リスト\\ + 1組の端点につき,2つの制御点を使う。\\ + \\ +【例】いくつかの点をベジェ曲線で結ぶ\\ + 端点A,Bに対し,制御点をD,Eとする。\\ + \verb|Bezier3d("1",["A","B"],["D","E"]);| \\ + 端点A,Bに対し,制御点をD,Eとし,端点BCに対し制御点をE,Fとする。\\ + \verb|Bezier3d("1",["A","B","C"],["D","E","E","F"]);|\\ + 端点A,Bに対し,制御点をD,Eとし,端点BCに対し制御点をF,Gとする。(図)\\ + \verb|Bezier3d("1",["A","B","C"],["D","E","F","G"]);|\\ + \input{Fig3d/bezier3d1} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{changstyle3d}{} +\item[関数] Changstyle3d(リスト,リスト) +\item[機能] 3Dプロットデータの属性を変更 +\item[説明] 第1引数のプロットデータの属性を,第2引数に変更する。\\ +たとえば,補助線など,画面には描いてもTeXに書き出さない線を描画するときは,optionに["notex"] をつけるが,これをあとから付加したい場合に利用する。プロットデータはリストにできるので,複数のプロットデータの属性をまとめて変更することができて便利である。\\ + \\ +【例】4つの点で四面体の辺を描き,まとめて notex にする。点A,B,C,Dはとってあるものとする。 +\begin{verbatim} + Spaceline("1",[A,B]); + Spaceline("2",[A,C]); + Spaceline("3",[B,C]); + Spaceline("4",[A,D]); + Spaceline("5",[B,D]); + Spaceline("6",[C,D]); + edges=apply(1..6,"sl3d"+text(#)); + Changestyle3d(edges,["notex"]); +\end{verbatim} + +\hypertarget{concatobj}{} +\item[関数] Concatobj(リスト,option) +\item[機能] いくつかのobjデータを結合する +\item[説明] 多面体の各面の頂点リストから面データ(頂点リストと面リスト)を作る。\\ + \\ +【例】4点A,B,C,Dを頂点とする四面体を描く。\\ + 四面体は4つの面からなっている。頂点をA,B,C,Dとすると,4つの面は\\ + △ABC,△ABD,△ACD,△BCD\\ + である。\\ + \input{Fig3d/concatobj}\\ + そこで\\ + \verb|Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]);|\\ + とすると,面データ [[A,B,C,D],[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]] が返される。\\ + この面データを使って四面体を描くことができる。コード例は,\hyperlink{vertexedgeface}{VertexEdgeFace()} を参照のこと。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{crvsfparadata}{} +\item[関数] Crvsfparadata(name,PD1,PD2,式,options1,options2) +\item[機能] 曲線の曲面による陰線処理 +\item[説明] 曲線PD1を表示するにあたり,曲面PD2によって隠れる部分を非表示にする。\\ +通常は曲面PD2も表示するので,Sfbdparadata() も同時に用いることになる。曲面を表示しなければ,曲線だけが陰線処理された状態で表示される。\\ +第4引数の式は,PD2を描くための式。\\ +options1 には"r","m", "Wait=n" が指定できる。Wait の初期値は20\\ + "r","m"に関しては,オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ +options2 には 軸の陰線の表示について "nodisp" または線種が指定できる。デフォルトは "nodisp"。\\ +options2だけを指定したい場合は,options1 を空リスト [ ] にする。\\ + \\ +【例】回転放物面と座標軸,線分を描く。\\ +デフォルトでは陰線は非表示である。(下図左) +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); + Putpoint3d(["A",[0,-3,0],"B",[0,3,3]],"fix"); + Spaceline([A,B]); + fd=["z=4-(x^2+y^2)","x=R*cos(T)","y=R*sin(T)","R=[0,2]","T=[0,2*pi]","e"]; + Sfbdparadata("1",fd); + Crvsfparadata("1","AB3d","sfbd3d1",fd); + Crvsfparadata("2","ax3d","sfbd3d1",fd); +\end{verbatim} +options2に線種指定 ["do"] をつけると,陰線は点線で表示される。(下図右) +\begin{verbatim} +Sfbdparadata("1",fd,[],["do"]); +Crvsfparadata("1","AB3d","sfbd3d1",fd,[],["do"]); +Crvsfparadata("2","ax3d","sfbd3d1",fd,[],["do"]); +\end{verbatim} + + \input{Fig3d/crvsfparadata1} \input{Fig3d/crvsfparadata2} + \\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{datalist}{} +\item[関数] Datalist2d() +\item[機能] 画面上のプロットデータのリストを取得する +\item[説明] 画面に描かれているすべてのプロットデータのリストを返す。\\ +空間図形は,Cinderellaの画面上に射影し表示する。そのため,KeTCindy3Dは,空間におけるプロットデータと,画面上に表示するプロットデータの2つを作っている。Datalist2d()では,画面上に表示するプロットデータのリストを返す。\\ + \\ +【例】 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); + Putpoint3d(["A",[0,-3,0],"B",[0,3,3]],"fix"); + Spaceline([A,B]); + println("PD="+Datalist2d()); +\end{verbatim} +とすると,コンソールに PD=[ax2d,AB2d] と表示される。ax2dは座標軸のプロットデータ ax3d に,AB2d は線分ABのプロットデータ AB3d に対応している。\\ + \\ + +\hypertarget{datalist}{} +\item[関数] Datalist3d() +\item[機能] 空間のプロットデータのリストを取得する +\item[説明] 空間に描かれているすべてのプロットデータのリストを返す\\ + \\ +【例】 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); + Putpoint3d(["A",[0,-3,0],"B",[0,3,3]],"fix"); + Spaceline([A,B]); + println("PD="+Datalist3d()); +\end{verbatim} +とすると,コンソールに PD=[ax3d,AB3d] と表示される。\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{dist3d}{} +\item[関数] Dist3d(a1,a2) +\item[機能] 空間の2点間の距離を返す +\item[説明] 引数a1,a2 は作図点の名称,空間点の名称のいずれでもよい。\\ +次の3通りの記法は同じ結果を返す。混在も可 +\begin{verbatim} + Dist3d("A","B"); + Dist3d(A,B); + Dist3d(A3d,B3d); +\end{verbatim} + \\ + +\hypertarget{drawpoint3d}{} +\item[関数] Drawpoint3d(座標) +\item[機能] 空間点を描く +\item[説明] 引数で与えた空間座標の点を描く。この点は幾何点ではない。また,TeX にも出力されない。幾何点にするには \hyperlink{putpoint3d}{Putpoint3d()} と用いる。TeXに点を出力するには,\hyperlink{pointdata}{Pointdata()} または \hyperlink{drwpt}{Drawpoint()} を用いる。\\ +引数は,座標のリストにすることもできる。\\ + \\ +【例】 +\begin{verbatim} + Drawpoint3d([1,1,1]); + Drawpoint3d([[1,1,1],[0,1,0]]); +\end{verbatim} + \\ + +\hypertarget{embed}{} +\item[関数] Embed(name,PDリスト,式,変数リスト) +\item[機能] 2D図形の空間内平面へ埋め込む +\item[説明] 第2引数は2Dの図形のプロットデータのリスト,式と変数は平面を記述する式と変数。平面は原点$vo$と2つの基本ベクトル $\overrightarrow{vx},\overrightarrow{vy}$を用いて,$vo+x \cdot \overrightarrow{vx}+y \cdot \overrightarrow{vy}$ の形で表すことができる。変数(基本ベクトルの係数)は$x,y$ でなく,$s,t$ でもよい。式,変数リストともに文字列にする。また,基本ベクトルは直交していなくてもよいし,長さが異なってもよいが,縦横同じスケールの直交座標系にするのがわかりやすいだろう。\\ + \\ +【例】正三角形と外接円を空間内の平面に埋め込む +\begin{verbatim} + Xyzax3data("","x=[-5,4]","y=[-10,4]","z=[-5,5]",["a","O"]); + Spaceline("1",[[3,0,0],[3,6,0],[3,6,6],[3,0,6],[3,0,0]]); + Defvar("vo=[3,3,3]"); + Defvar("vx=[0,1,0]"); + Defvar("vy=[0,0,1]"); + Putpoint3d(["A",[3,3,3]],"fix"); + Circledata("1",[[0,0],[2,0]],["nodisp"]); + Listplot("1",[[0,2],[-sqrt(3),-1],[sqrt(3),-1],[0,2]],["nodisp"]); + Embed("1",["cr1","sg1"],"vo+x*vx+y*vy","[x,y]"); + Ptsize(3); + Drawpoint(A); +\end{verbatim} + \input{Fig3d/embed01} + + ここで,Embed()で引き渡す vo,vx,vy については,Scilabでの変数定義が必要なので(KeTCindyでは行わない)Defvar() によって定義をしている。 +原点,基本ベクトルを,点を作図して次のようにすることもできる。この場合は Defvar() は不要。 +\begin{verbatim} + Putpoint3d(["A",[3,3,3],"B",[0,1,0],"C",[0,0,1]],"fix"); + Embed("1",["cr1","sg1"],"A3d+x*B3d+y*C3d","[x,y]"); +\end{verbatim} + \includegraphics[bb=0 0 954 766 , width=6cm]{Fig3d/embed03.png}\\ + +この場合,点B,Cの座標がそのまま基本ベクトルとなっているが,原点Aに対して描画平面上にはB,Cがないので図がわかりにくい。図をわかりやすくするならば次のようにする。 +\begin{verbatim} + Putpoint3d(["A",[3,3,3],"B",[3,4,3],"C",[3,3,4]],"fix"); + Embed("1",["cr1","sg1"],"A3d+x*(B3d-A3d)+y*(C3d-A3d)","[x,y]"); +\end{verbatim} + + また,平面を記述するのに,平面の原点と法線ベクトルを用いて Perpplane() を用いると,基本ベクトルが生成されるので、これを利用することができる。次のスクリプトでは,Skeletonparadata() を用いて陰線処理もしている。 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-8,5]","z=[-5,5]"); + Putpoint3d(["O",[0,0,0],"P",[1,1,2]],"fix"); + Perpplane("E-F","P",P3d-O3d,"put"); + vec1=3*(E3d-P3d); + vec2=3*(F3d-P3d); + Putpoint3d(["A",P3d+vec1+vec2],"fix"); + Putpoint3d(["B",P3d+vec1-vec2],"fix"); + Putpoint3d(["C",P3d-vec1-vec2],"fix"); + Putpoint3d(["D",P3d-vec1+vec2],"fix"); + Spaceline([A,B,C,D,A]); + Circledata("1",[[0,0],[2,0]],["nodisp"]); + Listplot("1",[[0,2],[-sqrt(3),-1],[sqrt(3),-1],[0,2]],["nodisp"]); + Embed("1",["cr1","sg1"],"P3d+x*(E3d-P3d)+y*(F3d-P3d)","[x,y]"); + Ptsize(3); + Drawpoint(P); + Skeletonparadata("1"); +\end{verbatim} + \input{Fig3d/embed02} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\hypertarget{intersectcrvsf}{} +\item[関数] Intersectcrvsf(name,PD,式) +\item[機能] 曲線と曲面の交点の座標を求める +\item[説明] PDは曲線のプロットデータ。式は曲面の式。\\ + \\ +【例】回転放物面と線分の交点の座標を表示する。曲面は表示されていなくてもよい。 +\begin{verbatim} +Putpoint3d(["A",[0,-3,0],"B",[0,3,2]],"fix"); +Spaceline([A,B]); +fd=["z=4-(x^2+y^2)","x=R*cos(T)","y=R*sin(T)","R=[0,2]","T=[0,2*pi]","e"]; +println("Intersect="+Intersectcrvsf("1","AB3d",fd)); +\end{verbatim} +実行すると,コンソールに\\ + \verb|Intersect=[[0,-1.91,0.36,1.18],[0,1.57,1.52,1.76]] | +と表示される。\\ + +\hypertarget{intersectsgpL}{} +\item[関数] IntersectsgpL(点名,線分,面,描画方法) +\item[機能] 空間の線分と平面の交点を作図する +\item[説明] 引数の線分は線分の端点を "A-B" の形もしくは座標のリスト形で与える。\\ + 引数の面は,面内の3点を "C-D-E" の形もしくは座標のリストで与える。\\ + 描画方法は,"put" または "draw" で,描画方法を指定しない場合は "draw" と同じ。"draw"では交点が緑の点で表示されるだけで,幾何点はできない。"put" では幾何点を作る。\\ + \\ +【例】座標のリストで与える記述例\\ + \verb|IntersectsgpL("P",[p1,p2],[p3,p4,p5],"draw");| \\ + \\ +【例】立方体を平面で切った図を描く。\\ + いろいろな手順が考えられるが,ここでは次の手順で描く。\\ + (1) 立方体の頂点をとる。1辺の長さをHnとする。\\ + ここでは軸上の点はPutaxes3d()でとる。\\ +(2) 切断面を決める点E,F,Gを辺上の自由点としてPutonseg3d()でとる。\\ +(3) E,F,Gを通る平面と,辺AC,DYとの交点をとり,M,Nとする。\\ +(4) 全体を多面体として面データを作って描画する。 +\begin{verbatim} + Hn=3; + Putaxes3d(Hn); + Putpoint3d("A",[Hn,Hn,0],"fix"); + Putpoint3d("B",[Hn,0,Hn],"fix"); + Putpoint3d("C",[Hn,Hn,Hn],"fix"); + Putpoint3d("D",[0,Hn,Hn],"fix"); + Putonseg3d("E",X,B); + Putonseg3d("F",Z,B); + Putonseg3d("G",Z,D); + IntersectsgpL("M","A-C","E-F-G","put"); + IntersectsgpL("N","D-Y","E-F-G","put"); + phd=Concatobj([[O,X,A,Y],[X,A,M,E],[A,Y,N,M],[Y,N,G,Z,O], + [O,Z,F,E,X],[Z,F,G],[E,M,N,G,F]]); + VertexEdgeFace("1",phd,["Edg=nogeo"]); + Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} +Cinderellaの描画面はつぎのようになる。点E,F,Gをドラッグして,適当な位置の断面にできる。ただし,M,Nは辺上にあることが条件である。 +\\ + \\ +\includegraphics[bb=0 0 1426 654 , width=12cm]{Fig3d/IntersectsgpL0.png}\\ + +できた図は下図左。これに,次のスクリプトを追加すれば,断面上方の立方体の各辺も点線で描かれる。(下図右) +\begin{verbatim} + Spaceline([E,B,F],["do"]); + Spaceline([B,C,M],["do"]); + Spaceline([C,D,N],["do"]); + Spaceline([D,G],["do"]); +\end{verbatim} +\input{Fig3d/IntersectsgpL1} \input{Fig3d/IntersectsgpL2} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{invparapt}{} +\item[関数] Invparapt(座標,PD) +\item[機能] 描画面上の座標に対応する曲線上の点の座標を返す +\item[説明] Cinderellaの描画面上の座標を与えて,それに対応する曲線上の3次元座標を返す。 +\\ +空間内の曲線を作図すると,曲線の空間内のプロットデータとともに,描画面上に描くためのプロットデータも作られる。これを利用すると,描画面上の位置から曲線上の座標を求めることができる。\\ + \\ +【例】螺旋と線分を描いたとき,描画面上での交点(空間内の交点ではない)に対応する螺旋上の点の座標を求め部分曲線を描く。\\ +\begin{verbatim} + Spaceline("1",[[-1,-1,-1],[1,2,3]]); + Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["do"]); + tmp=Intersectcrvs("sl2d1","sc2d1"); + p1=Invparapt(tmp_1,"sc3d1"); + p2=Invparapt(tmp_2,"sc3d1"); + Partcrv3d("1",p1,p2,"sc3d1"); +\end{verbatim} + \input{Fig3d/invparapt}\\ +ここで,sl2d1,sc2d1 は線分と螺旋の描画面上での(平面の)プロットデータである。Intersectcrvs() で平面上の交点の座標(複数あるのでリストが返る)を求め,Invparapt() で対応する螺旋上の点の座標を求めて部分曲線を描いている。実際に交わる点での部分曲線ではないことに注意。\\ + \\ + +\hypertarget{mkbezierptcrv3d}{} +\item[関数] Mkbezierptcrv3d(点リスト) +\item[機能] 制御点を自動的にとる空間ベジェ曲線 +\item[説明] リストで与えた点に対し,制御点を自動的に生成してベジェ曲線を描く。\\ + 制御点は,2つの点に対して,その点を端点とする線分上に2つ作られる。これを適宜移動して任意の曲線にすることができる。\hyperlink{bezier3d}{空間ベジェ曲線 Bezier3d()} を参照のこと。\\ + \\ +【例】\verb|Mkbezierptcrv3d(["A","B","C","D"]);|\\ + 線分AB上に2点a1p,a2p,線分BC上に2点a2p,a2q,線分CD上に2点a3p,a3qができる。\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{nohiddenbyfaces}{} +\item[関数] Nohiddenbyfaces(name,PD1,PD2,option1,option2) +\item[機能] 面に対し曲線を陰線処理する +\item[説明] PD2で与えられた面に対し,曲線PD1の面に隠れている部分を陰線処理する。\\ +引数PD1を省略するとすべての曲線が対象となる。陰線処理された線は初期設定では点線で表される。この線種はoption2で変更できる。たとえば,["da"] とすると破線になる。option1は曲線全体のoptionであるので,option2 だけを指定する場合は,option1 として空リスト[ ] が必要である。\\ + \\ +【例】座標平面上に正四面体を描き,各軸と正四面体の辺を陰線処理する。(下図左) +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); +Putpoint3d("A",2*[-1,-1/sqrt(3),0],"fix"); +Putpoint3d("B",2*[1,-1/sqrt(3),0],"fix"); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0],"fix"); +Putpoint3d("D",2*[0,0,sqrt(3)],"fix"); +phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); +VertexEdgeFace("1",phd,["Edg=nogeo"]); +Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} + + \verb|VertexEdgeFace("1",phd,["Edg=nogeo"]);| によって,辺,頂点,面のプロットデータが作られる。\verb|phf3d1| は,面のプロットデータである。\\ + ここで,\verb|Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["da"]); | とすると,座標軸は陰線処理されず,正四面体の辺(\verb|phe3d1|)だけが陰線処理されて破線で描かれる。四面体は太く描かれる。(下図右)\\ + \\ + \input{Fig3d/nohiddenbyfaces1} \input{Fig3d/nohiddenbyfaces2}\\ +同様に,\\ + \verb|Nohiddenbyfaces("1","ax3d","phf3d1",[],["da"]);|\\ +とすれば,座標軸だけが陰線処理されて破線で描かれる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{parapt}{} +\item[関数] Parapt(座標) +\item[機能] 点の投影面での座標 +\item[説明] 引数の空間座標に対応するCinderellaの描画面の座標を返す。\\ + \\ +【例】\verb|Parapt([2,1,5]);| により,点(2,1,5) が表示されている描画面の座標,たとえば [-0.52,3.27] が返される。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{perpplane}{} +\item[関数] Perpplane(点名,点,ベクトル,option) +\item[機能] 点を通り線分に垂直な平面上に基準点を2つとる +\item[説明] 引数の点名は,作成する2点で "A-B" の形\\ + 第2引数は通る点の名称または座標\\ + 第3引数は法線ベクトル\\ + optionは "put" で,2つの幾何点を作図する。optionがない場合は幾何点は作らず,無名の点のみを表示する。put以外の文字列を書いたときは無効な命令とし,何も作成されない。\\ + 記述例を示すと\\ + \verb|Perpplane("A-B","P",[1,1,1],"put");|\\ + 点Pを通り,法線ベクトル(1,1,1)に垂直な平面上に点A,Bをとる。\\ + \verb|Perpplane("A-B","P",P3d-O3d);|\\ + 点Pを通り,線分OPに垂直な平面上に点A,Bをとる。\\ + これらにおいて,PAとPBは垂直で,PA=PB=1 となる。\\ + \\ +【例】ベクトル $\vec{p}=(1,1,1)$ に垂直で点$(1,1,1)$を通る平面を描く。 +\begin{verbatim} + Putaxes3d(2); + Putpoint3d(["P",[1,1,1]],"fix"); + Ptseg3data(); + Perpplane("E-F","P",P3d-O3d,"put"); + vec1=2*(E3d-P3d); + vec2=2*(F3d-P3d); + Putpoint3d(["A",P3d+vec1+vec2],"fix"); + Putpoint3d(["B",P3d+vec1-vec2],"fix"); + Putpoint3d(["C",P3d-vec1-vec2],"fix"); + Putpoint3d(["D",P3d-vec1+vec2],"fix"); + Spaceline([A,B,C,D,A]); + Letter([P,"w","P",A,"ne","A",B,"e","B",C,"ws","C",D,"nw","D",]); + Skeletonparadata("1"); +\end{verbatim} + \input{Fig3d/perpplane} +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + \\ + +\hypertarget{perppt}{} +\item[関数] Perppt(点名,点,点リスト,option) +\item[機能] 平面に下ろした垂線の足を求める +\item[説明] 第2引数の点から,第3引数の点リストで決まる平面に下した垂線の足を,第1引数の名前の点とする。\\ +オプションは次の通り。デフォルトは "draw"\\ + draw:点を打つ。幾何点は作らない\\ + put :幾何点を作る\\ + none:計算だけ行い,点は作図しない。\\ + \\ +【例】原点から点ABCを通る平面に下した垂線の足Hの座標を求める。\\ + \verb|Perppt("H","O","A-B-C","none");| 表示はされない。\\ + \verb|Perppt("N","O","A-B-C");| Hの位置に緑色の点が表示される。\\ + \verb|Perppt("N","O","A-B-C","put");| 幾何点Hが作図される。\\ + いずれの場合も,Hの座標は変数H3d に代入される\\ + \\ +作図例 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); + Putpoint3d("O",[0,0,0],"fix"); + Putpoint3d("A",[3,0,0],"fix"); + Putpoint3d("B",[0,3,0],"fix"); + Putpoint3d("C",[0,0,3],"fix"); + Perppt("H","O","A-B-C","put"); + Spaceline([A,B,C,A]); + Spaceline([O,H]); + Letter([A,"nw","A",B,"ne","B",C,"ne","C",O,"nw","O",H,"ne","H"]); +\end{verbatim} + \\ + \input{Fig3d/perppt} + \\ + +\hypertarget{partcrv3d}{} +\item[関数] Partcrv3d(name,始点,終点,PD) +\item[機能] 部分曲線のプロットデータを作成する +\item[説明] 曲線PDにおいて,始点から終点までのプロットデータを作成する。\\ +始点と終点は,プロットデータの番号もしくは曲線上にとった点の識別名で示す。\\ + +【例】螺旋を描き,CからDまでの部分を太くする。PutonCurve3d() で螺旋上に点C,Dをとり,ドラッグして適当な位置に移動する。 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); + Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["Num=100"]); + PutonCurve3d("C","sc3d1"); + PutonCurve3d("D","sc3d1"); + Partcrv3d("1",C,D,"sc3d1",["dr,3"]); + Letter([C,"n2","C",D,"n2","D"]); +\end{verbatim} + ここで,\verb|"sc3d1"| は,螺旋のプロットデータ,\verb|"part3d1"| は,部分曲線のプロットデータである。\\ + \input{Fig3d/partcrv3d1}\\ + \\ +【例】稲妻状の螺旋を点線で描き,その一部を実線にする。位置はプロットデータの番号で示す。小数にすると曲線を分割している線分の途中の位置になる。 +\begin{verbatim} +Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["Num=10","do"]); +Partcrv3d("1",3.3,8.5,"sc3d1"); +\end{verbatim} + \input{Fig3d/partcrv3d2}\\ + +\hypertarget{phparadata}{} +\item[関数] Phparadata(name,name2,options) +\item[機能] 多面体を陰線処理して描く +\item[説明] 多面体を陰線処理して描く。多面体は面データ(頂点リストと面リスト)を与えて,VertexEdgeFace() でプロットデータを作る。このプロットデータに対し,隠れている面(辺)を非表示にして表示する。第1引数は通常のname,第2引数のname2は,VertexEdgeFace() で与えたnameと同じものとする。\\ + optionsは,全体の線種("dr,2"など)と,陰線の線種を"Hidden=線種" で指定できる。デフォルトでは陰線は表示しない。\\ + \\ +【例】小林・鈴木・三谷による多面体データ polyhedrons obj から,s06の切頂二十面体(サッカーボール型)を描く。 +\begin{verbatim} + Setdirectory( Dirhead+"/data/polyhedrons_obj"); + phd=Readobj("s06.obj",["size=3"]); + Setdirectory(Dirwork); + VertexEdgeFace("s06",phd,["Edg=nogeo"]); + Phparadata("1","s06"); +\end{verbatim} + VertexEdgeFace() の name は通常の "1" でもよい。その場合は,\verb|Phparadata("1","1");| とするが,わかりにくいので上のようにした。\\ + 実行すると,Cinderellaの描画面は次のように頂点だけが描かれる。\\ + \\ + \includegraphics[bb=0 0 1452 730 , width=12cm]{Fig3d/phparadata01.png}\\ + \\ +「Texview」「Exekc」ボタンを押すと陰線処理したデータがFhead.txt に書き出され,これを用いてFhead.texが作成される。そのため,Exekcボタンを押してから処理が完了するまでにかなり時間がかかる。(下図左)\\ + なお,もう一度実行すると,こんどは,Fhead.txt ができているために,これを読み込んでCinderellaの画面でも陰線処理された図が描かれる。\\ + 全体の線種と,陰線の線種を\\ + \verb|Phparadata("1","s05",["dr,2","Hidden=do"]);|\\ +で指定したのが下図右である。\\ + + \input{Fig3d/phparadata02} \input{Fig3d/phparadata03}\\ + +【注意】\\ + polyhedrons obj のデータを使って,続けて異なる多面体を描きたい場合は注意が必要である。Readobj()だけを変更して別のデータを読めばよさそうであるが,VertexEdgeFace() のname も(したがって,Phparadata()の第2引数も)書き換えないと,前のデータが残っていてうまくいかない。たとえば,上のコードで切頂十二面体を描いた後,正八面体(r02)を描こうとするならば, +\begin{verbatim} + Setdirectory( Dirhead+"/data/polyhedrons_obj"); + phd=Readobj("r02.obj",["size=3"]); + Setdirectory(Dirwork); + VertexEdgeFace("2",phd,["Edg=nogeo"]); + Phparadata("1","2"); +\end{verbatim} + のようにする。\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{projcoordpara}{} +\item[関数] Projcoordpara(座標) +\item[機能] 投影座標を求める +\item[説明] 空間座標を投影した座標を求める。\\ + 戻り値の第1,第2要素はCinderellaの描画面のx,y座標。第3要素はxy平面に垂直なzの座標で.投影面からの(符号付)距離を表す。\\ + \\ +【例】\verb|Projcoordpara([3,1,2]);|\\ + 戻り値は [-0.65,1.7,3.27] となる。\\ + + +\hypertarget{putaxes3d}{} +\item[関数] Putaxes3d([x,y,z]) +\item[機能] 軸上に幾何点を作る。 +\item[説明] 引数のリスト [x,y,z] に対し,点X(x,0,0) ,Y(0,y,0) , Z(0,0,z) および 原点Oを主画面上にとり,副画面上に対応する点Xz,Yz,Zz,Oz を作る。すでに同じ名称の点がある場合は,指定された位置に移動する。\\ + 引数は,実数にすることもでき,Putaxes3d(a) は,Putaxes3d([a,a,a]) と同じになる。\\ +【例】Putaxes3d(5); 原点と,$x(5,0,0),y(0,5,0),z(0,0,5)$ を作る。\\ + Putaxes3d([1,2,3]); 原点と,$x(1,0,0),y(0,2,0),z(0,0,3)$ を作る。\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{putonCurve3d}{} +\item[関数] PutonCurve3d(点名,PD) +\item[機能] 空間曲線上に点をとる +\item[説明] プロットデータPDの曲線上に,点名の点をとる。\\ + とった点は固定点ではなく,曲線上にインシデントとなる。したがって,ドラッグして曲線上を動かすことができる。例は \hyperlink{partcrv3d}{Partcrv3d()} を参照のこと。\\ + \\ + +\hypertarget{putonseg3d}{} +\item[関数] Putonseg3d(点名,点1,点2) +\item[機能] 線分上に点を取る +\item[説明] 点1と点2の中点に,指定された名前の点を取る。点1と点2が線分として結ばれていなくてもよい。とった点は線分にインシデントとなる(線分が描かれていなくても)。点1と点2はリストにすることもできる。\\ + \\ +【例】AとBの中点に点Cをとる。つぎのいずれでもよい。\\ + \verb|Putonseg3d("C",A,B);|\\ + \verb|Putonseg3d("C",[A,B]);|\\ + \\ + +\hypertarget{putpoint3d}{} +\item[関数] Putpoint3d(リスト,option) +\item[機能] 空間に幾何点を作図する +\item[説明] 点の名称と座標を与えて点を作図する。複数の点を一度に作図できる。\\ + optionは,"fix" または "free" (デフォルト)。\\ + "fix" をつけると,固定点(ドラッグで移動できない点)とする。同じ名称の点がすでに存在する場合は,指定した位置に移動して固定点とする。\\ + "free" をつけると,自由点(ドラッグで移動できる)とする。同じ名称の点がすでに存在する場合はなにもしない。\\ + \\ +【例】いくつか記述例を示す。\\ + \verb|Putpoint3d(["A",[2,1,3]]);|\\ + \verb|Putpoint3d(["A",[1,1,1],"C",[1,0,1]],"fix");|\\ + \verb|Putpoint3d(["A",[2,1,3]],"free");|\\ + \\ + なお,この関数は幾何点を作るものであり,TeXには出力されない。TeXに点を出力するには,\hyperlink{pointdata}{Pointdata()} または \hyperlink{drwpt}{Drawpoint()}を併用する。\\ + 空間における点の座標は,点名に"3d"を付加した名前の変数に代入される。たとえば,点Aの座標はA3dである。これにより,点の座標を取得できる。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{readobj}{} +\item[関数] Readobj(ファイル名) +\item[機能] objファイルを読み込む. +\item[説明] 小林・鈴木・三谷による多面体データ polyhedrons\_obj を読み込む。\\ +オプションは ["size=n"] で,n倍したデータにする。負の数にすると上下が反転される。\\ +データはKeTCindyのdataフォルダの中にある。したがって,次のようなスクリプトを書く。読み込むのは一度だけなので, Draw スロットではなくInitialization スロットに置けばよいが,コードの可読性を高めるには Draw スロットでもよい。 +\begin{verbatim} + Setdirectory( Dirhead+"/data/polyhedrons_obj"); + polydt=Readobj("r02.obj"); + Setdirectory(Dirwork); +\end{verbatim} +これで,r02.obj データが,変数 polydt に代入される。\\ +この多面体データは,頂点リストと面リストからなっているが,頂点リストは座標のリストなので,読み込んで表示するときには,点の名称を v1,v2,・・・ とする。\\ +読み込んだあとの使い方を含めて例を示す。\\ + +【例】正八面体を描く +\begin{verbatim} + Setdirectory( Dirhead+"/data/polyhedrons_obj"); + polydt=Readobj("r02.obj",["size=2"]); + Setdirectory(Dirwork); + VertexEdgeFace("1",polydt,["Edg=nogeo"]); + Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} + \input{Fig3d/readobj} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{reflectpoint3d}{} +\item[関数] Reflectpoint3d(座標,リスト) +\item[機能] 点の鏡映点を求める +\item[説明] 第2引数のタイプにより,点に関する鏡映,直線に関する鏡映,面に関する鏡映のそれぞれの点の座標を返す。\\ + \\ +【例】点A,B,C,Dを空間にとり,点Aの鏡映点の座標を求める。\\ + 点Bに関する鏡映点 \verb|Reflectpoint3d(A3d,[B3d]);|\\ + 直線BCに関する鏡映点 \verb|Reflectpoint3d(A3d,[B3d,C3d]);|\\ + 平面BCDに関する鏡映点 \verb|Reflectpoint3d(A3d,[B3d,C3d,D3d]);|\\ + +\hypertarget{rotate3pt}{} +\item[関数] Rotate3pt(座標,vec,角度,中心点) +\item[機能] 点を回転する +\item[説明] 第1引数の座標の点を回転する。vecは回転軸の方向ベクトル。中心点は方向ベクトルの始点。第4引数を省略した場合は原点とする。\\ + \\ +【例】点Aを(0,-1,0) に置いたときの記述例と結果(戻り値)\\ + \verb|Rotate3pt(A3d,[0,0,1],pi/2)|; 戻り値は [1,0,0]\\ + \verb|Rotate3pt(A3d,[0,0,1],pi/2,[1,1,1]);| 戻り値は[3,0,0]\\ + \\ + +\hypertarget{rotatedata3d}{} +\item[関数] Rotatedata3d(name,PDリスト,vec,角度,options) +\item[機能] プロットデータを回転 +\item[説明] プロットデータを,原点を始点とするベクトルvec 周りに回転する。複数のプロットデータをまとめて回転することができる。\\ +options として,中心点(vecの始点),線種を指定することができる。\\ + \\ +【例】コード例と結果を示す。 +\begin{verbatim} + Xyzax3data("","x=[-5,4]","y=[-5,5]","z=[-5,4]",["a","O"]); + Putpoint3d(["A",[0,-2,0],"B",[2,-2,0],"C",[1,-2,2],"D",[1,-2,3]],"fix"); + Spaceline("1",[A,B,C,A]); + Spaceline([C,D]); + Rotatedata3d("1",["sl3d1","CD3d"],[0,0,1],pi/2,["dr,2"]); + Letter([A,"s","A",B,"w","B",C,"ne","C",D,"ne","D"]); +\end{verbatim} +これを\\ + \verb|Rotatedata3d("1",["sl3d1","CD3d"],[0,0,1],pi/2,[[1,0,0],"dr,2"]);|\\ +とした場合が右図である。\\ + + \input{Fig3d/rotatedata3d01} \input{Fig3d/rotatedata3d02}\\ + +\hypertarget{sf3data}{} +\item[関数] Sf3data(name,リスト,options) +\item[機能] 陰線処理なしの曲面をワイヤーフレームモデルで描く +\item[説明] リストは,関数式と定義域,境界指定をそれぞれ文字列にしたもののリスト。\\ +optionsは,解像度(各変数に対応する分割数)とメッシュの密度(縦横)。\\ +解像度は,"Num=[a,b]" で指定。初期値はa,bとも25\\ +メッシュ密度は,"Wire=[a,b]" で指定。初期値はa,bとも20\\ +境界の指定は"ewsn"で行う。\\ +関数式のパターンはつぎの3通り。\\ + \\ +(1) $z=f(x,y)$\\ + 【例】:$z=x^2-y^2$を定義域$x=[-2,2],y=[-2,2]$ で描画する。\\ + \verb|Sf3data("1",["z=x^2-y^2","x=[-2,2]","y=[-2,2]"])|;\\ + \input{Fig3d/saddle1}\\ + 【例】:同じく,解像度をx,yとも10,メッシュの数を縦横とも10にする。\\ + 解像度,メッシュ密度とも下げるので粗い描画となる。\\ + \verb|Sf3data("1",["z=x^2-y^2","x=[-2,2]","y=[-2,2]"],|\\ + \verb|["Num=[10,10]","Wire=[10,10]"]);|\\ + \\ +(2) $z=f(x,y),x=g(R,T),y=h(R,T)$\\ + x,y の媒介変数 r,t は大文字にする。\\ + 【例】:次図左\\ + \verb|fd=["z=4-(x^2+y^2)","x=R*cos(T)","y=R*sin(T)","R=[0,2]","T=[0,2*pi]"];|\\ + \verb|Sf3data("1",fd);|\\ + 【例】:次図右\\ + \verb|fd=["z=sin(sqrt(abs(x^2+y^2)))","x=r*cos(t)","y=r*sin(t)",|\\ + \verb|"r=[0,3]","t=[0,2*pi]"];|\\ + \verb|Sf3data("1",fd);|\\ +\\ + \input{Fig3d/parabola} \input{Fig3d/sf3ddata3}\\ +\\ +(3) $x=f(u,v),y=g(u,v),z=h(u,v),$\\ + この場合,(2)と区別するために,"p" を先頭につけておく。\\ + 【例】球面\\ + \verb|fd=["p","x=2*sin(u)*cos(v)","y=2*sin(u)*sin(v)","z=2*cos(u)",|\\ + \verb|"u=[0,pi]","v=[0,2*pi]"];|\\ + \verb|Sf3data("1",fd);|\\ + + \input{Fig3d/sf3ddata4}\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{sfbdparadata}{} +\item[関数] Sfbdparadata(name,式,options1,options2) +\item[機能] 空間曲面の陰線処理 +\item[説明] 曲面について陰線処理を行う。 + 曲面の式はSf3data()の場合と同じ。ただし,(2) と(3)のパターンでは式の最後に境界の指定 ewns を明示する必要がある。(3)では境界の指定を" "(中は半角スペース)とする。省略すると不要な境界線が表示されることがある。\\ +options1は,"Wait=n","r","m",線種。Wait の初期値は30。\\ + "r","m"に関しては,オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ +options2は,陰線に関するoptionで,"nodisp" または 線種。"nodisp" にすると陰線は消去されるため,輪郭線だけが描かれることになる(デフォルト)。options2 だけを指定する場合は,options1 を空リストにしてつける必要がある。\\ + + \textcolor{red}{【注意】} この処理はScilabで行うが,非常に時間がかかるため,この関数を実行した状態で画面上のスライダを動かしたりしないこと。何か操作を行う場合は,いったん行頭に//を書いてコメント化してから行う。\\ + +【例】サドル面\\ +陰線を消去して表示(デフォルト)(下図左) +\begin{verbatim} + fd=["x=x^2-y^2","x=[-2,2]","y=[-2,2]"]; + Sfbdparadata("1",fd); +\end{verbatim} +全体を実線で太めにして,陰線を点線で表示(下図右) +\begin{verbatim} + fd=["x=x^2-y^2","x=[-2,2]","y=[-2,2]"]; + Sfbdparadata("1",fd,["dr,2"],["do"]); +\end{verbatim} + \input{Fig3d/sfbdpara01} \input{Fig3d/sfbdpara02} + +【例】放物面\\ +デフォルト(下図左) +\begin{verbatim} + fd=["z=4-(x^2+y^2)","x=R*cos(T)","y=R*sin(T)","R=[0,2]","T=[0,2*pi]","e"]; + Sfbdparadata("1",fd); +\end{verbatim} +陰線を破線で表示(下図右) +\begin{verbatim} + fd=["z=4-(x^2+y^2)","x=R*cos(T)","y=R*sin(T)","R=[0,2]","T=[0,2*pi]","e"]; + Sfbdparadata("1",fd,[],["da"]); +\end{verbatim} + \input{Fig3d/sfbdpara03} \input{Fig3d/sfbdpara04 +} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{skeletonparadata}{} +\item[関数] Skeletonparadata(name,PDリスト,PDリスト,option) +\item[機能] 陰線処理(スケルトン処理)をおこなう +\item[説明] 描画されている線と軸について陰線処理をおこなう。\\ +第2引数の線(プロットデータ)が,第3引数の線(プロットデータ)によって隠される部分を消去する。第2,第3引数を省略した場合は,すべての線について,互いの陰線処理をおこなう。optionで消去する部分の長さを指定できる。\\ + \\ +【例】螺旋と線分,座標軸の陰線処理\\ +次のように螺旋と線分,座標軸を描いておく。 +\begin{verbatim} + Xyzax3data("","x=[-5,5]","y=[-5,4]","z=[-5,3]"); + Putpoint3d(["A",[0,-2,-2]],"fix"); + Putpoint3d(["B",[-1,1,3]],"fix"); + Spaceline([A,B]); + Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["Num=100"]); +\end{verbatim} +座標軸のプロットデータは ax3d,線分は AB3d,螺旋は sc3d1 である。これに対し,\\ + \verb|Skeletonparadata("1");|\\ + 描画されている線と軸について陰線処理をおこなう。(図左)\\ + \verb|Skeletonparadata("1",[2]);|\\ + 重なった部分の空きを2にする。(図中央)\\ + \verb|Skeletonparadata("1",["AB3d","ax3d"],["sc3d1"]);|\\ + 螺旋によって隠れる部分だけ消去する。(図右)\\ + +\input{Fig3d/skeletonparadata01} \input{Fig3d/skeletonparadata02} + \input{Fig3d/skeletonparadata03} + +このほか,\\ + \verb|Skeletonparadata("1",["AB3d","ax3d"],["sc3d1"],[2]);|\\ + \verb|Skeletonparadata("1",["AB3d"],["ax3d","sc3d1"]);|\\ +も可能である。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{spacecurve}{} +\item[関数] Spacecurve(name,式,定義域,options) +\item[機能] 空間曲線を描く +\item[説明] 媒介変数で表された曲線を描く。optionは解像度 Num\\ + \\ +【例】螺旋を描く\\ + \verb|Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["Num=100"]);|\\ + \\ + \input{Fig3d/rasen}\\ + +\hypertarget{spaceline}{} +\item[関数] Spaceline(リスト) +\item[機能] 折れ線を描く +\item[説明] 点の名称または座標のリストを与えて折れ線を描く。平面での Listplot() にあたる。\\ +【例】Spaceline("1",[[2,5,1],[4,2,3]]); 指定された2点を結んだ線分を描く。\\ + Spaceline([A,B,C,A]); 作図されている2点A,B,Cを結んだ三角形を描く。\\ + options は線種(dr,da,do)\\ + \\ + +\hypertarget{translatedata3d}{} +\item[関数] Translatedata3d(name,PD,平行移動量) +\item[機能] 空間プロットデータを平行移動 +\item[説明] PDで表される図形を,平行移動する。\\ + \\ +【例】曲線 sc3d1 をy軸方向に2だけ平行移動する。\\ + \verb|Translatedata3d("1",["sc3d1"],[0,2,0]);|\\ + 結果として,もとの曲線と平行移動した曲線の2つが描かれる。\\ + \\ +【例】多面体の平行移動\\ + VertexEdgeFace() で描いた多角形はこの関数では平行移動できないので,面データを直接操作して平行移動を行う。\\ + たとえば,小林・鈴木・三谷による多面体データ polyhedrons obj を用いて正八面体を描く場合,次のようにする。$y$軸方向に2だけ平行移動する場合である。\\ +\begin{verbatim} + Setdirectory( Dirhead+"/data/polyhedrons_obj"); + phd=Readobj("r02.obj",["size=2"]); + Setdirectory(Dirwork); + dn=length(phd_1); + repeat(dn,s,phd_1_s=phd_1_s+[0,2,0]); + VertexEdgeFace("1",phd,["Edg=nogeo"]); +\end{verbatim} + \input{Fig3d/translate01} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{translatept3d}{} +\item[関数] Translatept3d(座標,平行移動量) +\item[機能] 空間点を平行移動 +\item[説明] 点を平行移動する。\\ + \\ +【例】点A(1,0,0) を(-1,1,1)だけ平行移動した点をBとする。点Aの空間座標は A3d で表される。 +\begin{verbatim} + Putpoint3d(["A",[1,0,0]],"fix"); + pt=Translatept3d(A3d,[-1,1,1]); + Putpoint3d(["B",pt],"fix"); +\end{verbatim} + \\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{vertexedgeface}{} +\item[関数] VertexEdgeFace(面データ,options) +\item[機能] 多面体の面データを用いて多面体を描く +\item[説明] 面データは,頂点リストと,面リストからなる。面リストは,各面を構成する頂点を,外側から見て反時計回り(左回り)に並べたリストである。\\ +たとえば,四面体ABCDの面データは,[[A,B,C,D],[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]] となる。\\ +4点A,B,C,Dをとっておき,このリストを引数に与えると,四面体の辺が描かれる。\\ +このとき,option がなければ,Cinderellaの幾何要素として辺が描かれるが,それだけではTeXには書き出されないので注意が必要である。(変数未定義のエラーになる) TeXに書き出すには,optionとして ["Edg=nogeo"] をつける。このときは各辺は幾何要素にならない。\\ +また,"Pt=free" optionをつけると,頂点は自由点となり,マウスドラッグで動かすことができる。\\ +生成されるプロットデータは,\\ +phv3d:頂点のリスト\\ +phe3d:辺のリスト\\ +phf3d:面リスト\\ +なお,それぞれ末尾にnameが付加される。\\ + \\ +【例】:正四面体を描く +\begin{verbatim} + Putpoint3d("A",2*[-1,-1/sqrt(3),0],"fix"); + Putpoint3d("B",2*[1,-1/sqrt(3),0],"fix"); + Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0],"fix"); + Putpoint3d("D",2*[0,0,sqrt(3)],"fix"); + phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); + VertexEdgeFace("1",phd,["Edg=nogeo"]); +\end{verbatim} + \input{Fig3d/vertex01} + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{wireparadata}{} +\item[関数] Wireparadata(name,PD,式,整数,整数,optons1,options2) +\item[機能] 曲面のワイヤフレームを陰線処理して描く +\item[説明] PDは,第3引数の式で描いたワイヤフレームモデルのプロットデータ名。第4,第5引数は分割線の数。\\ +options1 には "r","m","Wait=n" が指定できる。Wait の初期値は30。\\ + "r","m"に関しては,オプションなしまたは,”” のとき\\ + i) データファイルがなければ,新しく作る\\ + ii) データファイルが既にあればそれを読み込む\\ + "m" のとき,強制的にデータファイルを作り直す。\\ + "r" のとき,すでにあるデータファイルを読み込む。\\ +optons2 には陰線の表示方法について "nodisp" または線種 がある。デフォルトは"nodisp" 。何も指定しないときは,[""] (空文字)を書いておく。\\ +曲面の陰線処理を行うので,Sfbdparadata() とペアで使う。\\ + \\ + \textcolor{red}{【注意】} \\ + この処理はScilabで行うが,Sfbdparadata() とペアで使うために非常に時間がかかる。コンピュータの性能にもよるが2分以上かかこともある。したがって,この関数を実行した状態で画面上のスライダを動かしたりしないこと。何か操作を行う場合は,いったん行頭に//を書いてコメント化してから行う。球面やトーラスのタイプでは,Texview や Exekc ボタンの反応も鈍くなる。Exekc が動作しない(タイムアウト)場合は,kc.sh(Mac) / kc.bat(Windows)を直接起動すれば TeX の図ができる。\\ + \\ +【例】式のタイプ別に例を示す。\\ + \\ +サドル面:下図左 +\begin{verbatim} + fd=["z=x^2-y^2","x=[-2,2]","y=[-2,2]"]; + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,4,5,[""]); +\end{verbatim} + \\ +回転放物面:下図中央 +\begin{verbatim} + fd=["z=4-(x^2+y^2)","x=r*cos(t)","y=r*sin(t)","r=[0,2]","t=[0,2*pi]","e"]; + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,5,7,[""]); +\end{verbatim} + \\ +球面:下図右\\ + このタイプでは,媒介変数形式の識別のため,先頭に "p" をつけておくとよい。 +\begin{verbatim} + fd=["p","x=2*sin(u)*cos(v)","y=2*sin(u)*sin(v)","z=2*cos(u)","u=[0,pi]", + "v=[0,2*pi]","s"]; + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,12,12,[""]); +\end{verbatim} + \\ +\input{Fig3d/wirepara1} \input{Fig3d/wirepara2} \input{Fig3d/wirepara3}\\ + \\ +【例】球面で座標軸を陰線処理して点線で表す。(次図左) +\begin{verbatim} + fd=["p","x=2*sin(u)*cos(v)","y=2*sin(u)*sin(v)","z=2*cos(u)","u=[0,pi]", + "v=[0,2*pi]","s"]; + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,12,12,[""]); + Crvsfparadata("1","ax3d","sfbd3d1",fd,[],["do"]); +\end{verbatim} +【例】トーラスを描く(次図右) +\begin{verbatim} + fd=["p","x=(2+cos(u))*cos(v)","y=(2+cos(u))*sin(v)","z=sin(u)", + "u=[0,2*pi]","v=[0,2*pi]","s"]; + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,12,12,[""]); +\end{verbatim} + \\ + \input{Fig3d/wirepara4} \input{Fig3d/wirepara5}\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + \\ +\hypertarget{xyzax3data}{} +\item[関数] Xyzax3data(name,xの範囲,yの範囲,zの範囲,options) +\item[機能] 座標軸を描く +\item[説明] 描画面に座標軸を描く。nameは空文字列でよい。プロットデータ ax3d が作成される。option は次の2つ。\\ +矢じり:"an":nは数字で矢じりの大きさ。nはなくてもよい。\\ +原点O:"Onesw":neswは微小位置。数字も付けられる。neswをつけない場合の初期値はsw。\\ +【例】デフォルトの座標軸\\ + \verb|Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]");|\\ + 矢じりをつける\\ + \verb|Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]","a");|\\ + 矢じりを大きくする\\ + \verb|Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]",["a2"]);|\\ + 原点のOを表示する。\\ + \verb|Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]",["O"]);|\\ + 原点のOの位置を調整して右上に表示する。やじりもつける。\\ + \verb|Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]",["a","Oe2n2"]);|\\ + +【注意】Putaxes3d() で点を取ると原点に点Oが作成される。この点名Oと表示が重複するのが煩わしい場合は,作図後にこのoptionをつけてから出力するとよい。\\ + + +\hypertarget{xyzcoord}{} +\item[関数] Xyzcoord(P.x,P.y,Pz.y) +\item[機能] 主副画面で決まる点の座標 +\item[説明] Cinderellaの描画面上の点が表す空間座標を求める\\ + 点Pについて,主画面の点Pに対応するのが副画面のPzである。点Pの2次元座標はP.x,P.yで,Pzのy座標はPz.yで表される。これを引数として与えると,点Pの空間座標が返される。\\ + \\ +【例】点Aをドラッグして動かしたとき,Aの座標を求める。\\ + \verb|println(Xyzcoord(A.x,A.y,Az.y));|\\ + により,コンソールに座標が表示される。\\ + +\end{description} +\newpage +% 逆引辞典 ================================== +\section{逆引辞典} + +幾何の作図は,補助線などはCinderellaの作図ツールかCindyscriptを用いて描き,TeXに出力する線をKeTCindyで描くと,効率のよい作図ができる。 + +関数のグラフも,Cindyscriptで描くものと,TeXに出力するKeTCindyで描くものを使い分けるとよい。 + +以下で,【Cinderella】は,Cinderellaの作図ツールを用いた描画,【Cindyscript】はCindyscriptの関数,【KeTCindy】および【KeTCindy3D】はKeTCindyの関数を示す。\\ + +\subsection{点の作図} +\subsubsection{点をとる} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「点を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/single-add.png} を用いる\\ + \>【KeTCindy】 \>Drwpt(点),Drawpoint(点),Pointdata(name,リスト),Putpoint(name,座標),\\ + \>【KeTCindy3D】\>Drawpoint3d(座標),Putpoint3d(リスト),\\ +\end{tabbing} + +点をとる関数はいくつかある。Cinderellaの描画面上に単に点を表示するもの,幾何点を作るもの,TeXに出力するためのもの,と用途が異なる。 +Putpoint(),Putpoint3d()は座標を与えて幾何点を作るが,作図ツールの「点を加える」で作図しておいてスクリプトで座標を指定してもよい。 + + \\ +【例】座標(1,1) に点Aをとる。\\ + (方法1) 磁石ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/snap.png} でスナップモードにしておき,作図ツールで点をとる。\\ + (方法2)KeTCindyの関数で \verb|Putpoint("A,[1,1])| とする。 + +(方法1)では,この点は自由点となる。固定点にするには,インスペクタで「ピンで留める」にする。また,点名はCinderellaが自動的につけるので,変更するには,点を選択しておき,インスペクタを開いて「要素の情報」で変更する。 + +[1,1] のような格子点でない場合は,作図ツールで適当な位置に点をとったのち,Cindyscriptで \verb|A.xy=[2,sqrt(3)]| のようにして座標を指定する。 + +(方法2)では,この点は固定点となる。自由点とするには \verb|Putpoint("A",[1,1],[A.x,A.y])| とする必要がある。 + +これらの方法で点を取ったとき,画面上には点が表示されるがTeXの図には出力されない。TeXの図に出力するには,KeTCindyのDrwpt()または,Drawpoint()を用いる必要がある。\\ + + 以下は,それぞれの関数についての比較表である。「描画」は緑色の点で描画するが幾何点は作らない。\\ + \\ + \input{Fig/poiintable} +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{点の大きさを変える} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>インスペクタの「表示方法」を使う\\ +\>【Cindyscript】 \>A.size=n\\ + \>【KeTCindy】 \>Ptsize(n),Setpt(n)\\ +\end{tabbing} + +インスペクタ,Cindyscriptによる点の大きさの設定は画面上には反映されるが,TeXには書き出されない。逆に,KeTCindyで設定した点の大きさは,Cinderellaの画面上には反映されない。そのことを考慮の上,適宜使い分ける必要がある。画面上の点の大きさと,TeXの図の点の大きさは連動しないので注意が必要である。 + +KeTCindyの描画関数を使って点をとるときは,["size=n"]オプションをつけて大きさを設定することもできる。 + +KeTCindyでは,Drwpt() または Drawpoint() に0オプションをつけることで白抜きの点を描くことができる。ただし,この場合,これよりあとに書かれた線は白で抜いたあとに書かれてしまうので,記述の順番を考慮する必要がある。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{曲線上に点をとる} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「点を加える」ツールを用いる\\ +\>【KeTCindy】 \>PutonCurve(name,PD,初期値)\\ +\>【KeTCindy3d】 \>PutonCurve3d(点名,PD)\\ +\end{tabbing} + +Cinderellaの作図ツールで描いた曲線上には,「点を加える」ツールで点をとることで,その点は曲線上だけを動かすことができるようになる(インシデント)。作図ツールで描いた曲線でなければこの方法では曲線上に点は取れない。 + +Cindyscriptで描いた曲線の場合,たとえば,関数$f(x)$のグラフ上に点を置くには,A.y=[A.x,f(A.x)] のようにすればよい。(あらかじめ点を作図しておく) + +KeTCindyのPutonCurve()を使うと,プロットデータを用いて曲線上に点をとることができる。また, +KeTCindyで直線,線分上に取りたい場合は,PutonLine( ),PutonSeg( )を用いることもできる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{交点をとる} +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「2つの曲線の交点を求める」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/intersection.png} を用いる\\ + \>【KeTCindy】 \>Intersectcrvs(PD,PD), Crosspoint(name,PD,PD,リスト),\\ + \> \> Putintersect(点名,PD,PD)\\ + \>【KeTCindy3D】 \>Intersectcrvsf(name,PD,式), IntersectsgpL(点名,線分,面,方法)\\ +\end{tabbing} + +Cinderellaの作図機能で作図した幾何要素の交点はCinderellaの「2つの曲線の交点を求める」ツールを用いるのが簡便であるが,関数のグラフや方程式による曲線の場合は,Cinderellaの作図機能は使えないので,KeTCindyの関数を使うことになる。 + +KeTCindyの関数は3通りあるが,intersectcrvs() は2曲線の交点のリストを取得する関数なので,既存の点を交点に持ってきたい場合は +\begin{verbatim} + tmp=Intersectcrvs(gr1, crAB); + P.xy=tmp_1; +\end{verbatim} +のようにすればよい。 + +Crosspoint(),Putintersect()では交点に新たな幾何点を作ることができる。 + +Intersectcrvsf() は曲線と曲面の交点, IntersectsgpL() は直線と平面の交点を求める。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{線の作図} +\subsubsection{線分を引く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「線分を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/segment.png} を用いる \\ +\>【Cindyscript】 \>draw([A,B]) \\ + \>【KeTCindy】 \>Listplot([A,B]) \\ + \>【KeTCindy3D】 \>Spaceline([A,B]) \\ +\end{tabbing} + Cinderellaの描画ツールを使うと,描かれた線分は幾何要素となり,インスペクタでその属性(色・太さなど)を変えることができる。また,点を線分上にインシデントさせることができる。Scilabに出力しない線分を描くときはこれで十分で,スクリプトも簡素になる。\\ + Cindyscript のdraw関数とKeTCindyのListplot関数では,線の色,太さ,線種を指定できる。また,点の識別名ではなく座標を引数にすることもできる。\\ + 推奨するのは,補助線などはCinderellaの描画ツールで描き,最終的に必要な線だけListplot()で出力する方法。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{折れ線を描く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cindyscript】 \>connect(点のリスト)\\ +\>【KeTCindy】 \>Listplot(点のリスト)\\ +\>【KeTCindy3D】 \>Spaceline(点のリスト)\\ +\end{tabbing} + +Cinderellaの描画ツールで折れ線を描くのはインタラクティブではあるが本数が多くなると現実的ではない。ただ,描かれた線分は幾何要素となり,インスペクタでその属性(色・太さなど)を変えることができる。折れ線全体の属性を変えるには,すべての折れ線を同時に選択する。(Shift+クリック) + +Cindyscript のconnect() と KeTCindyの Listplot() ,Spaceline()では,引数に点のリストを与えれば折れ線が描ける。 + +節点を明示した折れ線を描くには,Listplot()とDrawpoint()を組み合わせることが考えられるが,あらかじめ点のリストを作っておくのが簡便である。 +\begin{verbatim} + Ptsize(3); + pd=[[1,2],[3,4],[6,2]]; + Pointdata("1",pd); + Listplot("1",pd); +\end{verbatim} + +KeTCindy3Dの場合は空間座標で点をTeXに書き出すことができないので,次のように点を作って書き出す。 +\begin{verbatim} + Putpoint3d(["A",[2,0,0],"B",[2,0,2],"C",[2,2,2]],"fix"); + Spaceline([A,B,C]); + Ptsize(3); + Drawpoint([A,B,C]); +\end{verbatim} +節点が多い場合は,空間の点のリストと,投影した点のリストを作って描画する。 +\begin{verbatim} + pt=[[2,0,0],[2,0,2],[2,2,2],[0,2,2],[0,4,2],[0,4,4]]; + pt2d=apply(pt,[Projcoordpara(#)_1,Projcoordpara(#)_2]); + Spaceline("1",pt); + Ptsize(4); + Drawpoint(pt2d); +\end{verbatim} + \input{Gfig/oresenex01}\\ + +点の名前が必要であれば\\ + \verb|pname=apply(1..6,"P"+text(#));|\\ +のようにして,名前リストを作る。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{直線を引く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + \\ +\>【Cinderella】 \>「直線を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-line.png} を用いる \\ +\>【Cindyscript】 \>draw(join([1,2],[2,-1]))\\ + \>【KeTCindy】 \>Lineplot([A,B]) \\ +\end{tabbing} + Cinderellaの描画ツールを使うと,描かれた線分は幾何要素となり,インスペクタでその属性(色・太さ・線種など)を変えることができる。また,点を直線上にインシデントさせることができる。Scilabに出力しない直線を描くときはこれで十分で,スクリプトも簡素になる。半直線にしたい場合は,線分を描いて一方の端点を描画領域(SW,NE)の外に出して見かけ上半直線にすればよい。 + +Cindyscript のdraw関数とKeTCindyのLineplot関数では,線の色,太さ,線種を指定することができる。点の識別名ではなく座標を引数にすることもできる。 + +TeXへの出力は,Lineplot()に "+" オプションをつけると半直線になる。 + +KeTCindy3Dには直線を描く関数はないが,線分の外分点を適当にとって線分として描けば,ほとんど直線として扱うことができる。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + + +\subsubsection{点線や破線を描く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>インスペクタの「特別な表示方法」で線種を変える \\ +\>【Cindyscript】 \>修飾子 dashtype を使う \\ + \>【KeTCindy】 \>do ,da オプションをつける\\ + \>【KeTCindy3D】 \>do ,da オプションをつける\\ +\end{tabbing} + Cinderellaの描画ツールで引いた線分・直線の線種は,その要素を選んで「Ctrl+i」(Macは ⌘+i) で表示されるインスペクタを用いて,「特別な表示方法」で変えることができる。点線,破線だけでなく,一点鎖線もある。\\ + Cindyscriptの draw() で引いた線分・半直線は,修飾子を用いて, draw([A,B],dashtype-$>$2) のようにして描く。\\ + KeTCindyでは,オプションに,["do"] (点線:dotline) ["da"](破線:dashline)をつける。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + + +\subsubsection{線の太さを変える} +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>インスペクタの「表示方法」を使う\\ +\>【Cindyscript】 \>size オプションをつける\\ + \>【KeTCindy】 \>Setpen(n) \\ +\end{tabbing} + インスペクタ,Cindyscriptによる点の大きさの設定は画面上には反映されるが,TeXには書き出されない。逆に,KeTCindyで設定した点の大きさは,Cinderellaの画面上には反映されない。そのことを考慮の上,適宜使い分ける必要がある。画面上の点の大きさと,TeXの図の点の大きさは連動しないので注意が必要である。\\ + KeTCindynの描画関数を使うときは,"size=n" オプションをつけて大きさを設定できるものもある。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{垂線を引く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「垂線を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-perp.png} を用いる \\ +\>【Cindyscript】 \>perpendicular(A,a)\\ + \>【KeTCindy】 \>作図後,Listplot()で線分を引く\\ + \>【KeTCindy3D】 \>Perppt()で垂線の足を求めて線分を引く\\ + +\end{tabbing} + Cinderellaの「垂線を描く」ツールを用いて作図するのが簡便だが,何か条件を与えて垂線を引くような場合はCindyscriptを使うことになる。ただし,点と直線(線分)が幾何要素になっていないと垂線は引けない。perpendicular(A,a) で,Aは点の識別子,aは直線(線分)の識別子。TeXには,適当な図が描けたところでLineplot()もしくはListplot()で出力すればよい。 + +対象が幾何要素でない場合は,Cindyscriptで方程式を求めて引くことになる。 + +KeTCindy3D の Perppt() 関数は,ある点から平面に下した垂線の足を求める。Perppt() の項にある例を参照のこと。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{平行線を引く} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>「平行線を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-parallel.png} を用いる \\ +\>【Cindyscript】 \>parallel(B,a)\\ + \>【KeTCindy】 \>作図後,Listplot()で線分を引く\\ +\end{tabbing} + Cinderellaの「平行線を描く」ツールを用いて作図するのが簡便だが,なにか条件を与えて平行線を引くような場合はCindyscriptを使うことになる。ただし,点と直線(線分)が幾何要素になっていないと平行線は引けない。parallel(B,a) で,Bは点の識別子,aは直線(線分)の識別子。 + +TeXには,適当な図が描けたところでLineplot()もしくはListplot() で出力すればよい。 + +対象が幾何要素でない場合は,Cindyscriptで方程式を求めて引くことになる。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{多角形を描く} + +\subsubsection{頂点を与えて多角形を描く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + + \>【Cinderella】 \>多角形ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/polygon.png} を用いる \\ + \>【Cindyscript】 \>drawpoly(点リスト)\\ + \>【KeTCindy】 \>Listplot(点リスト)\\ + \>【KeTCindy3D】 \>Spaceline(点リスト)\\ +\end{tabbing} + + Cinderellaの描画ツールの多角形ツールは,既存の点を結んで多角形を作り色塗りをするもの。色塗りをしないのであれば,単に線分でつないでいく。 + + Cindyscriptのdrawpoly() ,およびKeTCindyのListplot(),Spaceline() での点リストは,既存の幾何点でなく座標でもよい。Listplot() ,Spaceline() の点リストが必ず閉じたリスト([A,B,C,D,A])でなければならないのに対し,Cindyscriptのdrawplory()では閉じている必要はない。drawpoly([A,B,C,D])でよい。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{1辺を与えて正多角形を描く} + \\ + 平面上で,与えられた線分ABを1辺とする正多角形を描く。 + +線分ABは,Cinderellaの作図ツールなどで描かれているものとする。ただし,線分でなく,両端の点が与えられているだけでもよい。点A,Bが複素平面上にあるものとして,多角形の頂点の位置を計算すればよい。 + +CindyscriptのDrawスロットに,次のスクリプトを書く。(n=5で正五角形を描く) +\begin{verbatim} + n=5; + pti=[complex(A),complex(B)]; + th=2*pi/n; + repeat(n-2,s, + z1=pti_s; + z2=pti_(s+1); + z=z2+(z2-z1)*(cos(th)+i*sin(th)); + pti=append(pti,z); + ); + pt=apply(pti,gauss(#)); + pt=append(pt,A.xy); + Listplot("1",pt); +\end{verbatim} +ptiは,各頂点に対応する複素数のリスト,ptが各頂点の座標のリストである。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{接線を引く} + \\ +曲線上の点における接線を引く +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>幾何要素の2次曲線の場合,「点の極線を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/polar-of-point.png} を用いる\\ +\>【Cindyscript】 \>微分して接線の方程式を求めて直線を引く\\ + \>【KeTCindy】 \>同上 \\ +\end{tabbing} + Cinderellaの作図ツールで描いた2次曲線の場合は,曲線上の点において「点の極線を加える」ツールで接線が引ける。このツールは,初期状態では画面に出ていないので,モードメニューの「直線」から選ぶ。また,「設定」メニューの「上のツールバーをカスタマイズする」で,すべてのツールを表示すれば画面上に出る。 + + Cinderellaの作図ツールで描けない曲線の場合は方程式を求めて直線を引くことになる。微分をする関数は,Cindyscriptでは d(関数,変数),KeTCindyではDerivative(関数, 変数,値) を用いる。\\ + +例:3次関数 $f(x)=x^3-4x$ 上の点$(1,-3)$における接線を引くCindyscriptとKeTCindyの組み合わせ\\ + f(x):=x\verb|^| 3-4*x;\\ + g(x0,x):=d(f(\#),x0)*(x-x0)+f(x0);\\ + p1=[1,-3];\\ + p2=[2,g(1,2)];\\ + plotdata("1","x\verb|^| 3-4*x","x");\\ + Lineplot("1",[p1,p2]);\\ + \\ + このスクリプトでは,g(x0,x)を点$(x_0,f(x_0))$における接線の方程式としている。\\ + また,接点をインタラクティブに決めるには,2点A,Bを作図しておき\\ + \\ + Deffun("f(x)",["regional(y)","y=x\verb|^|3-4*x","y"]);\\ + coef=Derivative("f(x)","x",A.x);\\ + A.y=f(A.x);\\ + B.y=coef*(B.x-A.x)+A.y;\\ + Plotdata("1","f(x)","x");\\ + Lineplot([A,B]);\\ + + として,接点Aをドラッグして位置決めをすることができる。\\ + \\ + <注>\\ + Deffun("f(x)",["regional(y)","y=x\verb|^|3-4*x","y"]);\\ + は\\ + f(x):=x\verb|^| 3-4*x;\\ + でもよい。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} +\subsection{円の作図} +\subsubsection{円を描く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「円を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/multi-add-circle.png} を用いる\\ +\>【Cindyscript】 \>drawcircle([a,b],r)\\ + \>【KeTCindy】 \>Circledata([A,B]),Circledata(name,[[a,b],[c,d]])\\ +\end{tabbing} + Cinderellaの円を描くツールは3種類あるが,あとでTeXに書き出すならば「円を加える」ツールがよい。中心からドラッグすると円周上に点ができる。この2点を使ってCircledata([A,B]) で書き出すことができる。TeXに書き出す必要がない補助円などであれば,「半径付き円を加える」 \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/circle-by-radius.png} が簡便。半径を一定にする(円周ドラッグで大きさが変わらないようにする)のであれば,「固定した半径の円を描く」ツールを用いる。Cinderellaの円を描くツールで描いた円は,インスペクタの「特別な表示方法」で線種を設定できる。 + +Cindyscript では,中心と半径を指定して円を描く。drawcircle([a,b],r) は [a,b] が中心の座標,r が半径(実数)。中心は,Cinderellaの作図ツールでとった点Aを中心とする場合は,drawcircle(A,r)。 + +KeTCindyのCircledata([A,B])は,中心Aで点Bを通る円を描く。A,Bを座標にする場合は,nameが必要。中心Aで半径rの円を描くのであれば,座標指定になるので,Circledata("1",[A,A+[3,0]]) または Circledata("1",[A.xy,A.xy+[3,0]]) とする。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{領域を塗る} +\subsubsection{円の内部を塗る} +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「円を加える」ツールを用いたのち,インスペクタで設定\\ +\>【Cindyscript】 \>fillcircle(A,r) \\ + \>【KeTCindy】 \>Shade(PD)\\ +\end{tabbing} + 画面上で色を塗るだけならインスペクタの「表示方法」で色塗りをするのが簡便。透明度も設定できる。TeXの図版でも領域を塗るのであれば,Circledata()で円を描いた(プロットデータを作成)のち,Shade()で色を塗る。ここで色指定をすれば画面にも反映される。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{多角形の内部を塗る} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「多角形を加える」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/polygon.png} を用いる \\ +\>【Cindyscript】 \>fillpoly(点リスト)\\ + \>【KeTCindy】 \>Shade(PD)\\ +\end{tabbing} + Cinderellaの描画ツールの多角形ツールは,既存の点を結んで多角形を作り色塗りをする。 + +Cindyscriptでの点リストは,既存の幾何点でなく座標でもよい。点リストは,始点と終点を結ぶので閉じている必要はない。([A,B,C,D]) + + TeXに書き出すのであれば Shade()を用いる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{曲線で囲まれた領域を塗る} +\begin{tabbing} +12\=34567890123456789\=\kill\\ + + \>【KeTCindy】 \>Shade(PD)\\ +\end{tabbing} + Shade()を用いて領域を塗る。Cinderellaの画面にも反映される。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{領域を斜線で示す} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + \>【KeTCindy】 \>Hatchdata(name,方向,PD)\\ +\end{tabbing} + 領域を斜線で塗る。Cinderellaの画面にも反映される。Scilabとデータをやり取りしてハッチデータを作るので,バッチファイル(シェルファイル)が裏で実行される。\\\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{領域を細かい点で埋める} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + + \>【KeTCindy】 \>Dotfilldata(name,方向,PD)\\ +\end{tabbing} + 曲線で囲まれた領域を斜線で塗るかわりに細かい点で埋める。 使い方はHatchdata() と同様。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsection{関数のグラフ・曲線} + +\subsubsection{関数のグラフを描く} +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cindyscript】 \>関数を定義して,plot()で表示する \\ + \>【KeTCindy】 \>(関数を定義して)Plotdata()で表示する \\ +\end{tabbing} + + Cindyscriptでは,f(x):=式 の書式で関数を定義し,plot(fx)) でグラフを描くことができる。関数は,if関数による場合分けも可能。また,この関数概念は数学関数ではなく, プログラミングにおける関数なので,一連の操作を関数として定義して実行することもできる。\\ + KeTCindyでは,Deffun() で関数を定義して,Plotdata()でグラフを描く。Deffunでは,if文による条件分岐も可能だが,ifのネストはできない。\\ + 三角関数などの組み込み関数については,定義は不要で,そのまま plot() もしくは Plotdata()でグラフを描くことができる。ただし,CindyscriptにあってもKeTCindyにはない逆三角関数(arctanなど)はCindyscriptで画面には表示できるがTeXにはできない。\\ + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{媒介変数表示の曲線を描く} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cindyscript】 \>plot([f(t),g(t)])\\ + \>【KeTCindy】 \>Paramplot(name,式,定義域) \\ + \>【KeTCindy3D】 \>Spacecurve(name,式,定義域) \\ +\end{tabbing} + いずれもoptionで線種などの指定ができる。\\ + 平面における曲線で,Timer Tickスロットに書いてアニメーションを行う場合は,Cindyscriptの plot()の方を勧める。シンプルな分,実行速度において有利である。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{2次曲線を描く} + 放物線,楕円,双曲線を描く。 +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>焦点などを作図してそれぞれの作図ツールを用いる\\ +\>【Cindyscript】 \>関数もしくは媒介変数で表してplot()で描く\\ + \>【KeTCindy】 \>Plotdata() もしくは Paramplot() ,Parabolaplot() などで描く\\ +\end{tabbing} + これらの曲線を描く方法は何通りかある。全体ではなく一部分を描く場合はCinderellaの作図ツールではできないのでplot()または Paramplot()で描く。 + + これらの曲線上に点をとり,接線を引いてインタラクティブに動かすような場合は,Cinderellaの作図ツールで描くとよい。点をインシデントにするのが容易であり,接線も簡単に引け,さらにその接線も幾何要素となるので都合がよい。 + +KeTCindyでは,Plotdata() で媒介変数表示の式を与えるか,Parabolaplot(),Ellipsplot(),Hyperbolaplot() で焦点などを与えて描く。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{陰関数のグラフを描く} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + + \>【KeTCindy】 \>Implicitplot()\\ +\end{tabbing} + 陰関数で与えられた曲線を描く方法はCinderella,Cindyscriptにはない。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{プロットデータを自作して表示する} + \\ + 組み込み関数にない関数などを使ってプロットデータを自作して表示するには,Cindyscriptで作成したプロットデータをListplot() または AddGraph()に渡して描画する。それぞれの項の例を参照のこと。 + +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{その他} + +\subsubsection{幾何要素を非表示にする} +描いた点や線を非表示にする。 +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>インスペクタの「表示方法」で「表示する」のチェックを切る \\ +\>【Cindyscript】 \>幾何要素のvisibleプロパティをfalseにする \\ + \>【KeTCindy】 \>"notex" または "nodisp" オプションをつける \\ +\end{tabbing} + インスペクタの表示方法」で「表示する」のチェックを切った場合,「表示」に戻すには,「表示」メニューの「式による表示」を開いて,該当の幾何要素を選択し,インスペクタで「表示する」のチェックをつける。\\ + 幾何要素をCindyscriptで非表示/表示にするには,A.visible=false / true とする。幾何要素ではない関数のグラフなどはインスペクタでは非表示にできない。\\ + KeTCindy の "notex" オプションはTeXに出力しない。"nodisp"オプションでは,画面にも表示されない。プロットデータを作成するために使う。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsubsection{角に印をつける} +角に弧または平行四辺形の角の印をつける。 +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>「角に印をつける」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/angle-mark.png} を用いる(弧の形状のみ)\\ +\>【Cindyscript】 \>なし\\ + \>【KeTCindy】 \>Anglemark() , Paramark() を用いる \\ +\end{tabbing} + TeXに出力しないのであれば,「角に印をつける」ツールを用いるのが簡便。ただし,平行四辺形の印はつけられない。\\ + 角に向きを示す矢印を付加する場合は,Anglemark()で描いておき,Arrowhead()で矢じりをつける。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + +\subsection{値の取得・変換} +\subsubsection{角度を測る} + +\begin{tabbing} +12\=34567890123456789\=\kill\\ + +\>【Cinderella】 \>「角度を測る」ツール \includegraphics[bb=0 0 27 21 , width=0.6cm]{Cindytool/angle.png}を用いる。\\ +\>【Cindyscript】 \>arctan2(ベクトル)を用いる\\ +\end{tabbing} + Cinderellaの「角度を測る」ツールでは,画面上に角度が表示される。この値をスクリプトで利用するためには,その識別名を用いる。識別名は,表示メニューから「式による表示」で出る幾何要素の一覧表で判断する。識別名がα0であれば,変数α0に角の値が入っていると考えてよい。αは日本語入力モードで「あるふぁ」で入力する。たとえば,drawtext([1,1],α0) とすれば,(1,1) の位置に角度が表示される。このときの角は一般角であり,点をドラッグすると360°以上の角や負の角で表示される。また,表示は度数法で行われるが,処理によっては弧度法での表示となる。\\ + Cindyscriptで角度を取得するには,arctan2()を用いるのがよい。引数はベクトルで,x軸の正の方向とのなす角を −π 〜 π の範囲で弧度法で返す。角ABCの場合,th=arctan2(C.xy-B.xy)-arctan2(A.xy-B.xy) で取得できる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{2点間の距離を測る} + +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cindyscript】 \>dist(A,B) または $|$A,B$|$ \\ + \>【KeTCindy3D】 \>dist3d(点,点)\\ +\end{tabbing} +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{数値を文字に変換する} +関数の引数に文字列として与えるために数値を文字列に変換したい場合がある。このような場合は,text() 関数を用いる。引数は実数・複素数いずれでも可。\\ + +subsubsection{小数点の桁数を指定して表示} +\begin{tabbing} +12\=34567890123456\=\kill\\ + +\>【Cinderella】 \>なし \\ +\>【Cindyscript】 \>format()関数を用いる \\ + \>【KeTCindy】 \>Textformat() 関数を用いる\\ +\end{tabbing} + Cinderellaでは,小数点以下の桁数は第5位を四捨五入して表示するのがデフォルトである。小数点以下の桁数を指定するには,Cindyscriptでは format()関数,KeTCindydでは Textformat()関数を用いる。Textformat()関数は,リストで与えた数でも処理できる。\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{スライダを作る} +\subsubsection{線分スライダを作る} +変数の値をインタラクティブに決めるスライダを作る。 + +まず,Cinderellaの作図ツールで,適当な線分(または直線)と,その上の点をとる。このとき,点が線分上にインシデントになるように,点を線分上にドラッグして線分がハイライトしたときにマウスボタンを離す。 + +線分をAB,AB上の点をCとして,AとCの距離 $|$A,C$|$ を用いて変数の値を決めればよい。 + + 例:x=$|$A,C$|$-5; + +整数を取得したい場合は,天井関数ceil()または,床関数 floor()を用いて整数化する。 + + 例:n=ceil($|$A,C$|$) + +点Cを端点までドラッグした後,さらに点Cをドラッグしようとすると端点も同時に動いてしまうことがある。そこで,端点を選択してインスペクタで「ピンで留める」にチェックを入れておくとよい。 +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + +\subsubsection{円形スライダを作る} +角の値をインタラクティブに決めるスライダを作る。 + +まず,Cinderellaの作図ツールで,適当な円を描き,その上に点をとる。このとき,点が円周上にインシデントになるように,点を円周上にドラッグして円周がハイライトしたときにマウスボタンを離す。 + +円の中心をA,円周上の点をBとしたとき,B.angleで角度を取得できる。ただし,戻り値は$0^\circ 〜 360^\circ$ + +arctan2(B.xy-A.xy) で角を取得することもできる。この場合の戻り値は,$-180^\circ 〜 180^\circ$\\ +\begin{flushright} \hyperlink{functionlist3d}{$\Rightarrow$関数一覧}\end{flushright} + + + +% 関数一覧 ================================== +\hypertarget{functionlist}{} +\section{関数一覧} +\begin{tabbing} +12345678901234567890123456789012345678\=\kill +【設定・定義】\\ +\hyperlink{addax}{Addax(0/1)} \>座標軸を描くかどうかを定める\\ +\hyperlink{addcolor}{Addcolor(com,color)} \>描画色を設定する\\ +\hyperlink{colorcode}{Colorcode(文字1,文字2,color)} \>カラーコードの変換\\ +\hyperlink{deffun}{Deffun(関数名 , 定義リスト )} \>関数を定義する\\ +\hyperlink{definecolor}{Definecolor(色名 , 定義リスト )} \>ユーザー定義色の設定\\ +\hyperlink{defvar}{Defvar(文字列)} \>変数を定義する\\ +\hyperlink{drwxy}{Drwxy()} \>座標軸を先に描く\\ +\hyperlink{fontsize}{Fontsize(記号)} \>フォントサイズを設定する\\ +\hyperlink{ketint}{Ketinit(options)} \>\ketcindy を初期化する\\ +\hyperlink{ptsie}{Ptsize(数)} \>表示する点の大きさを設定する\\ +\hyperlink{setax}{Setax(リスト)} \>座標軸の書式を設定する\\ +\hyperlink{setcolor}{Setcolor(color,options)} \>Windispgでの描画色を設定する\\ +\hyperlink{setmarklen}{Setmarklen(数)} \>軸の目盛の長さを設定する\\ +\hyperlink{setorigin}{Setorigin(座標)} \>表示する座標軸の原点の位置を設定する\\ +\hyperlink{setpen}{Setpen(数)} \>線の太さを設定する\\ +\hyperlink{setpt}{Setpt(数)} \>表示する点の大きさを設定する\\ +\hyperlink{setscaling}{Setscaling(数)} \>縦方向の倍率を設定する\\ +\hyperlink{setunitlen}{Setunitlen(数)} \>単位長を設定する\\ +\hyperlink{setwindow}{Setwindow()} \>描画領域を設定する\\ +\\ +【描画】\\ +\hyperlink{anglemark}{Anglemark(点リスト, options)} \>角の印を入れる\\ +\hyperlink{addgraph}{AddGraph(name ,プロットデータ)} \>ユーザー定義のプロットデータを描画する\\ +\hyperlink{arrowdata}{Arrowdata(始点,終点,options)} \>2点間を結ぶ矢線を描く\\ +\hyperlink{arrowhead}{Arrowhead(点,方向,options)} \>点に矢じりだけを描く\\ +\hyperlink{bezier}{Bezier(name, リスト,リスト,options )} \>単独のベジェ曲線を描く\\ +\hyperlink{beziersmooth}{Beziersmooth(name , リスト,options )} \>なめらかなベジェ曲線を描く。その1\\ +\hyperlink{beziersym}{Beziersym(name , リスト,options )} \>なめらかなベジェ曲線を描く。その2\\ +\hyperlink{bowdata}{Bowdata(点リスト,options)} \>弓形を描く\\ +\hyperlink{bspline}{Bspline(name,リスト,options )} \>2次 Bスプライン曲線を描く\\ +\hyperlink{changestyle}{Changestyle(PD リスト, options)} \>描画オプションを変更する\\ +\hyperlink{circledata}{Circledata(name,点リスト,options)} \>円または多角形を描く\\ +\hyperlink{crosspoint}{Crosspoint(name,PD,PD,範囲リスト)} \>2曲線の交点を作る\\ +\hyperlink{cspline}{CRspline(name,リスト,options )} \>単独のCatmull-Rom スプライン曲線を描く\\ +\hyperlink{deqplot}{Deqplot(name,式,変数名,初期値,options])} \>微分方程式の解曲線を描く\\ +\hyperlink{dotfilldata}{Dotfilldata(name , 方向, PD , optionss)} \>領域に点を敷き詰める\\ +\hyperlink{drawsegmark}{Drawsegmark(name,リスト,options)} \>線分に印をつける\\ +\hyperlink{drawsegmark}{Segmark(name,リスト,options)} \>線分に印をつける\\ +\hyperlink{drwpt}{Drawpoint([点,options])} \>点を表示する\\ +\hyperlink{drwpt}{Drwpt([点,options])} \>点を表示する\\ +\hyperlink{ellipseplot}{Ellipseplot(name,list,str,options)} \>楕円を描く\\ +\hyperlink{enclosing}{Enclosing(name , [位置,方向,数式])} \>複数の曲線から閉曲線を描く\\ +\hyperlink{expr}{Expr(文字列)} \>\TeX 数式を書く\\ +\hyperlink{exprrot}{Exprrot(位置,向き,文字列)} \>傾いた\TeX 数式を書く\\ +\hyperlink{framedata}{Framedata(name , リスト)} \>矩形を描く\\ +\hyperlink{framedata}{Framedata2(name , リスト)} \>矩形を描く\\ +\hyperlink{hatchdata}{Hatchdata(name , 方向, PD , optionss)} \>領域に斜線を引く\\ +\hyperlink{htickmark}{Htickmark([横座標 , 方向 , 文字])} \>横軸に目盛りを描く\\ +\hyperlink{hyperbolaplot}{Hyperbolaplot(name,list,str,options)} \>双曲線を描く\\ +\hyperlink{implicitplot}{Implicitplot(name,str,,str,str,options)} \>陰関数のグラフを描く\\ +\hyperlink{joincrvs}{Joincrvs(name, PDリスト, options)} \>2つのプロットデータをつなげたデータを作る\\ +\hyperlink{letter}{Letter(「座標,位置,文字列]のリスト」)} \>文字列を表示する\\ +\hyperlink{letterrot}{Letterrot(「座標,方向,移動量,文字列])} \>文字列を回転して表示する\\ +\hyperlink{lineplot}{Lineplot(name,2点のリスト,options)} \>2点を結ぶ直線を描く\\ +\hyperlink{listplot}{Listplot(name,点のリスト,options)} \>点を線分で結ぶ\\ +\hyperlink{mkbeziercrv}{Mkbeziercrv(name,リスト,options)} \>作図した点を使ってベジエ曲線を描く\\ +\hyperlink{mkbezierptcrv}{Mkbezierptcrv(リスト,options ) } \>制御点を自動配置してベジエ曲線を描く\\ +\hyperlink{mkcircle}{Mkcircle()} \>幾何円のすべてのPD を作成する\\ +\hyperlink{mksegments}{Mksegments()} \> 幾何線分のすべてのPD を作成する\\ +\hyperlink{ovaldata}{Ovaldata(name, 点リスト,optionss)} \>角を丸くした矩形を描く\\ +\hyperlink{parabolaplot}{Parabolaplot(name,list,str,options)} \>放物線を描く\\ +\hyperlink{parabolaplot}{Parabolaplot(name,点リスト,options)} \>楕円を描く\\ +\hyperlink{paramark}{Paramark(点リスト,options)} \>角の印を入れる\\ +\hyperlink{paramplot}{Paramplot(name,式,変数と定義域,options)} \>媒介変数で表された曲線を表示する\\ +\hyperlink{partcrv}{Partcrv(name,点1,点2,PD)} \>部分曲線を描く\\ +\hyperlink{plotdata}{Plotdata(name,式,変数と定義域,options)} \>関数のグラフを描く\\ +\hyperlink{pointdata}{Pointdata(name,点リスト,optionss)} \>点データを作る\\ +\hyperlink{polygonplot}{Polygonplot(name,点リスト,整数,options)} \>正多角形を描く\\ +\hyperlink{putintersect}{Putintersect(点名,PD1,PD2)} \>2曲線の交点を作る\\ +\hyperlink{putline}{PutonLine(点名,座標1,座標2)} \>直線上に点を作る\\ +\hyperlink{putoncurve}{PutonCurve(name,PD,初期値)} \>曲線上に点を作る\\ +\hyperlink{putpoint}{Putpoint(点名,座標1,座標2)} \>点を作る\\ +\hyperlink{putseg}{PutonSeg(点名,座標1,座標2)} \>線分上に点を作る\\ +\hyperlink{reflectdata}{Reflectdata(name,PD,点リスト,options)} \>プロットデータの鏡映を作成\\ +\hyperlink{reflectpoint}{Reflectpoint(点,対称点/対称軸)} \>点の鏡映を作成\\ +\hyperlink{rotatedata}{Rotatedate(name,PD,角度,中心,options)} \>プロットデータを回転する\\ +\hyperlink{rotatepoint}{Rotatepoint(点,角度,中心)} \>点の位置を回転する\\ +\hyperlink{rulerscale}{Rulerscale(点,リスト,リスト)} \>目盛を打つ\\ +\hyperlink{scaldedata}{Scaledata(name,PD,x,y,中心,options)} \>点を拡大・縮小する\\ +\hyperlink{scalepoint}{Scalepoint(点,比率ベクトル,中心)} \>点の位置を拡大・縮小する\\ +\hyperlink{shade}{Shade(PDリスト , 数)} \>閉曲線の内部にシェードをかける\\ +\hyperlink{translatedata}{Translatedata(name,PD,ベクトル,options)} \>プロットデータを平行移動する\\ +\hyperlink{translatepoint}{Translatepoint(点,ベクトル)} \>点を平行移動する\\ +\hyperlink{vtickmark}{Vtickmark([横座標 , 方向 , 文字])} \>縦軸に目盛りを描く\\ + + \\ +【微積分など】\\ +\hyperlink{derivative}{Derivative(関数式,変数,値)} \>関数の微分係数を求める\\ +\hyperlink{integrate}{Integrate(関数式,変数,範囲,options)} \>関数の定積分値を求める\\ +\hyperlink{inversefun}{Inversefun(関数式,範囲,値)} \>逆関数値を求める\\ + \\ +【作表】\\ +\hyperlink{tabledata}{Tabledata("" , 縦横 ,除外 , options)} \>表の枠を作成する\\ +\hyperlink{tabledatalight}{Tabledatalight("" , 縦横 ,除外 , options)} \>幾何点を持たない表の枠を作成する\\ +\hyperlink{tableseg}{Tableseg( 罫線リスト, 線種) } \>罫線の線種を指定する\\ +\hyperlink{changetablestyle}{ChangeTablestyle(罫線リスト, options)} \>Table の罫線の描画オプションを変更する。\\ +\hyperlink{findcell}{Findcell(列番号, 行番号)} \>セルの情報listを返す\\ +\hyperlink{putcell}{Putcell (列番号, 行番号, 位置, 文字)} \>セルに文字列を入れる\\ +\hyperlink{putcol}{PutcoL (列番号, 位置,文字列リスト)} \>1列に順に文字を書き入れる\\ +\hyperlink{putcolexpr}{PutcoLexpr (列番号, 位置,文字列リスト)} \>1列に順に\TeX 書式の文字を書き入れる\\ +\hyperlink{putrow}{Putrow (行番号, 位置,文字列リスト)} \>1行に順に文字を書き入れる\\ +\hyperlink{putrowexpr}{Putrowexpr (行番号, 位置,文字列リスト)} \>1行に順に\TeX 書式の文字を書き入れる\\ +\hyperlink{settable}{Settable((左上) , 右下)} \>表データを書き出す\\ +\hyperlink{tgrid}{Tgird(セルラベル} \>セル(格子点)の座標を返す\\ +\hyperlink{tlistplot}{Tlistplot(セルラベル1,セルラベル2)} \>セルに斜線を引く\\ + \\ +【値の取得と入出力】\\ +\hyperlink{crossprod}{Crossprod(リスト,リスト)} \>ベクトルの外積を計算する\\ +\hyperlink{dotprod}{Dotoprod(リスト,リスト)} \>ベクトルの内積を計算する\\ +\hyperlink{findarea}{Findarea(PD)} \>プロットデータで囲まれる部分の面積を求める\\ +\hyperlink{findlength}{Findlength(PD)} \>プロットデータで描く曲線の長さを求める\\ +\hyperlink{intersectcrvs}{Intersectcrvs(PD1,PD2,options)} \>プロットデータを交点のリストを返す\\ +\hyperlink{invert}{Invert(PD)} \>プロットデータの点を逆順にする(reverseと同じ)\\ +\hyperlink{meetcurve}{MeetCurve(PD,x,y)} \>曲線上の点を取得する\\ +\hyperlink{lcrd}{Lcrd()} \>幾何点,リスト点の論理座標を取得する\\ +\hyperlink{pcrd}{Pcrd()} \>幾何点,リスト点の物理(表示)座標を取得する\\ +\hyperlink{nearestpt}{Nearestpt(PD,PD)} \>2曲線間の最も近い点を取得する\\ +\hyperlink{nearestptcrv}{Nearestptcrv(点,PD)} \>点に一番近い曲線上の点を取得する\\ +\hyperlink{numptcrv}{Numptcrv(PD)} \>曲線PD の節点データの個数を取得する\\ +\hyperlink{paramoncurve}{ParamonCurve(PD,n,PtL)} \>PD上にある点P のデータを取得する\\ +\hyperlink{pointoncrv}{Pointoncrv(数,PD)} \>パラメータ値をもつプロットデータ上の点\\ +\hyperlink{ptcrv}{Ptcrv(n,PD)} \>曲線PD のn 番目の節点を取得する\\ +\hyperlink{ptstart}{Ptstart(PD)} \>プロットデータの始点を取得する\\ +\hyperlink{ptstart}{Ptend(PD)} \>プロットデータの終点を取得する\\ +\hyperlink{readoutdata}{ReadOutData(ファイル名)} \>外部データを読み込む\\ +\hyperlink{sprintf}{Sprintf(実数,長さ)} \>小数点以下の長さを固定した文字列に変換\\ +\hyperlink{writetosci}{WritetoSci(ファイル名,options)} \>すべてのソースを Scilab 用に書き出す\\ +\hyperlink{writetosci}{WritetoScibody(ファイル名)} \>ボディのソースを Scilab 用に書き出す\\ +\hyperlink{makeshell}{Makeshell(ファイル名)} \>Macのシェルスクリプトを書き出す\\ +\hyperlink{makeshell}{Makebat(ファイル名)} \>Windowsのバッチファイルを書き出す\\ +\hyperlink{textformat}{Textformat(数,桁数)} \>小数点以下の桁数を指定して数値を文字列化する\\ +\hyperlink{viewtex}{Viewtex()} \>\TeX のソースファイルを書き出す。引数なし\\ + \hyperlink{workprocess}{Workprocess()} \>作図の経過を取得する\\ + \\ +【その他】\\ +\hyperlink{assign}{Assign(文字列)} \>文字列中のある文字を値で置き換える\\ +\hyperlink{bbdata}{BBdata(ファイル名)} \>画像のサイズを求める\\ +\hyperlink{changework}{Changework(パス)} \>作業ディレクトリを変更する\\ +\hyperlink{com0th}{Com0th(コマンド)} \>ScilabのOpenfileの前に置くコマンドを定義する\\ +\hyperlink{com1st}{Com1st(コマンド)} \>ScilabのOpenfileの前に置くコマンドを定義する\\ +\hyperlink{com2nd}{Com2nd(コマンド)} \>ScilabのOpenfileのあとに置くコマンドを定義する\\ +\hyperlink{com2ndpre}{Com2ndpre(コマンド)} \>ScilabのOpenfileのあとに置くコマンドを定義する\\ +\hyperlink{dashline}{Dashline(PD名)} \>プロットデータを破線で描く\\ +\hyperlink{dottedline}{Dottedline(PD名)} \>プロットデータを点線で描く\\ +\hyperlink{drwline}{Drwline(PD名)} \>プロットデータを実線で描く\\ +\hyperlink{figpdf}{Figpdf(option)} \>出力枠サイズのPDFを作る\\ +\hyperlink{helplist}{Helplist()} \>ヘルプデータを作る\\ +\hyperlink{help}{Help(str)} \>コマンドヘルプを表示する\\ +\hyperlink{helpkey}{Helpkey(str)} \>キーワードで関数を検索する\\ +\hyperlink{help}{Ketcindylogo()} \>\ketcindy のロゴを書き出す\\ +\hyperlink{indexall}{Indexofall(str1,str2)} \>文字列 str1 から str2 を検索しその位置をすべて返す\\ +\hyperlink{op}{Op(n,list)} \> リストまたは文字列から要素を抜き出す\\ +\hyperlink{texcom}{Texcom(コード)} \>\TeX のコードを書き出す\\ +\hyperlink{windispg}{Windispg()} \>定義されたプロットデータを描画面に描く\\ + \\ +【Rとの連携】\\ +\hyperlink{boxplot}{Boxplot(名前,データ,位置,高さ,option)} \>箱ひげ図を描く\\ +\hyperlink{calcbyr}{CalcbyR(変数名,コマンド列,option)} \>Rのコマンドを実行して結果を返す\\ +\hyperlink{histplot}{Histplot(name,data)} \>ヒストグラムを描く\\ +\hyperlink{plotdatar}{PlotdataR(name,式,変数)} \>Rの関数のグラフを描く\\ +\hyperlink{plotdiscr}{PlotdiscR(name,式,変数)} \>離散型のグラフを描く\\ +\hyperlink{readcsv}{Readcsv(name,filename,option)} \>csvファイルを読む\\ +\hyperlink{scatterplot}{Scatterplot(name,filename,option)} \>2次元データを読み込み,散布図を描く\\ + \\ +【Maximaとの連携】\\ +\hyperlink{calcbyM}{CalcbyM(name,リスト,option)} \>Maximaのスクリプトを実行する\\ +\hyperlink{example}{Example("Mxfun",文字)} \>Mxfunの使用例を表示\\ +\hyperlink{mxbatch}{Mxbatch(リスト)} \>Maximaの外部スクリプト用コマンドを作る\\ +\hyperlink{mxfun}{Mxfun(name,式,リスト,option)} \>Maximaの関数を実行する\\ +\hyperlink{mxtex}{Mxtex(num,式)} \>式をTeX書式にする\\ + \\ +【Risa/Asirとの連携】\\ +\hyperlink{calcbyA}{CalcbyA(name,リスト,option)} \>Risa/Asirのスクリプトを実行する\\ +\hyperlink{asirfun}{Asirfun(name,式,リスト,option)} \>Risa/Asirの関数を実行する\\ + \\ +【FriCASとの連携】\\ +\hyperlink{calcbyF}{CalcbyF(name,リスト,option)} \>FriCASのスクリプトを実行する\\ +\hyperlink{frfun}{Frfun(name,式,リスト,option)} \>FriCASの関数を実行する\\ + \\ +【表計算ソフトとの連携】 +\hyperlink{tab2list}{Tab2list(str,option)} \>str の内容をリストに変換する\\ +\hyperlink{Dispmat}{Dispmat(lsit)} \>リストの内容を行列型にコンソールに表示する\\ + +\hypertarget{functionlist3d}{} + +【KeTCindy3D 設定・定義】\\ +\hyperlink{ketinit3d}{Ketinit3d()} \>KeTCindy3Dの使用宣言\\ +\hyperlink{start3d}{Start3d()} \>3Dの開始\\ + \\ +【KeTCindy3D 描画】\\ +\hyperlink{bezier3d}{Bezier3d(name, リスト, リスト)} \>空間ベジェ曲線を描く\\ +\hyperlink{changstyle3d}{Changstyle3d(リスト, リスト)} \>3dプロットデータの属性を変更\\ +\hyperlink{concatobj}{Concatob(リスト,option)} \>いくつかのobjデータを結合\\ +\hyperlink{crvsfparadata}{Crvsfparadata(name,PD,PD2,式,opt,opt)} \>曲線の曲面による陰線処理\\ +\hyperlink{datalist}{Datalist2d()} \>画面に描かれているすべてのプロットデータ\\ +\hyperlink{datalist}{Datalist3d()} \>画面に描かれているすべてのプロットデータ\\ +\hyperlink{dist3d}{Dist3d(点名,点名)} \>空間の2点の距離\\ +\hyperlink{drawpoint3d}{Drawpoint3d(座標)} \>空間点を描く\\ +\hyperlink{embed}{Embed(name,PD,式)} \>埋め込みデータ作成\\ +\hyperlink{intersectcrvsf}{Intersectcrvsf(name,PD,式)} \>曲線と曲面の交点を求める\\ +\hyperlink{intersectsgpL}{IntersectsgpL(点名,線分,面,描画方法)} \>空間の直線と平面の交点\\ +\hyperlink{invparapt}{Invparapt(座標,PD)} \>描画面座標に対応する曲線上の座標\\ +\hyperlink{mkbezierptcrv3d}{Mkbezierptcrv3d(点リスト)} \>制御点を自動的にとる空間ベジェ曲線\\ +\hyperlink{nohiddenbyfaces}{Nohiddenbyfaces(name,PD,PD,opt1,opt2)} \>多面体と空間曲線を陰線処理\\ +\hyperlink{parapt}{Parapt(座標)} \>点の投影面での座標\\ +\hyperlink{partcrv3d}{Partcrv3d(name,始点,終点,PD)} \>曲線PDの部分曲線を作る\\ +\hyperlink{perpplane}{Perpplane(点名, 点, ベクトル,option)} \>点を通り垂直な平面上の基準点\\ +\hyperlink{perppt}{Perppt(点名,点,点リスト,option)} \>平面に下ろした垂線の足\\ +\hyperlink{phparadata}{Phparadata(name,name2,options)} \>多面体を陰線処理して描く\\ +\hyperlink{projcoordpara}{Projcoordpara()} \>投影座標を求める\\ +\hyperlink{putaxes3d}{Putaxes3d([x,y,z])} \>軸上に幾何点をとる\\ +\hyperlink{putonCurve3d}{PutonCurve3d(点名,PD)} \>空間曲線上に点をとる\\ +\hyperlink{putonseg3d}{Putonseg3d(点名,点1,点2)} \>線分上に点をとる\\ +\hyperlink{putpoint3d}{Putpoint3d(リスト,option)} \>空間点をとる\\ +\hyperlink{readobj}{Readobj(ファイル名)} \>objファイルを読み込む\\ +\hyperlink{reflectpoint3d}{Reflectpoint3d(点,リスト)} \>点を鏡映\\ +\hyperlink{rotate3pt}{Rotate3pt( 点,vec,角度,点)} \>空間点を回転\\ +\hyperlink{rotatedata3d}{Rotatedatat3d(name,PD,vec,角度,点)} \>プロットデータを回転\\ +\hyperlink{sf3data}{Sf3data(name, リスト,options)} \>陰線処理なしの空間曲面を描く\\ +\hyperlink{sfbdparadata}{Sfbdparadata(name, 式,options)} \>曲面を陰線処理して描く\\ +\hyperlink{skeletonparadata}{Skeletonparadata(name,options)} \>スケルトン処理のデータ作成\\ +\hyperlink{spacecurve}{Spacecurve(name, 式, 定義域,options)} \>空間曲線のデータ作成\\ +\hyperlink{spaceline}{Spaceline(リスト)} \>空間の折線データ作成\\ +\hyperlink{translatedata3d}{Translatedata3d(name,PD, 平行移動量)} \>空間プロットデータを平行移動\\ +\hyperlink{translatept3d}{Translatept3d(座標,平行移動量)} \>空間点を平行移動\\ +\hyperlink{vertexedgeface}{VertexEdgeFace(面データ,option)} \>頂点と面から辺を求め,辺を描く\\ +\hyperlink{wireparadata}{Wireparadata(name,PD,式,int,int,opt,opt)} \>曲面のワイヤフレームを陰線処理\\ +\hyperlink{xyzax3data}{Xyzax3data(name,文字,文字,文字,options)} \>座標軸の表示\\ +\hyperlink{xyzcoord}{Xyzcoord(P.x,P.y,Pz.y)} \>主副画面で決まる点の座標\\ + \\ +【KeTCindymv】\\ +\hyperlink{moviedata}{Moviedata(str1,str2,options)} \>動画データの作成\\ +\end{tabbing} + + +%3D第3節 +\end{document}
\ No newline at end of file |