#!/bin/sh awk -v "bloat=$1" -v "target_edge=$2" ' # Draw a polygon as wireframe function draw(POLY ,n) { printf("lines") for(n = 0; n < POLY["len"]; n++) printf(" %s %s", POLY[n, "x"], POLY[n, "y"]) printf(" %s %s", POLY[0, "x"], POLY[0, "y"]) print "" } # make sure n is between 0 and len function pwrap(POLY, n) { if (n < 0) n+=POLY["len"] else if (n >= POLY["len"]) n -= POLY["len"] return n } # offset-shift an edge using the neighbour edges function edge_shift(POLY, NX, NY, bloat, n0 ,x0,y0,xp,yp,x1,y1,xn,yn, dx,dy,l,nx,ny ,ax,ay,al,a1l,a1x,a1y) { x0 = POLY[n0, "x"] y0 = POLY[n0, "y"] x1 = POLY[pwrap(POLY, n0+1), "x"] y1 = POLY[pwrap(POLY, n0+1), "y"] xn = POLY[pwrap(POLY, n0+2), "x"] yn = POLY[pwrap(POLY, n0+2), "y"] xp = POLY[pwrap(POLY, n0-1), "x"] yp = POLY[pwrap(POLY, n0-1), "y"] nx = NX[n0] ny = NY[n0] # previous edge offset ax = x0 - xp ay = y0 - yp al = sqrt(ax*ax + ay*ay) ax /= al ay /= al a1l = ax*nx + ay*ny; a1x = bloat/a1l*ax a1y = bloat/a1l*ay x0 += a1x y0 += a1y # next edge offset ax = xn - x1 ay = yn - y1 al = sqrt(ax*ax + ay*ay) ax /= al ay /= al a1l = ax*nx + ay*ny; a1x = bloat/a1l*ax a1y = bloat/a1l*ay x1 += a1x y1 += a1y POLY[n0, "x"] = x0 POLY[n0, "y"] = y0 POLY[pwrap(POLY, n0+1), "x"] = x1 POLY[pwrap(POLY, n0+1), "y"] = y1 } # offset shift the target edge or all edges function poly_bloat(POLY, bloat, n,NX,NY,x0,y0,x1,y1,dx,dy,l) { for(n = 0; n < POLY["len"]; n++) { x0 = POLY[n, "x"] y0 = POLY[n, "y"] x1 = POLY[pwrap(POLY, n+1), "x"] y1 = POLY[pwrap(POLY, n+1), "y"] # targe edge normal dx = x1 - x0 dy = y1 - y0 l = sqrt(dx*dx + dy*dy) dx /= l dy /= l NX[n] = -dy NY[n] = dx } if (target_edge == "") for(n = 0; n < POLY["len"]; n++) edge_shift(POLY, NX, NY, bloat, n) else edge_shift(POLY, NX, NY, bloat, target_edge) for(n = 0; n < POLY["len"]; n++) { x0 = POLY[n, "x"] y0 = POLY[n, "y"] x1 = POLY[pwrap(POLY, n+1), "x"] y1 = POLY[pwrap(POLY, n+1), "y"] # targe edge normal dx = x1 - x0 dy = y1 - y0 l = sqrt(dx*dx + dy*dy) dx /= l dy /= l if ((NX[n] != -dy) || (NY[n] != dx)) print "Normal FLIP!" > "/dev/stderr" } } ### loader /^[ \t]*#/ { next } (NF == 2) { len = int(POLY["len"]) POLY["len"] = len+1 POLY[len, "x"] = $1 POLY[len, "y"] = $2 } ### main END { print "viewport 0 0 - 10 10" print "frame" print "color #aaaaaa" draw(POLY) poly_bloat(POLY, bloat) print "color #000000" draw(POLY) print "flush" } ' | animator