class Attractor { float mass; float G; Vector3D loc; boolean dragging = false; boolean rollover = false; Vector3D drag; Attractor(Vector3D l_,float m_, float g_) { loc = l_.copy(); 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()); float d = dir.magnitude(); d = constrain(d,5.0f,25.0f); dir.normalize(); float force = (G * mass * t.getMass()) / (d * d); dir.mult(force); return dir; } void render() { ellipseMode(CENTER); noStroke(); if (dragging) fill (255,90); else if (rollover) fill(200,90); else fill(100,90); ellipse(loc.x,loc.y,mass*2,mass*2); } 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; } } }