Files
util.nix/package/voronoi/voronoi.awk

50 lines
1.1 KiB
Awk

function clamp(v){ return v<0?0:(v>1?1:v) }
function color_lerp(p, q, r1, g1, b1, r2, g2, b3, x){
t = (x - p) / (q - p)
t = clamp(t)
r = int(r1 + t*(r2 - r1) + 0.5)
g = int(g1 + t*(g2 - g1) + 0.5)
b = int(b1 + t*(b2 - b1) + 0.5)
return sprintf("#%02X%02X%02X", r, g, b)
}
BEGIN {
# external variables
# PTS is voronoi centers
# W is canvas width
# H is canvas height
# FADE is fade max distance
# C1 is first color in gradient
# C2 is secont color in gradient
if (C1 == "") C1 = "0,0,0"
if (C2 == "") C2 = "255,255,255"
split(C1, c1, ",")
split(C2, c2, ",")
n = split(PTS, pairs, " ")
for (i = 1; i <= n; ++i) {
split(pairs[i], xy, ",")
px[i] = xy[1] + 0
py[i] = xy[2] + 0
}
for (y = 0; y < H; y++)
for (x = 0; x < W; x++) {
min_d = 1e308
for (i = 1; i <= n; i++) {
dx = x - px[i]
dy = y - py[i]
d = sqrt(dx*dx + dy*dy)
if (d < min_d)
min_d = d
}
fade = FADE - min_d
if (fade < 0) fade = 0
color = color_lerp(0, FADE, c1[1],c1[2],c1[3], c2[1],c2[2],c2[3], fade)
printf "fill %s point %d,%d\n", color, x, y
}
}