#! /usr/bin/gawk -f # Last edited on 2023-09-18 04:56:43 by stolfi BEGIN{ x1 = check_num("x1", x1); y1 = check_num("y1", y1); x2 = check_num("x2", x2); y2 = check_num("y2", y2); OUNIT = check_num("OUNIT", OUNIT); rada = check_num("rada", rada); radb = check_num("radb", radb); if (2*radb > rada) { arg_error("{radb} too big"); } printf "rada = %d radb = %d\n", rada, radb > "/dev/stderr" # Assumed glyph center # in pixels from top left: xc = int(OUNIT*(x1 + x2)/2); yc = int(OUNIT*(y1 + y2)/2); printf "crop center = (%.0f, %.0f)\n", xc, yc > "/dev/stderr" # assumed half-width and half-height in pixels: hwda = int(OUNIT*rada + 0.9999) wda = 2*hwda+1 printf "window size after first crop = %d\n", wda > "/dev/stderr" printf "-crop %dx%d+%d+%d\n", wda, wda, xc-hwda, yc-hwda printf "+repage\n" # Compute rotation angle to make the line {p1-p2} vertical: ang = atan2(x2-x1, y2-y1); # In radians. if (abs(ang) > 0.01) { printf "-distort SRT %.1f\n", ang*180/3.1416 printf "+repage\n" # Compute the expected size of the rotated window: # eps = 1.57 # hwdrot = int(hwda*(abs(cos(ang)) + abs(sin(ang))) + eps) hwdrot = hwda wdrot = 2*hwdrot+1 printf "expected window size after rotation = %d\n", wdrot > "/dev/stderr" # Issue the recrop command: hwdb = int(OUNIT*radb + 0.9999) wdb = 2*hwdb+1; printf "window size after second crop = %d\n", wdb > "/dev/stderr" trim = hwdrot - hwdb printf "-crop %dx%d+%d+%d\n", wdb, wdb, trim, trim } } function check_num(name,val) { if (val == "") { arg_error(("must define {" name "}")) } if (val !~ /^[0-9]+(|[.][0-9]+)$/) { arg_error(("invalid {" name "} = \"" val "\"")) } return val+0 } function abs(x) { return (x < 0 ? -x : x); } function arg_error(msg) { printf "** %s\n", msg > "/dev/stderr"; exit(1) }