Index: work/polybloat/bloat.sh =================================================================== --- work/polybloat/bloat.sh (revision 19439) +++ work/polybloat/bloat.sh (revision 19440) @@ -1,7 +1,8 @@ #!/bin/sh -awk -v "bloat=$1" ' +awk -v "bloat=$1" -v "target_edge=$2" ' + function draw(POLY ,n) { printf("lines") @@ -11,9 +12,86 @@ print "" } +function pwrap(POLY, n) +{ + if (n < 0) n+=POLY["len"] + else if (n >= POLY["len"]) n -= POLY["len"] + return n +} + +function edge_shift(POLY, bloat, n0 ,x0,y0,xp,yp,x1,y1,xn,yn, dx,dy,l,nx,ny ,ax,ay,al) +{ + 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"] + + # targe edge normal + dx = x1 - x0 + dy = y1 - y0 + l = sqrt(dx*dx + dy*dy) + dx /= l + dy /= l + nx = -dy + ny = dx + + # 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 +} + +function poly_bloat(POLY, bloat, n) +{ + if (target_edge == "") + for(n = 0; n < POLY["len"]; n++) + edge_shift(POLY, bloat, n) + else + edge_shift(POLY, bloat, target_edge) +} + +### loader + /^[ \t]*#/ { next } -{ +(NF == 2) { len = int(POLY["len"]) POLY["len"] = len+1 POLY[len, "x"] = $1 @@ -20,11 +98,13 @@ 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"