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)
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))]
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
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)
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
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
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)