% fwmx beginfig(1) u := 1cm;
pair t; t = dir (60);
pair a[]; pair b[]; a0 = (xpart dir(30) * u, 0.5u); b0 = (0, -u);
numeric g[]; g0 = g3 = g4 = g5 = 0; g1 = g2 = 12; for i=1 upto 6: pair c[]; pair d[]; c0 = a[i-1]; d0 = b[i-1]; for j=1 upto 5: c[j] = c[j-1] + d[j-1]; draw c[j-1]--c[j]; d[j] = (xpart t * xpart d[j-1] - ypart t * ypart d[j-1], xpart t * ypart d[j-1] + ypart t * xpart d[j-1]); endfor;
pair e, f; e = 1/2[c0, c3]; %label.bot("No." & decimal(7-i), (xpart e, -ypart e)); f = (xpart e * 2, -ypart e * 2); label.bot("D" & decimal(i-1), (xpart f, ypart f + g[i-1])); drawarrow (0, 0)..f;
draw c3--(c3+d1); draw c4--(c4+d2); a[i] = a[i-1] + b[i-1]; b[i] = (xpart t * xpart b[i-1] + ypart t * ypart b[i-1], xpart t * ypart b[i-1] - ypart t * xpart b[i-1]); endfor; label.bot("O", (0, -3)); drawdot (0, 0) withpen pencircle scaled 3pt; endfig;
pair r[]; r0 = (xpart dir(30), 0.5); % dir 30 r2 = (0, -1); % dir 270 r1 = -(r0 + r2); % dir 150
r3 = (-xpart r1 * 2, 0); % dir 0 of two center r4 = (-xpart r1, 1.5); % dir 60 of two center r5 = r1 + (0, 1); % dir 120 of two center
vardef fwmx (expr n, z, u) = pair c[]; % center of left hex c[0] = (n-1)*r4 - (n-1) * r3 + z; for i = n upto 2n-1: pair d[]; d[0] = c[i-n]; for j = 1 upto i: pair e[]; e0 = d[j-1] - r0; e1 = e0 - r2; e2 = e1 + r0; e3 = e2 - r1;
draw u*e0--u*e1--u*e2--u*e3;
d[j] = d[j-1] + r3; endfor; draw u*(d[i-1]+r0)--u*(d[i-1]-r1); c[i-n+1] = c[i-n] - r4; endfor;
pair c[]; c0 = -r5 * (n-2) - (n-1) * r3 + z; for i = n+1 upto 2n-1: pair d[]; d[0] = c[i-n-1]; for j = 1 upto i: pair e[]; e0 = d[j-1] + r2; e1 = e0 + r0; e2 = e0 + r1; e3 = e0 + r2;
draw u*e2--u*e0--u*e1; %draw e0--e2; draw u*e0--u*e3;
d[j] = d[j-1] + r3; endfor;
c[i-n] = c[i-n-1] + r5; endfor;
pair d[]; d0 = -r5 * (n-1) - (n-1) * r3 + z; for j = 1 upto n: pair e[]; e0 = d[j-1] + r2; e1 = e0 + r0; e2 = e0 + r1; draw u*e2--u*e0--u*e1;
d[j] = d[j-1] + r3; endfor; enddef;
vardef getmaxno primary n = (n * (n - 1) * 3) enddef;
vardef liner(expr n, z, u, l) = numeric m; m := getmaxno(n);
label.bot(decimal(0), (0, 6) + z);
numeric f; f := 1; pair j; j := z; for i=1 upto m: numeric p, x, y; p := f * (f + 1) * 3; if i = 0: x := 0; y := 0; else: numeric s, d; s := (p - i) div f; d := (p - i - s * f) mod f;
if s = 0: x := f; y := d; elseif s = 1: x := f - d; y := f; elseif s = 2: x := - d; y := f - d; elseif s = 3: x := - f; y := - d; elseif s = 4: x := - f + d; y := - f; else: x := d; y := - f + d; fi; fi;
pair k; k := x * r3 + y * r5 + z; label.bot(decimal(i), k*u + (0, 6));
if l: draw u*(1/3[j, k])--u*(2/3[j, k]); fi; j := k;
if p = i: f := f + 1; fi; endfor; enddef;
beginfig(2); pair z; z = (0, 0);
numeric u; u := 0.5cm; fwmx (3, z, u);
liner (3, z, u, true); endfig;
beginfig(3); fwmx (10, (0, 0), 0.35cm); liner (10, (0, 0), 0.35cm, false); endfig;
end;
共有三个插图。 
|