class RTreeApp: def __init__(self): """App for creating R tree dynamically and executing range queries""" self.tree = RTree(m=2, M=4) self.ready = False # for range query self.selectedRegion = None self.newRegionStart = None self.newRegion = None # for identifiers self.counter = 0 self.master = tkinter.Tk() self.master.title('R Tree Range Query Application') self.w = tkinter.Frame(self.master, width=512, height=512) self.canvas = tkinter.Canvas(self.w, width=512, height=512) self.paint() self.canvas.bind("<Button-1>", self.startAdd) self.canvas.bind("<B1-Motion>", self.extendAdd) # only when right mouse dragged self.canvas.bind("<ButtonRelease-1>", self.endAdd) self.canvas.bind("<Button-3>", self.range) # when right mouse clicked self.canvas.bind("<ButtonRelease-3>", self.clear) self.canvas.bind("<B3-Motion>", self.range) # only when right mouse dragged self.w.pack() def startAdd(self, event): """End of range search.""" x = event.x y = self.toCartesian(event.y) self.newRegionStart = (x,y) def extendAdd(self, event): """End of range search.""" if self.newRegionStart: x = event.x y = self.toCartesian(event.y) self.newRegion = Region (x,y,x,y).unionPoint(self.newRegionStart) self.paint() def endAdd(self, event): """End of range search.""" if self.newRegionStart: self.newRegionStart = None self.counter += 1 if self.newRegion: self.tree.add(self.newRegion, str(self.counter)) self.newRegion = None self.paint() def toCartesian(self, y): """Convert tkinter point into Cartesian.""" return self.w.winfo_height() - y def toTk(self,y): """Convert Cartesian into tkinter point.""" if y == maxValue: return 0 tk_y = self.w.winfo_height() if y != minValue: tk_y -= y return tk_y def clear(self, event): """End of range search.""" self.selectedRegion = None self.paint() def range(self, event): """Initiate a range search using a selected rectangular region.""" p = (event.x, self.toCartesian(event.y)) if self.selectedRegion is None: self.selectedStart = Region(p[X],p[Y], p[X],p[Y]) self.selectedRegion = self.selectedStart.unionPoint(p) self.paint() # return (node,0,True) where status is True if draining entire tree rooted at node. If False, # then (rect,id,False). Draw these # as shaded red rectangle to identify whole sub-tree is selected. for triple in self.tree.range(self.selectedRegion): if triple[2]: r = triple[0].region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Red', stipple='gray12') else: r = triple[0] self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Red') def click(self, event): """Add point to KDtree.""" p = (event.x, self.toCartesian(event.y)) self.tree.add(p) self.paint() def visit (self, n): """ Visit node to paint properly.""" if n == None: return if n.level == 0: for idx in range(n.count): r = n.children[idx].region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Gray') for idx in range(n.count): self.visit(n.children[idx]) # Do after all children so we can see interior nodes, too. r = n.region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), outline='Black', dash=(2, 4)) color = 'Gray' if n.level == 0: color='Black' self.canvas.create_text(r.x_max - 16*len(n.id), self.toTk(r.y_max) + 16, anchor = tkinter.W, font = "Times 16 bold", fill=color, text=n.id) def prepare(self, event): """prepare to add points.""" if self.label: self.label.destroy() self.label = None self.canvas.pack() def paint(self): """Paint R tree by visiting all nodes, or show introductory message.""" if self.ready: self.canvas.delete(tkinter.ALL) self.visit(self.tree.root) if self.newRegion: self.canvas.create_rectangle(self.newRegion.x_min, self.toTk(self.newRegion.y_min), self.newRegion.x_max, self.toTk(self.newRegion.y_max), outline='Black', dash=(2, 4)) if self.selectedRegion: self.canvas.create_rectangle(self.selectedRegion.x_min, self.toTk(self.selectedRegion.y_min), self.selectedRegion.x_max, self.toTk(self.selectedRegion.y_max), outline='Red', dash=(2, 4)) else: self.label = tkinter.Label(self.w, width=100, height = 40, text="Click To Add Points") self.label.bind("<Button-1>", self.prepare) self.label.pack() self.ready = True
class QuadTreeApp: def __init__(self): """App for creating Quad tree dynamically and executing range queries.""" self.tree = QuadTree(Region(0,0,W,H)) self.match = None # for range query self.selectedRegion = None self.queryRect = None self.master = tkinter.Tk() self.master.title('Quad Tree Range Application') self.w = tkinter.Frame(self.master, width=W, height=H) self.canvas = tkinter.Canvas(self.w, width=W, height=H) self.paint() self.canvas.bind("<Button-1>", self.click) self.canvas.bind("<Button-3>", self.range) # when right mouse clicked self.canvas.bind("<ButtonRelease-3>", self.clear) self.canvas.bind("<B3-Motion>", self.range) # only when right mouse dragged self.w.pack() def toCartesian(self, y): """Convert tkinter point into Cartesian""" return self.w.winfo_height() - y def toTk(self,y): """Convert Cartesian into tkinter point.""" if y == maxValue: return 0 tk_y = self.w.winfo_height() if y != minValue: tk_y -= y return tk_y def clear(self, event): """End of range search.""" self.selectedRegion = None self.paint() def range(self, event): """Initiate a range search using a selected rectangular region.""" p = (event.x, self.toCartesian(event.y)) if self.selectedRegion is None: self.selectedStart = Region(p[X],p[Y], p[X],p[Y]) self.selectedRegion = self.selectedStart.unionPoint(p) self.paint() # return (node,status) where status is True if draining entire tree rooted at node. Draw these # all in Yellow using another inorder traversal for pair in self.tree.range(self.selectedRegion): if pair[1]: self.canvas.create_rectangle(pair[0].region.x_min, self.toTk(pair[0].region.y_min), pair[0].region.x_max, self.toTk(pair[0].region.y_max), fill='Red', stipple='gray12') else: p = pair[0][0] # ignore data and grab point self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Red') self.queryRect = self.canvas.create_rectangle(self.selectedRegion.x_min, self.toTk(self.selectedRegion.y_min), self.selectedRegion.x_max, self.toTk(self.selectedRegion.y_max), outline='Red', dash=(2, 4)) def click(self, event): """Add point to QuadTree.""" p = (event.x, self.toCartesian(event.y)) self.tree.add(p) self.paint() def visit (self, node): """ Visit node to paint properly.""" if node == None: return if node.points is None: r = node.region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max)) self.canvas.create_line(r.x_min, self.toTk(node.origin[Y]), r.x_max, self.toTk(node.origin[Y]), fill='black', dash=(2, 4)) self.canvas.create_line(node.origin[X], self.toTk(r.y_min), node.origin[X], self.toTk(r.y_max), fill='black', dash=(2, 4)) for n in node.children: self.visit(n) else: for p in node.points: self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Black') def prepare(self, event): """prepare to add points.""" if self.label: self.label.destroy() self.label = None self.canvas.pack() def paint(self): """Paint Quad tree by visiting all nodes, or show introductory message.""" if self.tree.root: self.canvas.delete(tkinter.ALL) self.visit(self.tree.root) else: self.label = tkinter.Label(self.w, width=100, height = 40, text="Click To Add Points") self.label.bind("<Button-1>", self.prepare) self.label.pack()
class KDTreeApp: def __init__(self): """App for creating KD tree dynamically and executing range queries.""" self.tree = KDTree() self.static = False # for range query self.selectedRegion = None self.queryRect = None self.master = tkinter.Tk() self.master.title('KD Tree Range Query Application') self.w = tkinter.Frame(self.master, width=410, height=410) self.canvas = tkinter.Canvas(self.w, width=400, height=400) self.paint() self.canvas.bind("<Button-1>", self.click) self.canvas.bind("<Motion>", self.moved) self.canvas.bind("<Button-3>", self.range) # when right mouse clicked self.canvas.bind("<ButtonRelease-3>", self.clear) self.canvas.bind("<B3-Motion>", self.range) # only when right mouse dragged self.w.pack() def toCartesian(self, y): """Convert tkinter point into Cartesian.""" return self.w.winfo_height() - y def toTk(self, y): """Convert Cartesian into tkinter point.""" if y == maxValue: return 0 tk_y = self.w.winfo_height() if y != minValue: tk_y -= y return tk_y def clear(self, event): """End of range search.""" self.selectedRegion = None self.paint() def range(self, event): """Initiate a range search using a selected rectangular region.""" p = (event.x, self.toCartesian(event.y)) if self.selectedRegion is None: self.selectedStart = Region(p[X], p[Y], p[X], p[Y]) self.selectedRegion = self.selectedStart.unionPoint(p) self.paint() # return (node,status) where status is True if draining entire tree rooted at node. Draw these # as shaded red rectangle to identify whole sub-tree is selected. for pair in self.tree.range(self.selectedRegion): p = pair[0].point if pair[1]: self.canvas.create_rectangle(pair[0].region.x_min, self.toTk(pair[0].region.y_min), pair[0].region.x_max, self.toTk(pair[0].region.y_max), fill='Red', stipple='gray12') else: self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Red') self.queryRect = self.canvas.create_rectangle( self.selectedRegion.x_min, self.toTk(self.selectedRegion.y_min), self.selectedRegion.x_max, self.toTk(self.selectedRegion.y_max), outline='Red', dash=(2, 4)) def moved(self, event): """Only here for static option.""" if self.static: self.paint() def click(self, event): """Add point to KDtree.""" p = (event.x, self.toCartesian(event.y)) self.tree.add(p) self.paint() def drawPartition(self, r, p, orient): """Draw partitioning line and points itself as a small square.""" if orient == VERTICAL: self.canvas.create_line(p[X], self.toTk(r.y_min), p[X], self.toTk(r.y_max)) else: xlow = r.x_min if r.x_min <= minValue: xlow = 0 xhigh = r.x_max if r.x_max >= maxValue: xhigh = self.w.winfo_width() self.canvas.create_line(xlow, self.toTk(p[Y]), xhigh, self.toTk(p[Y])) self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Black') def visit(self, n): """ Visit node to paint properly.""" if n == None: return self.drawPartition(n.region, n.point, n.orient) self.visit(n.below) self.visit(n.above) def prepare(self, event): """prepare to add points.""" if self.label: self.label.destroy() self.label = None self.canvas.pack() def paint(self): """Paint quad tree by visiting all nodes, or show introductory message.""" if self.tree.root: self.canvas.delete(tkinter.ALL) self.visit(self.tree.root) else: self.label = tkinter.Label(self.w, width=100, height=40, text="Click To Add Points") self.label.bind("<Button-1>", self.prepare) self.label.pack()
class KDTreeApp: def __init__(self): """App for creating KD tree dynamically and executing range queries.""" self.tree = KDTree() self.static = False # for range query self.selectedRegion = None self.queryRect = None self.master = tkinter.Tk() self.master.title('KD Tree Range Query Application') self.w = tkinter.Frame(self.master, width=410, height=410) self.canvas = tkinter.Canvas(self.w, width=400, height=400) self.paint() self.canvas.bind("<Button-1>", self.click) self.canvas.bind("<Motion>", self.moved) self.canvas.bind("<Button-3>", self.range) # when right mouse clicked self.canvas.bind("<ButtonRelease-3>", self.clear) self.canvas.bind("<B3-Motion>", self.range) # only when right mouse dragged self.w.pack() def toCartesian(self, y): """Convert tkinter point into Cartesian.""" return self.w.winfo_height() - y def toTk(self,y): """Convert Cartesian into tkinter point.""" if y == maxValue: return 0 tk_y = self.w.winfo_height() if y != minValue: tk_y -= y return tk_y def clear(self, event): """End of range search.""" self.selectedRegion = None self.paint() def range(self, event): """Initiate a range search using a selected rectangular region.""" p = (event.x, self.toCartesian(event.y)) if self.selectedRegion is None: self.selectedStart = Region(p[X],p[Y], p[X],p[Y]) self.selectedRegion = self.selectedStart.unionPoint(p) self.paint() # return (node,status) where status is True if draining entire tree rooted at node. Draw these # as shaded red rectangle to identify whole sub-tree is selected. for pair in self.tree.range(self.selectedRegion): p = pair[0].point if pair[1]: self.canvas.create_rectangle(pair[0].region.x_min, self.toTk(pair[0].region.y_min), pair[0].region.x_max, self.toTk(pair[0].region.y_max), fill='Red', stipple='gray12') else: self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Red') self.queryRect = self.canvas.create_rectangle(self.selectedRegion.x_min, self.toTk(self.selectedRegion.y_min), self.selectedRegion.x_max, self.toTk(self.selectedRegion.y_max), outline='Red', dash=(2, 4)) def moved(self, event): """Only here for static option.""" if self.static: self.paint() def click(self, event): """Add point to KDtree.""" p = (event.x, self.toCartesian(event.y)) self.tree.add(p) self.paint() def drawPartition (self, r, p, orient): """Draw partitioning line and points itself as a small square.""" if orient == VERTICAL: self.canvas.create_line(p[X], self.toTk(r.y_min), p[X], self.toTk(r.y_max)) else: xlow = r.x_min if r.x_min <= minValue: xlow = 0 xhigh = r.x_max if r.x_max >= maxValue: xhigh = self.w.winfo_width() self.canvas.create_line(xlow, self.toTk(p[Y]), xhigh, self.toTk(p[Y])) self.canvas.create_rectangle(p[X] - RectangleSize, self.toTk(p[Y]) - RectangleSize, p[X] + RectangleSize, self.toTk(p[Y]) + RectangleSize, fill='Black') def visit (self, n): """ Visit node to paint properly.""" if n == None: return self.drawPartition(n.region, n.point, n.orient) self.visit (n.below) self.visit (n.above) def prepare(self, event): """prepare to add points.""" if self.label: self.label.destroy() self.label = None self.canvas.pack() def paint(self): """Paint quad tree by visiting all nodes, or show introductory message.""" if self.tree.root: self.canvas.delete(tkinter.ALL) self.visit(self.tree.root) else: self.label = tkinter.Label(self.w, width=100, height = 40, text="Click To Add Points") self.label.bind("<Button-1>", self.prepare) self.label.pack()
class RTreeApp: def __init__(self): """App for creating R tree dynamically and executing range queries""" self.tree = RTree(m=2, M=4) self.ready = False # for range query self.selectedRegion = None self.newRegionStart = None self.newRegion = None # for identifiers self.counter = 0 self.master = tkinter.Tk() self.master.title('R Tree Range Query Application') self.w = tkinter.Frame(self.master, width=512, height=512) self.canvas = tkinter.Canvas(self.w, width=512, height=512) self.paint() self.canvas.bind("<Button-1>", self.startAdd) self.canvas.bind("<B1-Motion>", self.extendAdd) # only when right mouse dragged self.canvas.bind("<ButtonRelease-1>", self.endAdd) self.canvas.bind("<Button-3>", self.range) # when right mouse clicked self.canvas.bind("<ButtonRelease-3>", self.clear) self.canvas.bind("<B3-Motion>", self.range) # only when right mouse dragged self.w.pack() def startAdd(self, event): """End of range search.""" x = event.x y = self.toCartesian(event.y) self.newRegionStart = (x, y) def extendAdd(self, event): """End of range search.""" if self.newRegionStart: x = event.x y = self.toCartesian(event.y) self.newRegion = Region(x, y, x, y).unionPoint(self.newRegionStart) self.paint() def endAdd(self, event): """End of range search.""" if self.newRegionStart: self.newRegionStart = None self.counter += 1 if self.newRegion: self.tree.add(self.newRegion, str(self.counter)) self.newRegion = None self.paint() def toCartesian(self, y): """Convert tkinter point into Cartesian.""" return self.w.winfo_height() - y def toTk(self, y): """Convert Cartesian into tkinter point.""" if y == maxValue: return 0 tk_y = self.w.winfo_height() if y != minValue: tk_y -= y return tk_y def clear(self, event): """End of range search.""" self.selectedRegion = None self.paint() def range(self, event): """Initiate a range search using a selected rectangular region.""" p = (event.x, self.toCartesian(event.y)) if self.selectedRegion is None: self.selectedStart = Region(p[X], p[Y], p[X], p[Y]) self.selectedRegion = self.selectedStart.unionPoint(p) self.paint() # return (node,0,True) where status is True if draining entire tree rooted at node. If False, # then (rect,id,False). Draw these # as shaded red rectangle to identify whole sub-tree is selected. for triple in self.tree.range(self.selectedRegion): if triple[2]: r = triple[0].region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Red', stipple='gray12') else: r = triple[0] self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Red') def click(self, event): """Add point to KDtree.""" p = (event.x, self.toCartesian(event.y)) self.tree.add(p) self.paint() def visit(self, n): """ Visit node to paint properly.""" if n == None: return if n.level == 0: for idx in range(n.count): r = n.children[idx].region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), fill='Gray') for idx in range(n.count): self.visit(n.children[idx]) # Do after all children so we can see interior nodes, too. r = n.region self.canvas.create_rectangle(r.x_min, self.toTk(r.y_min), r.x_max, self.toTk(r.y_max), outline='Black', dash=(2, 4)) color = 'Gray' if n.level == 0: color = 'Black' self.canvas.create_text(r.x_max - 16 * len(n.id), self.toTk(r.y_max) + 16, anchor=tkinter.W, font="Times 16 bold", fill=color, text=n.id) def prepare(self, event): """prepare to add points.""" if self.label: self.label.destroy() self.label = None self.canvas.pack() def paint(self): """Paint R tree by visiting all nodes, or show introductory message.""" if self.ready: self.canvas.delete(tkinter.ALL) self.visit(self.tree.root) if self.newRegion: self.canvas.create_rectangle(self.newRegion.x_min, self.toTk(self.newRegion.y_min), self.newRegion.x_max, self.toTk(self.newRegion.y_max), outline='Black', dash=(2, 4)) if self.selectedRegion: self.canvas.create_rectangle( self.selectedRegion.x_min, self.toTk(self.selectedRegion.y_min), self.selectedRegion.x_max, self.toTk(self.selectedRegion.y_max), outline='Red', dash=(2, 4)) else: self.label = tkinter.Label(self.w, width=100, height=40, text="Click To Add Points") self.label.bind("<Button-1>", self.prepare) self.label.pack() self.ready = True