[021] Quad Tree
[021] Quad Tree
[21h] Tree Data Structure for Quick Rect Query
[Jan 31] 02h - Quad Tree Review [Feb 01] 08h - Quad Tree Research / Build / Draw [Feb 02] 09h - Quad Tree Nearest Search / UI [Feb 03] 02h - Quad Tree Upload Pseudocode: # youtu.be/OJxEcs0w_kE var _root_node: TreeNode var _max_size: Vector2 = Vector2(1025, 768) class QuadTree: var bounds: Rect2 var points: Array[Vector2] var capacity: int = 4 var depth: int = 0 var divided: bool = false var north_west: QuadTree var north_east: QuadTree var south_west: QuadTree var south_east: QuadTree func _ready() -> void: _root_node = _new_quad_node(Rect2(Vector2(0, 0), _max_size)) func _new_quad_node(bounds: Rect2, depth: int = 0) -> QuadTree: var new_quad_node: QuadTree = QuadTree.new() new_quad_node.bounds = bounds new_quad_node.depth = depth return new_quad_node func _insert(node: QuadTree, point: Vector2) -> bool: if node.bounds.has_point(point) == false: # point outside Rect2 return false if node.divided == false: # not yet divided if node.points.size() < node.capacity: # if not capacity node.points.append(point) # add point return true _subdivide(node) # if capacity, subdivide if _insert(node.north_west, point): return true # recursive insert if _insert(node.north_east, point): return true if _insert(node.south_west, point): return true if _insert(node.south_east, point): return true return false func _subdivide(node: QuadTree) -> void: # divide into 4 squares node.divided = true var subdivide_size: Vector2 = node.bounds.size / 2 var north_west_rect: Rect2 = Rect2(node.bounds.position, subdivide_size) var north_east_rect: Rect2 = Rect2(node.bounds.position + Vector2(subdivide_size.x, 0), subdivide_size) var south_west_rect: Rect2 = Rect2(node.bounds.position + Vector2(0, subdivide_size.y), subdivide_size) var south_east_rect: Rect2 = Rect2(node.bounds.position + Vector2(subdivide_size.x, subdivide_size.y), subdivide_size) node.north_west = _new_quad_node(north_west_rect, node.depth + 1) node.north_east = _new_quad_node(north_east_rect, node.depth + 1) node.south_west = _new_quad_node(south_west_rect, node.depth + 1) node.south_east = _new_quad_node(south_east_rect, node.depth + 1) for point in node.points: # move points to children (for performance) if _insert(node.north_west, point): continue # recursive insert if _insert(node.north_east, point): continue if _insert(node.south_west, point): continue if _insert(node.south_east, point): continue node.points.clear() func _query(rect: Rect2) -> void: _points_found.clear() _query_helper(_root_node, rect, _points_found) func _query_helper(node: QuadTree, rect: Rect2, found: Array[Vector2]) -> void: if node.bounds.intersects(rect) == false: return if node.divided == true: # divided, will not have any points _query_helper(node.north_west, rect, found) _query_helper(node.north_east, rect, found) _query_helper(node.south_west, rect, found) _query_helper(node.south_east, rect, found) return for point in node.points: if rect.has_point(point) == true: found.append(point) return
Status | Released |
Platforms | HTML5 |
Author | QuietGodot |
Made with | Godot |
Leave a comment
Log in with itch.io to leave a comment.