예제 #1
0
 def atest_ebdxy(self):
     def pl(b1,b2,br):
         ax = dtl.plot_axes_xy(10)
         ax = dtl.plot_polygon_xy(b1,ax,col = 'b',lw = 5.0)
         ax = dtl.plot_polygon_xy(b2,ax,col = 'g',lw = 5.0)
         ax = dtl.plot_polygon_xy(br,ax,col = 'r',lw = 2.0)
         plt.show()
     b1 = vec3(-4,0,0).pring(4,8)
     b2 = vec3(2,2,0).pring(4,8)
     br = pym.ebdxy(b1,b2)[0]
     #pl(b1,b2,br)
     self.assertTrue(len(br) == 9)
     b1 = vec3(0,0,0).sq(6,6)
     b2 = vec3(1.5,1.5,0).sq(3,3)
     br = pym.ebdxy(b1,b2)[0]
     #pl(b1,b2,br)
     self.assertTrue(len(br) == 6)
     b1 = vec3(0,0,0).sq(4,4)
     b2 = vec3(2,0,0).sq(2,6)
     br = pym.ebdxy(b1,b2)[0]
     #pl(b1,b2,br)
     self.assertTrue(len(br) == 4)
     b1 = vec3(0,0,0).pring(500,8)
     b2 = vec3(500,0,0).sq(400,200)
     br = pym.ebdxy(b1,b2)[0]
     #pl(b1,b2,br)
     self.assertTrue(len(br) == 12)
예제 #2
0
    def atest_ebdxy(self):
        def pl(b1, b2, br):
            ax = dtl.plot_axes_xy(10)
            ax = dtl.plot_polygon_xy(b1, ax, col='b', lw=5.0)
            ax = dtl.plot_polygon_xy(b2, ax, col='g', lw=5.0)
            ax = dtl.plot_polygon_xy(br, ax, col='r', lw=2.0)
            plt.show()

        b1 = vec3(-4, 0, 0).pring(4, 8)
        b2 = vec3(2, 2, 0).pring(4, 8)
        br = pym.ebdxy(b1, b2)[0]
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 9)
        b1 = vec3(0, 0, 0).sq(6, 6)
        b2 = vec3(1.5, 1.5, 0).sq(3, 3)
        br = pym.ebdxy(b1, b2)[0]
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0, 0, 0).sq(4, 4)
        b2 = vec3(2, 0, 0).sq(2, 6)
        br = pym.ebdxy(b1, b2)[0]
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 4)
        b1 = vec3(0, 0, 0).pring(500, 8)
        b2 = vec3(500, 0, 0).sq(400, 200)
        br = pym.ebdxy(b1, b2)[0]
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 12)
예제 #3
0
def ajagged(b,epsilon):
    j = random.randint(0,len(b)-1)
    l = b[j-1].d(b[j])
    t = random.uniform(0,2.0*numpy.pi)
    n = random.randint(3,8)

    stamp = b[j-1].mid(b[j]).pring(l/2.0,n)
    q = quat(1,0,0,0).av(t,vec3(0,0,1))
    q.rotps(stamp)
    
    if pym.bintbxy(b,stamp,col = False,ie = False):
        nbs = pym.ebdxy(b,stamp,epsilon)
        nbas = [pym.bareaxy(nb) for nb in nbs]
        nb = nbs[nbas.index(max(nbas))]
        nb = pym.aggregate(nb,1)
        if pym.bvalidxy(nb) > 0:b = nb

    bval = pym.bvalidxy(b)
    if bval == -1:b.reverse()
    if not pym.bvalidxy(b) > 0:
        ax = dtl.plot_axes_xy(700)
        ax = dtl.plot_polygon_xy(b,ax,lw = 4,col = 'b')
        ax = dtl.plot_points_xy(b,ax,number = True)
        ax = dtl.plot_polygon_xy(stamp,ax,lw = 2,col = 'r')
        plt.show()
        #pdb.set_trace()
        raise ValueError
    
    return b
