예제 #1
0
 def test_slerp(self):
     a1,v1 = dpr.PI4,vec3(0,0,1)
     a2,v2 = dpr.PI,vec3(0,0,1)
     q1,q2 = quat(1,0,0,0).av(0,v1),quat(1,1,1,0).av(a1,v1)
     q3 = quat(0,1,0,0).av(a2,v2)
     self.assertEqual(q1.slerp(q3,0.25),q2)
     self.assertFalse(q1.slerp(q3,0.25) is q1) 
예제 #2
0
 def test_rot(self):
     a1,v1 = dpr.PI4,vec3(0,0,1)
     a2,v2 = dpr.PI2,vec3(0,0,1)
     q1,q2 = quat(1,0,0,0).av(a1,v1),quat(1,1,1,0).av(a1,v1)
     q3 = quat(0,1,0,0).av(a2,v2)
     self.assertTrue(q1.rot(q2) == q3)
     self.assertTrue(q1.rot(q2) is q1)
예제 #3
0
 def test_mul(self):
     a1,v1 = dpr.PI4,vec3(0,0,1)
     a2,v2 = dpr.threePI4,vec3(0,0,1)
     q1,q2 = quat(1,0,0,0).av(a1,v1),quat(1,1,1,0).av(a2,v1)
     q3 = quat(0,1,0,0).av(a1+a2,v2)
     self.assertTrue(q1.mul(q2) == q3)
     self.assertFalse(q1.mul(q2) is q1)
예제 #4
0
 def test_cnj(self):
     q1,q2 = quat(1,0,0,0),quat(1,1,1,0)
     q3,q4 = quat(-1,2,5,11),quat(1,-2,-5,-11)
     self.assertTrue(q1.cp().cnj() == q1)
     self.assertTrue(q1.cnj() is q1)
     self.assertFalse(q2.cp().cnj() == q2)
     self.assertFalse(q3.cnj() == q4)
예제 #5
0
 def test_inv(self):
     a1,v1 = dpr.PI4,vec3(0,0,1)
     a2,v2 = dpr.threePI4,vec3(0,0,1)
     q1,q2 = quat(1,0,0,0).av(a1,v1),quat(1,1,1,0).av(a2,v2)
     self.assertEqual(q1.cp().cnj(),q1.inv())
     self.assertEqual(q2.cp().cnj(),q2.inv())
     self.assertFalse(q1.inv() is q1)
예제 #6
0
 def test_dot(self):
     a1,v1 = dpr.PI4,vec3(0,0,1)
     a2,v2 = dpr.PI2,vec3(0,1,0)
     q1,q2 = quat(1,0,0,0).av(a1,v1),quat(1,1,1,0).av(a1,v1)
     q3 = quat(0,1,0,0).av(a2,v2)
     q4 = quat(0,1,0,0).av(0,v1)
     self.assertTrue(dpr.isnear(q1.dot(q2),q1.mag2()))
     self.assertFalse(dpr.isnear(q1.dot(q3),0))
     self.assertTrue(dpr.isnear(q3.dot(q4),q3.w))
예제 #7
0
 def test_uscl(self):
     q1,q2 = quat(1,0,0,0),quat(1,1,1,0)
     q3,q4 = quat(0,2,5,11),quat(0,1,2.5,5.5)
     self.assertTrue(q1.cp().uscl(1) == q1)
     self.assertFalse(q1.cp().uscl(3) == q1)
     self.assertTrue(q2.cp().uscl(1) == q2)
     self.assertFalse(q2.cp().uscl(3) == q2)
     self.assertTrue(q3.cp().uscl(0.5) == q4)
     self.assertTrue(q1.uscl(1) is q1)
예제 #8
0
    def skeleton(self):
        m = dmo.model()
        gm = m.agfxmesh()
        tr, nps, nes = self.lsys.topology
        mw = 2.0
        knuckles = []

        def walk(v, l, ml):
            ch = tr.below(v)
            if not ch:
                self.leaf(tr.above(v), v)
                #if not ch:self.branch(tr.above(v),v,l,ml,mw)
            else:
                kn = knuckle(tr.above(v), v, l, ml, mw)
                knuckles.append(kn)
                l += 1.0
                ml = len(tr.allbelow(v))
                for c in ch:
                    #self.branch(v,c,l,ml,mw)
                    kn.digit(c, l, ml, mw)
                    walk(c, l, ml)
                if len(knuckles) == 1: kn.gen(m, gm, True)
                else: kn.gen(m, gm, False)

        walk(tr.root, 0, len(tr.allbelow(tr.root)))
        p, q, s = vec3(0, 0, 0), quat(0, 0, 0, 0), vec3(1, 1, 1)
        sgv = self.amodel(p, q, s, m, None)
        return self

        '''#
        m = dmo.model()
        gm = m.atricube()
        p = vec3(0,0,1)
        q = quat(0,0,0,0).av(numpy.pi/3.0,vec3(0,0,1))
        #q = quat(0,0,0,0).av(0.0,vec3(0,0,1))
        s = vec3(1,2,1)
        self.amodel(p,q,s,m,None)
        '''#

        for v in nps:
            m = dmo.model()
            gm = m.atricube()
            p = v.cp()
            q = quat(0, 0, 0, 0).av(0.0, vec3(0, 0, 1))
            s = vec3(0.1, 0.1, 0.2)
            sgv = self.amodel(p, q, s, m, None)
        for e in nes:
            m = dmo.model()
            gm = m.atricube()
            m.trn(vec3(0, 0, 1))
            p = nps[e[0]].cp()
            tn = nps[e[0]].tov(nps[e[1]])
            q = quat(0, 0, 0, 0).uu(vec3(0, 0, 1), tn)
            s = vec3(0.05, 0.05, 0.5 * tn.mag())
            sgv = self.amodel(p, q, s, m, None)
        return self
