#! /usr/bin/gawk -f # Last edited on 2012-06-29 13:07:25 by stolfilocal BEGIN { # Applies a translation and rescaling to every point in the input file # Assumes that any two consecutive numbers on the same line are X and Y of a point. USAGE = ( \ "remap-coords.gawk \\\n" \ " -v scaleA={FRAC} -v refA={NUM},{NUM} \\\n" \ " -v scaleB={FRAC} -v refB={NUM},{NUM} \\\n" \ " < {INFILE} > {OUTFILE}" \ ) if (! check_frac(scaleA, "scaleA")) { exit(1); } if (! check_pt(refA, "refA")) { exit(1); } if (! check_frac(scaleB, "scaleB")) { exit(1); } if (! check_pt(refB, "refB")) { exit(1); } scA = parse_frac(scaleA); xA = parse_pt(refA,1); yA = parse_pt(refA,2); scB = parse_frac(scaleB); xB = parse_pt(refB,1); yB = parse_pt(refB,2); next_axis = 0; # 0 if expecting X, 1 if expecting Y } //{ for (i=1; i <= NF; i++) { v = $(i); if (v ~ /^[-+]?[0-9]+([.][0-9]*)?$/) { if (next_axis == 0) { xP = v; next_axis = 1; } else { yP = v; xQ = xB + (xP - xA)/scA*scB; yQ = yB + (yP - yA)/scA*scB; printf " %6.1f %6.1f", xQ, yQ; next_axis = 0; } } else { if (next_axis > 0) { printf " %s", xP; error_message(("!! not converted: \"" xP "\"")); next_axis = 0; } printf " %s", v; } } printf "\n"; next } function check_frac(val,name) { if (val == "") { error_message(("** must define {" name "}")); return 0; } if (val !~ /^[-+]?[0-9]+([.][0-9]*)?([\/][0-9]+([.][0-9]*)?)?$/) { error_message(("** invalid fraction {" name "} = \"" val "\"")); return 0; } return 1 } function check_pt(val,name) { if (val == "") { error_message(("** must define {" name "}")); return 0; } if (val !~ /^[-+]?[0-9]+([.][0-9]*)?[ ]*[, ][ ]*[-+]?[0-9]+([.][0-9]*)?$/) { error_message(("** invalid point {" name "} = \"" val "\"")); return 0; } return 1 } function parse_frac(val, n,f) { n = split(val,f,"/"); if (n == 1) { return val+0; } else if (n == 2) { return (f[1]+0.0)/(f[2]+0.0); } else { prog_error("duh?"); } } function parse_pt(val,k, n,f) { n = split(val,f,/[, ]+/); if (n == 2) { return f[k]+0.0; } else { prog_error("duh?"); } } function prog_error(msg) { error_message(("** " msg)); exit(1); } function error_message(msg) { if (FNR > 0) { printf "%s:%s: ", FILENAME, FNR > "/dev/stderr"; } printf "%s\n", msg > "/dev/stderr" if (FNR > 0) { printf " «%s»\n", $0 > "/dev/stderr"; } }