Files
old-krovovi-kalkulator/helix/models/dxf/graph_node_store.py
2017-11-07 09:23:57 +01:00

42 lines
1.4 KiB
Python

from helix.helpers.nodequadtree import Bounds, NodeQuadTree
class GraphNodeStore(list):
def __init__(self):
super().__init__()
self.variance = 0.2
self.first = True
self.quadTree = None
def add_node(self, node):
self.append(node)
if self.first:
self.left = self.right = node.coordinate.x
self.top = self.bottom = node.coordinate.y
self.first = False
else:
self.left = min(self.left, node.coordinate.x)
self.right = max(self.right, node.coordinate.x)
self.bottom = min(self.bottom, node.coordinate.y)
self.top = max(self.top, node.coordinate.y)
def distance_squared(self, node, coordinate):
dx = node.coordinate.x - coordinate.x
dy = node.coordinate.y - coordinate.y
return dx * dx + dy * dy
def find_coordinate(self, coordinate):
# create and populate the quadtree on first request
if self.quadTree is None:
self.quadTree = NodeQuadTree(1, Bounds(self.left, self.bottom, self.right - self.left, self.top - self.bottom), self.variance)
for node in self:
self.quadTree.insert(node)
del self[:]
possibilities = self.quadTree.retrieve(coordinate)
for node in possibilities:
if self.distance_squared(node, coordinate) <= self.variance ** 2:
return node
else:
return None