Description
Create a generative artwork using Object-Oriented Programming paying attention to the structure, clarity, and organization of your program.
Process
Saying goodbye to hardcoding was hard. How do I create a pleasing and satisfying to-watch art with little code? After hours of thinking, it finally clicked. Why not recreate the natural phenomena of the ripple effect. Throw a little stone into water and it creates a mighty ripple. Yeah that’s the inspiration
I started off by exploring how I can play with ellipses to form the shapes of the ripple effect. As I was working on this piece deep in the night, I kept on repeating the ” final countdown ” tune so I decided to create my whole art in a form of a play or an exhibition.
The Intro!
The introduction of my exhibition starts with a count down. The countdown is actually a count up 🙂 which is centered in the middle of the screen. I then added the ripple effect. I added some colors to appeal to the eye
The Interlude!
Now we can kill some time by watching balls bouncing off walls and changing colors. Used some opacity to achieve a lightsaber effect.
The Playback!
In the playback, I created two spheres that clash with each other and disappear off the screen. Then, I removed the stroke and played with random colors. The outcome was unexpected 🙂 Yeah, it was fun.
The Exhibition!
I combined the intro to the interlude and the playback with a few tweaks. Yeah, and a little suspense, :).
Final Work
Challenges
The first challenge I faced was bouncing the ball off the walls. For some reason, my method was not working after putting my function into a class. I tried multiple times to let a function inside a class run continuously but couldn’t get it to work. I spent hours learning how to make functions within classes run more than one time. Oh no! All this while, I’ve been thinking too hard, I just needed to add an if statement to my method.
Also, I was having trouble tweaking the randomness. Striking a balance between control over the elements and randomness was hard. I did a lot of trial and error in the beginning to find the optimal, the just-right level of randomness
Finally, Ripple! one big thing I learned from this assignment is to let go, I stopped controlling the background colors, and boom! there goes this mesmerizing art.
Code
– Main
Ripple genArt;
void setup() {
size(640, 640);
genArt = new Ripple( width/2, height/2);
}
void draw() {
genArt.exhibit();
}
– Ripple Class
class Ripple {
// data
int x, x2, x3, y, y1, y2;
int Width = width;
int centerX, centerY;
float circleWidth;
int countUp;
int counter;
int speed;
// constructor
Ripple(int _x, int _y) {
centerX = _x;
centerY = _y;
circleWidth = 500;
countUp = 0;
// bouncing balls coordinates and speed
x = _x;
y = _y;
y1 = 80;
y2 = 400;
speed = 3;
// clashing balls coordinates
x2 = 640;
x3 = 0;
// exhibition counter
counter = 0;
}
void intro() {
// countdown
fill(random(255), random(255), random(255), 10);
textAlign(CENTER, CENTER);
textSize(32);
text( countUp +=1, centerX, centerY-5);
// ellipses as rainbow ripple effect
noFill();
stroke(random(255), random(255), random(255), 90);
ellipse(x, y, circleWidth, circleWidth);
circleWidth += 20;
// repeat ellipses with random colours
if (circleWidth > 1000) {
// clear background and start over
background(255);
circleWidth = frameCount*1.5;
}
}
void interlude() {
// background(60);
ellipse(x, y, circleWidth, circleWidth);
ellipse(x, y1, circleWidth, circleWidth);
ellipse(x, y2, circleWidth, circleWidth);
x += speed;
y1 += speed;
y2 += speed;
// ball bounces off wall
if (x + circleWidth/2> Width || x - circleWidth/2<0) {
speed *= -1;
//fill(random(255), 50);
stroke(random(230), random(230), random( 250));
}
}
void playback() {
noStroke();
//background(0);
ellipse(x2, y, circleWidth, circleWidth);
ellipse(x3, y, circleWidth, circleWidth);
// expand the clashing balls as they approach each other
if (x2<=640) {
x2 = x2 -10;
x3 = x3 + 10;
circleWidth += 5;
}
// reset the cordinates of the clashing balls
if (circleWidth > 1000) {
circleWidth = 10;
x2 = 640;
x3 = 0;
fill(random(250), random(250), random( 250), 50);
}
}
// control exhibition
void exhibit() {
counter +=1;
// play intro
if ( counter < 1000) {
intro();
// go blank when timer is out
if (counter > 650) {
background(0);
}
}
// play interlude and playback together
else if ( counter < 2000) {
interlude();
playback();
} else {
background(255);
counter = 600;
}
}
void reset() {
circleWidth = 100;
y = centerY;
}
}
References
- https://commons.wikimedia.org/wiki/File:Ripple_effect_on_water.jpg






