chiark / gitweb /
mesh: plug traverse ends
[moebius3.git] / meshscad
index cc5d44d8be361d9e8ee61b3dae2001899775fe51..f66dba34845743d4a5419d73fe41da10f2830e5f 100755 (executable)
--- a/meshscad
+++ b/meshscad
@@ -30,8 +30,14 @@ m = Moebius(nv, nw)
 
 def dpr(v): return '%+3f %+3f %+3f' % tuple(v)
 
-def round_wire(p, vec_surfacenormal, vec_acrosswire, sigma):
-  return r
+def points_round_wire(p, norm, acrs, sigmas):
+  for sigma in sigmas:
+    delta = norm * sin(sigma) + acrs * cos(sigma)
+    r = p + wire/nomsize * delta
+    yield r
+
+def calc_sigmas(ss):
+  return [ (s + 0.5)/ns * tau for s in ss ]
 
 def make_moebius(objname):
   print('module %s(){' % objname)
@@ -39,37 +45,44 @@ def make_moebius(objname):
   extents = [ ScadObject() for w in range(0,nw) ] # along extents
   travers = [ ScadObject() for v in range(0,nv) ] # along traverses
 
-  def qc(v, w, sigmas, is_extt, is_trav):
+  def qc(v, w, sigmas, is_trav):
     #print(' QCv,w,T',v,w,is_trav, file=sys.stderr)
     for ab in 0,1:
-      p, norm, extt, trav = m.details(v + ab*is_extt, w + ab*is_trav)
-      for sx in 0,1:
-        sigma = sigmas[sx]
-        if is_trav: acrs = extt
-        elif is_extt: acrs = trav
-        else: pass
-        delta = norm * sin(sigma) + acrs * cos(sigma)
-        r = p + wire/nomsize * delta
-        #print(' RW,ab,sx',ab,sx,
-        #      'r=',dpr(r),
-        #      'p=',dpr(p),
-        #      'norm=',dpr(norm),
-        #      'extt=',dpr(extt),
-        #      'acrs=',dpr(acrs),
-        #      'delta=',dpr(delta),
-        #      's=','%4f' % sigma,
-        #      file=sys.stderr)
+      p, norm, extt, trav = m.details(v + ab*(not is_trav), w + ab*is_trav)
+      if is_trav: acrs = extt
+      else: acrs = trav
+      #print(' RW,ab,sx',ab,sx,
+      #      'r=',dpr(r),
+      #      'p=',dpr(p),
+      #      'norm=',dpr(norm),
+      #      'extt=',dpr(extt),
+      #      'acrs=',dpr(acrs),
+      #      'delta=',dpr(delta),
+      #      's=','%4f' % sigma,
+      #      file=sys.stderr)
+      for r in points_round_wire(p, norm, acrs, sigmas):
         yield r
 
   for v in range(0, nv):
     for w in range(0, nw+1):
       for s in range(0, ns):
-        sigmas = [ (s + sx + 0.5)/ns * tau for sx in 0,1 ]
+        sigmas = calc_sigmas([s + sx for sx in (0,1)])
         #print('VWS',v,w,s, sigmas, file=sys.stderr)
         if not w % each_w:
-          extents[w % nw].quad([ cnr for cnr in qc(v,w,sigmas,True,False) ])
+          extents[w % nw].quad([ cnr for cnr in qc(v,w,sigmas,False) ])
         if not v % each_v and w < nw:
-          travers[v].quad([ cnr for cnr in qc(v,w,sigmas,False,True) ])
+          travers[v].rquad([ cnr for cnr in qc(v,w,sigmas,True) ])
+    if not v % each_v:
+      for w in 0, nw:
+        p, norm, extt, trav = m.details(v, w)
+        cnrs = points_round_wire(p, norm, extt, calc_sigmas(range(0,ns)))
+        cnrs = list(cnrs)
+        if w: cnrs.reverse()
+        for s in range(0, ns-1):
+          travers[v].triangle(cnrs[s],
+                              cnrs[s+1],
+                              cnrs[ns-1])
+
   for w in range(0, nw):
     print('// extent w=', w)
     extents[w].writeout_core(nomsize)