Sofía Lopez Partículas
De Casiopea
| Título | Partículas Sofia López |
|---|---|
| Tipo de Proyecto | Proyecto de Curso |
| Palabras Clave | tarea 10 |
| Asignatura | Taller Inicial 1ª y 2ª Etapa, |
| Del Curso | Imagen Escrita 2012, |
| Carreras | Arquitectura |
| Alumno(s) | Sofia López |
| Profesor | Herbert Spencer |
// 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 = 40;
Thing[] t = new Thing[MAX];
Attractor a;
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, 5), random(-5, 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);
PFont font;
font = createFont("Monaco", 18);
textFont(font);
}
color cualquiera() {
color c = color(random(0), random(255), random(0));
return c;
}
void draw() {
if (!velo)background(#EA5C24); // 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 == '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);
}
}
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);
}
void mouseReleased() {
a.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(.75);
if (v.mag() > 0.0) {
pushMatrix();
float arrowsize = 2;
// Translate to location to render vector
translate(loc.x, loc.y);
stroke(255, 128, 255, 0);
// 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(30, 0, len, 0);
line(len, 0, len-arrowsize, +arrowsize/2);
line(len, 0, len-arrowsize, -arrowsize/2);
popMatrix();
}
}
________________________________________________________________
// 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(50.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 /20);
stroke(0, 255);
ellipseMode(CENTER);
if (dragging) fill (250);
else if (rollover) fill(0);
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;
}
}
}
__________________________________________________________
// 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 = 100.0;
col = color(random(0, 255), random(255, 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.y,loc.x,mass,mass);
if (showVectors) {
drawVector(vel,loc,20);
}
}
}