19static void squarify(
size_t n,
double *area,
rectangle *recs,
size_t nadded,
double maxarea,
double minarea,
double totalarea,
30 double w = fmin(fillrec.
size[0], fillrec.
size[1]);
35 fprintf(stderr,
"trying to add to rect {%f +/- %f, %f +/- %f}\n",fillrec.
x[0], fillrec.
size[0], fillrec.
x[1], fillrec.
size[1]);
36 fprintf(stderr,
"total added so far = %" PRISIZE_T "\n", nadded);
41 maxarea = minarea = area[0];
42 asp = fmax(area[0] / (w * w), w * w / area[0]);
44 squarify(n, area, recs, nadded, maxarea, minarea, totalarea, asp, fillrec);
46 double newmaxarea, newminarea,
s, h, maxw, minw, newasp = 0, hh, ww, xx, yy;
48 newmaxarea = fmax(maxarea, area[nadded]);
49 newminarea = fmin(minarea, area[nadded]);
50 s = totalarea + area[nadded];
54 newasp = fmax(h / minw, maxw / h);
56 if (nadded < n && newasp <= asp){
57 squarify(n, area, recs, ++nadded, newmaxarea, newminarea,
s, newasp, fillrec);
61 " items, total area = %f, w = %f, area/w=%f\n",
62 nadded, totalarea, w, totalarea/w);
63 if (fillrec.
size[0] <= fillrec.
size[1]) {
66 xx = fillrec.
x[0] - fillrec.
size[0]/2;
67 for (
size_t i = 0; i < nadded; i++){
71 recs[i].
x[1] = fillrec.
x[1] + 0.5*(fillrec.
size[1]) - hh/2;
72 recs[i].
x[0] = xx + ww/2;
76 fillrec.
size[1] -= hh;
79 yy = fillrec.
x[1] + fillrec.
size[1]/2;
80 for (
size_t i = 0; i < nadded; i++){
84 recs[i].
x[0] = fillrec.
x[0] - 0.5*(fillrec.
size[0]) + ww/2;
85 recs[i].
x[1] = yy - hh/2;
89 fillrec.
size[0] -= ww;
91 squarify(n - nadded, area + nadded, recs + nadded, 0, 0., 0., 0., 1., fillrec);
106 double total = 0, minarea = 1., maxarea = 0., asp = 1, totalarea = 0;
108 for (
size_t i = 0; i < n; i++) total += area[i];
110 if (total > fillrec.
size[0] * fillrec.
size[1] + 0.001)
114 squarify(n, area, recs, 0, maxarea, minarea, totalarea, asp, fillrec);
static void squarify(size_t n, double *area, rectangle *recs, size_t nadded, double maxarea, double minarea, double totalarea, double asp, rectangle fillrec)