Показать сообщение отдельно
Старый 31.05.2014, 13:44   #1
polopok
ПроЭктировщик
 
Регистрация: 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. Причина: дополнение
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо polopok за это полезное сообщение:
LLI.T.A.L.K.E.R. (31.05.2014), St_AnGer (02.06.2014)