Тема: Voxel (octotree)
Показать сообщение отдельно
Старый 05.05.2013, 07:22   #1
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Voxel (octotree)

Итак , пробую связать воксели в изометрии .
Код правда сырой ,да и при большей глубине(depth) уж сильно тормозит
код:
Global id,level ,mx,my ,QDepth  
Global px#,py,pz ,s

Type QUADTREE
Field Child.QUADTREE[7] ;8 потомков
Field xmin,ymin,zmin ; начальные координаты квадранта
Field xmax,ymax,zmax ; оконечные координаты квадранта 
Field id ,vis , lock;  ;vis - visible , lock - bloked
End Type

Function Quadtree.QUADTREE(xmin,ymin,zmin,xmax,ymax,zmax,depth)
this.QUADTREE = New QUADTREE
this\xmin = xmin
this\xmax = xmax
this\ymin = ymin
this\ymax = ymax
this\zmin = zmin
this\zmax = zmax

id = id + 1
this\id = id
this\vis = False
this\lock= False

If (depth > 1)
; =============================================
xmod = (xmin+xmax) / 2
ymod = (ymin+ymax) / 2
zmod = (zmin+zmax) / 2

depth = depth - 1
this\Child[0] = Quadtree(xmin,ymin,zmin  ,xmod,ymod,zmod ,depth) 
this\Child[1] = Quadtree(xmin,ymod,zmin  ,xmod,ymax,zmod ,depth)
this\Child[2] = Quadtree(xmod,ymod,zmin  ,xmax,ymax,zmod ,depth) 
this\Child[3] = Quadtree(xmod,ymin,zmin  ,xmax,ymod,zmod ,depth) 

this\Child[4] = Quadtree(xmin,ymin,zmod  ,xmod,ymod,zmax,depth) 
this\Child[5] = Quadtree(xmin,ymod,zmod  ,xmod,ymax,zmax,depth)
this\Child[6] = Quadtree(xmod,ymod,zmod  ,xmax,ymax,zmax,depth) 
this\Child[7] = Quadtree(xmod,ymin,zmod  ,xmax,ymod,zmax,depth) 

EndIf
Return this
End Function

; =========================================
Function RenderQuadtree(this.QUADTREE,depth)

If (depth > 1)
	xmod = (xmin+xmax) / 2
	ymod = (ymin+ymax) / 2
	zmod = (zmin+zmax) / 2
		
		Color 88,88,88
			Rect this\xmin, this\ymin,this\xmax-this\xmin,this\ymax-this\ymin ,0
			

			
			
		depth = depth - 1
		RenderQuadtree(this\Child[0],depth)
		RenderQuadtree(this\Child[1],depth)
		RenderQuadtree(this\Child[2],depth)
		RenderQuadtree(this\Child[3],depth)
		
		RenderQuadtree(this\Child[4],depth)
		RenderQuadtree(this\Child[5],depth)
		RenderQuadtree(this\Child[6],depth)
		RenderQuadtree(this\Child[7],depth)
		
		If this\vis=True 
			Rect this\xmin+2, this\ymin+2,this\xmax-this\xmin-4,this\ymax-this\ymin-4 ,1
			
			xdot = (this\xmax+this\xmin)/2
			ydot = (this\ymax+this\ymin)/2
			zdot = (this\zmax+this\zmin)/2
			Color 40+zdot,40+zdot,40+zdot
			Oval 400+ (xdot -ydot*px) -13*(depth), 300+ (xdot +ydot*px )/2-zdot -13*(depth) , 26*(depth+depth),26*(depth+depth),1
			
		;	For y=this\ymin To this\ymax Step 5
		;		For x=this\xmin To this\xmax Step 5
		;		 For z=this\zmin To this\zmax Step 5
		;			Color 255,255,255
		;			Plot 400+x-y,400+(x+ y)/2-z	
		;		 Next
		;		Next
		;	Next 
			
		EndIf 
		
		

End If 

End Function

Function CalcQuadtree(this.QUADTREE,depth)

