// TrackerQuad01 (two pairs of trackers, line between tails of each) // David Bollinger, January 2006 // http://www.davebollinger.com // for Processing 0015 Beta // // first tracker follows mouse, second tracker follows first class TrackerPair { Tracker tracker1, tracker2; color clr; TrackerPair(float _x, float _y) { tracker1 = new Tracker(_x,_y); tracker1.setPhysics(0.1,0.1); tracker2 = new Tracker(_x,_y); tracker2.setPhysics(0.2,0.2); } void setColor(color c) { clr = c; } void setPhysics(float rate, float friction) { tracker1.setPhysics(rate, friction); tracker2.setPhysics(rate*2.0, friction*2.0); } void setTarget(float x, float y) { tracker1.setTarget(x, y); } void move(float dt) { tracker1.move(dt); tracker2.setTarget(tracker1.x, tracker1.y); tracker2.move(dt); } void draw() { stroke(clr); line(tracker1.x, tracker1.y, tracker2.x, tracker2.y); } } // a quad is a pair of pairs class TrackerQuad { TrackerPair pair1, pair2; color clr; TrackerQuad(float _x, float _y) { pair1 = new TrackerPair(_x,_y); pair1.setPhysics(0.1,0.1); pair2 = new TrackerPair(_x,_y); pair2.setPhysics(0.2,0.2); } void setColor(color c) { clr = c; } void setPhysics(float rate, float friction) { pair1.setPhysics(rate, friction); pair2.setPhysics(rate*3.0, friction*3.0); } void setTarget(float x, float y) { pair1.setTarget(x, y); pair2.setTarget(x, y); } void move(float dt) { pair1.move(dt); pair2.move(dt); } // draw between the "tails" of each pair // (one further level of abstraction away from mouse coordinates) void draw() { stroke(clr); line(pair1.tracker2.x, pair1.tracker2.y, pair2.tracker2.x, pair2.tracker2.y); } } TrackerQuad trackerquad; HScrollbar hsr; HScrollbar hsf; boolean isDrawing = false; float timeslice = 0.1; boolean bGotMouse = false; color bgcolor = #ffffff; color fgcolor = color(8,32,128,32); void setup() { size(480,480,P3D); background(bgcolor); trackerquad = new TrackerQuad(width/2, height/2); trackerquad.setColor(fgcolor); PFont font = loadFont("small-6.vlw"); hsr = new HScrollbar(10, height-20, 100, 8, 5, "RATE", font); hsr.setRange(0.01,0.1); hsr.setValue(0.05); hsf = new HScrollbar(10, height-8, 100, 8, 5, "FRICTION", font); hsf.setRange(0.01,0.1); hsf.setValue(0.05); // in general (friction >= rate) is a "better" mouse follower } void draw() { hsr.update(); hsf.update(); trackerquad.setPhysics(hsr.getValue(), hsf.getValue()); boolean localGotMouse = bGotMouse; if (hsr.over || hsf.over) localGotMouse = false; if (localGotMouse) { float targetx = (float)(mouseX); float targety = (float)(mouseY); trackerquad.setTarget(targetx, targety); float elapsed = 0.0; while (elapsed < 1.0) { trackerquad.move(timeslice); if (isDrawing) trackerquad.draw(); elapsed += timeslice; } } hsr.draw(); hsf.draw(); } void mousePressed() { bGotMouse = true; if (mouseButton == LEFT) { isDrawing = true; } else if (mouseButton == RIGHT) { background(bgcolor); } } void mouseReleased() { if (mouseButton == LEFT) { isDrawing = false; } } void keyPressed() { if (key=='s') saveFrame("frame.tga"); }