Tomas valladares tarea 9 partículas

De Casiopea


Títulopartículas
Tipo de ProyectoProyecto de Taller
Palabras Clavetarea 9
AsignaturaImagen Escrita 2012,
Del CursoImagen Escrita 2012,
CarrerasArquitectura
Alumno(s)Tomás Valladares Vergara
ProfesorHerbert Spencer


Se intenta explorar sobre la creación de mas de 1 atractor sobre las partículas, las cuales se les cambia el color que varía su opacidad según la velocidad que posee en cada update.


/////-------------------pestaña 1------------------/////// 

int MAX = 70;
Thing[] t = new Thing[MAX];
Attractor a;
Attractor b;
Attractor p;
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 // pos _ mass _ gravity 
  a = new Attractor(new PVector(width/2, height/2), 30, 5.4);
  b = new Attractor(new PVector(width/8, height/6), 50, -3.2);
   p = new Attractor(new PVector(width/5, height/3), 20, 10);

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

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

void draw() {

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

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

  a.go(0);
  p.go(#C61275);
  b.go(#8915AD); // * atractor: sea!

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

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

  if (keyPressed) {
    if (key == 'a') {
      a.G += 0.1;
    }
    if (key == 'z') {
      a.G -= 0.1;
    }
    if (key == 's') {
      a.mass += 5;
    }
    if (key == 'x') {
      a.mass -= 5;
      a.mass = constrain(a.mass, 0, 100);
    }
  if (key == 'd') {
      b.G += 0.1;
    }
    if (key == 'c') {
      b.G -= 0.1;
    }
    if (key == 'f') {
      b.mass += 5;
    }
      if (key == 'v') {
      b.mass -= 5;
      b.mass = constrain(b.mass, 0, 100);
    
    } 
      if (key == 'g') {
      p.G += 0.1;
    }
    if (key == 'b') {
      p.G -= 0.1;
    }
    if (key == 'h') {
      p.mass += 5;
    }
    if (key == 'n') {
      p.mass -= 5;
      p.mass = constrain(p.mass, 0, 100);
    }
  }
  fill(0);
  text("G1/ a+;z- = "+a.G+", ///  \t la masa del atractor1 / s+; x- = "+a.mass, 30, 50);
  fill(#8915AD);
  text("G2/ d+;c- = "+b.G+",/// \t la masa del atractor2 / f+;v- = "+b.mass, 30, 70);
  fill(#C61275);
  text("G3/ f+;v- = "+p.G+",/// \t la masa del atractor3 / h+;n-  = "+p.mass, 30, 90);

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


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

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

void keyPressed() {
  if (key == ' ') {
    showVectors = !showVectors;
  }
  if (key == 'q') {
    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();
  }
}


/////------------- pestaña 2-------------////
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(color colors) {
    render(colors);
    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(color colorci) {
    strokeWeight(mass / 10);
    stroke(0, 100);
    ellipseMode(CENTER);
    if (dragging) fill (colorci,50);
    else if (rollover) fill(colorci,100);
    else fill(colorci,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;
    }
  }

}
//////-------------------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;
    
  }
  
  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);
    col = color(0, 25*loc.mag(), 134, 120*vel.mag());
  }
  
  // Method to display
  void render() {
    ellipseMode(CENTER);
    fill(col);
    ellipse(loc.x,loc.y,35,35);
    if (showVectors) {
      drawVector(vel,loc,20);
    }
  }
}