-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQuadTree.gd
100 lines (82 loc) · 2.32 KB
/
QuadTree.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#####################################################
##
## class QuadTree
##
## builds a quadtree with variant objects
## the object has to define a func
## get_position() wich has to return a Vector2
##
#####################################################
extends Node
class_name QuadTree
var dimension : Rect2
var divideThreshold : int
var nodes : QuadNode = QuadNode.new()
func create(dim:Rect2,div:int):
dimension = dim
divideThreshold = div
nodes.create(dimension,divideThreshold)
func insert(n):
nodes.insert(n)
func query(r:Rect2):
var result = []
if (dimension.intersects(r)):
nodes.query(r,result)
return result
#####################################################
##
## class QuadNode
##
## einzelnes Node im Quadtree
##
#####################################################
class QuadNode:
var nw : QuadNode
var ne : QuadNode
var se : QuadNode
var sw : QuadNode
var divideThreshold : int
var nodes = []
var dimension : Rect2
var divided : bool = false
func create(dim:Rect2,div:int):
divideThreshold = div
dimension = dim
func insert(n):
if dimension.has_point(n.get_position())==false:
return
if nodes.size()>divideThreshold:
if divided==false:
divide()
nw.insert(n)
ne.insert(n)
sw.insert(n)
se.insert(n)
print("divide")
else:
nodes.append(n)
func divide():
var rnw = Rect2(dimension.position.x,dimension.position.y,dimension.size.x/2,dimension.size.y/2)
var rne = Rect2(dimension.position.x+dimension.size.x/2,dimension.position.y,dimension.size.x/2,dimension.size.y/2)
var rsw = Rect2(dimension.position.x,dimension.position.y+dimension.size.y/2,dimension.size.x/2,dimension.size.y/2)
var rse = Rect2(dimension.position.x+dimension.size.x/2,dimension.position.y+dimension.size.y/2,dimension.size.x/2,dimension.size.y/2)
nw = QuadNode.new()
ne = QuadNode.new()
sw = QuadNode.new()
se = QuadNode.new()
nw.create(rnw,divideThreshold)
ne.create(rne,divideThreshold)
sw.create(rsw,divideThreshold)
se.create(rse,divideThreshold)
divided = true
func query(r:Rect2,result):
if (dimension.intersects(r)):
for n in nodes:
if r.has_point(n.get_position()):
result.append(n)
if divided:
nw.query(r,result)
ne.query(r,result)
sw.query(r,result)
se.query(r,result)
#####################################################