#! /n/gnu/bin/gawk -f # Last edited on 1999-08-10 17:26:50 by hcgl # Builds a circle with a sinusoidal oscillation BEGIN { usage = ( ARGV[0] " -v frq=FREQ" ); twopi = 6.2831853071795864; # Oscillation frequency (number of waves over whole curve) if ( frq == "" ) { error("must define \"frq\""); } # Number of samples: npt = 2000 + 20*frq; # Mean radius: radius = 100; # Max relative amplitude of oscillations: max_ramp = 0.32; min_ramp = 0.08; # Curve length, with and without the oscillation: Lfil = twopi*radius; Lraw = 0; # Output sampling step step = 0.5; # Quantization unit unit = 0.01; printf "begin PZLR3Chain.T (format of 97-10-29)\n" printf "| gear.create:\n" printf "| frequency = %d\n", frq; printf "| relative amplitude: minimum = %.3f maximum = %.3f\n", min_ramp, max_ramp; printf "| radius = %.2f\n", radius; printf "unit = %f\n", unit trace_start(step, unit); for (i=0;i<=npt;i++) { theta = twopi*i/npt; phi = frq*theta; ramp = (max_ramp + min_ramp)/2 + (max_ramp - min_ramp)/2*cos(theta); rfac = (1 + ramp*cos(phi)) eps = 0.25/frq*(1-cos(phi))*(1-cos(phi))*sin(phi); r = radius*rfac; x = r*cos(theta - eps); y = r*sin(theta - eps); if (i < npt) { trace_to(x,y); } if (i > 0) { sx = x - xa; sy = y - ya; s = sqrt(sx*sx + sy*sy); Lraw += s; } xa = x; ya = y; } trace_stop(); printf "end PZLR3Chain.T\n" # Actual oscillation wavelength: braw = Lraw/frq; bfil = Lfil/frq; printf " curve length: raw = %.2f filtered = %.2f\n", Lraw, Lfil > "/dev/stderr"; printf " mean wavelength: raw = %.2f filtered = %.2f\n", braw, bfil > "/dev/stderr"; exit 0 } function error(msg) { printf "! %s !\n", msg > "/dev/stderr"; exit(1); }