ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
простой ray casting 2d array hit
Думаю и этот код будет полезен ...
Код в Offtop :
ttt = CreateTimer(60)
;SeedRnd(MilliSecs())
Const numT=10 , sizeT = 20
Dim AA(numT*numT,numT*numT)
Graphics 640,480
SetBuffer BackBuffer()
x2#=130 :y2#=130
x1 =x2 : y1=y2
For b =0 To numT
For a =0 To numT
AA(a,b) = Rnd (1 )
Next
Next
While Not KeyHit(1)
Cls ; Сначала очищаем экран
x2 =MouseX() : y2=MouseY()
CamFOV#= (180+ATan2(x1-x2,y1-y2))
If MouseHit(1) Then x1 =MouseX() : y1=MouseY()
WaitTimer(ttt)
For angle#= 0 To 360 Step 2
x3# = 40+200*Sin#(angle)
y3# = 150+200*Cos#(angle)
line2(40,150,x3,y3,25,25,125)
Next
For angle#= 30 To -30 Step -0.09
x2# = x1+200*Sin#(CamFOV-angle)
y2# = y1+200*Cos#(CamFOV-angle)
line2(x1,y1,x2,y2,255,25,25)
Next
For b =0 To numT
For a =0 To numT
If AA(a,b) = 1 Then Rect a*sizeT ,b*sizeT ,sizeT ,sizeT ,0
If AA(a,b) = 2 Then Rect a*sizeT ,b*sizeT ,sizeT ,sizeT ,1
If AA(a,b) = 2 Then AA(a,b) = 1
Next
Next
Line x1,y1,x2,y2
Line x1,y1,x1+200*Sin(CamFOV-30),y1+200*Cos(CamFOV-30)
Line x1,y1,x1+200*Sin(CamFOV),y1+200*Cos(CamFOV)
Flip ; Меняем буфер
Wend
FreeTimer(tttt)
End
Function line2(x1#,y1#,x2#,y2#,red=-1,green=-1,blue=-1)
Local StopLine = 0
If red>0 And green=-1
rgb=red
Else If red=-1
rgb = ColorBlue() Or ( ColorGreen() Shl 8) Or ( ColorRed() Shl 16)
Else
rgb=blue Or (green Shl 8) Or (red Shl 16)
EndIf
xd#=x2-x1
yd#=y2-y1
If Abs(xd)>Abs(yd) steps=Abs(xd) Else steps=Abs(yd)
x2=xd/Float(steps)
y2=yd/Float(steps)
; For Stepr=steps To 1 Step -1
While Not (x1=x2 And y1=y2) Or ( (StopLine = 1)) Or (Not ( x1 <=( numT*sizeT+sizeT) And y1 <=(numT*sizeT+sizeT) And x1>-2 And y1>-2))
WritePixel x1,y1,rgb
x = Floor(x1/sizeT) : y= Floor(y1/sizeT)
If ( x <=numT And y <=numT And x >=0 And y >=0)
If AA(x,y) =1 Or AA(x,y) =2 Then
AA(x,y) =2
StopLine = 1
Exit
EndIf
EndIf
x1=x1+x2
y1=y1+y2
; Next
Wend
End Function
Другой вариант :
;
ttt = CreateTimer(120)
;SeedRnd(MilliSecs())
Const numT=10 , sizeT = 20
Dim AA(numT*numT,numT*numT)
Graphics 800,600,32,2
SetBuffer BackBuffer()
x2#=130 :y2#=130
x1# =x2 : y1#=y2
For b =0 To numT
For a =0 To numT
AA(a,b) = Rnd (1 )
Next
Next
While Not KeyHit(1)
Cls
x2 =MouseX() : y2=MouseY()
If MouseDown(1) Then x1 =MouseX() : y1=MouseY()
WaitTimer(ttt)
RayCast2d(x1,y1,x2,y2)
For b =0 To numT
For a =0 To numT
If AA(a,b) = 1 Then Rect a*sizeT ,b*sizeT ,sizeT ,sizeT ,0
If AA(a,b) = 2 Then Rect a*sizeT ,b*sizeT ,sizeT ,sizeT ,1
If AA(a,b) = 2 Then AA(a,b) = 1
Next
Next
Flip
Wend
FreeTimer(tttt)
End
Function RayCast2d(x1#,y1#,x2,y2)
Local count,StopLine,angle#
dx# = x1-x2
dy#= y1-y2
a# = 180+ATan2(dy,dx) ;
For angle#= 30 To -30 Step -0.5
vx# = Cos(a+angle)
vy#= Sin(a+angle)
x0#= x1
y0#=y1
count=0 : StopLine =0
While (count<100) Or (StopLine = 1 )
WritePixel x0,y0,$00ffff
x = Floor(x0/sizeT) : y= Floor(y0/sizeT)
If ( x <=numT And y <=numT And x >=0 And y >=0)
If AA(x,y) =1 Or AA(x,y) =2 Then
AA(x,y) =2
StopLine = 1
Exit
EndIf
EndIf
x0# = (x0#+vx)
y0# =(y0#+vy)
count=count+1
Wend
Next
End Function
__________________
Мой проект здесь
Последний раз редактировалось polopok, 31.05.2014 в 15:25.
Причина: дополнение
|