From cf62e59ad79f12e22e3ed4ab07a72f56ec0158d5 Mon Sep 17 00:00:00 2001
From: josidd <joseph.siddons@noc.ac.uk>
Date: Wed, 26 Feb 2025 09:21:03 +0000
Subject: [PATCH] feat: add len method to QuadTree and OctTree classes

---
 GeoSpatialTools/octtree.py  | 18 ++++++++++++++++++
 GeoSpatialTools/quadtree.py | 13 +++++++++++++
 test/test_octtree.py        |  1 +
 test/test_quadtree.py       |  1 +
 4 files changed, 33 insertions(+)

diff --git a/GeoSpatialTools/octtree.py b/GeoSpatialTools/octtree.py
index 33e32c5..250f145 100644
--- a/GeoSpatialTools/octtree.py
+++ b/GeoSpatialTools/octtree.py
@@ -461,6 +461,24 @@ class OctTree:
             out += f"{self.southeastfwd}"
         return out
 
+    def len(self, _current_len: int = 0) -> int:
+        """Get the number of points in the OctTree"""
+        _current_len += len(self.points)
+        print(_current_len)
+        if not self.divided:
+            return _current_len
+
+        _current_len = self.northeastback.len(_current_len)
+        _current_len = self.northwestback.len(_current_len)
+        _current_len = self.southeastback.len(_current_len)
+        _current_len = self.southwestback.len(_current_len)
+        _current_len = self.northeastfwd.len(_current_len)
+        _current_len = self.northwestfwd.len(_current_len)
+        _current_len = self.southeastfwd.len(_current_len)
+        _current_len = self.southwestfwd.len(_current_len)
+
+        return _current_len
+
     def divide(self):
         """Divide the QuadTree"""
         self.northwestfwd = OctTree(
diff --git a/GeoSpatialTools/quadtree.py b/GeoSpatialTools/quadtree.py
index b7a3ad7..1ef4e31 100644
--- a/GeoSpatialTools/quadtree.py
+++ b/GeoSpatialTools/quadtree.py
@@ -340,6 +340,19 @@ class QuadTree:
             out += f"{self.southeast}"
         return out
 
+    def len(self, _current_len: int = 0) -> int:
+        """Get the number of points in the OctTree"""
+        _current_len += len(self.points)
+        if not self.divided:
+            return _current_len
+
+        _current_len = self.northeast.len(_current_len)
+        _current_len = self.northwest.len(_current_len)
+        _current_len = self.southeast.len(_current_len)
+        _current_len = self.southwest.len(_current_len)
+
+        return _current_len
+
     def divide(self):
         """Divide the QuadTree"""
         self.northwest = QuadTree(
diff --git a/test/test_octtree.py b/test/test_octtree.py
index 4a04eb2..7a3d979 100644
--- a/test/test_octtree.py
+++ b/test/test_octtree.py
@@ -198,6 +198,7 @@ class TestOctTree(unittest.TestCase):
         ]
         for point in points:
             otree.insert(point)
+        assert otree.len() == len(points) - 1  # NOTE: 1 point not added
         assert otree.divided
         expected = [
             points[:3],
diff --git a/test/test_quadtree.py b/test/test_quadtree.py
index 86a643e..9f4546c 100644
--- a/test/test_quadtree.py
+++ b/test/test_quadtree.py
@@ -94,6 +94,7 @@ class TestQuadTree(unittest.TestCase):
         for point in points:
             qtree.insert(point)
         assert qtree.divided
+        assert qtree.len() == len(points)
         res = [
             qtree.points,
             qtree.northwest.points,
-- 
GitLab