예제 #9
0
    def test_graph(self):
        p1,r1,s1 = vec3(0,0,0),quat(0,0,0,1).av(0,vec3(0,0,1)),vec3(1,1,1)
        p2,r2,s2 = vec3(2,0,1),quat(0,0,0,1).av(dpr.PI2,vec3(0,0,1)),vec3(1,1,1)
        p3,r3,s3 = vec3(0,3,-1),quat(0,0,0,1).av(dpr.PI4,vec3(0,0,1)),vec3(1,1,1)
        tr = dsg.scenegraph()
        one = tr.avert(p1,r1,s1,tr.root)
        two = tr.avert(p2,r2,s2,tr.root)
        thr = tr.avert(p3,r3,s3,two)

        tr.graph()
예제 #10
0
 def test_nrm(self):
     q1,q2,q3 = quat(1,0,0,0),quat(1,1,1,0),quat(0,2,5,11)
     self.assertEqual(dpr.isnear(q1.cp().nrm().mag(),1),1)
     self.assertEqual(dpr.isnear(q2.cp().nrm().mag(),1),1)
     self.assertEqual(dpr.isnear(q3.cp().nrm().mag(),1),1)
     self.assertTrue(q1.cp().nrm().mag() == q1.mag())
     self.assertTrue(q1.nrm() is q1)
     self.assertFalse(q2.cp().nrm().mag() == q2.mag())
     self.assertTrue(q2.nrm() is q2)
     self.assertFalse(q3.cp().nrm().mag() == q3.mag())
     self.assertTrue(q3.nrm() is q3)
예제 #11
0
 def test_isnear(self):
     q1,q2 = quat(1,1,1,0),quat(1,1,1,0.1)
     q3,q4 = quat(1,1,1,1),quat(1,1.000001,1,1)
     self.assertEqual(q1.isnear(q1),1)
     self.assertEqual(q3.isnear(q3),1)
     self.assertEqual(q1.isnear(q2),0)
     self.assertEqual(q2.isnear(q1),0)
     self.assertEqual(q1.isnear(q3),0)
     self.assertEqual(q2.isnear(q3),0)
     self.assertEqual(q2.isnear(q4),0)
     self.assertEqual(q3.isnear(q4),1)
예제 #12
0
    def skeleton(self):
        m = dmo.model()
        gm = m.agfxmesh()
        tr,nps,nes = self.lsys.topology
        mw = 2.0
        knuckles = []
        def walk(v,l,ml):
            ch = tr.below(v)
            if not ch:self.leaf(tr.above(v),v)
            #if not ch:self.branch(tr.above(v),v,l,ml,mw)
            else:
                kn = knuckle(tr.above(v),v,l,ml,mw)
                knuckles.append(kn)
                l += 1.0
                ml = len(tr.allbelow(v))
                for c in ch:
                    #self.branch(v,c,l,ml,mw)
                    kn.digit(c,l,ml,mw)
                    walk(c,l,ml)
                if len(knuckles) == 1:kn.gen(m,gm,True)
                else:kn.gen(m,gm,False)
        walk(tr.root,0,len(tr.allbelow(tr.root)))
        p,q,s = vec3(0,0,0),quat(0,0,0,0),vec3(1,1,1)
        sgv = self.amodel(p,q,s,m,None)
        return self

        '''#
        m = dmo.model()
        gm = m.atricube()
        p = vec3(0,0,1)
        q = quat(0,0,0,0).av(numpy.pi/3.0,vec3(0,0,1))
        #q = quat(0,0,0,0).av(0.0,vec3(0,0,1))
        s = vec3(1,2,1)
        self.amodel(p,q,s,m,None)
        '''#

        for v in nps:
            m = dmo.model()
            gm = m.atricube()
            p = v.cp()
            q = quat(0,0,0,0).av(0.0,vec3(0,0,1))
            s = vec3(0.1,0.1,0.2)
            sgv = self.amodel(p,q,s,m,None)
        for e in nes:
            m = dmo.model()
            gm = m.atricube()
            m.trn(vec3(0,0,1))
            p = nps[e[0]].cp()
            tn = nps[e[0]].tov(nps[e[1]])
            q = quat(0,0,0,0).uu(vec3(0,0,1),tn)
            s = vec3(0.05,0.05,0.5*tn.mag())
            sgv = self.amodel(p,q,s,m,None)
        return self
