diff --git a/package/voronoi/README.md b/package/voronoi/README.md new file mode 100644 index 0000000..ed129b7 --- /dev/null +++ b/package/voronoi/README.md @@ -0,0 +1,4 @@ +```sh +sh voronoi.sh 500 500 65 "$(sh ./gen-voronoi-points.sh 400 0 0 500 0 0 500)" 0,0,255 255,0,0 \ +| magick -size 200x200 xc:white -draw @- voronoi.png +``` diff --git a/package/voronoi/gen-voronoi-points.sh b/package/voronoi/gen-voronoi-points.sh new file mode 100644 index 0000000..dcf8ebf --- /dev/null +++ b/package/voronoi/gen-voronoi-points.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# posix: uniform points in a 2D parallelogram for Voronoi seeds +# usage: ./gen N x0 y0 ax ay bx by +# generates N points p = (x0,y0) + u*(ax,ay) + v*(bx,by), with u,v ~ U[0,1) + +[ "$#" -eq 7 ] || { echo "usage: $0 N x0 y0 ax ay bx by" >&2; exit 1; } + +awk -v n="$1" -v x0="$2" -v y0="$3" -v ax="$4" -v ay="$5" -v bx="$6" -v by="$7" ' +BEGIN{ + srand(); + for(i=0;i1?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 + } +} diff --git a/package/voronoi/voronoi.frag b/package/voronoi/voronoi.frag new file mode 100644 index 0000000..6b16e76 --- /dev/null +++ b/package/voronoi/voronoi.frag @@ -0,0 +1,49 @@ +#define PTS_N 500 +#define + +// Author @patriciogv - 2015 +// http://patriciogonzalezvivo.com + +#ifdef GL_ES +precision mediump float; +#endif + +uniform vec2 u_resolution; +uniform vec2 u_mouse; +uniform float u_time; + +float random (vec2 st) { + return fract(sin(dot(st.xy, vec2(12.9898,78.233)))*43758.5453123); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 st = gl_FragCoord.xy/u_resolution.xy; + + float rnd = random( st ); + + for(i=0;i&2 + exit 1 +fi + +W=$1 +H=$2 +FADE=$3 +PTS=$4 +C1=$5 +C2=$6 + +awk \ + -v W="$W" \ + -v H="$H" \ + -v PTS="$PTS" \ + -v FADE="$FADE" \ + -v C1="$C1" \ + -v C2="$C2" \ + -f ./voronoi.awk