1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
|
\documentclass[papersize,a4paper,12pt,uplatex]{jsarticle}
\usepackage{ketpic,ketlayer}
\usepackage{amsmath,newtxmath}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{wrapfig}
\usepackage[dvipdfmx,bookmarks=false,colorlinks=true,linkcolor=blue]{hyperref}
\setmargin{20}{20}{15}{25}
\begin{document}
\title{Spacekc リファレンスマニュアル}
\author{CinderellaJapan}
\maketitle
\tableofcontents
\newpage
%第1節 序 =======================================
\section{はじめに}
Spacekc は,KeTCindyのためのSpaceCindyである。KeTCindyの3Dグラフィクスに,簡易レイトレーシングで色付けをすることができる。また,KeTCindyで提供していない,空間に関する計算のためのいくつかの関数を用意している。配布はライブラリではなく,スクリプトを記述したテキストファイルあるいはCinderellaのファイルで行っている。
なお,SpaceCindykcを用いた作図【例】と配布は,KeTCindy のページに掲載している。アドレスは以下の通り。
\hspace{10mm} \url{https://sites.google.com/site/KETCindy/home/cindy3d2}
%第2節 定数 ==========================================
\section{定数}
\begin{description}
\hypertarget{rpolydata}{}
\item[正多面体の頂点座標] Rpolydata
\item[説明] 正多面体の頂点のリスト。内容は,φ=$\cfrac{1+\sqrt{5}}{2}$ を黄金比として次のようになっている。
正四面体:$(0,0,1),\left(\cfrac{2\sqrt{2}}{3},0,-\cfrac{1}{3} \right),\left(-\cfrac{\sqrt{2}}{3},\cfrac{\sqrt{6}}{3},-\cfrac{1}{3} \right),\left(-\cfrac{\sqrt{2}}{3},\cfrac{\sqrt{6}}{3},-\cfrac{1}{3}\right)$
正六面体:$(-1,-1,1),(1,-1,1),(1,1,1),(-1,1,1),(-1,-1,-1),(1,-1,-1),(1,1,-1),(-1,1,-1)$
正八面体:$(0,0,1),(0,-1,0),(1,0,0),(0,1,0),(-1,0,0),(0,0,-1)$
正十二面体:$(0,-1,-φ^2),(0,1,-φ^2),(0,-1,φ^2),(0,1,φ^2),(-1,-φ^2,0),(1,-φ^2,0) $
\hspace{15mm} $ (-1,φ^2,0),(1,φ^2,0),(-φ^2,0,-1),(-φ^2,0,1),(φ^2,0,-1),(φ^2,0,1), $
\hspace{15mm} $ (-φ,-φ,-φ),(-φ,-φ,φ),(-φ,φ,-φ),(-φ,φ,φ), $
\hspace{15mm} $ (φ,-φ,-φ),(φ,-φ,φ),(φ,φ,-φ),(φ,φ,φ)$
正二十面体:$(0,-1,-φ),(0,1,-φ),(0,-1,φ),(0,1,φ),(-φ,0,-1),(-φ,0,1) $
\hspace{15mm}$ (φ,0,-1),(φ,0,1),(-1,-φ,0),(1,-φ,0),(-1,φ,0),(1,φ,0)$
\vspace{\baselineskip}
\hypertarget{lightpoint}{}
\item[光源の方向ベクトル] Lightpoint
\item[説明] 簡易レイトレーシングを行う場合の光源の方向ベクトル。初期設定は[-1,1,1]
\vspace{\baselineskip}
\hypertarget{contrast}{}
\item[コントラスト] Contrast
\item[説明] 簡易レイトレーシングを行う場合の,光のあたり方のコントラスト。標準は0以上1以下の実数。1を超えてもよいが,黒い部分が多くなる。描画関数の option で設定することもできる。
\end{description}
\newpage
%第3節 値の取得 ==========================================
\section{値の取得}
\begin{description}
\hypertarget{angle3pt}{}
\item[関数] angle3pt(座標1,座標2, 座標3)
\item[機能] 平面上で角を求める
\item[戻り値] 点 p1,p2,p3 に対し,∠p1p2p3を返す
\vspace{\baselineskip}
\hypertarget{pointindomain}{}
\item[関数] pointindomain(座標1,点リスト)
\item[機能] 平面上で点リストの閉曲線内に座標1の点があるかどうかの判定
\item[戻り値] 領域内なら1,領域外なら0,境界線上なら2を返す。
\vspace{\baselineskip}
\hypertarget{crosssd}{}
\item[関数] crosssd(座標1,座標2,座標3,座標4)
\item[機能] 座標平面において2本の線分か交わるかどうかを判断する
\item[説明] 座標1,座標2を結ぶ線分と,座標3,座標4を結ぶ線分が交わるかどうか(共有点を持つかどうか)を判定する。
\item[戻り値] 交点がある場合は true ,ない場合は false を返す。
\vspace{\baselineskip}
\hypertarget{interll}{}
\item[関数] interll(座標1,座標2,座標3,座標4)
\item[機能] 座標空間において2本の直線の交点の座標を求める
\item[戻り値] 座標1,座標2を通る直線と,座標3,座標4を通る直線との交点の座標を返す。
交点がない場合は [i,i,i] を返す。
\vspace{\baselineskip}
\hypertarget{interss}{}
\item[関数] interss(座標1,座標2,座標3,座標4)
\item[機能] 座標空間において2本の線分の交点の座標を求める
\item[戻り値] 座標1,座標2を結ぶ線分と,座標3,座標4を結ぶ線分との交点の座標を返す。
交点がない場合は [i,i,i] を返す。
\vspace{\baselineskip}
\hypertarget{interpl}{}
\item[関数] interpl(座標1,座標2,座標3,座標4,座標5)
\item[機能] 座標空間において平面と直線の交点の座標を求める
\item[戻り値] 座標1,座標2,座標3で決まる平面と,座標4,座標5を通る直線との交点の座標を返す。
交点がない場合は [i,i,i] を返す。
\vspace{\baselineskip}
\hypertarget{interps}{}
\item[関数] interps(座標1,座標2,座標3,座標4,座標5)
\item[機能] 座標空間において平面と線分の交点の座標を求める
\item[戻り値] 座標1,座標2,座標3で決まる平面と,座標4,座標5を通る線分との交点の座標を返す。
交点がない場合は [i,i,i] を返す。
\hypertarget{distlp}{}
\item[関数] distlp(座標1,座標2, 座標3)
\item[機能] 直線と点の距離を求める。(distance of line to point)
\item[説明] 座標1,座標2を通る直線と,座標3の点との距離を求める。
\item[戻り値] 距離。
平面上の点でも空間の点でもよい。座標1と座標2が等しいときは虚数単位 i を返すとともに,コンソールに警告「Warning:p1 is same to p2」を表示する。
2点を結ぶ直線のベクトル方程式 $x=x_1+t(x_2-x_1) , y=y_1+t(y_2-y_1)$ を用い,
内積=0から t を求め距離を計算している。
垂線の足の位置ベクトルを$h(x,y)$ とすると,
$(\vec{h}-\vec{p3})・(\vec{p2}-\vec{p1})=0$
から
$t=\dfrac{(\vec{p2}-\vec{p1})・(\vec{p3}-\vec{p1})}{|\vec{p2}-\vec{p1}|^2}$
を得る。
【例】 println(distlp([1,0],[0,1],[0,0]));
で$\cfrac{\sqrt{2}}{2}$ が表示される。なお,plintln() により,コンソールには 0.71 が表示されるが,内部的には四捨五入した値ではないので
println(guess(distlp([1,0],[0,1],[0,0])));
とすると,1/2*sqrt(2) と表示される。
【例】 println(distlp([1,1,0],[0,0,1],[0,0,0])); で$\cfrac{\sqrt{6}}{3}$ が表示される。なお,plintln() により,コンソールには 0.82 が表示されるが,内部的には四捨五入した値ではないので
println(guess(distlp([1,1,0],[0,0,1],[0,0,0])));
とすると,1/3*sqrt(6) と表示される。
%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\vspace{\baselineskip}
\hypertarget{distpp}{}
\item[関数] distpp(座標1,座標2, 座標3, 座標4)
\item[機能] 座標空間で3点を通る平面と点の距離を求める。
\item[説明] 座標1,座標2,座標3を通る平面と,座標4の点との距離を求める。
\item[戻り値] 距離
【例】 3点 (2,0,0),(0,2,0),(0,0,2) を通る平面と,原点との距離
distpp([2,0,0],[0,2,0],[0,0,2],[0,0,0]); 戻り値は $\cfrac{2\sqrt{3}}{3}$
\vspace{\baselineskip}
\hypertarget{map2d}{}
\item[関数] map2d(座標)
\item[機能] 座標空間の点を現在の座標平面に射影した点の座標を求める。
\item[説明] 「現在の」とは,スライダで設定された軸設定(視点)による画面のことを指す。
【例】 pt=map2d([1,2,3]);
なお,KeTCindyの Parapt() と全く同じ。
\item[戻り値] 平面座標
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{normalvec}{}
\item[関数] normalvec(座標1,座標2, 座標3)
\item[機能] 3点を通る平面の単位法線ベクトルを求める。
\item[説明] 座標1,座標2,座標3を通る平面の単位法線ベクトルを求める。
\item[戻り値] 法線ベクトルを表すリスト。
ベクトルの向きは,点の順序による。
【例】 normalvec([2,0,0],[0,2,0],[0,0,2]); の結果は $\left(\cfrac{\sqrt{3}}{3},\cfrac{\sqrt{3}}{3},\cfrac{\sqrt{3}}{3}\right)$
normalvec([2,0,0],[0,0,2],[0,2,0]); の結果は $\left(-\cfrac{\sqrt{3}}{3},-\cfrac{\sqrt{3}}{3},-\cfrac{\sqrt{3}}{3}\right)$
平面と点の距離を求める distpp() を組み合わせると,平面に下した垂線のベクトルを表示できる。
\begin{verbatim}
nv=normalvec([2,0,0],[0,2,0],[0,0,2]);
dd=distpp([2,0,0],[0,2,0],[0,0,2],[0,0,0]);
poly3d("1",[[2,0,0],[0,2,0],[0,0,2]]);
arrow3d("1",[[0,0,0],dd*nv]);
Letter3d([dd*nv,"e","H"]);
\end{verbatim}
\input{3Dfig/nomalvec01}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{onsameplane}{}
\item[関数] onsameplane(pa,pb,pc,pd)
\item[機能] 4点が同一平面上にあるかどうかの判定
\item[説明] 引数は判定する4点の座標。外積と内積を用いた判定法による 。
\item[戻り値] true / false
%\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\vspace{\baselineskip}
\hypertarget{perp}{}
\item[関数] perp(座標1,座標2, 座標3)
\item[機能] 2点を通る直線への垂線の足の座標を求める。
\item[戻り値] 座標1,座標2の2点を通る直線に,座標3の点から下した垂線の足の座標を返す。
\hypertarget{perpvec}{}
\item[関数] perpvec(ベクトル,flag)
\item[機能] ベクトルに垂直な平面の基本ベクトルを作る。
\item[説明] 第1引数のベクトルに垂直な平面上に2つの直交するベクトルを作り,リストにして返す。ひとつは,z成分を1として計算する。flag はオプションで,0にすると単位ベクトルにしない。デフォルトは単位ベクトル。
\item[戻り値] ベクトル。
【例】perpvec([1,1,1]) の結果は [[-0.8165,0.4082,0.4082],[0,-0.7071,0.7071]]
perpvec([1,1,1],0) の結果は [[-2,1,1],[0,-1,1]]
\vspace{\baselineskip}
\hypertarget{planecoeff}{}
\item[関数] planecoeff(座標1,座標2, 座標3)
\item[機能] 3点を通る平面の方程式の係数を求める。
\item[説明] 座標1,座標2,座標3の3点を通る平面の方程式 $ax+by+cz=1$ の係数 $a,b,c$ を求める。
\item[戻り値] リスト [a,b,c]。係数$a,b,c$が存在しない場合はコンソールに「Warning! Cannot decide a coefficient.」を表示し,[i,i,i] を返す。
\vspace{\baselineskip}
\hypertarget{reflect3d}{}
\item[関数] reflect3d(dlist,mirror)
\item[機能] dlistの鏡像を得る
\item[説明] 第1引数は,点,プロットデータ,面データのいずれか。第2引数の座標リストが,1つの点だけなら,点対称,2つの点なら,その 2点を結ぶ直線に関する対称点,3つの点なら,その3点で決まる平面に関する対称点となる。
\item[戻り値] 第1引数と同じタイプのデータ
KeTCindyのRefrectdata3d() との違いは,描画をしないこと,引数が,点,プロットデータ,面データのいずれでもよいことである。第2引数の形は同じ。
\vspace{\baselineskip}
\hypertarget{rotate3d}{}
\item[関数] rotate3d(dlist,vec,angle,center)
\item[機能] dlistを指定した角だけcenterを始点とするベクトル周りに回転する。
\item[説明] dlistは点,プロットデータ,面データのいずれか。
\item[戻り値] dlistと同じ形式のデータ。
KeTCindyのRotatedata3d() との違いは,描画をしないこと,引数が,点,プロットデータ,面データのいずれでもよいことである。その他の引数の形式は同じ。
【例】 angle=[0,0,pi/4];
p=[1,0,0];
drawpt3d(rotate3d(p,angle));
により,点(1,0,0)をz軸回りに $\frac{\pi}{4}$ だけ回転した位置に点を打つ。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{translate3d}{}
\item[関数] translate3d(dlist,ベクトル)
\item[機能] dlistを指定したベクトルだけ平行移動。
\item[説明] dlistは点,プロットデータ,面データのいずれか。
\item[戻り値] dlistと同じ形式のデータ
KeTCindyのTranslatedata3d() との違いは,描画をしないこと,引数が,点,プロットデータ,面データのいずれでもよいことである。その他の引数の形式は同じ。
\vspace{\baselineskip}
\hypertarget{rotmatrix}{}
\item[関数] rotmatrix(vec)
\item[機能] 法線ベクトルから回転行列を作る
\item[説明] 引数は法線ベクトル。 初め,法線ベクトルは[0,0,1]であるとする。これを回転して,引数の vec になるような回転行列を求める。y軸周り,z軸周りの順に回転する行列。
\item[戻り値] 行列
\vspace{\baselineskip}
\hypertarget{vertexrpolyhedron}{}
\item[関数] vertexrpolyhedron(n)
\item[機能] 正n面体の頂点リストを取得する
\item[説明] nの値は4,6,8,12,20 のいずれか。
\item[戻り値] 半径1の球面に内接する正多面体の頂点リスト。
頂点の順番は次のようになっている。それぞれアルファベット順。
\input{3Dfig/vertex4} \input{3Dfig/vertex6}
\input{3Dfig/vertex8} \input{3Dfig/vertex12}
\input{3Dfig/vertex20}
なお,スクリプト内では,次のように定義されている。これを,半径1の球面に内接するように変換して戻り値としている。
φ=$\cfrac{1+\sqrt{5}}{2}$ は黄金比。
正四面体:$(0,0,1),\left(\cfrac{2\sqrt{2}}{3},0,-\cfrac{1}{3} \right),\left(-\cfrac{\sqrt{2}}{3},\cfrac{\sqrt{6}}{3},-\cfrac{1}{3} \right),\left(-\cfrac{\sqrt{2}}{3},\cfrac{\sqrt{6}}{3},-\cfrac{1}{3}\right)$
正六面体:$(-1,-1,1),(1,-1,1),(1,1,1),(-1,1,1),(-1,-1,-1),(1,-1,-1),(1,1,-1),(-1,1,-1)$
正八面体:$(0,0,1),(0,-1,0),(1,0,0),(0,1,0),(-1,0,0),(0,0,-1)$
正十二面体:$(0,-1,-φ^2),(0,1,-φ^2),(0,-1,φ^2),(0,1,φ^2),(-1,-φ^2,0),(1,-φ^2,0) $
\hspace{15mm}$ (-1,φ^2,0),(1,φ^2,0),(-φ^2,0,-1),(-φ^2,0,1),(φ^2,0,-1),(φ^2,0,1), $
\hspace{15mm} $ (-φ,-φ,-φ),(-φ,-φ,φ),(-φ,φ,-φ),(-φ,φ,φ), $
\hspace{15mm} $((φ,-φ,-φ),(φ,-φ,φ),φ,φ,-φ),(φ,φ,φ)$
正二十面体:$(0,-1,-φ),(0,1,-φ),(0,-1,φ),(0,1,φ),(-φ,0,-1),(-φ,0,1) $
\hspace{15mm} $ (φ,0,-1),(φ,0,1),(-1,-φ,0),(1,-φ,0),(-1,φ,0),(1,φ,0)$
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{val2tex}{}\item[関数] val2tex(x)
\item[機能] 数値をguess()で解析して,分数,平方根のTeXの文字列にして返す
\item[説明] 分数,平方根でない場合はguess()の結果をそのまま返す。
計算結果が分数や平方根になる場合に,この関数を適用し,戻り値の前後にドルマークをつけて drawtext()で表示すれば分数や平方根の形で表示される。letter3d() でも利用できる。ただし,精度によっては変換できない場合もある。
\item[戻り値] TeXの文字列
【例】:原点から平面に下した垂線の足の座標を計算して表示する。
\begin{verbatim}
pa=[2,0,0];
pb=[0,2,0];
pc=[0,0,2];
nv=normalvec(pa,pb,pc);
hv=distpp(pa,pb,pc,[0,0,0])*nv;
hvstr=apply(hv,val2tex(#));
plate3d("1",[pa,pb,pc],["Color=skyblue","Rayoff"]);
poly3d("1",[pa,pb,pc]);
arrow3d("1",[[0,0,0],hv],["size=2"]);
letter3d([pa,"s2",text(pa_1),pb,"s2",text(pb_2),pc,"w2",text(pc_3),
hv,"ne2","H$\left( "+hvstr_1+","+hvstr_2+","+hvstr_3+" \right)$"]);
\end{verbatim}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\end{description}
\newpage
%第4節 描画 =========================================
\section{描画関数}
\textbf{options}
直線・曲線を描く関数の引数には座標の他,オプションがある。KeTCindyのオプションの他,メッシュ密度,濃度,コントラスト,レイトレーシングの有無が指定できる。
\textbf{<メッシュ密度>}
曲面を描くとき,網目状にして描く。このときの経緯線の数。
メッシュ密度指定は,"Mesh=[10,15]" のように与える。
\textbf{<濃度>}
濃度は0から1までの実数。"Alpha=n" で,nは0以上1以下。たとえば,"Alpha=0.4"。初期設定は 0.3。
なお,「Alpha」は,CindyScriptの「透明度」と同じ語であるが,ここでは,濃淡を表し,1のときが指定した色で,0に近いと白に近くなる。向こう側が透けて見えるようになるわけではない。
\textbf{<レイトレーシング>}
レイトレーシングで陰影をつけるかどうかの指定。"Rayon" のとき陰をつけ,"Rayoff" のときは陰影をつけない。初期設定は "Rayon"
\textbf{<非表示>}
戻り値がプロットデータの描画関数で,プロットデータだけを取得したい場合に,KeTCindyと同様,"nodisp" オプションをつける。
\vspace{\baselineskip}
\textbf{描画関数の戻り値}
描画関数の幾つかには戻り値がある。それぞれの関数の説明を参照のこと。
%\newpage
\begin{description}
\hypertarget{grid}{}
\item[関数] grid(範囲1,範囲2,本数,option)
\item[機能] $xy$平面に方眼を表示する。
\item[説明] 範囲1は$x$軸の範囲,範囲2は$y$軸の範囲。
\item[戻り値] なし
本数は,単位(1目盛)あたりの本数。
色,太さなど,通常のoptionが有効。
引数,optionともなしで,grid() とすることも可能で,その場合は,範囲をsetaxis() で指定した範囲とし,単位あたり1本と10本の方眼を描く。
方眼は描画面だけで,TeXには出力されない。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{line3d}{}
\item[関数] line3d(name,座標リスト ,option)
\item[機能] 2点を結ぶ直線を描く
\item[説明] 2点の座標をリストで与えて,3次元空間に直線を表示する。
\item[戻り値] 2点の座標リストをそのまま返す。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{arrow3d}{}
\item[関数] arrow3d(name,座標リスト ,option)
\item[機能] 2点を結ぶ矢線を描く
\item[説明] 2点の座標のリストを与えて,3次元空間に矢線を表示する 。
option は,color指定以外は2次元の KeTCindy の Arrowdataと同様。
ただし,矢じりについては,Cinderellaの画面上では大きさ以外のオプションは反映されない。
また,矢じりについてのオプションは初めに書く必要がある。
\item[戻り値] 2点の座標リストをそのまま返す。
\vspace{\baselineskip}
【例】 2点$(1,3,2) , (-2,-1,-2)$ を結ぶ矢線を表示する。
\hspace{10mm} \verb|arrow3d("1",[[1,3,2],[-2,-1,-2]])|
【例】 矢じりの大きさを2にして,全体を赤で描く。
\hspace{10mm} \verb|arrow3d("1",[[2,0,0],[-1,4,1]],[2,1,1,"dr,2","Color=red"])|
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{poly3d}{}
\item[関数] poly3d(name,座標リスト,option)
\item[機能] 多角形を描く
\item[説明] リストで与えた点を結ぶ多角形を描く。リストで与えた点が同一平面上になくてもそれらの点を結んだ図形を描く。リストで与える点は閉じていなくてもよい。自動的に閉じて描く。
\item[戻り値] 描画した多角形のプロットデータ。
【例】 3点$(1,1,1) , (2,2,1),(0,1,-1)$ を頂点とする三角形を描く。
\begin{verbatim}
pd=[[1,1,1],[2,2,1],[0,1,-1]];
poly3d("1",pd);
\end{verbatim}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{plate3d}{}
\item[関数] plate3d(name,座標リスト,option)
\item[機能] 多角形を色塗りする
\item[説明] リストで与えた点を結ぶ多角形を色塗りする。縁取りはしない。
\item[戻り値] 引数に与えた座標リストをそのまま返す
Rayoff オプションをつけると,レイトレーシングを行わない。
【例】:3点$(1,1,1) , (2,2,1),(0,1,-1)$ を頂点とする三角形を赤で塗る
\begin{verbatim}
pd=[[1,1,1],[2,2,1],[0,1,-1]];
plate3d("1",pd,["Color=Red"]);
\end{verbatim}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{circle3d}{}
\item[関数] circle3d(name,中心,法線ベクトル,半径,option)
\item[機能] 円を描く
\item[説明] 中心,半径と法線ベクトルを与えて円を描く。
\item[戻り値] 円のプロットデータ
【例】:中心 $(1,1,1)$,半径2,法線ベクトルが(1,1,1)である円を太さ2,赤で描く。
\verb| circle3d("1",[1,1,1],[1,1,1],2,["dr,2","Color=Red"]); |
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{drawarc3d}{}
\item[関数] drawarc3d(name,中心,法線ベクトル,半径,範囲,option)
\item[機能] 弧を描く
\item[説明] 中心,半径と法線ベクトルを与えて描く円の一部として弧を描く。
円は,$x=r \cos \theta,y=r \sin \theta$ で描き,法線ベクトルで決まる回転行列で回転している。
\item[戻り値] 弧のプロットデータ
【例】:中心 $(1,1,1)$,半径2,法線ベクトルが(-1,1,1)である弧を描く。
\verb| drawarc3d("1",[1,1,1],[-1,1,1],2,[0,2*pi/3]); |
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{disc3d}{}
\item[関数] disc3d(name,中心,法線ベクトル,半径,option)
\item[機能] 中を色塗りした円盤を描く
\item[説明] 中心,半径と法線ベクトルを与えて円盤を描く。縁取りはしない。
\item[戻り値] 円のプロットデータ
Rayoff オプションをつけると,レイトレーシングを行わない。
【例】:中心 $(1,1,1)$,半径2,法線ベクトルが(1,1,1)である円盤を赤,透明度0.4で描く。
\verb| disc3d("1",[1,1,1],[1,1,1],2,["Color=Red","Alpha=0.4"]); |
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{drawsphere}{}
\item[関数] drawsphere(name,中心,半径,opton)
\item[機能] 球面を描く
\item[説明] 中心と半径を指定して球面を描く。
球面を簡易レイトレーシングを用いてグラデーションをかけて描く。 球面を網目状に分けて色塗りをしている。
引数は,中心の座標,半径,option。
半径は,x軸,y軸,z軸方向についてリストにして指定することもできる。
描画には時間がかかる。あまりにも時間がかかりすぎる場合は, "Mesh=[10,10]" をオプションにつけて描画してみる。これで描ければ編み目を細かくする。初期値は"Mesh=[30,20]"。
\item[戻り値] なし
\vspace{\baselineskip}
【例】原点中心,半径2の球面(下図左)
\verb|drawsphere("1",[0,0,0],2) |
中心が(0,0,2),半径が [1,1,2] :楕円形の球を緑で描く(下図右)
\verb|drawsphere("1",[0,0,2],[1,1,2],["Color=green","Mesh=[20,20]"])|
\input{3Dfig/sphere01} \hspace{10mm} \input{3Dfig/sphere02}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{quasisphere}{}
\item[関数] quasisphere(name,中心,半径,fill,option)
\item[機能] 疑似球面を描く
\item[説明] 中心と半径を指定して疑似球面を描く。
座標軸を動かしても常に法線ベクトルが視点を向いた円を描くので,球面同様に見える。しかし実際には面ではない。 したがって,陰線処理はしない。
引数は,中心の座標,半径,fill , option。
fill は塗りつぶすかどうかで,1なら塗りつぶす(初期値),0 なら塗らない。
fill は省略可能。
\item[戻り値] 円のプロットデータ
\vspace{\baselineskip}
【例】 \verb|quasisphere("1",[0,0,1],1,0]);|
\input{3Dfig/sphere03}
陰線処理をしない分,Sfbdparadata() と ExeccmdC() で描くより速い。これを用いて,次のようなスクリプトを作ると,疑似球面で十分であることがわかる。
\begin{verbatim}
pd1=quasisphere("1",[0,0,0],2,0,["nodisp"]);
pd2=circle3d("1",[0,0,0],[0,1,sqrt(3)],2,["nodisp"]);
pd3=circle3d("2",[0,0,-1],[0,0,1],sqrt(3),["nodisp"]);
sp=apply(pd1,map2d(#));
su1=apply(pd2,map2d(#));
su2=apply(pd3,map2d(#));
Listplot("1",sp,["nodisp"]);
Listplot("2",su1);
Listplot("3",su2,["Color=blue"]);
int1=Intersectcrvs("sg1","sg2");
int2=Intersectcrvs("sg1","sg3");
println(int1);
println(int2);
p1=int1_1;
p2=int1_2;
p3=int2_1;
p4=int2_2;
Partcrv("1", p2, p1, "sg1");
Partcrv("2", p3, p4, "sg3",["nodisp"]);
Partcrv("3", p4, p3, "sg1",["nodisp"]);
Joincrvs("1",["part2","part3"],["nodisp"]);
Shade(["join1"],["Color=[0.2,0,0,0]"]);
\end{verbatim}
スライダを動かして視点を変えたとき,次のようになる。
\input{3Dfig/sphere04} \hspace{10mm} \input{3Dfig/sphere05}
なお,このスクリプトを実行したとき,視点によって交点 int1 , int2 の数が変わるので,コンソールに表示されたものを見て,\verb|p1,p2,p3,p4| を設定する必要がある。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{polyhedron}{}
\item[関数] polyhedron(name,面データ,option)
\item[機能] 面を色塗りした多面体を描く
\item[説明] 縁取りはしない。
\item[戻り値] 引数の面データをそのまま返す
Rayoff オプションをつけると,レイトレーシングを行わない。
\vspace{\baselineskip}
【例】 立方体ABCD-EFGHを,B,D,Gを通る平面で切ってできる錐体を緑で描く。
\hspace{30mm}\input{3Dfig/polyhedron01}
頂点B,C,D,Gに対し,面リストを次のように作る。
まず,頂点 B,C,D,G に番号1,2,3,4 をつける。
面BCGは外側から見て反時計回りに B,C,G なので [1,2,4]
面CDGは同様に C,D,G なので [2,3,4]
面DGBは同様に D,B,G なので [3,1,4]
底面BCDは外側から見て反時計回りに B,D,C なので [1,3,2]
そこで,B,C,D,G の座標をp1,p2,p3,p4として,次のようにして面データ \verb|fd| を作る。
\begin{verbatim}
p1=[2,0,0];
p2=[2,2,0];
p3=[0,2,0];
p4=[2,2,2];
fd=[[p1,p2,p3,p4],[[1,2,4],[2,3,4],[3,1,4],[1,3,2]]];
\end{verbatim}
この面データを使って
\verb| polyhedron("1",fd,["Color=Green"])|
とすれば,錐体が描かれる。
\hspace{30mm}\input{3Dfig/polyhedron02}
【例】小林・鈴木・三谷による 多面体データ polyhedrons\_obj を用いた多面体を描く。
データは,正多面体,半正多面体,ジョンソンの立体で,
\url{http://mitani.cs.tsukuba.ac.jp/polyhedron/index.html }
にある。このデータを格納したフォルダ polyhedrons\_obj へのパスを \verb|Setdirectory()| で指定し,\verb|Readobj()| で読み込む。たとえば,ワークディレクトリ(figフォルダ)に置いた場合は,
\begin{layer}{150}{0}
\putnotese{80}{0}{\input{3Dfig/polyhedron03}}
\end{layer}
\begin{verbatim}
Setdirectory(Dirwork+"/polyhedrons_obj");
polydt=Readobj("s06.obj");
Setdirectory(Dirwork);
fd=[2*polydt_1,polydt_2];
polyhedron("1",fd);
\end{verbatim}
で右のような図ができる。
なお,\verb|fd=[2*polydt_1,polydt_2]| で,頂点の座標を2倍にしている。
稜線を描くのであれば
\begin{verbatim}
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1");
\end{verbatim}
を追加すればよい。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{convexhedron}{}
\item[関数] convexhedron(name,頂点リスト,倍率,option)
\item[機能] 凸型多面体を描く
\item[説明] 頂点リストを与えて面を塗った凸型多面体を描く。倍率は,頂点リストに対して実際に描画するサイズへの倍率。1のときは省略できる。
\item[戻り値] 描画した面データ。
\vspace{\baselineskip}
【例】底面が五角形の凸型多面体
\begin{verbatim}
th=2*pi/5;
pd=apply(1..5,[cos(#*th),sin(#*th),0]);
pd=pd++apply(1..5,[2*cos(#*th),2*sin(#*th),1]);
pd=append(pd,[0,0,2]);
println(pd);
fd=convexhedron("1",pd)
\end{verbatim}
\hspace{20mm}\input{3Dfig/convexhedron}
稜線を描くのであれば,戻り値を利用して
\begin{verbatim}
fd=convexhedron("1",pd);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1");
\end{verbatim}
とすればよい。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{rpolyhedron}{}
\item[関数] rpolyhedron(name,面数,半径,option)
\item[機能] 面を色塗りした正多面体を描く
\item[説明] 正多面体は5種類あり,Spacekcにはデータが組み込まれている。\hyperlink{rpolydata}{正多面体の頂点座標}を参照のこと。これを用いて,面の数と外接球の半径を指定すれば正多面体を描くことができる。
\item[戻り値] 描画した面データ
\vspace{\baselineskip}
【例】 面を黄色で塗った正十二面体を描く
\verb| rpolyhedron("1",6,2,["Color=yellow"]);|
\hspace{20mm}\input{3Dfig/rpolyhedron}
稜線を描くのであれば,戻り値を利用して
\begin{verbatim}
fd=rpolyhedron("1",12,2,["Color=yellow"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1");
\end{verbatim}
とすればよい。
\vspace{\baselineskip}
<参考>正多面体のサイズ
rpolyhedron() では,指定した半径の球面に内接するサイズで描画する。ここで,その半径と辺の長さの関係をあげておく。ここで,$\phi=\cfrac{1+\sqrt{5}}{2}$
\input{3Dfig/rpolytable}
【例】 一辺の長さが2の正六面体を描く
\begin{verbatim}
rpolyhedron(6,sqrt(3),["dr,2"]);
\end{verbatim}
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{rfrustum}{}
\item[関数] frustum(name,n,r1,r2,h,option)
\item[機能] 正角錐(台)の面を塗る
n:角の数
r1,r2:上底,下底の外接円の半径
h:高さ
\vspace{\baselineskip}
【例】 正六角錐台を描く
\verb| frustum("1",6,1,2,3,["Color=yellow"]);|
\hspace{20mm}\input{3Dfig/frustum01}
稜線を描くのであれば,戻り値を利用して
\begin{verbatim}
fd=frustum("1",6,1,2,3,["Color=yellow"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1");
\end{verbatim}
とすればよい。
【例】 上底の外接円の半径を0にすれば正六角錐になる。 (座標軸非表示)
\begin{verbatim}
fd=frustum("1",6,0,2,3,["Color=yellow"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1");
\end{verbatim}
\hspace{20mm}\input{3Dfig/frustum02}
【例】 角数を多くするとほとんど円錐になる。輪郭線はSfbdparadataで曲面として描く。
\begin{verbatim}
frustum("1",108,0,2,4,["Color=yellow"]);
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);
ExeccmdC("1");
\end{verbatim}
\hspace{20mm}\input{3Dfig/frustum03}
上底と下底を同じサイズにすれば円柱になる。
\begin{flushright} \hyperlink{functionlist}{$\Rightarrow$関数一覧}\end{flushright}
\hypertarget{hatch3d}{}\item[関数] hatch3d(name,方向,PD,option)
\item[機能] 閉曲線にハッチをかける。
\item[説明] 閉曲線は,poly3d() , circle3d(); で描いたものなど。
KeTCindy のHatchdata() と異なり,閉曲線だけが対象なので,方向は引数にない。optionには色指定を入れることができ,色指定があればその色でハッチをかける。 複数の領域にハッチをかけることはできない。
\item[戻り値] なし
【例】 円にハッチをかける。
\begin{verbatim}
pd=circle3d("1",[1,1,1],[1,1,1],2,["dr,2"]);
hatch3d("1",pd,["Color=red"]);
\end{verbatim}
\input{3Dfig/hatch1}
\newpage
\end{description}
% 関数一覧 ================================
\hypertarget{functionlist}{}
\section{関数一覧}
KeTCindy の関数名が大文字で始まるのに対し,Spacekcの関数名は小文字で始まる。ただし,若干例外がある。\\
\begin{tabbing}
123456789012345678901234567890123456789\=\kill
【定数】\\
\hyperlink{lightpoint}{Lightpoint} \> 光源の方向ベクトル\\
\hyperlink{contrast}{Contrast} \> コントラスト\\
\hyperlink{rpolydata}{Rpolydata} \> 正多面体の頂点リスト\\
【値の取得】\\
\hyperlink{angle3pt}{angle3pt}(座標,座標,座標) \>平面上の3点p1,p2,p3 に対し角p1p2p3を返す\\
\hyperlink{pointindomain}{pointindomain}(座標,点リスト) \> 平面上で点が閉曲線内にあるかどうかの判定\\
\hyperlink{distlp}{distlp}(座標,座標,座標) \>2点を通る直線と点の距離を取得する\\
\hyperlink{distpp3d}{distpp3d}(座標,座標,座標,座標) \>座標空間で3点を通る平面と点の距離を取得する\\
\hyperlink{map2d}{map2d}(座標) \>空間座標を座標平面に射影した点の座標を取得する\\
\hyperlink{nomalvec}{nomalvec}(座標,座標,座標) \>3点を通る平面の法線単位ベクトルを取得する\\
\hyperlink{perp}{perp}(座標,座標,座標) \>座標空間で2点を通る直線への垂線の足の座標を取得する\\
\hyperlink{perpvec}{perpvec}(ベクトル,flag) \>ベクトルに垂直な平面上に直交する基本ベクトルをとる\\
\hyperlink{planecoeff}{planecoeff}(座標,座標,座標) \>座標空間で3点を通る平面の方程式の係数を取得する\\
\hyperlink{crosssd}{crosssd}(座標,座標,座標,座標) \>座標平面で2つの線分が交わるかどうかの判断\\
\hyperlink{interpl}{interpl}(座標,座標,座標,座標,座標) \>平面と直線の交点の座標を求める\\
\hyperlink{interps}{interps}(座標,座標,座標,座標,座標) \>平面と線分の交点の座標を求める\\
\hyperlink{reflect3d}{reflect3d}(リスト,リスト) \>データの鏡像を得る\\
\hyperlink{rotate3d}{rotate3d}(座標,角リスト) \>データを回転する\\
\hyperlink{translate3d}{translate3d}(リスト,ベクトル) \>データを平行移動する\\
\hyperlink{vertexrpolyhedron}{vertexrpolyhedron}(数) \>正多面体の頂点リストを取得する\\
【描画】\\
\hyperlink{grid}{grid}() \>$xy$平面の方眼の描画\\
\hyperlink{line3d}{line3d}(name,list,option)\>2点を結ぶ直線を描く\\
\hyperlink{arrow3d}{arrow3d}(name,list,option) \>2点を結ぶ矢線を描く\\
\hyperlink{poly3d}{poly3d}(name,list,option) \>多角形を描く\\\hyperlink{circle3d}{circle3d}(name,center, r,vec,option) \>円を描く\\
\hyperlink{drawarc3d}{circle3d}(name,center, r,vec,range,option) \>弧を描く\\
\hyperlink{plate3d}{plate3d}(name,list,option) \>多角形を色塗りする\\
\hyperlink{disc3d}{disc3d}(name,center, r, vec,option) \>中を塗った円盤を描く\\
\hyperlink{drawsphere}{drawsphere}(name,center,r,option) \>球面を描く\\
\hyperlink{quasisphere}{quasisphere}(name,center,r,option) \>球面のようなものを描く\\
\hyperlink{frustum}{frustum}(name,fn,r1,r2,h, option) \>角錐台を描く\\
\hyperlink{polyhedron}{polyhedron}(name,fd,option) \>面を色塗りした多面体を描く\\
\hyperlink{rpolyhedron}{rpolyhedron}(name,fn,r,option) \>面を色塗りした正多面体を描く\\
\hyperlink{convexhedron}{convexhedron}(name,pd,size,option) \>面を色ぬりした凸型多面体を描く\\
\hyperlink{hatch3d}{hatch3d}(name,direc,PD,option) \> 閉曲線にハッチをかける\\
\end{tabbing}
\end{document}
|