MetaPost 之蜂窝

来源:互联网 发布:数据堂兼职团队 编辑:程序博客网 时间:2024/04/27 21:24
% 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;

共有三个插图。
蜂窝加方向

蜂窝的线性表示
大型蜂窝

原创粉丝点击