예제 #4
0
    def split(self,sv,nvloop,svloop = None,**kws):
        '''add two child loops of sv'''
        print('former sv method... NEEDS CODE FROM DILAP.TOPOLOGY.PARTITIONGRAPH')
        print('par.loop becomes ebdxy of par.loop and nv.loop')
        nsvs = []
        nv1holes,nv2holes = sv.holes[:],[]
        if svloop is None:
            svloop = sv.loop[:]
            if pym.binbxy(nvloop,svloop):
                nv1holes.append(nvloop)
                nsvs.append(dtp.topography.avert(
                    self,sv,loop = svloop,holes = nv1holes))
            elif pym.binbxy(svloop,nvloop):
                nv2holes.append(svloop)
                nsvs.append(dtp.topography.avert(
                    self,sv,loop = svloop,holes = nv1holes))
            elif pym.bintbxy(nvloop,svloop,ie = False):
                svloop = pym.ebdxy(svloop,nvloop)
                if len(svloop) > 1:
                    for svl in svloop[:-1]:
                        nsvs.append(dtp.topography.avert(
                            self,sv,loop = svl,holes = nv1holes))
                svloop = svloop[-1]
                nsvs.append(dtp.topography.avert(
                    self,sv,loop = svloop,holes = nv1holes))
        nv = dtp.topography.avert(self,sv,loop = nvloop,holes = nv2holes)
        for k in kws:
            for nsv in nsvs:
                nsv.__setattr__(k,sv.__getattribute__(k))
            nv.__setattr__(k,kws[k])

        self.plot()
        plt.show()

        return nsvs,nv
예제 #5
0
        def genplatform(shb, shx):
            buff, rw = 6, 6
            fbnd = pym.contract(shb, wwi)
            platform = [p.cp() for p in fbnd]
            r1, r2 = platform[2].cp(), platform[3].cp()
            rtn = r1.tov(r2).nrm().uscl(buff)
            #rnm = vec3(0,0,1).crs(rtn).nrm().uscl(rw)
            rnm = pym.bnrm(fbnd).crs(rtn).nrm().uscl(rw)
            r2, r1 = r2.trn(rtn.flp()), r1.trn(rtn.flp())
            r3, r4 = r2.cp().trn(rnm), r1.cp().trn(rnm)

            belv = self.bgraph.vs[sh[shx - 1]][2]
            rh = max(belv['wheights']) + belv['skirt'] + belv['crown']
            ramp = [r4, r1, r2, r3]

            platform = pym.ebdxy(platform, ramp)
            #print(len(platform))
            platform = platform[len(platform) //
                                2]  # HACK TO GET CORRECT POLYGON...

            ramp[0].ztrn(-rh)
            ramp[1].ztrn(-rh)

            m.asurf((ramp, ()), tm)
            m.asurf((platform, ()), tm)
예제 #6
0
def ajagged(b, epsilon):
    j = random.randint(0, len(b) - 1)
    l = b[j - 1].d(b[j])
    t = random.uniform(0, 2.0 * numpy.pi)
    n = random.randint(3, 8)

    stamp = b[j - 1].mid(b[j]).pring(l / 2.0, n)
    q = quat(1, 0, 0, 0).av(t, vec3(0, 0, 1))
    q.rotps(stamp)

    if pym.bintbxy(b, stamp, col=False, ie=False):
        nbs = pym.ebdxy(b, stamp, epsilon)
        nbas = [pym.bareaxy(nb) for nb in nbs]
        nb = nbs[nbas.index(max(nbas))]
        nb = pym.aggregate(nb, 1)
        if pym.bvalidxy(nb) > 0: b = nb

    bval = pym.bvalidxy(b)
    if bval == -1: b.reverse()
    if not pym.bvalidxy(b) > 0:
        ax = dtl.plot_axes_xy(700)
        ax = dtl.plot_polygon_xy(b, ax, lw=4, col='b')
        ax = dtl.plot_points_xy(b, ax, number=True)
        ax = dtl.plot_polygon_xy(stamp, ax, lw=2, col='r')
        plt.show()
        #pdb.set_trace()
        raise ValueError

    return b
