xxxxxxxxxx
105
var mass = [], positionX = [], positionY = [], velocityX = [], velocityY = [], shapeType = [];
function setup() {
createCanvas(windowWidth, windowHeight);
noStroke();
fill(255, 64, 64, 192);
blendMode(SCREEN);
}
function draw() {
background(0, 25);
for (var particleA = 0; particleA < mass.length; particleA++) {
var accelerationX = 0, accelerationY = 0;
for (var particleB = 0; particleB < mass.length; particleB++) {
if (particleA != particleB) {
var distanceX = positionX[particleB] - positionX[particleA];
var distanceY = positionY[particleB] - positionY[particleA];
var distance = sqrt(distanceX * distanceX + distanceY * distanceY);
if (distance < 5) distance = 5;
var force = (distance - 320) * mass[particleB] / distance;
if (keyIsPressed) force *= -1;
accelerationX += force * distanceX;
accelerationY += force * distanceY;
}
}
velocityX[particleA] *= 0.99;
velocityY[particleA] *= 0.99;
velocityX[particleA] += accelerationX * mass[particleA];
velocityY[particleA] += accelerationY * mass[particleA];
}
for (var particle = 0; particle < mass.length; particle++) {
positionX[particle] += velocityX[particle];
positionY[particle] += velocityY[particle];
if (positionX[particle] < 0 || positionX[particle] > width) velocityX[particle] *= -1;
if (positionY[particle] < 0 || positionY[particle] > height) velocityY[particle] *= -1;
mass[particle] *= 0.9995;
if (mass[particle] < 0.002) mass[particle] = 0.002;
var proximityThreshold = 50;
var alphaValue = 255;
for (var otherParticle = 0; otherParticle < mass.length; otherParticle++) {
if (particle !== otherParticle) {
var distance = dist(positionX[particle], positionY[particle], positionX[otherParticle], positionY[otherParticle]);
if (distance < proximityThreshold) {
alphaValue = 128;
mass[particle] *= 0.98;
}
}
}
fill(255, 64, 64, map(abs(velocityX[particle] + velocityY[particle]), 0, 5, 128, alphaValue));
drawParticle(positionX[particle], positionY[particle], mass[particle] * 1000, shapeType[particle]);
}
}
function addNewParticle() {
mass.push(random(0.003, 0.03));
positionX.push(mouseX);
positionY.push(mouseY);
velocityX.push(0);
velocityY.push(0);
shapeType.push(floor(random(3)));
}
function drawParticle(x, y, size, type) {
push();
translate(x, y);
if (type === 0) {
ellipse(0, 0, size, size);
} else if (type === 1) {
rectMode(CENTER);
rect(0, 0, size, size);
} else if (type === 2) {
beginShape();
for (let i = 0; i < 5; i++) {
let angle = TWO_PI * i / 5;
let sx = cos(angle) * size * 0.5;
let sy = sin(angle) * size * 0.5;
vertex(sx, sy);
}
endShape(CLOSE);
}
pop();
}
function mouseClicked() {
addNewParticle();
}
function mouseDragged() {
addNewParticle();
}