예제 #13
0
 def test_flp(self):
     q1,q2 = quat(1,0,0,0),quat(1,1,1,0)
     q3,q4 = quat(0,2,5,11),quat(-1,1,1,0)
     self.assertFalse(q1.cp().flp() == q1)
     self.assertFalse(q2.cp().flp() == q2)
     self.assertTrue(q3.cp().flp() == q3)
     self.assertFalse(q4.cp().flp() == q4)
     self.assertTrue(q2.cp().flp() == q4)
     self.assertTrue(q1.flp() is q1)
     self.assertTrue(q2.flp() is q2)
     self.assertTrue(q3.flp() is q3)
     self.assertTrue(q4.flp() is q4)
예제 #14
0
 def test_uu(self):
     u1,u2,u3 = vec3(1,0,0),vec3(0,-1,0),vec3(0,0,1)
     q1,q2 = quat(0,0,0,0).uu(u1,u2),quat(0,0,0,0).uu(u1,u3)
     q3,q4 = quat(0,0,0,0).uu(u2,u3),quat(0,0,0,0).uu(u3,u2)
     self.assertTrue(q1.w >  0.1)
     self.assertTrue(dpr.isnear(q1.x,0))
     self.assertTrue(dpr.isnear(q1.y,0))
     self.assertTrue(q1.z < -0.1)
     self.assertTrue(q2.w >  0.1)
     self.assertTrue(dpr.isnear(q2.x,0))
     self.assertTrue(q2.y < -0.1)
     self.assertTrue(dpr.isnear(q2.z,0))
     self.assertTrue(q3 == q4.cnj())
예제 #15
0
 def setUp(self):
     a1 = dpr.PI2
     v1,v2,v3 = vec3(1,0,0),vec3(0,1,0),vec3(0,0,1)
     q0 = quat(0,0,0,0).av( 0,v3)
     q1 = quat(0,0,0,0).av(a1,v1)
     q2 = quat(0,0,0,0).av(a1,v2)
     q3 = quat(0,0,0,0).av(a1,v3)
     self.tf1 = tform(vec3(1,1,0),q3.cp(),vec3(1,2,1))
     self.tf2 = tform(vec3(1,1,0),q3.cp(),vec3(1,2,1))
     self.tf3 = tform(vec3(0,1,0),q1,vec3(1,1,1))
     a2 = dpr.PI
     q4 = quat(0,0,0,0).av(a2,v3)
     self.tf4 = tform(vec3(0,2,0),q4,vec3(1,4,1))
예제 #16
0
def splotch(vb, easement=10):
    # WIP
    vbes = [(vb[0][x - 1], vb[0][x]) for x in range(len(vb[0]))]
    vbels = [vb[0][x - 1].d(vb[0][x]) for x in range(len(vb[0]))]
    vbe_primary = vbels.index(max(vbels))
    vbe_primary_tn = vb[0][vbe_primary - 1].tov(vb[0][vbe_primary]).nrm()
    bq = quat(0, 0, 0, 1).uu(vec3(1, 0, 0), vbe_primary_tn)
    if not bq: bq = quat(1, 0, 0, 0)

    vbcon = pym.aggregate(pym.contract(vb[0], easement), 5)

    vbxpj = vbe_primary_tn.prjps(vb[0])
    vbypj = vbe_primary_tn.cp().zrot(gtl.PI2).prjps(vb[0])
    vbxl, vbyl = vbxpj[1] - vbxpj[0], vbypj[1] - vbypj[0]

    dx, dy = 20, 20
    xn, yn = int(1.5 * vbxl / dx), int(1.5 * vbyl / dy)
    print('xn,yn', xn, yn)
    o = vec3(0, 0, 0).com(vbcon)
    vgrid = [
        o.cp().xtrn(dx * (x - (xn / 2.0))).ytrn(dy * (y - (yn / 2.0)))
        for x in range(xn) for y in range(yn)
    ]
    #vgrid = [p for p in vgrid if abs(p.x-10) > 10]
    boxes = [
        p.cp().trn(o.flp()).rot(bq).trn(o.flp()).sq(dx, dy) for p in vgrid
    ]

    for b in boxes:
        bcom = vec3(0, 0, 0).com(b).flp()
        bcom.trnos(b)
        bq.rotps(b)
        bcom.flp().trnos(b)
    boxes = [b for b in boxes if pym.binbxy(b, vbcon)]
    for ib in vb[1]:
        boxes = [
            b for b in boxes if not pym.bintbxy(b, ib) and not b[0].inbxy(ib)
            and not ib[0].inbxy(b[0])
        ]

    blgfps = pym.ebuxy_special(boxes, 5, 4)

    ps = [vec3(0, 0, 0).com(blgfp) for blgfp in blgfps]
    qs = [bq.cp() for blgfp in blgfps]
    ss = [vec3(1, 1, 1) for blgfp in blgfps]

    for p, q, s, blgfp in zip(ps, qs, ss, blgfps):
        p.cpxy().flp().trnos(blgfp)
        q.cpf().rotps(blgfp)

    return zip(ps, qs, ss, blgfps)
