N88-BASICでレイトレーシング (2回目)

2021/6/2(水)

 N88-BASICでレイトレーシング (2)

 

(by ULproject for N88-BASIC, NL-BASIC)

 

今回からプログラムの行番号は省略して説明します

 

まず複数の球から1番近い交点までの距離を求めます

まず、SNが球の数で配列要素0~2の3個の球を

定義します

 

SN = 3 ' 球の個数

DIM SP(SN-1, 2), SR(SN-1)

'    center     radius

DATA -12, 8,  -5,   2  '光源

DATA   5, 0, -40,  12  '大球

DATA   0, 5, -20,   4  '小球

'

FOR I=0 TO SN-1

  READ SP(I,0), SP(I,1), SP(I,2), SR(I), SC(I)

NEXT

 

SP(0,0),SP(0,1),SP(0,2)は0番の球の中心座標です

座標の向きは、1回目の図1を見て下さい

SR(0)は0番の球の半径です

 

DATA文の値をREAD文で変数に読込んでいます

 

c番の球までの距離t0を求めるには

視点Vから球の中心座標(SP(c,0),SP(c,1),SP(c,2))を

引き、球を原点に移動させた視点をV0として

交点までの距離を求めます

 

V0(0) = V(0) - SP(C,0)

V0(1) = V(1) - SP(C,1)

V0(2) = V(2) - SP(C,2)

R     = SR(C)

GOSUB *DISTANCE.SPHERE

 

t0に距離が入ります

:(コロン)はマルチステートメントで、

1行に複数のステートメント(命令など)

を書くときの区切り文字です

 

c=0,1,2のt0で一番近いもの

tにすれば良いので、

 

T = -1: SI = -1

FOR C=0 TO SN-1

  V0(0) = V(0) - SP(C,0)

  V0(1) = V(1) - SP(C,1)

  V0(2) = V(2) - SP(C,2)

  R     = SR(C)

 GOSUB *DISTANCE.SPHERE

  IF T0 >= 0 THEN IF T0 < T OR T < 0 THEN T = T0: SI = C

NEXT

 

一番近い距離tとその球番号siを-1にしておきます

FOR C=0 TO SN-1

は、0からSN-1まで1ずつ

FOR,NEXT間を繰返します

 

今回SN=3なのでC=0,1,2の3回繰返します

 

IF T0 >= 0 THEN IF T0 < T OR T < 0 THEN T = T0: SI = C

 

は、t0<0 なら前方に交点がないので無視し

t0≧0 なら前方に交点があるのでTHEN以降へ

 

IF T0 < T OR T < 0 THEN T = T0: SI = C

 

t<0ならt0は初めての前方の距離なので

無条件にtをt0にし、siをcにします

または、t0<t なら、t0の方が近いので

tをt0にし、siをcにします

 

これで、tに前方の一番近い距離(負なら無し)

siにその球番号(0~sn-1)が入ります


NL-BASICとblg~.zip(ray002.bas)は

以下のリンクからダウンロードできます

NL-BASIC(N88-BASIC互換?)ホームページ

Readme.txtを読んで遊んで下さい


次回

N88-BASICでレイトレーシング (3回目)


このブログの人気の投稿

NEWS

N88-BASICでゲーム (1回目)