예제 #7
0
    def layfootprints(r, t, e):
        eseam, seams, loops = pym.pgtopy(r, 5, e, findeseam=True)
        ebnd = seams[eseam]
        eloop = loops[eseam]
        k = 0
        easement = None
        for j in range(len(ebnd)):
            road = r.es[r.elook[(eloop[k - 1], eloop[k])]]
            edge = (ebnd[j - 1], ebnd[j])
            tang = edge[0].tov(edge[1])
            norm = tang.crs(vec3(0, 0, 1)).nrm()
            p1 = edge[0].cp().trn(tang.cp().uscl(0.0))
            p2 = edge[0].cp().trn(tang.cp().uscl(1.0))
            p3 = p2.cp().trn(norm.uscl(10))
            p4 = p1.cp().trn(norm)
            newfp = [p1, p2, p3, p4]
            newfp = pym.contract(newfp, 2)
            newfp = pym.ebdxy(newfp, ebnd)[0]
            newfp = (newfp, [])
            preasement = easement
            if easement is None: easement = newfp
            else: easement = pym.epuxy(easement, newfp)[0]
            if not eloop[k] == eloop[k - 2]: k += 1

            if False and j > 85:
                print('walk', j, len(eloop), len(ebnd))
                ax = dtl.plot_axes_xy(300)
                ax = dtl.plot_polygon_xy(ebnd, ax, lw=3, col='b')
                ax = dtl.plot_points_xy(ebnd, ax, number=True)
                ax = dtl.plot_edges_xy(edge, ax, lw=7, col='r')
                ax = dtl.plot_polygon_full_xy(easement, ax, lw=5, col='g')
                if preasement:
                    ax = dtl.plot_polygon_full_xy(preasement,
                                                  ax,
                                                  lw=3,
                                                  col='m')
                plt.show()

        #easement = pym.bsuxy(easement,e)
        fps = ([easement], [[] for l in range(len(loops) - 1)])
        # generate a set of footprints connected to road
        # footprint must not overlap interiors with ebnd
        ax = dtl.plot_axes_xy(300)
        ax = dtl.plot_polygon_xy(ebnd, ax, lw=3, col='b')
        for fp in fps[0]:
            ax = dtl.plot_polygon_full_xy(fp, ax, lw=3, col='g')
        plt.show()

        return fps
예제 #8
0
        def correct_loops(v,l):
            lswollen = [p.cp().ztrn(v.loop[0].z-p.z) for p in l]
            #lswollen = pym.contract(lswollen,abs(l[0].z-v.loop[0].z)/mingrad)

            #ax = dtl.plot_axes(300)
            #ax = dtl.plot_polygon(lswollen,ax,lw = 3,col = 'b')
            #ax = dtl.plot_polygon(v.loop,ax,lw = 3,col = 'r')
            #plt.show()

            newloops = pym.ebdxy(v.loop,lswollen)
            v.loop = newloops[0]
            if len(newloops) > 1:
                for nl in newloops[1:]:
                    nv = self.avert(self.above(v),loop = nl)
            for ch in self.below(v):
                if pym.bintbxy(lswollen,ch.loop):
                    correct_loops(ch,lswollen)
예제 #9
0
    def split(self, sv, nvloop, svloop=None, **kws):
        '''add two child loops of sv'''
        print(
            'former sv method... NEEDS CODE FROM DILAP.TOPOLOGY.PARTITIONGRAPH'
        )
        print('par.loop becomes ebdxy of par.loop and nv.loop')
        nsvs = []
        nv1holes, nv2holes = sv.holes[:], []
        if svloop is None:
            svloop = sv.loop[:]
            if pym.binbxy(nvloop, svloop):
                nv1holes.append(nvloop)
                nsvs.append(
                    dtp.topography.avert(self, sv, loop=svloop,
                                         holes=nv1holes))
            elif pym.binbxy(svloop, nvloop):
                nv2holes.append(svloop)
                nsvs.append(
                    dtp.topography.avert(self, sv, loop=svloop,
                                         holes=nv1holes))
            elif pym.bintbxy(nvloop, svloop, ie=False):
                svloop = pym.ebdxy(svloop, nvloop)
                if len(svloop) > 1:
                    for svl in svloop[:-1]:
                        nsvs.append(
                            dtp.topography.avert(self,
                                                 sv,
                                                 loop=svl,
                                                 holes=nv1holes))
                svloop = svloop[-1]
                nsvs.append(
                    dtp.topography.avert(self, sv, loop=svloop,
                                         holes=nv1holes))
        nv = dtp.topography.avert(self, sv, loop=nvloop, holes=nv2holes)
        for k in kws:
            for nsv in nsvs:
                nsv.__setattr__(k, sv.__getattribute__(k))
            nv.__setattr__(k, kws[k])

        self.plot()
        plt.show()

        return nsvs, nv
