first commit
This commit is contained in:
41
helix/models/dxf/graph_node_store.py
Normal file
41
helix/models/dxf/graph_node_store.py
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
Reference in New Issue
Block a user