summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/support/ketcindy/source/spacekc/SpacekcReferenceJ.tex
blob: 8895afad7f4ea8f2c443a27b504ec01e05f46ea1 (plain)
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}