class Extents: __slots__ = "xmin ymin xmax ymax".split() def __init__(self,xmin=float('inf'),ymin=float('inf'),xmax=float('-inf'),ymax=float('-inf')): self.xmin = xmin self.ymin = ymin self.xmax = xmax self.ymax = ymax def add(self,x,y): self.xmin = min(self.xmin,x) self.xmax = max(self.xmax,x) self.ymin = min(self.ymin,y) self.ymax = max(self.ymax,y) def extend(self,l): for x,y in l: self.add(x,y) def __add__(self,extent): #todo: why can this happen? if extent ==0: return Extents(self.xmin,self.ymin,self.xmax,self.ymax) return Extents( min(self.xmin,extent.xmin),min(self.ymin,extent.ymin), max(self.xmax,extent.xmax),max(self.ymax,extent.ymax) ) def __radd__(self,extent): if extent == 0: return Extents(self.xmin,self.ymin,self.xmax,self.ymax) return self.__add__(extent) def get_width(self): return self.xmax-self.xmin def get_height(self): return self.ymax-self.ymin width = property(get_width) height = property(get_height) def __repr__(self): return f'Extents ({self.xmin},{self.ymin})-({self.xmax},{self.ymax})'