Mariana Valenzuela particulas

De Casiopea


TítuloPartículas
Tipo de ProyectoProyecto de Taller
Palabras Clavetarea 10
AsignaturaTaller Inicial 1ª y 2ª Etapa,
Del CursoImagen Escrita 2012,
CarrerasArquitectura
Alumno(s)Mariana valenzuela
ProfesorHerbert Spencer

// Attraction // Daniel Shiffman <http://www.shiffman.net/>

// Demonstrates attractive force one body exerts on a group of bodies stored in an array // G ---> universal gravitational constant // m1 --> mass of object #1 // m2 --> mass of object #2 // d ---> distance between objects // F = (G*m1*m2)/(d*d)

// Click and drag attractive body to move throughout space // Keypress turns on and off vector display


int MAX = 30; Thing[] t = new Thing[MAX]; Attractor a; boolean showVectors = false; boolean velo = true;

void setup() { size(700, 768); smooth(); stroke(#E51C9F,#2587D6);

// Some random bodies for (int i = 0; i < t.length; i++) { PVector ac = new PVector(0.0, 0.0); PVector ve = new PVector(random(0, 0), random(-0.02, 0.9)); PVector lo = new PVector(random(width/4), random(height/3)); t[i] = new Thing(ac, ve, lo, random(2, 100)); } // Create an attractive body a = new Attractor(new PVector(width/3, height/3), 30, 1.4);

PFont font; font = createFont("Monaco", 18); textFont(font); }

color cualquiera() { color c = color(random(255), random(255), random(255)); return c; }

void draw() {

if (!velo)background(255); // fondo blanco

a.rollover(mouseX-3, mouseY-3); // "escucha" al mouse para saber si hay rollover sobre el atractor

a.go(); // * atractor: sea!

for (int i = 0; i < t.length; i++) {

// Calculate a force exerted by "attractor" on "thing" PVector f = a.calcGravForce(t[i]); // Apply that force to the thing t[i].applyForce(f); // Update and render t[i].go(); }

if (keyPressed) { if (key == 'a') { a.G += 9; } if (key == 'z') { a.G -= 0; } if (key == 's') { a.mass += 7; } if (key == 'x') { a.mass -= 0.3; a.mass = constrain(a.mass, 0, 100); } } fill(#1281C4); text("G = "+a.G+",\t la masa del atractor = "+a.mass, 70, height-30);

if (velo) { fill(255, 15); noStroke(); rect(0, 0, width, height); } }


void mousePressed() { a.clicked(mouseX, mouseY); }

void mouseReleased() { a.stopDragging(); }

void keyPressed() { if (key == ' ') { showVectors = !showVectors; } if (key == 'v') { velo = !velo; } }

// Renders a vector object 'v' as an arrow and a location 'loc' void drawVector(PVector v, PVector loc, float scayl) { strokeWeight(.75); if (v.mag() > 0.0) { pushMatrix(); float arrowsize = 40; // Translate to location to render vector translate(loc.x, loc.y); stroke(255, 128, 0, 200); // Call vector heading function to get direction (note that pointing up is a heading of 0) and rotate rotate(v.heading2D()); // Calculate length of vector & scale it to be bigger or smaller if necessary float len = v.mag()*scayl; // Draw three lines to make an arrow (draw pointing up since we've rotate to the proper direction) line(0, 0, len, 0); line(len, 0, arrowsize, arrowsize/2); line(len, 0, -arrowsize, arrowsize*2); popMatrix(); } }


/********************************************************************************* ATTRACTOR ***********************************************************************/

// Attraction // Daniel Shiffman <http://www.shiffman.net/>

// A class for a draggable attractive body in our world

class Attractor { float mass; // Mass, tied to size float G; // Gravitational Constant PVector loc; // Location boolean dragging = false; // Is the object being dragged? boolean rollover = false; // Is the mouse over the ellipse? PVector drag; // holds the offset for when object is clicked on

Attractor(PVector l_,float m_, float g_) { loc = l_.get(); mass = m_; G = g_; drag = new PVector(0.0,0.0); }

void go() { render(); drag(); }

PVector calcGravForce(Thing t) { PVector dir = PVector.sub(loc,t.getLoc()); // Calculate direction of force float d = dir.mag(); // Distance between objects d = constrain(d, 1.0, 250.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects dir.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) float force = (G * mass * t.getMass()) / (d * d); // Calculate gravitional force magnitude dir.mult(force); // Get force vector --> magnitude * direction return dir; }

// Method to display void render() { strokeWeight(mass / 20); stroke(#1281C4, #1281C4); ellipseMode(CENTER); if (dragging) fill (100); else if (rollover) fill(100); else fill(175,200); ellipse(loc.x,loc.y,mass*2,mass*2); noStroke(); }

// The methods below are for mouse interaction void clicked(int mx, int my) { float d = dist(mx,my,loc.x,loc.y); if (d < mass) { dragging = true; drag.x = loc.x-mx; drag.y = loc.y-my; } }

void rollover(int mx, int my) { float d = dist(mx,my,loc.x,loc.y); if (d < mass) { rollover = true; } else { rollover = false; } }

void stopDragging() { dragging = false; }


void drag() { if (dragging) { loc.x = mouseX + drag.x; loc.y = mouseY + drag.y; } }

}

/*********************************************************************************** THING ******************************************************************************/

// Daniel Shiffman <http://www.shiffman.net/>

// A class to describe a thing in our world, has vectors for location, velocity, and acceleration // Also includes scalar values for mass, maximum velocity, and elasticity

class Thing { PVector loc; // location PVector vel; // velocity PVector acc; // acceleration float mass; float max_vel; color col;

Thing(PVector a, PVector v, PVector l, float m_) { acc = a.get(); vel = v.get(); loc = l.get(); mass = m_; max_vel = 20.0; col = color(random(5, 255), random(#288A9D, 2555), random(2302),255); }

PVector getLoc() { return loc; }

PVector getVel() { return vel; }

float getMass() { return mass; }

void applyForce(PVector force) { force.div(mass); acc.add(force); if (showVectors) { drawVector(force,loc, 100); } }

// Main method to operate object void go() { update(); render(); }

// Method to update location void update() { vel.add(acc); vel.limit(max_vel); loc.add(vel); // Multiplying by 0 sets the all the components to 0 acc.mult(0); }

// Method to display void render() { ellipseMode(CENTER); fill(col); ellipse(loc.x,loc.y,mass,mass); if (showVectors) { drawVector(vel,loc,0); } } }