예제 #17
0
 def test_avert(self):
     p1,r1,s1 = vec3(0,0,0),quat(0,0,0,1),vec3(1,1,1)
     p2,r2,s2 = vec3(2,0,1),quat(0,0,0,1).av(dpr.PI2,vec3(0,0,1)),vec3(1,1,1)
     p3,r3,s3 = vec3(0,3,-1),quat(0,0,0,1).av(dpr.PI4,vec3(0,0,1)),vec3(1,1,1)
     tr = dsg.scenegraph()
     one = tr.avert(p1,r1,s1,tr.root)
     two = tr.avert(p2,r2,s2,tr.root)
     three = tr.avert(p3,r3,s3,two)
     self.assertEqual(tr.below(tr.root),[one,two])
     self.assertEqual(tr.above(one),tr.root)
     self.assertEqual(tr.above(two),tr.root)
     self.assertEqual(tr.below(one),[])
     self.assertEqual(tr.below(two),[three])
     self.assertEqual(tr.above(three),two)
예제 #18
0
def chunk(b, epsilon, lscl=1.0, j1=None, j2=None, edge=False):
    if j1 is None: j1 = random.randint(0, len(b) - 1)
    if j2 is None: j2 = j1 - 1
    l = b[j1].d(b[j2]) * lscl
    t = random.uniform(0, 2.0 * numpy.pi)
    n = random.randint(3, 8)

    if edge:
        stamp = b[j1].mid(b[j2]).pring(l / 2.0, n)
    else:
        stamp = vec3(random.randint(int(l / 4), int(l)),
                     random.randint(int(l / 4), int(l)),
                     0).com(b).pring(l / 2.0, n)
    q = quat(1, 0, 0, 0).av(t, vec3(0, 0, 1))
    q.rotps(stamp)

    if pym.binbxy(stamp, b):
        return stamp
    elif pym.bintbxy(b, stamp, col=False, ie=False):
        nbs = pym.ebixy(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:
            return nb
    else:
        ax = dtl.plot_axes_xy(200)
        ax = dtl.plot_polygon_xy(b, ax, col='r', lw=2)
        ax = dtl.plot_polygon_xy(stamp, ax, col='b', lw=2)
        plt.show()
        raise ValueError
예제 #19
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
예제 #20
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
예제 #21
0
        def mr(rg, fp, ix):
            i = rg.vs[ix]
            ip = i[1]['p']
            es = rg.rings[i[0]]
            oes = rg.orings[i[0]]
            oec = len(oes)

            if oec == 0:
                di = ip.tov(vec3(0, 0, 0).com(fp))
                p2 = ip.cp().trn(di)
                #p2 = wfp(fp,ip,p2)
                res = rg.mev(ix, {'p': p2, 'l': 0}, {})

            elif oec == 1:
                op = rg.vs[oes[0]][1]['p']
                a = random.choice((-1, 1)) * numpy.pi / 2.0
                q = quat(1, 0, 0, 0).av(a, vec3(0, 0, 1))
                p2 = ip.cp().trn(op.tov(ip).rot(q))
                p2 = wfp(fp, ip, p2)
                res = rg.mev(ix, {'p': p2, 'l': 0}, {})

            else:
                for x in range(1, len(oes)):
                    oeas = rg.ea(i[0], oes[x - 1], oes[x])

                    print('oeoeoe', oeas)

                    #rg.vs[oes[0]][1]['p']

                #i2,r1 = rg.mev(i1,{'p':p2,'l':0},{})
                pdb.set_trace()

            return res
예제 #22
0
        def mr(rg,fp,ix):
            i = rg.vs[ix]
            ip = i[1]['p']
            es = rg.rings[i[0]]
            oes = rg.orings[i[0]]
            oec = len(oes)

            if oec == 0:
                di = ip.tov(vec3(0,0,0).com(fp))
                p2 = ip.cp().trn(di)
                #p2 = wfp(fp,ip,p2)
                res = rg.mev(ix,{'p':p2,'l':0},{})
                
            elif oec == 1:
                op = rg.vs[oes[0]][1]['p']
                a = random.choice((-1,1))*numpy.pi/2.0
                q = quat(1,0,0,0).av(a,vec3(0,0,1))
                p2 = ip.cp().trn(op.tov(ip).rot(q))
                p2 = wfp(fp,ip,p2)
                res = rg.mev(ix,{'p':p2,'l':0},{})

            else:
                for x in range(1,len(oes)):
                    oeas = rg.ea(i[0],oes[x-1],oes[x])

                    print('oeoeoe',oeas)

                    #rg.vs[oes[0]][1]['p']

                #i2,r1 = rg.mev(i1,{'p':p2,'l':0},{})
                pdb.set_trace()

            return res
예제 #23
0
def chunk(b,epsilon,lscl = 1.0,j1 = None,j2 = None,edge = False):
    if j1 is None:j1 = random.randint(0,len(b)-1)
    if j2 is None:j2 = j1-1
    l = b[j1].d(b[j2])*lscl
    t = random.uniform(0,2.0*numpy.pi)
    n = random.randint(3,8)

    if edge:
        stamp = b[j1].mid(b[j2]).pring(l/2.0,n)
    else:
        stamp = vec3(
            random.randint(int(l/4),int(l)),
            random.randint(int(l/4),int(l)),
            0).com(b).pring(l/2.0,n)
    q = quat(1,0,0,0).av(t,vec3(0,0,1))
    q.rotps(stamp)
    
    if pym.binbxy(stamp,b):
        return stamp
    elif pym.bintbxy(b,stamp,col = False,ie = False):
        nbs = pym.ebixy(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:
            return nb
    else:
        ax = dtl.plot_axes_xy(200)
        ax = dtl.plot_polygon_xy(b,ax,col = 'r',lw = 2)
        ax = dtl.plot_polygon_xy(stamp,ax,col = 'b',lw = 2)
        plt.show()
        raise ValueError
예제 #24
0
    def test_graph(self):
        p1, r1, s1 = vec3(0, 0, 0), quat(0, 0, 0,
                                         1).av(0, vec3(0, 0,
                                                       1)), vec3(1, 1, 1)
        p2, r2, s2 = vec3(2, 0, 1), quat(0, 0, 0,
                                         1).av(dpr.PI2,
                                               vec3(0, 0, 1)), vec3(1, 1, 1)
        p3, r3, s3 = vec3(0, 3, -1), quat(0, 0, 0,
                                          1).av(dpr.PI4,
                                                vec3(0, 0, 1)), vec3(1, 1, 1)
        tr = dsg.scenegraph()
        one = tr.avert(p1, r1, s1, tr.root)
        two = tr.avert(p2, r2, s2, tr.root)
        thr = tr.avert(p3, r3, s3, two)

        tr.graph()
예제 #25
0
 def gen(self,m,gm,r = False):
     if r:bt = vec3(0,0,-1).pring(self.calc_w(),8)
     else:bt = self.base.MARK[1].pring(self.calc_w(),8)
     mid = self.corner.MARK[1].pring(self.calc_w(),8)
     tps = [chp[0].MARK[1].pring(self.calc_w(x),8) 
               for x,chp in enumerate(self.chprops)]
     u2s = [self.corner.MARK[1].tov(chp[0].MARK[1]) for chp in self.chprops]
     u1 = self.base.MARK[1].tov(self.corner.MARK[1])
     for u2,tp in zip(u2s,tps):
         if u1.mag() == 0:q1 = quat(0,0,0,1)
         else:q1 = quat(0,0,0,1).uu(vec3(0,0,1),u1)
         q2 = quat(0,0,0,1).uu(vec3(0,0,1),u2)
         vec3(0,0,0).com(mid).fulc(q1,mid)
         vec3(0,0,0).com(tp).fulc(q2,tp)
         self.tribridge(m,gm,mid,tp,'concrete1')
         if r:self.tribridge(m,gm,bt,mid,'concrete1')
         vec3(0,0,0).com(mid).fulc(q1.flp(),mid)
예제 #26
0
def splotch(vb,easement = 10):
    # WIP
    vbes = [(vb[0][x-1],vb[0][x]) for x in range(len(vb[0]))]
    vbels = [vb[0][x-1].d(vb[0][x]) for x in range(len(vb[0]))]
    vbe_primary = vbels.index(max(vbels))
    vbe_primary_tn = vb[0][vbe_primary-1].tov(vb[0][vbe_primary]).nrm()
    bq = quat(0,0,0,1).uu(vec3(1,0,0),vbe_primary_tn)
    if not bq:bq = quat(1,0,0,0)

    vbcon = pym.aggregate(pym.contract(vb[0],easement),5)

    vbxpj = vbe_primary_tn.prjps(vb[0])
    vbypj = vbe_primary_tn.cp().zrot(gtl.PI2).prjps(vb[0])
    vbxl,vbyl = vbxpj[1]-vbxpj[0],vbypj[1]-vbypj[0]

    dx,dy = 20,20
    xn,yn = int(1.5*vbxl/dx),int(1.5*vbyl/dy)
    print('xn,yn',xn,yn)
    o = vec3(0,0,0).com(vbcon)
    vgrid = [o.cp().xtrn(dx*(x-(xn/2.0))).ytrn(dy*(y-(yn/2.0)))
        for x in range(xn) for y in range(yn)]
    #vgrid = [p for p in vgrid if abs(p.x-10) > 10]
    boxes = [p.cp().trn(o.flp()).rot(bq).trn(o.flp()).sq(dx,dy) for p in vgrid]

    for b in boxes:
        bcom = vec3(0,0,0).com(b).flp()
        bcom.trnos(b)
        bq.rotps(b)
        bcom.flp().trnos(b)
    boxes = [b for b in boxes if pym.binbxy(b,vbcon)]
    for ib in vb[1]:
        boxes = [b for b in boxes if not pym.bintbxy(b,ib) 
            and not b[0].inbxy(ib) and not ib[0].inbxy(b[0])]

    blgfps = pym.ebuxy_special(boxes,5,4)

    ps = [vec3(0,0,0).com(blgfp) for blgfp in blgfps]
    qs = [bq.cp() for blgfp in blgfps]
    ss = [vec3(1,1,1) for blgfp in blgfps]

    for p,q,s,blgfp in zip(ps,qs,ss,blgfps):
        p.cpxy().flp().trnos(blgfp)
        q.cpf().rotps(blgfp)

    return zip(ps,qs,ss,blgfps)
예제 #27
0
 def test_avert(self):
     p1, r1, s1 = vec3(0, 0, 0), quat(0, 0, 0, 1), vec3(1, 1, 1)
     p2, r2, s2 = vec3(2, 0, 1), quat(0, 0, 0,
                                      1).av(dpr.PI2,
                                            vec3(0, 0, 1)), vec3(1, 1, 1)
     p3, r3, s3 = vec3(0, 3, -1), quat(0, 0, 0,
                                       1).av(dpr.PI4,
                                             vec3(0, 0, 1)), vec3(1, 1, 1)
     tr = dsg.scenegraph()
     one = tr.avert(p1, r1, s1, tr.root)
     two = tr.avert(p2, r2, s2, tr.root)
     three = tr.avert(p3, r3, s3, two)
     self.assertEqual(tr.below(tr.root), [one, two])
     self.assertEqual(tr.above(one), tr.root)
     self.assertEqual(tr.above(two), tr.root)
     self.assertEqual(tr.below(one), [])
     self.assertEqual(tr.below(two), [three])
     self.assertEqual(tr.above(three), two)
예제 #28
0
 def branch(self, s, e, l, ml, mw):
     m = dmo.model()
     gm = m.atricube('generic')
     m.trn(vec3(0, 0, 1))
     p = s.MARK[1].cp()
     tn = s.MARK[1].tov(e.MARK[1])
     q = quat(0, 0, 0, 0).uu(vec3(0, 0, 1), tn)
     w = 0.1 * max((mw - (l / ml)**(0.25)), 0.2)
     s = vec3(w, w, 0.5 * tn.mag())
     sgv = self.amodel(p, q, s, m, None)
예제 #29
0
 def gen(self, m, gm, r=False):
     if r: bt = vec3(0, 0, -1).pring(self.calc_w(), 8)
     else: bt = self.base.MARK[1].pring(self.calc_w(), 8)
     mid = self.corner.MARK[1].pring(self.calc_w(), 8)
     tps = [
         chp[0].MARK[1].pring(self.calc_w(x), 8)
         for x, chp in enumerate(self.chprops)
     ]
     u2s = [self.corner.MARK[1].tov(chp[0].MARK[1]) for chp in self.chprops]
     u1 = self.base.MARK[1].tov(self.corner.MARK[1])
     for u2, tp in zip(u2s, tps):
         if u1.mag() == 0: q1 = quat(0, 0, 0, 1)
         else: q1 = quat(0, 0, 0, 1).uu(vec3(0, 0, 1), u1)
         q2 = quat(0, 0, 0, 1).uu(vec3(0, 0, 1), u2)
         vec3(0, 0, 0).com(mid).fulc(q1, mid)
         vec3(0, 0, 0).com(tp).fulc(q2, tp)
         self.tribridge(m, gm, mid, tp, 'concrete1')
         if r: self.tribridge(m, gm, bt, mid, 'concrete1')
         vec3(0, 0, 0).com(mid).fulc(q1.flp(), mid)
예제 #30
0
 def branch(self,s,e,l,ml,mw):
     m = dmo.model()
     gm = m.atricube('generic')
     m.trn(vec3(0,0,1))
     p = s.MARK[1].cp()
     tn = s.MARK[1].tov(e.MARK[1])
     q = quat(0,0,0,0).uu(vec3(0,0,1),tn)
     w = 0.1*max((mw-(l/ml)**(0.25)),0.2)
     s = vec3(w,w,0.5*tn.mag())
     sgv = self.amodel(p,q,s,m,None)
예제 #31
0
 def test_av(self):
     a = 3*dpr.PI4
     u1,u2,u3 = vec3(1,0,0),vec3(0,-1,0),vec3(0,0,1)
     q1,q2 = quat(0,0,0,0).av(a,u1),quat(0,0,0,0).av(a,u2)
     q3,q4 = quat(0,0,0,0).av(-a,u3),quat(0,0,0,0).av(-a,u2)
     self.assertTrue(q1.w > 0.1)
     self.assertTrue(q1.x > 0.1)
     self.assertTrue(dpr.isnear(q1.y,0))
     self.assertTrue(dpr.isnear(q1.z,0))
     self.assertTrue(q2.w > 0.1)
     self.assertTrue(dpr.isnear(q2.x,0))
     self.assertTrue(q2.y < -0.1)
     self.assertTrue(dpr.isnear(q2.z,0))
     self.assertTrue(q3.w > 0.1)
     self.assertTrue(dpr.isnear(q3.x,0))
     self.assertTrue(dpr.isnear(q3.y,0))
     self.assertTrue(q3.z < -0.1)
     self.assertFalse(q2 == q4.cp().flp())
     self.assertTrue(q2 == q4.cnj())
예제 #32
0
 def leaf(self, s, e):
     m = dmo.model()
     gm = m.atricube('generic')
     p = s.MARK[1].cp()
     tn = s.MARK[1].tov(e.MARK[1])
     q = quat(0, 0, 0, 0).uu(vec3(0, 0, 1), tn)
     #w = 0.1*max((mw-(l/ml)**(0.25)),0.2)
     #s = vec3(w,w,0.5*tn.mag())
     #q = quat(0,0,0,0).av(0.0,vec3(0,0,1))
     s = vec3(0.2, 0.2, 0.5 * tn.mag())
     m.trn(vec3(0, 0, 1))
     sgv = self.amodel(p, q, s, m, None)
예제 #33
0
 def leaf(self,s,e):
     m = dmo.model()
     gm = m.atricube('generic')
     p = s.MARK[1].cp()
     tn = s.MARK[1].tov(e.MARK[1])
     q = quat(0,0,0,0).uu(vec3(0,0,1),tn)
     #w = 0.1*max((mw-(l/ml)**(0.25)),0.2)
     #s = vec3(w,w,0.5*tn.mag())
     #q = quat(0,0,0,0).av(0.0,vec3(0,0,1))
     s = vec3(0.2,0.2,0.5*tn.mag())
     m.trn(vec3(0,0,1))
     sgv = self.amodel(p,q,s,m,None)
예제 #34
0
 def test_rot(self):
     q = quat(0, 0, 0, 0).av(dpr.PI2, vec3(0, 0, 1))
     self.pset.rot(q)
     self.assertTrue(vec3(0, 0, 0) in self.pset.ps)
     self.assertTrue(vec3(-1, 0, 0) in self.pset.ps)
     self.assertTrue(vec3(-1, 1, 0) in self.pset.ps)
     self.assertTrue(vec3(0, 1, 0) in self.pset.ps)
     self.assertTrue(vec3(0, 0, 1) in self.pset.ps)
     self.assertTrue(vec3(-1, 0, 1) in self.pset.ps)
     self.assertTrue(vec3(-1, 1, 1) in self.pset.ps)
     self.assertTrue(vec3(0, 1, 1) in self.pset.ps)
     self.assertFalse(vec3(1, 0, 0) in self.pset.ps)
     self.assertFalse(vec3(1, 1, 0) in self.pset.ps)
     self.assertFalse(vec3(1, 0, 1) in self.pset.ps)
     self.assertFalse(vec3(1, 1, 1) in self.pset.ps)
예제 #35
0
 def test_rot(self):
     q = quat(0,0,0,0).av(dpr.PI2,vec3(0,0,1))
     self.pset.rot(q)
     self.assertTrue(vec3( 0,0,0) in self.pset.ps)
     self.assertTrue(vec3(-1,0,0) in self.pset.ps)
     self.assertTrue(vec3(-1,1,0) in self.pset.ps)
     self.assertTrue(vec3( 0,1,0) in self.pset.ps)
     self.assertTrue(vec3( 0,0,1) in self.pset.ps)
     self.assertTrue(vec3(-1,0,1) in self.pset.ps)
     self.assertTrue(vec3(-1,1,1) in self.pset.ps)
     self.assertTrue(vec3( 0,1,1) in self.pset.ps)
     self.assertFalse(vec3(1,0,0) in self.pset.ps)
     self.assertFalse(vec3(1,1,0) in self.pset.ps)
     self.assertFalse(vec3(1,0,1) in self.pset.ps)
     self.assertFalse(vec3(1,1,1) in self.pset.ps)
예제 #36
0
class lgrammer:

    push = lambda ls : ls.avert()
    def pop(ls):ls.tip = ls.above(ls.tip)
    edge = lambda ls : (ls.tip.p.cp(),ls.tip.p.trn(ls.tip.d.cp().uscl(ls.drho)))
    term = lambda ls : ls.tip.p.cp()

    getqv = lambda d : y if (d.isnear(z) or d.isnear(nz)) else z

    def polar(ls,f = 1.0):
        ls.tip.d.rot(quat(0,0,0,0).av(f*ls.dpolar,lgrammer.getqv(ls.tip.d)))
    polar_u = lambda ls : lgrammer.polar(ls, 1)
    polar_d = lambda ls : lgrammer.polar(ls,-1)

    def azimuthal(ls,f = 1.0):
        ls.tip.d.rot(quat(0,0,0,0).av(f*ls.dazimuthal,lgrammer.getqv(ls.tip.d)))
    azimuthal_u = lambda ls : lgrammer.azimuthal(ls, 1)
    azimuthal_d = lambda ls : lgrammer.azimuthal(ls,-1)
    azimuthal_f = lambda ls : lgrammer.azimuthal(ls,numpy.pi/ls.dazimuthal)
    
    pitch_u = lambda ls : d.rot(quat(0,0,0,0).av( ls.dpitch,vec3(1,0,0)))
    pitch_d = lambda ls : d.rot(quat(0,0,0,0).av(-ls.dpitch,vec3(1,0,0)))
    yaw_u   = lambda ls : d.rot(quat(0,0,0,0).av( ls.dyaw,  vec3(0,0,1)))
    yaw_d   = lambda ls : d.rot(quat(0,0,0,0).av(-ls.dyaw,  vec3(0,0,1)))
    roll_u  = lambda ls : d.rot(quat(0,0,0,0).av( ls.droll, vec3(0,1,0)))
    roll_d  = lambda ls : d.rot(quat(0,0,0,0).av(-ls.droll, vec3(0,1,0)))

    dic = {
        '{':push,'}':pop,'F':edge,'Q':term,
        '(':polar_u,'[':azimuthal_u,'<':pitch_u,'+':yaw_u,'=':roll_u,
        ')':polar_d,']':azimuthal_d,'>':pitch_d,'-':yaw_d,'|':roll_d,
                    '$':azimuthal_f,
            }
        #'&':self.randrot,'~':self.randdirrot,
        #'^':self.wobblerot,
        #'O':self.orient,

    '''#
예제 #37
0
 def test_rot(self):
     v1,v2 = vec3(0,2,0),vec3(-2,0,0)
     q1 = quat(0,0,0,0).av(dpr.PI2,vec3(0,0,1))
     q2 = quat(0,0,0,0).av(0,vec3(0,0,1))
     self.assertEqual(v1.rot(q1),v2)
     self.assertEqual(v1.cp().rot(q2),v1)
예제 #38
0
 def amodel(self, p=None, q=None, s=None, m=None, par=None):
     if p is None: p = vec3(0, 0, 0)
     if q is None: q = quat(1, 0, 0, 0)
     if s is None: s = vec3(1, 1, 1)
     return self.sgraph.avert(p, q, s, models=[m], parent=par)
예제 #39
0
 def azimuthal(ls,f = 1.0):
     ls.tip.d.rot(quat(0,0,0,0).av(f*ls.dazimuthal,lgrammer.getqv(ls.tip.d)))
예제 #40
0
 def polar(ls,f = 1.0):
     ls.tip.d.rot(quat(0,0,0,0).av(f*ls.dpolar,lgrammer.getqv(ls.tip.d)))
예제 #41
0
 def __init__(self):
     ntf = tform(vec3(0,0,0),quat(1,0,0,0),vec3(1,1,1))
     dtr.tree.__init__(self,ntf)
예제 #42
0
    def atest_bsegbxy(self):
        def pl(b1, b2, br):
            ax = dtl.plot_axes_xy()
            ax = dtl.plot_polygon_xy(b1, ax, col='b', lw=5.0)
            ax = dtl.plot_polygon_xy(b2, ax, col='g', lw=5.0)
            for be in br:
                ax = dtl.plot_edges_xy(be, ax, mk='s', col='r', lw=2.0)
            #ax = dtl.plot_polygon_xy(br,ax,mk = 's',col = 'r',lw = 2.0)
            plt.show()

        boundary = vec3(0, 0, 0).pring(500, 8)
        b1 = pym.contract(boundary, 100)
        b2 = vec3(500, 0, 0).sq(800, 300)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 10)

        b1 = vec3(-4, 0, 0).pring(4, 8)
        b2 = vec3(2, 2, 0).pring(4, 8)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 9)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(2, 2, 0).sq(3, 3)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(3, 3, 0).sq(3, 3)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 4)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(3, 0, 0).sq(3, 3)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 4)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(3, 0, 0).sq(3, 1)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(0, -2, 0).sq(3, 3)
        quat(0, 0, 0, 0).av(numpy.pi / 4.0, vec3(0, 0, 1)).rotps(b1)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(1, 1, 0).sq(1, 1)
        br = pym.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0, 0, 0).sq(3, 3)
        b2 = vec3(2, 2, 0).sq(3, 3)
        quat(0, 0, 0, 0).av(numpy.pi / 4.0, vec3(0, 0, 1)).rotps(b2)
        br = pym.bsegbxy(b1, b2)
        #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.bsegbxy(b1, b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
예제 #43
0
    def atest_bsegbxy(self):
        def pl(b1,b2,br):
            ax = dtl.plot_axes_xy()
            ax = dtl.plot_polygon_xy(b1,ax,col = 'b',lw = 5.0)
            ax = dtl.plot_polygon_xy(b2,ax,col = 'g',lw = 5.0)
            for be in br:
                ax = dtl.plot_edges_xy(be,ax,mk = 's',col = 'r',lw = 2.0)
            #ax = dtl.plot_polygon_xy(br,ax,mk = 's',col = 'r',lw = 2.0)
            plt.show()

        boundary = vec3(0,0,0).pring(500,8)
        b1 = pym.contract(boundary,100)
        b2 = vec3(500,0,0).sq(800,300)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 10)

        b1 = vec3(-4,0,0).pring(4,8)
        b2 = vec3(2,2,0).pring(4,8)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 9)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(2,2,0).sq(3,3)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(3,3,0).sq(3,3)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 4)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(3,0,0).sq(3,3)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 4)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(3,0,0).sq(3,1)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(0,-2,0).sq(3,3)
        quat(0,0,0,0).av(numpy.pi/4.0,vec3(0,0,1)).rotps(b1)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(1,1,0).sq(1,1)
        br = pym.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
        b1 = vec3(0,0,0).sq(3,3)
        b2 = vec3(2,2,0).sq(3,3)
        quat(0,0,0,0).av(numpy.pi/4.0,vec3(0,0,1)).rotps(b2)
        br = pym.bsegbxy(b1,b2)
        #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.bsegbxy(b1,b2)
        #pl(b1,b2,br)
        self.assertTrue(len(br) == 6)
예제 #44
0
 def amodel(self,p = None,q = None,s = None,m = None,par = None):
     if p is None:p = vec3(0,0,0)
     if q is None:q = quat(1,0,0,0)
     if s is None:s = vec3(1,1,1)
     return self.sgraph.avert(p,q,s,models = [m],parent = par)