Показать сообщение отдельно
Старый 26.12.2011, 17:14   #1
polopok
Знающий
 
Регистрация: 17.07.2009
Сообщений: 201
Написано 53 полезных сообщений
(для 75 пользователей)
Вопрос quadrotree or octree

прошу помощи..
1 поделить рекурсивно область ,порядка 5 и более вложений(создать "дерево")
2 все области изначально пусты(null)
3 проверить наличие объекта в области
4 вывести путь к объекту используя "дерево"
как-то так ...
вот код примерный :
Global mx,my
Type box Field x,y,xf,yf,n,name$ End Type
Type ent Field x,y,n End Type 

Function enty(x,y,n)
	e.ent = New ent 
	e\x=x
	e\y=y
	e\n=n
End Function
Function boxing(name$,x,y,xf,yf,n)
	b.box = New box
	b\x=x
	b\y=y
	b\xf=xf
	b\yf=yf
	b\n=n
	b\name$=name$
End Function 
enty(240,240,0)
enty(340,200,1)
enty(340,340,2)
boxing("A",200,100,100,100,0)
boxing("A",300,100,100,100,0)
boxing("A",300,200,100,100,0)
boxing("A",200,200,100,100,0)

Graphics 800,600,32,2
i=3
tx=240 : ty=240
SetBuffer BackBuffer()
While Not KeyDown(1)
mx=MouseX(): my=MouseY()
If i>=3 Then i=3
Cls
Rect 200,100,200,200,0
Plot mx,my
Oval tx-1,ty-1,3,3,1

For e.ent = Each ent
	For b.box = Each box
	Rect b\x,b\y,b\xf,b\yf,0
	Text b\x+(b\xf/2),b\y+(b\yf/2),b\name$
If i>0 Then
	If PointInRect(e\x,e\y,b\x,b\y,b\xf,b\yf) Then
		i=i-1
		boxing("B",b\x,b\y,b\xf/2,b\yf/2,0)
		boxing("B",b\x+(b\xf/2),b\y,b\xf/2,b\yf/2,0)
		boxing("B",b\x+(b\xf/2),b\y+(b\yf/2),b\xf/2,b\yf/2,0)
		boxing("B",b\x,b\y+(b\yf/2),b\xf/2,b\yf/2,0)
 		Text 20,20,"IN rect"
	EndIf 
End If 
	Next
Next

Text 30,30,i
Flip
Wend
Delete Each box
End

Function PointInRect(iPointX,iPointY,iXPos1,iYPos1,iXPos2,iYPos2)
    iXPos2=iXPos2 + iXPos1 : iYPos2=iYPos2 + iYPos1
	Return ((((iPointX-iXPos1) Xor (iPointX-iXPos2)) And ((iPointY-iYPos1) Xor (iPointY-iYPos2))) And $80000000)
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (27.12.2011)