ref: f5f4fb16ed24308c78ba1fdc5e84cbcaba53c51c
dir: /marching-squares/
#!/bin/slug -- Implementation of the marching squares algorithm -- see https://en.wikipedia.org/wiki/Marching_squares ROWS = 100 COLS = 100 mt = {} function b(a, b, c, d) return a*8 + b*4 + c*2 + d end function setup() size(1000, 1000) background(235) stroke(0) strokeWeight(1) for y = 1, ROWS+1 do mt[y] = {} for x = 1, COLS+1 do v = 0 if math.random() >= 0.5 then v = 1 end mt[y][x] = v end end cx = width / ROWS cy = height / COLS for y = 0, ROWS-1 do for x = 0, COLS-1 do n = b(mt[y+1][x+1], mt[y+1][x+2], mt[y+2][x+2], mt[y+2][x+1]) if n == 1 then line(x*cx, (y+0.5)*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 2 then line((x+1)*cx, (y+0.5)*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 3 then line(x*cx, (y+0.5)*cy, (x+1)*cx, (y+0.5)*cy) elseif n == 4 then line((x+0.5)*cx, (y+0)*cy, (x+1)*cx, (y+0.5)*cy) elseif n == 5 then line((x)*cx, (y+0.5)*cy, (x+0.5)*cx, (y)*cy) line((x+0.5)*cx, (y+1)*cy, (x+1)*cx, (y+0.5)*cy) elseif n == 6 then line((x+0.5)*cx, y*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 7 then line(x*cx, (y+0.5)*cy, (x+0.5)*cx, y*cy) elseif n == 8 then line(x*cx, (y+0.5)*cy, (x+0.5)*cx, y*cy) elseif n == 9 then line((x+0.5)*cx, y*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 10 then line((x+0.5)*cx, (y+0)*cy, (x+1)*cx, (y+0.5)*cy) line(x*cx, (y+0.5)*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 11 then line((x+0.5)*cx, (y+0)*cy, (x+1)*cx, (y+0.5)*cy) elseif n == 12 then line(x*cx, (y+0.5)*cy, (x+1)*cx, (y+0.5)*cy) elseif n == 13 then line((x+1)*cx, (y+0.5)*cy, (x+0.5)*cx, (y+1)*cy) elseif n == 14 then line(x*cx, (y+0.5)*cy, (x+0.5)*cx, (y+1)*cy) end end end end function draw() noLoop() end