Tarea 9 vectores y partículas.

De Casiopea


Títulotarea 10
Tipo de ProyectoProyecto de Curso
Palabras Clavetarea 10
AsignaturaImagen Escrita 2012,
Del CursoImagen Escrita 2012,
CarrerasDiseño Gráfico"Diseño Gráfico" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property., Diseño Industrial"Diseño Industrial" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property.
Alumno(s)Claudio Gómez
ProfesorHerbert Spencer

se busca que los vectores viajen de manera horizontal como objetos, sin necesidad de apuntar hacia la flecha, estas pueden girar, trasladarse de forma lateral, pero no seguir con la flecha direccionada, el rastro del impulso del atractor.

pestaña 1:

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

void setup() {

 size(800,700, P3D);
 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);
 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));
 }
 b= new Attractor (new PVector(width, height), 14, 2);
 
 for (int i = 0; i < t.length; i++) {
   PVector ac = new PVector(0.0, 0.0);
   PVector ve = new PVector(random(-3, 1), random(-1,2));
   PVector lo = new PVector(random(width), random(height));
   t[i] = new Thing(ac, ve, lo, random(2, 100));
 }
 PFont font;
 font = createFont("Monaco", 18);
 textFont(font);

}

color cualquiera() {

 color c = color(random(#0FFFD5), random(#002158), 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 == 'w') {
     a.G += 3;
   }
   if (key == 's') {
     a.G -= 3;
   }
   if (key == 'a') {
     a.mass += 7;
   }
   if (key == 'd') {
     a.mass -= 9;
     a.mass = constrain(a.mass, 5, 100);
 
   }
   
 }
 fill(0);
 text("G = "+a.G+",\t la masa del atractor = "+a.mass, 23, height-30);
 if (velo) {
   fill(#17FAE5, 23);
   noStroke();
   rect(0, 0, width, height);
 }

}


void mousePressed() {

 a.clicked(mouseX, mouseY);

}

void mouseReleased() {

 a.stopDragging();

}

void keyPressed() {

 if (key == 'e') {
   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(.60);
 if (v.mag() > 0.5) {
   pushMatrix();
   float arrowsize = 10;
   // Translate to location to render vector
   translate(loc.x, loc.x);
   stroke(42, 128, random(23), 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();
 }

}

pestaña 2


class Attractor {

 float mass;    // Mass, tied to size
 float G;       // Gravitational Constant
 PVector loc;   // Location
 boolean dragging = true; // 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.2, 7);
 }
 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 / 10);
   stroke(0, 100);
   ellipseMode(CENTER);
   if (dragging) fill (50);
   else if (rollover) fill(200);
   else fill(175, 200);
   ellipse(loc.x, loc.y, mass*5, mass*4);
   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 = true;
   }
 }
 void stopDragging() {
   dragging = false;
 }


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

}

pestaña 3

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(255, #0FFFD5), random(255, 255), 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() {
 ellipseMode(CENTER);
   fill(col);
   ellipse(loc.y,loc.x,mass,mass);
   if (showVectors) {
     drawVector(vel,loc,45);
   }
 }

}