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)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
次回