//***************************************************************************** // TITLE: Project 1 (template) // DESCRIPTION: Prediction // AUTHOR: Prof Jarek Rossignac // DATE CREATED: January 20. 2008 // EDITS: //***************************************************************************** boolean showText = true; // toggled by pressing the 'h'key to show/hide help text boolean printIt=false; // temporarily set when the '?' key is pressed and used to print some debugging values int n=4; // number of points pt [] PP = new pt[n]; // decalres an array of n points int p=0; // index to the point being dragged color red, yellow, green, cyan, blue, magenta, dred, dyellow, dgreen, dcyan, dblue, dmagenta, white, black, orange, grey, metal; // declares colors void setup() { size(600, 600); smooth(); colorMode(HSB,121); strokeJoin(ROUND); strokeCap(ROUND); // set up window and drawing modes red = color(0, 120, 120); yellow = color(20, 120, 120); green = color(40, 120, 120); cyan = color(60, 120, 120); blue = color(80, 120, 120); magenta = color(100, 120, 120); dred = color(0, 120, 60); dyellow = color(20, 120, 60); dgreen = color(40, 120, 60); dcyan = color(60, 120, 60); dblue = color(80, 120, 60); dmagenta = color(100, 120, 60); white = color(0, 0, 120); black = color(0, 120,0); grey = color(0, 120,60); orange = color(10, 100, 120); metal = color(70, 60, 100); PFont font = loadFont("Courier-14.vlw"); textFont(font, 14); // load font for (int i=0; iO3_2.disTo(k)) // O3=O3_1.makeClone(); //else //O3=O3_2.makeClone(); stroke(black); float r1=O3_1.makeVecTo(D).norm(); float r2=O3_2.makeVecTo(D).norm(); noFill(); // ellipse(O3_1.x,O3_1.y,2*r1,2*r1); // ellipse(O3_2.x,O3_2.y,2*r2,2*r2); // D.showSegmentTo(O3_1); // D.showSegmentTo(O3_2); float alpha1=atan2(D.y-O3_1.y,D.x-O3_1.x); if(abs(D.x-O3_1.x)<.001f) alpha1=3.14f/2*abs(D.y-O3_1.y)/(D.y-O3_1.y); float theta1=2*asin(max(-1.0f,min(1.0f,L/(2*r1)))); float alpha2=atan2(D.y-O3_2.y,D.x-O3_2.x); if(abs(D.x-O3_2.x)<.001f) alpha2=3.14f/2*abs(D.y-O3_2.y)/(D.y-O3_2.y); float theta2=2*asin(max(-1.0f,min(1.0f,L/(2*r2)))); pt []P=new pt[8]; P[0]=new pt(O3_1.x+r1*cos(-alpha1+theta1),O3_1.y+r1*sin(-alpha1+theta1)); P[1]=new pt(O3_1.x+r1*cos(alpha1+theta1),O3_1.y+r1*sin(alpha1+theta1)); P[2]=new pt(O3_1.x+r1*cos(-alpha1-theta1),O3_1.y+r1*sin(-alpha1-theta1)); P[3]=new pt(O3_1.x+r1*cos(alpha1-theta1),O3_1.y+r1*sin(alpha1-theta1)); P[4]=new pt(O3_2.x+r2*cos(-alpha2+theta2),O3_2.y+r2*sin(-alpha2+theta2)); P[5]=new pt(O3_2.x+r2*cos(alpha2+theta2),O3_2.y+r2*sin(alpha2+theta2)); P[6]=new pt(O3_2.x+r2*cos(-alpha2-theta2),O3_2.y+r2*sin(-alpha2-theta2)); P[7]=new pt(O3_2.x+r2*cos(alpha2-theta2),O3_2.y+r2*sin(alpha2-theta2)); pt O3; float r,alpha,theta; // println(180/3.14*acos(dot(B.makeVecTo(A).makeUnit(),B.makeVecTo(C).makeUnit()))+","+180/3.14*acos(dot(C.makeVecTo(B).makeUnit(),C.makeVecTo(D).makeUnit()))+","+180/3.14*acos(dot(D.makeVecTo(C).makeUnit(),D.makeVecTo(A).makeUnit())) +"\n"); println(180/3.14*acos(dot(B.makeVecTo(A).makeUnit(),B.makeVecTo(C).makeUnit()))+","+180/3.14*acos(dot(C.makeVecTo(B).makeUnit(),C.makeVecTo(D).makeUnit()))+","+180/3.14*acos(dot(D.makeVecTo(C).makeUnit(),D.makeVecTo(A).makeUnit())) +"\n"); if((acos(dot(B.makeVecTo(A).makeUnit(),B.makeVecTo(C).makeUnit()))+acos(dot(D.makeVecTo(C).makeUnit(),D.makeVecTo(A).makeUnit())) < 3.14f)) // if((asin(dot(B.makeVecTo(A).makeUnit(),B.makeVecTo(C).makeUnit().makeTurnedLeft()))+asin(dot(D.makeVecTo(C).makeUnit(),D.makeVecTo(A).makeUnit().makeTurnedLeft())) < 3.14f)) { println("bigger\n"); if(O3_1.disTo(D)dot(O1O2,O3_2.makeVecTo(O2) ) ) {O3=O3_1.makeClone();r=r1;alpha=alpha1;theta=theta1;} else {O3=O3_2.makeClone();r=r2;alpha=alpha2;theta=theta2;} } else { if(O3_1.disTo(D)>O3_2.disTo(D)) // if(dot(O1O2,O3_1.makeVecTo(O2))>dot(O1O2,O3_2.makeVecTo(O2) ) ) {O3=O3_1.makeClone();r=r1;alpha=alpha1;theta=theta1;} else {O3=O3_2.makeClone();r=r2;alpha=alpha2;theta=theta2;} } // O3.show(5); // O3.showLabel("O3"); P[0]=new pt(O3.x+r*cos(-alpha+theta),O3.y+r*sin(-alpha+theta)); P[1]=new pt(O3.x+r*cos(alpha+theta),O3.y+r*sin(alpha+theta)); P[2]=new pt(O3.x+r*cos(-alpha-theta),O3.y+r*sin(-alpha-theta)); P[3]=new pt(O3.x+r*cos(alpha-theta),O3.y+r*sin(alpha-theta)); int maxi=0; float maxdot=-1000000; for(int i=0;i<4;i++) { float curdot=dot(C.makeVecTo(D),D.makeVecTo(P[i])); // vec V=D.makeVecTo(A); // float curdot=dot(V,D.makeVecTo(P[i])); //if((acos(dot(B.makeVecTo(A).makeUnit(),B.makeVecTo(C).makeUnit()))+acos(dot(D.makeVecTo(C).makeUnit(),D.makeVecTo(A).makeUnit())) < 3.14f)) { // V=A.makeVecTo(D); // curdot=dot(V,D.makeVecTo(P[i])); // curdot=dot(D.makeVecTo(C),D.makeVecTo(P[i])); } // println(i+":"+curdot+",,,"+P[i].x+"\n"); if(abs(P[i].disTo(D)-L)<0.5f && curdot>maxdot) { maxi=i; maxdot=curdot; } } return P[maxi]; // if(dot(C.makeVecTo(D),D.makeVecTo(P1))>dot(C.makeVecTo(D),D.makeVecTo(P2))) // return P2; //else return P1; }