예제 #10
0
        def genplatform(shb,shx):
            buff,rw = 6,6
            fbnd = pym.contract(shb,wwi)
            platform = [p.cp() for p in fbnd]
            r1,r2 = platform[2].cp(),platform[3].cp()
            rtn = r1.tov(r2).nrm().uscl(buff)
            #rnm = vec3(0,0,1).crs(rtn).nrm().uscl(rw)
            rnm = pym.bnrm(fbnd).crs(rtn).nrm().uscl(rw)
            r2,r1 = r2.trn(rtn.flp()),r1.trn(rtn.flp())
            r3,r4 = r2.cp().trn(rnm),r1.cp().trn(rnm)

            belv = self.bgraph.vs[sh[shx-1]][2]
            rh = max(belv['wheights'])+belv['skirt']+belv['crown']
            ramp = [r4,r1,r2,r3]

            platform = pym.ebdxy(platform,ramp)
            #print(len(platform))
            platform = platform[len(platform)//2] # HACK TO GET CORRECT POLYGON...

            ramp[0].ztrn(-rh)
            ramp[1].ztrn(-rh)

            m.asurf((ramp,()),tm)
            m.asurf((platform,()),tm)
예제 #11
0
    def ____genregions(self, t, r):
        pg = ptg.partitiongraph()
        rpy = pym.pgtopy(r, 3)

        ax = dtl.plot_axes(200)
        #ax = pg.plotxy(ax)
        #for j in range(len(loops)):
        #    ax = dtl.plot_polygon_xy(loops[j],ax)
        if rpy: ax = dtl.plot_polygon_full(rpy, ax)
        plt.show()

        #rtl = t.al(rpy[0],t.locloop(rpy[0],1)[0])

        ### create the ocean vertex
        #b = t.root.loop
        b = t.boundary
        ov = pg.av(b=[b, []], p=vec3(0, 0, 0).com(b), t=['ocean'])

        ### create landmass vertices
        #ls = t.looptree.below(t.root)
        lmvs = []
        for l in t.landmasses:
            lv = pg.sv(ov, b, l.loop)
            pg.vs[lv][1]['t'] = ['natural']

            if not rpy is None:
                loops = pym.ebdxy(l.loop, rpy[0])

                '''#
                print('looooopeed',[len(l) for l in loops])
                ax = dtl.plot_axes_xy(100)
                ax = pg.plotxy(ax)
                for j in range(len(loops)):
                    ax = dtl.plot_polygon_xy(loops[j],ax)
                ax = dtl.plot_polygon_full_xy(rpy,ax)
                plt.show()
                '''#

                if len(loops) > 1:
                    for loop in loops[:-1]:
                        rv = pg.sv(lv, l.loop, loop)
                        pg.vs[rv][1]['t'] = ['natural']
                    rv = pg.sv(lv, loops[-1], rpy[0])
                    pg.vs[rv][1]['t'] = ['infrastructure']
                else:
                    rv = pg.sv(lv, loops[0], rpy[0])
                    pg.vs[rv][1]['t'] = ['infrastructure']

                for dpy in rpy[1]:
                    dv = pg.sv(rv, rpy[0], dpy)
                    pg.vs[dv][1]['t'] = ['developed']

                print('chea1')
                for dpy in rpy[1]:
                    rtv = t.al(dpy, t.locloop(dpy, 0)[0])
                print('chea2')

                '''#
                ax = dtl.plot_axes_xy(200)
                #ax = r.plotxy(ax)
                ax = pg.plotxy(ax)
                #ax = dtl.plot_polygon_full_xy(rpy,ax)
                plt.show()
                '''#

            lmvs.append(lv)

        ### create the details of each landmass vertex
        for lm in lmvs:
            self.genregion(t, r, lm, pg)

        ### attach the terrain mesh to the partition vertices...
        for vx in range(pg.vcnt):
            pv = pg.vs[vx]
            if pv is None: continue
            pv[1]['tmesh'] = t

        ### return partition graph
        return pg