1 |
|
|
2 |
|
prologues := 2; |
3 |
|
|
4 |
beginfig(1); |
beginfig(1); |
5 |
|
|
6 |
|
|
8 |
|
|
9 |
path ucircle; |
path ucircle; |
10 |
ucircle := fullcircle shifted (.5,.5); |
ucircle := fullcircle shifted (.5,.5); |
11 |
|
show bbox(ucircle); |
12 |
|
|
13 |
h = 250; |
h = 250; |
14 |
|
|
15 |
|
numeric coords[]x; |
16 |
|
numeric coords[]y; |
17 |
|
numeric coords[]h; |
18 |
|
|
19 |
vardef getcoord(expr s, e) = |
vardef getcoord(expr s, e) = |
20 |
save tp; |
save tp; |
21 |
save cp; |
save cp; |
28 |
xpart(urcorner(tp)) |
xpart(urcorner(tp)) |
29 |
enddef; |
enddef; |
30 |
|
|
31 |
|
ncircles = 0; |
32 |
|
|
33 |
|
nsteps = 5; |
34 |
|
|
35 |
|
vardef drawcircle(expr rad, cmi, cmc) = |
36 |
|
fill unitsquare scaled rad shifted (cmi,cmc) withcolor (uniformdeviate(1), uniformdeviate(1), uniformdeviate(1)); |
37 |
|
draw unitsquare scaled rad shifted (cmi,cmc) withpen pencircle scaled 1pt; |
38 |
|
enddef; |
39 |
|
|
40 |
vardef addcircle(expr rad) = |
vardef addcircle(expr rad) = |
41 |
save cmi, cmc; |
save cmi, cmc; |
42 |
save cur; |
save cur; |
43 |
cmi := 1000; |
save rmost; |
44 |
for i = 0 upto h / rad: |
save npie; |
45 |
cur := getcoord(i*rad, (i+1)*rad); |
numeric cmi; |
46 |
% show i,cur; |
numeric rmost[]; |
47 |
if cur < cmi: |
numeric npie; |
48 |
cmi := cur; |
npie := h / (rad/nsteps) - nsteps + 1; |
49 |
cmc := i * rad; |
for j = 0 upto npie: |
50 |
fi |
rmost[j] := 0; |
51 |
endfor; |
endfor; |
52 |
draw ucircle scaled rad shifted (cmi,cmc); |
for i = 1 upto ncircles: |
53 |
|
for j = floor(coords[i].y / (rad/nsteps) - nsteps + 1) upto floor((coords[i].y+coords[i].h) / (rad/nsteps)): |
54 |
|
% show "LOOP:",i, coords[i].x,rmost[j]; |
55 |
|
if (j >= 0) and (j <= npie): |
56 |
|
if (rmost[j] < coords[i].x): |
57 |
|
% show "SET"; |
58 |
|
rmost[j] := coords[i].x; |
59 |
|
fi; |
60 |
|
fi |
61 |
|
endfor |
62 |
|
endfor; |
63 |
|
cmi := 2000; |
64 |
|
for j = 0 upto npie: |
65 |
|
% show cmi; |
66 |
|
% show rmost[j]; |
67 |
|
if (not known cmi) or (cmi > rmost[j]): |
68 |
|
cmi := rmost[j]; |
69 |
|
cmc := j * (rad/nsteps); |
70 |
|
fi; |
71 |
|
endfor; |
72 |
|
|
73 |
|
drawcircle(rad, cmi, cmc); |
74 |
|
|
75 |
|
ncircles := ncircles +1; |
76 |
|
coords[ncircles].x := cmi + rad; |
77 |
|
coords[ncircles].y := cmc; |
78 |
|
coords[ncircles].h := rad; |
79 |
|
% show "Placed",cmi,cmc,rad; |
80 |
|
enddef; |
81 |
|
|
82 |
|
curx = 0; |
83 |
|
cury = 0; |
84 |
|
maxrad = 0; |
85 |
|
|
86 |
|
vardef addvarcircle(expr rad) = |
87 |
|
if cury + rad > h: |
88 |
|
curx := curx + maxrad; |
89 |
|
cury := 0; |
90 |
|
maxrad := 0; |
91 |
|
fi; |
92 |
|
drawcircle(rad, curx, cury); |
93 |
|
if rad > maxrad: |
94 |
|
maxrad := rad; |
95 |
|
fi; |
96 |
|
cury := cury + rad; |
97 |
enddef; |
enddef; |
98 |
|
|
99 |
for i = 1 upto 100: |
for i = 1 upto 2000: |
100 |
% draw fullcircle scaled (mrad/((i**1.01)**.5)) shifted (.02*mrad*i,100); |
% draw fullcircle scaled (mrad/((i**1.01)**.5)) shifted (.02*mrad*i,100); |
101 |
addcircle(mrad / ((i**1.01)**.5)); |
addvarcircle(mrad / ((i**1.05)**.5)); |
102 |
endfor; |
endfor; |
103 |
|
|
104 |
picture p; |
picture p; |