def pcb(self, ax): print('plot callback!', len([r for r in self.lsykws['rules'] if not r is None])) #self.lsykws['iterations'] -= 1 self.lsykws['polar'] = gtl.rad(self.lsykws['polar']) self.lsykws['azimuthal'] = gtl.rad(self.lsykws['azimuthal']) self.lsys = lsy.lsystem(**self.lsykws) self.lsys._realize(vec3(0, 0, 0), vec3(0, 0, 1), ax) self.lsykws['polar'] = gtl.deg(self.lsykws['polar']) self.lsykws['azimuthal'] = gtl.deg(self.lsykws['azimuthal']) return ax
class axialmtn(unittest.TestCase): keepers = { 'lake': ((vec3(0, 0, 0), vec3(0, 1, 0), 'X', dict([('X', '{[[X}{]X}F]X'), ('F', 'FA'), ('A', 'F')]), 6), dict(dazimuthal=gtl.rad(25.7), drho=20)), } def pg(self, *ags, **kws): pg = dpg.planargraph() for piece in lsy.lgen(*ags, **kws): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, 10), pg.fp(p2, 10) e12 = pg.fe(v1, v2) elif isinstance(piece, vec3): pass py = pym.pgtopy(pg, 1)[0] py = pym.bisectb(py) py = pym.smoothxy(py, 0.5, 2) #ax = pg.plotxy(l = 20) ax = dtl.plot_axes_xy(50) ax = dtl.plot_polygon_xy(py, ax, lw=3) plt.show() def test_lake(self): lakeags, params = self.keepers['lake'] self.pg(*lakeags, **params) def aaatest(self): #i = 5 i = 6 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'X' rules = dict([('X', '{[[X}{]X}F]X'), ('F', 'FA'), ('A', 'F')]) #rules = dict([('X','F{[X}{]X}FX'),('F','FF')]) #axiom = 'F' #rules = dict([('F','F{[F}F{]F}F')]) params = dict(dazimuthal=gtl.rad(25.7), drho=20) pg = dpg.planargraph() for piece in lsy.lgen(p, d, axiom, rules, i, **params): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, 10), pg.fp(p2, 10) e12 = pg.fe(v1, v2) elif isinstance(piece, vec3): pass py = pym.pgtopy(pg, 1)[0] py = pym.bisectb(py) py = pym.smoothxy(py, 0.5, 2) #py = pym.aggregate(py,2) #ax = pg.plotxy(l = 20) ax = dtl.plot_axes_xy(20) ax = dtl.plot_polygon_xy(py, ax, lw=3) plt.show()
def test_axialtree(self): i = 5 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'X' rules = dict([('X', 'F{[X}{]X}FX'), ('F', 'FF')]) params = dict(dazimuthal=gtl.rad(25.7)) realize(i, p, d, axiom, rules, **params)
def test_dragoncurve(self): i = 9 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'FX' rules = dict([('X', 'X[YF['), ('Y', ']FX]Y')]) params = dict(dazimuthal=gtl.rad(90)) realize(i, p, d, axiom, rules, **params)
def test_plant(self): i = 3 p,d = vec3(0,0,0),vec3(0,1,0) axiom = 'X' rules = dict([('X','F]{{X}[X}[F{[FX}]X'),('F','FF')]) params = dict(dazimuthal = gtl.rad(25)) realize(i,p,d,axiom,rules,**params)
def test_grass(self): i = 5 p,d = vec3(0,0,0),vec3(0,1,0) axiom = 'F' rules = dict([('F','F{[F}F{]F}F')]) params = dict(dazimuthal = gtl.rad(25.7)) realize(i,p,d,axiom,rules,**params)
def test_dragoncurve(self): i = 9 p,d = vec3(0,0,0),vec3(0,1,0) axiom = 'FX' rules = dict([('X','X[YF['),('Y',']FX]Y')]) params = dict(dazimuthal = gtl.rad(90)) realize(i,p,d,axiom,rules,**params)
def test_axialtree(self): i = 5 p,d = vec3(0,0,0),vec3(0,1,0) axiom = 'X' rules = dict([('X','F{[X}{]X}FX'),('F','FF')]) params = dict(dazimuthal = gtl.rad(25.7)) realize(i,p,d,axiom,rules,**params)
def test_plant(self): i = 3 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'X' rules = dict([('X', 'F]{{X}[X}[F{[FX}]X'), ('F', 'FF')]) params = dict(dazimuthal=gtl.rad(25)) realize(i, p, d, axiom, rules, **params)
def test_grass(self): i = 5 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'F' rules = dict([('F', 'F{[F}F{]F}F')]) params = dict(dazimuthal=gtl.rad(25.7)) realize(i, p, d, axiom, rules, **params)
def aaatest(self): #i = 5 i = 6 p, d = vec3(0, 0, 0), vec3(0, 1, 0) axiom = 'X' rules = dict([('X', '{[[X}{]X}F]X'), ('F', 'FA'), ('A', 'F')]) #rules = dict([('X','F{[X}{]X}FX'),('F','FF')]) #axiom = 'F' #rules = dict([('F','F{[F}F{]F}F')]) params = dict(dazimuthal=gtl.rad(25.7), drho=20) pg = dpg.planargraph() for piece in lsy.lgen(p, d, axiom, rules, i, **params): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, 10), pg.fp(p2, 10) e12 = pg.fe(v1, v2) elif isinstance(piece, vec3): pass py = pym.pgtopy(pg, 1)[0] py = pym.bisectb(py) py = pym.smoothxy(py, 0.5, 2) #py = pym.aggregate(py,2) #ax = pg.plotxy(l = 20) ax = dtl.plot_axes_xy(20) ax = dtl.plot_polygon_xy(py, ax, lw=3) plt.show()
def aaatest(self): #i = 5 i = 6 p,d = vec3(0,0,0),vec3(0,1,0) axiom = 'X' rules = dict([('X','{[[X}{]X}F]X'),('F','FA'),('A','F')]) #rules = dict([('X','F{[X}{]X}FX'),('F','FF')]) #axiom = 'F' #rules = dict([('F','F{[F}F{]F}F')]) params = dict(dazimuthal = gtl.rad(25.7),drho = 20) pg = dpg.planargraph() for piece in lsy.lgen(p,d,axiom,rules,i,**params): if isinstance(piece,tuple): p1,p2 = piece v1,v2 = pg.fp(p1,10),pg.fp(p2,10) e12 = pg.fe(v1,v2) elif isinstance(piece,vec3):pass py = pym.pgtopy(pg,1)[0] py = pym.bisectb(py) py = pym.smoothxy(py,0.5,2) #py = pym.aggregate(py,2) #ax = pg.plotxy(l = 20) ax = dtl.plot_axes_xy(20) ax = dtl.plot_polygon_xy(py,ax,lw = 3) plt.show()
def atest_grass(self): kws = { 'axiom':'F', 'rules':[('F','F[+F]F[-F]F')], 'iterations':3,'seed':0, 'angle':gtl.rad(25.7), } p,d = pstack.pop(0),dstack.pop(0) cx = ltr.tree(p,d,ax = ax) cx.display()
def test_adist(self): deg10 = gtl.rad(10) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 2, deg10 * 6), deg10 * 4), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 2), deg10 * 4), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 22), deg10 * 16), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 32), deg10 * 10), 1)
def atest_grass(self): kws = { 'axiom': 'F', 'rules': [('F', 'F[+F]F[-F]F')], 'iterations': 3, 'seed': 0, 'angle': gtl.rad(25.7), } p, d = pstack.pop(0), dstack.pop(0) cx = ltr.tree(p, d, ax=ax) cx.display()
def mountains(topo, tip, e=2): '''topographical loop corresponding to the base of a mountain range''' p, d, i, axiom, rules = ((vec3(0, 0, 0), vec3(0, 1, 0), 6, 'X', dict([('X', '{[[X}{]X}F]X'), ('F', 'FA'), ('A', 'F')]))) params = dict(dazimuthal=gtl.rad(25.7), drho=20) pg = pgr.planargraph() for piece in lsy.lgen(p, d, axiom, rules, i, **params): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, 10), pg.fp(p2, 10) e12 = pg.fe(v1, v2) elif isinstance(piece, vec3): pass py = pym.pgtopy(pg, 5)[0] py = pym.smoothxy(py, 0.5, 2, 0) py = pym.pinchb(py, 5)[0] pyprjx = vec3(1, 0, 0).prjps(py) pyprjy = vec3(0, 1, 0).prjps(py) tipprjx = vec3(1, 0, 0).prjps(tip.loop) tipprjy = vec3(0, 1, 0).prjps(tip.loop) recenter = vec3( ((pyprjx[1] + pyprjx[0]) - (tipprjx[1] + tipprjx[0])) / -2.0, ((pyprjy[1] + pyprjy[0]) - (tipprjy[1] + tipprjy[0])) / -2.0, 0) for p in py: p.trn(recenter) pyprjx = vec3(1, 0, 0).prjps(py) pyprjy = vec3(0, 1, 0).prjps(py) tipprjx = vec3(1, 0, 0).prjps(tip.loop) tipprjy = vec3(0, 1, 0).prjps(tip.loop) scale = 1.*(tipprjx[1]-tipprjx[0]+tipprjy[1]-tipprjy[0])/\ ( pyprjx[1]- pyprjx[0]+ pyprjy[1]- pyprjy[0]) for p in py: p.scl(vec3(scale, scale, 0)) #com = vec3(0,0,0).com(tip.loop).tov(vec3(0,0,0).com(py)).uscl(-1) py = pym.ebixy(tip.loop, py)[0] #py = pym.smoothxy(py,0.5,2) py = pym.pinchb(py, 5)[0] newtips = [topo.avert(tip, loop=py)] print('mountains') ax = dtl.plot_axes_xy(400) ax = dtl.plot_polygon_xy(tip.loop, ax, lw=3, col='b') ax = dtl.plot_polygon_xy(py, ax, lw=3, col='g') plt.show() return newtips
def mountains(topo,tip,e = 2): '''topographical loop corresponding to the base of a mountain range''' p,d,i,axiom,rules = ((vec3(0,0,0),vec3(0,1,0),6, 'X',dict([('X','{[[X}{]X}F]X'),('F','FA'),('A','F')]))) params = dict(dazimuthal = gtl.rad(25.7),drho = 20) pg = pgr.planargraph() for piece in lsy.lgen(p,d,axiom,rules,i,**params): if isinstance(piece,tuple): p1,p2 = piece v1,v2 = pg.fp(p1,10),pg.fp(p2,10) e12 = pg.fe(v1,v2) elif isinstance(piece,vec3):pass py = pym.pgtopy(pg,5)[0] py = pym.smoothxy(py,0.5,2,0) py = pym.pinchb(py,5)[0] pyprjx = vec3(1,0,0).prjps(py) pyprjy = vec3(0,1,0).prjps(py) tipprjx = vec3(1,0,0).prjps(tip.loop) tipprjy = vec3(0,1,0).prjps(tip.loop) recenter = vec3( ((pyprjx[1]+pyprjx[0])-(tipprjx[1]+tipprjx[0]))/-2.0, ((pyprjy[1]+pyprjy[0])-(tipprjy[1]+tipprjy[0]))/-2.0,0) for p in py:p.trn(recenter) pyprjx = vec3(1,0,0).prjps(py) pyprjy = vec3(0,1,0).prjps(py) tipprjx = vec3(1,0,0).prjps(tip.loop) tipprjy = vec3(0,1,0).prjps(tip.loop) scale = 1.*(tipprjx[1]-tipprjx[0]+tipprjy[1]-tipprjy[0])/\ ( pyprjx[1]- pyprjx[0]+ pyprjy[1]- pyprjy[0]) for p in py:p.scl(vec3(scale,scale,0)) #com = vec3(0,0,0).com(tip.loop).tov(vec3(0,0,0).com(py)).uscl(-1) py = pym.ebixy(tip.loop,py)[0] #py = pym.smoothxy(py,0.5,2) py = pym.pinchb(py,5)[0] newtips = [topo.avert(tip,loop = py)] print('mountains') ax = dtl.plot_axes_xy(400) ax = dtl.plot_polygon_xy(tip.loop,ax,lw = 3,col = 'b') ax = dtl.plot_polygon_xy(py,ax,lw = 3,col = 'g') plt.show() return newtips
def layroads(t, e): '''generate a planargraph of a network of roads''' #return pgr.planargraph() drho, i = 20, 3 p, d = vec3(0, 0, 0), vec3(0, 1, 0) #axiom = 'X' #rules = dict([('X','F{[X}{]X}X'),('F','FF')]) #params = dict(dazimuthal = gtl.rad(90),drho = drho) axiom = 'X' rules = dict([('X', 'F]{{X}[X}[F{[FX}]X'), ('F', 'FF')]) params = dict(dazimuthal=gtl.rad(90), drho=drho) pg = pgr.planargraph() for piece in lsy.lgen(p, d, axiom, rules, i, **params): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, drho / 2), pg.fp(p2, drho / 2) rdkws = {'style': 'urban'} e12 = pg.fe(v1, v2, **rdkws) elif isinstance(piece, vec3): pass #for v in pg.vs: # if v is None:continue # p = v[1]['p'] # p.ztrn(t(p.x,p.y)) #pyscale = vec3(0,1,0).prjps(py) #tipscale = vec3(0,1,0).prjps(tip.loop) #pyscale = pyscale[1]-pyscale[0] #tipscale = tipscale[1]-tipscale[0] #scale = tipscale/pyscale #com = vec3(0,0,0).com(tip.loop).tov(vec3(0,0,0).com(py)).uscl(-1) #for p in py:p.scl(vec3(scale,scale,0)).trn(com) print('ROADS') ax = dtl.plot_axes_xy(200) ax = pg.plotxy(ax) plt.show() #pdb.set_trace() return pg
def ___lsystemboundary(b): p, d, i, axiom, rules = ((vec3(0, 0, 0), vec3(0, 1, 0), 5, 'X', dict([('X', '{[[X}{]X}F]X'), ('F', 'FA'), ('A', 'F')]))) params = dict(dazimuthal=gtl.rad(25.7), drho=20) pg = dpg.planargraph() for piece in lsy.lgen(p, d, axiom, rules, i, **params): if isinstance(piece, tuple): p1, p2 = piece v1, v2 = pg.fp(p1, 10), pg.fp(p2, 10) e12 = pg.fe(v1, v2) elif isinstance(piece, vec3): pass py = pym.pgtopy(pg, 5)[0] py = pym.smoothxy(py, 0.5, 2) #py = pym.aggregate(py,2) py = pym.pinchb(py, 5) #ax = dtl.plot_axes_xy(400) #ax = pg.plotxy(ax,l = 300) #ax = dtl.plot_polygon_xy(b,ax,lw = 3,col = 'b') #ax = dtl.plot_polygon_xy(py,ax,lw = 3,col = 'g') #plt.show() pyscale = vec3(0, 1, 0).prjps(py) tipscale = vec3(0, 1, 0).prjps(b) pyscale = pyscale[1] - pyscale[0] tipscale = tipscale[1] - tipscale[0] scale = tipscale / pyscale com = vec3(0, 0, 0).com(b).tov(vec3(0, 0, 0).com(py)).uscl(-1) for p in py: p.scl(vec3(scale, scale, 0)).trn(com) ax = dtl.plot_axes_xy(400) ax = dtl.plot_polygon_xy(b, ax, lw=3, col='b') ax = dtl.plot_polygon_xy(py, ax, lw=3, col='g') plt.show() return py
def ___lsystemboundary(b): p,d,i,axiom,rules = ((vec3(0,0,0),vec3(0,1,0),5, 'X',dict([('X','{[[X}{]X}F]X'),('F','FA'),('A','F')]))) params = dict(dazimuthal = gtl.rad(25.7),drho = 20) pg = dpg.planargraph() for piece in lsy.lgen(p,d,axiom,rules,i,**params): if isinstance(piece,tuple): p1,p2 = piece v1,v2 = pg.fp(p1,10),pg.fp(p2,10) e12 = pg.fe(v1,v2) elif isinstance(piece,vec3):pass py = pym.pgtopy(pg,5)[0] py = pym.smoothxy(py,0.5,2) #py = pym.aggregate(py,2) py = pym.pinchb(py,5) #ax = dtl.plot_axes_xy(400) #ax = pg.plotxy(ax,l = 300) #ax = dtl.plot_polygon_xy(b,ax,lw = 3,col = 'b') #ax = dtl.plot_polygon_xy(py,ax,lw = 3,col = 'g') #plt.show() pyscale = vec3(0,1,0).prjps(py) tipscale = vec3(0,1,0).prjps(b) pyscale = pyscale[1]-pyscale[0] tipscale = tipscale[1]-tipscale[0] scale = tipscale/pyscale com = vec3(0,0,0).com(b).tov(vec3(0,0,0).com(py)).uscl(-1) for p in py:p.scl(vec3(scale,scale,0)).trn(com) ax = dtl.plot_axes_xy(400) ax = dtl.plot_polygon_xy(b,ax,lw = 3,col = 'b') ax = dtl.plot_polygon_xy(py,ax,lw = 3,col = 'g') plt.show() return py
def test_adist(self): deg10 = gtl.rad(10) self.assertEqual(gtl.isnear(gtl.adist(deg10*2,deg10*6),deg10*4),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*2),deg10*4),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*22),deg10*16),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*32),deg10*10),1)
def test_rad(self): self.assertEqual(gtl.isnear(gtl.rad(180), gtl.PI), 1)
def test_rad(self): self.assertEqual(gtl.isnear(gtl.rad(180),gtl.PI),1)