import math from Point import * from Line import * from Triangle import * from kdtree import * class PointKdtree(kdtree): def __init__(self, points=[],cutoff=5, cutoff_distance=0.5, tolerance=0.001): self._n = None self.tolerance=tolerance nodes = [] for p in points: n = Node(); n.point = p n.bound = [] n.bound.append(p.x) n.bound.append(p.y) n.bound.append(p.z) nodes.append(n) kdtree.__init__(self, nodes, cutoff, cutoff_distance) def dist(self, n1, n2): dx = n1.bound[0]-n2.bound[0] dy = n1.bound[1]-n2.bound[1] dz = n1.bound[2]-n2.bound[2] return dx*dx+dy*dy+dz*dz def Point(self, x, y, z): #return Point(x,y,z) if self._n: n = self._n else: n = Node(); n.bound = [] n.bound.append(x) n.bound.append(y) n.bound.append(z) (nn,dist) = self.nearest_neighbor(n, self.dist) if nn and dist<self.tolerance: self._n = n return nn.p else: n.p = Point(x,y,z) self._n = None self.insert(n) return n.p