Eduardo Arratia Tarea 10 Mov.Particulas

De Casiopea
Revisión del 01:23 12 jul 2012 de Eduardoarratia (discusión | contribs.) (Página creada con «{{Proyecto |Título=Eduardo Arratia Tarea 10 Mov.Particulas |Tipo de Proyecto=Proyecto de Curso |Palabras Clave=tarea10 |Carreras Relacionadas=Arquitectura |Cursos Relacion...»)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)



TítuloEduardo Arratia Tarea 10 Mov.Particulas
Tipo de ProyectoProyecto de Curso
Palabras Clavetarea10
Del CursoImagen Escrita 2012,
CarrerasArquitectura
Alumno(s)Eduardo Arratia

Colores Cálidos se dirigen a un punto, con "a" se aumenta la gravedad con "z" se disminuye y con "s" y "x" se aumenta y disminuye el tamaño del cuadrado respectivamente

--- // 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 = false;

void setup() {

 size(1024, 768);
 smooth();
 // Some random bodies
 for (int i = 0; i < t.length; i++) {
   PVector ac = new PVector(0.0, 0.0);
   PVector ve = new PVector(random(-1, 1), random(-1, 1));
   PVector lo = new PVector(random(width), random(height));
   t[i] = new Thing(ac, ve, lo, random(2, 100));
 }
 // Create an attractive body
 a = new Attractor(new PVector(width/2, height/2), 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, mouseY); // "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 += 30;
   }
   if (key == 'z') {
     a.G-= 60;
   }
   if (key == 's') {
     a.mass += 5;
   }
   if (key == 'x') {
     a.mass -= 5;
     a.mass = constrain(a.mass, 20, 100);
   }
 }
 fill(0);
 text("G = "+a.G+",\t la masa del atractor = "+a.mass, 30, 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 = 10;
   // 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, len-arrowsize, +arrowsize/2);
   line(len, 0, len-arrowsize, -arrowsize/2);
   popMatrix();
 }

}



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, 5.0, 10.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+40);                                  // Get force vector --> magnitude * direction
   return dir;
 }
 
// Method to display
 void render() {
   strokeWeight(mass / 10);
   stroke(0, 100);
   ellipseMode(CENTER);
   if (dragging) fill (#FFE200);
   else if (rollover) fill(#FF7C00);
   else fill(#7C592F);
   rect(loc.x,loc.y,mass*2,mass*2);
   rect(loc.x,loc.y,mass/2,40);
   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;
   }
 }

}



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(180, 255), random(100, 175), random(30), 200);
 }
 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() {
   rectMode(CENTER);
   fill(#E34242);
   triangle(loc.x/2, loc.y/2, mass, mass, 120, 50);
   triangle(loc.x*4, loc.y/2, 1000, 950, 900, 700) ;
   if (showVectors) {
     drawVector(vel, loc,10);
   }
 }

}