xxxxxxxxxx
var voronoiPoints;
var maxPoints;
var startHue;
var hueRange;
function setup() {
createCanvas(1024, 1024);
colorMode(HSB, 360);
background(0);
maxPoints = 2 + 512 * random() * random();
voronoiPoints = [];
startHue = 360 * random();
hueRange = 60 + 300 * random() * random();
// Populate Voronoi Points with xPos and yPos
for (var i = 0; i < maxPoints; i++) {
voronoiPoints.push([random(width), random(height)]);
}
}
function draw() {
for (var i = 0; i < 4096; i += 1) {
var xPos = width * random();
var yPos = height * random();
var currentDistance = 999999;
var chosenPoint = 0;
for (var j = 0; j < maxPoints; j += 1) {
// Turns out we can do this distance-finding without the square root. It's approximate, but good enough…
var newDistance = (voronoiPoints[j][0] - xPos) * (voronoiPoints[j][0] - xPos) + (voronoiPoints[j][1] - yPos) * (voronoiPoints[j][1] - yPos);
// Manhattan distance
// var newDistance = abs(voronoiPoints[j][0] - xPos) + abs(voronoiPoints[j][1] - yPos);
if (newDistance < currentDistance) {
currentDistance = newDistance;
chosenPoint = j;
}
}
push();
var granulation = 4;
xPos = granulation * ~~(xPos / granulation);
yPos = granulation * ~~(yPos / granulation);
translate(xPos, yPos);
stroke(map(chosenPoint, 0, maxPoints, startHue, startHue + hueRange) % 360, 300, 360 - 360 * random() * random());
strokeWeight(noise(xPos, yPos, frameCount * 0.1) * granulation);
var size = 0;
var newX = size * random() * random() * random();
var newY = size * random() * random() * random();
point(newX, newY);
pop();
}
}