Exemple #1
0
 def smooth_radial(self,selfdex):
     if not self.vring:return dpv.zero()
     ns = [self.mesh.vs[x].p for x in self.vring]
     ds = [dpv.distance(n,self.p) for n in ns]
     ws = [dpr.clamp(d/max(ds),0.5,1.0) for d in ds]
     ncom = dpv.center_of_mass_weighted(ns,ws)
     return dpv.v1_v2(self.p,ncom).scale(self.w)
Exemple #2
0
    def advfrontpoint(self,eloop,point):
        ex,ea = point
        el1,el2,el3 = eloop[ex-1][0],eloop[ex][0],eloop[ex][1]
        v1,v2,v3 = self.vs[el1],self.vs[el2],self.vs[el3]
        e1 = dpv.v1_v2(v2.p,v1.p)
        e2 = dpv.v1_v2(v2.p,v3.p)
        e1len,e2len = e1.magnitude(),e2.magnitude()
        avd = (e1len+e2len)/2.0
        e1.normalize()
        e2.normalize()
        if ea < numpy.pi/2.0:
            fs = [(el1,el2,el3)]
            eloop.pop(ex)
            eloop.pop(ex-1)
            eloop.insert((0 if ex == 0 else ex-1),(el1,el3))
        elif ea < 2.0*numpy.pi/3.0:
            mpt = dpv.midpoint(v1.p,v3.p)
            mdist = avd - dpv.distance(v2.p,mpt)
            mdelt = dpv.v1_v2(v2.p,mpt).normalize().scale_u(mdist)
            mpt.translate(mdelt)
            newv = vertex(mpt,dpv.zhat.copy(),dpv.zero2d(),dpv.one(),self)
            el4 = len(self.vs)-1
            fs = [(el1,el2,el4),(el2,el3,el4)]
            eloop.pop(ex)
            eloop.pop(ex-1)
            eloop.insert((0 if ex == 0 else ex-1),(el4,el3))
            eloop.insert((0 if ex == 0 else ex-1),(el1,el4))
        else:
            # shouldnt this always default to e1 and not just use whichever is shorter...
            mdist = min((e1len,e2len))
            mdelt = dpv.v1_v2(v2.p,v1.p).cross(v2.n)
            mdelt.normalize().scale_u(mdist)
            mpt = dpv.midpoint(v2.p,v1.p).translate(mdelt)
            newv = vertex(mpt,dpv.zhat.copy(),dpv.zero2d(),dpv.one(),self)
            el4 = len(self.vs)-1
            fs = [(el1,el2,el4)]
            eloop.pop(ex-1)
            eloop.insert((0 if ex == 0 else ex-1),(el4,el2))
            eloop.insert((0 if ex == 0 else ex-1),(el1,el4))
        
        check = self.checkfront(eloop)
        if not check is None:pdb.set_trace()

        self.fdata(fs)
        for fx in range(len(fs)):
            f = fs[fx]
            [self.vs[f[x]].face(f,x,fx) for x in range(len(f))]
Exemple #3
0
 def flatten(self,interfaces,planepoint,planenormal):
     projected = []
     for iface in interfaces:
         for vx in self.fs[iface]:
             if not vx in projected:
                 projected.append(vx)
                 v = self.vs[vx]
                 vp = v.p.project_plane(planepoint,planenormal)
                 v.p.translate(dpv.v1_v2(v.p,vp))
                 v.w.scale_u(0.0)
     return projected
Exemple #4
0
    def advfront(self,eloop):
        vs = self.vs
        eacnt = 0
        whch = (0,10.0)
        for ex in range(len(eloop)):
            el1,el2,el3 = eloop[ex-1][0],eloop[ex][0],eloop[ex][1]
            v1,v2,v3 = vs[el1],vs[el2],vs[el3]
            e1 = dpv.v1_v2(v2.p,v1.p).normalize()
            e2 = dpv.v1_v2(v2.p,v3.p).normalize()

            #ea = dpv.signed_angle_between(e2,e1,v2.n)

            ea = numpy.arccos(dpv.dot(e1,e2))
            vn = e1.cross(e2)
            if vn.dot(v2.n) < 0.0:ea *= -1.0

            if ea < 0.01:ea = numpy.pi
            if ea <= whch[1]:whch = (eacnt,ea)
            eacnt += 1
        self.advfrontpoint(eloop,whch)
Exemple #5
0
 def skeleton(self):
     s = dmo.model()
     for v in self.vs:
         m = dcu.cube().scale(dpv.one().scale_u(0.1)).translate(v.p)
         s._consume(m)
     for e in self.es:
         cq = dpq.q_from_uu(dpv.zhat,
             dpv.v1_v2(self.vs[e[0]].p,self.vs[e[1]].p))
         c = dcy.cylinder().translate_z(0.5)
         c.scale_x(0.05).scale_y(0.05).rotate(cq)
         c.translate(self.vs[e[0]].p)
         s._consume(c)
     return s
Exemple #6
0
 def _smooth(self):
     mdvs = self.meshdata.vertices
     pcs = self.meshdata.pcoords
     vs = self.vertices
     ts = self.tverts
     deltas = []
     tomove = []
     for tv in range(self.tvcnt):
         v = mdvs[vs[ts[tv][0]]]
         vring = self.vrings[tv]
         twght = self.twghts[tv]
         neighbors = [mdvs[vs[ts[vr][0]]] for vr in vring]
         ncom = dpv.center_of_mass([pcs[n[0]] for n in neighbors])
         #delta = dpv.v1_v2(pcs[v[0]],ncom).scale_u(0.02)
         delta = dpv.v1_v2(pcs[v[0]],ncom).scale(twght)
         deltas.append(delta)
         tomove.append(pcs[v[0]])
     for tdx in range(self.tvcnt):
         tomove[tdx].translate(deltas[tdx])
     return self
Exemple #7
0
 def smooth_uniform(self,selfdex):
     ns = [self.mesh.vs[x].p for x in self.vring]
     ns.append(self.mesh.vs[selfdex].p)
     ncom = dpv.center_of_mass(ns)
     return dpv.v1_v2(self.p,ncom).scale(self.w)