rendered paste bodyclass kdtree:
def __init__(self, dimension =2,index=0, parent=None):
self.dimension = dimension
self.index = index
self.split = None
self.parent = parent
def addPoint(self,thePoint,theParent=None):
"""Include another point in the kD-tree."""
if self.split is None:
self.parent = theParent
self.split = thePoint
self.left = kdtree(self.dimension, (self.index + 1) % self.dimension, parent=self)
self.right = kdtree(self.dimension, (self.index + 1) % self.dimension, parent=self)
return "wtf"
elif self.split[self.index] < thePoint[self.index]:
return self.left.addPoint(thePoint, self)
else:
return self.right.addPoint(thePoint, self)
def __repr__(self):
if self.split:
x, y = self.split
s = '<%s.%s: (%i,%i)>' % (__name__,
self.__class__.__name__,
x,y)
else:
s = '<%s.%s: (TAIL)>' % (__name__,
self.__class__.__name__)
return s
def getOrientation( self ):
if self.parent:
return int(not self.parent.getOrientation())
else:
return 0
def getDepth( self ):
if self.parent:
return self.parent.getDepth() + 1
else:
return 0
def getRoot( self ):
if self.parent:
return self.parent.getRoot()
else:
return self
def getChildrenAtDepth( self, depth ):
root = self.getRoot()
kids = root.getChildren()
return [kid for kid in kids if kid.getDepth() == depth]
def getParentOfPoint( self, p ):
kdtrees = self.getChildren()
k = [k for k in kdtrees if k.split == p]
assert len(k) == 1
k = k[0]
assert k.parent
return k.parent
def getChildren( self ):
points = []
points.append(self)
if 'left' in self.__dict__.keys():
points += self.left.getChildren()
if 'right' in self.__dict__.keys():
points += self.right.getChildren()
return [i for i in points if i]
def getPoints( self ):
points = []
points.append(self.split)
if 'left' in self.__dict__.keys():
points += self.left.getPoints()
if 'right' in self.__dict__.keys():
points += self.right.getPoints()
return [i for i in points if i]
def width( self ):
points = self.getPoints()
points = dict(points)
x = points.keys()
return max(x) - min(x)
def height( self ):
points = self.getPoints()
points = dict(points)
y = points.values()
return max(y) - min(y)
minx = lambda self: self.corners()[0][0]
miny = lambda self: self.corners()[0][1]
maxx = lambda self: self.corners()[1][0]
maxy = lambda self: self.corners()[1][1]
def corners( self ):
points = self.getPoints()
points = dict(points)
x = points.keys()
y = points.values()
if x and y:
return (map(min, (x,y))), (map(max, (x,y)))
else:
return (0,0), (0,0)
def draw( kdroottree ):
from turtle import Pen
p = Pen()
H = 600
OH = -300
W = 600
OW = -300
bl,ur = kdroottree.corners()
w = kdroottree.width()
h = kdroottree.height()
xscale = W / float(w)
yscale = H / float(h)
xoffset = kdroottree.minx()
yoffset = kdroottree.miny()
pen.delay(5)
pen.tracer(False)
tp = lambda p: ((p[0]-xoffset) * xscale + OW, (p[1]-yoffset) * yscale + OH)
ul = (bl[0], ur[1])
br = (ur[0], bl[1])
ur, ul, br, bl = map( tp, (ur, ul, br, bl) )
print ul, ur, bl, br
#draw box
pen.up()
pen.goto(ur)
pen.down()
pen.goto(ul)
pen.goto(bl)
pen.goto(br)
pen.goto(ur)
pen.up()
points = kdroottree.getChildren()
points = dict( [ (kdtree, kdtree.getDepth()) for kdtree in points ] )
depths = points.values()
depths = list(set(depths))
depths.sort()
for depth in depths:
points = kdroottree.getChildrenAtDepth(depth)
if points:
for point in points:
if depth == 0 and point.split:
assert len(points_in_depth) == 1
x1, x2 = kdroottree.minx(), kdroottree.maxx()
y = point.split[1]
start = tp((x1,y))
end = tp((x2,y))
print start, end
pen.goto(start)
pen.down()
pen.goto(end)
pen.up()
elif point.split:
print point
o = point.getOrientation()
if o:
walls =
if __name__ == "__main__":
pointList=[(5,6), (9,7), (8,3), (7,4), (6,7), (10,6), (4,8), (3,1), (2,0), (1,9)]
k = kdtree()
for i in range(len(pointList)):
thePoint=pointList[i]
print k.addPoint(thePoint)