1.4 例題プログラム PCUBE.BAS の解説
目次へ戻る
- 例題プログラムは、種々の3Dの幾何モデルの創成をまとめたものです。基本BASICの文法で記述されていますので、それほど解読は難しくないと思います。モニター画面にはモデル一つずつがディスプレイされますが、図1.2はこれらを一ページ分にまとめたものです。
- プログラムリストの英字は、歴史的な背景があって大文字だけが使われていますが、新しいバージョンでは、英字の小文字も利用できるものがあります。
- このプログラムが作成された年代の16ビットのパーソナルコンピュータは、クロック周波数が4〜8MHz 程度でしたので、画像が出て次の画像を作るまでに図を観察する時間的なゆとりがありました。現在の高速のCPUでは処理が早くなりすぎるので、HFDISPのコマンドの後に、PAUSE 文を挿入しておくのがよいでしょう。
- NUCE_BASICの作業領域は変数と配列を管理します。これはBASICのプログラムをRUNコマンドで実行させるとそれまでの変数と配列すべて消去されます。GEOMAPのモデル保存の作業領域は、上とは別になっていて、この作業領域の初期化はCMINITで処理されます。
- GEOMAPのコマンドは、NUCE_BASICの基本コマンドに対して追加コマンドの形をとっていて、幾何学的な処理に便利なように命名にも工夫されています。Pで始まるコマンド名(PCUBE,PWEDGE,PCYLN,PCONE...) は、多面体(Polyhedron)を意味してつけた英字です。
- コマンド PTRUNC は、多面体生成の基本コマンドですが、回転体の側面を平面で削ぎ落として(truncated) 作ったという意味の命名です。PHDFCとPHDFLはPoliHeDronの面(Face)をカット(Cut)して作る、また面の周(Loop)を回る頂点の集合で与える、と言う意味での命名です。
- 紛らわしいのは PCYLNとPRCYLN の区別、 PCONEとPRCONEの区別です。 Rは Regularの意味で、正多角柱、正多角錐を意味しています。
- グラフィックスに関係するコマンドは、イニシャルにDがついたものと、Hがついたものとがあります。グラフィックスのコマンドは、ハードウェアに依存しますので、これに関係するコマンドにDがつけてあります。全体の実行形式のプログラムをコンパイルするとき、この処理系を別扱いしています。Hは、隠れ線処理(Hidden line) に関係した処理という意味が込められていますが、原理的には3D-2Dのモデル変換のコマンド群です。CLSは、MS-DOSのClear-Screenで馴染んでいますので流用しました。
- プリミティブの生成コマンドで、PRCYLNとPRCONEとでは、パラメータとしてICURVの指定を変えて別のモデルを作っています。ここでのRはRegularの意味、つまり正多角柱、正多角錐を意味します。このときICURVの省略値は0で使います。ICURV=1とすると、円柱または円錐を、正多角柱または正多角錐で近似することを指定します。この区別は図1.2で確かめて下さい。
10 PRINT "GEOMAP Demonstration Program"
20 PRINT "---Generation Several Solid Models---"
30 DIM XYPOS(2,8),ZXPOS(2,10),ZXPOS2(2,3),XYZPOS(3,14)
40 DIM FAEQ(4,2),ITABL(60)
50 READ XYPOS : REM ------ DATA FOR XYPOS ------
60 DATA 10,10,0,7,-10,10,-7,0,-10,-10,0,-7,10,-10,7,0
70 READ ZXPOS2 : REM ------ DATA FOR ZXPOS2 ------
80 DATA -10,1,0,0.5,10,1
90 READ XYZPOS : REM ------ DATA FOR XYZPOS ------
100 DATA 4 4 6, 4 -6 6, 0 4 10, 0 -6 10, -6 4 10, -6 -6 10,
110 DATA 4 -6 -10, 4 8 -10, 4 8 -6, 4 4 -6, -6 8 -10,-6 8 -6
120 DATA -6 4 -6, -6 -6 -10
130 READ ITABL : REM ------ DATA FOR ITABLE ------
140 DATA 1 10 13 5 3 9900
150 DATA 9 8 11 12 9900
160 DATA 6 14 7 2 4 9900
170 DATA 4 3 5 6 9900
180 DATA 9 12 13 10 9900
190 DATA 7 14 11 8 9900
200 DATA 2 1 3 4 9900
210 DATA 2 7 8 9 10 1 9900
220 DATA 5 13 12 11 14 6 9900 9999 /
230 READ FAEQ : REM ------ DATA FOR FAEQ ------
240 DATA 1 0 1 -4, -1 0 1 -4
250 REM ============================== DPCAM
260 CAM(1)=35: CAM(2)=-25 : CAM(3)=30 : TH=0.8
270 DPCAM CAM,TH
280 PCUBE "A",10.,12.,20.
290 CLS : HFDISP "A",0,4
300 CMINIT : REM ===================== PCUBEM
310 DIM POSA(3),POSB(3) : READ POSB : DATA 5 6 10
320 PCUBEM "A",POSA,POSB
330 HFDISP "A",0,4
340 CMINIT : REM ===================== PEWEDG
350 PEWEDG "A",10.,12.,20. v
360 CLS : HFDISP "A",0,4
370 CMINIT : REM ===================== PRWEDG
380 PRWEDG "A",10.,12.,20.
390 HFDISP "A",0,4
400 CMINIT : REM ===================== PRCYLN(EDGE)
410 ICURV=0 : PRCYLN "A",12,0,5.,15.,ICURV
420 CLS : HFDISP "A",0,4
430 CMINIT : REM ===================== PRCYLN(ROUND)
440 ICURV=1 : PRCYLN "A",12,0,5.,15.,ICURV
450 CLS : HFDISP "A",0,4
460 CMINIT : REM ===================== PRCONE(EDGE)
470 ICURV=0 : PRCONE "A",12,0,5.,15.,ICURV
480 CLS : HFDISP "A",0,4
490 CMINIT : REM ===================== PRCONE(ROUND)
500 ICURV=1 : PRCONE "A",12,0,5.,15.,ICURV
510 CLS : HFDISP "A",0,4
520 CMINIT : REM ===================== PCYLN
530 NP=8 : HEIGHT=10 : ICURV=0
540 PCYLN "A",XYPOS,NP,HEIGHT,ICURV
550 CLS : HFDISP "A",0,4
560 CMINIT : REM ===================== PCONE
570 PCONE "A",XYPOS,NP,HEIGHT,ICURV
580 CLS : HFDISP "A",0,4
590 REM ============================== PREVL
600 NP=10 : NPP=NP-1 : ANG=3.1416/NPP : THETA=0
610 FOR I=1 TO NPP
620 ZXPOS(1,I)=-10*COS(THETA) : ZXPOS(2,I)=10*SIN(THETA)
630 THETA=THETA+ANG
640 NEXT I
650 ZXPOS(1,NP)=10 : MREV=12 : ICURV=0
660 FOR ANG=360 TO 90 STEP -90
670 CMINIT
680 PREVL "A",ZXPOS,NP,MREV,ANG,ICURV
690 CLS : HFDISP "A"
700 NEXT ANG
710 CMINIT : REM ===================== PTRUNC
720 ICURV=0 : NXY=8 : NZX=3
730 PTRUNC "A",XYPOS,NXY,ZXPOS2,NZX,ICURV
740 CLS : HFDISP "A",0,4
750 CMINIT : REM ===================== PHDFL
760 NV=14 : NC=52
770 PHDFL "A",XYZPOS,NV,ITABL,NC
780 CLS : HFDISP "A",0,4
790 CMINIT : REM ===================== PHDFC
800 NF=2 : RADIUS=5
810 PHDFC "A",FAEQ,NF,RADIUS
820 CLS : HFDISP "A",0,4
830 REM ============================== PHEDRA
840 FOR I=1 TO 7
850 CMINIT
860 PHEDRA "A",I,10.,
870 CLS : HFDISP "A",0,4
880 NEXT I
890 FOR I=1 TO 11
900 CMINIT
910 PHEDRA "A",I+100,10.
920 CLS : HFDISP "A",0,4
930 NEXT I
940 END
目次へ戻る