If (depth > 1)
		depth = depth - 1
		CalcQuadtree(this\Child[0],depth)
		CalcQuadtree(this\Child[1],depth)
		CalcQuadtree(this\Child[2],depth)
		CalcQuadtree(this\Child[3],depth)
		
		CalcQuadtree(this\Child[4],depth)
		CalcQuadtree(this\Child[5],depth)
		CalcQuadtree(this\Child[6],depth)
		CalcQuadtree(this\Child[7],depth)
		
		If this\Child[0]\lock= 1  And  this\Child[1]\lock= 1  And this\Child[2]\lock= 1 And  this\Child[3]\lock= 1 And  this\Child[4]\lock= 1  And  this\Child[5]\lock= 1  And this\Child[6]\lock= 1 And  this\Child[7]\lock= 1 Then		
			
			this\vis=True
			this\lock=True
			this\Child[0]\vis= False
			this\Child[1]\vis= False
			this\Child[2]\vis= False
			this\Child[3]\vis= False
			
			this\Child[4]\vis= False
			this\Child[5]\vis= False
			this\Child[6]\vis= False
			this\Child[7]\vis= False
		 
		EndIf

	If  depth =s  Then  ;depth =s  And pz > zmin And pz< zmax
	  If  mx >=this\xmin And mx < this\xmax
	    If  my >=this\ymin And my < this\ymax
	      If pz >=this\zmin And pz < this\zmax
	
			For y=this\ymin To this\ymax Step 3
			   For x=this\xmin To this\xmax Step 3
				 For z=this\zmin To this\zmax Step 3
					Color 255,5,5
					Plot 400+x-y*px,300+(x+ y*px)/2-z	
				 Next
			   Next
			Next 
			
;			xdot = (this\xmax+this\xmin)/2
;			ydot = (this\ymax+this\ymin)/2
;			zdot = (this\zmax+this\zmin)/2
;			Color 255,255,255
;			Oval 400+ xdot -ydot -6, 400+ (xdot +ydot )/2-zdot -6 , 12,12,1
	
		Rect this\xmin, this\ymin,this\xmax-this\xmin,this\ymax-this\ymin ,1
		Rect 250, 175 - this\zmin,25,this\zmax-this\zmin ,1
		Text 400,40, this\id +" visible = "+this\vis+"  Lock = "+this\lock
		If MouseDown(1) Or KeyDown(157) And this\lock= False Then ;
			this\lock=True 
			 this\vis=True 
		EndIf 
		If MouseDown(2) And this\lock= True Then ;
			this\lock=False 
			 this\vis=False 
		EndIf 
	      End If 
	    End If
	  End If
	End If		

End If 

End Function

Function EraseQuadtree(this.QUADTREE,depth)

If (depth > 1)
		depth = depth - 1
		EraseQuadtree(this\Child[0],depth)
		EraseQuadtree(this\Child[1],depth)
		EraseQuadtree(this\Child[2],depth)
		EraseQuadtree(this\Child[3],depth)

		EraseQuadtree(this\Child[4],depth)
		EraseQuadtree(this\Child[5],depth)
		EraseQuadtree(this\Child[6],depth)
		EraseQuadtree(this\Child[7],depth)
		
			this\lock=False 
			 this\vis=False 	
End If 

End Function

Graphics 800,600,32,2 
SetBuffer BackBuffer() 

QuadDepth = 5;число вложений (глубина ) : Level 's
QuadSize = 200 ; размеры квадранта 


root.QUADTREE = Quadtree(0,0,0,QuadSize,QuadSize,QuadSize,QuadDepth)
px=1
While Not KeyHit(1) 
mx = MouseX() 
my = MouseY() 
s = Abs(MouseZ())+1

Cls 
Select True 
Case KeyHit(200) : py=py-0.1 ;Up
Case KeyHit(208) : py=py+0.1;Down
Case KeyHit(203) : px=px-0.1; Left
Case KeyHit(205) : px=px+0.1; Right
Case KeyDown(30) : pz=pz+1*15;   A key
Case KeyDown(44) : pz=pz-1*15;   Z key
Case KeyDown(57) : EraseQuadtree(root,QuadDepth)
End Select 
;	If px<0 Then px=1 
;	 If px>=180 Then px=180
	If py<0 Then py=1 
	 If py>=180 Then py=180
	If pz<0 Then mz=1 
	 If pz>=180 Then pz=180

Color 255,255,255
Rect root\xmin,root\ymin,root\xmax,root\ymax,0
Rect 250,0,25,root\ymax,0


RenderQuadtree(root,QuadDepth)
CalcQuadtree(root,QuadDepth)

Text 400,20,"S = "+s
Text 400,60,"px = "+px+"  py = "+my+"  pz = "+pz
Flip 
Wend 
End
__________________
Мой проект здесь

Последний раз редактировалось polopok, 08.05.2013 в 14:37.
(Offline)
 
Ответить с цитированием