xxxxxxxxxx
176
let seedPoints = [];
let delaunay;
let voronoi;
let picture;
function preload() {
picture = loadImage("dog.png");
}
function setup() {
createCanvas(412, 366);
//noLoop();
/*
for(let i = 0; i < 100; i++) {
seedPoints[i] = createVector(random(width), random(height));
}
*/
for (let i = 0; i < 10000; i++) {
let x = random(width);
let y = random(height);
let col = picture.get(x, y);
// if(brightness(col) < 80) {
// seedPoints.push(createVector(x, y));
// }
if(random(80) > brightness(col)) {
seedPoints.push(createVector(x, y));
} else {
i--;
}
}
delaunay = calculateDelaunay(seedPoints);
voronoi = delaunay.voronoi([0,0,width,height]);
}
function draw() {
if(frameCount > 200) {
noLoop();
print("done");
}
background(255);
strokeWeight(2);
stroke(0);
for (let v of seedPoints) {
point(v.x, v.y);
}
strokeWeight(1);
noFill();
/*
let {points, triangles} = delaunay;
for (let i = 0; i < delaunay.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 poly of cells) {
stroke(0);
strokeWeight(1);
noFill();
beginShape();
for(let i = 0; i < poly.length; i++) {
vertex(poly[i][0], poly[i][1]);
}
endShape();
}
*/
/*
let centroids = [];
for(let poly of cells) {
let area = 0;
let centroid = createVector(0, 0);
for(let i = 0; i < poly.length; i++) {
let v0 = poly[i];
let v1 = poly[(i+1) % poly.length];
let crossVal = v0[0] * v1[1] - v1[0] * v0[1];
area += crossVal;
centroid.x += (v0[0] + v1[0]) * crossVal;
centroid.y += (v0[1] + v1[1]) * crossVal;
}
area /= 2;
centroid.div(6 * area);
centroids.push(centroid);
}
*/
let centroids = new Array(cells.length);
let weights = new Array(cells.length).fill(0);
for(let i = 0; i < centroids.length; i++) {
centroids[i] = createVector(0,0);
}
picture.loadPixels();
let delaunayIndex = 0;
for(let i = 0; i < width; i++) {
for(let j = 0; j < height; j++) {
let index = (i + j * width) * 4;
let r = picture.pixels[index + 0];
let g = picture.pixels[index + 1];
let b = picture.pixels[index + 2];
let val = (r+g+b) / 3;
let weight = 1 - val / 255;
delaunayIndex = delaunay.find(i,j, delaunayIndex);
centroids[delaunayIndex].x += i * weight;
centroids[delaunayIndex].y += j * weight;
weights[delaunayIndex] += weight;
}
}
for(let i = 0; i < centroids.length; i++) {
if(weights[i] > 0) {
centroids[i].div(weights[i]);
} else {
centroids[i] = seedPoints[i].copy();
}
}
/*
for(let poly of cells) {
let centroid = createVector(0, 0);
for(let i = 0; i < poly.length; i++) {
centroid.x += poly[i][0];
centroid.y += poly[i][1];
}
centroid.div(poly.length);
// stroke(255, 0, 0);
// strokeWeight(4);
// point(centroid.x, centroid.y);
centroids.push(centroid);
}
*/
for(let i = 0; i < seedPoints.length; i++) {
seedPoints[i].lerp(centroids[i], 1);
}
delaunay = calculateDelaunay(seedPoints);
voronoi = delaunay.voronoi([0,0,width,height]);
}
function calculateDelaunay(points) {
let pointsArray = [];
for(let v of points) {
pointsArray.push(v.x, v.y);
}
return new d3.Delaunay(pointsArray);
}