for (let i = 0; i < size; i++) {
images[i] = loadImage("https://www.dynamicmath.xyz/collective-math-art/img/img" + i + ".png");
let mouseTouchRadius = 65;
let mouseSpringRate = 0.05;
title: 'Snowflakes collisions',
createCanvas(windowWidth, windowHeight);
gui.add(clts, 'title').name("Title:");
gui.add(clts, 'num', 0, size-1).name("No. of snowflakes").step(1);
gui.add(clts, 'grav', -0.1, 0.1).name("Gravity").step(0.001).listen();
gui.add(clts, 'damp', 0.001, 0.7).name("Damping").step(0.001).listen();
gui.add(clts, 'spr', 0.01, 0.4).name("Spring").step(0.001).listen();
gui.add(this, 'backHome').name("Info");
for (let i = 0; i < clts.num; i++) {
for (let i = 0; i < ballArray.length; i++) {
for (let j = 0; j < i; j++) {
let distance = dist(ballArray[i].x, ballArray[i].y, ballArray[j].x, ballArray[j].y);
let touchDist = ballArray[i].diameter / 2 + ballArray[j].diameter / 2;
if (distance < touchDist) {
let dx = ballArray[i].x - ballArray[j].x;
let dy = ballArray[i].y - ballArray[j].y;
let force = clts.spr * (touchDist - distance);
ballArray[i].fsumx += tfx;
ballArray[i].fsumy += tfy;
ballArray[j].fsumx -= tfx;
ballArray[j].fsumy -= tfy;
let dspeedx = ballArray[i].speedx - ballArray[j].speedx;
let dspeedy = ballArray[i].speedy - ballArray[j].speedy;
let dotProduct = dspeedx * dx + dspeedy * dy;
let damping = dotProduct * clts.damp;
ballArray[i].fsumx -= sfx;
ballArray[i].fsumy -= sfy;
ballArray[j].fsumx += sfx;
ballArray[j].fsumy += sfy;
for (let ball of ballArray) {
let difference = ballArray.length - maxBalls;
for (let i = 0; i < -difference; i++) {
} else if (difference > 0) {
for (let i = 0; i < difference; i++) {
window.location.href = "https://www.geogebra.org/m/r5cgjrpp";
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
this.x = random(windowWidth);
this.y = random(windowHeight);
this.diameter = random(30, 50);
this.resize = 1 / 2 * map(this.diameter, 6, 26, 0.055, 0.125);
let dir = random(0, 2 * PI);
this.speedx = speed * cos(dir);
this.speedy = speed * sin(dir);
this.randomImage = this.randomInteger(0, size - 1);
let distance = dist(this.x, this.y, mouseX, mouseY);
let touchDist = mouseTouchRadius;
if (distance < touchDist) {
let dx = this.x - mouseX;
let dy = this.y - mouseY;
let force = mouseSpringRate * (touchDist - distance);
if (this.x < this.diameter / 2) {
this.fsumx -= clts.spr * (this.x - this.diameter / 2);
if (this.y < this.diameter / 2) {
this.fsumy -= clts.spr * (this.y - this.diameter / 2);
if (this.x > windowWidth - this.diameter / 2) {
this.fsumx -= clts.spr * (this.x - (windowWidth - this.diameter / 2));
if (this.y > windowHeight - this.diameter / 2) {
this.fsumy -= clts.spr * (this.y - (windowHeight - this.diameter / 2));
this.fsumy -= this.speedy * 0.01;
this.speedx += this.fsumx;
this.speedy += this.fsumy;
translate(this.x, this.y);
rotate(radians(this.rotAngle));
scale(this.resize, this.resize);
image(images[this.randomImage], 0, 0);
randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;