Joaquín Avendaño - Tarea 10
De Casiopea
Título | Joaquín Avendaño - Tarea 10 |
---|---|
Tipo de Proyecto | Proyecto de Curso |
Palabras Clave | tarea 10 |
Período | 2012- |
Asignatura | Imagen Escrita 2012, |
Del Curso | Imagen Escrita 2012, |
Carreras | Arquitectura |
Alumno(s) | Joaquín Avendaño |
Profesor | Herbert Spencer |
int MAX = 20; Thing[] t = new Thing[MAX]; Attractor a; AttractorDos b; boolean showVectors = false; boolean velo = false;
void setup() {
size(700, 700); smooth(); for (int i = 0; i < t.length; i++) { PVector ac = new PVector(0.0, 0.0); PVector ve = new PVector(random(-3, 3), random(-3, 3)); PVector lo = new PVector(random(width), random(height)); t[i] = new Thing(ac, ve, lo, random(1, 300)); } a = new Attractor(new PVector(width/2, height/2), 15, 4); b = new AttractorDos(new PVector(width/1.5, height/2), 40, 1); PFont font; font = createFont("Monaco", 20); 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); b.rollover(mouseX, mouseY); a.go(); // * atractor: sea! b.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 == 'd') { b.G += 4; } if (key == 'g') { a.G -= 0.2; } if (key == 'l') { a.mass -= 10; } if (key == 'h') { a.mass -= 2; a.mass = constrain(a.mass, 100, 10); } } 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); b.clicked(mouseX, mouseY);
}
void mouseReleased() {
a.stopDragging(); b.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(.7); if (v.mag() > 0.0) { pushMatrix(); float arrowsize = 20; // Translate to location to render vector translate(loc.x, loc.y); stroke(255, 108, 0, 300); // 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(); }
}
attractor
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, 2, 300.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 / 5); stroke(0, 100); ellipseMode(CENTER); if (dragging) fill (70); else if (rollover) fill (70); 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; } }
}
attractordos
class AttractorDos {
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
AttractorDos(PVector l_,float m_, float g_) { loc = l_.get(); mass = m_; G = g_; drag = new PVector(0.3,0.2); }
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, 9, 200.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 / 2); stroke(0, 100); ellipseMode(CENTER); if (dragging) fill (70); else if (rollover) fill (70); 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; } }
}
thing
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 = 50.0; col = color(random(700, 200), random(10, 175), random(15), 470); } 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); } }
}