diff options
Diffstat (limited to 'Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp')
-rw-r--r-- | Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp b/Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp new file mode 100644 index 00000000000..f3498720411 --- /dev/null +++ b/Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp @@ -0,0 +1,361 @@ +% convergingspirals.mp +% L. Nobre G. - a twisted mind... +% 2007 + +prologues := 1; + +vardef oper( expr Valu, Slop ) = + (Valu*Slop) +enddef; + +vardef hiperspiral( expr Val, Phi, Pitch ) = + dir(57.29578*Val*(Pitch**2)+Phi)/oper(Val,Pitch) +enddef; + +beginfig(5); %%%%%%%%%%%%%% This figure has one very small bug... %%%%%%% + boolean adddepth; + adddepth = true; + pi = 3.14159; + co = 180/pi; + mar = 0.20cm; + prmax = 6cm; + prmin = 0.85cm; + hrmax = 7cm; + ptmax = 1.699*pi; + pstpnum = 100; + numarquid = 5; + multipl = 5; %%%%%%%%%%%%%%% must be odd for checkerboard %%%%%%%%%%%%%% + checkerdepth = multipl+3; + fac = hrmax/prmax; + alfa = 2*pi/numarquid; + pitcha = prmax/ptmax; + pitchb = prmax/(ptmax-alfa); + numhiperb = numarquid*multipl; + ptstp = ptmax/pstpnum; + ptstb = (ptmax-alfa)/pstpnum; + umin = prmax/10; + vmin = prmax/20; + ustp = (hrmax-umin)/pstpnum; + vstp = (hrmax-vmin)/pstpnum; + + path n[]m[], c[], cutter; + cutter = fullcircle rotated 180 scaled (2prmin); + for i=1 upto 8: + n0m[i] = origin; + endfor; + for i=1 upto pstpnum: + tp := i*ptstp; + tb := i*ptstb; + pu := umin+i*ustp; + vu := vmin+i*vstp; + n0m1 := n0m1--dir(co*tp)*(pitcha*tp+mar); + n0m2 := n0m2--dir(co*tp)*pitcha*tp; + n0m3 := n0m3--dir(co*(tb+alfa))*pitchb*tb; + n0m4 := n0m4--dir(co*(tb+alfa))*(pitchb*tb-mar); + n0m5 := n0m5--dir(co*pitcha/pu)*(pu-fac*mar); + n0m6 := n0m6--dir(co*pitcha/pu)*pu; + n0m7 := n0m7--dir(co*pitchb/vu)*vu; + n0m8 := n0m8--dir(co*pitchb/vu)*(vu+fac*mar); + endfor; + pair flast, hlast; + flast = point pstpnum of n0m6; + hlast = point pstpnum of n0m8; + adif = angle( hlast ) - angle( flast ); + n0m5 := n0m5 rotated adif; + n0m6 := n0m6 rotated adif; + for i=1 upto 8: + n0m[i] := (reverse n0m[i]) cutafter cutter ; + endfor; + for j=1 upto numarquid: + for i=1 upto 4: + n[j]m[i] := n0m[i] rotated (j*alfa*co); +% draw n[j]m[i]; + endfor; + endfor; + for j=1 upto numhiperb: + for i=5 upto 8: + n[j]m[i] := n0m[i] rotated (j*360/numhiperb); +% draw n[j]m[i]; + endfor; + endfor; + distance = pstpnum; + actualspik = 0; + boolean intersectexists; + pair itstm; + for i=1 upto numhiperb: + itstm := n1m2 intersectiontimes n[i]m6; + intersectexists := ( itstm dotprod (-1,1) ) <> 0; + if intersectexists: + if ( (xpart itstm) < distance ): + distance := xpart itstm; + actualspik := i; + fi; + fi; + endfor; + numeric seq[]; + seq0 = actualspik; + for i=1 upto 2checkerdepth: + if (seq[i-1]-1<1): + seq[i] := numhiperb; + else: + seq[i]=seq[i-1]-1; + fi; + endfor; + path ca, cb; + ca = (reverse n1m3)--n1m2; + cb = (reverse n[seq1]m7)--n[seq1]m6; + c0 = buildcycle( cb, reverse n1m1 ); %%%%% may reverse + c1 = buildcycle( ca, n[seq0]m8 ); + for i=2 step 2 until 2checkerdepth: + if i < 2*multipl-1 : + ca := (reverse n[seq[i-2]]m6)--n[seq[i-2]]m7; + c[i] := buildcycle( ca, n2m1 ); + else: + c[i]:=buildcycle(n[seq[i-2]]m7,n2m1,reverse n[seq[i-2]]m6,reverse n0m4); + fi; + c[i+1]:=buildcycle(n[seq[i-2]]m5,n1m3,reverse n[seq[i]]m8,reverse n1m2); + endfor; + if adddepth: + depthadded = 1; + else: + depthadded = 0; + fi; + for i=1 step 2 until 2*checkerdepth+depthadded: + for j=1 upto numarquid: + fill c[i-1] rotated (j*alfa*co) withcolor 0.85*(red+green); + fill c[i] rotated (j*alfa*co) withcolor 0.7*green; + endfor; + endfor; + if not (multipl <> 5): + cb := (reverse n[seq3]m7)--n[seq3]m6; + ca := buildcycle( cb, reverse n1m1 ); %%%%% may reverse + for j=1 upto numarquid: + fill ca rotated (j*alfa*co) withcolor 0.85*(red+green); + endfor; + fi; +endfig; + +beginfig(4); + numeric pstpnum, prmax, i, j, pi, ptmax, ptstp, th, co, mar; + numeric numarquid, numhiperb, multipl, pitcha, pitchb, alfa; + path a, b, c, d, e, f, g, h; + numeric ptstb, hrmax, fac, sn, sm, rn, rm; + pi = 3.14159; + co = 180/pi; + mar = 0.16mm; + prmax = 5mm; + hrmax = 7mm; + ptmax = 1.05*pi; + pstpnum = 100; + numarquid = 5; + multipl = 1; + rn = 4; + rm = 2; + sn = 8; + sm = 6; + fac = hrmax/prmax; + alfa = 2*pi/numarquid; + pitcha = prmax/ptmax; + pitchb = prmax/(ptmax-alfa); + numhiperb = numarquid*multipl; + ptstp = ptmax/pstpnum; + ptstb = (ptmax-alfa)/pstpnum; + a = origin; + b = origin; + c = origin; + d = origin; + for i=1 upto pstpnum: + th := i*ptstp; + a := a--dir(co*th)*pitcha*th; + b := b--dir(co*th)*(pitcha*th+mar); + endfor; + for i=1 upto pstpnum: + th := i*ptstb; + c := c--dir(co*(th+alfa))*pitchb*th; + d := d--dir(co*(th+alfa))*(pitchb*th-mar); + endfor; + for i=1 upto numarquid: +% unfill buildcycle( b , reverse d ) rotated (i*alfa*co); + fill a--reverse c--cycle rotated (i*alfa*co); +% draw a rotated (i*alfa*co) withcolor red+green; +% draw b rotated (i*alfa*co) withcolor red; +% draw c rotated (i*alfa*co) withcolor green; +% draw d rotated (i*alfa*co) withcolor blue; + endfor; + numeric umin, vmin, ustp, vstp, pu, pv; + umin = prmax/20; + vmin = prmax/20; + ustp = (hrmax-umin)/pstpnum; + vstp = (hrmax-vmin)/pstpnum; + e = origin; + f = origin; + g = origin; + h = origin; + for i=1 upto pstpnum: + pu := umin+i*ustp; + e := e--dir(co*pitcha/pu)*(pu-((fac*mar)**2)); + f := f--dir(co*pitcha/pu)*pu; + vu := vmin+i*vstp; + g := g--dir(co*pitchb/vu)*(vu+sqrt(fac*mar)); + h := h--dir(co*pitchb/vu)*vu; + endfor; + pair flast, hlast; + numeric adif; + path hiperbolio, hiperbolic; + flast = point pstpnum of f; + hlast = point pstpnum of h; + adif = angle( hlast ) - angle( flast ); +% draw e withcolor red+blue; +% draw f withcolor red+blue; +% draw g rotated (-adif) withcolor green+blue; +% draw h rotated (-adif) withcolor green+blue; + hiperbolio = (subpath (rn,pstpnum) of g rotated (-adif))... + (subpath (pstpnum,rm) of e)..cycle; + hiperbolic = (subpath (sn,pstpnum) of h rotated (-adif))... + (subpath (pstpnum,sm) of f)..cycle; + for i=1 upto numhiperb: + unfill hiperbolio rotated (i*360/numhiperb); + endfor; + for i=1 upto numhiperb: + fill hiperbolic rotated (i*360/numhiperb) withcolor 0.4*red+0.2*blue; + endfor; + picture storepic; + storepic = currentpicture; + currentpicture := nullpicture; + draw storepic scaled 12; +endfig; + +beginfig(3); + numeric pstpnum, prmax, i, j, pi, ptmax, ptstp, th, co, mar; + numeric numarquid, numhiperb, multipl, pitcha, pitchb, alfa; + path a, b, c, d; + pi = 3.14159; + co = 180/pi; + mar = 0.32; + prmax = 5; + ptmax = 4*pi; + pstpnum = 100; + multipl = 3; + numarquid = 3; + alfa = 2*pi/numarquid; + pitcha = prmax/ptmax; + pitchb = prmax/(ptmax-alfa); + numhiperb = numarquid*multipl; + ptstp = ptmax/pstpnum; + a = origin; + b = origin; + c = origin; + d = origin; + for i=1 upto pstpnum: + th := i*ptstp; + a := a...dir(co*th)*pitcha*th; + b := b...dir(co*th)*(pitcha*th-mar); + c := c...dir(co*(th+alfa))*pitchb*th; + d := d...dir(co*(th+alfa))*(pitchb*th+mar); + endfor; + for i=1 upto numarquid: + drawoptions( rotated (i*alfa*co) scaled 1000 withpen pencircle scaled 0pt); + draw a; + draw b; + draw c; + draw d; + endfor; + %%%%%%%%%%%%%%%%%%%%%%%% A very nice case of knitting Bezier splines... +endfig; + +beginfig(2); + numeric u, numb, faca, numa, numc, rmin, rmax, i, j, pitch, phi; + numeric petch, startang, angstep, ampi, ampe, arcstep, paperfactor; + path b[], base, a[], alto; + numeric valmax, valmin, valstep, valhmin, valhmax; + u = 15mm; + numb = 2; % start at one + faca = 7; + numc = 9; + rmin = 0.3; + rmax = 1.5; + paperfactor = 0.25*u/rmin; + angstep = 1/30; + valstep = 0.017; + numa = numb*faca; + startang = 1/numb; + arcstep = 1/numa; + ampi = numc/faca; + ampe = ampi-startang; + pitch = (rmax-rmin)/ampi; %show pitch; + petch = (rmax-rmin)/ampe; %show petch; + valmin = 1/oper(rmax,pitch); + valmax = 1/oper(rmin,pitch); + valhmin = 1/oper(rmax,petch); + valhmax = 1/oper(rmin,petch); + for i=1 step 2 until 2*numb: + phi := 0.5*i/numb; + b[i-1] = dir(phi*360)*rmin for j=angstep step angstep until ampi: + ...dir((phi+j)*360)*(rmin+pitch*j) + endfor; + b[i] = dir((phi+startang)*360)*rmin for j=angstep step angstep until ampe: + ...dir((phi+startang+j)*360)*(rmin+petch*j) + endfor; + endfor; + base = for i=1 step 2 until 2*numb: b[i-1]...reverse b[i]-- endfor cycle; + fill base scaled paperfactor; + for i=1 step 2 until 2*numa: + phi := 0.5*(i-1)*arcstep*360; + a[i-1] = hiperspiral(valmin,phi,pitch) + for j=valmin+valstep step valstep until valmax: + ...hiperspiral(j,phi,pitch) + endfor; + draw a[i-1] scaled paperfactor withcolor red+green; + phi := 0.5*i*arcstep*360; + a[i] = hiperspiral(valhmin,phi,petch) + for j=valhmin+valstep step valstep until valhmax: + ...hiperspiral(j,phi,petch) + endfor; + draw a[i] scaled paperfactor withcolor red; + endfor; +endfig; + +beginfig(1); + numeric u, numb, faca, numa, numc, rmin, rmax, i, j, pitch, phi; + numeric petch, startang, angstep, ampi, ampe, arcstep; + path b[], base, a[], alto; + u = 15mm; + numb = 3; % start at one + faca = 3; + numc = 5; + rmin = 2u; + rmax = 10u; + angstep = 1/90; % If too big, the figure may be broken... + numa = numb*faca; + ampi = numc/faca; + pitch = (rmax-rmin)/ampi; + startang = 1/numb; + arcstep = 1/numa; + ampe = numc/faca-startang; + petch = (rmax-rmin)/ampe; + for i=1 step 2 until 2*numb: + phi := 0.5*i/numb; + b[i-1] = dir(phi*360)*rmin for j=angstep step angstep until ampi: + ...dir((phi+j)*360)*(rmin+pitch*j) + endfor; + b[i] = dir((phi+startang)*360)*rmin for j=angstep step angstep until ampe: + ...dir((phi+startang+j)*360)*(rmin+petch*j) + endfor; + endfor; + base = for i=1 step 2 until 2*numb: b[i-1]...reverse b[i]-- endfor cycle; + fill base withcolor red; + for i=1 step 2 until 2*numa: + phi := 0.5*i/numa; + a[i-1] = dir(phi*360)*rmin for j=angstep step angstep until 0.5: + ...dir(-(phi+j)*360)*(rmin+2*(rmax-rmin)*j) + endfor; + a[i] = dir((phi+arcstep)*360)*rmin + for j=angstep step angstep until 0.5-arcstep: + ...dir(-(phi+arcstep+j)*360)*(rmin+(rmax-rmin)/(0.5-arcstep)*j) + endfor; + endfor; + alto = for i=1 step 2 until 2*numa: a[i-1]...reverse a[i]-- endfor cycle; + fill alto withcolor green+blue; +endfig; + +end.
\ No newline at end of file |