My goal was to use p5.js to build a dynamic visualisation of Simple Harmonic Motion (SHM), inspired by Memo Akten. Vibrant circles oscillate vertically in the sketch, adding to its visual attractiveness with a trace effect. The intention was to play with colour and motion while capturing the essence of oscillation’s beauty.
//Assignment 4 - SP
let numCircles = 15;
let circles = [];
let amplitude = 50; // maximum displacement
let frequency = 0.08; // speed of the motion
function setup() {
createCanvas(400, 400);
background(0); //
for (let i = 0; i < numCircles; i++) {
circles.push({
x: width / 2 + (i - numCircles / 2) * 30,
angle: random(TWO_PI),
color: color(random(255), random(255), random(255)),
});
}
}
function draw() {
fill(0, 20); // semi-transparent black
rect(0, 0, width, height);
for (let circle of circles) {
// calculate y position using sine function
let y = height / 2 + amplitude * sin(circle.angle);
fill(circle.color);
noStroke();
ellipse(circle.x, y, 30, 30);
// increment the angle to create motion
circle.angle += frequency;
}
}
Highlighted Code:
One part I’m particularly proud of is the fading background, which enhances the trace effect. The use of fill(0, 50) allows for gradual fading and creates a more immersive experience as the circles move.
Reflection:
This project taught me a lot about using p5.js for visualizations. I encountered challenges with managing the transparency and ensuring the circles maintained their vibrancy against the fading background.
For future iterations, I’d like to:
- Experiment with varying the amplitude and frequency based on user input.
- Add interactivity, such as changing colors or shapes when the mouse hovers over the circles.
- Explore other wave patterns beyond simple harmonic motion.