# HG changeset patch # User Henry S. Thompson # Date 1622049396 14400 # Node ID fcef94b6324c97d87e7a62f14caa3b3041ff9be4 # Parent 3ee329b129c618a561c8c9c14a7298d02601cb1b move all the action to Block diff -r 3ee329b129c6 -r fcef94b6324c python/safe.py --- a/python/safe.py Wed May 26 09:18:49 2021 -0400 +++ b/python/safe.py Wed May 26 13:16:36 2021 -0400 @@ -3,6 +3,7 @@ import sys, math from util import * +from bisect import insort_left as insort def usage(): print("""Usage: safe.py [-d n] @@ -21,37 +22,60 @@ n=10.0 class Block: - pass + '''Shared by Air and Lava, + holds points and columns. + Columns are dictionaries indexed by (x,z) coords, + value is upward-ordered list of pairs, closed intervals of y''' + def __init__(self,filename): + with open(filename,'r') as file: + self.readHeaders(file) + self.readPoints(file) -Block.__init__=readHeaders + cc=self.columns={} + tc={} + for p in self.points: + k=(p[0],p[2]) + y=p[1] + try: + yy=tc[k] + insort(yy,y) + except KeyError: + tc[k]=[y] + # convert to lists of intervals + # Simplest case first + for k,yy in tc.items(): + tyy=[yy] + ii=[] + while True: + clean=True + for j,yy in enumerate(tyy): + if len(yy)==1+(yy[-1]-yy[0]): + ii.append((yy[0],yy[-1])) + else: + clean=False + for i in range(len(yy)-1): + if yy[i]+1!=yy[i+1]: + ii+=(yy[0],yy[i]) + tyy=[yy[i+1:]]+tyy[j+1:] + break + if clean: + break + self.columns[k]=ii + + def readPoints(self,file): + file.readline() + self.points=[[float(i) for i in l.split('\t')[2].split(',')] for l in file] + +Block.readHeaders=readHeaders # from util class Air(Block): - def __init__(self,filename): - with open(filename,'r') as air: - Block.__init__(self,air) - air.readline() - aa=self.blocks=[[float(i) for i in l.split('\t')[2].split(',')] for l in air] - ad=self.columns={} - for a in aa: - k=(a[0],a[2]) - h=ad.get(k,500.0) - if a[1]