3.3 例題プログラム PUNI.SUB および PUZZLE.BAS の解説
目次へ戻る;
3.3.1 PUNI.BAS
- 最も基本的な幾何モデルである二つの6面体を使って、和・差・積(PUNI/PSUB/PINT)の例題を作ったものです。二つの6面体を単に透視図で描くと、相対的な位置関係がよく分かりません。これは、モデルが単純な図形であるほど不確かになります。この欠点は、立体図形を平面図形で表そうとすると必ず起きる錯覚の問題です。図学的に干渉を求めるには、二つ以上の正投影図を必要とするのです。二つの6面体の和・差・積の演算の結果を透視図に描いて、相互に比較することで元の立体モデルの位置関係を納得することができます。
- 作図のコマンドは、簡易隠線消去のアルゴリズムを使った HFDISP を使っています。これは、凸多面体では正しい図形が得られますが、面の交差が一部で凹になる多面体では正しくないことが起こります。例題の図で、 PUNI と PSUB の結果の図には、本来ならば点線で表わすべき線が、実線のまま表示されています。作図コマンドの解説は、後の4章で詳しく説明します。
- 面で立体を切断する例題 PCUT も例示しました。このコマンドを実用するとき、切断面を面方程式(ax+by+cz+d=0)の4つの係数(a,b,c,d)で指定しなければなりません。思った通りの切断面を指定することが、普通ではなかなか難しい幾何の問題になります。
10 PRINT "GEOMAP Demonstration Program"
20 PRINT "--- Addition/Subtraction/Intersection/Cutting ---"
30 DIM BSIZE(3,2,2),FAEQ(4),NAME$(2)
40 READ BSIZE : REM ------ DATA FOR BSIZE ------
50 DATA 3*-30, 3*10, 3*-10, 3*30
60 READ FAEQ : REM ------ DATA FOR FACE ------
70 DATA 0.3 -0.1, 0.5, 0
80 READ NAME$ : REM ------ NAMING FOR BODIES ------
90 DATA "A1","A2"
100 REM ============================== DPCAM
110 CAM(1)=250 : CAM(2)=-200 : CAM(3)=120 : TH=0.4
120 DPCAM CAM,TH
130 REM ============================== PUNI
140 CMINIT
150 FOR I=1 TO 2
160 PCUBEM NAME$(I), BSIZE(1,1,I), BSIZE(1,2,I)
170 NEXT I
180 CLS : HFDISP "A1": HFDISP "A2"
190 PUNI "A1", "A2"
200 CLS : HFDISP "A1",0,4
210 REM ============================== PSUB
220 CMINIT
230 FOR I=1 TO 2
240 PCUBEM NAME$(I), BSIZE(1,1,I), BSIZE(1,2,I)
250 NEXT I
260 PSUB "A1", "A2"
270 CLS : HFDISP "A1",0,4
280 REM ============================== PINT
290 CMINIT
300 FOR I=1 TO 2
310 PCUBEM NAME$(I), BSIZE(1,1,I), BSIZE(1,2,I)
320 NEXT I
330 PINT "A1", "A2"
340 CLS : HFDISP "A1",0,4
350 REM ============================== PCUT
360 CMINIT
370 PCUBEM NAME$(1), BSIZE, BSIZE(1,2,1)
380 CLS : HFDISP "A1",,4
390 PCUT "A1", FAEQ
400 CLS : HFDISP "A1",0,4
410 REM ============================= PDCOMP
420 CDIR : PRINT "DECOMPOSE INTO TWO PARTS"
430 PDCOMP "A1"
440 CDIR
450 CRENAM "A1","A2"
460 CDIR
470 CLS : HFDISP "A1",,4
480 END
3.3.2 PUZZLE.BAS
- この例題プログラムは、GEOMAPのモデリングの機能と、隠れ線処理で作図することを最もよく表わしています。前2つの章で解説したコマンドを効果的に応用して、短いプログラムで高度な処理が行なわれています。
- まず、正六角柱を一つ作ります(PRCYLN)。
- このコピ−を二つ作ります(PCOPY) 。
- 3本の正六角柱を互いに離して、正三角形の頂点位置に置きます (PGDIS)。
- 3本の正六角柱を合わせて一つの集合体にします(PUNI)。
- この集合体を、世界座標のy軸回りに 54.73度回転させます(PGROTA)。
- 回転させた集合体のコピーを、3つ作ります(PCOPY) 。これで12本の正六角柱です。
- 世界座標のz軸を回転軸にして、互いに90度ずつの角度差で回転させます(PGROTA)。
- 最後に4組の集合体を一つに合わせます(PUNI)。
- カメラの位置を決め(DPCAM) 、ワイヤ−フレ−ムモデルとして作図します(HEDISP)。
- この立体モデルを、完全な隠れ線消去をさせた2次元図形のデータに変換します。この図形データは、平面図形の幾何モデルとして、名前を"AIMAG" とつけます。この時点では作図がされていません。
- GEOMAPの記憶領域には、立体のモデル"A" と、図形のモデル"AIMAG" とが存在しています。
- スクリーンにはワイヤフレームが作図されていますが、それを消去して (CLS)、モデルの透視図を描かせます (HDISP)。
- この立体モデルは、外からは見えませんが、中心は空洞になっています。HEDISPでは、空洞の部分の辺が作図されています。
- 隠れる線の処理による作図では、ちょっとした工夫が凝らされています。六角柱の辺が手前の角柱の裏に隠れるところでは、線をわずかに手前で止めて描いてあります。これによって、線の奥行を表示して立体感を助けます。線を手前で切るときの隙間は、グラフィックスの解像度を内部で参照して決めています。
- なお、六角柱の位置決めの各種数値は、正八面体の基本数値を参照してあらかじめ計算したものです。
10 PRINT "GEOMAP Demonstration Program"
20 PRINT "--- Synthesized Model; PUZZLE ---"
30 PRINT "--- It takes about 7 minutes for synthesizing and"
40 PRINT "--- about 15 minutes for the complete hidden line"
50 PRINT "--- eliminated image"
60 CMINIT
70 PRCYLN "A",6,,2.,20.
80 COPY "A","B","C"
90 DIR(1)= 3.0 : DIR(2)= 1.732 : PGDIS "A",,DIR
100 DIR(1)=-3.0 : PGDIS "B",,DIR
110 DIR(1)= 0.0 : DIR(2)=-3.464 : PGDIS "C",,DIR
120 PUNI "A","B","C"
130 AXIS(2,2)=1.0
140 PGROTA "A",,54.73,AXIS
150 COPY "A","A2","A3","A4"
160 AXIS(2,2)=0.0 : AXIS(3,2)=1.0
170 PGROTA "A2",, 90.,AXIS
180 PGROTA "A3",,180.,AXIS
190 PGROTA "A4",,270.,AXIS
200 PUNI "A","A2","A3","A4"
210 CPOS(1)=30 : CPOS(2)=30 : CPOS(3)=20
220 TH=0.8
230 DPCAM CPOS,TH
240 HEDISP "A"
250 HLIMAG "A","AIMAG"
260 CLS : HDISP "AIMAG"
270 END
目次へ戻る;