#! /usr/bin/gawk -f # Last edited on 2012-08-02 19:56:05 by stolfilocal # Finds best base image size for pyramid. BEGIN { if (nx == "") { arg_error(("must define {nx}")); } if (ny == "") { arg_error(("must define {ny}")); } # Best combination found so far: kbest = 0; fbest = 0; sxbest = 0; sybest = 0; for (x = 1; x <= 10; x++) { for (y = 1; y <= 10; y++) { if (((x % 2) != 0) || ((y % 2) != 0)) { # The smallest image size is {sx,sy}: sx = 5*x; sy = 5*y; if ((sx <= nx) && (sy <= ny)) { # Find base image size {bx,by} bx = sx; by = sy; k = 1; while (1) { tx = 7*bx/5; ty = 7*by/5; if ((tx > nx) || (ty > ny)) { break; } bx = tx; by = ty; k++; tx = 10*bx/7; ty = 10*by/7; if ((tx > nx) || (ty > ny)) { break; } bx = tx; by = ty; k++; } fx = bx/nx; fy = by/ny; f = fx*fy; if ((k > kbest) || ((k == kbest) && (f > fbest))) { sxbest = sx; sybest = sy; kbest = k; fbest = f; } printf "%3d %3d %3d %6d %6d %8.6f %8.6f %8.6f\n", sx,sy,k,bx,by,fx,fy,f; } } } } printf "best:\n"; printf "%3d %3d %3d %8.6f\n", sxbest,sybest,kbest,fbest; } function arg_error(msg) { printf "** %s\n", msg > "/dev/stderr"; exit(1); }