#! /usr/bin/gawk -f # Usage: radial-squeeze [ -v x=COL ] [ -v y=COL ] [ -v noise VALUE ] < FILE # # Performs a radial logarithmic contraction of the plane # Reads FILE with two numbers x, y per line. # The fields numbers of x and y can be given as shown; defaults are 1 and 2. # If "-v noise" is given, perturbs them with random noise of that amplitude. # Outputs two numbers a*x, a*y per line # where a is log(r^2+1)/2r BEGIN { if (x == "") x = 1; if (y == "") y = 2; if (noise == "") noise = 0; } /^#/ { print; next; } /./ { vx = $(x) + noise*(2*rand() - 1); vy = $(y) + noise*(2*rand() - 1); r = sqrt(vx*vx + vy*vy); s = log(r*r + 1)/2; if (r == 0) { print 0, 0; } else { print (vx/r)*s, (vy/r)*s; } next; } /^$/ { next; }