Las dos partículas de Danilo

De Casiopea

[[Archivo:Part�culas.jpg|thumb|800px|center|las partículas de Danilo]]



Títulolas partículas de Danilo
Tipo de ProyectoProyecto de Curso
Palabras Clavetarea 10
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)Danilo Garrido
ProfesorHerbert Spencer
/*lo que he hecho es simplemente mejorar la presentación de las partículas, señalando los botones que permiten realizar cambios. además, he añadido un segundo atractor, el cual posee cambios individuales, de ésta forma, dejo la posibilidad de experimentar con dos cuerpos distintos*/
// 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;
Attractor b;
boolean showVectors = false;
boolean velo = false;

void setup() {
  size(824, 568);
  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/4, height/2), 30, 1.4);
  b = new Attractor(new PVector(width-200, height/2), 60, 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
  b.rollover(mouseX, mouseY);
  a.go(); // * atractor: sea!
  b.go();
  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 += 0.1;
    }
    if (key == 'z') {
      a.G -= 0.1;
    }
    if (key == 'd') {
      b.G += 0.1;
    }
    if (key == 'c') {
      b.G += 0.1;
    }
    if (key == 's') {
      a.mass += 5;
    }
    if (key == 'f') {
      b.mass += 10;
    }
    if (key == 'v') {
      b.mass -=10;
      b.mass = constrain(b.mass, 0, 100);
    }
    if (key == 'x') {
      a.mass -= 5;
      a.mass = constrain(a.mass, 0, 100);
    }
  }
  stroke(0);
  strokeWeight(2);
  rect(25, height-50, width-40, height-15);
  fill(100);
  fill(0);
  text("A y Z para Gravedad del atractor = "+a.G, 30, height-30);
  text("S y X para Masa del Atractor = "+a.mass, 30, height-10);
  text("C y D para Gravedad Atractor 2 ="+b.G, 450, height-30);
  text("F y V para Masa Atractor 2 = "+b.mass, 450, height-10);


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


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

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

void keyPressed() {
  if (key == ' ') {
    showVectors = !showVectors;
  }
  if (key == '1') {
    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();
  }
}
-------------------------------------------------------
/*en una pestaña nueva se pone esto*/

// 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 / 10);
    stroke(0, 100);
    ellipseMode(CENTER);
    if (dragging) fill (50);
    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;
    }
  }
}
-----------------------------------------
/*en una nueva pestaña se pone esto*/
// Attraction
// 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(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() {
    ellipseMode(CENTER);
    fill(col);
    ellipse(loc.x,loc.y,mass,mass);
    if (showVectors) {
      drawVector(vel,loc,20);
    }
  }
}