Week 3: Generative Object-Oriented Art Leo Shirky

Intro:

My sister used to love butterflies, so I decided I would try to animate a Monarch butterfly migration flight in Processing.

Process:

I started by creating a class called Butterflies, and made a simple butterfly shape, with a body and wings. I then added some code that would make the Butterflies fly along the screen at varying speeds and at random points on the X axis to give a sense of magnitude to the migration.

Finally, in order to make the animation more dynamic, I added some code that told the Butterflies to move towards the X coordinate of the mouse, so that the user had some control over the animation.

Challenges:

I really wanted the butterflies to flap their wings as they flew, but I couldn’t figure out how to make that happen. I tried to add a variable butterflyWing with two possible states, butterflyExtend and butterflyContract. I wanted the butterflies to alternate between the two randomly on every frame count. I drew the two states, but no matter what I tried, I couldn’t get the result I wanted. I also wasn’t sure how to even search for what I wanted. I ended up watching a number of Coding Train videos in hopes of finding some help, but in the end I was unsuccessful.

Final:

Code:

The Butterfly Class code:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Butterfly{
float posX, posY;
float butterflyWidth, butterflyHeight;
color butterflyColor;
float speed;
Butterfly(float _posX_, float _posY_, float _speed){
posX = _posX_;
posY = _posY_;
butterflyWidth = random(10, 20);
butterflyHeight = random(50, 100);
butterflyColor = color(252,127,3);
speed = _speed;
}
void migration(){
butterflyBody();
butterflyWing();
butterFly();
update();
}
void constructButterfly(float _posX_,float _posY_){
}
void butterFly(){
posY += speed;
if (posY > height+butterflyHeight/2) {
posY = +butterflyHeight/2;
}
}
void update(){
if (posX > mouseX){
posX --;
}
if (posX < mouseX){
posX ++;
}
}
void butterflyBody(){
fill(0);
stroke(0);
strokeWeight(1);
strokeJoin(ROUND);
ellipse(posX, posY, butterflyWidth, butterflyHeight);
}
void butterflyWing(){
fill(butterflyColor);
triangle(posX, posY, posX-butterflyHeight, posY+butterflyHeight/20, posX-butterflyHeight, posY+butterflyHeight);
triangle(posX, posY, posX+butterflyHeight, posY+butterflyHeight/20, posX+butterflyHeight, posY+butterflyHeight);
triangle(posX, posY, posX-butterflyHeight, posY-butterflyHeight/20, posX-butterflyHeight, posY-butterflyHeight);
triangle(posX, posY, posX+butterflyHeight, posY-butterflyHeight/20, posX+butterflyHeight, posY-butterflyHeight);
}
}
class Butterfly{ float posX, posY; float butterflyWidth, butterflyHeight; color butterflyColor; float speed; Butterfly(float _posX_, float _posY_, float _speed){ posX = _posX_; posY = _posY_; butterflyWidth = random(10, 20); butterflyHeight = random(50, 100); butterflyColor = color(252,127,3); speed = _speed; } void migration(){ butterflyBody(); butterflyWing(); butterFly(); update(); } void constructButterfly(float _posX_,float _posY_){ } void butterFly(){ posY += speed; if (posY > height+butterflyHeight/2) { posY = +butterflyHeight/2; } } void update(){ if (posX > mouseX){ posX --; } if (posX < mouseX){ posX ++; } } void butterflyBody(){ fill(0); stroke(0); strokeWeight(1); strokeJoin(ROUND); ellipse(posX, posY, butterflyWidth, butterflyHeight); } void butterflyWing(){ fill(butterflyColor); triangle(posX, posY, posX-butterflyHeight, posY+butterflyHeight/20, posX-butterflyHeight, posY+butterflyHeight); triangle(posX, posY, posX+butterflyHeight, posY+butterflyHeight/20, posX+butterflyHeight, posY+butterflyHeight); triangle(posX, posY, posX-butterflyHeight, posY-butterflyHeight/20, posX-butterflyHeight, posY-butterflyHeight); triangle(posX, posY, posX+butterflyHeight, posY-butterflyHeight/20, posX+butterflyHeight, posY-butterflyHeight); } }
class Butterfly{
  float posX, posY;
  float butterflyWidth, butterflyHeight;
  color butterflyColor;
  float speed;
  
  Butterfly(float _posX_, float _posY_, float _speed){
    posX = _posX_;
    posY = _posY_;
    butterflyWidth = random(10, 20);
    butterflyHeight = random(50, 100);
    butterflyColor = color(252,127,3);
    speed = _speed;
}

void migration(){
 butterflyBody();
 butterflyWing();
 butterFly();
 update();
}

void constructButterfly(float _posX_,float _posY_){
  
}

void butterFly(){
  posY += speed;
  
  if (posY > height+butterflyHeight/2) {
    posY = +butterflyHeight/2;
  }
    

}

void update(){ 
  if (posX > mouseX){
    posX --;
  }
  if (posX < mouseX){
    posX ++;
  }
}

void butterflyBody(){
  fill(0);
  stroke(0);
  strokeWeight(1);
  strokeJoin(ROUND);
  ellipse(posX, posY, butterflyWidth, butterflyHeight);
}

void butterflyWing(){
  fill(butterflyColor);
  triangle(posX, posY, posX-butterflyHeight, posY+butterflyHeight/20, posX-butterflyHeight, posY+butterflyHeight);
  triangle(posX, posY, posX+butterflyHeight, posY+butterflyHeight/20, posX+butterflyHeight, posY+butterflyHeight);
  triangle(posX, posY, posX-butterflyHeight, posY-butterflyHeight/20, posX-butterflyHeight, posY-butterflyHeight);
  triangle(posX, posY, posX+butterflyHeight, posY-butterflyHeight/20, posX+butterflyHeight, posY-butterflyHeight);

}
}

The operational code:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Butterfly[] myButterflies;
void setup(){
size(1280, 1280);
rectMode(CENTER);
myButterflies = new Butterfly[50];
for (int i=0; i<myButterflies.length; i++){
myButterflies[i] = new Butterfly(random(width), height + 100, random(5, 10));
}
}
void draw() {
background(255);
for (int i=0; i<myButterflies.length; i++){
myButterflies[i].migration();
}
}
Butterfly[] myButterflies; void setup(){ size(1280, 1280); rectMode(CENTER); myButterflies = new Butterfly[50]; for (int i=0; i<myButterflies.length; i++){ myButterflies[i] = new Butterfly(random(width), height + 100, random(5, 10)); } } void draw() { background(255); for (int i=0; i<myButterflies.length; i++){ myButterflies[i].migration(); } }
Butterfly[] myButterflies;

void setup(){
 size(1280, 1280); 
 rectMode(CENTER);
 
 myButterflies = new Butterfly[50];
 for (int i=0; i<myButterflies.length; i++){
   myButterflies[i] = new Butterfly(random(width), height + 100, random(5, 10));
 }
}

void draw() {
  background(255);
  
  for (int i=0; i<myButterflies.length; i++){
    myButterflies[i].migration();
  }
}

 

Leave a Reply