# Go Jump off a Bridge

In Nature of Code, we learned how to simulate forces acting on objects. After playing with some examples with drag forces in liquids and air, I used these principles to make a program inspired by some photographs I took during a trip to Portugal in 2010. There was a bridge in the city of Porto that the local kids liked to jump off into the river below. I have some great photos of the kids suspended in mid-jump. I used these photos to make the divers in my Processing sketch.

Here is the code for the main sketch:

```[code lang="java"]//Kim Ash
//Divers experience drag and other forces as they fall into the sea.

Liquid liquid;
Mover diver1;
Mover diver2;

void setup()
{
size(800, 600);
background(171, 241, 250);
liquid = new Liquid(0, 350, width, 250, 0.4);

diver1 = new Mover(4, 250, 0);
diver2 = new Mover(5, 500, 0);
}

void draw()
{
background(171, 241, 250);

PVector wind = new PVector(-0.004,0);
PVector gravity = new PVector(0,0.2);

liquid.render();

if (liquid.contains(diver1)) {
PVector drag = liquid.drag(diver1);
diver1.applyForce(drag);
}

diver1.applyForce(wind);
diver1.applyForce(gravity);

diver1.update();
diver1.display1();
diver1.checkEdges();

if (liquid.contains(diver2)) {
PVector drag = liquid.drag(diver2);
diver2.applyForce(drag);
}

diver2.applyForce(wind);
diver2.applyForce(gravity);

diver2.update();
diver2.display2();
diver2.checkEdges();
}[/code]```

This is the code for the diver object:

```[code lang="java"]PImage jumper1;
PImage jumper2;

class Mover {

PVector location;
PVector velocity;
PVector acceleration;
float mass;

Mover(float m, float x , float y) {
mass = m;
location = new PVector(x,y);
velocity = new PVector(0,0);
acceleration = new PVector(0,0);
}

void applyForce(PVector force) {
PVector f = PVector.div(force,mass);
}

void update() {
acceleration.mult(0);
}

void display1() {
image(jumper1, location.x, location.y);
}

void display2() {
image(jumper2, location.x, location.y);
}

void checkEdges() {

if (location.x > width) {
location.x = 0;
} else if (location.x < 0) {
location.x = width;
}

if (location.y > height-160) {
velocity.y *= -1.3;
//location.y = height;
}

}

}[/code]```

And this is the code for the liquid object:

```[code lang="java"]class Liquid {

float x;
float y;
float w;
float h;
float c;

Liquid(float x_, float y_, float w_, float h_, float c_) {
x = x_;
y = y_;
w = w_;
h = h_;
c = c_;
}

boolean contains(Mover m) {
PVector l = m.location;
if (l.x > x && l.x < x + w && l.y > y && l.y < y + h) {
return true;
}
else {
return false;
}
}

PVector drag(Mover m) {
float speed = m.velocity.mag();
float dragMagnitude = -1 * c * speed * speed;

PVector drag = m.velocity.get();
drag.normalize();
drag.mult(dragMagnitude);

return drag;
}

void render() {
noStroke();
fill(33,73, 137, 80);
rectMode(CORNER);
rect(x,y,w,h);
}

}[/code]```