xxxxxxxxxx
90
// Coding Train / Daniel Shiffman
// Weighted Voronoi Stippling
// https://thecodingtrain.com/challenges/181-image-stippling
let seedPoints = [];
let velocities = [];
let delaunay;
let r = 1;
let a = 0;
function setup() {
createCanvas(500, 300);
// for (let i = 0; i < 200; i++) {
// seedPoints[i] = createVector(random(width), random(height));
// velocities[i] = p5.Vector.random2D().setMag(random(0.25, 1));
// }
}
let val = 4;
function draw() {
background(255);
//frameRate(30);
angleMode(DEGREES);
var a = frameCount * 137.5;
var r = val * sqrt(frameCount);
var x = r * cos(a) + width / 2;
var y = r * sin(a) + height / 2;
let v = createVector(x, y);
let c1 = color(248, 158, 79);
let c2 = color(252, 238, 33);
v.col = lerpColor(c1, c2, (frameCount % 60) / 60);
seedPoints.push(v);
val += 0.05;
delaunay = calculateDelaunay(seedPoints);
voronoi = delaunay.voronoi([0, 0, width, height]);
noFill();
strokeWeight(1);
let { points, triangles } = delaunay;
// for (let i = 0; i < triangles.length; i += 3) {
// let a = 2 * delaunay.triangles[i];
// let b = 2 * delaunay.triangles[i + 1];
// let c = 2 * delaunay.triangles[i + 2];
// triangle(
// points[a],
// points[a + 1],
// points[b],
// points[b + 1],
// points[c],
// points[c + 1]
// );
// }
let polygons = voronoi.cellPolygons();
let cells = Array.from(polygons);
for (let j = 0; j < cells.length; j++) {
let poly = cells[j];
strokeWeight(1);
fill(seedPoints[j].col);
beginShape();
for (let i = 0; i < poly.length; i++) {
vertex(poly[i][0], poly[i][1]);
}
endShape();
}
for (let i = 0; i < seedPoints.length; i++) {
let p = seedPoints[i];
stroke(0);
strokeWeight(4);
point(p.x, p.y);
}
}
function calculateDelaunay(points) {
let pointsArray = [];
for (let v of points) {
pointsArray.push(v.x, v.y);
}
return new d3.Delaunay(pointsArray);
}