X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=meshscad;h=f66dba34845743d4a5419d73fe41da10f2830e5f;hb=14b5efb3e4f4e78c0e8e0eed9436d2c6ee3aea08;hp=84cc314e81b8926d302db6fea9a57c82ca599872;hpb=1c58b8c1d1d7baf8b1ac1aac494372650332e6d2;p=moebius3.git diff --git a/meshscad b/meshscad index 84cc314..f66dba3 100755 --- a/meshscad +++ b/meshscad @@ -8,55 +8,88 @@ signal.signal(signal.SIGINT, signal.SIG_DFL) from moebius import * from scad import * -nomsize = 30; +nomsize = 50; wire = 3.0; # number of wires -kv = 10 -kw = 10 +kv = 24 +kw = 16 # resolution -nv = 40 -nw = 40 -ns = 10 # around tube +nv = 80 +nw = 80 +ns = 4 # around tube, should be even nv += -nv % kv -nw += -hw % kw +nw += -nw % kw each_v = nv / kv each_w = nw / kw m = Moebius(nv, nw) -def round_wire(p, vec_surfacenormal, vec_acrosswire, sigma): - return (p + - wire * (vec_surfacenormal * sin(sigma) + - vec_acrosswire * cos*(sigma))) +def dpr(v): return '%+3f %+3f %+3f' % tuple(v) + +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) - extents = ScadObject() # wires along extents - travers = ScadObject(): # wires along traverses + # wires: + 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_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*(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): + for w in range(0, nw+1): for s in range(0, ns): - sigmas = [ (s + sx)/ns * tau for sigma in 0,1 ] - eq = [] + 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].quad([ round_wire(p, norm, trav, sigmas[sx]) - for p, norm, extt, trav in m.details(v+a, w) - for sx in 0,1 - for a in 0,1 ]) - if not v % each_v: - travers[v].quad([ round_wire(p, norm, extt, sigmas[sx]) - for p, norm, extt, trav in m.details(v, w+b) - for sx in 0,1 - for b in 0,1 ]) - for v in range(0, nv): - travers[v].writeout_core() + extents[w % nw].quad([ cnr for cnr in qc(v,w,sigmas,False) ]) + if not v % each_v and w < nw: + 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): - travers[w].writeout_core() - print '}' + print('// extent w=', w) + extents[w].writeout_core(nomsize) + for v in range(0, nv): + print('// travers v=', v) + travers[v].writeout_core(nomsize) + print('}') make_moebius('MoebiusMesh') print('moebiuscore_nomsize=%s;' % repr(nomsize))