Basic implementations of colour metaballs and meta-diamonds
April 19, 2021 ยท View on GitHub
//Reference //Coding Train: https://youtu.be/ccYLb7cLB1I //https://github.com/CodingTrain/website/tree/main/CodingChallenges/CC_028_MetaBalls/Processing/CC_028_MetaBalls //https://www.gamedev.net/articles/programming/graphics/exploring-metaballs-and-isosurfaces-in-2d-r2556/
Blob[] blobs = new Blob[20]; float min=1;
void setup() { size(720, 360); colorMode(HSB); for (int i = 0; i < blobs.length; i++) { blobs[i] = new Blob(random(width), random(height), i); } } void draw() { clear(); loadPixels(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { float hue, saturation, brightness;
float sum = 0;
for (Blob b : blobs) {
if (b.order > blobs.length/4) {
sum += b.r*b.r / ((x-b.pos.x)*(x-b.pos.x) + (y-b.pos.y)*(y-b.pos.y));//metaball
} else {
sum += b.r / (2*abs(x-b.pos.x) + 2*abs(y-b.pos.y));//Meta-Diamond
}
}
hue = constrain(sum*255, 10, 50);//blue-cyan cores constrain(sum*255, 100, 150);
saturation = constrain(sum*255, 100, 255);
if (min*2 > sum) continue;
else brightness = sum*69;
int index = x + y * width;
pixels[index] = color(hue, saturation, brightness);
}
}
updatePixels(); for (Blob b : blobs) { b.update(); //b.show(); } }
class Blob { PVector pos; float r; PVector vel; int order;
Blob(float x, float y, int number) { this.order = number; this.pos = new PVector(x, y); this.vel = PVector.random2D(); this.vel.mult(random(1, 3)); this.r = random(40, 7); }
void update() { this.pos.add(vel); if (this.pos.x > width || this.pos.x < 0) { this.vel.x *= -1; } if (this.pos.y > height || this.pos.y < 0) { this.vel.y *= -1; } }
void show() { noFill(); stroke(200); circle(this.pos.x, this.pos.y, this.r*2); } }