diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex |
Initial commit
Diffstat (limited to 'graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex')
-rw-r--r-- | graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex | 8423 |
1 files changed, 8423 insertions, 0 deletions
diff --git a/graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex b/graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex new file mode 100644 index 0000000000..aa8c5bd234 --- /dev/null +++ b/graphics/ketcindy/ketcindyfolder/doc/source/ketmanual/KeTCindyReferenceJ.tex @@ -0,0 +1,8423 @@ +\documentclass[papersize,a4paper,12pt,uplatex]{jsarticle} +\usepackage{ketpic,ketlayer} +\usepackage{amsmath} +% \usepackage{amsmath,newtxmath} +\usepackage[dvipdfmx]{graphicx,color} +\usepackage{wrapfig} +\usepackage{jsverb} +\usepackage[dvipdfmx,bookmarks=false,colorlinks=true,linkcolor=blue]{hyperref} +\setmargin{20}{20}{15}{25} +\usepackage{setspace} +\usepackage{comment} +\setcounter{tocdepth}{3} + +\begin{document} +\title{\ketcindy 関数リファレンス} +\author{\ketcindy\ Project Team} +\maketitle + +\begin{center}- 第3.2版 -\end{center} +\hypertarget{index}{} +\tableofcontents + +\newpage + +\section{平面の図形とグラフ} + +%設定・定義 ================================== + +\subsection{設定・定義} + +\subsubsection{環境設定} + +\begin{description} + +\vspace{\baselineskip} +\hypertarget{ketinit}{} +\item[関数]Ketinit(options) +\item[機能]\ketcindy を初期化する。平面図形ではDrawスロットに,空間図形ではInitialization スロットの冒頭に記述する必要がある。 +\item[説明]option 作業サブフォルダ\\%,縦方向の倍率と描画領域を設定する。\\ +\phantom{option }通常は不要で,\verb|Ketinit()| だけでよい。 + +\vspace{\baselineskip} +\hypertarget{Initglist}{} +\item[関数]Initglist(), Setglist(), Addglist() +\item[機能]ketlibスロットで作られる描画データを描画リストに追加する。 +\item[説明]Implicitplot,Hatchdataなど実行時間のかかるコマンドをfiguresスロットにおくと,その都度実行されてしまう。それを避けるためketlibスロットにおいたときに用いる。 + +\begin{verbatim} + Initglist(); // ketlibスロットで + Implicitplot(''1'',fun,rng); + Setglist(); + + Ketinit(); // figuresスロットで + Addglist(); +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{setfiles}{} +\item[関数]Setfiles(filename) +\item[機能]出力するファイル名の設定 +\item[説明]出力するTexのファイル名を指定する。 + +出力するファイル名は 初期設定では,作図しているCinderellaのファイル名。 + +たとえば,triangle.cdy で作図して出力すると,triangle.tex ができる。 + +これに対し,triangle.cdy で作図しているときに,grav.tex で出力したい場合は + +\hspace{10mm}\verb|Setfiles("grav");| + +とすると,grav.tex ができる。 + +\vspace{\baselineskip} +\hypertarget{setparent}{} +\item[関数]Setparent(filename) +\item[機能]Parent ボタンで出力するファイル名の設定 +\item[説明]Figpdf() を使ってParent ボタンで出力するTexのファイル名を指定する。 + +Parent ボタンで出力するファイル名は 初期設定がないので,指定する必要がある。 + +たとえば,triangle.cdy で作図しているときに,図サイズの grav.pdf を作る場合, + +\hspace{10mm} \verb|Setparent("grav");| + +とすると,図のTeXファイルtriangle.tex と PDFを作る grav.tex ができ,ここから grav.pdf ができる。 + +\vspace{\baselineskip} +\hypertarget{changework}{} +\item[関数]Changework(パス名) +\item[機能]作業ディレクトリを指定(変更)する +\item[説明]作業ディレクトリは, 初期設定では,現在作図しているファイルのあるフォルダ(ディレクトリ)の fig フォルダである。これを変更する。 + +\vspace{\baselineskip} +\hypertarget{addpackage}{} +\item[関数]Addpackage(パッケージ名) +\item[機能]TeXのパッケージを追加する +\item[説明]プレビュー用のTeXソースにパッケージを追加する。 + +\vspace{\baselineskip} + 【例】emathパッケージを追加する。 + +\hspace{10mm}\verb|Addpackage("emath"); | + + または + +\hspace{10mm}\verb|Addpackage(["emath"]); | + + により, +プレビュー用のTeXのプリアンブルに + +\hspace{10mm}\verb| \usepackage{emath}| + +が追加されて,emath のコマンドが利用できる。 + +\vspace{\baselineskip} +注)初期設定では,次のパッケージを利用している。 +\begin{verbatim} + ketpic, ketlayer, amsmath, amssymb, graphicx, color + \end{verbatim} + +\vspace{\baselineskip} +\hypertarget{usegraphics}{} +\item[関数]Usegraphics("pict2e") +\item[機能]TeXのグラフィクスパッケージを\verb|"pict2e"| に変更する +\item[説明]デフォルトのパッケージは \verb|"tpic"| であるが,これを\verb|"pict2e"| に変更する。 + + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +\newpage +%-----------------描画設定・定義-------------------------------------- +\subsubsection{描画設定・定義} + +\vspace{\baselineskip} +\begin{description} +\hypertarget{addax}{} +\item[関数]Addax(0または1) +\item[機能]座標軸の表示 +\item[説明]引数が1のとき座標軸を描き,0のとき描かない。 +初期設定は1で,座標軸を描かない場合のみ \verb|Addax(0)| とすればよい。 + +\vspace{\baselineskip} +【例】三角形を描く + +左図が 初期設定(座標軸表示) Addax(0) をつけると右図になる。 + +\begin{verbatim} +Listplot([B,A,C]); +Letter([A,"ne","A",B,"se","B",C,"se","C"]); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{10mm} \input{Fig/addax1}\input{Fig/addax2} + + +\hypertarget{setax}{} +\item[関数]Setax() +\item[機能]座標軸の書式を設定する。 +\item[説明]Cinderellaの描画面には反映されない。(座標軸は描かれない) + +引数はリストで与え,要素は順番に + +1. 軸の形状(直線は "l" ,矢印は "a") 初期設定は直線\\ + 矢印の大きさの倍率を指定するときは,"a0.5"のようにする。\\ + また,矢印のスタイルは Setarrowで指定する。 + +2. 横軸名 初期設定は \verb|"x"| + +3. 横軸名の位置 初期設定は \verb|"e"| + +4. 縦軸名 初期設定は \verb|"y"| + +5. 縦軸名の位置 初期設定は \verb|"n"| + +6. 原点名 初期設定は \verb|"O"|(文字として書かれる) + +7. 原点名の位置 初期設定は \verb|"sw"| + +8. 線種 + +9. 線の色 + +10. ラベルの色 + +それぞれダブルクォートでくくる。色は,色名が使える。"red" など。 + +10の引数のうちn番目だけを指定する場合は,[n,"内容"]で指定できる。 + +また,後方は省略できる。 + +\vspace{\baselineskip} +【例】座標軸の先端を矢印にし,原点の北西にOを書く。 + +\hspace{10mm} \verb|Setax(["a","","","","","","nw"]);| + +【例】原点の北西にOを書く。 + +\hspace{10mm}\verb|Setax([7,"nw"]);| + +【例】軸を赤の点線にする。 + +\hspace{10mm}\verb|Setax(["","","","","","","","do","red"]);| + +【例】先端を矢印にし,横軸を$\theta$,縦軸を$x$にして矢じりの左側に書く。 + +\hspace{10mm} \verb|Setax(["a","\theta","","x","w"]);| + +\vspace{\baselineskip} +\hspace{10mm}\input{Fig/setax-theta} + + +\vspace{\baselineskip} +\hypertarget{drwxy}{} +\item[関数]Drwxy(), Drwxy(options) +\item[機能]指定する手順で座標軸を描く +\item[説明]座標軸は 初期設定では最後に描かれるが,座標軸上に白抜きの点を表示するなど,先に描くことが必要な場合に用いる。描画面には座標軸は表示されない。 + +options は次のリストである。\\ +\hspace*{10mm}["Origin=",\ "Xrng=",\ "Yrng="] + +\begin{layer}{150}{0} +\putnotese{75}{10}{\scalebox{0.8} {\input{Fig/drwxy}}} +\end{layer} + +【例】点$(-\pi,\ 0)$と$(\pi,\ 0)$を白抜きの点で表示する。 +\begin{verbatim} +Setax([7,"se"]); +Setpt(5); +Pointdata("1",[[-pi,0]],["Inside=0"]); +Drwxy(); +Plotdata("1","sin(x)","x",["dr","Num=200"]); +Pointdata("2",[[pi,0]],["Inside=0"]); +\end{verbatim} + +このスクリプトでは,\verb| Pointdata("1",[[-pi,0]],["Inside=0"]);| を実行したのち座標軸を描き,次に,$y=\sin x$ のグラフを描いてから,再び \verb| ["Inside=0"]);|にして実行するので,点($-\pi$,0) の上を座標軸が通り,点($\pi$,0)は座標軸とグラフの上を通るので白抜きになる。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{definecolor}{} +\item[関数]Definecolor(色名 , 定義のリスト) +\item[機能]色名を定義する +\item[説明]ユーザー命名の色名を定義する。定義リストは RGBまたはCMYKのリスト + +各色0〜1の範囲で指定する。定義した色名は,Setcolor(color,options)で使うことができる。 + +なお,\ketcindy では,68色を色名で使うことができる。色の名称は\hyperlink{colorcodelist}{カラーコード一覧} 参照。 + +\vspace{\baselineskip} +【例】暗い紫色を darkmaz の名称で定義して使う。 +\begin{verbatim} +Definecolor("darkmaz",[0.8,0,0.8]); +Setcolor("darkmaz"); +\end{verbatim} + + +\vspace{\baselineskip} +\hypertarget{setcolor}{} +\item[関数]Setcolor(color,options) +\item[機能]描画色の設定 +\item[説明]引数colorはカラーコードまたは色の名称。 + +カラーコードはRGBまたはCMYKをリストで与える。各色0〜1。 + +色の名称は\hyperlink{colorcodelist}{カラーコード一覧} の68色が指定できる。 + + +\vspace{\baselineskip} +【例】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");|でもよい。 +座標軸を描く場合は,このあと \verb|Setcolor("black")| で黒に戻しておかないと,座標軸が赤で表示されてしまうので要注意。 + + +\vspace{\baselineskip} +\hspace{20mm} \includegraphics[width=3.5cm,bb=0 0 161 134]{Fig/setcolor.pdf} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{deffun}{} +\item[関数]Deffun(関数名 , 定義のリスト) +\item[機能]関数を定義する +\item[説明]関数定義は,CindyScript の関数定義 f(x):=式 でもできるが,Deffun()を使うことにより,Rでこの関数を利用することができる。目的に応じて使い分けるとよい。 + +式のリストには if文を用いた場合分けの関数式を記述することもできる。 + +\vspace{\baselineskip} +【例】 +$f(x)=\dfrac{1}{x^2+1}$ を定義し,グラフを描く。 + +\begin{verbatim} +Deffun("f(x)",["regional(y)","y=1/(x^2+1)","y"]); +Plotdata("1","f(x)","x"); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{20mm}\scalebox{0.9}{\input{Fig/deffun01}} + + +\vspace{\baselineskip} +【例】$f(x)=\left\{\begin{array}{l}1 (x\geq 0)\\ -1 (x<0)\\ \end{array}\right.$ を定義してグラフを描く。 + +\begin{verbatim} +Deffun("f(x)",["regional(y)","if(x>=0,y=1,y=-1)","y"]); +Plotdata("1","f(x)","x",["Dis=1","Num=100"]; +\end{verbatim} + +\vspace{\baselineskip} +\hspace{20mm}\scalebox{0.9}{\input{Fig/deffun02}} + +if 文はネストすることができる。 +\begin{verbatim} +Deffun("f(x)",["regional y","if(x>1,y=1,if(x>-1,y=x,y=-1))","y"]); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{20mm}\scalebox{0.9}{\input{Fig/deffun03}} + + +\vspace{\baselineskip} +\hypertarget{defvar}{} +\item[関数]Defvar(文字列) +\item[機能]変数を定義する +\item[説明]変数の定義をRと共有する。 + +【例】\verb|Defvar("const=3");| + +\vspace{\baselineskip} +複数の変数を定義するときはリストにする。 + +【例】\verb|Defvar([“a”,3,”b”,1]);| + +\vspace{\baselineskip} +\hypertarget{fontsize}{} +\item[関数]Fontsize(記号) +\item[機能]フォントサイズを設定する +\item[説明]次に Fontsize() を実行するまで有効\\ +記号は,"t" , "ss" , "f", "s" , "n" , "la","La", "LA", "h" , "H" + +【例】作図ツールの「点を加える」で,A〜Gの点をとっておく。小さい方からいくつか表示する。 +\begin{verbatim} +Pointdata("1",[A,B,C,D,E,F,G],["Size=2"]); +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} + +\vspace{\baselineskip} +\hypertarget{setpt}{} +\hypertarget{ptsize}{} +\item[関数]Ptsize(n) , Setpt(n) +\item[機能]表示する点の大きさを設定する。 +\item[説明]Ptsize() と Setpt() は同じである。 初期設定は1 + +全体の点の大きさを設定する。点の大きさを個々に変えたい場合は,sizeオプションを用いる。 + +\vspace{\baselineskip} +【例】1から4までの点の大きさ + +あらかじめ,Cinderellaの作図ツールで点A,B,C,Dを作図しておく。 + +\begin{layer}{150}{0} +\putnotese{60}{5}{\input{Fig/pointsize}} +\end{layer} + +\begin{verbatim} +Pointdata("1",A,["Size=1"]); +Pointdata("2",B,["Size=2"]); +Pointdata("3",C,["Size=3"]); +Pointdata("4",D,["Size=4"]); +\end{verbatim} +%\hspace{10mm}\input{Fig/pointsize} + + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{setarrow}{} +\item[関数]Setarrow(size,angle,position,cut,segstyle) +\item[機能]矢線の形状の設定をする。 +\item[説明]引数は,順に,矢じりの大きさ, 開き角, 矢じり位置, 切り込み位置, 線種と表示色 + +それぞれの意味と値は,\hyperlink{arrowdata}{Arrowdata()} を参照のこと。 + +\vspace{\baselineskip} +\hypertarget{setmarklen}{} +\item[関数]Setmarklen(数) +\item[機能]座標軸の目盛の長さを設定する +\item[説明] \hyperlink{htickmark}{Htickmark()} , Vtickmark() で座標軸に目盛を入れるとき,その長さを設定する。 + +\vspace{\baselineskip} +\hypertarget{setorigin}{} +\item[関数]Setorigin(座標) +\item[機能]描画する座標軸の原点を設定(移動)する。座標系は変化しない。 +\item[説明]描画する座標軸の原点を引数の座標とする。座標は点の識別名でもよい。 + +\vspace{\baselineskip} +【例】原点を (3,2) として座標軸を描く。 + +\hspace{10mm}\verb|Setorigin([3,2]);| + +原点を点Aの位置にして座標軸を描く。 + +\hspace{10mm}\verb|Setorigin(A);| + +\vspace{\baselineskip} +【例】原点は(3,2)に移動するが,スクリプトではもとの座標系を使う。 +\begin{verbatim} +Setorigin([3,2]); +Listplot([A,B,C,A]); +Pointdata("1",[1,1],["Size=3"]); +Letter([[1,1],"s2","P"]); +\end{verbatim} +左が実行時のCinderellaの画面,右が\TeX の結果。\\ + +\hspace{10mm} \includegraphics[bb=0 0 299.02 250.01, width=4cm]{Fig/setorigin.pdf} +\hspace{5mm}\input{Fig/setorigin} + +\vspace{\baselineskip} +\hypertarget{setpen}{} +\item[関数]Setpen(数) +\item[機能]線の太さの初期値を設定する + +\verb|Listplot()| などの描画関数のオプション \verb|dr| で,個々の太さは指定できる。 + +\vspace{\baselineskip} +\hypertarget{setscaling}{} +\item[関数]Setscaling(倍率) +\item[機能]縦方向の倍率を設定する。倍率は実数またはリスト。実数の場合は縦方向,リストの場合は[横方向,縦方向]の指定となる。 +\item[説明]2次関数の応用問題などでは,グラフが縦に大きくなる場合があり,$y$軸方向のスケーリングを変えたいことがよくある。次のスクリプトは,$f(x)=-x^2+10x$ のグラフを縦軸方向を半分にして描くものである。 + +\begin{layer}{150}{0} +\putnotese{80}{5}{\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} +ここで,点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} + +\vspace{\baselineskip} +\hypertarget{setunitlen}{} +\item[関数]Setunitlen(文字列) +\item[機能]単位長を設定する。 初期設定は 1cm。 + +この関数は,スクリプトの初めの方に書くのがよい。 + +【例】Setunitlen("8mm") + +\vspace{\baselineskip} +\hypertarget{setwindow}{} +\item[関数]Setwindow(xの範囲, yの範囲) +\item[機能]出力する描画領域を設定する。 +\item[説明]出力する描画領域は,通常は2点SWとNEを対角とする矩形領域である。 + +この2点をドラッグすることによりビジュアルに描画領域を決められる。 + +しかし,これとは別に出力範囲を設定したい場合にこの関数を用いる。 + +また,表を作成したときは,表の範囲が出力範囲として優先される(Tabledata()を実行したとき)ので,表外に図を描いた場合は,最後にこの関数で出力範囲を指定して書き出す。 + +\vspace{\baselineskip} +【例】\verb|Setwindow([-5,5],[-1,3]);| + +\vspace{\baselineskip} +\hspace{10mm}\includegraphics[bb=0.00 0.00 415.02 199.01,width=6cm]{Fig/setwindow.pdf} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +%\newpage +%=========== 描画 ====================== +\subsection{描画} +\subsubsection{書式とオプション} + +描画関数は曲線などを作図する関数である。 + +基本的な書式は次の通り。 + +\hspace{20mm} 関数名(name , 点リストなど , options); + +nameは,プロットデータの名称で,関数ごとに決められた頭部のあとに付けられる。たとえば,線分を描く Listplot() でできるプロットデータは,頭部が"sg"であり,nameを"1"とすれば,"sg1" という名称のプロットデータができる。name指定は不要の場合もあり,その場合は \ketcindy が自動的に名称を作成する。なお,name に演算記号は使えないので,番号として負の数は使えない。 + +点リストなどには,点の座標,点の識別名,複数の点のリスト,複数の点を示す文字列などがあり,関数によって異なる。点はCinderellaで作図した幾何要素の点を利用できる。 + +optionsは,線種・表示する文字列・解像度・出力の有無などを指定するオプション群。 + + 線種はつぎの4通り。 初期設定は実線。 + +\begin{tabbing} +1234\=5678901234567\=\kill +\>"dr, n" \>太さnの実線で描く。\\ +\>"da,m,n"\>破線を描く。\\ +\>\> mは破線の長さ,nは破線の間隔(m,nは省略可)\\ +\> \>m,n オプションはCinderellaの描画面には反映されない。\\ +\>"id,m,n" \>ギャップからはじまる破線を描く。\\ +\>"do,m,n"\>点線で描く。\\ +\>\>mは点の間隔,nは太さ(m,nは省略可) +\end{tabbing} + +描画色指定は,RGBまたはCMYKのリストで指定するか,色名を用いる。 + +\hspace{10mm}【例】\verb|"Color=[0,0.7,0]"| で暗い緑になる。 + +出力の有無は +\begin{tabbing} +1234\=567890123\=\kill + \>"notex"\>Cinderella画面上の図形を出力しない\\ + \>"nodisp" \>Cinderella画面上にも出力しない + \end{tabbing} + + "nodisp"は画面上にも,Rへのデータにも出力されないが,プロットデータは作成されるので,プロットデータだけを利用したい場合に有効である。 + +\hspace{10mm}【例】\verb|pdata=Circledata([A,B],["nodisp"]);| + +として,後にプロットデータ pdata を利用する。 + +その他,次のようなオプションがある。 +\begin{tabbing} +1234\=567890123\=\kill + \>"Size=n"\>点の大きさ,線の太さの指定\\ + \>"Num=n"\>曲線の場合の分割数(プロットデータの個数+1)\\ +\end{tabbing} + +%=========== 点・直線 ====================== +\subsubsection{点・線分・直線} +\begin{description} + +\vspace{\baselineskip} +\hypertarget{pointdata}{} +\item[関数]Pointdata(name , 点リスト , options) +\item[機能]点のデータを作成する。 +\item[説明]与えられた座標の点データを作成する。オプションは"Size=","Color=","Inside"。 + +Inside オプションは,点の内部についての指定。ただし,Cinderellaの描画面には反映されない。 + +0 : 白抜き + +0から1まで : 濃度 + +-1 : 塗らない + +カラーコードまたは色名 : その色で塗る + +\vspace{\baselineskip} +【例】 + +(1) 座標指定で2つの点データを作る。 + +\hspace{10mm} \verb|Pointdata("1",[[1,2],[-2,3]]);| + +(2) 作図した点A,Bについて,点データを作る。 + +\hspace{10mm} \verb|Pointdata("1",[A,B]);| + +\hspace{5mm}A,Bが作図されていない場合は作成されない。 + +\hspace{5mm}Cinderellaの描画面上では既存の点A,Bに黒の点が重なって表示される。 + +(3) Aの位置に大きさ4で点を作る。 + +\hspace{10mm} \verb|Pointdata("1",A,["size=4"]);| + +(4) 点データを作り,TeXにオプション0(白抜き)で描く + +\hspace{10mm}\verb|Pointdata("1",[A,B],["Inside=0"]);| + +(5) 点データを作るが,TeXには出力しない + +\hspace{10mm}\verb|Pointdata("1",[[3,4],[5,6]],["notex"]);| + +(6)点データを作るが,TeXには出力せず画面上にも表示しない。 + +\hspace{10mm} \verb|Pointdata("1",[[3,4],[5,6]],["nodisp"]);| + +\begin{layer}{150}{0} +\putnotese{90}{5}{ \input{Fig/pointdata}} +\end{layer} + +(7) 節点を明示した木を描く +\begin{verbatim} +Ptsize(3); +Pointdata("1",[[1,2],[3,4],[5,2]]); +Listplot("1",[[0,0],[1,2],[3,4],[5,2],[4,0]]); +Listplot("2",[[1,2],[2,0]]); +Listplot("3",[[5,2],[6,0]]); +\end{verbatim} + +注) 幾何点の有無など,付録の「\hyperlink{mkpttable}{点の作図についての比較表}」を参照のこと。 + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\vspace{\baselineskip} +%\hypertarget{drwpt}{} +%\item[関数]Drwpt(点,option), Drawpoint(点,options) +%\item[機能]点を表示する +%\item[説明]座標または幾何点の識別名を与えて点を表示する。これだけではCinderellaの描画面には描かれないので,描画面にも表示するにはCinderellaの作図ツールで作図するか,Pointdata() または Putpoint() を用いる。 + +%複数の点の場合は座標または識別名はリストで与える。 + +%optionに数字 0 を入れると,白抜きで表示する。なお白抜きの場合は,Ptsize()で点の大きさを少し大きめにとるとよい。 + +%可読性を高めるときはDrawpointを推奨する。 + +%\vspace{\baselineskip} +%【例】座標(1,1)と(4,3)に点を表示する。Cinderellaの描画面には描かれない。 + +%\hspace{10mm} \verb|Drwpt([[1,1],[4,3]]);| + +%\vspace{\baselineskip} +%【例】Cinderellaで点A,B,Cを作図しておき,\TeX で表示する。 + +%\hspace{10mm} \verb|Drwpt([A,B,C]); | + +%\vspace{\baselineskip} +%【例】線分ABの右端(B)を白抜きで表示する + +%\begin{layer}{150}{0} +%\putnotese{50}{8}{\input{Fig/drawpoint}} +%\end{layer} +%\begin{verbatim} + % Ptsize(5); +%Listplot([A,B]); +%Drawpoint(B,0); +%\end{verbatim} + +%※Drawpoint([A,B],0);とすれば,両端が白抜きになる。 + +%\vspace{\baselineskip} +%{\bf 点の表示方法} + + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{putpoint}{} +\item[関数]Putpoint(点名 , 座標1 ,座標2 ) +\item[機能]点を作る +\item[説明]識別名が点名の点を,既存でなければ座標1に作る。既存ならば座標2に移動する。Texには出力されない。 + +\vspace{\baselineskip} +【例】点Aを作る。 + +(1,1) に固定点Aを作る。 この点は動かすことができない。 + +\hspace{10mm} \verb|Putpoint("A",[1,1]);| + +(1,1)に自由点を作るには次のようにする。 + +\hspace{10mm}\verb|Putpoint("A",[1,1],[A.x,A.y]);| + +この点は座標2の効果により,自由点となり,ドラッグして動かすことができる。 + +\vspace{\baselineskip} +注)点名は半角アルファベットとする。数字や漢字でもCinderellaでは点ができるが,Rでエラーとなる。 + +\vspace{\baselineskip} +\hypertarget{putintersect}{} +\item[関数]Putintersect(点名 , PD1 , PD2 , [No] ) +\item[機能]2曲線の交点を作る +\item[説明]PD1,PD2は2曲線のプロットデータ名。作成される点は幾何点。 + +描画範囲に交点が1つだけのとき,第4引数がなくても交点が作られる。 + +描画範囲に2つ以上の交点がある場合,第4引数を省略するとコンソールに交点の座標のリストと,「Choose point number 」というガイドが表示される。そこで,引数のNoとして,その番号を指定すると,その点が作られる。この関数で作成されるのは幾何点だけなので,\TeX の図に点として明示するためにはPointdata()で書き出す。 + +次の例は,3次曲線と直線の交点を3つとも取ったものである。 + +\begin{layer}{150}{0} +\putnotese{80}{5}{\input{Fig/putintersect}} +\end{layer} + +\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} + +\vspace{\baselineskip} + 交点が存在しない場合は,「No intersect point」がコンソールに表示される。 + +\vspace{\baselineskip} +\hypertarget{putoncurve}{} +\item[関数]Putoncurve(点の名前, プロットデータ, options) +\item[機能]曲線上に点を乗せる。 +\item[説明]点が存在しない場合は新たに作る。すでにその点が存在する場合は,その点の$x$座標を使う。初期値の$x$座標の 初期設定は 0。 + +optionsは,$x$座標の範囲をリストで与える。 + +\vspace{\baselineskip} +【例】アステロイド上の動点P をとる。 +\begin{verbatim} +Paramplot("1","[2*cos(t)^3,2*sin(t)^3]","t=[0,2*pi]"); +Putoncurve("P","gp1",[-1,1]); +\end{verbatim} +点Pがアステロイド上にでき,この点はドラッグするとアステロイド上を $-1 \leq x\leq 1$ の範囲で動かすことができる。ただし,-1,1の付近はy座標の判断の関係でぴったりはいかない。 + + \begin{center} \scalebox{0.9}{\input{Fig/putoncurve.tex}} \end{center} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\vspace{\baselineskip} +\hypertarget{putonline}{} +\item[関数]Putonline(点名 , 座標1 ,座標2 ) +\item[機能]直線上に点を作る +\item[説明]座標1,座標2を通る直線上に点名の点を作る。できた点は直線に対してインシデントとなる。 + +\vspace{\baselineskip} +【例】点A,\ Bを通る直線上に点Pをとる。 + +\verb|Putonline("P",A,B);| + +\vspace{\baselineskip} +\hypertarget{putonseg}{} +\item[関数]Putonseg(点名 , 座標1 ,座標2 ) +\item[機能]線分上に点を作る +\item[説明]座標1,座標2を端点とする線分上に点名の点を作る。できた点は線分に対してインシデントとなる。指定した点がすでに存在する場合は動かさない。 + +\vspace{\baselineskip} +【例】 + +線分AB上に点Cをとる。 + + \verb|Putonseg("C",A,B);| + +点(-1,0),(2,2)を通る線分上に点Cをとる。 + + \verb|Putonseg("C",[[-1,0],[2,2]]);| + +\vspace{\baselineskip} +\hypertarget{reflectpoint}{} +\item[関数]Reflectpoint(点,対称点または対称軸) +\item[機能]点の鏡映の座標を返す。 +\item[説明]点を指定された点または軸に関して対称移動した点の座標を返す。対称軸は[ 点1, 点2 ]で指定 + +\vspace{\baselineskip} +【例】点A〜Fを作図しておき,C〜FをAの鏡映の位置に配置する。 + +\begin{layer}{150}{0} +\putnotese{70}{10}{\scalebox{0.9}{\input{Fig/reflectpoint}}} +\end{layer} + +\hspace{5mm} CはBに関してAと対称な点 + +\hspace{5mm} Dは点(2,3)に関してAと対称な点 + +\hspace{5mm} Eは点(1,0) に関して (-1,1) と対称な点 + +\hspace{5mm} 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} + +\vspace{\baselineskip} +注)鏡映はCinderellaの作図ツールでも作成することができる。場合によってはCinderellaで作図する方が簡明である。 + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +\hypertarget{rotatepoint}{} +\item[関数]Rotatepoint(点 ,角度 , 中心) +\item[機能]点の位置を回転する +\item[説明]点を,中心で示された点の周りに回転した座標を返す。角度は弧度法で与える + +\vspace{\baselineskip} +【例】点A〜Eは作図しておき,C〜Eをそれぞれの位置に配置する。 + +\begin{layer}{150}{0} +\putnotese{75}{5}{ \scalebox{0.8}{\input{Fig/rotatepoint}}} +\end{layer} +\begin{spacing}{1.5} +点CはAを,Bに関して$\dfrac{2}{3}\pi $だけ回転した点 + +点Dは点(5,2)を,Bに関して$\dfrac{\pi}{3}$ だけ回転した点 +\end{spacing} +点Eは点(3,0)をAに関して $-\dfrac{\pi}{4} $だけ回転した点 + +\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} +注)図の点線は位置関係を示すためのもの。 + +点名や座標は,実際にはLetter()関数で記述する。 + +\vspace{\baselineskip} +\hypertarget{scalepoint}{} +\item[関数]Scalepoint(点,比率ベクトル,中心) +\item[機能]点の位置の拡大・縮小を行う +\item[説明]点を,指定された中心を原点とする座標系で,比率ベクトルの分だけ拡大・縮小した位置の座標を返す。 + +\vspace{\baselineskip} +【例】点A〜Fは作図ツールで適当な位置にとっておく。 + +点Dを,点Aを原点を中心に横に3倍,縦に2倍した位置に置く。 + +点Eを,点Aを点Bを中心に横に3倍,縦に2倍した位置に置く。 + +点Fを,点Aを原点を中心にベクトル$\overrightarrow{OC} $で示された比率の位置に置く。 +\begin{verbatim} +D.xy=Scalepoint(A,[3,2],[0,0]); +E.xy=Scalepoint(A,[3,2],B); +F.xy=Scalepoint(A,C.xy,[0,0]); +Arrowdata("1",[[0,0],C]); +Pointdata("1",[A,B,C,D,E,F],["size=2"]); +Letter([A,"e2","A("+A.x+","+A.y+")"]); +Letter([B,"e2","B("+B.x+","+B.y+")"]); +Letter([C,"e2","C("+C.x+","+C.y+")"]); +Letter([D,"e2","D("+D.x+","+D.y+")"]); +Letter([E,"e2","E("+E.x+","+E.y+")"]); +Letter([F,"e2","F("+F.x+","+F.y+")"]); +\end{verbatim} +\vspace{\baselineskip} +\begin{center} \input{Fig/scalepoint} \end{center} + +点A,B,Cをドラッグすると,インタラクティブにD,E,F の位置が変わる。 + +\vspace{\baselineskip} +\hypertarget{translatepoint}{} +\item[関数]Translatepoint(点 , 移動ベクトル) +\item[機能]点を平行移動する +\item[説明]点を移動ベクトルで示された分だけ平行移動した点の座標を返す + +\vspace{\baselineskip} +【例】点A〜Dは作図しておく。 + +点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} + +\hspace{20mm} \scalebox{0.9}{\input{Fig/translatepoint}} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{arrowdata}{} +\item[関数]Arrowdata(name,[始点 , 終点] , options) +\item[機能]2点間を結ぶ矢線を描く。 +\item[説明]name は,座標を数値で与えるときに必要。幾何要素の識別名で与えるときはなくてもよい。 + +optionsは矢じりの形状などの指定。 + +\hspace{10mm} [ 矢じりの大きさ, 開き角, 矢じり位置,切り込み位置, 線種, 線の表示色,トリミング] + +のリストで与える。矢じりの大きさから切り込み位置までは数で,後方のオプションを指定するときは,前方も書く。 + +開き角は60分法で与える。ただし,° はつけない。5未満の時は18°の倍数指定とする。 + +矢じり位置は,線分の長さを1とした始点からの距離。 + +切り込み位置は,0のとき三角形の矢じり,1のとき線のみの矢じりとなる。 + +ただし,Cinderellaの画面上には全ては反映されない。たとえば,太さ指定をしても画面上では太さは同じ。 + +トリミング :"Cutend=m" または "Cutend=[m,n]" で,右辺が数のときは両端をmだけカットする。リストのときは始点をm,終点をnだけカットする。mが負のときは延長する。 + +これらの設定は,\hyperlink{setarrow}{Setarrow()} で初期設定を変更することができる。 + +\vspace{\baselineskip} +【例】オプションの設定とその結果を示す。 + +\begin{verbatim} +Arrowdata("1",[A,B]); +Arrowdata("2",[[1,0],[2,3]],[2]); +Arrowdata("3",[[2,0],[3,3]],[3,45]); +Arrowdata("4",[[3,0],[4,3]],[3,1,0.5]); +Arrowdata("5",[[4,0],[5,3]],[3,1,1,0.5]); +Arrowdata("6",[[5,0],[6,3]],[3,1,1,1]); +Arrowdata("7",[[6,0],[7,3]],[3,"dr,2"]); +Arrowdata("8",[[7,0],[8,3]],[3,1,1,0.5,"Color=red"]); +\end{verbatim} +\hspace{20mm}\input{Fig/arrowdata} + +【例】2つの円を矢線で結ぶ。 + +\begin{layer}{150}{0} +\putnotese{75}{0}{\input{Fig/trimarrow}} +\end{layer} +\hspace{20mm} + +\begin{verbatim} + Circledata("1",[A,A.xy+[0.5,0]]); + Circledata("2",[B,B.xy+[0.7,0]]); + Arrowdata([A,B],["Cutend=[0.5,0.7]"]); + Letter([A,"c","A",B,"c","B"]); +\end{verbatim} +Cinderellaの作図ツールで2点ABをとっておく。 + +円A,Bの半径が同じ(たとえば0.5)であれば,\verb|Arrowdata([A,B],["Cutend=0.5"]);| でよい。 + +\vspace{\baselineskip} +\hypertarget{setarrow}{} +\item[関数]Setarrow([arrowsize,angle,position,cut,linestyle]) +\item[機能]Arrowdata,Arrowheadで描く矢印のスタイルを設定する。 +\item[説明]arrowsize,angle,position,cut,linestyleは,順に大きさ(1),開き角(18),位置(1),切り込み(0),矢線スタイル("dr")である。(カッコ内はデフォルト値) + + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +\hypertarget{arrowhead}{} +\item[関数]Arrowhead(点 , 方向 , options) , Arrowhead(点 , プロットデータ,options) +\item[機能]点に矢じりだけを描く +\item[説明]指定された位置に,指定された方向を向いた矢じりだけを描く。 + +点は座標または幾何要素名。方向は原点から見て座標[a,b]の方向。 + +optionsは [大きさ,矢じりの開き角,形状と位置] のリスト。 + +矢じりの開き角は60分法で片側半分の角。 + +形状は, "f" :塗りつぶしの三角形( 初期設定)または" l " : ラインのみ。 + +ただし,塗りつぶし矢じりは画面上では塗りつぶしにならない。 + +位置は,"t"( 初期設定)または "c" , "b" +\begin{tabbing} +1234\=567890123\=\kill +\>"t" は矢じりの先端が終点に一致\\ +\>"c" は三角形の中心が終点と一致\\ +\>"b" は終点が矢じりの底辺にのる。 +\end{tabbing} +プロットデータを指定したときは,曲線上の点に矢じりをつける。 + +曲線には向きがあり,それによって矢じりの向きが決まる。" Invert(PD) " とすると反対向きの矢じりになる。 + +曲線の向きとは,曲線を描くときの順序で,プロットデータの順序でもある。invert() はこのプロットデータを逆順にするものである。 + +\vspace{\baselineskip} + +【例】 + +\vspace{\baselineskip} +%\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{0}{0}{点 A が右図の位置のとき} +\putnotese{80}{8}{\input{Fig/ForRef-Arrowhead-1}} +\putnotese{0}{7}{(ア) Arrowhead(A,[-1,1]);} +\putnotese{0}{14}{(イ) Arrowhead([1,1],[-1,1],[2,60]);} +\putnotese{0}{21}{(ウ) Arrowhead(A,[-1,1],[2,30,"b"]);} +\putnotese{0}{28}{(エ) Arrowhead([1,1],[-1,1],[2,20,"lc"]);} +\putnotese{0}{38}{(ア)} +\putnotese{30}{38}{(イ)} +\putnotese{60}{38}{(ウ)} +\putnotese{90}{38}{(エ)} +\putnotese{0}{45}{ \input{Fig/ForRef-Arrowhead-2}} +\putnotese{30}{45}{ \input{Fig/ForRef-Arrowhead-3}} +\putnotese{60}{45}{ \input{Fig/ForRef-Arrowhead-4}} +\putnotese{90}{45}{ \input{Fig/ForRef-Arrowhead-5}} +\end{layer} + +\vspace{75mm} +%\hspace{6mm} +\begin{layer}{150}{0} +\putnotese{0}{0}{曲線 crBC 上の点 D が右図のようなとき} +\putnotese{80}{8}{ \input{Fig/ForRef-Arrowhead-6}} +\putnotese{96}{22}{crBC} +\putnotese{0}{7}{(オ) Arrowhead(D,"crBC");} +\putnotese{0}{14}{(カ) Arrowhead(D,"crBC",[2]);} +\putnotese{0}{21}{(キ) Arrowhead(D,"crBC",[2,30,"l"]);} +\putnotese{0}{28}{(ク) Arrowhead(D,"Invert(crBC)");} +\putnotese{0}{38}{(オ)} +\putnotese{30}{38}{(カ)} +\putnotese{60}{38}{(キ)} +\putnotese{90}{38}{(ク)} +\putnotese{0}{45}{ \input{Fig/ForRef-Arrowhead-7}} +\putnotese{30}{45}{ \input{Fig/ForRef-Arrowhead-8}} +\putnotese{60}{45}{ \input{Fig/ForRef-Arrowhead-9}} +\putnotese{90}{45}{ \input{Fig/ForRef-Arrowhead-10}} +\end{layer} + +\vspace{70mm} + +\vspace{\baselineskip} +\hypertarget{lineplot}{} +\item[関数]Lineplot(name , 2点のリスト , options) +\item[機能]2点のリストで示された点を結ぶ直線を描く。 +\item[説明]2点のリストは座標または幾何要素の名前で与える。 + +options は次の通り。 + +線種"dr, n", "da,m,n" , "do,m,n" + + "+"半直線を描く。 + +"dr" , "da" , "do" と "+" はリストにして両方指定することができる。 + +点のリストが,座標ではなく幾何要素名のリストの場合は,nameは省略できる。 + +いくつか例を示す。 + +\vspace{\baselineskip} +各座標を結ぶ直線を引く + +\hspace{5mm} \verb|Lineplot("1",[[0,0],[1,2]])| + +Cinderellaの描画ツールで2点A,Bをとっておき,直線ABを引く + +\hspace{5mm} \verb|Lineplot([A,B]);| + +optionの働きの例 +\begin{tabbing} +1234\=56789012345678901234567890123456789\=\kill + \> \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を点線で描く +\end{tabbing} +結果は,次図左上から。 + +\vspace{\baselineskip} +\hspace{20mm} \input{Fig/lineplot} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{listplot}{} +\item[関数]Listplot(name , 点のリスト , options) +\item[機能]点のリストで示された点を結ぶ。 +\item[説明]点のリストは座標または幾何要素名のリストで与える。点が,座標ではなく幾何要素名の場合は,nameは省略可 + +プロットデータの名前は,"sg" に引数の name を付加したものとなる。 + + options は次の通り。 + +線種 "dr, n", "da,m,n" , "do,m,n" + +トリミング :"Cutend=m" または "Cutend=[m,n]" + +数のときは両端をmだけカットする。リストのときは始点をm,終点をnだけカットする。mが負のときは延長する。 + +\begin{tabbing} +1234567890123456789012345678901234\=\kill +optionsの使用例\\ +\verb|Listplot([A,B]);|\>線分ABを描く。太さは 初期設定。\\ +\verb|Listplot([C,D],["dr,2"]);| \>線分CDを描く。太さ2\\ +\verb|Listplot([E,F],["da"]);| \>線分EFを破線で描く\\ +\verb|Listplot([G,H],["da,3,1"]);| \>線分GHを破線で描く。線を長く\\ +\verb|Listplot([K,L],["da,1,3"]);|\>線分KLを破線で描く。間隔を空ける\\ +\verb|Listplot([M,N],["do"]);|\>線分MNを点線で描く。\\ +\verb|Listplot([O,P],["do,3"]);| \>線分OPを点線で描く。間隔を空ける\\ +\verb|Listplot([Q,R],["do,3,3"]);| \>線分QRを点線で描く。間隔を空けて太く\\ +結果は次図左から。 +\end{tabbing} +\begin{center} \scalebox{0.9}{\input{Fig/listplot3}}\end{center} + +【例】三角形を描く。 + +Cinderellaの作図ツールで三角形ABCを描いておく。あるいは,単に3点A,B,Cをとるだけでもよい。 + +\begin{layer}{150}{0} +\putnotese{75}{0}{\input{Fig/listplot1}} +\end{layer} +\hspace{20mm} + +\begin{verbatim} +Addax(0); +Listplot([A,B,C,A]); +\end{verbatim} + +点の位置は座標で指定してもよい。 + +その場合は name が必要。 + +\verb| Listplot("1",[[0,0],[2,0],[1,2],[0,0]]);| + +\vspace{\baselineskip} +【例】2つの円を線分で結ぶ。 + +\begin{layer}{150}{0} +\putnotese{75}{0}{\input{Fig/trimseg}} +\end{layer} +\hspace{20mm} + +\begin{verbatim} + Circledata("1",[A,A.xy+[0.5,0]]); + Circledata("2",[B,B.xy+[0.7,0]]); + Listplot([A,B],["Cutend=[0.5,0.7]"]); + Letter([A,"c","A",B,"c","B"]); +\end{verbatim} +Cinderellaの作図ツールで2点ABをとっておく。 + +円A,Bの半径が同じであれば,\verb|Listplot([A,B],["Cutend=0.5"]);| でよい。 + +\vspace{\baselineskip} +プロットデータは点の座標のリストである。したがって,プロットデータを自作してListplot()で表示することができる。 + +\vspace{\baselineskip} +【例】有限フーリエ級数展開 + + \[\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} + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/fourier} + +\vspace{\baselineskip} + リストの長さには制限がある。たとえば,タートルグラフィクスを用いたシェルピンスキーのギャスケットでは200くらいずつのリストに分割する。 + + \hspace{20mm}\scalebox{0.8}{ \input{Fig/listplot2}} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{mksegments}{} +\item[関数]Mksegments() +\item[機能]すべての幾何線分のPD を作成 +\item[説明]Cinderellaの「線分を加える」ツールで描いたすべての線分をそのままプロットデータとする。たとえば,線分ABを作ると,プロットデータsgABが作成される。その後,インスペクタで点Bの識別名を変更(たとえばQに)すると,プロットデータ名も変更される。線分はすでに描かれていてもよい。 + +\vspace{\baselineskip} +【例】等比数列の例題 + +三角形の各辺の中点を結んでできる三角形を次々に作っていく,等比数列の図を描く。 + +まず「線分を加える」ツールで三角形ABCを描く。 + +「中点を加える」ツールで各辺の中点を取り,「線分を加える」ツールで中点を結ぶ。 + +これを繰り返す。\verb|Mksegments()| を書いておけば,\verb|Listplot([A,B,C]| などを書かなくても,作図ができた時点で,図のデータができる。 + +\includegraphics[bb=0.00 0.00 438.02 327.02,width=5.5cm]{Fig/gpro01.pdf} \input{Fig/gpro02} + +\vspace{\baselineskip} +\hypertarget{framedata}{} +\item[関数]Framedata(name , リスト,options) +\item[機能]矩形を描く +\item[説明]リストの形は2通り。 + +その1:[中心 ,横 , 縦] で,矩形を描く。横,縦は中心からの距離。 + +その2:2点のリスト。点が座標でなく名称のときはnameは省略できる。 + +点の座標は点の名前でもよい。点を座標で与える場合はnameは省略できない。 + +リストを省略した場合は,描画範囲と同一の矩形を描く。 + +その2のタイプでは,option として,"center" または "corner" がある。"center" のときは,中心と対角点( 初期設定),"corner" のときは2点を対角点として解釈する。 + +以下にいくつか例を示す +\begin{tabbing} +1234567890123456789012345678901234\=\kill +\verb|Framedata("1");|\> 描画範囲(SW,NE)と同一の矩形を描く\\ +\verb|Framedata("2",[[0,0],2,2]);| \> 原点を中心とする縦横幅4の正方形を描く\\ +\verb|Framedata("3",[A,1.5,1.2]);|\> 点Aを中心とする横3,縦2.4の矩形を描く。(図左)\\ +\verb|Framedata([B,C]);|\> 点Bを中心,点Cを頂点とする矩形を描く。(図中央)\\ +\verb|Framedata([D,E],["corner"]); |\>点D,Eを対角点とする矩形を描く。(図右) + \end{tabbing} +\begin{center}\includegraphics[bb=0.00 0.00 348.15 106.16,width=12cm]{Fig/Framedata.pdf}\end{center} + +矩形の角を丸めたい場合は,Framedata()ではなく,\hyperlink{ovaldata}{Ovaldata()}を使うとよい。 + +\vspace{\baselineskip} +\hypertarget{polygonplot}{} +\item[関数]Polygonplot(name , 点リスト , 整数,options) +\item[機能]2点を半径とする円に内接する正多角形を描く。 +\item[説明]点リストを[A,B] とすると,Aを中心とする半径ABの円周上に点をとって正多角形を描く。ただし円は描かない。A,B は座標でもよい。 + +点リストが座標ではなく作図してある点の名称のとき,オプションに"Geo=y" をつけると,頂点の幾何点を作る。幾何点の名称はBに番号を付けたものとなる。整数でない数を指定した場合は,きちんと閉じない折れ線が描かれる。 + +\vspace{\baselineskip} +【例】点リストとoptionの違いによる作図と,TeXの図を示す。 + +\begin{verbatim} +Addax(0); +Polygonplot("1",[[-4,1],[-4,3]],7); +Polygonplot("2",[A,B],7); +Polygonplot("3",[C,D],7,["Geo=y"]); +\end{verbatim} + +\hspace{10mm}\includegraphics[bb=0.00 0.00 541.03 175.01,width=10cm]{Fig/polygonplot2.pdf} + +\hspace{10mm}\input{Fig/polygonplot1} + + +円に内接する形でなく,与えられた線分ABを1辺とする正多角形を描くには次のようにする。 + +線分ABは,Cinderellaの作図ツールなどで描かれているものとする。ただし,線分でなく,両端の点が与えられているだけでもよい。Cindyscriptで点A,Bが複素平面上にあるものとして,多角形の頂点の位置を計算する。 + +\vspace{\baselineskip} +【例】ABを1辺とする正五角形を描く。 + +\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{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +%\newpage + +% ====== 曲線 ============== +\subsubsection{曲線} +\begin{description} + +\hypertarget{bezier}{} +\item[関数]Bezier(名前,節点リスト,制御点リスト,[オプション] ) +\item[機能]ベジェ曲線を描く +\item[説明]制御点は,各区間に対して,3次の場合2個,2次の場合1個のリストで与える。 + +オプションは + +"Num=n": 節点間の分割数(分点数 $-1$)を指定できる。 ベジェ曲線とスプライト曲線の関数は節点間が短い場合が多いので初期設定は10になっている。Plotdata()などと違い,大きい数(200など)を指定すると,全体の分割数が増大して描画時間がかかるようになってしまうので注意。 + +\vspace{\baselineskip} +【例】 + +\begin{layer}{150}{0} +\putnotese{60}{-10}{\scalebox{0.9}{ \input{Fig/checkbe1}}} +\end{layer} + +2次ベジェ曲線 + +\verb|Bezier("1",[A,B],[C]);| + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{60}{-10}{\scalebox{0.9}{\input{Fig/checkbe2}}} +\end{layer} + +3次ベジェ曲線 + +\verb|Bezier("2",[A,B],[C,D]);| + +\vspace{20mm} + +\begin{layer}{150}{0} +\putnotese{60}{-10}{\scalebox{0.9}{ \input{Fig/checkbe3}}} +\end{layer} + +%ベジェ曲線をつなげる + +%Bezier("3",[A,B,C],[[D],[E,F]]); + +%\vspace{20mm} + +%\begin{layer}{150}{0} +%\putnotese{60}{5}{ \input{Fig/checkbe4}} +%\end{layer} + +%D,B,E を1直線上にとると,滑らかにつながる +節点を増やす。2次と3次。 + +\verb|Bezier("3",[A,B,C],[[D],[E,F]]);| + +\vspace{20mm} + +全て同じ次数の場合,次のようにしてもよい。 +\newpage + +\verb|Bezier("4",[A,B,C,D],[E,F,G,H,K,L] ); | + +\begin{layer}{150}{0} +\putnotese{20}{2}{\input{Fig/checkbe7}} +\end{layer} + +\vspace{35mm} + +オプションの例 + +\verb|Bezier("5",[A,B,C],[[D],[E,F]],["Num=3"]);| + +\hspace{20mm}\input{Fig/checkbe5} + +\verb|Bezier("6",[A,B,C],[[D],[E,F]],["Num=40","da"]);| + +\hspace{20mm}\input{Fig/checkbe6} + +Numを(ベクトルとして)区間ごとに与えることもできる。 + +\verb|Bezier("1",[A,B,C,D],[E,F,G,H,K,L],["Num=[2,3,4]"]);| + +\hspace{10mm} \input{Fig/checkbe8} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{beziersmooth}{} +\item[関数]Beziersmooth(名前,節点リスト,[オプション] ) +\item[機能]節点間を3次ベジェ曲線でスムーズに結んだ曲線を描く +\item[説明]節点をはさむ制御点は1直線上にとる(したがって,1つは半自由点で,直線上しか動けない)。 +制御点は自動的に配置される。その後,節点や制御点を動かして,描きたいものにする。 + +\vspace{\baselineskip} +【例】 + +\verb|Beziersmooth("1",[A,B,C,D]);| + +\begin{layer}{150}{0} +\putnotese{70}{35}{bz1} +\putnotese{40}{5}{ \input{Fig/checksm1}} +\end{layer} + +\vspace{40mm} +その後,節点や制御点を動かして,描きたいものにする。ただし,C2p は C1q と B を通る直線上しか動けない。C3p は C2q と C を通る直線上しか動けない。 + +\begin{layer}{150}{0} +\putnotese{70}{30}{bz1} +\putnotese{40}{05}{ \input{Fig/checksm2}} +\end{layer} + +\vspace{35mm} + +\vspace{\baselineskip} +\hypertarget{beziersym}{} +\item[関数]Beziersym(名前,節点リスト,[オプション] ) +\item[機能]節点間を3次ベジェ曲線でスムーズに結んだ曲線を描く +\item[説明]節点をはさむ制御点は節点に関し対称(片方は表示されず,動かせない)。 +制御点は自動的に配置される。その後,節点や制御点を動かして描きたいものにする。 + +\vspace{\baselineskip} +【例】 + +\begin{layer}{150}{0} +\putnotese{70}{27}{bz1} +\putnotese{40}{00}{ \input{Fig/checksy1}} +%\putnotese{0}{0}{Beziersym("1",[A,B,C,D]);} +%\putnotese{0}{15}{C2p と C3p は表示されない} +\end{layer} + +\verb|Beziersym("1",[A,B,C,D]);| + +C2p と C3p は表示されない + +\vspace{25mm} + +その後,節点や制御点を動かして,描きたいものにする。 + +C2p と C3p は表示されず,動かせない。 + +\begin{center} \input{Fig/checksy2} \end{center} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +%\vspace{\baselineskip} +\hypertarget{mkbeziercrv}{} +\item[関数]Mkbeziercrv(名前, [節点リスト,制御点リスト] のリスト,options ) +\item[機能]複数のベジェ曲線を描く +\item[説明][節点リスト,制御点リスト] が1つの場合は,Bezier()と同じ。 + +\vspace{\baselineskip} +【例】ベジェ曲線を2つ描く。 + +\verb|Mkbeziercrv("5",[[[A,B,C],[[D],[E,F]]],[[G,H,K,L],[[M],[N,O],[P]]]]);| + + \scalebox{0.95}{\input{Fig/checkmc1}} + +\vspace{\baselineskip} +\hypertarget{mkbezierptcrv}{} +\item[関数]Mkbezierptcrv(節点リストptlist,[オプション] ) +\item[機能]ベジェ曲線を描く +\item[説明]制御点は,自動的に配置される。 + +複数の場合は[ ptlist1, ptlist2.... ] + +名前は,A から順に自動的につける。 + +オプション + +\verb|"Deg=..."| 次数指定ができる。(初期設定は3次) + +\verb|"Num=..."| 各区間の区間数(分点数$-1$)を指定できる。(初期設定は10) + +\vspace{\baselineskip} + +【例】 + +\begin{layer}{150}{0} +\putnotese{70}{25}{bzA} +\putnotese{40}{-5}{ \input{Fig/checkb8}} +\end{layer} + +\verb|Mkbezierptcrv([A,B,C]);| + +\vspace{23mm} + +その後,節点や制御点を動かして,\par +描きたいものにする。 + +\begin{layer}{150}{0} +\putnotese{70}{25}{bzA} +\putnotese{55}{-15}{ \input{Fig/checkb11}} +\end{layer} + +\vspace{35mm} + +\begin{layer}{150}{0} +\putnotese{70}{28}{bzA} +\putnotese{50}{-3}{\input{Fig/checkb9}} +\end{layer} + +\verb|Mkbezierptcrv([A,B,C],["Deg=2"]);| + +\verb|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{40mm} + + \vspace{\baselineskip} +\hypertarget{bspline}{} +\item[関数]Bspline(名前,制御点リスト,[オプション] ) +\item[機能]2次B-spline曲線を描く +\item[説明]節点は自動的に計算され,表示されない + + \vspace{\baselineskip} +【例】\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曲線の端の制御点の代わりに,端点を動かせるようにしている。 + +\begin{center} \input{Fig/checkbs1}\end{center} + +【例】\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]);| + + と同じ。 + +\begin{center} \input{Fig/checkbs2}\end{center} + +参照:\hyperlink{ospline}{Ospline:大島のスプラインを描く} + +\vspace{\baselineskip} +\hypertarget{crspline}{} +\item[関数]CRspline(名前,節点リスト,[オプション] ) +\item[機能]単独のCatmull-Rom スプライン曲線を描く +\item[説明] +自由点は,節点のみで,制御点は節点から作られ移動はできない。 + +オプションに,通常のオプションのほか,次が使える。 + +\verb|size ->n|:画面上での線の太さを指定する。 + +\vspace{\baselineskip} +【例】\verb|CRspline("1",[A,B,C,D]);| + +\hspace{20mm} \input{Fig/checkCR} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{ospline}{} +\item[関数]Ospline(名前,制御点リスト,[オプション] ) +\item[機能]大島のspline曲線を描く +\item[説明]制御点を通るスプライン曲線を描く + +リストの最初と最後が同じ場合は閉曲線になる。 + +\vspace{\baselineskip} +【例】\verb|Ospline("1",[A,B,C,D,E]);|\verb|Ospline("1",[A,B,C,D,A]);| + + \input{Fig/ospline1}\input{Fig/ospline2} + +\vspace{\baselineskip} + スプライン曲線については次も参照されたい:\hyperlink{bspline}{Bspline:Bスプラインを描く} + + +\vspace{\baselineskip} +\hypertarget{circledata}{} +\item[関数]Circledata(name,リスト,options) +\item[機能]円または多角形を描く。 +\item[説明]中心の点と,円周上の1点(か半径),または3点をリストで与えて円を描く。 + +中心と円周上の点を,座標ではなく幾何要素名で指定する場合は name は省略可。 + +optionsは以下のものをリストで与える。省略した場合は実線で円が描かれる。 +\begin{tabbing} +1234\=567890123456789012\=\kill + \>"Rng=[$\theta_1,\theta_2$]"\>角$\theta_1$から$\theta_2$の範囲の弧を描く。角は弧度法で与える。\\ + \>"Num=分割数"\>円を描くときの分割数。値が小さい場合は多角形になる。\\ + \>線種\>"dr, n", "da,m,n" , "do,m,n" +\end{tabbing} +\begin{tabbing} +1234\=56789012345678901234567890\=\kill + +【例】いろいろな円を描く。\\ + \>原点中心,半径2の円\> \verb|Circledata("1",[[0,0],[2,0]]);|\\ + \hspace{50mm}(\verb|[[0,0],2]|でもよい)\\ + \>A中心,半径ABの円\> \verb|Circledata([A,B]);|\\ + \>A中心,半径2の円\> \verb|Circledata("1",[A,A+[2,0]]);|\\ + \hspace{50mm}(\verb|[A,2]|でもよい)\\ + \>3点A,B,Cを通る円\> \verb|Circledata([A,B,C]);|\\ + \>下図左より,オプションに "dr,2" , "da" , "do" をつけた場合。 +\end{tabbing} +\hspace{10mm} \input{Fig/circledata1} +\vspace{\baselineskip} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + \verb|Circledata([A,B,C]);| で,3点A,B,Cを通る円を描いたとき,できた円の中心は \verb|Pointdata("1",[crABCcenter]);| で作図できる。 + +\vspace{\baselineskip} +【例】A中心,半径AB,中心角60°の弧を描く。 + +\hspace{10mm}\verb|Circledata([A,B],["Rng=[0,pi/3]"]); | + +\vspace{\baselineskip} +【例】A中心,半径AB,中心角60°の扇型を描く。点A,B,Cを適当に取っておく。 + +\begin{verbatim} +th=arctan2(B-A); +C.xy=Rotatepoint(B,pi/3,A); +Circledata([A,B],[Assign("Rng=[th,th+pi/3]","th",th)]); +Listplot([B,A,C]); +Letter([A,"s","A",B,"e","B",C,"nw","C"]); +\end{verbatim} + +\begin{center} +\includegraphics[bb=0.00 0.00 180.01 177.01,width=4cm"] {Fig/circledata3.pdf}\hspace{12mm}\input{Fig/circledata2} +\end{center} + +1行目は,ABが$x$軸となす角を arctan2 関数 によって求めている。 + +\vspace{\baselineskip} +【例】弧を太く描く + +\verb|Circledata([C,D],["dr,3","Rng=[0,pi/3]"]);| + +円はNが大きな値の正N多角形として描いている。optionの ["Num=数値"] によってその細かさを指定できる。Nの値が小さければ正多角形が描けることになる。 + +\vspace{\baselineskip} +【例】A中心,半径ABの円と,その円に内接する正六角形 +\begin{verbatim} +Circledata("1",[A,B]); +Circledata("2",[A,B],["Num=6"]); +\end{verbatim} +ここで,同じ[A,B]を使うため,nameを付与して区別する必要がある。(下図左) + +また,頂点の位置を変えるのであれば,Rng= オプションを使う。(下図右) + + \verb|Circledata("2",[A,B],["Num=6","Rng=[pi/6,13/6*pi]"]);| + +\hspace{10mm} \input{Fig/circledata4} +\hspace{5mm}\input{Fig/circledata5} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{mkcircles}{} +\item[関数]Mkcircles() +\item[機能]すべての幾何円のPD を作成 +\item[説明]Cinderellaの「円を加える」ツール(3種類いずれでも)で描いたすべての円をそのままプロットデータとする。たとえば,中心A,円周上の点をBとした円を作ると,プロットデータcrABが作成される。その後,インスペクタで点Bの識別名を変更(たとえばQに)すると,プロットデータ名も変更される。円はすでに描かれていてもよい。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{ellipseplot}{} +\item[関数]Ellipseplot(name,点リスト ,定義域, options) +\item[機能]焦点と通る点を与えて楕円を描く。 +\item[説明]点リストで2つの焦点と通る点を与える。点はCinderellaの幾何点が使える。 + +また,通る点のかわりに,焦点からの距離の和を実数で与えることもできる。 + +実際には,媒介変数表示$x=a \cos \theta,y=b \sin \theta$ を,回転・平行移動して描いている。定義域はこのときの$t$の定義域で,省略も可能。省略したときの初期値は[-5,5] + +\vspace{\baselineskip} +【例】点A,Bを焦点とする楕円を描く。 + +\verb|Ellipseplot("1",[A,B,C]);| 点Cを通る楕円を描く。 + +\verb|Ellipseplot("1",[A,B,4]);| 焦点からの距離の和が4である楕円を描く。 + +\verb|Ellipseplot("1",[A,B,C],"[0,pi]");| 楕円の半分を描く。 + +\vspace{\baselineskip} +【例】Cinderellaの作図ツールを使う + +作図ツールに,焦点と通る点で楕円を描くもの,点の極線を描くツールがある。(モードメニュー / 直線 / 点の極線)これを利用すると,楕円上にとった点をインシデントにできるので,インタラクティブに図を変更することができる。このCinderellaの作図機能と合わせて,一方の焦点から出た光が楕円上で反射して他方の焦点に至る,という図を次のようにして描くことができる。 + +まず,3つの点,焦点A,Bと通る点Cを適当な位置に作図する。次に「焦点と通る点で決まる楕円」ツールを選び,点A,B,Cを順に指定すると,楕円が描かれる。 + +モードメニューの「直線」から「点の極線」を選び,点Cと楕円を順に指定すると接線が引かれる。 + +「垂線を加える」ツールを用いて,点Cで垂線,すなわち法線を引く。(下図) + +「点を加える」ツールを用いて,接線,法線上に適当に点を取る。(D,Eとなったとする) + +次のスクリプトを書いて実行すると,楕円に関して入射角と反射角が等しくなるように光が反射する様子を図にすることができる。 +\newpage + +\vspace{\baselineskip} +\begin{layer}{150}{0} +\putnotese{75}{5}{ \includegraphics[bb=0 0 272.01 240.01, width=4cm]{Fig/ellipsecindy.pdf}} +\end{layer} +\hspace{50mm} + +\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} +\vspace{\baselineskip} +\begin{center} \scalebox{0.9}{\input{Fig/ellipseplot1}}\end{center} + +また,接線,法線を描かず,この楕円上に点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} + +\begin{center} \scalebox{0.9}{\input{Fig/ellipseplot2}} \end{center} + + +\hypertarget{hyperbolaplot}{} +\item[関数]Hyperbolaplot(name,点リスト ,定義域, options) +\item[機能]焦点と通る点を与えて双曲線を描く。 +\item[説明]点リストで2つの焦点と通る点を与える。点はCinderellaの幾何点が使える。 + +また,通る点のかわりに,焦点からの距離の差を実数で与えることもできる。 + +実際には,ハイパボリック関数を用いた媒介変数表示 $x=\cosh t,y=\sinh t$を回転・平行移動している。 + +optionとして,"Asy=線種"を与えると,漸近線を指定した線種で表示する。 初期設定では漸近線は非表示。 + +\vspace{\baselineskip} +【例】点A,Bを焦点とする双曲線を描く。 + +\verb|Hyperbolaplot("1",[A,B,C]);| 点Cを通る双曲線を描く。 + +\verb|Hyperbolaplot("1",[A,B,2]);|焦点からの距離の差が2の双曲線を描く。 + +\verb|Hyperbolaplot("1",[A,B,C],["Asy=do"]);| 漸近線を点線で描く。 + +\vspace{\baselineskip} +\hspace{20mm} \scalebox{0.9}{\input{Fig/hyper1}} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{parabolaplot}{} +\item[関数]Parabolaplot(name,点リスト ,定義域, options) +\item[機能]点リスト[A,B,C]で示された焦点,準線で決まる放物線を描く。 +\item[説明]焦点Aと準線BCで決定する放物線を描く。 + +実際には,2次関数 $y=x^2$のグラフを回転・平行移動して描いており,定義域は,$y=x^2$での定義域と考えてよい。定義域は省略することもできる。省略したときの初期値は[-5,5] + +\vspace{\baselineskip} +【例】点Aを焦点,直線BCを準線とする放物線を描く + +\hspace{10mm}\verb|Parabolaplot("1",[A,B,C]); | + +定義域を $-4 \leq x \leq 4$ とする。 + +\hspace{10mm} \verb|Parabolaplot("1",[A,B,C],"[-4,4]");| + +点(0,1)を焦点,直線$y=-1$を準線とする放物線を描く + +\hspace{10mm} \verb|Parabolaplot("1",[[0,1],[-1,-1],[1,-1]]);| + +\vspace{\baselineskip} +【例】放物線上の2点で引かれた接線と放物線で囲まれた領域を斜線で描く。 + +Cinderellaの作図ツールに,焦点と準線で放物線を描くものがある。また,点の極線を描くツールがある。(モードメニュー / 直線 / 点の極線)これを利用すると,放物線上にとった点をインシデントにできるので,インタラクティブに図を変更することができる。このCinderellaの作図機能と合わせて,次の手順で図を描く。 + +まず,焦点A(0,1)と準線$y=-1$:BCを作図する。次に「焦点と準線で決まる放物線」ツールを選び,点Aと直線BCを指定すると,放物線が描かれる。方程式では$y=\dfrac{1}{4}x^2$の放物線である。 + +次に,放物線上に点D,Eをとる。Cinderellaの作図機能を用いているので,この2点は放物線上だけを動かすことができる。(インシデント) + +モードメニューの「直線」から「点の極線」を選び,点Dと放物線,点Eと放物線を順に指定すると接線が引かれる。その交点に点を取る。 + +\vspace{\baselineskip} +\begin{center} \includegraphics[bb=0 0 482.02 413.02 , width=6cm]{Fig/parabolaplot.pdf} \end{center} + +\vspace{\baselineskip} +以上で作図ができたので,次のスクリプトを書いて実行する。 +\begin{verbatim} +Parabolaplot("1",[A,B,C]); +Lineplot([D,F]); +Lineplot([E,F]); +Hatchdata("1",["iii"],[["gr1para","s"],["lnEF","n"],["lnDF","n"]]); +\end{verbatim} + +これで,次図ができる。このあと,文字などは適当に追加する。 + +\vspace{\baselineskip} +\begin{center} \input{Fig/parabolaplot}\end{center} + +なお,Cinderellaの作図ツールで放物線を描かず,焦点Aと準線上の点B,Cだけを用意して,次のスクリプトで描くこともできる。 +\begin{verbatim} +Parabolaplot("1",[A,B,C]); +Putoncurve("D","gr1para"); +Putoncurve("E","gr1para"); +Tangentplot("1","gr1para","x="+D.x); +Tangentplot("2","gr1para","x="+E.x); +Hatchdata("1",["iii"],[["gr1para","s"],["lntn1","n"],["lntn2","n"]]); +\end{verbatim} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\vspace{\baselineskip} +\hypertarget{ovaldata}{} +\item[関数]Ovaldata(name, 点リスト,options) +\item[機能]角を丸くした矩形を描く +\item[説明]中心と対角の1点を指定し,角を丸くした矩形を描く + +optionsは,角の落とし具合と線種など。 初期設定は0.2 + +\vspace{\baselineskip} +【例】いくつかの例を示す。 +\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} +\begin{center} \scalebox{0.9}{\input{Fig/ovaldata}}\end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +%\newpage +\end{description} +% ====== 関数のグラフ ============== +\subsubsection{関数のグラフ} +\begin{description} + +\vspace{\baselineskip} +\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=関数"\>関数の零点は除外する。\\ +"Color=RGB"\>色指定。RGBはCMYKでもよい。 +\end{tabbing} + +【例】2次関数 $f(x)=x^2-2x$ のグラフを定義域指定なしで描く。 + +\hspace{10mm}\verb|Plotdata("1","x^2-2*x","x");| + +\vspace{\baselineskip} +\hspace{20mm} \scalebox{0.8}{\input{Fig/plotdata1}} + + \verb|Plotdata("1","x^2-2*x","x",["Color=[1,0,0]"]);| + +とすると赤で描かれる。 + +\vspace{\baselineskip} +【例】三角関数 $2\sin \left(2x-\dfrac{\pi}{4} \right)$ のグラフを,定義域 $0 \leq x \leq 2 \pi$で描く。 + +\hspace{10mm} \verb|Plotdata("3","2*sin(2*x-pi/4)","x=[0,2*pi]");| + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/plotdata2} + +%\vspace{\baselineskip} +CindyScript では,plot( 式 , 定義域 ); で描くが, \ketcindy を用いるときは,CindyScript のplot 関数のかわりに,このPlotdata を使えばよい。 + +軸に数字を入れるのであれば,Letter() を用いる。 + +\vspace{\baselineskip} +optionsの使用例 +\begin{tabbing} +1234\=567890123456789012345678901234567890123456\=\kill + \> \verb|Plotdata("1","sin(x)+3","x");| \> 初期設定\\ + \> \verb|Plotdata("2","sin(x)+2","x",["dr,2"]);| \> 同じく,太さ2で描く\\ + \> \verb|Plotdata("3","sin(x)+1","x",["da"]);|\> 同じく,破線で描く\\ + \> \verb|Plotdata("4","sin(x)","x",["do"]);|\> 同じく,点線で描く + \end{tabbing} +結果は次図上から。 + +\vspace{\baselineskip} +\hspace{20mm} \scalebox{0.9}{\input{Fig/plotdata3}} + +Num=分割数の指定 + +グラフの描画は,区間を分割して関数値をとり,各点を結ぶという通常の方法によっている。Nの指定はこの分割数の指定である。 初期設定は50。思うような結果が得られない場合はこの値を大きく指定するとよい。下図左は 初期設定,右は Num=200。 + +\vspace{\baselineskip} +\hspace{20mm}\scalebox{0.8}{ \input{Fig/plotdata4}} + +不連続点の指定 + +Dis オプションにより,値がジャンプする不連続点を線で結ばないようにする。Numオプションと合わせて使うと効果が上がる。 + +\vspace{\baselineskip} +【例】$f(x)=$tan$x$ のグラフは,そのままではあたかも漸近線が描かれたようになるが,これは,不連続点の前後をそのまま結んでいるためである。(下図左) +\begin{verbatim} +Plotdata("1","tan(x)","x",["Num=200","Dis=50"]); +\end{verbatim} +のように,"Dis" オプションを使えば余分な線が描かれなくなる。(下図右) + +\vspace{\baselineskip} +\hspace{20mm} \input{Fig/plotdatatan1}\hspace{20mm} \input{Fig/plotdatatan2} + +\vspace{\baselineskip} +【例】ガウス記号 [$x$] で表される関数(床関数 : floor())のグラフ。 +\begin{verbatim} +Plotdata("1","floor(x)","x",["Num=100","Dis=0.9"]); +Drwxy(); +repeat(7,s,start -> -2, +Pointdata(text(s+3),[s+1,s],["Inside=0","Size=3"]); +); +\end{verbatim} + +\hspace{45mm}\input{Fig/plotdata5} + +なお,ここで,Pointdata() のname を \verb|text(s+3)| としているのは,s が $-2$ から始まるので,負の数が使えない name を $1$ から始まるようにするためである。 + +\vspace{\baselineskip} +関数に文字係数がついており,文字係数の値を変化させながらグラフを描くには,Assign を使うか,Defvar で変数を定義する。 + +\vspace{\baselineskip} +【例】直線 $y=bx-b^2$ の係数$b$を変化させて描き,包絡線をうかびあがらせる。 + +\begin{layer}{150}{0} +\putnotese{95}{3}{\scalebox{0.8}{{\input{Fig/assign}}}} +\end{layer} +\begin{verbatim} +repeat(50,t, + cb=t/5-5; + Plotdata(text(t),Assign("b*x-b^2","b",cb),"x"); +); +\end{verbatim} + +または +\begin{verbatim} +Defvar("b"); +repeat(50,t, + b=t/5-5; + Plotdata(text(t),"b*x-b^2","x"); +); +\end{verbatim} + +%\vspace{\baselineskip} +\hypertarget{implicitplot}{} +\item[関数]Implicitplot(name,式,xの定義域,yの定義域, options) +\item[機能]陰関数のグラフを描く。 +\item[説明]陰関数の式を与えてグラフを描く。式,定義域とも文字列。 + +options は,"r","m","Wait=n" が指定できる。Wait の初期値は10。 + +"r","m"に関しては,オプションなしのとき + +i) データファイルがなければ,新しく作る + +ii) データファイルが既にあればそれを読み込む + +"m"のとき,強制的にデータファイルを作り直す。 + +"r" のとき,すでにあるデータファイルを読み込む。 + +\vspace{\baselineskip} +【例】楕円を描く。 +\begin{verbatim} +Implicitplot("1","x^2-x*y+2*y^2=4","x=[-3,3]","y=[-2,2]"); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{20mm}\scalebox{0.9}{\input{Fig/implicit1}} + +\vspace{\baselineskip} +\hypertarget{deqplot}{} +\item[関数]Deqplot(name,式,変数名,初期値,options) +\item[機能]微分方程式の解曲線を描く +\item[説明]微分方程式と初期値を与えて解曲線を描く。 + +\vspace{\baselineskip} +【例】$y''=-y$で,初期値が$x=0$のとき$y=1,y'=0$ の解曲線 + +\verb|Deqplot("1","y''=-y","x",0, [1,0]); | + +注) 微分記号のプライムは,シングルクォートまたはバッククォート。 + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/deqplot1} + +\vspace{\baselineskip} +【例】$y'=y*(1-y)$で,$x=0$のとき,$y=0.5$の解曲線 + + \verb|Deqplot("2","y'=y*(1-y)","x",0, 0.5,["Num=100"]);| + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/deqplot2} + +\vspace{\baselineskip} + +【例】$[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} + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/deqplot3} + +\vspace{\baselineskip} +\hypertarget{paramplot}{} +\item[関数]Paramplot(name , 式 , 変数と定義域,options) +\item[機能]媒介変数表示の曲線を描く。 +\item[説明]式は""でくくった媒介変数表示のリストで与える。 + +定義域も " " でくくって文字列とし,t=に続いてリストで指定する。 + +options は線種が有効 + +\vspace{\baselineskip} +【例】サイクロイド曲線を描く。 + +\hspace{10mm} \verb|Paramplot("1","[t-sin(t),1-cos(t)]","t=[0,2*pi]");| + +\vspace{\baselineskip} +\hspace{20mm}\input{Fig/paramplot1} + +\vspace{\baselineskip} +【例】optionsの使用例。左から, 初期設定,太線,破線,点線の楕円 +\begin{verbatim} +Paramplot("1","[2*cos(t)-5,sin(t)]","t=[0,2*pi]"); +Paramplot("2","[2*cos(t),sin(t)]","t=[0,2*pi]",["dr,2"]); +Paramplot("3","[2*cos(t)+5,sin(t)]","t=[0,2*pi]",["da"]); +Paramplot("4","[2*cos(t)+10,sin(t)]","t=[0,2*pi]",["do"]); +\end{verbatim} +\begin{center} \input{Fig/paramplot2} \end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{polarplot}{} +\item[関数]Polarplot(name , 式 , 変数と定義域,options) +\item[機能]極座標表示$r=f(\theta)$の曲線を描く。 + +\vspace{\baselineskip} +【例】カージオイド曲線を描く。 + +\hspace{10mm}\verb|Polarplot("1","2*(1+cos(t))","t=[0,2*pi]",["Num=200"]);| + +\vspace{\baselineskip} +\begin{center}\scalebox{0.7}{\input{Fig/cardioid1}}\end{center} + +\vspace{\baselineskip} +\hypertarget{periodfun}{} +\item[関数]Periodfun(定義式,周期,options) +\item[機能]周期関数のグラフを描く。戻り値はMaxima形式の式とperiodのリスト。 +\item[説明]周期関数の式を定義してグラフを描く。 +定義式は,関数式(文字列),区間,分割数のリスト。 + +この関数固有のオプションは "Con=" で,不連続点を線で結ぶか否かと,その時の色。 + 初期設定は破線。結ばない場合は "Con=n",色指定は線種に続いてコンマで区切って指定する。たとえば,"Con=do,Color=red"。 + +周期(描画回数)は,数またはリストで指定する。周期がmのとき,2m+1周期分描かれる。 + + +注意)関数は左右対称な定義域 [-a,a] で定義すること。 + +\vspace{\baselineskip} +【例】矩形関数のグラフ + +\begin{verbatim} +defL=["0",[-1,0],1,"1",[0,1],1]; +Periodfun(defL, 2,["dr,2"]); +memori=apply(-5..5,x,[x,text(x)]); +memori=flatten(remove(memori,[[0,"0"]])); +Htickmark(memori); +Vtickmark([1,"1"]); +\end{verbatim} + +\hspace{20mm}\input{Fig/periodfun.tex} + +\vspace{\baselineskip} +一方を放物線にした場合 +\begin{verbatim} +defL=["0",[-1,0],1,"x^2",[0,1],50]; +Periodfun(defL, 2, ["Con=n","dr,2"]); +memori=apply(-5..5,x,[x,text(x)]); +memori=flatten(remove(memori,[[0,"0"]])); +Htickmark(memori); +Vtickmark([1,"1"]); +\end{verbatim} + +\hspace{20mm}\input{Fig/periodfun2.tex} + +\vspace{\baselineskip} +\hypertarget{fourierseries}{} +\item[関数]Fourierseries(name,係数,周期,項数) +\item[機能]フーリエ級数のグラフを描く。 +\item[説明]$a_0+\displaystyle{\sum _{n=1} ^{\infty}(a_n \cos nx + b_n \sin nx)}$ を描く。 +係数は $a_0,a_n,b_n$ のリストで,それぞれの要素は文字列とする。 + +この関数固有のオプションは "Con=y/n" で,不連続点を破線で結ぶか否か。 初期設定は y。 + +矩形波のフーリエ近似のような場合は,オプションとして,["Num=200"](100以上の値を指定)をつけるとよい。 + +\vspace{\baselineskip} +【例】矩形波のフーリエ近似 +\begin{verbatim} + Fourierseries("1",["1/2","0","(1-(-1)^n)/(pi*n)"],2,6,["Num=200"]); +\end{verbatim} + +\begin{center} +\input{Fig/fourierseries.tex} +\end{center} + +\vspace{\baselineskip} +\hypertarget{tangentplot}{} +\item[関数]Tangentplot(name , PD , 位置 , options) +\item[機能]接線を描く。プロットデータの名前は,lntn +\item[説明]曲線PDの指定した位置での接線を描く。位置は "x=n" で指定する。 + +使用例は\hyperlink{parabolaplot}{Parabolaplot}の例を参照。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +%\newpage +% ====== 文字 ============== +\subsubsection{文字} +\begin{description} + +\vspace{\baselineskip} +\hypertarget{expr}{} +\item[関数]Expr([座標 , 位置 , 文字列],option) +\item[機能]\TeX 記法の文字列を与えて数式を書く。 +\item[説明]Letterで文字列の前後に\$ \$をおくのと同じ。 + +導関数の記号は,$'$(シングルクォート)を用いる。 + +複数の箇所に文字を書く場合は,Letter() と同様,引数をリストにして与える。 + +optionは フォントサイズで,["size=32"] のように指定する。 + +\vspace{\baselineskip} +【例】$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} +\vspace{\baselineskip} +\begin{center} \input{Fig/expr}\end{center} + +【例】対数関数の定積分の記号および積分値を図に書き込む。 +\begin{verbatim} +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$)をドラッグして + + 積分範囲を決めるようにしているので,そこから計算した値。 + + 矢線は \verb|Arrowdata(Q,P); | で表示している。矢線の始点がQ +\vspace{\baselineskip} +\begin{center} \input{Fig/intlog}\end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{exprrot}{} +\item[関数]Exprrot(座標 , 向き , 方向,文字列,option) +\item[機能]\TeX 記法の文字列を与えて傾いた数式を書く。 +\item[説明]「座標」の位置に,指定された向きで数式を書く。 + +向きはベクトルで与える。 + +方向は t (ベクトルと同じ向き) と n(ベクトルと垂直な向き) の両方を数字つきで与える。ただし,方向はオプション。 + +座標,向きとも,Cinderellaで作図した幾何点を用いることができる。 + +optionは フォントサイズで,["size=32"] のように指定する。 + +\begin{verbatim} +Exprrot([3,2],[2,-1],"t0n1","\sqrt{3}"); +Exprrot(C,B-A,"\frac{2}{3}"); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{10mm}\includegraphics[bb=0.00 0.00 181.01 131.01,width=4cm]{Fig/exprrot.pdf} \hspace{10mm} \input{Fig/exprrot} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{letter}{}\item[関数]Letter([位置, 方向, 文字列],option) +\item[機能]文字列を表示する +\item[説明]「位置(座標)」と方向で指定された場所に文字を書き込む。 + +位置(座標)は点の名前で指定することもできる。 + +場所は上下左右を東西南北で表し, n/s/w/e/c の方向で表す。cは中央。 + +%\begin{center} \input{Fig/letter4} +指定位置からの距離を,数値で与えることもでき,e2, e3 は e より少し離して置く。 + +複数の文字列をリストの形にして渡すことができる。 + +注)導関数の記号$'$は,数式モード(\$ ではさむ)で$'$(シングルクォート)を用いる。 + +optionは フォントサイズで,["size=32"] のように指定する。 + +文字列が一つのときは, + +Letter(位置, 方向, 文字列,option) + +にできる。 + +\vspace{\baselineskip} +【例】 + +座標 (2,1) の南東にPを表示 + +\hspace{10mm}\verb|Letter([[2,1] ,"se","P"]);| + +点Cを中央としてCを表示 + +\hspace{10mm}\verb|Letter([C ,"c", "C"]);| + +点Aの南西にA,Eの南に数式を表示 + +\hspace{10mm}\verb|Letter([A,"sw","A",E,"s","$ f(x)=\frac{1}{4} x^2 $"]);| + +\vspace{\baselineskip} +\hypertarget{letterrot}{}\item[関数]Letterrot(座標, 方向ベクトル,移動量, 文字列,option) +\item[機能]文字列を回転して表示する +\item[説明]座標で示された位置に,方向ベクトルで指定された向きに回転して文字を書き込む。 + +第3引数は微小移動量で,略すこともできる。 + +optionは フォントサイズで,["size=32"] のように指定する。 + +\begin{verbatim} +Letterrot(C,B-A,"t2n5","AB"); +\end{verbatim} + +移動量を略して + +\hspace{10mm}\verb|Letterrot(C,B-A,"AB");| + +とすることもできる。この場合は,微小な移動はされない。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\newpage +\end{description} +% ====== マーキング ============== +\subsubsection{マーキング} +\begin{description} + +\hypertarget{anglemark}{} +\item[関数]Anglemark(name,点リスト , options) +\item[機能]点リストで示された角に弧の形状の角の印をつける。 +\item[説明]Listplot() などと同様,点リストが点名の場合はnameは省略できる。弧を描かず文字だけを入れる場合は options に "nodisp" を指定する。 + +optionsは次の通り。 + +数値角の印の大きさ。 初期設定は1 + +線種"dr, n", "da,m,n" , "do,m,n" + +"Expr=文字" または "Letter=文字" : 文字を入れる + +"Expr=位置 , 文字": 位置を指定して文字を入れる。位置は頂点からの距離。 + +\vspace{\baselineskip} +【例】三角形の内角に印をいれ,文字を書き込む。(下図左) +\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} + +【例】三角形の内角に弧を描かず,$\circ$ だけ書き込む。(下図右) +\begin{verbatim} +Listplot([A,B,C,A]); +Letter([A,"n1","A",B,"w1","B",C,"e1","C"]); +Anglemark([C,B,A],["Expr=\circ","nodisp"]); +\end{verbatim} + + +\input{Fig/anglemark}\hspace{5mm}\input{Fig/anglemark2} + +※角の印には平行四辺形の形状のものもある。\hyperlink{paramark}{Paramark()}を参照のこと。 + +\vspace{\baselineskip} +\hypertarget{paramark}{} +\item[関数]Paramark(name,点リスト , options) +\item[機能]点リストで示された角に平行四辺形の形状の角の印をつける。 +\item[説明]Listplot() などと同様,点リストが点名の場合はnameは省略できる。 + +optionsは次の通り。 + +数値角の印の大きさ。 初期設定は1 + +線種"dr, n", "da,m,n" , "do,m,n" + +"Expr=文字": 文字を入れる + +"Expr=位置 , 文字": 位置を指定して文字を入れる。位置は頂点からの距離。 + +\vspace{\baselineskip} +\begin{layer}{150}{0} +\putnotese{85}{0}{ \scalebox{0.8}{\input{Fig/paramark}}} +\end{layer} + +【例】三角形の内角に印をいれ,文字を書き込む。 + +\begin{verbatim} + Listplot([A,B,C,A]); + Paramark([A,B,C]); + Paramark([C,A,B],[3,"Expr=\alpha"]); + Paramark([B,C,A],["dr,2","Expr=2,\theta"]); + +\end{verbatim} + +※角の印には弧の形状のものもある。\hyperlink{anglemark}{Anglemark()} を参照のこと。\\ + +\vspace{\baselineskip} +\hypertarget{bowdata}{} +\item[関数]Bowdata(name,点リスト , options) +\item[機能]弓形を描く +\item[説明]点リストで与えられた2点を結ぶ弓形を描く。Listplot() などと同様,点リストが点名の場合はnameは省略できる。 + +2点を反時計回りに回る方向に弓形を描く。 + +optionsは,[曲がり , 空白サイズ, 文字, 線種] + +曲がりは弧の曲がり具合の指定。 初期設定は1 + +空白サイズは中央にあける空白の大きさ + +文字は,"Expr=文字" + +また,"Expr=微小移動 , 文字"で位置を指定して文字を入れる。 + +微小移動は tn + + t は線分方向の微小移動。移動量は数字をつける。正負が可。 + + n は線分と垂直方向の微小移動 + +\vspace{\baselineskip} + \begin{layer}{150}{0} +\putnotese{85}{0}{ \input{Fig/bowdata}} + \end{layer} + +【例】三角形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=t0n3,a"]); +Bowdata([C,A],[2,1.2,"Expr=10","da"]); +\end{verbatim} + +\vspace{\baselineskip} +これに加え,文字を回転して表示する方法がある。ただし,Cinderellaの画面には反映されない。文字をを回転するには次のように書く。 + +\hspace{10mm}"Exprrot=微小移動 , 文字" + + 微小移動の最後にr をつけると,上下反転する。 + +以下にいくつか例を示す。 +\begin{verbatim} +Bowdata([B,A],[1,1,"Exprrot=a"]); +Bowdata([D,C],[1,1,"Exprrot=t3n0,a"]); +Bowdata([F,E],[1,1,"Exprrot=t-3n0,a"]); +Bowdata([H,G],[1,1,"Exprrot=t0n3,a"]); +Bowdata([L,K],[1,1,"Exprrot=t0n0r,a"]); +Bowdata([N,M],[1,1,"Exprrot=t3n0r,a"]); +\end{verbatim} +\hspace{10mm} \scalebox{0.7}{\input{Fig/bowdata2}} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{drawsegmark}{} +\item[関数]Drawsegmark(name,リスト,options)または Segmark(name,リスト,options) +\item[機能]線分に印をつける +\item[説明]リストで与えられた2点を端点とする線分に印をつける。印には4種類がある。 + +optionsは +\begin{tabbing} +1234\=56789012\=345678901234567890\=\kill + \> Type=n \>:印の種類 n=1〜4\\ + \> Width\>:二本線のときの線の幅 +\end{tabbing} + +【例】四角形ABCDを描き線分に印をつける。 + +\begin{layer}{150}{0} +\putnotese{90}{0}{ \input{Fig/segmark}} +\end{layer} +\hspace{50mm} +\begin{verbatim} +Listplot([A,B,C,D,A]); +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} + +%\vspace{\baselineskip} +\hypertarget{htickmark}{} +\item[関数]Htickmark([横座標 , 方向 , 文字]) +\item[機能]横軸に目盛と文字を書く。 +\item[説明]引数は位置(横座標),方向,文字。複数点の情報を[ ]内にまとめて記入できる。方向を省略すると "s1"になる。微調整は描画面には反映されないので,PDFにして確認する。 +目盛の長さは \hyperlink{setmarklen}{Setmarklen()} で設定できる。 + +\vspace{\baselineskip} +【例】 方向指定の例:\verb|Htickmark([1,"1",2,"n1","2",3,"se","3",4,"4"]);| + +\vspace{\baselineskip} +\begin{center} +\input{Fig/htickmark01} +\end{center} + +%\vspace{\baselineskip} +【例】-5から5までの目盛を打つ。 +Cindyscriptのリスト処理を使って,次のように引数のリストを作って渡す。 +\begin{verbatim} +memori=apply(-5..5,x,[x,text(x)]); +memori=flatten(remove(memori,[[0,"0"]])); +Htickmark(memori); +\end{verbatim} +1行目,apply のカッコ内の -5..5 でリスト[-5,-4,-3,-2,-1,0,1,2,3,4,5] ができる。それを用いて,applyで[数, 数の文字] からなるリストができる。text(x) はxを文字にする関数。2行目で,このリストから,[0,"0"]を除き,リストを平滑化する。 結果は次のようになる。 + +\begin{center} \scalebox{0.8}{\input{Fig/htickmark}}\end{center} + +\hypertarget{vtickmark}{} +\item[関数]Vtickmark([横座標 , 方向 , 文字]) +\item[機能]縦軸に目盛と文字を書く。 +\item[説明]Htickmarkと同様。縦軸に目盛を書く。方向を省略すると "w1"になる。 + +\vspace{\baselineskip} +【例】点$(0,\ 1),\ (0,\ 2)$の西側に$1,\ 2$を表示する。 + +\hspace{10mm}\verb|Vtickmark([1,"1",2,"2"]);| + +\vspace{\baselineskip} +\hypertarget{rulerscale}{} +\item[関数]Rulerscale(始点 ,横軸目盛 , 縦軸目盛) +\item[機能]目盛を打つ +\item[説明]始点の位置を縦横の起点として目盛りを打つ。目盛はリストで与える。 +["r",a,b,c,d]の形式では,aからbまでc間隔で,倍率dの目盛を打つ。 +["f",n1,"str",n2,"str",・・] の形式では,nと"str"がセットで,nの位置に"str"を書く。ただし,位置はCinderellaの描画面の原点を0とする。 + +Listplot() とともに用いると,座標軸とは異なる線分に目盛を打つことができる。 + +Framedata() とともに用いると矩形に目盛を打つことができる。 + +\vspace{\baselineskip} +【例】x軸上の (2,1) から (9,1) まで線分を引き,1目盛を10として目盛を打つ。 +\begin{verbatim} +Listplot("1",[[2,1],[9,1]]); +Rulerscale([2,1],["r",2,9,1,10],[]); +\end{verbatim} +\vspace{\baselineskip} +\begin{center} \scalebox{0.9}{\input{Fig/ruler1}} \end{center} +\vspace{\baselineskip} +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +【例】Aを原点に置いた矩形枠を描き,横に0,1,2,3,4,5,縦に d1,d2 の目盛を打つ。 +\begin{verbatim} +Framedata("1",[A,B],["corner"]); +Rulerscale(A,["r",0,5,1],["f",1,"d1",3,"d2"]); +\end{verbatim} +\begin{center}\scalebox{0.9}{ \input{Fig/ruler}} \end{center} +%\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +%\newpage + +%==プロットデータの操作=================== +\subsection{プロットデータの操作} +\begin{description} + +\hypertarget{drawfigures}{} +\item[関数]Drawfigures(or Drwfigs)(name ,データリスト,オプションリスト) +\item[機能]複数のプロットデータのスタイル(オプション)をリストで与えて描画する +\item[説明]複数のプロットデータをまとめて扱う。たとえば,円と,円周上の点の2つのプロットデータをまとめて扱えば,平行移動や回転で,それらのプロットデータをまとめて平行移動や回転ができる。%Joincrvs()では,プロットデータをつなげて1つのプロットデータにするが,Addgraph()では,それぞれのプロットデータからなるリスト(リストのリスト)にする。(プロットデータは座標のリストである) + +%引数には,プロットデータ名を文字列化して渡す。たとえば,円のプロットデータが cr1 のとき,"cr1" とする。 + +\vspace{\baselineskip} +【例】サイクロイドの図を描く。 +\begin{verbatim} +opcr=["dr"]; +oppt=["Size=2","Color=red"]; +Circledata("1",[[0,1],[0,0]],opcr); +Pointdata("1",[0,0],oppt); +ad1=["cr1","pt1"]; +dt=2*pi/32; +opcr=["dr,0.3"]; +nn=32; +forall(1..nn, + t=dt*#; + Rotatedata(2,ad1,-t,[[0,1],"nodisp"]); + Translatedata(2,"rt2",[t,0],["nodisp"]); + Drawfigures(text(#),["tr2_1","tr2_2"],[opcr,oppt]); +); +\end{verbatim} + +\vspace{\baselineskip} +\hspace{20mm} \input{Fig/drawfigures1} + +最初に,まとめて平行移動や回転をするデータをリスト化しておく。また,各データのオプションをリストとして与えていることに注意。こうすることで,サイズや色などのスタイルを元のスタイルに合わせることができる。 + +%\hypertarget{addgraph}{} +%\item[関数]Addgraph(name ,プロットデータのリスト,option) +%\item[機能]複数のプロットデータをまとめる +%\item[説明]複数のプロットデータをまとめて扱う。たとえば,円と,円周上の点の2つのプロットデータをまとめて扱えば,平行移動や回転で,それらのプロットデータをまとめて平行移動や回転ができる。Joincrvs()では,プロットデータをつなげて1つのプロットデータにするが,Addgraph()では,それぞれのプロットデータからなるリスト(リストのリスト)にする。(プロットデータは座標のリストである) +% +%引数には,プロットデータ名を文字列化して渡す。たとえば,円のプロットデータが cr1 のとき,"cr1" とする。 +% +%\vspace{\baselineskip} +%【例】サイクロイドの図を描く。 +%\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} +% +%\vspace{\baselineskip} +%\hspace{20mm} \input{Fig/addgraph} +% +%ここで,Addgraph()の引数に与えるプロットデータのリストで,点のプロットデータ pt1 を"[pt1]" としていることに注意。円のプロットデータが,点の座標のリストであるのに対し,点のプロットデータは一つの座標だけなので,このようにしてリスト化して渡す。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{changestyle}{} +\item[関数]Changestyle(PDリスト, options) +\item[機能]描画オプションを変更する +\item[説明]複数の図形の描画オプションを一括して変更する。 + +\vspace{\baselineskip} +【例】線分AB,円ABの線を破線にして\TeX に書き出さないようにする。 + +\hspace{10mm} \verb|Changestyle(["sgAB","crAB"],["da","notex"]);| + + +\vspace{\baselineskip} +\hypertarget{invert}{} +\item[関数]Invert(PD) +\item[機能]プロットデータを逆順にする + +\vspace{\baselineskip} +\hypertarget{joincrvs}{} +\item[関数]Joincrvs(name, プロットデータのリスト, options) +\item[機能]隣接する曲線プロットデータ のリストを繋いで1本の曲線を作る。 +\item[説明]曲線のリストは隣接する順番で指定する。 + +optionsは線種"dr, n", "da,m,n" , "do,m,n" + +\vspace{\baselineskip} +【例】線分$y=x\ (-\sqrt{2} \leq x \leq \sqrt{2})$と半円で得られる閉曲線を描いて黄色で塗る。 + +点Aは原点に,点Bは適当なところに作図しておく。 + +\begin{layer}{150}{0} +\putnotese{80}{5}{ \input{Fig/joincrvs}} +\end{layer} + +\begin{verbatim} +Plotdata("1","x","x=[-sqrt(2),sqrt(2)]"); +B.xy=[sqrt(2),sqrt(2)]; +Circledata("2",[A,B],["Rng=[pi/4,pi/4*5]"]); +Joincrvs("1",["gr1","cr2"]); +Shade(["join1"],["Color=yellow"]); +\end{verbatim} +\vspace{5mm} +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{partcrv}{} +\item[関数]Partcrv(name, A, B, プロットデータ, options) +\item[機能]曲線プロットデータ上の点A, B の間の部分曲線を描く。 +\item[説明]2点A, Bの順序は曲線の向きと同一であること。曲線の向きは,$y=f(x)$のグラフではx座標が増加する向き。 + +optionsは線種"dr, n", "da,m,n" , "do,m,n" + +\vspace{\baselineskip} +【例】放物線を点線で描き,一部を実線で描く。 + +\verb|Plotdata("1", "x^2", "x", ["do"]);|(プロットデータの名前はgr1となる) + +\verb|Partcrv("1", [0,0], [1,1], "gr1");| + +\begin{center} \input{Fig/partcrv1} \end{center} + +【例】円の一部を実線で描く。円のプロットデータは指定した円周上の点から反時計回りの順にできる。点Aは円の中心,Bは円周上の点とする。点P,Qは適当な位置に作図しておく。 +\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{\baselineskip} +\hspace{10mm} \input{Fig/partcrv3} \hspace{10mm} \input{Fig/partcrv4} + +\hspace{25mm}part1 の図\hspace{45mm}part2 の図 + +\vspace{\baselineskip} +【例】放物線$y=x^2$が円で切り取られる部分を実線で描く。 + +\begin{layer}{150}{0} +\putnotese{85}{0}{\input{Fig/partcrv}} +\end{layer} +\begin{verbatim} +Circledata("1",[[0,2],[0,0]],["da"]); +Plotdata("1","x^2","x",["do"]); +tmp=Intersectcrvs("cr1","gr1"); +Partcrv("2",tmp_2,tmp_1,"gr1",["dr,2"]); + +\end{verbatim} + +\vspace{\baselineskip} +\vspace{\baselineskip} +\vspace{\baselineskip} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{enclosing}{} +\item[関数]Enclosing(name , PDリスト , [開始位置, 交点計算の許容限界1, 2]) +\item[機能]複数の曲線から閉曲線を作る。 +\item[説明]開始位置は,最初と最後の曲線の交点が複数あるときに指定する。 + +開始点は近くに取ればよい。許容限界は,通常は指定しなくてよい。 + +\vspace{\baselineskip} +【例】放物線と直線で囲まれる領域に色を塗るために Shade() を使う。 +\begin{verbatim} +Plotdata("1","x^2","x"); +Lineplot("1",[[0,0],[1,0]]);// axis x +Lineplot("2",[[2,0],[2,1]]); +Enclosing("1",["Invert(gr1)","ln1","ln2"],["nodisp"]); +Shade(["en1"],["Color=red"]); +\end{verbatim} +\vspace{\baselineskip} + \begin{center} \input{Fig/enclosing} \end{center} + +\vspace{\baselineskip} +注)閉曲線のとりかたでは,出発点を原点にした反時計回りまたは時計回りにすると + +反時計回りで\verb|Enclosing("1",["ln1","ln2","Invert(gr1)"]);| + +時計回りで\verb|Enclosing("1",["gr1","Invert(ln2)","Invert(ln1)"]);| + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{hatchdata}{} +\item[関数]Hatchdata(name , 方向リスト , プロットデータ , options) +\item[機能]閉曲線の内部に斜線を引く。 +\item[説明]引数は,曲線名,内部外部のパターンを与える''i'',''o''の文字列,閉曲線を与える曲線と領域の内部を定める方向のリストとオプション。\\ +オプション(カッコ内はデフォルト値)\\ + 角度(45),間隔(1),\verb|"Max=(20)"| 斜線の最大本数,\\ + \verb|"No=点リスト"| 点リストの点が選ばれているときは実行しない\\ + \verb|"File=y/m/n (n)"| データファイルを作るか\\ + \verb|"Check=点リスト"| 点リストの点が変更されていたら,ファイルを作り直す + +\vspace{\baselineskip} +【例】円の内部。(次図左) +\begin{verbatim} +Circledata([A,B],["dr"]); +Hatchdata("1",["i"],[["crAB"]],["dr,0.7"]); +\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"]); +Hatchdata("2",["iio"],[["crAB"],["gp1"],["gp2"]],["dr,0.7"]); +\end{verbatim} +\vspace{\baselineskip} +\hspace{5mm} \input{Fig/hatch1} \hspace{5mm} \input{Fig/hatch2} + +【例】複数の領域。 +\begin{verbatim} +Plotdata("1","2*sin(x)","x=[-pi,3*pi]",["Num=100"]); +Listplot([A,B]); +Listplot([A,C]); +Hatchdata("1",["ii"],[["sgAB","n"],["gr1","s"]],["dr,0.7"]); +Hatchdata("2",["ii"],[["sgAC","s"],["gr1","n"]],["dr,0.7"]); +\end{verbatim} +\begin{center} +\begin{center} \input{Fig/hatch3} \end{center} +\end{center} + +【例】複数の領域その2。 +\begin{verbatim} +Plotdata("1","2*sin(x)","x=[-pi,3*pi]",["Num=100"]); +Listplot([A,B]); +Listplot([A,C]); +Hatchdata("1",["iio"],[["sgAB","s"],["sgAC","n"],["gr1","n"]]); +\end{verbatim} +\begin{center} +\begin{center} \input{Fig/hatch4} \end{center} +\end{center} + + +【例】3次曲線と接線で囲まれた領域 + +点Aを原点付近に作図しておく。 +\begin{verbatim} +Deffun("f(x)",["regional(y)","y=x^3-2*x","y"]); +Plotdata("1","f(x)","x",["Num=100"]); +Putoncurve("A","gr1"); +coef=Derivative("f(x)","x",A.x); +Defvar(["coef",coef]); +Deffun("g(x)",["regional(y)","y=coef*(x-A.x)+A.y","y"]); +Plotdata("2","g(x)","x",["Num=1"]); +if(!Isptselected(A), + Enclosing("1",["gr2","Invert(gr1)"],[A,"nodisp"]); + Hatchdata("1",["i"],[["en1"]]); +); + +\end{verbatim} +\begin{layer}{150}{0} +\putnotese{80}{0}{\input{Fig/hatch5}} +\end{layer} + +点Aをドラッグして曲線上を動かすと, + +\verb|if(!Isptselected(A),・・・| の効果により, + +その間は領域の斜線は引かれない。 + +点A以外の画面上の適当な位置をクリックして, + +点Aが選択状態でなくなると斜線が引かれる。 + +引かれる斜線の向きや間隔を変えることもできる。 + +間隔は実数で指定できる。 + +\vspace{\baselineskip} +【例】円の内部または円と直線で区切られた図形 + +\verb|Circledata([A,B]);|のプロットデータ crAB を用いて,下図左から + +\verb|Hatchdata("1",["i"],[["crAB"]]);| 円内に傾き$45^{\circ}$の斜線を引く + +\verb|Hatchdata("2",["i"],[["crAB"]],[-40,2]);| 傾き$-40^{\circ}$,間隔を2倍に + +\verb|Hatchdata("3",["i"],[["crAB"]],["dr,0.5"]);|線の太さを0.3倍に + +\verb|Hatchdata("4",["i"],[["crAB"]],[-45,2,"dr,0.3"]);| + +\input{Fig/HatchZuKita1.tex} + +円のオプションに "notex"をつけた場合と,破線で描いた場合。 +\begin{verbatim} +Circledata([A,B],["notex"]); +Circledata([A,B],["da"]); + \end{verbatim} + +\hspace{10mm} \input{Fig/HatchZuKita7.tex}\input{Fig/HatchZuKita8.tex} + +直線で分けられた領域を作り,対角の上下にハッチをかける。線を描き分ける。 +\begin{verbatim} + Circledata([A,B]); + Lineplot("1",[A,B]); + Lineplot("2",[A,C]); + Hatchdata("1",["iii"],[["crAB"],["ln1","n"],["ln2","n"]]); + Hatchdata("2",["iii"],[["crAB"],["ln1","s"],["ln2","s"]],[90,0.5]); +\end{verbatim} + +\hspace{40mm}\input{Fig/HatchZuKita9.tex} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{dotfilldata}{} +\item[関数]Dotfilldata(name , 方向リスト , プロットデータ , options) +\item[機能]領域を点で敷き詰める。 +\item[説明]Rとデータの授受をおこなって描画する。書式はHatchdata()と同様。 + +オプションは,ドットの密度で 0.1〜0.8 程度。 初期設定は0.3。 + +\vspace{\baselineskip} +【例】円グラフ + +Partcrv() と Enclosing() で閉曲線を作って点を敷き詰める。 + + +%\begin{center}\scalebox{0.9}{\input{Fig/dotfill}} \end{center} +\begin{layer}{150}{0} +\putnotese{85}{-3}{\scalebox{0.9}{ \input{Fig/dotfill}}} +\end{layer} + +\begin{verbatim} +r=3; +p0=r*[cos(pi/2),sin(pi/2)]; +p1=r*[cos(-pi/6),sin(-pi/6)]; +p2=r*[cos(-3*pi/4),sin(-3*pi/4)]; +Circledata("1",[[0,0],[r,0]]); +Listplot("1",[[0,0],p0]); +Listplot("2",[[0,0],p1]); +Listplot("3",[[0,0],p2]); +Partcrv("1",p1,p0,"cr1"); +Enclosing("1",["sg2","part1","Invert(sg1)"],[[0,0]]); +Partcrv("2",p2,p1,"cr1"); +Enclosing("2",["sg3","part2","Invert(sg2)"],[[0,0]]); +Dotfilldata("1",["i"],[["en1"]]); +Dotfilldata("2",["i"],[["en2"]],[0.1]); +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{shade}{} +\item[関数]Shade(("名前"), プロットデータのリスト , options) +\item[機能]閉曲線で囲まれた領域を塗りつぶす。 +\item[説明]第1引数には,閉曲線を与える曲線分のプロットデータ名を並べる。 + +デフォルトでは,Joincrvsを使って閉曲線を作っている。ただし,プロットデータのリストに +"Invert()"が入っていれば,Enclosingを使う。 + +optionの Color は,Cinderellaの画面上での描画色をリストで与える。濃さを指定したい場合は色名やRGBではなくCMYKにする。 + +optionsには,他に,次のものがある。 + +・Enclosingを使うかどうか:''Enc=y/n''(初期値は y) + +・Enclosingのときの開始点,描画色 + +・描画領域のトリミング:Trim=y/n (初期値は n ) + +複数のShadeを使うときは,名前をつける。 + +\vspace{\baselineskip} +【例】$y=2\sin x$のグラフと直線$y=1$ とで囲まれた部分に黒0.2の濃さで色を塗る。 +\begin{verbatim} +Setax([7,"nw"]); +Plotdata("1","2*sin(x)","x",["Num=100"]); +Lineplot("1",[[0,1],[1,1]]); +Enclosing("1",["ln1","Invert(gr1)"],[[2,1],"nodisp"]); +Shade(["en1"],["Color=[0,0,0,0.2]"]); +\end{verbatim} +\begin{center} \input{Fig/shade} \end{center} + +正弦曲線と直線の交点は簡単に計算できるので,次のように Partcrv() で部分曲線を求め,Enclosingで閉曲線を求めずにShadeを使ってもよい。 +\begin{verbatim} +Plotdata("1","2*sin(x)","x",["Num=100"]); +Lineplot("1",[[0,1],[1,1]]); +Partcrv("1",[5*pi/6,1],[13*pi/6,1],"gr1"); +Shade(["ln1","Invert(part1)"],[[2.5,1],"Color=0.2*[1,0,0,1]"]); +\end{verbatim} + + +\vspace{\baselineskip} +【例】2つの放物線で囲まれた部分を赤で塗る。 +\begin{verbatim} +Plotdata("1","x^2-1","x=[-3,3]"); +Plotdata("2","x^2/2","x=[-3,3]"); +Shade(["gr2","Invert(gr1)"],[[-1.5,1],"Color=[1,0,0]","alpha->0.4"]); +\end{verbatim} + +ここで,\verb|alpha->0.4| は画面上の色濃度指定。 + +\vspace{\baselineskip} +\begin{center}\scalebox{0.9}{\input{Fig/shade01}} \end{center} + +\vspace{\baselineskip} +【例】描画領域(NE,SWの矩形領域)からはみ出した部分は表示しないようにする。 + +\begin{verbatim} +Plotdata("1","x^2","x"); +Partcrv("1",[-1,1],[3,9],"gr1"); +Listplot("1",[[3,9],[-1,1]]); +Joincrvs("1",["sg1","part1"]); +Shade(["join1"],["Color=[0,0,0.2,0]","Trim=y"]); +\end{verbatim} + +SW,NE を動かしてみると,白枠内だけが色塗りされる。 + +\vspace{\baselineskip} +【例】同心円をリング状に塗る。 + +下図右のように,同心円をリング状に塗るが,円2つだけでは閉曲線はできない。そこで,左図のように,円の描き始めを線分で結んで閉曲線を作る。このとき,向きを考えて,Joincrvsで結ぶように,''Enc=n''をつける。線分は非表示にしたいので,\verb|"nodisp"|オプションをつけておく。なお,点Aを適当な位置に作図しておく。 + +\begin{verbatim} +r1=2; +r2=1.5; +Circledata("1",[A,A+[r1,0]]); +Circledata("2",[A,A+[r2,0]]); +Listplot("1",[A+[r1,0],A+[r2,0]],["nodisp"]); +Shade(["cr1","sg1","Invert(cr2)","Invert(sg1)"],["Enc=n","Color=green"]); +\end{verbatim} +\begin{center}\input{Fig/greenring} \end{center} + +その他,\hyperlink{joincrvs}{Joincrvs() の例}も参照のこと + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{reflectdata}{} +\item[関数]Reflectdata(name , プロットデータ , 対称点または対称軸,options) +\item[機能]プロットデータの鏡映を作成 +\item[説明]プロットデータを指定された点または軸に関して対称移動する。 + +対称点は座標または,点の識別名。ただし,対称点を座標で示すときは要素がひとつのリストにする。 + +対称軸はリスト[ 点1, 点2 ]で指定。 + +\vspace{\baselineskip} +【例】中心A , 半径ABの円を描き,そのプロットデータを用いて鏡映を描く。 + +点Cに関して対称な円を実線 + +点(-1,2)に関して対称な円を太い実線 + +直線DEに関して対称な円を破線 + +\begin{verbatim} +Circledata([A,B]); +Reflectdata("1","crAB",[C]); +Reflectdata("2","crAB",[[-1,2]],["dr,2"]); +Reflectdata("3","crAB",[D,E],["da"]); +\end{verbatim} + +\vspace{\baselineskip} + \begin{center} \input{Fig/reflectdata} \end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{rotatedata}{} +\item[関数]Rotatedata(name , プロットデータ ,角度 , [中心 , options]) +\item[機能]プロットデータの位置を回転する +\item[説明]図形を,中心で示された点の周りに回転する。角度は弧度法で与える + +中心とoptionsはまとめてリストで与える。 + +\begin{spacing}{1.5} +【例】中心A , 半径ABの円を描き,次のように回転して線種を変えて描く。 + + 点Cを中心に$\dfrac{\pi}{2} $,点(1,5)を中心に$\dfrac{\pi}{3}$ , 点Dを中心に $-\dfrac{\pi}{3} $ +\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} +\vspace{\baselineskip} +\begin{center}\scalebox{0.9}{ \input{Fig/rotatedata} }\end{center} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{scaledata}{} +\item[関数]Scaledata(name , プロットデータ,x方向比率 , y方向比率 , [中心 , options]) +\item[機能]図形の位置を拡大・縮小する +\item[説明]図形の位置をプロットデータを用いて指定された比率で拡大・縮小する + +比率は [x方向比率 , y方向比率] のリストで与えてもよい。 + +中心とoptionsはまとめてリストで与える。optionsは線種 + +\vspace{\baselineskip} +【例】点A(2,1),B(1,1),C(-1,-1),D(3,-1) を作図しておく。 + + Aを中心とする半径ABの円のプロットデータを作り, + +原点中心に$x$軸方向に3,$y$軸方向に2拡大する。 + +Cを中心に$x$軸方向に3,$y$軸方向に2拡大し,実線で太く描く。 + +原点中心にベクトル$\overrightarrow{\mathrm{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} + +\vspace{0mm} + \begin{center} \input{Fig/scaledata} \end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{translatedata}{} +\item[関数]Translatedata(name , プロットデータ , 移動ベクトル , options) +\item[機能]プロットデータを平行移動する +\item[説明]プロットデータを移動ベクトルで示された分だけ平行移動する。 + +\vspace{\baselineskip} +【例】点A,B,C,Dを作図ツールでとっておく。 + +\verb|Circledata([A,B]);| でできる円(crAB)を + $x$軸方向に2,$y$軸方向に3だけ平行移動して実線で描く。 + +ベクトル$\overrightarrow{\mathrm{OC}} $だけ平行移動し,実線で太く描く。 + +ベクトル$\overrightarrow{\mathrm{OD}} $だけ平行移動し,破線で描く。 + +\begin{verbatim} +Circledata([A,B]); +Translatedata("1","crAB",[2,3]); +Translatedata("2","crAB",C,["dr,2"]); +Translatedata("3","crAB",D,["da"]); +\end{verbatim} + +\vspace{0mm} +\begin{center} \input{Fig/translatedata} \end{center} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\vspace{\baselineskip} +\hypertarget{intersectcrvs}{} +\item[関数]Intersectcrvs(プロットデータ1, プロットデータ2) +\item[機能]2曲線の交点リストを取得する。 +\item[説明]オプションとして,共有点があるかどうかを判断するための限界値があるが,通常は使わない。 + +\vspace{\baselineskip} +【例】円と曲線の交点をP,Qとする。 + +\begin{layer}{150}{0} +\putnotese{80}{0}{ \input{Fig/Intersectcrvs1}} +\end{layer} + +\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} + +この関数は,交点のデータのリストを返すので,tmp=[ [ -0.37, -0.36 ], [ 2.13, 0.85 ] ] のように値が返ってくる。交点の順序は PD1, PD2 の順序と曲線の向きによって決まる。曲線の向きは,$y=f(x)$のグラフではx座標が増加する向きで,パラメーター表示曲線ではパラメータの増加する向き。また,PD1 上から探し始めて PD2 との交点を拾っていく。 + +交点がひとつの場合も tmp=[ [ 2.45, 0.63 ] ] と2重のリストに入っているので,点として取出すには \verb|P.xy=tmp_1; |とする。 + +\vspace{\baselineskip} +注)交点の算出は,数式処理によるのではなく,プロットデータからの数値探索のアルゴリズムによっている。 + +\vspace{\baselineskip} +\hypertarget{intersectcrvspp}{} +\item[関数]IntersectcrvsPp(プロットデータ1, プロットデータ2) +\item[機能]2曲線の交点のパラメータリストを取得する。 +\item[説明]2曲線の交点の座標とパラメータのリストを返す。 + +Intersectcrvs() との違いは,パラメータがあるかどうかである。 + +\vspace{\baselineskip} +【例】放物線と直線の交点のパラメータを求める。 + +2点A(-1,1),B(2.4) を作図しておく。 +\begin{verbatim} +Plotdata("1","x^2","x"); +Lineplot([A,B]); +p1=Intersectcrvs("gr1","lnAB"); +p2=IntersectcrvsPp("gr1","lnAB"); +println("p1="+p1); +println("p2="+p2); +\end{verbatim} +とすると,コンソールには +\begin{verbatim} +p1=[[-1,1],[2,4]] +p2=[[[-1,1],17.68,1],[[2,4],42.66,1]] +\end{verbatim} +と表示される。 +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{nearestpt}{} +\item[関数]Nearestpt(PD1,PD2) +\item[機能]2曲線に対し,最も近い点とそのパラメータ,距離のリストを返す +\item[説明]戻り値は,それぞれの曲線上の点の座標とプロットデータ中の位置,その距離からなるリスト。 + +\vspace{\baselineskip} +【例】2つの放物線上の点の最短距離とその位置を求める。 + +点A,Bを作図ツールでとっておく。 + +\begin{layer}{150}{0} +\putnotese{80}{-10}{ \input{Fig/nearestpt}} +\end{layer} + +\begin{verbatim} +Plotdata("1", "x^2+2", "x=[-2,2]"); +Plotdata("2", "-(x-2)^2+1","x=[0,4]"); +plist=Nearestpt("gr1","gr2"); +A.xy=plist_1; +B.xy=plist_3; +Listplot([A,B],["do"]); +Pointdata("1",[A,B],["Size=2"]); +Letter([A,"n2w","A",B,"s2e","B",(A+B)/2,"e",text(plist_5)]); +\end{verbatim} + +ここで plistに代入されたリストは次のようになっている。 + +\hspace{10mm}[[0.4,2.16],31,[1.58,0.82],20.73,1.78] + +なお,距離 1.78 は小数点以下第3位を四捨五入して表示されている。 + +\vspace{\baselineskip} +\hypertarget{nearestptcrv}{} +\item[関数]Nearestptcrv(座標, プロットデータ) +\item[機能]点に最も近いプロットデータの点を求める +\item[説明]第1引数の座標に最も近い曲線プロットデータ上の点の座標を返す。 + +\vspace{\baselineskip} +【例】点(3,0)に最も近い $y=x^2$ 上の点を求める。 + +点Aは(3,0)に,点Bは適当な位置に作図しておき,次のスクリプトを実行すると点Bが求める点となる。 + +\begin{layer}{150}{0} +\putnotese{80}{0}{\scalebox{1.0}{\input{Fig/Nearestpt1}}} +\end{layer} + +\begin{verbatim} +Plotdata("1", "x^2", "x"); +B.xy=Nearestptcrv(A.xy,"gr1"); +Listplot([A,B],["do"]); +Ptsize(2); +Pointdata("1",[A,B]); +Letter([A,"ne","A",B,"nw","B"]); +\end{verbatim} + +\vspace{\baselineskip} +\vspace{\baselineskip} +注)第1引数は座標なので,\verb|A| ではなく \verb|A.xy| としなければならない。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\vspace{\baselineskip} +\hypertarget{numptcrv}{} +\item[関数]Numptcrv (プロットデータ) +\item[機能]プロットデータの個数を返す +\item[説明]Cindyscript で length(PD)とするのと同じ + +\vspace{\baselineskip} +【例】 Implicit() と Paramplot() でそれぞれ楕円を描いたときのプロットデータの順序を比較する。 +ただし,TeXには書き出さない。 + +\begin{verbatim} +Slider("A-C-B",[0,-2],[6,-2]); +Implicitplot("1","x^2+4*y^2=4","x=[-2,2]","y=[-2,2]",["do"]); +Paramplot("1","[2*cos(t)+5,sin(t)]","t=[0,2*pi]",["do","Num=140"]); +println([Numptcrv(imp1),Numptcrv(gp1)]); +n=floor(C.x*2); +repeat(n,s,start->0, +t=s*10+1; +draw(imp1_t,color->hue(s/10)); +draw(gp1_t,color->hue(s/10)); +); +\end{verbatim} + +\begin{center} +\includegraphics[bb=0.00 0.00 305.02 133.01,width=8cm]{Fig/numptcrv.pdf} +\end{center} + +4行目で,2つのプロットデータの個数が同じであることを確かめている。 + +スライダを動かすと,10個おきのプロットデータに対応する点が描かれる。 + +\vspace{\baselineskip} +\hypertarget{paramoncrv}{} +\item[関数]Paramoncrv(点の座標, 曲線の名前) +\item[機能]曲線上の点のパラメータ値を返す。 +\item[説明]曲線は折れ線として描かれ,曲線上の各点はこの折れ線の節点を基準としたパラメータ値を持つ。パラメータ値は整数部分が節点の番号,小数部分が節間の位置を表す。 + +\vspace{\baselineskip} +【例】図のような点PからQに至る円周上の5等分点を節点とする折れ線cr1において,$n$番目の線分上の点は$n\leq t\leq n+1$の範囲のパラメータ値を持つ。 + +たとえば,図の点$\mathrm{A}$は2番目の線分上にあり,この値は + +\begin{verbatim} + println(Paramoncrv(A.xy,"cr1")); +\end{verbatim} + +によってコンソールに表示される。(たとえば2.45)。 + +点Aの位置を動かすとパラメータ値は変わる。 + +\vspace{\baselineskip} +\begin{center} + \input{Fig/paramoncrv} +\end{center} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +\vspace{\baselineskip} +\hypertarget{pointoncrv}{} +\item[関数]Pointoncrv(点のパラメータ値, PD) +\item[機能]曲線上のパラメータ値を持つ点の座標を返す。 +\item[説明]曲線(折れ線)上の節点を基準としたパラメータ値により点の位置が定まる。 + +\vspace{\baselineskip} +【例】図のような点$\mathrm{P}$から$\mathrm{Q}$に至る半円周上の5等分点を節点とする折れ線cr1において,パラメータ値$4.5$を持つ点$\mathrm{A}$は4番目の線分の中点である。したがって + +\begin{verbatim} +Circledata("0",[[0,0],[2,0]],["do"]); +Circledata("1",[[0,0],[2,0]],["Num=5","Rng=[0,pi]"]); +tmp=Pointoncurve(4.5,"cr1"); +Pointdata("1",tmp,["Size=3"]); +Letter([tmp,"nw","A",[2,0],"se","P",[-2,0],"sw","Q"]); +\end{verbatim} + +によって,点Aを中点に置くことができる。 + +\vspace{\baselineskip} + \begin{center} \scalebox{0.9}{\input{Fig/pointoncrv}} \end{center} + +%\vspace{\baselineskip} +\hypertarget{ptcrv}{} +\item[関数]Ptcrv(n,プロットデータ) +\item[機能]曲線プロットデータのn 番目の節点を返す +\item[説明]Cindyscript の PD\_n と同じ + +\vspace{\baselineskip} +【例】楕円上の点で分割する。あからじめ必要な点を作図しておく。 + +\begin{layer}{150}{0} +\putnotese{70}{05}{ \input{Fig/ptcrv}} +\end{layer} +\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} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{ptstart}{} +\item[関数]Ptstart(プロットデータ) , Ptend(プロットデータ) +\item[機能]プロットデータの最初の点,最後の点を取得する。 +\item[説明]プロットデータの最初の点,最後の点の座標を返す。 + +\vspace{\baselineskip} +【例】定義域を限定したグラフの両端の点を取得し線分ABを引く。 +\begin{verbatim} +Deffun("f(x)",["regional(y)","y=x^2","y"]); +Plotdata("1","f(x)","x",["do"]); +Plotdata("2","f(x)","x=[-1,2]"); +Lineplot("1",[Ptstart(gr2),Ptend(gr2)],["do"]); +Listplot("1",[Ptstart(gr2),Ptend(gr2)]); +Letter([A,"w2","A",B,"e2","B"]); +\end{verbatim} +\vspace{\baselineskip} +\begin{center} \input{Fig/ptstart} \end{center} + +\vspace{\baselineskip} +\hypertarget{readoutdata}{} +\item[関数]ReadOutData(ファイル名) +\item[機能]外部データをプロットデータとして読み込む +\item[説明]CやRなどで作成したKeTCindy形式のデータファイルを読み込む。 + +引数を省略した場合は,Fheadで定義したファイル名のテキストファイルから読み込む。 + +ファイル名にはコンマで区切ってパスを与えることができる。たとえば, + +\verb|ReadOutData("/datafolder","file.txt"); | + +KeTCindy形式のデータとは + + 変数名// \\ + start//(リストの始まり) \\ + [ , , ], …. // (個々のデータ2か3次元) \\ + … \\ + end// (リストの終わり) \\ + start// (次のリストの始まり) \\ +… \\ + end// \\ + 変数名// \\ + start// \\ + … \\ + end// \\ + +の形式のテキストファイル。 + +\hypertarget{readcsv}{} +\item[関数]Readcsv(path,filename,option) +\item[機能]csvファイルを読む。 +\item[説明]csvファイルを読みこむ。戻り値は読み込んだデータのリスト。 + +第1引数の path は,ファイルを作業フォルダ( 初期設定は fig )に置いた場合は省略することができる。そうでない場合は,フルパスで指定する。たとえば,"/Users/Hoge/Desktop" + +option は,"Flat=" で,"Flat=y" の場合は,読み込んだデータをリスト化したときに平滑化(1次元のリスト)にする。 初期設定は "Flat=n" + +【例】次のようなCSVファイル sample.csvを読み込むとする。 + +\begin{verbatim} +12,14,15,18,13 +9,13,17,21 +\end{verbatim} + +つまり,2行分のデータである。 + +\begin{verbatim} +data=Readcsv("sample.csv"); +\end{verbatim} + +とすると, +\begin{verbatim} +data=[[12,14,15,18,13],[9,13,17,21]] +\end{verbatim} + +となる。 + +したがって,1行目のデータだけ取り出したい場合は + +\begin{verbatim} +dt1=data_1; +\end{verbatim} + +とする。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{readlines}{} +\item[関数]Readlines(path,filename,option) +\item[機能]テキストファイルを1行ずつ読む。 +\item[説明]テキストファイルを1行ずつ読みこむ。戻り値は読み込んだ文字列のリスト。 + +第1引数の path は,ファイルを作業フォルダ( 初期設定は fig )に置いた場合は省略することができる。そうでない場合は,フルパスで指定する。たとえば,"/Users/Hoge/Desktop" + +\vspace{\baselineskip} +\hypertarget{writeoutdata}{} +\item[関数]WriteOutData(ファイル名,PDリスト) +\item[機能]外部データに書き出す +\item[説明]プロットデータをKeTCindy形式のデータファイルに書き出す。出力先の 初期設定は作業フォルダ。 + +【例】 放物線と円のプロットデータを書き出す。 + +\begin{verbatim} + Plotdata("1", "x^2","x"); + Circledata("1",[[0,0],[1,0]]); + WriteOutData("figdata.txt",["gr1",gr1,"cr1",cr1]); +\end{verbatim} + +書き出されたファイルの中身は次のようになっている。 + +\begin{verbatim} +gr1// +start// +[[-2.68843,7.22765],[-2.51807,6.34067],・・,[-2.00698,4.02798]]// +[[-1.83662,3.37318],[-1.66626,2.77642],・・,[-1.15518,1.33443]]// + 以下,同様にプロットデータが続く +[[5.82965,33.98479]]// +end// +cr1// +start// +[[1,0],[0.99211,0.12533],[0.96858,0.24869],・・,[0.80902,0.58779]]// + 以下,同様にプロットデータが続く +[[0.87631,-0.48175],[0.92978,-0.36812],・・,[1,0]]// +end//// +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{extractdata}{} +\item[関数]Extractdata(データ名,属性) +\item[機能]ReadOutData() で読み込んだデータに属性をつける。 +\item[説明]ReadOutData() で読み込んだデータには,線種などの属性がついていないので,そのままでは表示されない。そこで,この関数により属性をつけて表示する。 +\begin{verbatim} +ReadOutData("figdata.txt"); +Extractdata("gr1",["da"]); +\end{verbatim} + +\end{description} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\newpage +% ======== 計算 ======================= +\subsection{計算} + +\begin{description} + +\hypertarget{derivative}{} +\item[関数]Derivative(関数式 , 変数 , 値) +\item[機能]関数の微分係数を求める +\item[説明]関数式で与えられた関数の,「変数=値」における微分係数を求める。 + +値は,点の座標を用いることができる。点Aのx座標であれば, A.x とする。 + +\vspace{\baselineskip} +【例】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} +%\vspace{\baselineskip} +\begin{center} \input{Fig/derivative} \end{center} +%\vspace{\baselineskip} + + +なお,曲線のプロットデータを用いて,微分係数を求めることもできる。 + +書式は,Derivative(PD ,値) で,次のように使う。(上の例と同じ図ができる) + +\begin{verbatim} + Deffun("f(x)",["regional(y)","y=x^3-4*x","y"]); + Plotdata("1","f(x)","x",["Num=200"]); + coef=Derivative("gr1","x="+A.x); + A.y=f(A.x); + B.y=coef*(B.x-A.x)+A.y; + Lineplot([A,B]); + Letter([A,"ne","A"]); +\end{verbatim} + +また,曲線の接線については,\hyperlink{tangentplot}{Tangentplot}も参照されたい。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{integrate}{} +\item[関数]integrate(関数式 , 変数$=$範囲 , options) +\item[関数]integrate(PD , 範囲 , options) +\item[機能]関数式またはプロットデータで与えられた関数(データ)の数値積分の値を求める。 +\item[説明]optionsは次の通り。 + +"Rule=s":シンプソン法による。 初期設定は大島ベジェ公式。 + +"Num=数値":分割数の指定。初期値は 100 + +\vspace{\baselineskip} +【例】$f(x)=x^3-2x^2+2$ について,0から3までの定積分の値を求める。 +\begin{verbatim} +f(x):=x^3-2*x^2+2; +val=Integrate("f(x)","x=[0,3]"); + println(val);//8.25が表示される +\end{verbatim} + +\vspace{\baselineskip} +【例】上の例と同じ関数をプロットデータで指定する。 +\begin{verbatim} +plotdata("1","x^3-2*x^2+2","x"); +println(Integrate("gr1",[0,3])); +\end{verbatim} + +数値積分ではなく,数式処理として定積分の値を求める場合は,Maxima を利用する。\hyperlink{calcbyM}{CalcbyM} +を参照。 + +\vspace{\baselineskip} +\hypertarget{inversefun}{} +\item[関数]Inversefun(関数 , 範囲 , 値) +\item[機能]関数の逆関数値を求める +\item[説明]関数は文字列で,関数式もしくは定義された関数名とする。\\ +指定された範囲の中で逆関数値を求める。存在しない場合は一方の端点を戻り値とし,コンソールに「not found」と表示される。 + +数式処理ではなく数値探索のアルゴリズムを使っているので,単調関数でない場合は範囲をできるだけ狭くとるとよい。値が複数ある場合は,小さいほうが返される。 + + +\vspace{\baselineskip} +【例】\verb|x=Inversefun("sin(x)","x=[0,pi/2]",0.5);| + +実行すると $x=0.5236$ となる。 +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +%\newpage +%==========値の取得と入出力========================= +\subsection{値の取得と入出力} + +計算値やプロットデータの値を取得したり,R用とのデータのやりとりをする。 + +\begin{description} + +\hypertarget{asin}{} +\item[関数]Asin(実数),Acos(実数) +\item[機能]逆三角関数の値を求める。 +\item[説明]CindyScriptの組み込み関数に,arcsin(x),arccos(x) があるが,xの絶対値が1より大きい場合は虚数を返す。このことがRではエラーになるので,計算誤差により1よりわずかに大きくなる場合のために用意した関数。 + +\vspace{\baselineskip} +\hypertarget{sqr}{} +\item[関数]Sqr(実数) +\item[機能]平方根を求める。 +\item[説明]CindyScriptの組み込み関数に,sqrt(x) があるが,xが負の場合は虚数を返す。これに対し,xが負の場合は0を返すようにした関数。計算誤差により1よりわずかに大きくなる場合のために用意した。 + +\vspace{\baselineskip} +\hypertarget{bbdata}{} +\item[関数]BBdata(ファイル名,option) +\item[機能]画像ファイルのサイズを求める +\item[説明]TeX文書において,inputgraphics コマンドで画像を貼り込むときのBBサイズを求める。 +TeX処理系の extractbb を用いて画像ファイルからBBデータを作り,テキストファイルとして作業ディレクトリに書き出す。これを読んで,コンソールに ingludegarphics のコマンドを書き出す。これをそのままコピーすればよい。 なお,bbの値は整数値ではなく,高精細の値を小数点以下2桁に四捨五入して示される。画像ファイルは,PDFに限らず,PNG,JPGなどでもよい。 + +optionは,幅または高さの指定。 + +"w=40mm" でwidth=40mm が,"h=40mm"で height=40mm が付加される。 + +\vspace{\baselineskip} +【例】 + +\vspace{\baselineskip} +\includegraphics[bb=0.00 0.00 562.03 124.01,width=10cm]{Fig/bbdata.pdf} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{cindyname}{} +\item[関数]Cindyname() +\item[機能]作図中のファイル名を取得する。 +\item[説明]たとえば,現在作図しているファイル名が 「polygon.cdy」のとき,"polygon" を返す。 + +\vspace{\baselineskip} +\hypertarget{crossprod}{} +\item[関数]Crossprod(リスト,リスト) +\item[機能]2つのベクトルの外積を求める。 +\item[説明]Cindyscriptの組み込み関数 cross(リスト,リスト)と同じ。 + +\vspace{\baselineskip} +【例】\verb|Crossprod([1,0,0],[1,1,1]);| + +結果は[0,-1,1]\\ + +\vspace{\baselineskip} +\hypertarget{dotprod}{} +\item[関数]Dotprod(リスト,リスト) +\item[機能]2つのベクトルの内積を求める。 +\item[説明]Cindyscriptでは,積の演算で内積が求められる。 + +\vspace{\baselineskip} +【例】\verb|Dotprod([1,2,3],[1,-1,1]);| + +結果は2 + +[1,2,3]*[1,-1,1] でも同じ結果を得る。 + +\vspace{\baselineskip} +\hypertarget{findarea}{} +\item[関数]Findarea(プロットデータ) +\item[機能]プロットデータで囲まれる部分の面積を求める。 +\item[説明]閉曲線をなすプロットデータで囲まれる部分の面積を求める。大島のベジェ公式を用いている。 + +\vspace{\baselineskip} +【例】楕円の面積を求めて表示する。 +\begin{verbatim} +Paramplot("1","[3*cos(t),2*sin(t)]","t=[0,2*pi]"); +area=Findarea("gp1"); +println(Sprintf(area,6)); +\end{verbatim} + +コンソールに面積 18.849536 が表示される。 + +\vspace{\baselineskip} +\hypertarget{findlength}{} +\item[関数]Findlength(プロットデータ) +\item[機能]プロットデータの曲線の長さを求める。 +\item[説明]プロットデータが描く曲線の長さを求める。大島のベジェ公式を用いている。 + +\vspace{\baselineskip} +【例】円周の長さを求めて表示する。 +\begin{verbatim} +Circledata("1",[[0,0],[2,0]]); +len=Findlength("cr1"); +println(Sprintf(len,6)); +\end{verbatim} + +コンソールに 12.558097 が表示される。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +\newpage +%==============作表===================== +\subsection{作表} + +\begin{description} + +\hypertarget{tabledata}{} +\item[関数]Tabledata(横データ,縦データ, 除外線 , options) +\item[機能]表の枠を作成し,表のデータlist を返す +\item[説明]Cinderellaの描画面上に左下を原点とする表を作成する。 + +除外線がない場合は空リストを指定する。(必須) + +optionsのうち,Tabledataに特有なものは\\ +\hspace*{3zw}ラベルのスキップ幅,''Setwindow=n'',''Geo=n'',''Move=[0,0]''\\ +である。 + +"Setwindow=n" をつけると,NE,SWによる出力領域指定が有効になり,NE,SWをドラッグして出力領域を変更できる。(初期状態は,表の右上と左下)つけない場合は,表の部分だけが出力される。 + +縦横データは,次のように,間隔の幅で与える。ただし,幅はCinderellaの描画面の0.1を単位とする。 + +\begin{verbatim} +Yoko=[20,20,20,20]; +Tate=[10,10,10,10,10]; +Tabledata(Yoko,Tate,[]); + \end{verbatim} + + + +"Geo=y"とすると,作成された表には,行,列の制御点がつく。画面上では,横罫線の番号 r0,r1,・・・縦罫線の番号 c0,c1,・・・と見ることもできる。また,縦幅,横幅が数字で示される。ただし,これらは\TeX には出力されない。 +また,作表はCinderellaの描画面上では座標平面上に置かれるが,\TeX への出力は座標平面上には置かないことが多いので,座標軸は非表示としている。 + +\hspace{25mm} 描画面 \hspace{45mm} TeX + +\hspace{5mm}\includegraphics[bb=0 0 403.52 249.51 , width=5cm]{Fig/table01.pdf} \hspace{10mm}\input{Fig/table02} \\ + + +"Geo=y"の場合は,表のサイズ・行幅・列幅は,作成後にそれぞれの制御点をドラッグすることにより任意に変えることができる。 + +\vspace{\baselineskip} +除外線は,除外するセルの罫線を,rとc で位置指定する。 + +\hspace{10mm} 横罫線の場合,横罫線の番号,範囲(から,まで) + +\hspace{10mm} 縦罫線の場合,縦罫線の番号,範囲(から,まで) + +とする。 + +ラベルのスキップ値は,いくつおきにラベルをつけるかの設定である。0とするとラベルが表示されない。ただし,ラベルはCinderellaの画面上だけの問題。 + +\vspace{\baselineskip}"Move=点の座標"とすると,指定された点が左下になるように平行移動される。 + + +\vspace{\baselineskip} +【例】4つの罫線を非表示にする +\begin{verbatim} +Rmv=["r1c0c1","c3r0r1","c3r3r5","r4c2c4"]; +Yoko=[20,20,20,20]; +Tate=[10,10,10,10,10]; +Tabledata(Yoko,Tate,Rmv); +\end{verbatim} + +で,次の表ができる。 + +\vspace{\baselineskip} +\hspace{20mm}\includegraphics[bb=0 0 392.02 251.51 , width=6cm]{Fig/table03.pdf} + +\vspace{\baselineskip} +<補足> + +"Geo=y"の場合,制御点r0,r1,・・・,c0,c1,・・・がなければ新しく作り,すでに存在する場合はそのままとする。したがって,一度表を作成したのち,行数・列数を修正して作り直す場合は,一度既存の点を消去する必要がある。そのためには,「すべての点を選択する」ツールをクリックして点を消去するのがよい。クリックすると,消去後すぐに新規作成される。(誤って「すべての要素を選択する」を選ばないこと) + +他の点が描画されている場合は,表の部分だけドラッグで選択するか,表示メニューの「式による表示」で一覧表を出して,制御点を選択して消去する。 + +\vspace{\baselineskip} +"Geo=n"(デフォルト)の場合,幾何点を生成しない。幾何点を作成しないメリットは,スクリプトだけで全体の縦横幅を変更できること。デメリットはインタラクティブな微調整ができないこと。 + +\vspace{\baselineskip} +【例】1つおきにスキップして,r1,r3,c1,c2 を非表示とする。 +\begin{verbatim} +Yoko=[20,20,20,20]; +Tate=[10,10,10,10,10]; +Tabledatalight(Yoko,Tate,[],[2]); +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{changetablestyle}{} +\item[関数]Changetablestyle(罫線リスト, 変更オプション) +\item[機能]Table の罫線の描画オプションを変更 +\item[説明]罫線の部分的に指定して描画オプションを変更できる。 + +\vspace{\baselineskip} +【例】 + +\verb|Tabledatalight([10,20,10,20],[10,10,10],[]);|\\ +\verb|Changetablestyle(["r1c0c4"],["da"]);|\\ +\verb|Changetablestyle(["r2c0c2","c1r0r3"],["nodisp"]);| + +\vspace{\baselineskip} +\hspace{20mm}\includegraphics[bb=0.00 0.00 324.00 174.00,width=50mm]{Fig/changetable.pdf} + +\vspace{\baselineskip} +複数の表を描くこともできる。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{findcell}{} +\item[関数]Findcell(列番号, 行番号) +\item[機能]セルの情報list(中心,横幅/2,縦幅/2)を返す +\item[説明]列番号,行番号は左上のセルを1列1行として数える。 + +\vspace{\baselineskip} +【例】\verb|Tabledata(Tate,Yoko,[]);| + +\verb|println(Findcell(2,1));| + +とすると,2列1行のセルの中心の座標と横幅の半分,縦幅の半分の値がリストとしてコンソールに表示される。 + +\vspace{\baselineskip} +\hypertarget{putcell}{} +\item[関数]Putcell (列番号, 行番号, 位置, 文字データ) +\item[機能]セルに文字列を入れる +\item[説明]複数のセルにまたぐ位置指定の場合,列番号,行番号は,セル左上と右下の制御点の名称で指定する。 + +位置はc, r, l, t, b (中央center , 右right , 左left , 上top , 下bottom ) + +位置の例を以下に示す。 +\begin{verbatim} +yoko=[20,20,20,20,20]; +tate=[20,20]; +Tabledata(yoko,tate,["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} +\vspace{\baselineskip} +\begin{center} \input{Fig/putcell} \end{center} + +※数式の場合は,{\bf Putcellexpr} を用いる。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{putcol}{} +\item[関数]Putcol (列番号, 文字位置,文字列リスト) +\item[機能]1列に順に文字を書き入れる +\item[説明]列番号で指定した列に,第1行から順に文字列リストの文字を書き入れる\\ +数の場合はダブルクォートでくくらなくてもよい。 + +セルを飛ばす場合は,ヌル文字列 "" を書く。 + +\vspace{\baselineskip} +\hypertarget{putcolexpr}{} +\item[関数]Putcolexpr (列番号, 文字位置,文字列リスト) +\item[機能]1列に順に文字を書き入れる +\item[説明]文字列に\TeX 書式を使うことができる + +\vspace{\baselineskip} +\hypertarget{putrow}{} +\item[関数]Putrow (行番号, 文字位置,文字列リスト) +\item[機能]1行に順に文字を書き入れる +\item[説明]行番号で指定した行に,第1列から順に文字列リストの文字を書き入れる。 + + +\vspace{\baselineskip} +\hypertarget{putrowexpr}{} +\item[関数]Putrowexpr (行番号, 文字位置,文字列リスト) +\item[機能]1行に順に文字を書き入れる +\item[説明]文字列に\TeX 書式を使うことができる + +文字を入れる例を示す。 +\begin{verbatim} +Tate=[20,20,20,20,20]; +Yoko=[15,15,15]; +Tabledata(Tate,Yoko,["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} + \vspace{\baselineskip} +\begin{center} \input{Fig/putcol} \end{center} + +※ r0,c0,・・は画面に表示される番号。 + +グラフや文を入れた表の作成例 + +Putcolexpr(),Putrowexpr() では,数式だけでなく,一般の\TeX の文を入れることができる。 +また,グラフの位置を適当に合わせて描画することにより,表のセルの中にグラフを入れることができる。 + +\vspace{\baselineskip} +【例】2次関数のグラフと2次方程式の判別式の関係 + +セルの中にグラフを描く例。実際には,セルの位置にグラフを描く。 + +x軸を描くための点A〜Fは作図ツールでとっておく。 + +スクリプトを実行して表ができたら,制御点をドラッグしてサイズを調整し,点A〜Fもドラッグして軸と放物線の共有状況を示すようにする。 + +\vspace{\baselineskip} +\begin{verbatim} +Tate=[40,40,40]; +Yoko=[20,20,20]; +Tabledata(Tate,Yoko,[],["dr,2"]); +Changetablestyle(["r1c0c3"],["dr"]); +Changetablestyle(["r2c0c3"],["da"]); +Plotdata("1","(x-2)^2+0.5","x=[0.5,3.5]"); +Plotdata("2","(x-6)^2+1","x=[4.5,7.5]"); +Plotdata("3","(x-10)^2+1.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点で交わる","接する","共有点なし"]); +\end{verbatim} + +\vspace{\baselineskip} + \begin{center}\scalebox{0.9}{ \input{Fig/tablesample1}} \end{center} + + +\vspace{\baselineskip} +【例】増減表とグラフ + +関数の増減表とグラフを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} +\begin{center} \input{Fig/tablesample2} \end{center} + +\vspace{\baselineskip} +【例】凹凸を含めた増減表 +\begin{verbatim} +Tate=apply(1..8,20); +Yoko=[apply(1..4,10); +Tabledata(Tate,Yoko,[]); +Putrowexpr(1,c,["x","\cdots","-1","\cdots","0","\cdots","1","\cdots"]); +Putrowexpr(2,c,["y`","+","+","+","0","-","-","-"]); +Putrowexpr(3,c,["y``","+","0","-","-","-","0","+"]); +Putrowexpr(4,c,["y","\nelarrow","\frac{1}{\sqrt{e}}","\nerarrow", +"1","\serarrow","\frac{1}{\sqrt{e}}","\selarrow"]); +\end{verbatim} +\begin{center} \input{Fig/zogen3} \end{center} +%\vspace{\baselineskip} +ここで,凹凸を示す矢印は,ketpic.sty で定義されているものである。 + +nelarrow,nerarrow,selarrow,serarrow,NELarrow,NERarrow,SELarrow,SERrarrow がある。先頭の ne,se で北東・南東(右上・右下)次の r,l は回転の向き(r:right:反時計回り,l:left:時計回り)の矢印(arrow)と覚えるとよい。直線系の矢印は NEarrow,SEarrrow。 少しずつ違うので試されたい。 + +なお,これらの矢印はCindyTeXにはないので,Cinderellaの描画面には表示されない。 + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{tgrid}{} +\item[関数]Tgrid(セルラベル) +\item[機能]表のセルの座標を返す +\item[説明]指定されたセルの左上の座標を返す。実際には,セルラベルは罫線を示しているので,指定した罫線の交点(格子点)ということもできる。 + +\vspace{\baselineskip} +\hypertarget{tlistplot}{} +\item[関数]Tlistplot(セルラベル1,セルラベル2) +\item[機能]指定された2つの格子点を線分で結ぶ +\item[説明]セルに斜線を引くのに用いる。 + +\vspace{\baselineskip} +【例】\verb|Tlistplot(["c0r1","c1r2"]);| + +\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +%=================================================== +\subsection{その他} + +\begin{description} + +%\vspace{\baselineskip} +%\hypertarget{makeshell}{} +%\item[関数]Makeshell(ファイル名) / Makebat(ファイル名) +%\item[機能]Macの場合はシェルファイル,Windowsの場合はバッチファイルを書き出す。 +%\item[説明]書き出されるファイルについては,figいったんフォルダを空にしてから確かめられたい。 + +\hypertarget{assign}{} +\item[関数]Assign(文字列,文字,文字) +\item[機能]文字列の中のある文字を他の文字で置き換える +\item[説明]第1引数の文字列中の第2引数の文字を,第3引数の文字で置き換える。 + +第3引数が数値の場合,文字列に変換される。 + +第2引数と,第3引数をリストにして,複数の置き換えをすることができる。 + +\vspace{\baselineskip} +【例】\verb|a*x| を\verb|1.3*x| とした文字列を返す。次のいずれも同じ結果になる。 +\begin{verbatim} + Assign("x^2+a*x","a","1.3"); + Assign("x^2+a*x","a",1.3); +\end{verbatim} + +\vspace{\baselineskip} +【例】直線 $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} +%\vspace{\baselineskip} +\begin{center} \input{Fig/assign} \end{center} +\vspace{\baselineskip} +【例】文字で表された $x$ と $y$ の係数をまとめて数値で置き換える。 +\begin{verbatim} + Assign("a*x^2+b*x",["a",1,"b",2]); +\end{verbatim} + +%\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +% ===========commentedto com2th() ========== +\begin{comment} + +\vspace{\baselineskip} +\hypertarget{com0th}{} +\item[関数]Com0th(文字列) +\item[機能]RのOpenfileの前に置くコマンド(文字列)を定義する。 +\item[説明]【例】\verb|Com0th("Setax('a')");| + +Openfileの前の部分の先頭に書き出す。これにより, \ketcindy でサポートされていないR版\ketpic のコマンドを利用することができる。 + +\vspace{\baselineskip} +\hypertarget{com1st}{} +\item[関数]Com1st(文字列) +\item[機能]RのOpenfileの前に置くコマンド(文字列)を定義する。 +\item[説明]【例】\verb|Com1st("Setax('a')");|\\ +これにより, \ketcindy でサポートされていないR版\ketpic のコマンドを利用することができる。 + + +\vspace{\baselineskip} +\hypertarget{com2nd}{} +\item[関数]Com2nd(文字列) +\item[機能]RのOpenfileのあとに置くコマンド(文字列)を定義する。 + + +\vspace{\baselineskip} +\hypertarget{com2ndpre}{} +\item[関数]Com2ndpre(文字列) +\item[機能]RのOpenfileのあとに置くコマンド(文字列)を定義する。 + +Openfileの直後(グループの先頭に)書き出す。 +\end{comment} + +% =========== ここまで コメント化========== + +\hypertarget{colorcode}{} +\item[関数]Colorcode(種別1,種別2, カラーコード) +\item[機能]種別1から種別2へカラーコードを変換する。戻り値は変換されたコード。 +\item[説明]種別は,"rgb","cmyk","hsv"のいずれか。 + +\vspace{\baselineskip} +【例】変換例をいくつか示す。 + +RGBの[1,0,0]をCMYKに変換したコードをコンソールに表示する。 +\begin{verbatim} +col=Colorcode("rgb","cmyk",[1,0,0]); +println(col); +\end{verbatim} + +CMYKの[0,1,1,0]をRGBに変換したコードをコンソールに表示する。 + +\begin{verbatim} +col=Colorcode("cmyk","rgb",[0,1,1,0]); +println(col); +\end{verbatim} + +RGBの[1,0,0]をHSVに変換したコードをコンソールに表示する。 + +\begin{verbatim} +col=Colorcode("rgb","hsv",[1,0,0]); +println(col); +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{dqq}{} +\item[関数]Dqq(文字列) +\item[機能]文字列の前後に\verb|"|をつける。 +\begin{verbatim} +str="abc"; +str2=Dqq(str); +println([str,str2]); +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{factorial}{} +\item[関数]Factorial(n) +\item[機能]正の整数$n$の階乗を計算する。 + +\vspace{\baselineskip} +\hypertarget{norm}{} +\item[関数]Norm(ベクトル), Norm(ベクトル1, ベクトル2) +\item[機能]ベクトル(2つのベクトルの場合は差の大きさ)の大きさを計算する。 + +\vspace{\baselineskip} +\hypertarget{figpdf}{} +\item[関数]Figpdf(option) +\item[機能]出力枠サイズのPDFを作る。 +\item[説明]\ketcindy では,通常,出力された fig.tex ファイルを閲覧するPDFをA4サイズで作成する。これに対し,Figpdf()を実行すると,出力サイズのPDFを作成する。閲覧用だけではなくワープロなどにに貼り込むときにそのまま使用できる。ただし,そのための親子プロセスを生成して実行するため,次の手続き(1)(2)が必要となる。 + +\vspace{\baselineskip} +(1) Setparent(filename)で,出力するPDF用のファイル名を設定する。 + +(2) 出力は,「Parent」のボタンを押す。 + +\vspace{\baselineskip} +たとえば,fig.cdy で作図しているとき, +\begin{verbatim} +Setparent("pic"); +\end{verbatim} +とすると,fig.tex を表示した pic.pdf が作成される。pic.pdf が目的のPDF。 + +このファイル名は 作図しているCinderellaのファイル名,または Setfiles() で指定したファイル名とは異なるものにする。 + +optionは,マージン(余白)と平行移動量。指定しない場合は 初期設定値。 + +余白は,左右上下の順に4つの数をコンマで区切る。 + +平行移動量は,右方向,下方向をリストで与える。 + +余白指定と平行移動指定は同時に行うことができる。 + +\vspace{\baselineskip} +【例】余白の設定 +\begin{tabbing} +1234\=567890123456789012345678901234\=\kill + \> \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平行移動して表示 +\end{tabbing} + +なお,座標軸を表示する場合,右側は最低3mmの余白を設定しないと軸の文字が入らない。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{help}{} +\item[関数]Help(文字列) +\item[機能]関数の使用例を取得する +\item[説明]文字列で始まる関数の使用例をコンソールに表示する。 + +\hspace{10mm} \verb|println(Help("L"));| + +のようにすると,コンソールに,次のように「L」で始まる関数の使用例が表示される。 +\begin{verbatim} +Letter([C,"c","Graph of $f(x)$"]); +Letter([C,"c","xy"],["size->30"]); + 文字を書き込む +Letterrot(C,B-A,"AB"); +Letterrot(C,B-A,"t0n5","AB"); +Letterrot(C,B-A,0,5,"AB"); + 傾いた文字を書き込む + ・・・・ +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{helpkey}{} +\item[関数]Helpkey(文字列) +\item[機能]関数の使用例をキーワードで検索する +\item[説明]文字列に与えたキーワードで関数の使用例を検索し,コンソールに表示する。 + +\vspace{\baselineskip} +【例】\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]]); + ・・・・ +\end{verbatim} + +\vspace{\baselineskip} +\hypertarget{indexall}{} +\item[関数]Indexall(str1,str2); +\item[機能]文字列 str1 から str2 を検索しその位置をすべて返す +\item[説明]Cindyscriptの indexof() の拡張版。indexof() が最初に見つかった位置を返すのに対し,Indexall()は存在する位置をすべてリストにして返す。 + +\vspace{\baselineskip} +【例】str="abcabcabc" から "b"を検索する。 + +\verb|indexof(str,"b")| では,2 が返る。 + +\verb|Indexall(str,"b")| では,[2,5,8]が返る。 + +\vspace{\baselineskip} +\hypertarget{isptselected}{} +\item[関数]Isptselected(点名)または Ptselected(点名) +\item[機能]点が選択されていれば true,そうでなければ false を返す。 +\item[説明]点名はリストで与える。引数はなしにすることも可能で,その場合はすべての点が対象。 + +KeTCindyの関数の中には処理に時間がかかるものがある。その場合,点をドラッグするなど,画面上で操作をするとその都度再計算されるために,動きが非常に遅くなる。そこで,ドラッグする点をこの関数で指定すれば,ドラッグしている間は処理されないようにすることができる。 + +\vspace{\baselineskip} +【例】点Aを原点近くにとっておき,次のスクリプトを実行する。 + +\verb|Deffun("f(x)",["regional(y)","y=x^3-2*x","y"]);|\\ +\verb|Plotdata("1","f(x)","x",["Num=100"]);|\\ +\verb|Putoncurve("A","gr1");|\\ +\verb|coef=Derivative("f(x)","x",A.x);|\\ +\verb|Defvar(["coef",coef]);|\\ +\verb|Deffun("g(x)",["regional(y)","y=coef*(x-A.x)+A.y","y"]);|\\ +\verb|Plotdata("2","g(x)","x",["Num=1"]);|\\ +\verb|if(!Ptselected(A),|\\ +\verb|Enclosing("1",["gr2","Invert(gr1)"],[A,"nodisp"]);|\\ +\verb|Hatchdata("1",["i"],[["en1"]]);|\\ +\verb|);| + +\vspace{\baselineskip} +\hspace{5mm} 点Aをドラッグ中(選択状態)\hspace{5mm} 点A以外をクリックして選択状態を解除 + +\hspace{10mm}\includegraphics[bb=0.00 0.00 218.01 204.51,width=40mm]{Fig/ptselected01.pdf} +\hspace{10mm}\includegraphics[bb=0.00 0.00 219.01 204.51,width=40mm]{Fig/ptselected02.pdf} + +\vspace{\baselineskip} +\hypertarget{slider}{} +\item[関数]Slider(名称,位置1,位置2) +\item[機能]スライダを作成する +\item[説明]名称は "A-C-B" の形で,端点をA,B,スライダ点をCとしたスライダを作る。 + +端点A,Bの位置を,位置1,位置2で指定する。単に"C"としたときは端点をとらない。 +スライダにより取得したい値は,点Cの座標(たとえば C.x)を利用する。 + +点A,B,Cはあらかじめ作図しておく必要はない。既にある場合はその点を使う。 + +\vspace{\baselineskip} +【例】2つのスライダを用意し,$y=a\sin(x-b)$ のa,b を変化させる。 + +\verb|Slider("A-C-B",[-5,-2],[5,-2]);| // \verb|C| is movable.\\ +\verb|Slider("D-F-E",[-6,-2],[-6,2]);| // \verb|F| is movable.\\ +\verb|Plotdata("1",Assign("y=a*sin(x-b)",["a",F.y,"b",C.x]),"x"); | + +\vspace{2mm} +\hspace{15mm} +\includegraphics[bb=0.00 0.00 445.02 193.01,height=35mm]{Fig/slider.pdf} + +\vspace{\baselineskip} +\hypertarget{sprintf}{} +\item[関数]Sprintf(実数,長さ) +\item[機能]小数点以下の長さを固定した文字列に変換 +\item[説明]実数を,小数点n位までの数とした文字列に変換する + +\vspace{\baselineskip} +【例】円周率 + + Sprintf(pi,2) は 3.14 を返す + + Sprintf(pi,7) は 3.1415927 を返す + +注)pi は Cindyscriptの予約変数で,円周率を表す。%\vspace{\baselineskip} + +\vspace{\baselineskip} +\hypertarget{textformat}{} +\item[関数]Textformat(数,桁数) +\item[機能]小数点以下の桁数を指定して数を文字列化する。 +\item[説明]第1引数は数のリストでもよい。数のリストの場合は,戻り値は,対応する数値を指定係数にした後,リストを文字列化する。Cindyscriptの組み込み関数にも,format()という同様の関数があるが,format() は文字列のリストを返す。 + +\vspace{\baselineskip} +【例】円周率を小数点以下5位までで文字列化する。 + +\hspace{10mm} \verb|Textformat(pi,5);| +\hspace{10mm} \verb|format(pi,5);| + +戻り値は,いずれも \verb|"3.14159"| + +\vspace{\baselineskip} +【例】第1引数がリストのときの,format() との戻り値の違い。 + +\hspace{10mm} \verb|dt=[1/6,0.5];|\\ +\hspace{10mm} \verb|Textformat(dt,4); | // 戻り値は "[ 0.1667 , 0.5 ]" \\ +\hspace{10mm} \verb|format(dt,4); | // 戻り値は [ "0.1667" , "0.5" ] \\ + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{texcom}{} +\item[関数]Texcom(\TeX コード) +\item[機能]\TeX のコードを書き出す +\item[説明]任意の\TeX のコードを書き出す + +\vspace{\baselineskip} +\hypertarget{windispg}{} +\item[関数]Windispg()またはWindisp(データのリスト) +\item[機能]定義されているプロットデータをCinderella画面に黒線で描く +\item[説明]Windispg()は,スクリプトの最後に置くことで,出力される部分だけが黒で描かれるので,出力図を確認することができる。ただし,Letter()関数で表示した点の名称などがCinderellaで作図したラベルと重なって表示されて見にくくなることもある。この関数を実行しなくても出力には影響しない。 + +Windisp(データのリスト)は,Rから \ketcindy 用に出力されたファイルを ReadOutData()関数で読み込んだときに,必要なプロットデータ列だけを表示するのに用いる。 + +ReadOutData("filename.txt") でデータを読み込むと,そのデータに含まれるプロットデータ列が,コンソールに + +\hspace{10mm}Outdata of filename.txt : [Gfn,Gdfn,Gh] + +のように表示される。 + +このうち,GfnとGhだけを表示するのであれば + +\hspace{10mm}\verb|Windispg([Gfn,Gh]);| + +とする。引数なしで + +\hspace{10mm}\verb|Windispg();| + +とすればすべてのプロットデータ列が表示される。 + +なお,いずれの場合も,作図したプロットデータも同時に表示される。 + +作図した図を全てではなく選択して表示する場合は,それらのプロットデータ名をリストにして引数とする。 + +たとえば,sg1, gr1, crABが定義されているとき, + +\hspace{10mm}\verb|Windispg(["sg1","gr1"]);| + +とすれば,sg1,gr1のみが表示される。 + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{viewtex}{} +\item[関数]Viewtex() +\item[機能]\TeX のソースファイルを書き出す。引数なし。 +\item[説明]グローバル変数Fheadで定義したファイル名に "main" を付加した\TeX のソースファイルとバッチファイル(Macの場合はシェルファイル)を作成する。 + +\vspace{\baselineskip} +\hypertarget{workprocess}{} +\item[関数]Workprocess() +\item[機能]作図の経過を取得する +\item[説明]作図ツールを用いた作図の経過を取得する。 + +\verb|println(Workproccess());| + +とすると,コンソールに作図手順が表示される。 + +\vspace{\baselineskip} +\hypertarget{op}{} +\item[関数]Op(n,list or str) +\item[機能]リストまたは文字列から要素を抜き出す +\item[説明]第2引数のリストまたは文字列のn番目の要素(文字)を返す。 + +Cindyscriptの アンダーバーの演算子 (list\_n , str\_n) と同様。 + +\vspace{\baselineskip} +\hypertarget{strsplit}{} +\item[関数]Strsplit(文字列 , 文字) +\item[機能]文字列を分解する。 +\item[説明]第1引数の文字列を第2引数の文字の位置で分解したリストを返す。 + +\vspace{\baselineskip} +【例】文字aで区切って分解する。 + +\verb|str="abcadeaf";| \\ +\verb|strL=Strsplit(str,"a"); |//[” ”,”bc”,”de”,”f”] を返す。 + +同様の関数に,Cindyscriptの tokenize(文字列,文字列)がある。tokenize() の第2引数は文字列や,文字のリストでもよい。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{fracform}{} +\item[関数]Fracform(数 , 分母のリストまたは最大値) +\item[機能]分母リストの1つを分母とする近似分数と誤差を返す。 +\item[説明]戻り値は,簡易TeX-like書式の文字列と誤差。 + +\vspace{\baselineskip} +【例】\verb|Fracform(0.33,[2,3]); => fr(1,3)| + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{totexform}{} +\item[関数]Totexform(簡易TeX-like書式) +\item[機能]TeX書式の文字列を返す。 + +\vspace{\baselineskip} +【例】\verb|Totexform(fr(1,3)); => frac{1}{3}| + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{tocindyform}{} +\item[関数]Tocindyform(簡易TeX-like書式) +\item[機能]Cindy書式の文字列を返す。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +\newpage + +%第11節 他の数式処理ソフトとの連携============================= +\section{他の数式処理ソフトなどとの連携} +\subsection{Rとの連携} + +Rは主に統計解析のためのソフトウェアで,binorm(二項分布),pois(ポアソン),unif(一様分布),chisq(カイ2乗),f(F分布),t(t分布)など,多くの確率分布をサポートしている。 + +\ketcindy では,kc.bat/shによってコマンドをRに渡し,結果をテキストファイルで受け取る。このとき,Rとのやりとりで,次のようなファイルが作業ディレクトリに作成される。 + +拡張子 r :r用のファイル + +拡張子 dat,拡張子 txt:データファイル + +このデータのやり取りに関する次のオプションがある。 + +オプションなしまたは,”” のとき + +i) データファイルがなければ,新しく作る + +ii) データファイルが既にあればそれを読み込む + +"m"のとき,強制的にデータファイルを作り直す。 + +"r" のとき,すでにあるデータファイルを読み込む。 + +\vspace{\baselineskip} + +\begin{description} + +\hypertarget{boxplot}{} +\item[関数]Boxplot(名前,データ,垂直位置,箱の高さ,option) +\item[機能]箱ひげ図を描く +\item[説明]データは,リストで渡す場合とファイル名を渡してファイルから読み込む場合がある。データファイルは csv 形式とする。 + +\vspace{\baselineskip} +【例】乱数で作成した5未満の実数のデータを箱ひげ図にする。 + +\begin{verbatim} +dt1=apply(1..100,5*random()); +Boxplot("1",dt1,1,1/2); +\end{verbatim} +\vspace{\baselineskip} +\hspace{20mm} \input{Fig/boxplot01} + +\vspace{\baselineskip} +【例】外部ファイルとして用意したデータを読み込んで箱ひげ図にする。 +\begin{verbatim} +Boxplot("2","datafile.csv",3,1/2); +\end{verbatim} + +\vspace{\baselineskip} +複数列から成るcsvファイルを読み込むには,Readcsvを使う。csvファイルは,作業フォルダ( 初期設定は fig )に入れておく。戻り値は読み込んだファイル。 + +データの値を画面に入るように調節するには,dt1/20 のようにしてリサイズする。 + +また,Framedata(),Rulerscale() を併用することで目盛を入れることができる。Framedata() のために,表示領域の対角点A,BをCinderellaの作図ツールで作図しておく。 + +\begin{verbatim} +data=Readcsv("datafile.csv"); +dt1=apply(data,#_1); +dt2=apply(data,#_2); +Boxplot("1",dt1/20,1,1/2); +Boxplot("2",dt2/20,3,1/2); +Framedata("1",[A,B],["corner"]); +Rulerscale(A,["r",0,6,1],["f",1,"\mbox{dt1}",3,"\mbox{dt2}"]); +\end{verbatim} +%\vspace{\baselineskip} + \begin{center} \input{Fig/boxplot} \end{center} + +注)一度実行した後,データを書き直すと,図が更新されないので,"m" オプションをつけて +Boxplot("1",dt1/20,1,1/2,["m"]); とすると,図が更新される。データを書き出すときは,もう一度 "m" オプションをはずして実行してから Figure ボタンを押す。これは,データの作成タイミングの関係。 + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{rfun}{} +\item[関数]Rfun(name,コマンド, 引数, option) +\item[機能]Rの1つのコマンドを実行して結果を返す +\item[説明]バッチファイル kc.bat / シェルファイル kc.sh を利用してRとデータをやり取りし,計算結果を取得する。結果は,変数 R+name に入り,コンソールにも表示される。 + +\vspace{\baselineskip} +【例】Rを用いて標準正規分布から10個の乱数を発生し,戻り値から平均値と標準偏差を求めてコンソールに表示する。 +\begin{verbatim} +Rfun("1","rnorm",[10]); +nx=length(R1); +mx=sum(R1)/nx; +sx=sqrt(R1*R1/nx-mx^2); +println("平均:"+format(mx,4)+"標準偏差:"+format(sx,4)); +\end{verbatim} + +\hypertarget{calcbyr}{} +\item[関数]CalcbyR(変数名,コマンド列,option) +\item[機能]Rのコマンドを実行して結果を返す +\item[説明]バッチファイル kc.bat / シェルファイル kc.sh を利用してRとデータをやり取りし,計算結果を取得する。 + +コマンド列は,"戻り値=コマンド",[引数] の2つをセットとして並べる。 + +最後の行の結果が戻り値として第1引数の変数名に代入される。"戻り値1::戻り値2・・",[]の形(戻り値1,戻り値2・・は各コマンドの戻り値)でコマンドを書くと,戻り値1,・・のリストとなる。戻り値が一つの場合は実数。"=値",[] の形の場合,「値」がそのまま戻り値となる。 + +\vspace{\baselineskip} +【例】Rを用いてN(50,$5^2$)から10個の乱数を発生し,平均と不偏分散もRで計算してその結果をコンソールに表示する。 +\begin{verbatim} +cmdL=[ +"tmp1=rnorm",[10,50,5], +"tmp2=mean",["tmp1"], +"tmp3=var",["tmp1"], +"tmp1::tmp2::tmp3",[] +]; +CalcbyR("rd",cmdL); +dt=rd_1; +mx=rd_2; +vx=rd_3; +println("データ:"+dt); +println("平均:"+format(mx,4)+"不偏分散:"+format(vx,4)); +\end{verbatim} +CalcbyR()によって,データと平均,不偏分散からなるリストが作成されるので,mxに平均,vxに不偏分散を代入している。\verb|rd_(-1)| は,リスト rd の末尾の要素。 + +\vspace{\baselineskip} +【例】Rでポアソン分布から200個の乱数をとり,標本平均の分布の様子=分散が小さくなって,正規分布に近づいている様子=をヒストグラムで見る。分散はRで求めた不偏分散に (n-1)/n をかけて再計算してコンソールに表示する。 +\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)); +n=length(dt); +mx=rd_1; +vx=rd_2*(n-1)/n; +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} +\vspace{\baselineskip} +\begin{center} \input{Fig/poison01} \end{center} +\vspace{\baselineskip} +【例】ポアソン分布で乱数を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()で読み込む。 +戻り値は,階級境界値と,対応する度数のリスト。 + +階級境界値(ブレークポイント)は,自動的に設定される(スタージェスの公式による)が,オプションで, + +\verb|"breaks=[0,10,20,30,40,50,60,70,80,90,100]"| + +などと指定することもできる。 + +この他のオプションは + +"Den=yes/no":密度の指定(初期値は no) + +"Rel=yes/no":相対度数にする/しない(初期値は no) + +\vspace{\baselineskip} +【例】csvファイル(datafile.csv)を読み込み,ヒストグラムを作る。Framedata() と Rulerscale()を併用して,目盛付きの枠の中に表示する。表示枠の対角点A,BはCinderellaの作図ツールで作図しておく。 +\begin{verbatim} +Addax(0); +Setscaling(5); +Setunitlen("0.6mm"); +data=Readcsv("datafile.csv"); +Histplot("1",data,[""]); +Framedata("1",[A,B],["corner"]); +Rulerscale(A,["r",0,100,10],["r",0,15,5]); +\end{verbatim} +\begin{center} \input{Fig/histgram} \end{center} + +2行目と3行目は,データに合わせて縦方向を5倍にし,TeXの単位長を0.6mmにしている。 + +Den,Rel オプションをyes にしたときは,Setscaling(100)くらいにするのがよい。 + +csvファイルが複数のデータからなる場合は, + +\verb|dt1=data_1;| +として,リストの第1要素を取得する。第2要素のヒストグラムであれば\verb|data_2| とする。 + +\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\hypertarget{plotdatar}{} +\item[関数]PlotdataR(name,式,変数) +\item[機能]Rの関数のグラフを描く +\item[説明]Cindyscriptの組み込み関数にはない関数のグラフをRを利用して描く。 + +\vspace{\baselineskip} +【例】平均5, 標準偏差2の正規分布の密度関数と分布関数のグラフを描く。 +\begin{verbatim} +PlotdataR(“1”, “dnorm(x,5,2)”, ”x=[0,10]”); +PlotdataR(“2”, ”pnorm(x,5,2)”, ”x=[0,10]”); +\end{verbatim} + +\hspace{20mm} \input{Fig/plotdatar1} + +【例】標準正規分布のグラフ上の点と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を動かしたあと再実行するとよい。 + +\vspace{\baselineskip} +【例】上と同様で,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} +\vspace{\baselineskip} +【例】前の例のグラフで,ABの左側にShadeをかけ,Shadeの部分の面積を求める。Pの値を表示する位置に,Cinderellaの作図ツールで点Cをとっておく。 +\begin{verbatim} +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"]); +Shade(["en1"],["Color=[0.2,0,0,0]"]); +tmp=0.5+Integrate("grR1",[0,A.x]); +Expr([A,"s",text(A.x),C,"e","P="+text(tmp)]); +\end{verbatim} + +\begin{center} \input{Fig/rshade} \end{center} + +\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{plotdiscr}{} +\item[関数]PlotdiscR(name,式,変数) +\item[機能]Rを利用して離散型のグラフを描く +\item[説明]dbinom (二項分布),dpois(ポアソン分布),dgeom(幾何分布)など離散型確率分布のグラフを描く。 + +\vspace{\baselineskip} +【例】二項分布のグラフと正規分布のグラフを比較する。 +\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} +\vspace{\baselineskip} +\begin{center} \scalebox{0.9}{\input{Fig/binvsnormal}} \end{center} + +【例】ポアソン分布および幾何分布のグラフ。 +\begin{verbatim} +PlotdiscR("2","dpois(k,4)","k=[0,10]"); +PlotdiscR("3","dgeom(k,0.3)","k=[0,10]"); +\end{verbatim} +%\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{scatterplot}{} +\item[関数]Scatterplot(name,filename/datalist,option1,option2) +\item[機能]2次元データを読み込み,散布図を描く +\item[説明]外部ファイル filename(csv形式)を読み,散布図を描く。 + +外部ファイルの2次元データとは,次の形のcsvファイル。(行末はLFまたはCR) +\begin{verbatim} + 2.3, 4.5 (LF) + 3.2, 7 (LF) + 2.0, 6.8 (LF) +\end{verbatim} + + +datalistの場合は,次の形。 + +\begin{verbatim} + data=[[2.3,4.5],[3.2,7],[2.0,6.8], ・・・ ]; +\end{verbatim} + + +第1オプションは,回帰直線を描くかどうかと点のスタイル。 + +"Reg=no" : 回帰直線を描くかどうか(yes/no) 初期値は yes + +第2オプションは,相関係数と回帰直線の式を表示する位置と,回帰直線のスタイル。 + +位置は,幾何点の名称でもよい。 + +\vspace{\baselineskip} +【例】data.csv を読んで散布図を描き,回帰直線を引く。 +\begin{verbatim} +Scatterplot("1","data.csv"); +\end{verbatim} + +だけで描ける。オプションをつけた例は次。 + +点Aを相関係数と回帰直線の式を表示する点としてCinderellaの作図ツールで取る。 + +点を青で大きさ2とし,回帰直線を緑で表示する。 + +\begin{verbatim} +Scatterplot("1","data.csv",["Size=4","Color=blue"],[A,"Color=green"]); +Listplot("1",[[0,7],[0,0],[7,0]]); +Rulerscale([0,0],["r",0,7,1],["r",1,7,1]); +\end{verbatim} + +\vspace{\baselineskip} + \begin{center} \input{Fig/scatter} \end{center} + +\end{description} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +%\newpage + +%Maximaとの連携================================== +\subsection{Maximaとの連携} +Maximaは数式処理ソフトで,\ketcindy においては微積分の計算など,Cindyscriptでは不十分な点を補うことができる。 + +\ketcindy では,kc.bat/shによってコマンドをMaximaに渡し,結果をテキストファイルで受け取る。このとき,Maximaとのやりとりで,次のようなファイルが作業ディレクトリに作成される。 + +拡張子 max :Maximaに渡すコマンドを記述したファイル + +拡張子 txt:Maximaが出力したデータファイル + +このデータのやり取りに関する次のオプションがある。 + +オプションなしまたは,”” のとき + +i) データファイルがなければ,新しく作る + +ii) データファイルが既にあればそれを読み込む + +"m"のとき,強制的にデータファイルを作り直す。 + +"r" のとき,すでにあるデータファイルを読み込む。 + +このとき,ファイルの読み書きで不具合があると,数秒の後「==$>$ file.txt not generated (5 s ) 」のようなエラーメッセージがコンソールに表示される。このような場合は作業ディレクトリの設定などを確認していただきたい。この待ち時間については,Waitオプションで設定することもできる。 + +\begin{description} + +\hypertarget{calcbyM}{} +\item[関数]CalcbyM(name,コマンド,option) +\item[機能]Maximaのスクリプトを実行する +\item[説明]第2引数はMaximaで実行するコマンドを記述したスクリプト。 + +コマンドと引数リストの繰り返しからなるスクリプトをリストとして作り,一度に実行する。 + +戻り値はない(未定義値)。実行結果は,コマンドリストの最後に記述した変数(引数は空リスト)の値が,name で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにしてnameに代入される。 + +\vspace{\baselineskip} +【例】$\sin x$ とその導関数を表示する。 +\begin{verbatim} +cmdL=[ + "f:sin(x)", [], + "df:diff",["sin(x)","x"], + "f::df",[] +]; +CalcbyM("fdf",cmdL); +println(fdf); +\end{verbatim} +\vspace{\baselineskip} +実行すると,結果の f とdf のリストが変数 fdf に代入され,コンソールに,\verb|[sin(x),cos(x)]| と表示される。 + +\vspace{\baselineskip} +【例】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} +コンソールには + +\verb|ans=[x = -(sqrt(17)-1)/2,x = (sqrt(17)+1)/2] | + +が表示される。 + +\vspace{\baselineskip} +{\bf 応用例1:曲線の接線を引く} + +\vspace{\baselineskip} +$f(x)=\dfrac{e^x+e^{-x}}{2}$ の,$x=a$における接線の方程式を作る。 + +\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} +が表示される。\\ +この,CalcbyMの戻り値 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でプロットできる式にしている。 + +\vspace{\baselineskip} +\begin{center} \input{Fig/maxfun01} \end{center} +\vspace{\baselineskip} +なお,接線の方程式を求めるだけであれば,Mxfun()を使うこともできる。Mxfun()の解説を参照のこと。 + +\vspace{\baselineskip} +{\bf 応用例2:パラメトリックの場合の接線} + +\vspace{\baselineskip} +媒介変数の値を決めるために,点AをCinderellaの描画面のx軸上にとっておき,その$x$座標を媒介変数$t$の値とする。スライダを作ってもよい。\\ + +\begin{layer}{150}{0} +\putnotese{60}{10}{ \input{Fig/maxfun02}} +\end{layer} +\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} + +cmdLで定義しているMaximaのコマンド(trigsimp など)については,Maximaの解説書などを参照されたい。 + +\vspace{\baselineskip} +【例】定積分の値を求める。 + +\vspace{\baselineskip} +$\displaystyle \int _{-1} ^2 (-x^3+3x+2)dx$ の値を求める。結果は val で受け取り,Mxtex() に渡して,TeX書式にして表示する。 + +\begin{verbatim} +cmdL=[ + "val:integrate",["-x^3+3*x+2,x,-1,2"], + "val",[] +]; +CalcbyM("val",cmdL); +Mxtex("1",val); +Expr([[2,2],"e","S="+tx1]); +\end{verbatim} + + +\vspace{\baselineskip} +\hypertarget{mxbatch}{} +\item[関数]Mxbatch(ファイル名) +\item[機能]Maximaのライブラリを使うバッチファイルを作成 +\item[説明]ketcindy/ketlib/maximaL にあるライブラリを用いるコマンドでバッチファイルを作成する。 + +ketcindy/ketlib/maximaL には,fourier\_sec.max , matoperation.max , poincare.mac の3つのファイルがあり,関数を定義したライブラリが入っている。それぞれ次のような内容である。各ファイルをテキストエディタで開いて参照されたい。 + +fourier\_sec.max :フーリエ級数の計算を行う。 + +matoperation.max : 行列の計算を行う。 + +poincare : ハミルトニアンシステムに関する計算を行う。 + + +\vspace{\baselineskip} +【例】\verb|cmd=Mxbatch("fourier_sec")| + +を実行すると,cmdに,たとえば + +\verb|[batch,["/Applications/ketcindy/ketlib/maximaL/fourier_sec.max"]] | + +が代入される。(Mac/Windows および KeTCindyの設定によって異なる) + +そこで,次のように利用する。 + +\begin{verbatim} +Setax(["a"]); +Slider("A-C-B",[-5.5,-1.5],[4.5,-1.5]); +defL=["1",[-3,-2],1,"0",[-2,-1],1,"-x",[-1,1],1,"0",[1,2],1,"-1",[2,3],1]; +Drwxy(); +tmp=Periodfun(defL,1,["dr,2","Color=red"]); +fun=tmp_1; +per=tmp_2; +Htickmark([1,"n","1",2,"n","2",3,"nw","3"]); +Htickmark([-1,"-1",-2,"-2",-3,"-3"]); +cmdL=Concat(Mxbatch("fourier_sec"),[ + "Ffun(x):="+fun,[], + "c:fourier_sec_coeff",["Ffun(x)","x"], + "c[1]::c[2]::c[3]",[] +]); +CalcbyM("ans",cmdL,[]); +nterm=round(4*(C.x-A.x)); +Fourierseries("1",ans,per,nterm,["Num=400"]); +Mxtex("2",ans_3); +Expr([[-5,-2],"e","s_n="+tx2,[4,-2],"e","n="+text(nterm)]); +\end{verbatim} + +\hspace{10mm}\input{Fig/mxbatch} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{15mm} +\hypertarget{mxfun}{} +\item[関数]Mxfun(name,式,リスト,option) +\item[機能]Maximaの関数を実行する +\item[説明]第2引数の「式」はMaximaの関数名。第3引数のリストは関数に渡す引数のリスト。 + +戻り値は,第1引数の式に1つでも文字があると文字列となる。すべて数字(+,-, . を含む)の場合は +16桁以下であれば数,それ以上の場合は文字列となる。また,戻り値は,変数 mx+name にも代入される。 + +オプションに "Disp=no" をつけると,結果をコンソールに表示しない。 + +\vspace{\baselineskip} +【例】$10!$を求める。 + +\verb| Mxfun("1","10!",[]);| + +を実行すると,コンソールにmx1 is 3628800 と表示される。この値は変数 mx1 に代入されているので, + +\verb| Letter([[0,1],"e",mx1]);| + +とすればCinderellaの描画面上に表示される。mx1ではなく,戻り値を変数に代入して使うこともできる。 + +\begin{verbatim} +fact10=Mxfun("1","10!",[]); +Letter([[0,1],"e",fact10]); +\end{verbatim} + +\vspace{\baselineskip} +【例】文字列の連結 + +文字列を引数とする場合,例えば,Maximaの文字列を連結するコマンドconcatでは, + +\verb| concat("a","b")| + +とするが,中にダブルクォートが入っているため,全体を文字列にすることができない。 + +このような場合は,第2引数を使って + +\verb| Mxfun("1","concat",["a","b"])| + +とすればよい。 + +\vspace{\baselineskip} +<参考> CindyScript の unicode(code) 関数を用いてダブルクォートを表し,次のようにすることもできる。 + +\begin{verbatim} +dq=unicode("22"); +comm="concat("+dq+"a"+dq+","+dq+"b"+dq+")"; +Mxfun("1",comm,[]); +\end{verbatim} + +\vspace{\baselineskip} +【例】$f(x)=\sin x$ を微分する + +\verb| Mxfun("1", "diff",["sin(x)","x"])| + +とすると + +\verb| diff(sin(x),x)| + +というコマンドをMaximaに渡して,戻り値をCindyの変数mx1に代入する。 + +\verb| Mxfun("1", "diff(sin(x),x)",[]])| + +と,第1引数にまとめても同じ結果になる。ただし,この場合,第2引数は空リストとする。 + +\vspace{\baselineskip} +{\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は文字列であるので,\verb|Plotdata("1",mx1,"x")| でグラフが描ける。 + +また,Cindyscriptの微分では,3階か4階までの導関数が計算上の限度であるのに対し,Maximaなら何階でも微分ができるので,テイラー展開などで有利である。 + +\vspace{\baselineskip} +【例】$\sin x$ の テイラー展開による近似のグラフを表示する。 +\begin{verbatim} +Mxfun("1","taylor",["sin(x)","x",0,7],[""]); +Plotdata("1","sin(x)","x",["da"]); +Plotdata("2",mx1,"x"); +\end{verbatim} +\vspace{\baselineskip} +\begin{center} \input{Fig/taylor} \end{center} +\vspace{\baselineskip} +なお,Mxtex() を用いれば,Mxfun()の結果の mx1をTeX書式にして表示できる。 + +\verb| Expr([[1,2],"e",Mxtex("1",mx1)]);| + +を追加すれば[1,2]の位置に式が表示される。 + +\vspace{\baselineskip} +【例】接線の方程式を作る + +\vspace{\baselineskip} +$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} +が表示される。 + +同様の例を CalcbyM() で例示しているので参照されたい。 + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +\hypertarget{mxtex}{} +\item[関数]Mxtex(name,式) +\item[機能]式をTeX書式にする +\item[説明]第2引数の式は,直接書いた式もしくはMxfunの戻り値。これをTeXの書式にする。 + +戻り値は,変数 txname にも代入される。 + +\vspace{\baselineskip} +【例】部分分数への分解 +\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の描画面では次のように表示される。 + +\vspace{\baselineskip} +\hspace{20mm} \includegraphics[bb=0 0 347.02 116.01 , width=8cm]{Fig/mxtex01.pdf} + +\vspace{\baselineskip} +出力したTeX挿入図では次のようになる。 + +%\vspace{\baselineskip} +\input{Fig/mxtex02} + +なお,文字列を置換するのに,\verb|Assign(form,["frac","dfrac"])| ではなく, + +Cindyscriptの文字列の関数 replace を用いて, + +\hspace{10mm} \verb|dform=replace(form,"frac","dfrac");| + +としてもよい。 + +%\vspace{10mm} + +\vspace{\baselineskip} +【例】2次関数のグラフを表示し,$x$軸との交点の$x$座標を表示する。 + +\begin{layer}{150}{0} +\putnotese{60}{05}{ \input{Fig/mxtex03}} +\end{layer} + +\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} + +ここで,\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とのデータのやり取りをするためのタイムラグがあるが,インタラクティブに放物線の位置を変えることができる。 + +\vspace{\baselineskip} +<参考> + +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 + + +%Risa/Asirとの連携================================== +\subsection{Risa/Asirとの連携} + +\begin{description} + +\hypertarget{calcbyA}{} +\item[関数]CalcbyA(name,コマンド,option) +\item[機能]Risa/Asirのスクリプトを実行する +\item[説明]第2引数はRisa/Asirで実行するコマンド。 + +コマンドと引数リストの繰り返しからなるリスト(例えばcmdL)を作って,一度に実行する。 + +戻り値はない。(未定義値)結果は,コマンドリストの最後に記述した変数(引数は空リスト)の値がname で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにして代入される。 + + +\vspace{\baselineskip} +\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 で指定された変数に代入される。複数の結果を戻すときは,:: で区切って記述するとリストにして代入される。 + + +\vspace{\baselineskip} +\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 + +%MeshLabとの連携================================== +\subsection{MeshLabとの連携} + +MeshLabは,3Dデータ(objデータなど)を読み込んでレイトレーシングで表示・編集するソフトウェアである。レイトレーシングで3Dグラフィクスを描くには,Cinderellaと親和性の高い Cindy3D を利用するのがよいが,MeshLabを使うメリットは3Dプリンタ用のSTLファイルを出力できることである。また,\ketcindy で描いた3Dの図がレイトレーシングでどのようになるのかを見ることも比較的簡単にできる。 + +MeshLabとの連携は,\ketcindy から Obj 形式のデータを書き出すことで行う。Mkobj**() 関数でデータを作り,Mkviewobj() 関数でMeshLabを呼び出して表示を行う。 + +なお,Mkviewobj() 関数でMeshLabを呼び出して表示を行う場合,これをDrawスロットに書くと頻繁に呼び出しが行われるため非効率となる。そこで,if(1==0,・・・) で・・・の部分にMeshLabの呼び出し関係のスクリプトを書いて,実際に呼び出すときに if(1==1,・・・)とする方法と,呼び出し関係のスクリプトを関数化してボタンに割り当てる方法がある。ketcindyパッケージに含まれる sample にボタンをつけたものがある。 + +なお,3Dであるので,Initialization スロットに + +\verb|Ketinit();| +\verb|Ketinit3d();| +を記述しておく。 + +\begin{description} + +\hypertarget{mkobjcmd}{} +\item[関数]Mkobjcmd(name,式,option) +\item[機能]厚みを持たない曲面のobjファイルのためのコマンドを作成する +\item[説明]オプションは [分割数1,分割数2,表側の方向の指定] + +表側の方向は,変数に対して,右手系の方向が"+" + +作成されるデータは"oc"+name のファイル名の obj データである。この名称は,Mkviewobj() で用いる。(以下,Mkobj**()関数では同様) + +\vspace{\baselineskip} +【例】:サドル面 +\begin{verbatim} +fd=[ "z=x^2-y^2", "x=[-1,1]","y=[-1,1]"," "]; +Sf3data("1",fd); +Windispg(); +Mkobjcmd("1",fd,[40,40,"-"]); +Meshlab():=( +Mkviewobj("saddle",oc1, ["m","v"]); +); +\end{verbatim} +このうち,\verb|Sf3data("1",fd); | はCinderellaの画面に表示するためであって,なくてもよい。 + +次図で,左が option + の場合,右が - の場合である。 + +\includegraphics[bb=0 0 679.53 263.51 , width=12cm]{Fig/meshlab01.pdf} +\vspace{\baselineskip} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{mkobjcrvcmd}{} +\item[関数]Mkobjcrvcmd(name,PD,option) +\item[機能]空間曲線(直線)のobjファイルのためのコマンドを作成 +\item[説明]オプションは [太さ,断面の形状(正多角形)の辺の数,断面の正面] + +曲線は紐のようなもので表す。その断面は正多角形で, 初期設定は正6角形である。断面の正面は"xy","yz","zx"のいずれかで指定する。太くなった時に形状の差が現れる。 + +例太さ0.03で螺旋を描く +\begin{verbatim} +Spacecurve("1","[(6*pi-t)/(6*pi)*cos(t),(6*pi-t)/(6*pi)*sin(t),0.1*t]", +"t=[0,6*pi]",["Num=200"]); +Windispg(); +Mkobjcrvcmd("1","sc3d1",[0.03]); +Meshlab():=( +Mkviewobj("spiral",oc1,["m","v"]); +); +\end{verbatim} + +\verb|Mkobjcrvcmd("1","sc3d1",[0.1,8,"yz"]);| としたのが下図右。 + + \includegraphics[bb=0 0 614.53 236.51 , width=12cm]{Fig/meshlab02.pdf} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\vspace{\baselineskip} +\hypertarget{mkobjnrm}{} +\item[関数]Mkobjnrm(name,式) +\item[機能]法線ベクトルのデータを作成 +\item[説明]式は曲面を表す式。これに対し,法線ベクトルを表す式を求める。 + +\vspace{\baselineskip} +\hypertarget{mkobjplatecmd}{} +\item[関数]Mkobjplatecmd(name,面データ,options) +\item[機能]面を描く +\item[説明]面データを渡して面を描く。 + +options は,面の厚みの指定。厚みは中心線に対し,両側につけることができる。 + +たとえば,[0.05] はプラス側に 0.05 の厚み,[0.05,-0.04] はマイナス側にも0.04の厚みをつける。 + +\vspace{\baselineskip} +【例】三角形のプレートを描く + +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); +p1=[2,0,0]; +p2=[0,2,0]; +p3=[0,0,2]; +plane=[[p1,p2,p3],[[1,2,3]]]; +Mkobjplatecmd("1",plane,[0.05]); +Mkobjcrvcmd("2","ax3d"); +Mkviewobj("plane",Concatcmd([oc1,oc2]),["m","v"]); +\end{verbatim} + +\begin{center} \includegraphics[bb=0 0 287.01 228.01 , width=4cm]{Fig/meshlab03.pdf} \end{center} +%\begin{layer}{150}{0} +%\putnotese{80}{15}{ \includegraphics[bb=0 0 287.01 228.01 , width=3cm]{Fig/meshlab03.pdf} } +%\end{layer} + +\vspace{\baselineskip} +\hypertarget{mkobjpolycmd}{} +\item[関数]Mkobjpolycmd(name,PD,options) +\item[機能]多面体を描く +\item[説明]VertexEdgeFace() の戻り値を PDとして渡して多面体を描く。 + +\vspace{\baselineskip} +\hypertarget{mkobjsymbcmd}{} +\item[関数]Mkobjsymbcmd(PD, 実数,実数,ベクトル, ベクトル) +\item[機能]文字等のobjデータのためのコマンドを作成 +\item[説明]引数のPDを描く。第2引数は大きさ,第3引数は回転角,第4引数は正面方向のベクトル,第5引数はPDの中心の位置。 + +PDは,平面の描画コマンドによるプロットデータが使える。また,PD に半角アルファベットを文字として与えることができる。この場合,文字は n,p,q,r,t,x,y,z で,該当するフォントが data フォルダの fontF フォルダに用意されている。この中にないフォントは使えない。 + +\vspace{\baselineskip} +\hypertarget{mkobjthickcmd}{} +\item[関数]Mkobjthickcmd(name,式) +\item[機能]厚みを持つ曲面のobjファイルのためのコマンドを作成 +\item[説明]オプションは [分割数1,分割数2,厚み,表側の方向の指定,条件] +表側の方向は,変数に対して,右手系の方向が"+"。厚みを持つため,nsew のそれぞれについて, +"+n+s-e-w" のように指定する。 + +条件として,\verb|"Assume(R>0)"| をつけると,Rが0以下になるための不具合を回避できる。 + +また,"ratsimp" をつけると有理関数について,"trigsimp"をつけると三角関数について,処理を速くすることができる。 + +なお,この関数はMaximaを使うので,Maximaをインストールしていることが前提。 + +\vspace{\baselineskip} +【例】回転放物線 + +\begin{layer}{150}{20} +\putnotes{58}{37}{ \includegraphics[bb=0 0 287.01 189.01 , width=5cm]{Fig/meshlab06.pdf}} +\end{layer} +\begin{verbatim} +fd=[ +"z=(x^2+y^2)", +"x=R*cos(T)","y=R*sin(T)", +"R=[0,2]","T=[0,2*pi]","e" +]; +Mkobjthickcmd("1",fd,[40,40,0.2,"+n+s-e-w+","assume(R>0)"]); +Mkviewobj("pala",oc1,["m","v","Wait=5"]); +\end{verbatim} + +%\begin{center}\includegraphics[bb=0 0 574 378 , width=4cm]{Fig/meshlab06.pdf}\end{center} + +\vspace{37mm} +\hypertarget{mkviewobj}{} +\item[関数]Mkviewobj(name,PD, options) +\item[機能]objファイルを作成。optionにより MeshLab を立ち上げて表示する。 +\item[説明]第2引数に複数のプロットデータを与えるときは,Concatcmd() により1つにまとめる。 +オプションは +\begin{tabbing} +12345678901234567890\=\kill +"m"または"make"\> データを作る(指定しない場合もデータがなければ作る)\\ +"v"または"view"\>MeshLabを立ち上げて表示する\\ +"W=n"\>作成するための待ち時間。n秒。これを過ぎると終了する\\ +"Unit=mm"\>Setunitlen()と連動して3Dプリンタの数値の単位をmmで指定する\\ +\>3Dプリンターがインチで認識する場合は "Unit=in" とする。\\ +\end{tabbing} + + +\end{description} +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\newpage +%表計算ソフトとの連携================================== +\subsection{表計算ソフトとの連携} +表計算ソフトでは,複数のセルを選択してコピー(Windowsでは Crtl+ C ,Macでは Command+C)すると,セルの内容はtab区切りのテキストデータとしてクリップボードにコピーされる。これをCindyscriptエディタにペーストすることで表計算ソフトのデータを\ketcindy で利用できる。逆に,Cindyscriptのコンソールへの出力を表計算ソフトのシートにコピーすることもできる。 + +また,表計算ソフトから書き出したCSVファイルについても同様にしてCSV形式のデータを扱うことができる。 + +\begin{description} +\hypertarget{tab2list}{} +\item[関数]Tab2list(str,option) +\item[機能]str の内容をリストに変換する +\item[説明]tabやコンマ区切りになっている文字列 str をリストに変換する。 + + optionは,次の通り。 + + Blank=a:NULLのセルをaに置き換える。 + +Sep=b:セパレータ(区切り文字)を b とする。 初期設定は tabコード + +次のような手順で表計算ソフトやCSVファイルからデータを\ketcindy に移すことができる。 + +\vspace{\baselineskip} +(1) Cindyscriptエディタで,適当な文字変数を用意する。 + +たとえば,data=""; + +\vspace{\baselineskip} +\hspace{10mm} \includegraphics[bb=0 0 429.02 149.01 , width=7cm]{Fig/tab2list02.pdf} + +\vspace{\baselineskip} +(2) 表計算ソフトで,適当な範囲を指定しクリップボードにコピーする。 + +Windowsなら Ctrl+C,Macなら Command+C + +\vspace{\baselineskip} +\hspace{10mm} \includegraphics[bb=0 0 371.02 154 , width=7cm]{Fig/tab2list01.pdf} + +\vspace{\baselineskip} +(3) data=""; のダブルクォートの間にペーストする。 + +最後の行は右図のように," の前で改行されていてもよい。 + +\vspace{\baselineskip} +\hspace{10mm} \includegraphics[bb=0 0 369.02 118.01 , width=6cm]{Fig/tab2list00.pdf} + +\hspace{10mm} \includegraphics[bb=0 0 374.02 138.01 , width=6cm]{Fig/tab2list001.pdf} + +\vspace{\baselineskip} +(4) この文字変数 data に対し,Tab2list(data) を実行すると,行列を表すリストが返される。 + +これを適当な変数に代入し,作表コマンドで表にするなど,目的に応じて利用する。 + +数値だけなら行列として計算もできる。 + +\vspace{\baselineskip} +\hspace{10mm} \includegraphics[bb=0 0 622.53 228.51 , width=10cm]{Fig/tab2list03.pdf} + +\vspace{\baselineskip} +空文字のセル(NULL)が含まれる場合, 初期設定ではそのまま空文字になるが,アンケート処理などで無回答を0にしたいような場合は + +\hspace{10mm}\verb|dlist=Tab2list(data,["Blank=0"];| + +とする。 + + CSVファイルからCSV形式(コンマ区切り)のデータをコピーした場合は + +\hspace{10mm}\verb|dlist=Tab2list(data,["Sep=,"];| + +とする。 + +なお,文字列をセパレータで区切ってリスト化するCindyscriptの関数に tokenize()がある。上の例で, + +\hspace{10mm} \verb|dlist=tokenize(data,[unicode("000a"),unicode("0009")]);| + +とすると,改行コード(000a)とtabコード(0009)で切り分けてリスト化する。このとき,リストの各要素はつぎのようになる。 + +文字列→文字列 + +数値形式の文字→実数【例】 14 → 整数1412.3 → 実数12.3 + +計算式の形→文字列【例】 437-0023 →437-0023 (文字列) + +これに対し,Tab2list()では,計算式の形の文字列は数値と見なして計算結果を取得する。 + +\vspace{\baselineskip} +【例】 437-0023 →414 (数値) + +したがって,郵便番号や日付(28/12/5)のようなものは計算されてしまうので,tokenize() を用いるのがよい。なお,tokenize()の場合,空行は空リストになるので,最後の行でダブルクォートの前で改行されていると空リストが入る。 + + +\vspace{\baselineskip} +\hypertarget{dispmat}{} +\item[関数]Dispmat(list) +\item[機能]リストを行列の形でtab区切りにしてコンソールに表示する。 +\item[説明]行列を表すリスト (たとえば dlist) を引数としてDispmat(dlist) を実行すると,コンソールに行列型で内容が表示される。 + +実際にはTAB区切りの文字列。(println としなくても直接コンソールに表示される) + +これを表計算ソフトのシートにコピーする。 + +\vspace{\baselineskip} +\hspace{10mm} \includegraphics[bb=0 0 427.52 197.51 , width=7cm]{Fig/tab2list04.pdf} + + +\vspace{\baselineskip} +\hypertarget{writecsv}{} +\item[関数]Writecsv(namelist, data, filename, option) +\item[機能]data の内容をCSVファイルに出力する +\item[説明]ベクトルまたは行列となっている data を、filenameのファイル名としてCSVファイルに書き出す。 + +optionは,次の通り。(省略できる) + +Col=nn:自然数nnで指定した列数のCSVファイルとして書き出す。 + +namelistは,CSVファイルの1行目に追加される項目名。省略すると"C1,C2,..."という項目名が付く。 + + +なお,列数の指定を省略するとdataが行列の場合は、その列数をdataがベクトルの場合はnamelistの項目数を利用する。 + +\end{description} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\newpage + + +%アニメーション================================== +\section{アニメーションPDF} +\subsection{概要} +アニメーションのできるPDFを作る。 + +Cinderellaの作図機能とCindyscriptを用いてアニメーションができるが,PDFにすることでCinderellaがなくてもPDFビュアーがあればアニメーションを実行できるので,プレゼンテーションや教材の受け渡しなどに便利である。 + +次の画面は,samplesフォルダにある「s06animation」の「s0601cycloid」のものである。これをひな形として使うのがよい。すでにあるスライダなどが邪魔であれば,消去ボタンで消去するか,template2allbuttons.cdy をひな形として用いる。 + +\vspace{\baselineskip} +\includegraphics[bb=0 0 732.04 376.02 , width=12cm]{Fig/mvgaiyou01.pdf} + +画面上方のボタンには,次のようなスクリプトが割り当てられている。 + +\begin{tabbing} +1234\=12345678\=1234567897890123456\=\kill +\>Figure\>: Viewtex(); \>現在の画面のPDFデータを作る\\ +\>Parent \>:複数のスクリプト\>Figpdf() を使うときに使用する。\\ +\>ParaF \>: Parafolder(); \>アニメーションのフレームデータを作る\\ +\>Anime\>: Mkanimation(); \>アニメーションPDFを作る\\ +\>Flip \>: Mkflipanime(); \>パラパラ動画PDFを作る +\end{tabbing} + +アニメーションPDFを作るには,フレームを定義する関数を記述し,「ParaF」ボタンでフレームデータを作り,「Anime」または「Flip」ボタンでPDFを作成する。 +%たとえば,Fhead が "hoge" の場合,TeX の文書には\\ +% \verb|\begin{center} \input{hogemoviefigs.tex}|\\ +%で動画を挿入することができる。 + +%ただし,動画のできるPDFを作成するには,ドキュメントクラスと使用パッケージについて注意が必要である。 + +%ドキュメントクラスは,article または jarticle とする。jsarticle は使えない。 + +%パッケージは animate に dvipdfmx オプションをつける。\\ +%\verb|\usepackage[dvipdfmx]{animate}| + +Anime ボタンを押すと,\verb|\usepackage[dvipdfmx]{animate}| でパッケージを読み込み,animateinline 環境のアニメーションを作る。 + +Flip ボタンを押すと,animateinline 環境ではなく,フレームに分割したPDFが生成される。 + +なお,アニメーションPDFでアニメーションを行うにはAdobe Acrobat Reader など,アニメーションに対応したPDFリーダーが必要である。WindowsのSumatraPDF,Macの プレビューではアニメーションができない。 + +\subsection{関数} +\begin{description} + +\hypertarget{setpara}{} +\item[関数]Setpara(fname,funcstr,range,options1,options2) +\item[機能]アニメーションの設定をする +\item[説明]fname は出力するファイル名,funcstrは定義した動画関数名,rangeは範囲 + +「Anime」ボタンを押すと,animate+fname.pdf が作られる。再生はコントローラか,画面クリックで行う。 + +「Flip」ボタンを押すと,flipanime+filename.pdf が作られる。再生(コマ送り)は,Acrobat Reader のページ送りボタンで行う。 + +options1 はアニメーションのデータを作るための設定。 +\begin{tabbing} +1234567890123\=90123456789012345678\=\kill +m/r\> データの作成 / 既存データがある場合の読み込み( 初期設定は r )\\ +Div=n\> フレーム数。初期値は25。 +\end{tabbing} +options2 はアニメーションについての設定で,次の通り。 +\begin{tabbing} +1234567890123\=90123456789012345678\=\kill +Frate=n\>1秒間のフレーム数。初期値は20。 \\ +Title=str\> タイトル。指定しない場合は fname と同じ。\\ +Scale=n\> 図の大きさの拡大率 \\ +opA=[option]\> animateinline 環境のためのオプション \\ +\>初期設定は\verb|[loop,controls,buttonsize=3mm]|。\\ +\> loop:繰り返し再生する。\\ +\> controls:コントローラを表示する\\ +\> buttonsize:コントローラのサイズ\\ +\> palindrome:反転して繰り返し再生する\\ +\> step:コマ送りモードにする。コントローラもコマ送り仕様。\\ +\>\verb|"OpA=[controls,buttonsize=5mm]" |のように記述する。\\ +\> +をつけると初期設定のものに追加することができる。\\ +\>たとえば \verb|"OpA=+step"| で\\ +\>\verb|"OpA=[loop,controls,buttonsize=3mm,step]"| となる。\\ +\>\verb|"OpA=[]"| とすると,オプションなしとなり,\\ +\>画面をクリックすると繰り返しなしで再生される。\\ +記述例\\ +\verb|Setpara("cycloid","mf(t)","t=[0,60]",["Div=60"],|\\ +\verb| ["Frate=30","Title="サイクロイド","Scale=1.5","OpA=[controls]"]);|\\ +\end{tabbing} + +\vspace{\baselineskip} +\item[関数] Parafolder(funcstr,fname,range,options) +\item[機能]アニメーションのフレームデータを作成する +\item[説明]funcstrは動画関数名,fname は出力するフォルダ名,rangeは範囲 + +作業フォルダ(fig)内に,フレームデータを格納した fname フォルダを作る。ひな形(s0601cycloid)にある ParaF ボタンに割り当てられており,通常はそのまま使えばよい。 + +\vspace{\baselineskip} +\item[関数]Mkanimation(path,folder) +\item[機能]アニメーションのPDFを作る +\item[説明]作業フォルダ(fig)内に,フレームデータを格納した fname フォルダを作り,ここからアニメーションのPDFを作る。Setpara() で設定したファイル名を fname とすると,生成する TeX ファイルは,animatefname.tex (PDF作成のTeXファイル)と animfname.tex (動画データ)で,PDFの名称は,animatefname.pdf となる。 + +ひな形(s0601cycloid)にある Anime ボタンに割り当てられており,通常はあらためて設定せずそのまま使えばよい。 + +\vspace{\baselineskip} +\item[関数]Mkflipanime(path,folder) +\item[機能]パラパラ動画のPDFを作る +\item[説明]作業フォルダ(fig)内に,フレームデータを格納した fname フォルダを作り,ここからパラパラ動画のPDFを作る。Setpara() で設定したファイル名を fname とすると,生成する TeX ファイルは,flipanimefname.tex (PDF作成のTeXファイル)で,PDFの名称は,flipanimefname.pdf となる。 + +ひな形にある Flip ボタンに割り当てられており,通常はあらためて設定せずそのまま使えばよい。 + +\end{description} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\subsection{制作例} + +%\begin{description} +\vspace{\baselineskip} +【例】定円上を動く点Pと,定点Aを結ぶ線分の中点をQとして動きを見る。 + +アニメーション(フレーム)を定義する関数は,時刻を $t$ として, $t$ における図を定義すると考える。時刻は単なる媒介変数であるので,$t$ でなく $s$ などでもよい。関数名は,たとえば mf(movie frame) とする。 + +\begin{verbatim} +Setax(["","","sw","","sw"]); +Slider("A-C-B",[0,YMIN-1],[2*pi,YMIN-1]); +Circledata("1",[[0,0],[0,2]]); +mf(t):=( + pt=2*[cos(t),sin(t)]; + mp=(pt+[4,0])/2; + Listplot("1",[[4,0],pt]); + Pointdata("1",[mp,pt],["Size=2"]); + if(t==0, + ptlist=[mp]; + , + ptlist=append(ptlist,mp); + ); + Letter([[4,0],"s","A",pt,"en","P",mp,"ne","Q"]); + Pointdata("2",ptlist,["Size=2","Color=red"]); +); +mf(C.x); +Setpara("middle","mf(t)","t=[0,4*pi]"); +\end{verbatim} + +この例の場合,\verb|mf(C.x)| を実行するとスライダを動かすことでインタラクティブに軌跡を表示できる。アニメーションを作る上では \verb|mf(C.x)| やスライダはなくてもよい。 + +Cinderellaの画面は次のようになる。 + +\vspace{\baselineskip} +\hspace{20mm} \includegraphics[bb=0.00 0.00 608.03 367.02,width=8cm]{Fig/moviedata01.pdf} + +アニメーションを作成するときは \verb|//mf(C.x)| とコメントアウトしてから 「ParaF」「Anime」 ボタンをクリックする。次の図は,でき上がった animatemiddle.pdf の始めの画面である。 + +\hspace{30mm}\includegraphics[bb=0.00 0.00 470.02 394.02,width=6cm]{Fig/moviedata02.pdf} + +また,次のようにオプションを指定すると,5秒間のアニメーションとなる。 + +\verb| Setpara("middle","mf(t)","t=[0,4*pi]",["Div=30"],["Frate=6"]);| + +\verb|["Div=150"],["Frate=30"]|とすると,やはり5秒間のアニメーションとなるが,1秒間のフレーム数が多いため,なめらかな動きとなる。これは標準的なビデオのフレームレートである。ただし,ファイルサイズは約5倍となる。 + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\end{description} + +\newpage + + +%==================== Slide =============== +\section{KeTスライド} +\subsection{概要と制作手順} +\ketcindy で作成した図とテキストを統合してプレゼンテーション用のスライドPDFを作成する。必要なファイルは,スライドの内容を記述したテキストファイル(ここではコンテンツファイルと呼ぶ)と,タイトルや図を作成し,コンテンツファイルと統合する \ketcindy のファイルである。この2つのファイルは,拡張子が txt と cdy で,ファイル名は同一とする。たとえば,コンテンツファイルを makeslide.txt , \ketcindy ファイルを makeslide.cdy としたときの,制作イメージを次の図に示す。 + +\hspace{10mm}\input{Fig/makeslide} + +\hspace{10mm}makeslide.cdy + +\hspace{10mm}\includegraphics[bb=0.00 0.00 881.05 451.02,width=10cm]{Fig/slide01.pdf} + +\vspace{\baselineskip} +ひな形として,サンプルとして提供されている samples フォルダの中の s0701basic.cdy をコピーし,適当にリネームして使うのがよいだろう。必要なボタンと,最低限のスクリプトが記述されている。 + +以下では,\ketcindy のファイルを makeslide.cdy , コンテンツファイルを makeslide.txt として説明を進める。制作手順は次の通り。 + +(1) makeslide.cdy に \verb|Settitle| コマンドでタイトルを書き,「Titile」ボタンで書き出す。 + +タイトルスライドが作業フォルダに,makeslide.txt が makeslide.cdy と同じフォルダに作成される。makeslide.txt がすでにある場合には上書きはされず,タイトルスライドだけが上書きされる。 + +(2) makeslide.txt に,スライドの各ベージごとの内容を記述する。 + +(3) 必要な図やアニメーションのコードを書き,ボタンをクリックしてファイルを作る。 + +\hspace{10mm}Figure : 図を挿入するとき + +\hspace{10mm}ParaF : アニメーションやパラパラスライドを挿入するとき + +(4) Slide ボタンでスライドPDFを作成する。 + +PDFと,関連する中間ファイルは,作業フォルダではなく,makeslide.cdyのあるフォルダに作成される。また,スライドPDFはアニメーションと同様,Windows,MacではAdobe Reader で開く必要がある。Linux(Ubuntu)では Evince でプレゼンテーションができる。 + +\subsection{コンテンツファイル} + +コンテンツファイルは次のような構成にする。 + +\begin{tabbing} +1234567890\=12345678912345678901234567890\=\kill + \>title::slide0//\> タイトルスライド。title はコマンド。\\ + \>main::三角比と三角関数//\> セクション1のタイトル。main はコマンド。\\ + \>直角三角形と三角比//\> 1ページ目の表示内容。\\ + \>・・・・// \\ + \> new::角の概念の拡張//\> 新しいページとタイトル。new はコマンド。\\ + \> enumerate::[(1)]// \> 2ページ目の表示内容。enumerate はコマンド。\\ + \> ・・・・//\\ + \> new::負の角//\> 新しいページとタイトル。\\ + \> ・・・・//\\ + \>main::三角関数のグラフ//\> セクション2のタイトル。\\ + \>$f(x)=\sin x$//\> \hspace{10mm}以下同様\\ + \> new::振幅と周期// \\ + \> ・・・・//\\ +\end{tabbing} +%あまりスマートな方法ではないが,枠をKeTCindyで作ってレイヤーで表示 +\begin{layer}{150}{0} +\hspace{7mm}\input{Fig/boxframeslide} +\end{layer} + + +・すべての行の末尾には必ず // をつける。 + +\hspace{10mm} 注)urlの指定で // を用いるときは,$||||$ とすれば // に変換される。 + +・ページの内容は,コマンドでレイアウトなどを指定し,表示する文をテキストで書く。 + +\vspace{\baselineskip} +{\bf コマンド} + +コマンドにおいて,各ブロックの引数の区切りは \verb|::| とし,各行の終わりには必ず//をつける。 + +\vspace{\baselineskip} + {\bf 【タイトルと壁紙】} + + タイトルスライドをつけるときは, + + \hspace{10mm}\verb|title::slide0//| + + を1行目に置く。タイトルスライドは makeslide.cdy で作る。slide0は 初期設定のタイトルスライドのファイル名。このファイル名を変更(たとえば "start")したときは,makeslide.cdy で,Settile() のオプションに "Title=start" をつけて,ファイル名が一致するようにしておく。 + + タイトルスライドをつけないときはスライド名をつけないでおく。 + +\hspace{10mm} \verb|title:://| + +注)title コマンドは必須で,これを1行目に書かないとスライドは作成されない。 + +\vspace{\baselineskip} +壁紙(背景)を表示するときは,タイトルコマンドに続けて壁紙ファイル名を書く。 + + \hspace{10mm}\verb|title::slide0::wallpaper//| + +wallpaper は壁紙のファイル名。壁紙ファイルはTeXのファイルで,作業フォルダ(fig)に入れておく。 + +壁紙ファイルの一例 + +\begin{verbatim} + {\color[cmyk]{0.6,0.2,0.8,0}\huge\rm\normalsize +\newpage +\begin{layer}{120}{0} +\lineseg{0}{2}{125}{0} +\lineseg{0}{88}{125}{0} +\putnotese{0}{90}{\ketcindy} +\end{layer} +} +\end{verbatim} + +\vspace{\baselineskip} +{\bf 【セクションタイトル】} + +\hspace{10mm}\verb|main::セクションタイトル名//| + +セクションを分けないときはなくてもよい。 + +\vspace{\baselineskip} + {\bf 【新しいページ】} + +\hspace{10mm}\verb|new(::行下げ)::タイトル((::位置)::読み込みファイル)//| + + 例)\verb|new::[10]::はじめに::{50}{20}::figure//| + +読み込みファイルの表示サイズを変更するときは + + \hspace{10mm}\verb|new::[10]::はじめに::{50}{20}::figure,0.8//| + +のようにする。 + +読み込みファイルがなければ,figure は省略。 + +\vspace{\baselineskip} + {\bf 【箇条書き】} + +番号つき箇条書きは + + \hspace{10mm}\verb|enumerate//| + + で,enumerate環境の始まりを示す。 + +番号にかっこをつけるなど,番号の形式を変えるには, + +\hspace{10mm}\verb|enumerate::[(1)]| + +のように,\verb|::|で区切って形式を示す。 初期設定は,かっこなしの番号。 + +記号つき箇条書きは + +\hspace{10mm}\verb|itemize//| + +で itemize環境の始まりを示す。記号は中黒。 + +enumerate,itemizeのいずれも + +\hspace{10mm}\verb|item::文//| + +で itemを記述する。 + +環境の終わりは, + +\hspace{10mm}\verb|end//| + +で示す。 + +\vspace{\baselineskip} +{\bf 【項目の順表示】} + +1枚のスライド内で,項目を段階的に表示するときは,\verb|new| の次の行に + +\hspace{10mm}\verb| %repeat=m(,para)//| + +を書く。mは段階数で,たとえば,そのスライドの内容を3段階で表示したい場合は + +\hspace{10mm}\verb| %repeat=3//| + +とする。実際には3枚のスライドが作られる。 + +para をつけると,右下にコントローラが表示され,前後に進めやすくなる。 + +\hspace{10mm}\verb| %repeat=3,para//| + +段階的に表示したい行の先頭に,表示する順番を,2番目以降から +\begin{verbatim} +%[2,-]::text// +%[3,-]::text// +\end{verbatim} + +のように書く。 + +番号指定を \verb| [-, 3] | とすると,3番目まで表示する。 + +\verb| [1..3,5 ]| とすると,1番目から3番目までと5番目に表示する。(4番目をスキップ) + +\vspace{\baselineskip} + {\bf 【薄文字】} + + 順表示したい項目の全体像を見せておいて,そのうちの現在までの項目を示すような場合に用いる。番号指定の前に thin をつけ, + + \begin{verbatim} +%thin[2,-]::text// +%thin[3,-]::text// +\end{verbatim} + +のように書くと,現段階の項目よりあとは薄文字で表示される。 + +薄文字の濃さは, + +\hspace{10mm} \verb|\setthin{alpha}//| + +で指定できる。alphaは0から1までの数で, 初期設定は0.1。 + +\verb|\setthin{0}//| のとき,指定段階以降の項目は非表示になる。 + + 初期設定の薄文字の濃さは,makeslide.cdy の Setslidebodyの第3引数で設定できる。たとえば, + +\hspace{10mm}\verb|Setslidebody(["","",0.2]);| + +とする。 + +item とともに用いるときは,\verb|%thin[n,-]| を先に書く。 + +\vspace{\baselineskip} +【例】項目の順表示 + +図は,3番目のJavaまで進んだところである。右下にコントローラがある。 + +\begin{layer}{150}{0} +\putnotese{70}{10} {\includegraphics[bb=0.00 0.00 777.04 516.03,width=7cm]{Fig/sliderepeat.pdf} } +\end{layer} +\begin{verbatim} +new::プログラミング言語 // +%repeat=6,para// +\slidepage// +itemize// +item::Python// +%thin[2,-]::item::Ruby// +%thin[3,-]::item::Java// +%thin[4,-]::item::JavaScript// +%thin[5,-]::item::CindyScript// +%thin[6,-]::item::C// +end// +\end{verbatim} + +\vspace{\baselineskip} + {\bf 【図ファイルの順表示】} + +作業フォルダ(fig)の中にあるサブフォルダ(例えばsubfig)の図ファイルすべてを順に表示する。 + + パラパラ動画のときに用いる。パラパラ動画では,ParaFボタンをクリックすると,作業フォルダ(fig)の中に,動画のフレームファイルが入ったフォルダが作られる。そのフォルダのファイルをアルファベット順に表示する。もちろん,パラパラ動画以外のファイルの順表示に使ってもよい。 + +\verb|new| の次に + +\hspace{10mm} \verb|%repeat=//| + +\hspace{10mm} \verb|%para=subfig:{0}:s{60}{10}:input(:倍率)//| + +を書く。TeXのソースには, + +\hspace{10mm}\verb| layer{120}{0}, \putnotes{60}{10 初期設定put...}| + +の形で書き入れられる。 + +また,2行に分けずに + +\hspace{10mm} \verb|%repeat=,para=... |と続けて書いてもよい。 + + +\vspace{\baselineskip} +{\bf 【レイヤー】} + +ketlayerの\verb|\begin{layer}・・\end{layer}| として書き出す。本来の記述より簡素になっている。 + +\hspace{10mm}\verb|layer::{範囲}{0}//| + +で layer環境の始まりを示す。layer環境の終わりは + +\hspace{10mm}\verb|end//| + + レイヤーの中に作業フォルダ(fig)にある図を表示するには + +\hspace{10mm}\verb|putnote::方向と位置::読み込みファイル//| + +とする。 + + 例) figure.texを(30,10)の位置の南東(原点は左上)に表示する。 + +\hspace{10mm} \verb|putnote::se{30}{10}::figure//| + + 例) figの中のfigure.texを0.8倍にして表示する。 + +\hspace{10mm} \verb|putnote::se{30}{10}::figure,0.8//| + + + 例)includegraphics で figure.pdf を表示する。 + +\hspace{10mm} \verb|putnote::se{30}{10}::include[width=5cm]::figure.pdf//| + + + 注)\verb|KeTpicStyle.pdf|を参照。文字などは本来の書式を用いて次のように入れる。 + +\hspace{10mm} \verb|\putnotee{30}{10}{文字}//| + +\vspace{\baselineskip} +{\bf 【テキストと動画】} + +コマンド以外のテキストはそのまま \TeX\ に書き出される。行末には // をつける。 + +テキストを途中で改行するには,\TeX\ の 強制改行マーク \textbackslash \textbackslash をつける。 + +動画の場合は,動画の設定をして(アニメーションの節を参照)ファイルを作る。 + +パラパラ動画の場合は,ParaFボタンをクリックすると,figフォルダ内に動画のフレームファイルが入ったフォルダ(たとえば sincurve)が作られる。これを, + +\hspace{10mm} \verb|%repeat=//| + +\hspace{10mm} \verb|%para=sincurve:{0}:s{60}{10}:input(:倍率)//| + +で表示する。 + +アニメーションの場合は,スライドのために,makeslide.cdy のスクリプトに, \verb|Addpackage(["[dvipdfmx]{animate}"]);| を追加しておく。 + +Animeボタンをクリックすると,パラパラアニメと同様に動画のフレームファイルが入ったフォルダが作られ,動画用の\TeX\ ファイルができる。Setpara() で設定したファイル名が "sincurve" のとき,動画用の\TeX\ ファイルは "animsincurve.tex" となるので,\verb|%repeat| ではなく \verb|\input{fig/animsincurve}//| で表示する。 + + +\vspace{\baselineskip} +{\bf 【コメント行】} + + コマンドや文をコメントアウトするときは,\verb|%%| とする。 + +\vspace{\baselineskip} +{\bf 【空白行】} + +空白行を入れたいときは,\verb|...//| とする。 + +\vspace{\baselineskip} +{\bf 【タブ】} + +\hspace{10mm}\verb|\Ltab{長さ}{文1}文2| + +とすると,文1が行頭から,文2が長さ分の字下げをした位置から表示される。長さは 20mm のように指定。 + +\vspace{\baselineskip} +{\bf 【ページ番号】} + +page番号を表示するときは次のようにする。 + + mainの場合は \verb|\slidepage[m]//| + +それ以外の場合は \verb|%repeatの後に \slidepage//| + + 注)総ページ数を取得するため,TeXを2度コンパイルすることが必要である。そのため,Slideボタンを2度クリックすると総ページ数が表示される。 + +\vspace{\baselineskip} +{\bf mp3/mp4ファイルの追加} + +makeslide.txtのタイトルコマンドの後に,以下を追加する。 +\begin{verbatim} +title::slide0(::wallpaper) +::\usepackage{ketmedia} +::\usepackage[dvipdfmx]{media9}// +\end{verbatim} + +mp3ファイルを追加するときは,\verb|\inputsound|または\verb|\inputsoundclick|を用いる。\\ +\hspace{10mm}\verb|\inputsountclik[90]{フォルダ/}{ファイル}|\\ +\verb|\inputsound|は「自動再生」,\verb|\inputsoundclick|は「クリック再生」である。 +最初の引数は,ボタンの水平位置(単位mm)でデフォルトは90である.またフォルダには\verb|/|をつける。\vspace{2mm} + +mp4ファイルを追加するときは,\verb|\inputmovie|を用いる。\\ +\hspace{10mm}\verb|\inputsountclik[90]{1}{0.4}{フォルダ/}{ファイル}|\\ +2番目と3番目の引数は,幅と高さの\verb|\linewidth|からの倍率である。 + +\vspace{\baselineskip} +{\bf 【余白などの編集】} + +スライドの上側余白として,初期状態で \verb|\vspace*{18mm}| が設定される。次のページにはみ出してしまうような場合は,出力された tex ファイルで調整すればよい。 + +その他,適宜編集して,kc.command(bat/sh) を実行すれば,細かい部分を修正したPDFを作成することができる。 + +\subsection{関数} +makeslide.cdy で使う,\ketcindy の関数。 + +\begin{description} + +\hypertarget{setslidebody}{} +\item[関数]Setslidebody(bodycolor,bodystyle,density) +\item[機能]全体の文字スタイルと薄文字の濃さ(0-1)の設定 +\item[説明]引数の意味は次の通り。 +\begin{tabbing} +1234567890123\=4567890\=\kill +bodycolor\> 文字色 :初期設定は "blue"\\ +bodystyle\> フォントタイプ :初期設定は \verb|"\Large\bf\boldmath"|\\ +density\> 薄文字の濃さ :初期設定は 0.1 +\end{tabbing} + +引数がない場合や( \verb|Setslidebody()|)この関数を書かない場合は初期値が使われる。 + +ある引数だけを指定したい場合は,それより前は空にする。 + +【例】\verb|Setslidebody(,"\large")| + +\vspace{\baselineskip} +\hypertarget{setslidehyper}{} +\item[関数]Setslidehyper("dvipdfmx",options) +\item[機能]順表示でページ送りのコントローラを設定する。 +\item[説明]順表示しないときもこの関数の記述は必須と考えてよい。 + +パッケージ hyperref.styを読み込み,かつ,options の値を与える。 + +\verb|Setslidehyper();| は無効。初期設定で使う場合は \verb|Setslidehyper("");| とする。 + +第1引数は hyperref.sty の第1パラメータ。初期設定は "dvipdfmx" + +options は ["cl=bool,lc=col,fc=col","Pos=[x,y]","Size=n"] + +\begin{tabbing} +12345\=4567890\=\kill +cl \> colorlinks : リンクに色をつけるかどうか。true / false で指定。 初期設定は true\\ +lc \> linkcolor : コントローラの色。色名で指定。 初期設定は blue\\ +fc\> filecolor リンクの色。色名で指定。 初期設定は blue\\ +以上3つは,セットで指定。一部初期値を使う場合は\verb|lc=,| のように右辺を空にする。\\ +Pos \> コントローラの位置。 初期設定は [125,73] (左上が原点)\\ +Size \> コントローラの大きさ。 初期設定は1 +\end{tabbing} + + +\vspace{\baselineskip} +\hypertarget{setslidemain}{} +\item[関数]Setslidemain([letterc,boxc,boxd,framec,xpos,size]) +\item[機能]メインスライド(セクション区切り)の設定 +\item[説明]引数の一部を 初期設定値とする場合は [,,,,3] や [,"red"] などとする。 +\begin{tabbing} +1234567\=4567890\=\kill +letterc \> 文字の色。 初期設定は CMYKで [0.98,0.13,0,0.43]\\ +boxc \> ボックスの色。 初期設定は [0,0.32,0.52,0] \\ +frame\> フレームの色。 初期設定は [0,0.32,0.52,0]\\ +xpos \> タイトルの水平位置。 初期設定は 62\\ +size \> タイトルの倍率。 初期設定は 2 +\end{tabbing} + + +\vspace{\baselineskip} +\hypertarget{setslidepage}{} +\item[関数]Setslidepage([letterc,boxc,boxd,framec,shadowc,xpos,size]) +\item[機能]ページの設定をする。 +\item[説明]引数の一部を 初期設定値とする場合は [,,,,3] や [,"red"]などとする。 + +\begin{tabbing} +1234567\=4567890\=\kill +letterc \> 文字の色。 初期設定は CMYKで [0.98,0.13,0,0.43]\\ +boxc \> ボックスの色。 初期設定は [0,0.32,0.52,0] \\ +frame\> フレームの色。 初期設定は [0,0.32,0.52,0]\\ +shadowc \> 影の色。 初期設定は [0,0,0,0.5]\\ +xpos \> タイトルの水平位置。 初期設定は 6\\ +size \> タイトルの倍率。 初期設定は 1.3 +\end{tabbing} + +\vspace{\baselineskip} +\hypertarget{setslidemargin}{} +\item[関数]Setslidemargin([leftmarginchange,topmarginchange]) +\item[機能]スライドの左上マージンをデフォルトから変更する場合の値。 +\item[説明]Setslidemargin([+5,-10]);(横方向に$+5$mm,縦方向に$-10$mm変更) + +\vspace{\baselineskip} +\hypertarget{settitle}{} +\item[関数]Settitle(タイトルリスト,options) +\item[機能]タイトルスライドを作る +\item[説明]タイトルリストはコンマ区切りで位置と文を文字列で与える。例を参照。 +「Title」ボタンをクリックすると,コンテンツファイルがない場合は新たに作る。すでにある場合は上書きせずタイトルスライドのみを作る。 + +Settitleのオプションは次をリストで与える。 + +\begin{tabbing} +123456789012\=4567890\=\kill +"Title=" \> タイトルスライドのファイル名。 初期設定は "slide0"。\\ +"Layery=" \> タイトルの縦位置。 初期設定は0。0でないときは方眼を表示。 \\ +"Color="\> 文字の色。 初期設定は blue。 +\end{tabbing} + +\vspace{\baselineskip} +【例】タイトルの設定 + +\begin{verbatim} +Settitle([ +"s{60}{20}{メインタイトル}", +"s{60}{50}{名前}", +"s{60}{60}{所属}", +"s{60}{70}{情報}" +] , +["Title=SlideA","Color=[1,1,0,0]"]); +\end{verbatim} + +出力する \TeX\ ファイルに,\verb|\begin{layer}| の設定をする。 \verb|s| は,東西南北の\verb|s|。 + +例のように,タイトルリストは改行すると見やすい。 + +\end{description} + +\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\newpage +%================== 3D概要 =============== +\section{\ketcindy 3D} +\subsection{概要} +\ketcindy 3Dの画面は次のように構成される。 + +Cinderellaの描画面に,白の矩形で囲んだ領域が2つできる。NE,SWを対角とする左側の領域を主画面,右側の領域を副画面という。 + +\vspace{\baselineskip} +\begin{center} + \includegraphics[bb=0 0 879.05 447.02 , width=8cm]{Fig/3dstart.pdf} +\end{center} +主画面は平面の場合と同様,TeXに出力される範囲を示し,NE,SWの2点をドラッグすることにより変更できる。主画面の下方のスライダで視点が移動でき,主画面上では軸が回転する。副画面は,xy平面上に視点を置いたものと考えればよい。 + +主画面上にCinderellaの作図ツールで点や線分を作図すると,副画面に対応する点が作図される。主画面上の点をドラッグするとx,y座標を変更でき,副画面上の点をドラッグするとz座標を変更できる。 + +\vspace{\baselineskip} +\begin{center} + \includegraphics[bb=0.00 0.00 863.04 378.52 , width=10cm]{Fig/3dscreen.pdf} +\end{center} + +KeTCindy3Dでは,線や面についての陰線処理を行う。陰線処理はC言語との連携により処理を速めている。C言語を使う環境整備が必要であるが,現在はこれを標準としている。C言語が使えない場合はRで計算する関数を用いることになるが,その場合はかなり時間がかかる。(場合にもよるが2分程度) + +%================== 3D設定 =============== +\newpage +\subsection{設定} + +\begin{description} + +\hypertarget{ketinit3d}{} +\item[関数]Ketinit3d() +\item[機能]KeTCindy3Dの使用宣言 +\item[説明]Cinderellaの画面を3Dモードにする。 + +Cinderellaの描画面に,視点移動のための2つのスライダを作る。スライダは初期位置が左端になる。スライダTHで角THETAを,スライダFIで角PHIを内部変数として定義する。 + +引数に0を入れて \verb|Ketinit3d(0)| とすると,副画面を表示しない。 + +\textcolor{red}{<重要>} + +この関数は Initialization スロットに置く。Ketinit() も,平面の場合と異なり Initialization スロットに置く。KeTCindy3Dにおける変数の初期化などを行う,Start3d()はDrawスロットに書く。 + +%----------------Setangle -------------------------------------------- +\vspace{\baselineskip} +\hypertarget{setangle}{} +\item[関数]Setangle(TH,FI) +\item[機能]回転角の指定 +\item[説明]スライダで設定できる回転角(視点の位置)TH と FI を度数法で指定する。 +たとえば,\verb|Setangle(70,40)| とすると,TH,FIがその位置になる。スライダは固定されるので,再度スライダを有効にしたい場合は,コメント化して再実行する。 + +初期状態だけを決めたい場合は + +\verb| if(!Ptselected(),Setangle(70,40)); | + +または + +\verb| if(!Isangle(),Setangle(70,40)); | + +とすると,スライダは有効となり,スライダのいずれかの点を選択した状態であれば Figure ボタンも有効である。画面上のなにもないところをクリックして,点の選択状態を解除するともとに戻る。 + +回転角の取得については,\hyperlink{getangle}{回転角の取得}を参照のこと。 + +%----------------Start3d -------------------------------------------- +\vspace{\baselineskip} +\hypertarget{start3d}{} +\item[関数]Start3d(option) +\item[機能]3Dの画面設定と空間点の認識 +\item[説明]副画面を作り,幾何点を3Dの点として認識する。この関数は必須で,Drawスロットの先頭に書く。 + +Cinderellaの作図ツールで,点・線分を作図すると,内部関数の Ptseg3data() によってそれらを空間の点として認識し,副画面上に対応する点をとる。ただし,始めはz座標を0とする。点の名前がAであれば,副画面上の点はAzとなる。点をポイントして選択すると副画面の上に座標が表示される。 + +作図した点の名称をインスペクタで変更した場合,新しい名称に対応する点を副画面上に作成するが,以前の点は消えないので要注意。たとえば,点Aを作図した後,主画面上の点Aをインスペクタで点Dに変えた場合,副画面上に新たにDzができるが,以前のAzも残る。残ったAzは,選択しておいて作図ツールの消去ボタン \includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/delete.pdf}で消すことができる。 + +optionに,除外点のリストを与えると,その点は空間点としない。(スライダで視点を移動しても位置は変わらない) + + %----------------Startsurf -------------------------------------------- +\vspace{\baselineskip} +\hypertarget{startsurf}{} +\item[関数]Startsurf(options) +\item[機能]曲面描画の初期化と定数の設定 +\item[説明]options で定数を設定する。定数としては,分割数,Cのサイズ,誤差の限界を設定する。 + +optionsがないときは,以下の 初期設定を用いる。 + + [50,50],[1500,500,200],[0.01,0.1] + +設定後に初期値にリセットするときは,文字列 "reset" を引数に与える。 + +これにより,陰線処理をともなう面の描画の手順は,次のようになる。 + +(1)Startsurf(); で面描画の宣言をする。 + +(2) 描画関数でプロットデータを作る。 + +(3) ExeccmdC(); で,C言語を用いてまとめて描画する。 + +%-------------------Xyzaxdata3d----------------------------------------------- +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +\hypertarget{xyzax3data}{} +\item[関数]Xyzax3data(name,xの範囲,yの範囲,zの範囲,options) +\item[機能]座標軸を描く +\item[説明]描画面に座標軸を描き,プロットデータ ax3dを作成する。nameは空文字列でよい。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をつけてから出力するとよい。 + +\end{description} +%================== 3D描画 =============== + +%\newpage +\subsection{描画} + +%================== 3D点・線 =============== +\subsubsection{点・線} + +\begin{description} + %----------------Drawpoint3d -------------------------------------------- +%\hypertarget{drawpoint3d}{} +%\item[関数]Drawpoint3d(座標) +%\item[機能]空間点を描く +%\item[説明]引数で与えた空間座標の点を描く。この点は幾何点ではない。また,TeX にも出力されない。幾何点にするには \hyperlink{putpoint3d}{Putpoint3d()} を用いる。TeXに点を出力するには,\hyperlink{pointdata3d}{Pointdata3d()} を用いる。 + +%引数は,座標のリストにすることもできる。 + +%\vspace{\baselineskip} +%【例】 +%\begin{verbatim} +%Drawpoint3d([1,1,1]); +%Drawpoint3d([[1,1,1],[0,1,0]]); +%\end{verbatim} + +%\vspace{\baselineskip} + + %----------------Pointdata3d -------------------------------------------- +\hypertarget{pointdata3d}{} +\item[関数]Pointdata3d(名前,点リスト,options) +\item[機能]点の3Dデータと2Dデータを作成し,画面と\TeX に出力する。 +\item[説明]optionsは\hyperlink{pointdata}{Pointdata()}と同様。 +\vspace{\baselineskip} + +【例】 +\begin{verbatim} +Pointdata3d("1",[[1,1,1],[0,1,0]],["Size=2","Color=red"]); +\end{verbatim} +\vspace{\baselineskip} + + %---------------- Putpoint3d---------------------------------------------- +\hypertarget{putpoint3d}{} +\item[関数]Putpoint3d(リスト,option) +\item[機能]空間に幾何点を作図する +\item[説明]点の名称と座標を与えて点を作図する。複数の点を一度に作図できる。 + +optionは,"fix"( 初期設定) または "free"。リスト ["free"] にしてもよい。 + +"fix" では,固定点(ドラッグで移動できない点)とする。同じ名称の点がすでに存在する場合は,指定した位置に移動して固定点とする。 + +"free" では,自由点(ドラッグで移動できる)とする。同じ名称の点がすでに存在する場合はなにもしない。 + +\vspace{\baselineskip} +【例】いくつか記述例を示す。 + +\verb|Putpoint3d(["A",[2,1,3]]);| + +\verb|Putpoint3d(["A",[1,1,1],"C",[1,0,1]],"fix");| + +\verb|Putpoint3d(["A",[2,1,3]],"free");| + +\vspace{\baselineskip} +なお,この関数は幾何点を作るものであり,TeXには出力されない。TeXに点を出力するには,\hyperlink{pointdata}{Pointdata()} を併用する。 + +空間における点の座標は,点名に"3d"を付加した名前の変数に代入される。たとえば,点Aの座標はA3dである。これにより,点の座標を取得できる。 + + %----------------Putaxes3d--------------------------------------------- +\vspace{\baselineskip} +\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]) と同じになる。 + +\vspace{\baselineskip} +【例】 + +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)$ を作る。 + + %----------------Putoncurve3d--------------------------------------------- +\vspace{\baselineskip} +\hypertarget{putonCurve3d}{} +\item[関数]Putoncurve3d(点名,PD) +\item[機能]空間曲線上に点をとる +\item[説明]プロットデータPDの曲線上に,点名の点をとる。 + +とった点は固定点ではなく,曲線上にインシデントとなる。したがって,ドラッグして曲線上を動かすことができる。例は \hyperlink{partcrv3d}{Partcrv3d()} を参照のこと。 + %---------------- Putonseg3d---------------------------------------------- +\vspace{\baselineskip} +\hypertarget{putonseg3d}{} +\item[関数]Putonseg3d(点名,点1,点2) +\item[機能]線分上に点を作る +\item[説明]点1と点2の中点に,指定された名前の点を取る。点1と点2が線分として結ばれていなくてもよい。とった点は線分にインシデントとなる(線分が描かれていなくても)。点1と点2はリストにすることもできる。指定した点がすでに存在する場合は動かさない。 + +点1,点2は幾何点の名称または座標で指定する。 + +\vspace{\baselineskip} +【例】A(1,-1,0)とB(0,2,2) の中点に点Cをとる。つぎのいずれでもよい。 + +\verb|Putonseg3d("C",A,B);| + +\verb|Putonseg3d("C",[A,B]);| + +\verb|Putonseg3d("C",[[1,-1,0],[0,2,2]]);| + +\vspace{\baselineskip} + +%------------------ Spaceline----------------------------------------------- +\hypertarget{spaceline}{} +\item[関数]Spaceline(name,list) +\item[機能]折れ線を描く +\item[説明]点の名称または座標のリストを与えて折れ線を描く。平面での Listplot() にあたる。 + +options は線種(dr,da,do) + +\vspace{\baselineskip} +【例】いくつか示す。 + +・Spaceline("1",[[2,5,1],[4,2,3]]); 指定された2点を結んだ線分を描く。 + +・Spaceline("2",[A,B,C,A]);作図されている2点A,B,Cを結んだ三角形を描く。 + +・節点を表示する場合は,Pointdata3d() で描画する。 + +\begin{verbatim} +pt=[[2,0,0],[2,0,2],[2,2,2],[0,2,2],[0,4,2],[0,4,4]]; +Spaceline("1",pt); +Pointdata3d("1",pt,["Size=3"]); +\end{verbatim} + +点の名前が必要であれば + +\verb|pname=apply(1..6,"P"+text(#));| + +のようにして,名前リストを作ることができる。 + +%\vspace{\baselineskip} +%\begin{layer}{150}{0} +%\putnotese{80}{10}{ \input{Fig/oresenex01}} +%\end{layer} + \begin{center} \input{Fig/oresenex01} \end{center} + +%------------------ Spacecurve----------------------------------------------- +\hypertarget{spacecurve}{} +\item[関数]Spacecurve(name,式,定義域,options) +\item[機能]空間曲線を描く +\item[説明]媒介変数で表された曲線を描く。optionは解像度 Num + +\vspace{\baselineskip} +【例】螺旋を描く + +\verb|Spacecurve("1","[2*cos(t),2*sin(t),0.2*t]","t=[0,4*pi]",["Num=100"]);| + +\vspace{\baselineskip} + \begin{center} \input{Fig/rasen} \end{center} + + + %---------------- Bezier3d----------------------------------------------- +\hypertarget{bezier3d}{} +\item[関数]Bezier3d(name,リスト1,リスト2) +\item[機能]空間ベジェ曲線を描く +\item[説明]引数はリスト1が端点リスト,リスト2が制御点リスト + +1組の端点につき,2つの制御点を使う。 + +\vspace{\baselineskip} +【例】いくつかの点をベジェ曲線で結ぶ + +端点A,Bに対し,制御点をD,Eとする。 + +\verb|Bezier3d("1",["A","B"],["D","E"]);| \vspace{\baselineskip} + +端点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"]);| + +\begin{center} \input{Fig/bezier3d1} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------ Mkbezierptcrv3d----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{mkbezierptcrv3d}{} +\item[関数]Mkbezierptcrv3d(点リスト) +\item[機能]制御点を自動的にとる空間ベジェ曲線 +\item[説明]リストで与えた点に対し,制御点を自動的に生成してベジェ曲線を描く。 + +制御点は,2つの点に対して,その点を端点とする線分上に2つ作られる。これを適宜移動して任意の曲線にすることができる。\hyperlink{bezier3d}{空間ベジェ曲線 Bezier3d()} を参照のこと。 + +\vspace{\baselineskip} +【例】\verb|Mkbezierptcrv3d(["A","B","C","D"]);|\\ +線分AB上に2点a1p,a2p,線分BC上に2点a2p,a2q,線分CD上に2点a3p,a3qができる。 + +\vspace{\baselineskip} + +%------------------ Skeletonparadata----------------------------------------------- +\hypertarget{skeletonparadata}{} +\item[関数]Skeletonparadata(name,PDリスト,PDリスト,option) +\item[機能]陰線処理(スケルトン処理)をおこなう +\item[説明]描画されている線と軸について陰線処理をおこなう。 + +第2引数の線(プロットデータ)が,第3引数の線(プロットデータ)によって隠される部分を消去する。第2,第3引数を省略した場合は,すべての線について,互いの陰線処理をおこなう。optionで消去する部分の長さを指定できる。\\ +他のオプション\\ + \verb|"No=点リスト"| 点リストの点が選ばれているときは実行しない\\ + \verb|"File=y/m/n (n)"| データファイルを作るか\\ + \verb|"Check=点リスト"| 点リストの点が変更されていたら,ファイルを作り直す + + +\vspace{\baselineskip} +【例】螺旋と線分,座標軸の陰線処理 + +次のように螺旋と線分,座標軸を描いておく。 +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,4]","z=[-5,3]"); +Putpoint3d(["A",[0,-2,-2]]); +Putpoint3d(["B",[-1,1,3]]); +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 である。これに対し, + +\hspace{10mm} \verb|Skeletonparadata("1");| + + 描画されている線と軸について陰線処理をおこなう。(図左) + +\hspace{10mm} \verb|Skeletonparadata("1",[2]);| + + 重なった部分の空きを2にする。(図中央) + +\hspace{10mm} \verb|Skeletonparadata("1",["AB3d","ax3d"],["sc3d1"]);| + +螺旋によって隠れる部分だけ消去する。(図右) + +\begin{center} \input{Fig/skeletonparadata01} \input{Fig/skeletonparadata02} + \input{Fig/skeletonparadata03} \end{center} + +このほか,次も可能。 + +\hspace{10mm} \verb|Skeletonparadata("1",["AB3d","ax3d"],["sc3d1"],[2]);| + +\hspace{10mm} \verb|Skeletonparadata("1",["AB3d"],["ax3d","sc3d1"]);| + + +\end{description} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%\newpage +%================== 3D多面体 =============== +\subsubsection{多面体} + +多面体の描画について,四面体の場合を例にして説明する。 + +\begin{layer}{130}{0} +\putnotesw{130}{0}{\input{Fig/concatobj}} +\end{layer} + +四面体は4つの面からなっている。 + +頂点をA,B,C,Dとすると,4つの面は + +\hspace{10mm} △ABC,△ABD,△ACD,△BCD + +である。 + +% \begin{center} \input{Fig/concatobj} \end{center} + +頂点のリスト[A,B,C,D] に対し,Aから順に番号を + +つけると,各面の頂点の順番は + +\hspace{20mm}[1,2,3],[1,2,4],[1,3,4],[2,3,4] + +と表現できる。 + +頂点のリストと,この面リストを組にして [[A,B,C,D],[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]] としたものを「面データ」という。この面データを使って,多面体を描画するのが VertexEdgeFace() である。 + +多面体の陰線処理は2通りある。ひとつは,多面体を線画と考えて,隠れる部分だけを処理する方法で,Skeletonparadata() を用いる。\hyperlink{concatobj}{Concatobj()} の例を参照のこと。 + +もうひとつは,面と考えて,面に隠れる部分を点線で描いたり,非表示にしたりする方法で,Phparadata() を用いる。 \hyperlink{phparadata}{Phparadata()}の例を参照のこと。 + +\begin{description} + + %-----------------Concatobj ----------------------------------------------- +\hypertarget{concatobj}{} +\item[関数]Concatobj(リスト,option) +\item[機能]いくつかのobjデータを結合する +\item[説明]多面体の各面の頂点リストから面データ(頂点リストと面リスト)を作る。 + +たとえば,\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]]] が返される。 + +\vspace{\baselineskip} +【例】4点A,B,C,Dを幾何点として作り,これを頂点とする四面体を描く。 + +\begin{verbatim} +Putpoint3d("A",2*[0,0,sqrt(3)]); +Putpoint3d("B",2*[1,-1/sqrt(3),0]); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0]); +Putpoint3d("D",2*[-1,-1/sqrt(3),0]); +phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); +VertexEdgeFace("1",phd); +Skeletonparadata("1"); +Letter3d([A3d,"ne","A",B3d,"sw","B",C3d,"se","C",D3d,"e","D"]); +\end{verbatim} + +\begin{center} \input{Fig/concatobj} \end{center} + +<参考1> + +幾何点を作らないで四面体を描くのであれば, + +\begin{verbatim} +a=2*[-1,-1/sqrt(3),0]; +b=2*[1,-1/sqrt(3),0]; +c=2*[0,sqrt(3)-1/sqrt(3),0]; +d=2*[0,0,sqrt(3)]; +phd=Concatobj([[a,b,c],[a,b,d],[a,c,d],[b,c,d]]); +\end{verbatim} + +としてもよい。 + +\vspace{\baselineskip} +<参考2> +四面体のような凸型多角形の場合は,CindyScriptの convexhull3d() 関数を用いて次のようにすることができる。面リストではなく頂点リストを与えるだけなので手間を省くことができる。 + +\begin{verbatim} +a=2*[0,0,sqrt(3)]; +b=2*[1,-1/sqrt(3),0]; +c=2*[0,sqrt(3)-1/sqrt(3),0]; +d=2*[-1,-1/sqrt(3),0]; +phd=convexhull3d([a,b,c,d]); +\end{verbatim} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +%-------------------VertexEdgeFace ----------------------------------------------- +\hypertarget{vertexedgeface}{} +\item[関数]VertexEdgeFace(name,面データ,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をとっておき,このリストを引数に与えると,四面体が描かれる。 + +生成されるプロットデータは, + +phv3d:頂点のリスト + +phe3d:辺のリスト + +phf3d:面リスト + +なお,それぞれ末尾にnameが付加される。 + +\vspace{\baselineskip} +【例】4点A,B,C,Dを取り,正四面体ABCDを描く +\begin{verbatim} +Putpoint3d("A",2*[-1,-1/sqrt(3),0]); +Putpoint3d("B",2*[1,-1/sqrt(3),0]); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0]); +Putpoint3d("D",2*[0,0,sqrt(3)]); +phd=[[A,B,C,D],[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]]; +VertexEdgeFace("1",phd); +\end{verbatim} + \begin{center} \input{Fig/vertex01} \end{center} +面リストは,Congatobj() を使って作ることができる。陰線処理して描く場合も含め,\hyperlink{concatobj}{Concatobj()} の例を参照のこと。 + +\vspace{\baselineskip} + %------------------Phparadata ----------------------------------------------- +\hypertarget{phparadata}{} +\item[関数]Phparadata(name,name2,options) +\item[機能]多面体を陰線処理して描く +\item[説明]多面体のプロットデータをVertexEdgeFace() で作る。このプロットデータに対し,隠れている面(辺)を陰線処理して表示する。第1引数は通常のname,第2引数のname2は,VertexEdgeFace() で与えたnameと同じものとする。 + +optionsは,全体の線種("dr,2"など)と,陰線の線種を"Hidden=線種" で指定できる。 初期設定では陰線は表示しない。 + +\vspace{\baselineskip} +\begin{layer}{150}{0} +\putnotese{80}{-5}{ \input{Fig/phparadata04}} +\end{layer} + +【例】四面体を描く。 +\begin{verbatim} +Putpoint3d("A",2*[-1,-1/sqrt(3),0]); +Putpoint3d("B",2*[1,-1/sqrt(3),0]); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0]); +Putpoint3d("D",2*[0,0,sqrt(3)]); +phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); +VertexEdgeFace("1",phd); +Phparadata("1","1",["Hidden=do"]); +\end{verbatim} + +なお,VertexEdgeFace() で四面体が描かれるが,Phparadata() により非表示になる。 +Figureボタンで描き出せば正しく出力されるので,Phparadata() を実行する前に画面上に表示して確認してからPhparadata() を実行するとよい。 + +\vspace{\baselineskip} +【例】切頂二十面体を描く。 + +小林・鈴木・三谷による多面体データ\verb|polyhedrons_obj|を用いて,s06の切頂二十面体(サッカーボール型)を描く。 \verb|polyhedrons_obj| は KeTCindyシステムの data ディレクトリにあるので,Setdirectory() でカレントディレクトリを作業ディレクトリと切替ながら出力する。 +\begin{verbatim} +Setdirectory( Dirhead+"/data/polyhedrons_obj"); +phd=Readobj("s06.obj",["size=3"]); +Setdirectory(Dirwork); +VertexEdgeFace("s06",phd); +Phparadata("1","s06"); +\end{verbatim} +VertexEdgeFace() の name は通常の "1" でもよい。その場合は,\verb|Phparadata("1","1");| とするが,わかりにくいので上のようにした。 + +実行すると,Cinderellaの描画面は次のように頂点だけが描かれる。 + +\vspace{\baselineskip} +\begin{center} + \includegraphics[bb=0 0 726.04 365.02 , width=10cm]{Fig/phparadata01.pdf} +\end{center} + +\vspace{\baselineskip} +全体の線種と,陰線の線種を + +\verb|Phparadata("1","s06",["dr,2","Hidden=do"]);| + +で指定したのが下図右である。 + + \begin{center}\scalebox{0.8} {\input{Fig/phparadata02}} \hspace{5mm}\scalebox{0.8}{\input{Fig/phparadata03}} \end{center} + +【注意】 + +polyhedrons obj のデータを使って,続けて異なる多面体を描きたい場合は注意が必要である。Readobj()だけを変更して別のデータを読めばよさそうであるが,前のデータが残っていてうまくいかない。VertexEdgeFace() のname を(したがって,Phparadata()の第2引数も)書き換えるか,作業フォルダ(fig) の中身を削除してから実行する。たとえば,上のコードで切頂二十面体を描いた後,正八面体(r02)を描こうとするならば, +\begin{verbatim} +Setdirectory( Dirhead+"/data/polyhedrons_obj"); +phd=Readobj("r02.obj",["size=3"]); +Setdirectory(Dirwork); +VertexEdgeFace("2",phd); +Phparadata("1","2"); +\end{verbatim} +のようにする。 + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------- Nohiddenbyfaces ----------------------------------------------- +\hypertarget{nohiddenbyfaces}{} +\item[関数]Nohiddenbyfaces(name,PD1,PD2,option1,option2) +\item[機能]面に対し曲線を陰線処理する +\item[説明]PD2で与えられた面に対し,曲線PD1の面に隠れている部分を陰線処理する。 + +引数PD1を省略するとすべての曲線が対象となる。陰線処理された線は初期設定では点線で表される。この線種はoption2で変更できる。たとえば,["da"] とすると破線になる。["nodsip"] とすると,陰線は表示されない。option1は曲線全体のoptionであるので,option2 だけを指定する場合は,option1 として空リスト[ ] が必要である。 +option2では,"Eps=" で,陰線処理時の許容限界を設定できる。陰線処理がうまくいかないときは,この値を \verb|Eps=10^(-4)| のように変えてみるとよい。初期設定は \verb|Eps=10^(-2)|。 + +\vspace{\baselineskip} +【例】座標平面上に正四面体を描き,各軸と正四面体の辺を陰線処理する。(下図左) +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); +Putpoint3d("A",2*[-1,-1/sqrt(3),0]); +Putpoint3d("B",2*[1,-1/sqrt(3),0]); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0]); +Putpoint3d("D",2*[0,0,2*sqrt(6)/3]); +phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); +VertexEdgeFace("1",phd); +Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} + +\verb|VertexEdgeFace("1",phd);| によって,辺,頂点,面のプロットデータが作られる。\verb|phf3d1| は,面のプロットデータである。 + +ここで,\verb|Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["da"]); | とすると,座標軸は陰線処理されず,正四面体の辺(\verb|phe3d1|)だけが陰線処理されて破線で描かれる。四面体は太く描かれる。(下図右) + +\vspace{\baselineskip} +\begin{center} \input{Fig/nohiddenbyfaces1}\input{Fig/nohiddenbyfaces2} \end{center} +同様に, + +\verb|Nohiddenbyfaces("1","ax3d","phf3d1",[],["da"]);| + +とすれば,座標軸だけが陰線処理されて破線で描かれる。 +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +\end{description} + +%================== 3D曲面 =============== +\subsubsection{曲面} + +曲面の描画には,ワイヤーフレームモデルとサーフェスモデルがある。ワイヤーフレームモデルは,曲面を編目で表すものであり,サーフェスモデルは編目のない面として,その輪郭線を描くものである。 + + \begin{center} \input{Fig/surfacemodel} \end{center} + +%\hspace{20mm}ワイヤーフレームモデル \hspace{10mm}サーフェスモデル + +KeTCindyでは,それぞれ次の関数を用いて描画する。 +\begin{tabbing} +12345678901234567890123456789012345678\=\kill +陰線処理をしないワイヤーフレームモデル \>Sf3data(name,form,options)\\ +サーフェスモデル \>Sfbdparadata(name,form,options)\\ +サーフェスモデルにワイヤーを描く \>Wireparadata(name,PD,form,n1,n2,options) +\end{tabbing} +ワイヤーフレームモデルで陰線処理をするためには,面のデータが必要なので,Sfbdparadata() で描画した後,Wireparadata()で描画する。 + +また,サーフェスモデルの描画では,陰線処理に時間がかかるため,C言語の使用を前提としている。したがって,C言語を用いて描画を行う ExeccmdC() を併用する。 + +引数の form は,方程式 と,変数の定義域を文字列のリストにしたものである。方程式のパターンは次の3通りがある。 + +(1) $z=f(x,y)$ + + \hspace{5mm} 【例】式:$z=x^2-y^2$ + + \hspace{15mm} 定義域:$x=(-2,2) , y=(-2,2)$ + +(2) $z=f(x,y),x=g(r,t),y=h(r,t)$ + + \hspace{5mm} 【例】式:$z=4-(x^2+y^2) , x=r\cos t , y=r\sin t$ + +\hspace{15mm} 定義域:$r=(0,2) , t=(0,2\pi)$ + +(3) $x=f(u,v),y=g(u,v),z=h(u,v),$ + + \hspace{5mm} 【例】式:$x=2\sin u \cos v , y=2\sin u \sin v, z=2\cos u $ + +\hspace{15mm} 定義域:$u=(0,\pi) , v=(0,2\pi)$ + +ここで,(2)と(3)は媒介変数型で,$x,y,z$ それぞれの式と,媒介変数2つの定義域からなっている。そのままでは区別がつかないので,引数として与えるときは,(3) の型には,識別文字として "p" を先頭に付加する。 + +また,定義域については,開区間でとる場合と閉区間でとる場合がある。その区別を境界指定として"ewsn"で表す(ともに閉区間)。"ewsn" の意味は次のように考える。 + +変数が $u,v$ のとき,$u,v$平面において,$a \leq u \leq b,c \leq v \leq d$ の矩形を考え,境界値を東西南北(ewsn)で示す。それぞれの文字が書かれたときは境界値を含む。 + + \begin{center} \input{Fig/ewsn} \end{center} + +この境界指定を最後に付加するが,省略することもでき,省略した場合は初期値の "ewsn" (閉区間)とする。ともに開区間とする場合は,"" とする。ただし,陰線処理をしない Sf3data() では,境界にも線を引くので,この指定は無効となる。 + +具体的な例を示そう。 + +次は,円錐の form である。(formは form data を短縮した fd がよく使われる) + +\vspace{\baselineskip} +\verb|fd=["p","x=r*cos(t)","y=r*sin(t)","z=2*(2-r)","r=[1,2]","t=[0,2*pi]","ew"]| + +\vspace{\baselineskip} +"ew" は $1 \leq r \leq 2$ であることを示す。したがって,円錐台の上面と底面が表示される。 + +これを "e" とすると $1 <r \leq 2$ となり,上面が表示されない。 + +また,これを "w" とすると $1 \leq r < 2$ となり,底面が表示されない。 + +さらに,"ewn" あるいは "ews" としたり,指定を略して初期値の "ewsn" とすると,$t=(0,2\pi)$ の左右いずれかの値が含まれることになり,不要な境界線が現れる。 + +\vspace{\baselineskip} +\hspace{12mm}"ew" \hspace{25mm}"e" \hspace{25mm}"w" \hspace{25mm}"ewn" + +\input{Fig/frustumew} \input{Fig/frustume} \input{Fig/frustumw} \input{Fig/frustumewn} + +球面を描く場合はこの点で留意することがある。球面をサーフェスモデルで描くと単に円にしか見えないので,多くの場合はサーフェスモデルで描いた球面に Wireparadata() で陰線処理したワイヤーを入れることになるだろう。その場合,Wireparadata() では境界線には線を引かないので,境界指定を "s" として,境界線を引く必要がある。境界指定を "" とすると,経線が1本足りなくなるので注意されたい。具体例は,Wireparadata() に例示してある。 + +\begin{description} + +%------------------ Sf3data ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{sf3data}{} +\item[関数]Sf3data(name,リスト,options) +\item[機能]陰線処理なしの曲面をワイヤーフレームモデルで描く +\item[説明]optionsは,メッシュの密度と解像度(各変数に対応する分割数)。 + +メッシュ密度は,縦横で "Wire=[a,b]" で指定。初期値はa,bとも20。 + +解像度は,"Num=[a,b]" で指定。初期値はa,bとも25。 + +\begin{layer}{150}{0} +\putnotese{88}{10}{ \input{Fig/saddle1}} +\end{layer} + +\vspace{\baselineskip} +【例】 $z=f(x,y)$ 型 + + $z=x^2-y^2$を定義域$x=[-2,2],y=[-2,2]$ で描画する。 + +\verb| fd=["z=x^2-y^2","x=[-2,2]","y=[-2,2]"];|\\ +\verb| Sf3data("1",fd)|; + +メッシュの数を縦横とも10,解像度をx,yとも10にすると + + メッシュ密度,解像度とも下げるので粗い描画となる。 + +\verb|Sf3data("1",fd,["Num=[10,10]","Wire=[10,10]"]);| + +\vspace{\baselineskip} +【例】$z=f(x,y),x=g(r,t),y=h(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);| + +\begin{center} \input{Fig/parabola} \input{Fig/sf3ddata3} \end{center} + +(3) $x=f(u,v),y=g(u,v),z=h(u,v),$ 型 + +この場合,(2)と区別するために,"p" を先頭につけておく。 + + \vspace{\baselineskip} + 【例】球面 + + \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);| + +\begin{center} \input{Fig/sf3ddata4} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------ Sfbdparadata ----------------------------------------------- +\hypertarget{sfbdparadata}{} +\item[関数]Sfbdparadata(name,式,options) +\item[機能]サーフェスモデルの輪郭線を描く +\item[説明]この関数はデータを作るだけなので,表示するには ExeccmdC() を併用する。 + +optionsは,"Wait=n","r","m",および線種。Wait の初期値は30。 + + "r","m"に関しては, + +\hspace{5mm} オプションなしまたは,”” のとき + +\hspace{10mm}i) データファイルがなければ,新しく作る + +\hspace{10mm}ii) データファイルが既にあればそれを読み込む + +\hspace{5mm}"m"のとき,強制的にデータファイルを作り直す。 + +\hspace{5mm}"r" のとき,すでにあるデータファイルを読み込む。 + +この処理は時間がかかるため,この関数を実行した状態で画面上のスライダやその他の点を動かそうとすると反応が悪くなる。そこで,Isangle() または Isptselected() を用いて,スライダの点を選択しているときはワイヤフレームモデルを描画するようにするとよい。 + +なお,C言語の環境がない場合は,ExeccmdC() が使えないので,SfbdparadataR(name,式,optons1,optons2) を使う。options2には陰線の表示方法について "nodisp" または線種 を指定する。 初期設定は"nodisp" 。options2のみ指定するときは,options1に [""] (空文字)を書いておく。 + +作図例は 次の ExeccmdC を参照のこと。 + +%------------------- ExeccmdC ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{execcmdc}{} +\item[関数]ExeccmdC(name,options1,options2) +\item[機能]曲面を表示する。戻り値は,対象にしたプロットデータのリスト。 +\item[説明]データが作成された曲面を表示する。 + +options1 には"r","m", "Wait=n" と輪郭線の線種が指定できる。 + +options2 には 軸の陰線について "nodisp" または線種が指定できる。 初期設定は "do"。 + +options2だけを指定したい場合は,options1 を空リスト [ ] にする。 + +\vspace{\baselineskip} + +【例】サドル面 + +\begin{layer}{150}{0} +\putnotese{85}{0}{ \input{Fig/sfbdpara01}} +\putnotese{85}{45}{ \input{Fig/sfbdpara02}} +\end{layer} + +陰線を消去して表示 +\begin{verbatim} +fd=["z=x^2-y^2","x=[-2,2]","y=[-2,2]"]; +if(Isangle(), +Sf3data("1",fd); +, +Startsurf(); +Sfbdparadata("1",fd); +ExeccmdC("1",[],["nodisp"]); + ); +\end{verbatim} +全体を実線で太めにして,陰線は初期設定の + +点線で表示。 + +\verb|ExeccmdC()| を変更する。 + +\verb|ExeccmdC("1",["dr,2"]);| + +\vspace{10mm} +【例】放物面: 式を変更する。 +\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"]; +\end{verbatim} + + 陰線を消去(下図左):\verb|ExeccmdC("1",[],["nodisp"]);| + + 陰線を破線で表示(下図右):\verb|ExeccmdC("1",[],["da"]);| +\begin{center} \input{Fig/sfbdpara03}\input{Fig/sfbdpara04} \end{center} + +【例】曲面を2つ表示するときは,Sfbdparadata() の name は "1" と "2" にするが,まとめて \verb|ExeccmdC("1")| で表示できる。 + +\begin{verbatim} +fd=[ + "p", + "x=r*cos(t)","y=r*sin(t)","z=2*(2-r)", + "r=[1,2]","t=[0,2*pi]","ew" +]; +fd2=[ + "p", + "x=r*cos(t)-3","y=r*sin(t)+3","z=2*(2-r)", + "r=[0,2]","t=[0,2*pi]","ew" +]; +if(!ptselected(), + Startsurf(); + Sfbdparadata("1",fd); + Sfbdparadata("2",fd2); + ExeccmdC("1"); +); +\end{verbatim} + +\begin{center} +\input{Fig/sfbdpara05} +\end{center} + +\vspace{\baselineskip} +【例】トーラスを描く:軸は非表示にしておく。 + +\begin{layer}{150}{0} +\putnotese{70}{-10}{ \input{Fig/wirepara5}} +\end{layer} + +\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"]; + if(Ptselected(), + Sf3data("1",fd); +, + Startsurf(); + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,12,12,[],["nodisp"]); + ExeccmdC("1",[],["nodisp"]); + ); +\end{verbatim} +%\vspace{\baselineskip} + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%-------------------Wireparadata----------------------------------------------- +\hypertarget{wireparadata}{} +\item[関数]Wireparadata(name,PD,式,整数,整数,optons) +\item[機能]Sfbdparadataで作成した曲面について,陰線処理したワイヤーを描く +\item[説明]PDは,第3引数の式を用いてSfbdparadata()で描いたサーフェスモデルのプロットデータ名。第4,第5引数は分割線の数。 + +options には "r","m","Wait=n" が指定できる。 + +Sfbdparadata() とペアで使い,そのあとに ExeccmdC で描画する。 + +C言語の環境がない場合は,ExeccmdC() が使えないので,WireparadataR(name,PD,式,整数,整数,optons1,optons2) を使う。options2には陰線の表示方法について "nodisp" または線種 を指定する。 初期設定は"nodisp" 。options2のみ指定するときは,options1に [""] (空文字)を書いておく。 + +\begin{layer}{150}{0} +\putnotese{85}{5}{ \input{Fig/wirepara1}} +\end{layer} + +%\vspace{\baselineskip} +【例】 + +サドル面 + +\begin{verbatim} +fd=["z=x^2-y^2","x=[-2,2]","y=[-2,2]"]; +if(Isangle(), +Sf3data("1",fd); +, +Startsurf(); +Sfbdparadata("1",fd); +Wireparadata("1","sfbd3d1",fd,4,5); +ExeccmdC("1"); +); +\end{verbatim} + +回転放物面:次を変更 + +\begin{layer}{150}{0} +\putnotese{85}{-5}{ \input{Fig/wirepara2}} +\end{layer} +\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"]; +Wireparadata("1","sfbd3d1",fd,5,7); +\end{verbatim} +\vspace{10mm} + +球面 + +\begin{layer}{150}{0} +\putnotese{80}{15}{ \input{Fig/wirepara3}} +\end{layer} +\begin{verbatim} + fd=["p","x=sin(u)*cos(v)","y=sin(u)*sin(v)","z=cos(u)", + "u=[0,pi]","v=[0,2*pi]","s"]; + if(Ptselected(), + Sf3data("1",fd); + , + Startsurf(); + Sfbdparadata("1",fd); + Wireparadata("1","sfbd3d1",fd,12,12); + ExeccmdC("1"); + ); +\end{verbatim} + +\vspace{8mm} + + +%------------------- Crvsfparadata ----------------------------------------------- + +\hypertarget{crvsfparadata}{} +\item[関数]Crvsfparadata(name,PD1,PD2,式) +\item[機能]曲面による曲線の陰線処理を行う。 +\item[説明]曲線PD1と曲面PD2について,PD1はPD2による陰線処理を行う。 + +Crvsfparadata() のあとに ExeccmdC() でまとめて描画する。 + +C言語が使えない場合は,CrvsfparadataR(name,PD1,PD2,式,options1,options2) を使う。 +options1 は分割数と誤差限界, options2 は陰線の線種。 + +【例】回転放物面と座標軸,線分を陰線処理したデータを作って表示する。線分の端点A,Bはあらかじめ作図しておく。 + +ExeccmdC()の 初期設定では陰線は点線で表示される。(下図左) +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); +Putpoint3d(["A",[0,-3,0],"B",[0,3,3]]); +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"]; +Startsurf(); +Sfbdparadata("1",fd); +Crvsfparadata("1","AB3d","sfbd3d1",fd); +Crvsfparadata("2","ax3d","sfbd3d1",fd); +ExeccmdC("1"); +\end{verbatim} +ExeccmdC()の options2を ["nodisp"] にすると,陰線は非表示になる。(下図右) +\begin{verbatim} +ExeccmdC("1",[],["nodisp"]); +\end{verbatim} + +\begin{center}\scalebox{0.9}{ \input{Fig/crvsfparadata2}}\hspace{5mm} \scalebox{0.9}{\input{Fig/crvsfparadata1}} \end{center} + +戻り値を使うと,Changestyle3d() を使って陰線のスタイル(線種,色)を変えることができる。戻り値の内容は,コンソールに「readoutdata from template3D1.txt : 」として表示されるので,これをテキストエディタで開き,操作対象を決めればよい。たとえば,上の左図で,線分ABの陰線はリストの4番目の crvsfh3d1 なので, + +\begin{verbatim} +ret=ExeccmdC("1"); +Changestyle3d(ret_4,["da","Color=red"]); +\end{verbatim} + +とすると,赤の破線にすることができる。 + +【例】球面で座標軸を陰線処理し,球面の陰線は非表示で表す。 + +\begin{layer}{150}{0} +\putnotese{70}{-5}{ \input{Fig/wirepara4}} +\end{layer} + +\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]",""]; +if(Isangle(), +Sf3data("1",fd); +, +Startsurf(); +Sfbdparadata("1",fd); +Wireparadata("1","sfbd3d1",fd,12,12,[],["nodisp]); +Crvsfparadata("1","ax3d","sfbd3d1",fd); +ExeccmdC("1"); +); +\end{verbatim} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} +%\newpage +%================== 3Dプロットデータの操作 =============== +\subsection{プロットデータの操作} + +\begin{description} +%------------------- Datalist2d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{datalist}{} +\item[関数]Datalist2d() +\item[機能]画面上のプロットデータのリストを取得する +\item[説明]画面に描かれているすべてのプロットデータのリストを返す。 + +空間図形は,Cinderellaの画面上に射影し表示する。そのため,KeTCindy3Dは,空間におけるプロットデータと,画面上に表示するプロットデータの2つを作っている。Datalist2d()では,画面上に表示するプロットデータのリストを返す。 + +\vspace{\baselineskip} +【例】 +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); +Putpoint3d(["A",[0,-3,0],"B",[0,3,3]]); +Spaceline("1",[A,B]); +println("PD="+Datalist2d()); +\end{verbatim} +とすると,コンソールにPD=[ax2d,AB2d] と表示される。ax2dは座標軸のプロットデータ ax3d に,AB2d は線分ABのプロットデータ AB3d に対応している。 +%------------------- Datalist3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{datalist}{} +\item[関数]Datalist3d() +\item[機能]空間のプロットデータのリストを取得する +\item[説明]空間に描かれているすべてのプロットデータのリストを返す + +\vspace{\baselineskip} +【例】 +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,5]"); +Putpoint3d(["A",[0,-3,0],"B",[0,3,3]]); +Spaceline("1",[A,B]); +println("PD="+Datalist3d()); +\end{verbatim} +とすると,コンソールにPD=[ax3d,AB3d] と表示される。 + +\vspace{\baselineskip} + +%------------------- Changestyle3d ----------------------------------------------- +\hypertarget{changestyle3d}{} +\item[関数]Changestyle3d(リスト,リスト) +\item[機能]3Dプロットデータの属性を変更 +\item[説明]第1引数のプロットデータの属性を,第2引数に変更する。 + +たとえば,補助線など,画面には描いてもTeXに書き出さない線を描画するときは,optionに["notex"] をつけるが,これをあとから付加したい場合に利用する。プロットデータはリストにできるので,複数のプロットデータの属性をまとめて変更することができて便利である。 + +\vspace{\baselineskip} +【例】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} + +%------------------- Intersectcrvsf ----------------------------------------------- +\hypertarget{intersectcrvsf}{} +\item[関数]Intersectcrvsf(name,PD,式) +\item[機能]曲線と曲面の交点の座標を求める +\item[説明]PDは曲線のプロットデータ。式は曲面の式。 + +曲面は,Sfbdparadata()でデータを作成し,ExeccmdC()で表示しておく。交点の座標は,"intercrvsf"+name に代入される。コマンドの実行順序は次の例のようにする。 + +\begin{layer}{150}{0} +\putnotese{80}{40}{ \includegraphics[bb=0 0 149.51 121.51 , height=4cm]{Fig/Intersectcurvsf.pdf}} +\end{layer} + +\vspace{\baselineskip} +【例】回転放物面と線分の交点の座標を表示する。 +\begin{verbatim} +Putpoint3d(["A",[0,-3,0],"B",[0,3,2]]); +Spaceline("1",[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" +]; +Startsurf(); +Sfbdparadata("1",fd); +Intersectcrvsf("1","sl3d1",fd); +ExeccmdC("1",[""]); +println("Intersect="+intercrvsf1); +Pointdata3d("1",intercrvsf1); +\end{verbatim} +実行すると,コンソールに + +\verb| Intersect=[[0,1.57,1.52],[0,-1.91,0.36]] | + +のように表示され,画面には交点が表示される。 + + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------- IntersectsgpL ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{intersectsgpL}{} +\item[関数]IntersectsgpL(点名,線分,面,描画方法) +\item[機能]空間の線分(直線)と平面の交点を求める。 +\item[説明]引数の線分は線分の端点を "A-B" の形もしくは空間座標のリストで与える。 + +引数の面は,面内の3点を "C-D-E" の形もしくは空間座標のリストで与える。 + +戻り値は,[pt,flag1,flag2,val1,val2] + +pt:直線と平面の交点の座標。直線と平面が平行で交点が存在しない場合は空リスト[] + +flag1 : 交点が線分内にあれば true ,なければ false + +flag2 : 交点が面内にあれば true,なければ false + +val1,val2 : 線分についてのパラメータ値,平面についてのパラメータ値 + +描画方法は,"put" または "i" , "e" 。 + +\hspace{10mm} put : 幾何点を作る + +\hspace{10mm} i : 線分内にあれば点を描く + +\hspace{10mm} e :平面で交われば点を描く + +\vspace{\baselineskip} +【例】交点の有無と戻り値 + +次のスクリプトで\verb|p2| を変えたときの戻り値の \verb|flag1, flag2| + +\begin{verbatim} +p1=[1,-1,0]; +p2=[0,0,1/2]; +p3=[0,1,0]; +p4=[-1,0,0]; +p5=[0,0,1]; +Spaceline("1",[p1,p2]); +Spaceline("2",[p3,p4,p5,p3]); +ret=IntersectsgpL("P",[p1,p2],[p3,p4,p5],"put"); +println("flag1="+ret_2+": flag2="+ret_3); +\end{verbatim} + +\begin{layer}{150}{0} +\putnotese{10}{15}{ \input{Fig/wire01}} +\putnotese{60}{15}{ \input{Fig/wire02}} +\end{layer} + + \begin{verbatim} +p2=[0,0,1/2]; p2=[-1,1,1]; +flag1=false : flag2=trueflag1=true : flag2=true +\end{verbatim} + +\newpage%\vspace{55mm} +\begin{layer}{150}{0} +\putnotese{10}{15}{ \input{Fig/wire03}} +\putnotese{60}{15}{ \input{Fig/wire04}} +\end{layer} + + \begin{verbatim} + p2=[1,2,1]; p2=[1,0,1/2]; + flag1=true : flag2=false flag1=false : flag2=false +\end{verbatim} + +\vspace{30mm} +【例】立方体を平面で切った図を描く。 + + いろいろな手順が考えられるが,ここでは次の手順で描く。 + + (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]); +Putpoint3d("B",[Hn,0,Hn]); +Putpoint3d("C",[Hn,Hn,Hn]); +Putpoint3d("D",[0,Hn,Hn]); +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); +Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} +スクリプトを実行後,点E,F,Gをドラッグして適当な位置の断面にする。 + +\begin{center}\includegraphics[bb=0 0 713.04 327.02 , width=10cm]{Fig/IntersectsgpL0.pdf}\end{center} + +できた図は下図左。これに,次のスクリプトを追加すれば,断面上方の立方体の各辺も点線で描かれる。(下図右) +\begin{verbatim} +Spaceline("1",[E,B,F],["do"]); +Spaceline("2",[B,C,M],["do"]); +Spaceline("3",[C,D,N],["do"]); +Spaceline("4",[D,G],["do"]); +\end{verbatim} +\begin{center} \input{Fig/IntersectsgpL1}\input{Fig/IntersectsgpL2} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------- Sfcutparadatacdy ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{sfcutparadatacdy}{} +\item[関数]Sfcutparadatacdy(name,面,曲面,options) +\item[機能]平面と曲面の交線を求める。 +\item[説明]面の方程式はx,y,zの方程式,曲面は媒介変数表示で与える。 + +\vspace{\baselineskip} +【例】円錐を平面$y+2z=3$で切った断面を表示する。 + +\begin{layer}{150}{0} +\putnotese{70}{0}{\input{Fig/sfcut}} +\end{layer} +\begin{verbatim} +fd=[ + "p", + "x=r*cos(t)","y=r*sin(t)","z=2*(2-r)", + "r=[0,2]","t=[0,2*pi]","e" +]; +Startsurf(); +Sfbdparadata("1",fd); +Sfcutparadatacdy("1","y+2*z=3",fd); +ExeccmdC("1"); +\end{verbatim} +%\begin{center} \input{Fig/sfcut} \end{center} + + + %------------------Partcrv3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{partcrv3d}{} +\item[関数]Partcrv3d(name,始点,終点,PD) +\item[機能]部分曲線のプロットデータを作成する +\item[説明]曲線PDにおいて,始点から終点までのプロットデータを作成する。 + +始点と終点は,プロットデータの番号もしくは曲線上にとった点の識別名で示す。 + +\vspace{\baselineskip} +【例】螺旋を描き一部分を太くする。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"| は,部分曲線のプロットデータである。 + +\begin{center} \input{Fig/partcrv3d1} \end{center} + +\vspace{\baselineskip} +【例】稲妻状の螺旋を点線で描き,その一部を実線にする。位置はプロットデータの番号で示す。小数にすると曲線を分割している線分の途中の位置になる。 +\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} +\begin{center} \input{Fig/partcrv3d2} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------Reflectdata3d----------------------------------------------- +\hypertarget{reflectdata3d}{} +\item[関数]Reflectdata3d(name , PDlist , list , options) +\item[機能]PDの鏡映を作る +\item[説明]第3引数のタイプにより,点に関する鏡映,直線に関する鏡映,面に関する鏡映を作る。戻り値は鏡映したプロットデータのリスト。 + +\vspace{\baselineskip} +【例】点A,B,C,D,Eを空間にとり,三角形ABCの鏡映を作る。 + +\begin{verbatim} +Putpoint3d(["A",[0,-2,0],"B",[2,-2,0],"C",[1,-2,2],"D",[1,0,1],"E",[1,0,0]]); +Spaceline("1",[A,B,C,A]); +\end{verbatim} + +で点をとり,三角形を描いておく。 + +点Dに関する鏡映 + + \verb|Reflectdata3d("1",["sl3d1"],[D3d],["Color=blue","dr,2"]);| + +\hspace{20mm} \input{Fig/reflectdata3d01} + +直線DEに関する鏡映 + + \verb|Reflectdata3d("1",["sl3d1"],[D3d,E3d],["Color=blue","dr,2"]);| + +\hspace{20mm} \input{Fig/reflectdata3d02} + +平面BDEに関する鏡映 + +\verb|Reflectdata3d("1",["sl3d1"],[D3d,E3d,B3d],["Color=blue","dr,2"]);| + +\hspace{20mm} \input{Fig/reflectdata3d03} + + + %------------------Reflectpoint3d----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{reflectpoint3d}{} +\item[関数]Reflectpoint3d(座標,リスト) +\item[機能]点の鏡映点を求める +\item[説明]第2引数のタイプにより,点に関する鏡映,直線に関する鏡映,面に関する鏡映のそれぞれの点の座標を返す。 + +\vspace{\baselineskip} +【例】点A,B,C,Dを空間にとり,点Aの鏡映点の座標を求める。 + +点Bに関する鏡映点\verb|Reflectpoint3d(A3d,[B3d]);| + +直線BCに関する鏡映点\verb| Reflectpoint3d(A3d,[B3d,C3d]);| + +平面BCDに関する鏡映点\verb| Reflectpoint3d(A3d,[B3d,C3d,D3d]);| + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + %------------------Rotatedata3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{rotatedata3d}{} +\item[関数]Rotatedata3d(name,PDリスト,vec,角度,options) +\item[機能]プロットデータを回転 +\item[説明]プロットデータを,原点を始点とするベクトルvec 周りに回転する。複数のプロットデータをまとめて回転することができる。戻り値は回転したプロットデータのリスト。 + +options として,中心点(vecの始点),線種を指定することができる。 + +\vspace{\baselineskip} +【例】コード例と結果を示す。 +\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]]); +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{Fig/rotatedata3d01} \hspace{5mm} \input{Fig/rotatedata3d02} + +%\begin{flushright}\hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + %------------------Rotatepoint3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{rotatepoint3d}{} +\item[関数]Rotatepoint3d(座標, vec , 角度, [点] ) +\item[機能]点の位置を回転する +\item[説明]点をvecの周りに回転する。角度は弧度法で与える。 + +第4引数に点を与えた場合,vecの始点が第4引数の位置になる。デフォルトは原点 + +点Aを,$(0,-1,0)$に置いたときの記述例と戻り値 + +\verb|Putpoint3d("A",[0,-1,0]);| \\ +\verb|Rotatepoint3d(A3d,[0,0,1],pi/2);|// 戻り値は [1,0,0]\\ +\verb|Rotatepoint3d(A3d,[0,0,1],pi/2,[1,1,0]);| // 戻り値は [3,0,0]\\ + + %------------------Scaledata3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{scaledata3d}{} +\item[関数]Scaledata3d(name , PDリスト , vec , [中心,options]) +\item[機能]PDを拡大/縮小する。 +\item[説明]点は空間座標,vec は3次元ベクトルで倍率を表す。 + +中心とoptionsはリストで与える。 + +\vspace{\baselineskip} +【例】三角形と円を拡大/縮小する。 + +\begin{verbatim} +Putpoint3d(["A",[0,-2,0],"B",[2,-2,0],"C",[1,-2,2]]); +Spaceline("1",[A,B,C,A]); +Spacecurve("1","[cos(t)+1,sin(t)+1,1]","t=[0,2*pi]",["Num=100"]); +Scaledata3d("1",["sl3d1","sc3d1"],[2,2,2],[[0,0,0],"dr,2"]); +\end{verbatim} + +\hspace{20mm}\input{Fig/scaledata3d} +%------------------Scalepoint3d----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{scalepoint3d}{} +\item[関数]Scalepoint3d(点,vec,中心) +\item[機能]点の位置を拡大/縮小する。 +\item[説明]点は空間座標,vec は3次元ベクトルで与える。 + +\vspace{\baselineskip} +【例】コード例と結果を示す。 + +\begin{verbatim} +Putpoint3d(["A",[2,-1,2]]); +pt=Scalepoint3d(A3d,[3,2,4],[1,1,1]); +Putpoint3d(["B",pt]); +\vspace{\baselineskip} +\end{verbatim} + +点Bの位置は(4,-3,5)になる。 + +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------ Translatedata3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{translatedata3d}{} +\item[関数]Translatedata3d(name,PD,平行移動量) +\item[機能]空間プロットデータを平行移動 +\item[説明]PDで表される図形を,平行移動する。戻り値は平行移動したプロットデータのリスト。 + +\vspace{\baselineskip} +【例】曲線 sc3d1 をy軸方向に2だけ平行移動する。 + +\verb|Translatedata3d("1",["sc3d1"],[0,2,0]);| + +結果として,もとの曲線と平行移動した曲線の2つが描かれる。 + +\vspace{\baselineskip} +【例】多面体の平行移動\\ +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); +\end{verbatim} +\begin{center} \input{Fig/translate01} \end{center} + +%------------------Translatepoint3d( ----------------------------------------------- +\hypertarget{translatepoint3d}{} +\item[関数]Translatepoint3d(座標,平行移動量) +\item[機能]空間点を平行移動 +\item[説明]点を平行移動する。 + +\vspace{\baselineskip} +【例】点A(1,0,0) を(-1,1,1)だけ平行移動した点をBとする。点Aの空間座標は A3d で表される。 +\begin{verbatim} +Putpoint3d(["A",[1,0,0]]); +pt=Translatepoint3d(A3d,[-1,1,1]); +Putpoint3d(["B",pt]); +\end{verbatim} +%\vspace{\baselineskip} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + \end{description} +\newpage +%その他================================== +\subsection{その他} + +\begin{description} + + +%------------------- Perpplane----------------------------------------------- +\vspace{\baselineskip} +\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 となる。 + +\vspace{\baselineskip} +【例】ベクトル $\vec{p}=(1,1,1)$ に垂直で点$(1,1,1)$を通る平面ABCDを描く。 + +点A,B,C,Dは作図ツールで適当に取っておく。正確な位置はスクリプトで決める。 + +\begin{layer}{150}{0} +\putnotese{80}{8}{ \input{Fig/perpplane}} +\end{layer} + +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); +Putpoint3d(["O",[0,0,0]]); +Putpoint3d(["P",[1,1,1]]); +Perpplane("E-F","P",P3d-O3d,"put"); +vec1=2*(E3d-P3d); +vec2=2*(F3d-P3d); +Putpoint3d(["A",P3d+vec1+vec2]); +Putpoint3d(["B",P3d+vec1-vec2]); +Putpoint3d(["C",P3d-vec1-vec2]); +Putpoint3d(["D",P3d-vec1+vec2]); +Spaceline("1",[A,B,C,D,A]); +Arrowdata([O,P],["dr,2"]); +Letter([P,"w","P",A,"ne","A",B,"e","B",C,"ws","C",D,"nw","D",]); +Skeletonparadata("1"); +\end{verbatim} + + %-----------------Perppt( ----------------------------------------------- +\hypertarget{perppt}{} +\item[関数]Perppt(点名,点,点リスト,option) +\item[機能]平面に下ろした垂線の足を求める +\item[説明]第2引数の点から,第3引数の点リストで決まる平面に下した垂線の足を,第1引数の名前の点とする。 + +オプションは次の通り。 初期設定は "draw" + +draw:点を打つ。幾何点は作らない + +put :幾何点を作る + +none:計算だけ行い,点は作図しない。 + +\vspace{\baselineskip} +【例】原点から点ABCを通る平面に下した垂線の足Hの座標を求める。 + + \verb|Perppt("H","O","A-B-C","none");| 表示はされない。 + + \verb|Perppt("H","O","A-B-C");| Hの位置に緑色の点が表示される。 + + \verb|Perppt("H","O","A-B-C","put");| 幾何点Hが作図される。 + +いずれの場合も,Hの座標は変数H3d に代入される + +\vspace{\baselineskip} +作図例 +\begin{verbatim} +Xyzax3data("","x=[-5,5]","y=[-5,5]","z=[-5,4]"); +Putpoint3d("O",[0,0,0]); +Putpoint3d("A",[3,0,0]); +Putpoint3d("B",[0,3,0]); +Putpoint3d("C",[0,0,3]); +Perppt("H","O","A-B-C","put"); +Spaceline("1",[A,B,C,A]); +Spaceline("2",[O,H]); +Letter([A,"nw","A",B,"ne","B",C,"ne","C",O,"nw","O",H,"ne","H"]); +\end{verbatim} + +%\vspace{\baselineskip} +\begin{center}\scalebox{0.9}{ \input{Fig/perppt}} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +%\vspace{\baselineskip} + + %------------------Projcoordpara ----------------------------------------------- +\hypertarget{projcoordpara}{} +\item[関数]Projcoordpara(座標) +\item[機能]投影座標を求める +\item[説明]空間座標を平面に投影した座標を求める。 + +戻り値の第1,第2要素はCinderellaの描画面のx,y座標。第3要素はxy平面に垂直なzの座標で.投影面からの(符号付)距離を表す。 + +\vspace{\baselineskip} +【例】\verb|Projcoordpara([3,1,2]);| + + 戻り値は[-0.65,1.7,3.27] のようになる。(視点によって値は異なる) + + + %------------------Readobj----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{readobj}{} +\item[関数]Readobj(ファイル名) +\item[機能]objファイルを読み込む。 +\item[説明]小林・鈴木・三谷による整面凸多面体のデータは\\ +\hspace*{20mm}\url{http://mitani.cs.tsukuba.ac.jp/polyhedron/}\\ +からダウンロードできる。\verb|polyhedrons_obj|を,例えば,ユーザホームのketcindy作業フォルダに入れておく。 +\begin{verbatim} +Setdirectory(gethome()+"/ketcindy/polyhedrons_obj"); +polydt=Readobj("r02.obj"); +Setdirectory(Dirwork); +\end{verbatim} +これで,r02.obj データが,変数 polydt に代入される。 + +オプションは "size=n"で,n倍したデータにする。負の数にすると上下が反転される。 + +データはKeTCindyのdataフォルダの中にある。したがって,次のようなスクリプトを書く。読み込むのは一度だけなので, Draw スロットではなくInitialization スロットに置けばよいが,コードの可読性を高めるには Draw スロットでもよい。 + +この多面体データは,頂点リストと面リストからなっているが,頂点リストは座標のリストなので,読み込んで表示するときには,点の名称を v1,v2,・・・ とする。 + +読み込んだあとの使い方を含めて例を示す。 + +\begin{layer}{150}{0} +\putnotese{80}{0}{ \input{Fig/readobj}} +\end{layer} + + +\vspace{\baselineskip} +【例】\verb|polydt|を用いて正八面体を描く + + +\begin{verbatim} + +VertexEdgeFace("1",polydt); +Nohiddenbyfaces("1","phf3d1"); +\end{verbatim} + +主なデータは次の通り。 + +\vspace{\baselineskip} + \input{Fig/kobayashi} + +この他にn01〜n92まで整面凸多面体がある。 + +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +%-------------------Xyzcoord----------------------------------------------- +\vspace{\baselineskip} +\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の空間座標が返される。 + +\vspace{\baselineskip} +【例】点Aをドラッグして動かしたとき,Aの座標を求める。 + +\verb|println(Xyzcoord(A.x,A.y,Az.y));| + +により,コンソールに座標が表示される。 + +%-------------------Isangle ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{isangle}{} +\item[関数]Isangle() +\item[機能]角度スライダ(視点スライダ)の選択判断 +\item[説明]角度スライダを選択しているときは true ,そうでないときは false を返す。 + +曲面の描画・陰線処理には時間がかかるため,角度スライダを動かすと反応が悪くなる。そこで,角度スライダを選択しているときは曲面の描画をしないようにすることで反応がよくなる。 + +\vspace{\baselineskip} +【例】放物面の描画 + +次のようにすると,スライダの点を選んでいる間はワイヤフレームモデルが描かれ,画面上の他の部分をクリックして選択状態が解除されると陰線処理された放物面が描かれる。 +\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" +]; +if(Isangle(), + Sf3data("1",fd); + , + Startsurf(); + Sfbdparadata("1",fd); + Crvsfparadata("1","ax3d","sfbd3d1",fd); + ExeccmdC("1"); + ); +\end{verbatim} + +%------------------- Dist3d ----------------------------------------------- +\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} + +%------------------- Embed ----------------------------------------------- +\vspace{\baselineskip} +\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$ でもよい。式,変数リストともに文字列にする。また,基本ベクトルは直交していなくてもよいし,長さが異なってもよいが,縦横同じスケールの直交座標系にするのがわかりやすいだろう。 + +\vspace{\baselineskip} +【例】正三角形と外接円を空間内の平面に埋め込む +\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]"); +Pointdata("1",[A],["Size=3"]); +\end{verbatim} + \begin{center} \input{Fig/embed01} \end{center} + +ここで,Embed()で引き渡す vo,vx,vy については,Rでの変数定義が必要なので(\ketcindy では行わない)Defvar() によって定義をしている。 + +原点,基本ベクトルを,点を作図して次のようにすることもできる。この場合は Defvar() は不要。 + +\begin{verbatim} +Putpoint3d(["A",[3,3,3],"B",[0,1,0],"C",[0,0,1]]); +Embed("1",["cr1","sg1"],"A3d+x*B3d+y*C3d","[x,y]"); +\end{verbatim} +\begin{center} +\includegraphics[bb=0 0 477.02 383.02 , width=6cm]{Fig/embed03.pdf} +\end{center} + +この場合,点B,Cの座標がそのまま基本ベクトルとなっているが,原点Aに対して描画平面上にはB,Cがないので図がわかりにくい。図をわかりやすくするならば次のようにする。 +\begin{verbatim} +Putpoint3d(["A",[3,3,3],"B",[3,4,3],"C",[3,3,4]]); +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]]); +Perpplane("E-F","P",P3d-O3d,"put"); +vec1=3*(E3d-P3d); +vec2=3*(F3d-P3d); +Putpoint3d(["A",P3d+vec1+vec2]); +Putpoint3d(["B",P3d+vec1-vec2]); +Putpoint3d(["C",P3d-vec1-vec2]); +Putpoint3d(["D",P3d-vec1+vec2]); +Spaceline("1",[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]"); +Pointdata("1",[P],["Size=3"]); +Skeletonparadata("1"); +\end{verbatim} + \begin{center} \input{Fig/embed02} \end{center} + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +%------------------- Parapt ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{parapt}{} +\item[関数]Parapt(座標) +\item[機能]点の投影面での座標 +\item[説明]引数の空間座標に対応するCinderellaの描画面の座標を返す。 + +\vspace{\baselineskip} +【例】\verb|Parapt([2,1,5]);| により,点(2,1,5) が表示されている描画面の座標,たとえば [-0.52,3.27]が返される。 +%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} +\vspace{\baselineskip} +%------------------- Invparapt ----------------------------------------------- +\hypertarget{invparapt}{} +\item[関数]Invparapt(座標,PD) +\item[機能]描画面上の座標に対応する曲線上の点の座標を返す +\item[説明]Cinderellaの描画面上の座標を与えて,それに対応する曲線上の3次元座標を返す。 + +空間内の曲線を作図すると,曲線の空間内のプロットデータとともに,描画面上に描くためのプロットデータも作られる。これを利用すると,描画面上の位置から曲線上の座標を求めることができる。 + +\vspace{\baselineskip} +【例】螺旋と線分を描いたとき,描画面上での交点(空間内の交点ではない)に対応する螺旋上の点の座標を求め部分曲線を描く。 + +\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} + \begin{center}\scalebox{0.8}{ \input{Fig/invparapt}} \end{center} + +ここで,sl2d1,sc2d1 は線分と螺旋の描画面上での(平面の)プロットデータである。Intersectcrvs() で平面上の交点の座標(複数あるのでリストが返る)を求め,Invparapt() で対応する螺旋上の点の座標を求めて部分曲線を描いている。実際に交わる点での部分曲線ではないことに注意。 +%------------------- Expr3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{expr3d}{} +\item[関数]Expr3d([位置, 方向, 文字列],option) +\item[機能]文字列を表示する +\item[説明]Expr() と同じ書式。「位置(座標)」だけ,空間座標にする。 + +%------------------- Letter3d ----------------------------------------------- +\vspace{\baselineskip} +\hypertarget{letter3d}{} +\item[関数]Letter3d([位置, 方向, 文字列],option) +\item[機能]文字列を表示する +\item[説明]Letter() と同じ書式。「位置(座標)」だけ,空間座標にする。 + +\vspace{\baselineskip} +【例】三角錐ABCDを描いて,BCの中点に点Mを取ってA,Dと結ぶ。 + +\begin{layer}{150}{0} +\putnotese{90}{0}{ \input{Fig/letter3d}} +\end{layer} +\begin{verbatim} +Putpoint3d("A",2*[0,0,2*sqrt(6)/3]); +Putpoint3d("B",2*[1,-1/sqrt(3),0]); +Putpoint3d("C",2*[0,sqrt(3)-1/sqrt(3),0]); +Putpoint3d("D",2*[-1,-1/sqrt(3),0]); +Putpoint3d("M",(B3d+C3d)/2); +phd=Concatobj([[A,B,C],[A,B,D],[A,C,D],[B,C,D]]); +VertexEdgeFace("1",phd); +Spaceline("1",[A,M,D]); +Nohiddenbyfaces("1","phf3d1"); +Letter3d([A3d,"ne","A",B3d,"w","B",C3d,"se","C",D3d,"e","D"]); +Letter3d(M3d,"sw","M",["Color=blue"]); +\end{verbatim} +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + + +%----------------Getangle -------------------------------------------- +\vspace{\baselineskip} +\hypertarget{getangle}{} +\item[関数]Getangle() +\item[機能]回転角の取得 +\item[説明]スライダで設定できる回転角(視点の位置)TH と FI を取得する。これは,スライダの左側に表示されている値である。戻り値は,リスト [TH,FI] で,角は度数法で表される。なお,内部変数は,THETAとPHIで,弧度法で表されている。 + +回転角の設定については,\hyperlink{setangle}{回転角の設定}を参照のこと。 + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + +\newpage +%KeTJS================================== +\hypertarget{ketjs}{} +\section{KeTJS} + +\subsection{CindyJSとKeTJS} + +CindyJS は,Cinderellaの作品をHTMLにしてWeb上で動かせるようにしたものである。Cinderellaのファイルメニューには,「CindyJSに書き出す」があり,これにより,HTML ファイルができる。できたHTMLファイルをそのままダブルクリックすると,JavaScript で記述されたプログラムが走る。 + +現在のところはCinderellaと完全互換ではなく,Web上ではMouseスロットなどが使えなかったり,線種が指定できなかったりする。それでも,自作のボタンは有効なので,これでWeb上のアプリケーションを作ることができる。 + +KeTJSでは,CindyScriptにはないKeTCindyの関数(コマンド)を使って,作図アプリケーションを作ることができる。CindyJSの拡張版ともいえる。 + +ただし,CindyJSがCinderellaと完全互換でないように,KeTJSもKeTCindyと完全互換ではない。たとえば,いまのところ空間図形は描けない。それでも,KeTCindyのシステムが入っていない環境でもWebブラウザで教材が使えることのメリットは大きいだろう。なお,HTMLなので,TeXのファイルへの書き出し機能はない。 + +KeTJSでHTMLを作成するには,いったんCinderellaのファイルメニューから「CindyJSに書き出す」を選んでHTMLを作成した後,「KeTJS」ボタンをクリックする。「CindyJSに書き出す」で書き出されたHTMLは,実行のための環境設定しか書かれていない。これに,作図プログラムを追加するのが「KeTJS」「KeTJSoff」ボタンである。この2つのボタンの違いについては,次節「動作環境」を参照のこと。 + +また,ひな形として,template2slide.cdy または samplesフォルダの s16 に入っているものを使うとよい。「KeTJS」「KeTJSoff」ボタンが設定してある。 + +\subsection{KeTJSの動作環境} + +Cinderellaのファイルメニューから「CindyJSに書き出す」を選ぶと,CSSとランタイムへのリンク,およびJavaScriptのコードが書かれたHTMLファイルが書き出される。CSSとランタイムへのリンクは + +\begin{verbatim} +<link rel="stylesheet" href="https://cindyjs.org/dist/v0.8/CindyJS.css"> +<script type="text/javascript" src="https://cindyjs.org/dist/v0.8/Cindy.js"> +</script> +\end{verbatim} + +となっている。つまり,Web上からランタイム Cindy.js をオンラインでダウンロードしてJavaScriptを動かすことになる。そのため,ファイルをブラウザで開いたときに少し時間がかかる。また,インターネットに接続できないと実行できない。 + +このCSSとランタイムは,自分のコンピュータに置くことができ,KeTCindyでは,KeTCindyのライブラリとともに,ketcindyjsというフォルダ内に入っている。 + +また,JavaScriptのコードの方は,これだけではKeTCindyのコマンドでの作図はできない。 + +そこで,KeTJS ボタンをクリックすると,リンク先はそのままで,JavaScriptのコードを追加して,ファイル名に json を追加したHTMLファイルを作る。 + +また,KeTJSoff ボタン(オフラインで使う)をクリックすると,ランタイムをダウンロードして,Cinderellaのファイルと同じフォルダに ketcindyjs フォルダを作る。リンク先は次のようにketcindyjsに変え,JavaScriptのコードを追加して,ファイル名に jsoffL を追加したHTMLファイルを作る。 + +\begin{verbatim} +<link rel="stylesheet" href="ketcindyjs/CindyJS.css"> +<script type="text/javascript" src="ketcindyjs/Cindy.js"></script> +\end{verbatim} + +このとき,関数 \verb|Setketcindyjs() | で,オプションを \verb|"Local=n"| とすると,ランタイムとして,kettex の中にある ketcindyjs を使う。このときはファイル名に jsoff を追加する。 + +このときのリンク先は,Windowsの場合は + +\begin{verbatim} +<link rel="stylesheet" href="file:///C:/kettex/texlive/texmf-dist/ +scripts/ketcindy/ketcindyjs/CindyJS.css"> +<script type="text/javascript" src="file:///C:/kettex/texlive/ +texmf-dist/scripts/ketcindy/ketcindyjs/Cindy.js"></script> +\end{verbatim} + +Macの場合は + +\begin{verbatim} +<link rel="stylesheet" href="file:////Applications/kettex/texlive/ +texmf-dist/scripts/ketcindy/ketcindyjs/CindyJS.css"> +<script type="text/javascript" src="file:////Applications/kettex/ +texlive/texmf-dist/scripts/ketcindy/ketcindyjs/Cindy.js"></script> +\end{verbatim} + +である。 + +注)MacOS 10.14 Mojave の場合,Applicationsへのパスが通らないことがある。(2019年2月16日現在)その場合は,\verb|Setketcindyjs() | のオプションを \verb|"Local=n"| としない。 + +\vspace{\baselineskip} +{\bf ファイル名について} + +Cinderellaのファイルメニューから「CindyJSに書き出す」ときのファイル名は,初期設定では作図中のファイル名と同じ。このファイル名は書き出すときに指定できる。 + +「KeTJS」ボタンで書き出すときのファイル名は,\verb|Setfiles()| でファイル名が指定されていなければ,作図中のファイル名と同じ。これが「CindyJSに書き出す」で書き出したときのファイル名で同じでないと,KeTJSのHTMLは作成されない。したがって,次のいずれかでファイル名を決める。 + +(1) ファイル名は作図中のCinderellaのファイル名と同じにする。\\ + このときは,\verb|Setfiles()| を使わない。 + +(2) 作図中のCinderellaのファイル名と別の名前にする。\\ + このときは,\verb|Setfiles("filename")| を使い,CindyJSに書き出すときに\\ + \verb|"filename"| で書き出す。 + +%======KeTJSの設定============================ + +\subsection{KeTJSの設定} + +\begin{description} + +\hypertarget{setketcindyjs}{} +\item[関数]Setketcindyjs(options) +\item[機能] KeTJSの設定 +\item[説明] オプションを設定しない場合( Setketcindyjs() )は,初期値が使われる。 + +オプションは次の通り。 + +\begin{tabbing} +012345678\=3433778901234567\=890090666612345\=\kill +Local \> y/n \>動作環境の設定。 \>初期値は y\\ +Scale \> 実数 \> 拡大・縮小 \>初期値は 1\\ +Nolabel \> 点のリスト \> ラベルを表示しない点を指定する。"No"だけでも可。\\ +Color \> 色名またはコード\> 背景色の指定。初期値はCinderellaの画面の色。\\ +\end{tabbing} +【例】すべて設定するとき,次のように記述する。 + +\verb| Setketcindyjs(["Local=n","Scale=1.5","No=[A,B]","Color=[0.2,0,0,0]"]) | + +\vspace{\baselineskip} +注1)Cinderellaの画面に背景の方眼が描かれているとき,「CindyJSに書き出す」で,この方眼も表示される。方眼を消したい場合は,画面下の「グリッドを描く」ツールで非表示にしておく。 + +注2)「CindyJSに書き出す」で書き出すときの範囲は,ウィンドウ全体である。NE,SWの範囲ではない。2点NE,SWは\verb| Setketcindyjs(["No=[NE,SW]" | で非表示になるが,NE,SEの範囲を広くとっておき,ウィンドウサイズをこれより小さくすれば \verb|"No=[NE,SW]"| オプションを使わなくても表示されずにすむ。 + +注3)HTMLなので,画面に説明文などを表示したい場合は,HTMLファイルを開き,下の方の \verb|<body>| と \verb|</body>| の間,\verb|<div id="CSCanvas"></div>| の前後に書けば表示される。改行などは,HTMLのタグを用いる。 + +\vspace{\baselineskip} +\hypertarget{setketcindy}{} +\item[コメント化] no ketjs +\item[機能] KeTJSへの書き出しの有無を指定 +\item[説明] コマンドの末尾に \verb|//| に続いて書くと,その行はKeTJSに出力しない。 +ブロック単位で非出力にするには,ブロックを \verb|//no ketjs on|,\verb|//no ketjs off| ではさむ。 + +【例】次のスクリプトは,いずれも画面上では四角形ABCDと対角線AD,BCを描いている。 + +\begin{verbatim} +Listplot("1",[A,B,C,D,A]); +Listplot("2",[A,C]); +Listplot("3",[B,D]);// no ketjs +\end{verbatim} + +この場合,HTMLでは対角線BDは描かれない。 + +\begin{verbatim} +Listplot("1",[A,B,C,D,A]); +// no ketjs on +Listplot("2",[A,C]); +Listplot("3",[B,D]); +// no ketjs off +\end{verbatim} + +この場合,対角線は2本とも描かれない。 + +\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright} + +\end{description} + + +\newpage +%付録================================== +\section{付録} + +\subsection{用語解説} +Cinderellaで使っている用語に次のものがある。 +\begin{tabbing} +1234567890123\=456789890123456789012\=34567890123\=\kill +インシデント\>点が曲線(直線)上に乗っている状態を表す。\\ +\>曲線上に点をとるとインシデントになり,ドラッグしたとき曲線上だけを動く。\\ +\>インシデントの状態を変えるには,「点の取り付け/取り外し」ツールを使う。\\ +幾何要素\>Cinderellaの作図ツールで作図した点や直線などの要素\\ +インスペクタ\>幾何要素の大きさや色などの属性を管理するウィンドウ。\\ +幾何点\>幾何要素としての点。マウスドラッグで動かすことができる。\\ +\>CindyscriptやKeTCindyのスクリプトで取った点は幾何要素にならないことがある。\\ +自由点\>マウスドラッグで任意に動かすことのできる点。\\ +固定点\>マウスドラッグで移動することのできない点\\ +\>2曲線の交点などではない単独の点の場合,インスペクタで点を固定できる。\\ +スナップ\>マウスポイントが格子点の近くに来ると格子点上にぴったり移動する。\\ +\>Cinderellaの画面の下方ツールのうち,磁石アイコンによりこのモードになる。\\ + \end{tabbing} + +\hypertarget{geometrytool}{} +\subsection{Cinderellaの作図ツール} + \begin{tabbing} +1234567890123456789890123456789012\=34567890123\=\kill +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/move.pdf}動かすモードにする \>:幾何要素を選択して動かす。これが標準状態\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/single-add.pdf}点を加える \>:クリックして点を作る\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/multi-add-line.pdf}直線を加える \>:2点間をドラッグする\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/segment.pdf}線分を加える \>:2点間をドラッグする\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/middle.pdf}中点を加える \>:2点間をドラッグする\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/intersection.pdf}交点を加える \>:2曲線を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/multi-add-parallel.pdf}平行線を加える \>:直線上から通る点へドラッグ\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/multi-add-perp.pdf}垂線を加える \>:直線上から通る点へドラッグ\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/bisector.pdf}角の二等分線を加える \>:2直線を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/multi-add-circle.pdf}円を加える \>:中心から半径分ドラッグ\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/circle-by-radius.pdf}半径つき円を加える \>:中心から半径分ドラッグ\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/ellipse-by-foci.pdf}焦点と通る点で決まる楕円 \>:焦点と通る点を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/hyperbola-by-foci.pdf}焦点と通る点で決まる双曲線 \>:焦点と通る点を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/parabola-by-foci.pdf}焦点と準線で決まる放物線 \>:焦点と準線を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/polygon.pdf}多角形を加える \>:多角形の頂点を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/angle-mark.pdf}角に印をつける \>:2直線を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/angle.pdf}角度を測る \>:2直線を順にクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/delete.pdf}選択した要素を消去する \>:選択しておいてツールをクリック\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/select-points.pdf}点をまとめて選択する \>:点がすべて選択される\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/select-lines.pdf}線分をまとめて選択する \>:線分がすべて選択される\\ + \end{tabbing} + + \begin{tabbing} +1234567890123456789890123456789012\=34567890123\=\kill +画面ツール(下のツールバー)\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/translate-view.pdf}原点を移動する \>:画面上の任意の位置でドラッグする\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/zoom-in.pdf}矩形領域を画面サイズに拡大 \>:ドラッグしてできる矩形で領域を選択する\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/zoom-out.pdf}画面を矩形領域サイズに縮小 \>:どっらっぐしてで切る矩形で領域を選択する\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/snap.pdf}格子点にスナップする \>:軸と方眼を表示しスナップモードにする\\ +\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/grid-more.pdf}\includegraphics[bb=0 0 6.48 5.04 , width=0.6cm]{Fig/grid-less.pdf}グリッドを粗く / 細かくする\\ + \end{tabbing} + +\hypertarget{colorcodelist}{} +\subsection{色名とカラーコード一覧} +\vspace{\baselineskip} +\scalebox{0.9}{\input{Fig/colortable}} + +\newpage +%--------------点の作図についての比較表-------------------------------------- +\hypertarget{mkpttable}{} +\subsection{点の作図についての比較表} +\vspace{\baselineskip} +\scalebox{0.9}{\input{Fig/mkpttable}} + +注) Intersectcrvsf は戻り値ではなく,プロットデータを使う。 + +\newpage +%関数一覧================================== +\hypertarget{functionlist}{} +\section{関数一覧} +\hyperlink{index}{【目次】に戻る} + +\begin{tabbing} +12345678901234567890123456789012345678\=\kill +【設定・定義】\\ +\hyperlink{addax}{Addax(0/1)}\>座標軸を描くかどうかを定める\\ +\hyperlink{addpackage}{Addpackage(package)}\>プレビュー用のパッケージを追加\\ +\hyperlink{changework}{Changework(パス)}\>作業ディレクトリを変更する\\ +\hyperlink{deffun}{Deffun(関数名 , 定義list )}\>関数を定義する\\ +\hyperlink{definecolor}{Definecolor(色名 , 定義list )}\>ユーザー定義色の設定\\ +\hyperlink{defvar}{Defvar(文字列)} \>変数を定義する\\ +\hyperlink{drwxy}{Drwxy()} \>座標軸を先に描く\\ +\hyperlink{fontsize}{Fontsize(記号)}\>フォントサイズを設定する\\ +\hyperlink{ketinit}{Ketinit(options)}\>\ketcindy を初期化する\\ +\hyperlink{initglist}{Initglist} \> ketlib スロットの描画データを追加する\\ +\hyperlink{ptsize}{Ptsize(数)} \>表示する点の大きさを設定する\\ +\hyperlink{setarrow}{Setarrow(size,angle,pos,cut,style}\>矢線の形状を設定する\\ +\hyperlink{setax}{Setax(list)}\>座標軸の書式を設定する\\ +\hyperlink{setcolor}{Setcolor(color,options)}\>Windispgでの描画色を設定する\\ +\hyperlink{setfiles}{Setfiles(filename)}\>出力するファイル名を設定する\\ +\hyperlink{setparent}{Setparent(filename)}\>Parentで出力するファイル名を設定する\\ +\hyperlink{setmarklen}{Setmarklen(数)}\>軸の目盛の長さを設定する\\ +\hyperlink{setorigin}{Setorigin(座標)}\>表示する座標軸の原点の位置を設定する\\ +\hyperlink{setpen}{Setpen(数)}\>線の太さを設定する\\ +\hyperlink{setpt}{Setpt(数)}\>表示する点の大きさを設定する\\ +\hyperlink{setscaling}{Setscaling(数)}\>縦方向の倍率を設定する\\ +\hyperlink{setunitlen}{Setunitlen(数)}\>単位長を設定する\\ +\hyperlink{setwindow}{Setwindow()}\>描画領域を設定する\\ +\hyperlink{usegraphics}{Usegraphics()} \>グラフィクスパッケージを\verb|"pict2e"| に変更する\\ +【描画】\\ +\hyperlink{drawfigures}{Drawfigures(name ,figlist,optionlist)} \>複数のデータのスタイルをリストで与えて描画する\\ +%\hyperlink{addgraph}{Addgraph(name ,プロットデータ)} \>ユーザー定義のプロットデータを描画する\\ +\hyperlink{anglemark}{Anglemark(点list, options)}\>角の印を入れる\\ +\hyperlink{setarrow}{Setarrow(options)}\>矢線をスタイルを設定する\\ +\hyperlink{arrowdata}{Arrowdata(name.[始点,終点],options)}\>2点間を結ぶ矢線を描く\\ +\hyperlink{arrowhead}{Arrowhead(点,方向,options)}\>点に矢じりだけを描く\\ +\hyperlink{bezier}{Bezier(name, list,list,options )} \>単独のベジェ曲線を描く\\ +\hyperlink{beziersmooth}{Beziersmooth(name , list,options )} \>なめらかなベジェ曲線を描く。その1\\ +\hyperlink{beziersym}{Beziersym(name , list,options )} \>なめらかなベジェ曲線を描く。その2\\ +\hyperlink{bowdata}{Bowdata(点list,options)}\>弓形を描く\\ +\hyperlink{bspline}{Bspline(name,list,options )} \>2次 Bスプライン曲線を描く\\ +\hyperlink{changestyle}{Changestyle(PD list, options)} \>描画オプションを変更する\\ +\hyperlink{circledata}{Circledata(name,点list,options)}\>円または正多角形を描く\\ +\hyperlink{crspline}{CRspline(name,list,options )} \>単独のCatmull-Rom スプライン曲線を描く\\ +\hyperlink{deqplot}{Deqplot(name,式,変数名,初期値,options])}\>微分方程式の解曲線を描く\\ +\hyperlink{dotfilldata}{Dotfilldata(name , 方向, PD , options)}\>領域に点を敷き詰める\\ +\hyperlink{drawsegmark}{Drawsegmark(name,list,options)}\>線分に印をつける\\ +%\hyperlink{drwpt}{Drawpoint([点,options])}\>点を表示する\\ +%\hyperlink{drwpt}{Drwpt([点,options])}\>点を表示する\\ +\hyperlink{ellipseplot}{Ellipseplot(name,list,str,options)}\>楕円を描く\\ +\hyperlink{enclosing}{Enclosing(name , [位置,方向,数式])}\>複数の曲線から閉曲線を描く\\ +\hyperlink{expr}{Expr([座標,位置,文字列],options)}\>\TeX 数式を書く\\ +\hyperlink{exprrot}{Exprrot(位置,向き,文字列)}\>傾いた\TeX 数式を書く\\ +\hyperlink{fourierseries}{Fourierseries(name,係数,周期,項数)}\>フーリエ級数を描く\\ +\hyperlink{framedata}{Framedata(name , list)}\>矩形を描く\\ +\hyperlink{hatchdata}{Hatchdata(name , 方向, PD , options)}\>領域に斜線を引く\\ +\hyperlink{htickmark}{Htickmark([横座標 , 方向 , 文字])}\>横軸に目盛りを描く\\ +\hyperlink{hyperbolaplot}{Hyperbolaplot(name,list,str,options)}\>双曲線を描く\\ +\hyperlink{implicitplot}{Implicitplot(name,str,,str,str,options)}\>陰関数のグラフを描く\\ +\hyperlink{invert}{Invert(PD)}\>プロットデータの点を逆順にする(reverseと同じ)\\ +\hyperlink{joincrvs}{Joincrvs(name, PDlist, options)}\>2つのプロットデータをつなげたデータを作る\\ +\hyperlink{letter}{Letter([座標,位置,文字列],options)}\>文字列を表示する\\ +\hyperlink{letterrot}{Letterrot(座標,方向,移動量,文字列)}\>文字列を回転して表示する\\ +\hyperlink{lineplot}{Lineplot(name,2点のlist,options)}\>2点を結ぶ直線を描く\\ +\hyperlink{listplot}{Listplot(name,点のlist,options)}\>点を線分で結ぶ\\ +\hyperlink{mkbeziercrv}{Mkbeziercrv(name,list,options)}\>作図した点を使ってベジェ曲線を描く\\ +\hyperlink{mkbezierptcrv}{Mkbezierptcrv(list,options ) } \>制御点を自動配置してベジェ曲線を描く\\ +\hyperlink{mkcircles}{Mkcircles()} \>幾何円のすべてのPD を作成する\\ +\hyperlink{mksegments}{Mksegments()}\> 幾何線分のすべてのPD を作成する\\ +\hyperlink{ospline}{Ospline(list,list,options )} \>大島のスプライン曲線を描く\\ +\hyperlink{ovaldata}{Ovaldata(name, 点list,options)}\>角を丸くした矩形を描く\\ +\hyperlink{parabolaplot}{Parabolaplot(name,list,str,options)}\>放物線を描く\\ +\hyperlink{paramark}{Paramark(点list,options)}\>角の印を入れる\\ +\hyperlink{paramplot}{Paramplot(name,式,変数と定義域,options)}\>媒介変数で表された曲線を描く\\ +\hyperlink{polarplot}{Polarplot(name,式,変数と定義域,options)}\>極座標表示の曲線を描く\\\hyperlink{partcrv}{Partcrv(name,点1,点2,PD)}\>部分曲線を描く\\ +\hyperlink{periodfun}{Periodfun(定義式,周期,options)}\>周期関数のグラフを描く\\ +\hyperlink{plotdata}{Plotdata(name,式,変数と定義域,options)}\>関数のグラフを描く\\ +\hyperlink{pointdata}{Pointdata(name,点list,options)}\>点データを作る\\ +\hyperlink{polygonplot}{Polygonplot(name,点list,整数,options)}\>正多角形を描く\\ +\hyperlink{putintersect}{Putintersect(点名,PD1,PD2)}\>2曲線の交点を作る\\ +\hyperlink{putoncurve}{Putoncurve(name,PD,初期値)}\>曲線上に点を作る\\ +\hyperlink{putonline}{Putonline(点名,座標1,座標2)}\>直線上に点を作る\\ +\hyperlink{putonseg}{Putonseg(点名,座標1,座標2)}\>線分上に点を作る\\ +\hyperlink{putpoint}{Putpoint(点名,座標1,座標2)}\>点を作る\\ +\hyperlink{reflectdata}{Reflectdata(name,PD,点list,options)}\>プロットデータの鏡映を作成\\ +\hyperlink{reflectpoint}{Reflectpoint(点,対称点/対称軸)}\>点の鏡映を作成\\ +\hyperlink{rotatedata}{Rotatedata(name,PD,角度,中心,options)}\>プロットデータを回転する\\ +\hyperlink{rotatepoint}{Rotatepoint(点,角度,中心)}\>点の位置を回転する\\ +\hyperlink{rulerscale}{Rulerscale(点,list,list)}\>目盛を打つ\\ +\hyperlink{scaledata}{Scaledata(name,PD,x,y,中心,options)} \>点を拡大・縮小する\\ +\hyperlink{scalepoint}{Scalepoint(点,比率ベクトル,中心)} \>点の位置を拡大・縮小する\\ +\hyperlink{drawsegmark}{Segmark(name,list,options)}\>線分に印をつける\\ +\hyperlink{shade}{Shade(PDlist , 数)}\>閉曲線の内部にシェードをかける\\ +\hyperlink{tangentplot}{Tangentplot(name,PD, 位置)}\>曲線の接線を引く\\ +\hyperlink{translatedata}{Translatedata(name,PD,ベクトル,options)}\>プロットデータを平行移動する\\ +\hyperlink{translatepoint}{Translatepoint(点,ベクトル)}\>点を平行移動する\\ +\hyperlink{vtickmark}{Vtickmark([横座標 , 方向 , 文字])}\>縦軸に目盛りを描く\\ +【作表】\\ +\hyperlink{changetablestyle}{Changetablestyle(罫線list, options)}\>Table の罫線の描画オプションを変更する。\\ +\hyperlink{findcell}{Findcell(列番号, 行番号)}\>セルの情報listを返す\\ +\hyperlink{putcell}{Putcell (列番号, 行番号, 位置, 文字)} \>セルに文字列を入れる\\ +\hyperlink{putcell}{Putcellexpr (列番号, 行番号, 位置, 文字)} \>セルに数式を入れる\\\hyperlink{putcol}{Putcol (列番号, 位置,文字列list)} \>1列に順に文字を書き入れる\\ +\hyperlink{putcolexpr}{Putcolexpr (列番号, 位置,文字列list)}\>1列に順に\TeX 書式の文字を書き入れる\\ +\hyperlink{putrow}{Putrow (行番号, 位置,文字列list)} \>1行に順に文字を書き入れる\\ +\hyperlink{putrowexpr}{Putrowexpr (行番号, 位置,文字列list)} \>1行に順に\TeX 書式の文字を書き入れる\\ +\hyperlink{tabledata}{Tabledata("" , 縦横 ,除外 , options)}\>表の枠を作成する\\ +\hyperlink{tabledatalight}{Tabledatalight("" , 縦横 ,除外 , options)}\>幾何点を持たない表の枠を作成する\\ +\hyperlink{tgrid}{Tgrid(セルラベル)} \>セル(格子点)の座標を返す\\ +\hyperlink{tlistplot}{Tlistplot(セルラベル1,セルラベル2)} \>セルに斜線を引く\\ +\vspace{\baselineskip} +【値の取得と入出力】\\ +\hyperlink{asin}{Asin(real),Acos(real) }\>逆三角関数の値を返す\\ +\hyperlink{crossprod}{Crossprod(list,list)}\>ベクトルの外積を計算する\\ +\hyperlink{derivative}{Derivative(関数式,変数,値)}\>関数の微分係数を求める\\ +\hyperlink{dotprod}{Dotprod(list,list)}\>ベクトルの内積を計算する\\ +\hyperlink{extractdata}{Extractdata(データ名,属性)}\>ReadOutDataで読み込んだデータに属性をつける。\\ +\hyperlink{findarea}{Findarea(PD)}\>プロットデータで囲まれる部分の面積を求める\\ +\hyperlink{findlength}{Findlength(PD)}\>プロットデータで描く曲線の長さを求める\\ +\hyperlink{integrate}{Integrate(関数式,変数,範囲,options)} \>関数の定積分値を求める\\ +\hyperlink{intersectcrvs}{Intersectcrvs(PD1,PD2)}\>プロットデータの交点の座標listを返す\\ +\hyperlink{intersectcrvspp}{IntersectcrvsPp(PD1,PD2)}\>プロットデータの交点のパラメータlistを返す\\ +\hyperlink{inversefun}{Inversefun(関数式,範囲,値)}\>逆関数値を求める\\ +%\hyperlink{makeshell}{Makeshell(ファイル名)}\>Macのシェルスクリプトを書き出す\\ +%\hyperlink{makeshell}{Makebat(ファイル名)} \>Windowsのバッチファイルを書き出す\\ +\hyperlink{nearestpt}{Nearestpt(PD,PD)}\>2曲線間の最も近い点を取得する\\ +\hyperlink{nearestptcrv}{Nearestptcrv(点,PD)}\>点に一番近い曲線上の点を取得する\\ +\hyperlink{numptcrv}{Numptcrv(PD)}\>曲線PD の節点データの個数を取得する\\ +\hyperlink{paramoncrv}{ParamonCurve(PD,n,PtL)}\>PD上にある点P のデータを取得する\\ +\hyperlink{pointoncrv}{Pointoncrv(数,PD)}\>パラメータ値をもつプロットデータ上の点\\ +\hyperlink{ptcrv}{Ptcrv(n,PD)}\>曲線PD のn 番目の節点を取得する\\ +\hyperlink{ptstart}{Ptstart(PD)}\>プロットデータの始点・終点を取得する\\ +\hyperlink{readoutdata}{ReadOutData(ファイル名)}\>外部データをPDとして読み込む\\ +\hyperlink{readcsv}{Readcsv(name,filename,option)}\>csvファイルを読む\\ +\hyperlink{readlines}{Readlines(name,filename,option)}\>テキストファイルを1行ずつ読む\\ +\hyperlink{sqr}{Sqr(real)}\>平方根を返す\\ +\hyperlink{viewtex}{Viewtex()}\>\TeX のソースファイルを書き出す。引数なし\\ +\hyperlink{workprocess}{Workprocess()}\>作図の経過を取得する\\ +\hyperlink{writeoutdata}{WriteOutData()}\>PDデータを書き出す\\ +\vspace{\baselineskip} +【その他】\\ +\hyperlink{assign}{Assign(文字列)}\>文字列中のある文字を値で置き換える\\ +\hyperlink{bbdata}{BBdata(ファイル名)}\>画像のサイズを求める\\ +%\hyperlink{com0th}{Com0th(コマンド)} \>RのOpenfileの前に置くコマンドを定義する\\ +%\hyperlink{com1st}{Com1st(コマンド)} \>RのOpenfileの前に置くコマンドを定義する\\ +%\hyperlink{com2nd}{Com2nd(コマンド)} \>RのOpenfileのあとに置くコマンドを定義する\\ +%\hyperlink{com2ndpre}{Com2ndpre(コマンド)} \>RのOpenfileのあとに置くコマンドを定義する\\ +\hyperlink{cindyname}{Cindyname()}\>作図しているファイル名を取得する。\\ +\hyperlink{colorcode}{Colorcode(文字1,文字2,color)}\>カラーコードの変換\\ +\hyperlink{dqq}{Dqq(文字列)}\>文字列の前後に\verb|"|をつける。\\ +\hyperlink{factorial}{Factorial(n)}\>nの階乗を計算する。\\ +\hyperlink{norm}{Norm(ベクトル)}\>ベクトルの大きさを計算する。\\ +\hyperlink{figpdf}{Figpdf(option)} \>出力枠サイズのPDFを作る\\ +\hyperlink{help}{Help(str)}\>コマンドヘルプを表示する\\ +\hyperlink{helpkey}{Helpkey(str)}\>キーワードで関数を検索する\\ +\hyperlink{indexall}{Indexall(str1,str2)} \>文字列 str1 から str2 を検索しその位置をすべて返す\\ +\hyperlink{op}{Op(n,list)} \> listまたは文字列から要素を抜き出す\\ +\hyperlink{isptselected}{Isptselected(点名)} \>点が選択されていればtrueを返す\\ +\hyperlink{isptselected}{Ptselected(点名)} \>点が選択されていればtrueを返す\\ +\hyperlink{slider}{Slider()}\>スライダを作る\\ +\hyperlink{sprintf}{Sprintf(実数,長さ)}\>小数点以下の長さを固定した文字列に変換\\ +\hyperlink{strsplit}{Strsplit(文字列,文字)}\>文字列を分解する。\\ +\hyperlink{texcom}{Texcom(コード)} \>\TeX のコードを書き出す\\ +\hyperlink{textformat}{Textformat(数,桁数)} \>小数点以下の桁数を指定して数値を文字列化する\\ +\hyperlink{windispg}{Windispg()}\>定義されたプロットデータを描画面に描く\\ +\hyperlink{fracform}{Fracform(数,分母リスト)}\>簡易TeX-like書式の文字列を返す\\ +\hyperlink{totexform}{Totexform(TeX-like書式)}\>TeX書式の文字列を返す\\ +\hyperlink{tocindyform}{Tocindyform(TeX-like書式}\>Cindy書式の文字列を返す\\ +\vspace{\baselineskip} +【Rとの連携】\\ +\hyperlink{boxplot}{Boxplot(名前,データ,位置,高さ,option)} \>箱ひげ図を描く\\ +\hyperlink{rfun}{Rfun(変数名,コマンド,引数, option)}\>Rの1つコマンドを実行して結果を返す\\ +\hyperlink{calcbyr}{CalcbyR(変数名,コマンド列, option)}\>Rのコマンド列を実行して結果を返す\\ +\hyperlink{histplot}{Histplot(name,data)}\>ヒストグラムを描く\\ +\hyperlink{plotdatar}{PlotdataR(name,式,変数)}\>Rの関数のグラフを描く\\ +\hyperlink{plotdiscr}{PlotdiscR(name,式,変数)}\>離散型のグラフを描く\\ +\hyperlink{scatterplot}{Scatterplot(name,filename,option)}\>2次元データを読み込み,散布図を描く\\ +\vspace{\baselineskip} +【Maximaとの連携】\\ +\hyperlink{calcbyM}{CalcbyM(name,list,option)}\>Maximaのスクリプトを実行する\\ +%\hyperlink{example}{Example("Mxfun",文字)}\>Mxfunの使用例を表示\\ +\hyperlink{mxbatch}{Mxbatch(list)}\>Maximaの外部スクリプト用コマンドを作る\\ +\hyperlink{mxfun}{Mxfun(name,式,list,option)}\>Maximaの関数を実行する\\ +\hyperlink{mxtex}{Mxtex(num,式)}\>式をTeX書式にする\\ +\vspace{\baselineskip} +【Risa/Asirとの連携】\\ +\hyperlink{asirfun}{Asirfun(name,式,list,option)}\>Risa/Asirの関数を実行する\\ +\hyperlink{calcbyA}{CalcbyA(name,list,option)}\>Risa/Asirのスクリプトを実行する\\ +\vspace{\baselineskip} +【FriCASとの連携】\\ +\hyperlink{calcbyF}{CalcbyF(name,list,option)}\>FriCASのスクリプトを実行する\\ +\hyperlink{frfun}{Frfun(name,式,list,option)}\>FriCASの関数を実行する\\ +\vspace{\baselineskip} +【MeshLabとの連携】\\ +\hyperlink{mkobjcmd}{Mkobjcmd(name,式,option)} \>厚みを持たない曲面のコマンドを作成\\ +\hyperlink{mkobjcrvcmd}{Mkobjcrvcmd(name,PD,option)} \>空間曲線のコマンドを作成\\ +\hyperlink{mkobjnrm}{Mkobjnrm(name,式)} \>法線ベクトルのデータを作成\\ +\hyperlink{mkobjplatecmd}{Mkobjplatecmd(name,面データ,options)} \>面を描く\\ +\hyperlink{mkobjpolycmd}{Mkobjpolycmd(name,PD,options)} \>多面体を描く\\ +\hyperlink{mkobjsymbcmd}{Mkobjsymbcmd(PD, 実数,実数,vec,vec)} \>文字等のコマンドを作成\\ +\hyperlink{mkobjthickcmd}{Mkobjthickcmd(name,式)} \>厚みを持つ曲面のコマンドを作成\\ +\hyperlink{mkviewobj}{Mkviewobj(name,PD, options)} \>obj ファイルを作成\\ +\vspace{\baselineskip} +【表計算ソフトとの連携】\\ +\hyperlink{dispmat}{Dispmat(list)}\>listの内容を行列型にコンソールに表示する\\ +\hyperlink{tab2list}{Tab2list(str,option)}\>str の内容をlistに変換する\\ +\hyperlink{writecsv}{Writecsv(namelist,data,option)}\>dataの内容をcsvファイルに書き出す\\ +\vspace{\baselineskip} +【アニメーション】\\ +%\hyperlink{moviedata}{Moviedata(str1,str2,options)}\>動画データの作成\\ +\hyperlink{setpara}{Setpata(str)}\>パラパラ動画のタイトル指定\\ +【スライド】\\ +\hyperlink{settitle}{Settitle(タイトルlist,options)}\>スライドのタイトル設定\\ +【KeTCindy3D設定・定義】\\ +\hyperlink{ketinit3d}{Ketinit3d()}\>KeTCindy3Dの使用宣言\\ +\hyperlink{isangle}{Isangle}\>角度スライダが選択されているか\\ +\hyperlink{start3d}{Start3d()}\>3Dの開始\\ +\hyperlink{setangle}{Setangle} \>回転角の設定\\ +\hyperlink{getangle}{Getangle}\>回転角の取得\\ +\hyperlink{startsurf}{Startsurf}\>曲面描画の初期化\\ +\vspace{\baselineskip} +【KeTCindy3D描画】\\ +\hyperlink{bezier3d}{Bezier3d(name, list, list)}\>空間ベジェ曲線を描く\\ +\hyperlink{changestyle3d}{Changestyle3d(list, list)}\>3dプロットデータの属性を変更\\ +\hyperlink{concatobj}{Concatobj(list,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{execcmdc}{ExeccmdC(name,options1,options2)}\>C言語で命令実行\\ +\hyperlink{expr3d}{Expr3D([座標,位置,文字列],options)}\>文字列を表示する\\ +\hyperlink{intersectcrvsf}{Intersectcrvsf(name,PD,式)}\>曲線と曲面の交点を求める\\ +\hyperlink{intersectsgpL}{IntersectsgpL(点名,線分,面,描画方法)}\>空間の直線と平面の交点\\ +\hyperlink{invparapt}{Invparapt(座標,PD)}\>描画面座標に対応する曲線上の座標\\ +\hyperlink{letter3d}{Letter3D([座標,位置,文字列],options)}\>文字列を表示する\\ +\hyperlink{mkbezierptcrv3d}{Mkbezierptcrv3d(点list)}\>制御点を自動的にとる空間ベジェ曲線\\ +\hyperlink{nohiddenbyfaces}{Nohiddenbyfaces(name,PD,PD,opt1,opt2)}\>多面体と空間曲線を陰線処理\\ +\hyperlink{parapt}{Parapt(座標)}\>点の投影面での座標\\ +\hyperlink{partcrv3d}{Partcrv3d(name,始点,終点,PD)}\>曲線PDの部分曲線を作る\\ +\hyperlink{perpplane}{Perpplane(点名, 点, ベクトル,option)}\>点を通り垂直な平面上の基準点\\ +\hyperlink{perppt}{Perppt(点名,点,点list,option)}\>平面に下ろした垂線の足\\ +\hyperlink{phparadata}{Phparadata(name,name2,options)}\>多面体を陰線処理して描く\\ +\hyperlink{pointdata3d}{Pointdata3d(名前,点list,options)} \>空間点のデータを作成する\\ +\hyperlink{putaxes3d}{Putaxes3d([x,y,z])}\>軸上に幾何点をとる\\ +\hyperlink{putonCurve3d}{Putoncurve3d(点名,PD)}\>空間曲線上に点をとる\\ +\hyperlink{putonseg3d}{Putonseg3d(点名,点1,点2)}\>線分上に点をとる\\ +\hyperlink{putpoint3d}{Putpoint3d(list,option)}\>空間点をとる\\ +\hyperlink{readobj}{Readobj(ファイル名)}\>objファイルを読み込む\\ +\hyperlink{reflectdata3d}{Reflectdata3d(点,PDlist,list,options)}\>PDを鏡映\\ +\hyperlink{reflectpoint3d}{Reflectpoint3d(点,list)}\>点を鏡映\\ +\hyperlink{rotatedata3d}{Rotatedata3d(name,PD,vec,角度,点)}\>プロットデータを回転\\ +\hyperlink{rotatepoint3d}{Rotatepoint(点 , vec , 角度 , 点)}\>点を回転\\ +\hyperlink{scaledata3d}{Scaledata3d(点, vec, 中心)}\>プロットデータを拡大/縮小\\ +\hyperlink{scalepoint3d}{Scalepoint3d(点, vec, 中心)}\>点の位置を拡大/縮小\\ +\hyperlink{sf3data}{Sf3data(name, list,options)}\>陰線処理なしの空間曲面を描く\\ +\hyperlink{sfbdparadata}{Sfbdparadata(name, 式,options)}\>曲面を陰線処理して描く\\ +\hyperlink{sfcutparadatacdy}{Sfcutparadatacdy(name,面,曲面,options)} \>平面と曲面の交線を求める。\\ +\hyperlink{skeletonparadata}{Skeletonparadata(name,PD,PD,options)}\>スケルトン処理のデータ作成\\ +\hyperlink{spacecurve}{Spacecurve(name, 式, 定義域,options)}\>空間曲線のデータ作成\\ +\hyperlink{spaceline}{Spaceline(name,list)}\>空間の折線データ作成\\ +\hyperlink{translatedata3d}{Translatedata3d(name,PD, 平行移動量)}\>空間プロットデータを平行移動\\ +\hyperlink{translatepoint3d}{Translatepoint3d(座標,平行移動量)}\>空間点を平行移動\\ +\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)}\>主副画面で決まる点の座標\\ +【KeTJS】\\ +\hyperlink{setketcindyjs}{Setketcindyjs(options)}\>KeTJSの設定\\ + +\end{tabbing} + +\end{document}
\ No newline at end of file |