X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=meshscad;h=ad3194929243001d5942498650ceee7216fe159d;hb=29cb20f6187aeed6da1f1a7efa3473ee46015ece;hp=c8924b7ab6edf438137ef88cd7d9ccd6c59ef991;hpb=0b413a36f877e9ee1a48758d8cb4e70b593a6424;p=moebius3.git diff --git a/meshscad b/meshscad index c8924b7..ad31949 100755 --- a/meshscad +++ b/meshscad @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 from __future__ import print_function @@ -8,18 +8,21 @@ signal.signal(signal.SIGINT, signal.SIG_DFL) from moebius import * from scad import * -nomsize = 50; -wire = 3.0; +nomsize = 30; +wire = 1.500; # number of wires kv = 24 kw = 16 # resolution -nv = 80 -nw = 80 +nv = 200 +nw = 200 ns = 4 # around tube, should be even +from moedebug import * +dbg_file(sys.stderr) + nv += -nv % kv nw += -nw % kw @@ -30,8 +33,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) @@ -43,32 +52,45 @@ def make_moebius(objname): #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) - for sx in 0,1: - sigma = sigmas[sx] - if is_trav: acrs = extt - else: acrs = trav - 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) + 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): + extw = w + if extw > nw/2: extw = nw-w + # each extent wire has to go round twice to meet itself + # (except the middle one, if there is one, where nw/2 = nw - nw/2 + # and it gets to be by itself 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,False) ]) + extents[extw].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,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)