// Attraction // Daniel Shiffman // A class for a draggable attractive body in our world class Attractor { float mass; // Mass, tied to size float G; // Gravitational Constant float addForce; Vector3D loc; // Location boolean dragging = false; // Is the object being dragged? boolean rollover = false; // Is the mouse over the ellipse? Vector3D drag; // holds the offset for when object is clicked on Attractor(Vector3D l_,float m_, float g_) { loc = l_; mass = m_; G = g_; drag = new Vector3D(0.0,0.0); } void go() { render(); drag(); } Vector3D calcGravForce(Thing t) { Vector3D dir = Vector3D.sub(loc,t.getLoc()); // Calculate direction of force float d = dir.magnitude(); // Distance between objects d = constrain(d,5.0f,25.0f); // 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) + addForce; // Calculate gravitional force magnitude addForce = addForce +0.01; if (addForce>50){ addForce = 50; } dir.mult(force); // Get force vector --> magnitude * direction return dir; } // Method to display void render() { ellipseMode(CENTER); noStroke(); if (dragging) fill (255,0,0,90); else if (rollover) fill(255,0,0,50); else fill(255,0,0,30); ellipse(loc.x,loc.y,mass*2,mass*2); pushMatrix(); translate(loc.x,loc.y); rotate(25); ellipse(25,0,mass*1.6,mass*1.6); ellipse(0,25,mass*1.6,mass*1.6); ellipse(19,19,mass*1.6,mass*1.6); ellipse(19,-19,mass*1.6,mass*1.6); ellipse(-19,19,mass*1.6,mass*1.6); ellipse(-19,-19,mass*1.6,mass*1.6); ellipse(-25,0,mass*1.6,mass*1.6); ellipse(0,-25,mass*1.6,mass*1.6); popMatrix(); } // 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; addForce=0; } } 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; } } }