#! /usr/bin/gawk -f # Last edited on 2012-02-19 02:00:24 by stolfilocal BEGIN { if (side == "") { side = 0; } # Page dimensions in millimeters: page_szX = 148; page_szY = 210; # Worktray dimensions in mm mrg = 5; # Margin width. xmin = 0 + mrg; # Min worktray X. xmax = page_szX - mrg; # Max worktray X. ymin = 0 + mrg; # Min worktray Y. ymax = page_szY - mrg; # Max worktray Y. # Inset and label parameters: text_margin = 1; # Extra margin for text inset. face_margin = 3.5; # Extra margin for face inset. # Portrait oval in mm face_nX = 305; # Image X size in pixels. face_nY = 427; # Image Y size in pixels. face_scale = 0.100; # Scaling factor for portrait. face_ctX = page_szX/2; # Center X. face_ctY = 140; # Center Y. # Title/author area name_nX = 1000; # Image X size in pixels. name_nY = 240; # Image Y size in pixels. name_scale = 0.075; # Image scaling factor. name_ctX = page_szX/2; # Center X in mm. name_ctY = 64; # Center Y in mm. # Year area year_nX = 320; # Image X size in pixels. year_nY = 150; # Image Y size in pixels. year_scale = 0.0500; # Image scaling factor. year_ctX = page_szX/2; # Center X in mm. year_ctY = 36; # Center Y in mm. # Copyleft area copy_nX = 440; # Image X size in pixels. copy_nY = 180; # Image Y size in pixels. copy_scale = 0.0900; # Image scaling factor. copy_ctX = page_szX/2; # Center X in mm. copy_ctY = 36; # Center Y in mm. # Pill dimensions in mm: rmin = 0.45; # Min radius. rmax = 0.90; # Max radius. rmed = (rmin + rmax)/2; reps = -0.075; # Radius adjustment. split("", ctx); # Indexed with {i} in {0..nb-1}, center X of ball{i}. split("", cty); # Indexed with {i} in {0..nb-1}, center Y of ball{i}. split("", rad); # Indexed with {i} in {0..nb-1}, radius of ball{i}. nb = 0; # Number of balls. printf "placing centers " > "/dev/stderr"; # Lay down pills at jittered positions: xstep = 2*rmed ystep = xstep*sqrt(3)/2; rjit = rmed - rmin; y = ymin + rmed; dx = 0; while (y <= ymax - rmed) { printf "." > "/dev/stderr"; x = xmin + rmed + dx; while (x < xmax - rmed) { do { xjit = (2*rand()-1)*rjit; yjit = (2*rand()-1)*rjit; } while (xjit*xjit + yjit*yjit > rjit*rjit); # Save pill: ctx[nb] = x + xjit; cty[nb] = y + yjit; rad[nb] = rmin; # For now. nb++; x = x + xstep; } dx = (xstep/2) - dx; y = y + ystep; } printf "\n" > "/dev/stderr"; printf "sorting... \n" > "/dev/stderr"; ysort(nb, ctx, cty, rad); # Sweep over array adjusting centers and radii: printf "adjusting radii... \n" > "/dev/stderr"; ilo = 0; for (i = 0; i < nb; i ++) { xi = ctx[i]; yi = cty[i]; # Adjust search bounds: while ((ilo < i) && (cty[ilo] < yi - 2*rmax)){ ilo++; } while ((ihi < nb) && (cty[ihi] <= yi + 2*rmax)){ ihi++; } # Find the maximum viable radius for pill {i}: ri = 999999; if (xi - xmin < ri) { ri = xi - xmin; } if (xmax - xi < ri) { ri = xmax - xi; } if (yi - ymin < ri) { ri = yi - ymin; } if (ymax - yi < ri) { ri = ymax - yi; } for (j = ilo; j < ihi; j++) { if (j != i) { xj = ctx[j]; yj = cty[j]; rj = rad[j]; dij = sqrt((xi - xj)*(xi - xj) + (yi - yj)*(yi - yj)); if ((rj > 0) && (dij - rj < ri)) { ri = dij - rj; } } } # Adjust radius a bit ri = ri + reps; # Cannot fit pill, eliminate it y setting its radius to {-1}: if (ri < rmin) { ri = -1; } # Save radius: rad[i] = ri; } # Output pills: printf "// Created by make_cover_boss.gawk, do not edit\n"; printf "\n"; printf "#declare page_szX = %.2f;\n", page_szX; printf "#declare page_szY = %.2f;\n", page_szY; printf "\n"; if (side == 0) { # Parameters of portrait, name and year areas: print_area_dims("face", face_nX, face_nY, face_scale, face_margin, face_ctX, face_ctY); print_area_dims("name", name_nX, name_nY, name_scale, text_margin, name_ctX, name_ctY); print_area_dims("year", year_nX, year_nY, year_scale, text_margin, year_ctX, year_ctY); } else { # Parameters of copyleft area: printf "\n"; print_area_dims("copy", copy_nX, copy_nY, copy_scale, text_margin, copy_ctX, copy_ctY); } printf "\n"; printf "#declare cover_boss_xmin = %.2f;\n", xmin; printf "#declare cover_boss_xmax = %.2f;\n", xmax; printf "#declare cover_boss_ymin = %.2f;\n", ymin; printf "#declare cover_boss_ymax = %.2f;\n", ymax; printf "\n"; printf "#declare cover_boss =\n union{\n"; for (i = 0; i < nb; i ++) { xi = ctx[i]; yi = cty[i]; ri = rad[i]; ok = 1; # True to include pill. if (ri < 0) { ok = 0; } if (side == 0) { # Exclude pills that intersect face, name, and year areas: if (inside_oval(xi, yi, ri, face_nX, face_nY, face_scale, face_margin, face_ctX, face_ctY)) { ok = 0; } if (inside_rect(xi, yi, ri, name_nX, name_nY, name_scale, text_margin, name_ctX, name_ctY)) { ok = 0; } if (inside_rect(xi, yi, ri, year_nX, year_nY, year_scale, text_margin, year_ctX, year_ctY)) { ok = 0; } } else { # Exclude pills that intersect copyleft area: if (inside_rect(xi, yi, ri, copy_nX, copy_nY, copy_scale, text_margin, copy_ctX, copy_ctY)) { ok = 0; } } if (ok) { printf " pill(%.2f,%.2f,%.2f)\n", xi, yi, ri; } } printf " }\n"; } function inside_oval(xi,yi,ri,nX,nY,scale,mrg,ctX,ctY, szX,szY,delx,dely) { szX = nX*scale + 2*mrg; szY = nY*scale + 2*mrg; delx = (xi - ctX)/(szX/2+ri); dely = (yi - ctY)/(szY/2+ri); return (delx*delx + dely*dely < 1); } function inside_rect(xi,yi,ri,nX,nY,scale,mrg,ctX,ctY, szX,szY,xmin,xmax,ymin,ymax) { szX = nX*scale + 2*mrg; szY = nY*scale + 2*mrg; xmin = ctX - szX/2 - ri; xmax = ctX + szX/2 + ri; ymin = ctY - szY/2 - ri; ymax = ctY + szY/2 + ri; return ((xi > xmin) && (xi < xmax) && (yi > ymin) && (yi < ymax)) } function print_area_dims(name,nX,nY,scale,mrg,ctX,ctY, szX,szY,delx,dely) { img_szX = nX*scale; img_szY = nY*scale; inset_szX = img_szX + 2*mrg; inset_szY = img_szY + 2*mrg; printf "#declare cover_%s_ctX = %.2f;\n", name, ctX; printf "#declare cover_%s_ctY = %.2f;\n", name, ctY; printf "#declare cover_%s_img_szX = %.2f;\n", name, img_szX; printf "#declare cover_%s_img_szY = %.2f;\n", name, img_szY; printf "#declare cover_%s_inset_szX = %.2f;\n", name, inset_szX; printf "#declare cover_%s_inset_szY = %.2f;\n", name, inset_szY; } function ysort(nb,ctx,cty,rad, i,j,xi,yi,ri) { for (i = i; i < nb; i++) { xi = ctx[i]; yi = cty[i]; ri = rad[i]; j = i; while ((j > 0) && (yi < cty[j-1])) { ctx[j] = ctx[j-1]; cty[j] = cty[j-1]; rad[j] = rad[j-1]; j--; } if (i != j) { ctx[j] = xi; cty[j] = yi; rad[j] = ri; } } }