class pt { float x,y; pt (float px, float py) {x = px; y = py;}; pt make() {return(new pt(x,y));}; void show(float r) { ellipse(x, y, 2*r, 2*r); }; void setTo(pt P) { x = P.x; y = P.y; }; void setTo(float px, float py) {x = px; y = py;}; void setToMouse() { x = mouseX; y = mouseY; }; void write() {println("("+x+","+y+")");}; void label(String s, vec D) {text(s, x+D.x, y+D.y); }; void addVec(vec V) {x += V.x; y += V.y;}; void moveTowards(float s, pt P) {x += s*(P.x-x); y += s*(P.y-y);}; void addScaledVec(float s, vec V) {x += s*V.x; y += s*V.y;}; void subVec(vec V) {x -= V.x; y -= V.y;}; void vert() {vertex(x,y);}; boolean isInWindow() {return(((x<0)||(x>width)||(y<0)||(y>height)));}; vec vecTo(pt P) {return(new vec(P.x-x,P.y-y)); }; float disTo(pt P) {return(sqrt(sq(P.x-x)+sq(P.y-y))); }; vec vecToMid(pt P, pt Q) {return(new vec((P.x+Q.x)/2.0-x,(P.y+Q.y)/2.0-y)); }; } pt midPt(pt A, pt B) {return(new pt((A.x+B.x)/2,(A.y+B.y)/2)); }; class vec { float x,y; vec (float px, float py) {x = px; y = py;}; vec make() {return(new vec(x,y));}; void show (pt P) { ellipse(P.x, P.y, 3, 3); line(P.x,P.y,P.x+x,P.y+y); }; void setTo(vec V) { x = V.x; y = V.y; }; void setTo(float px, float py) {x = px; y = py;}; void add(vec V) {x += V.x; y += V.y;}; void addScaled(float s, vec V) {x += s*V.x; y +=s*V.y;}; void sub(vec V) {x -= V.x; y -= V.y;}; void mul(float m) {x *= m; y *= m;}; void back() {x = -x; y = -y;}; void write() {println("("+x+","+y+")");}; float norm() {return(sqrt(sq(x)+sq(y)));}; void unit() {float n=sqrt(sq(x)+sq(y)); if (n>0.0001) {x/=n; y/=n;};}; vec left() {return(new vec(-y,x));}; void turn(float a) {float c = cos(a); float s=sin(a); float t=c*x-s*y; y=c*y+s*x; x=t;}; } float angle(vec U, vec V) {float d=U.norm()/V.norm(); vec N=U.left(); float c=dot(U,V)/d; float s=dot(N,V)/d; float a= atan2(s,c); return(a);}; vec midVec(vec U, vec V) {return(new vec((U.x+V.x)/2,(U.y+V.y)/2)); }; float dot(vec U, vec V) {return(U.x*V.x+U.y*V.y); };