summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp')
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/convergingspirals.mp361
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