// keyframe interpolation in 2D // Written June 2006 by Jarek Rossignac int nr=6; // number of cars car C[] = new car [nr]; // array of cars vec I=new vec (1,0); // basis vector for angle calculations vec labelD=new vec(-3,2); // offset vector for painting labels on cars float t=0; // animation time car X; // moving car int mode=0; // interpolaiton mode: 0=linear, 1=Bezier, 2=twist class car { // cars // float h=40, w=100; // car dimensions float h=30, w=70; // car dimensions color col; // color of car pt B=new pt(0,0), F=new pt(w,0); // front and back points (centers of disks) float speed = 0; // speed of car (user adjusted) float a=0.0; // angle of car orientation wrt I vector boolean picked = false; // true if car being dragged boolean pickedSpeed = false; // true if speed being adjusted car (float px, float py, float pa, float ps, color pc) {B.x=px; B.y=py; a=pa; speed=ps; col=pc; F.x=px+w; F.y=py; F.turnAround(B,-a);} // creation void paint() {pushMatrix(); translate(B.x,B.y); rotate(a); // paints car noStroke(); fill(col); rect(w/2,0,w,h); ellipse(0,0,w/7,h*0.95); ellipse(w,0,w/5,h*0.95); fill(55); ellipse(w*0.2,0,w*0.3,h); ellipse(w*0.2+w/3,0,w*0.4,h); fill(col); rect(w*0.2+w/6,0,2*w/6,h); popMatrix(); } boolean selected() {boolean pic = F.vecTo(mouse()).norm()1) t=0; int i=floor(t*nr); int j=i+1; if (j==nr) j=0; float s=(t*nr-i); if (mode==0) X.interpolateLinear(C[i],s,C[j]); if (mode==1) X.interpolateBezier(C[i],s,C[j]); if (mode==2) X.interpolateTwist(C[i],s,C[j]); X.paint(); } void mousePressed() {boolean found=false; for (int i=nr-1; i>=0; i--) { if (!found) {if(C[i].selected()) { found=true;}; }; }; if (!found) { for (int i=nr-1; i>=0; i--) { if (!found) {if(C[i].selectedSpeed()) { found=true;}; }; }; }; } void mouseDragged() { for (int i=0; i