Alyssa Ruts: Tarea10

De Casiopea
{{{Título}}}


Título
Palabras Clavetarea 10
AsignaturaImagen Escrita 2012,
Del CursoImagen Escrita 2012,
CarrerasDiseñ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)Alyssa Ruts
ProfesorHerbert Spencer
int MAX = 45; Objeto[] t = new Objeto[MAX]; Atractor a; Atractor2 a2; boolean showVectors = false; boolean velo = false;
 
void setup() { 
size(300,300);
smooth();
for (int i = 0; i < t.length; i++){
PVector ac = new PVector(0.2, 0.5);
PVector ve = new PVector(random(-2, 2), random(-1, 0.4));
PVector lo = new PVector(random(width), random(height));
t[i] = new Objeto(ac, ve, lo, random(5, 167));
 
} 

a = new Atractor(new PVector(width/5, height/2.3), 30, 1.4); a2= new Atractor2 (new PVector(width/2, height/2), 10, 1);
 

PFont font; font = createFont("Arial", 12); textFont(font); } 

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

void draw() { 
if (!velo)background(255); 
 a.rollover(mouseX, mouseY); 
 a2.rollover(mouseX,mouseY);
a.go();
a2.go();
for (int i = 0; i < t.length; i++) {
   PVector f = a.calcGravForce(t[i]);
  t[i].applyForce(f);
  t[i].go();
  
}
if (keyPressed) {
  if (key == 'a') {
    a.G -= 1;
  
  }
}
fill(255);
text("G = "+a.G+",\t la masa del atractor = "+a.mass, 21, height-25);
if (velo) {
  fill(255, 30);
  noStroke();
  rect(1, 4, width, height);
}
 
} 


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

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

void keyPressed() { 
  if (key == 'f'){
    saveFrame ("##.jpg");
  }
if (key == 's') {
  showVectors = !showVectors;
}
if (key == 'v') {
  velo = !velo;
}
 
} 

void drawVector(PVector v, PVector loc, float scayl) { 
strokeWeight(3);
if (v.mag() > 0.0) {
  pushMatrix();
  float arrowsize = 24;
  translate(loc.x, loc.y);
  stroke(255, 200, 10, 139);
  rotate(v.heading2D());
  float len = v.mag()*scayl;
  line(0, 0, len, 0);
  line(len, 0, len-arrowsize, +arrowsize/2);
  line(len, 0, len-arrowsize, -arrowsize/0.7);
  popMatrix();
}
 
} 




class Atractor { 
float mass;    
float G;   
PVector loc;  
boolean dragging = false; 
boolean rollover = false; 
PVector drag;  
Atractor(PVector l_,float m_, float g_) {
  loc = l_.get();
  mass = m_;
  G = g_;
  drag = new PVector(0.2,0.5);
}
void go() {
  render();
  drag();
}
PVector calcGravForce(Objeto t) {
  PVector dir = PVector.sub(loc,t.getLoc());        
  float d = dir.mag();                             
  d = constrain(d, 1.0, 250.0);                     
  dir.normalize();                                  
  float force = (G * mass * t.getMass()) / (d * d); 
  dir.mult(force);                                  
  return dir;
}
 void render() {
  strokeWeight(mass / 58);
  stroke(0, 139);
  ellipseMode(CENTER);
  if (dragging) fill (67);
  else if (rollover) fill(100);
  else fill(400,700);
  ellipse(loc.x,loc.y,mass*2,mass*2);
  noStroke();
}
 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 Atractor2 { 
float mass;    
float G;   
PVector loc;  
boolean dragging = false; 
boolean rollover = false; 
PVector drag;  
Atractor2(PVector l_,float m_, float g_) {
  loc = l_.get();
  mass = m_;
  G = g_;
  drag = new PVector(1,0.4);
}
void go() {
  render();
  drag();
}
PVector calcGravForce(Objeto t) {
  PVector dir = PVector.sub(loc,t.getLoc());        
  float d = dir.mag();                             
  d = constrain(d, 1.2, 1340.0);                     
  dir.normalize();                                  
  float force = (G * mass * t.getMass()) / (d * d); 
  dir.mult(force);                                  
  return dir;
}
 void render() {
  strokeWeight(mass / 44);
  stroke(0, 139);
  ellipseMode(CENTER);
  if (dragging) fill (134);
  else if (rollover) fill(120);
  else fill(400,700);
  ellipse(loc.x,loc.y,mass*4,mass*2);
  noStroke();
}
 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 Objeto { 
PVector loc; 
PVector vel;
PVector acc;
float mass;
float max_vel;
color col;
  
Objeto(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, 200), random(220, 150), random(0.5), 50);
}

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, 200);
  }    
}
void go() {
  update();
  render();
}

void update() {
  vel.add(acc);
  vel.limit(max_vel);
  loc.add(vel);
  acc.mult(0);
}

void render() {
  ellipseMode(CENTER);
  fill(col);
  ellipse(loc.x,loc.y,mass,mass);
  if (showVectors) {
    drawVector(vel,loc,32);
  }
}
 
}