// July 2002, java applet by Oliver Knill for the CCP project // Green's Theorem and the Planimeter by Oliver Knill and Dale Winter // Harvard University, Nov 15, 2002. See // http://math.duke.edu/education/ccp/materials/mvcalc/green // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License of the Free Software Foundation for // details. Compile with // javac -O instrument.java comment.java wheel.java curve.java planimeter.java import java.lang.Math; import java.awt.*; class instrument { private int h,w; private int x,y,x1,y1; private double u,v,u1,v1; private int i,j; // indices private int wr; // wheel radius private int wf; // number vectors in each dimension private int x_cen,y_cen; // instrument center private int a,b,a1,b1; // knew center private int c,d,c1,d1; private double aa,bb,aa1,bb1; private int a_old,b_old; private int c_old,d_old; private int x_old,y_old; private double r,r1; private double l; // knee length of instrument private int left_border=80; // left border for menu public instrument(int width,int height) { this.w = width; this.h = height; wr = (int) w/70; wf = 3; l = (int) w/4; x_cen = w/2; y_cen = h/2; x = x_cen+100; y = y_cen; } public void set_pointer(int x, int y) { this.x = x; this.y = y; } public void set_pointer2(int x, int y) { this.x = x+100; this.y = y+100; } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0,0,w,h); } public void update( Graphics g ) { if (x_old>left_border) { g.setColor(new Color(0,0,0)); // erase old center for (i=0; i<5; i++) { g.drawOval(x_cen-3*i,y_cen-3*i,6*i,6*i); } g.drawOval(x_cen-1,y_cen-1,2,2); g.setColor(Color.black ); // erase old planimeter for (i=-1; i<2; i++) for (j=-1;j<2; j++) { g.drawLine(x_cen+i, y_cen+j,a_old+i, b_old+j); g.drawLine(a_old+i, b_old+j, x_old+i, y_old+j); } g.drawOval(x_old-wr, y_old-wr, 2*wr, 2*wr); g.drawOval(a_old-4,b_old-4,8,8); g.drawOval(x-1,y-1,2,2); g.drawOval(a-1,b-1,2,2); g.drawLine(x_old,y_old,c_old,d_old); for (i=-wf; i(2*l)) { r1=2*l; }; if (r1==0) {r1=1; } aa1 = r1/2; bb1=Math.sqrt( l*l-r1*r1/4 ); a1 = (int) (w/2+( aa1*u1 + bb1*v1)/r1); b1 = (int) (h/2+(-bb1*u1 + aa1*v1)/r1); c1 = (int) (x1+15*(y1-b1)/l); d1 = (int) (y1-15*(x1-a1)/l); g.setColor(Color.black); g.drawLine(x1,y1,c1,d1); g.drawOval(c1-1,d1-1,2,2); } } } } // end if bracket if (x>left_border) { // don't draw over menu u = (x-w/2); v = (y-h/2); // calculate new situation r = Math.sqrt(u*u+v*v); if (r>(2*l)) { r=2*l; }; if (r==0) {r=1; } aa = r/2; bb=Math.sqrt( l*l-r*r/4 ); a = (int) (w/2+( aa*u + bb*v)/r); b = (int) (h/2+(-bb*u + aa*v)/r); c = (int) (x+15*(y-b)/l); d = (int) (y-15*(x-a)/l); for (i=-wf; i(2*l)) { r1=2*l; }; if (r1==0) {r1=1; } aa1 = r1/2; bb1=Math.sqrt( l*l-r1*r1/4 ); a1 = (int) (w/2+( aa1*u1 + bb1*v1)/r1); b1 = (int) (h/2+(-bb1*u1 + aa1*v1)/r1); c1 = (int) (x1+15*(y1-b1)/l); d1 = (int) (y1-15*(x1-a1)/l); g.setColor(new Color(255,155,0)); g.drawLine(x1,y1,c1,d1); g.setColor(new Color(255,255,0)); g.drawOval(c1-1,d1-1,2,2); } } } g.setColor(new Color(0,0,255)); // draw new planimeter for (i=-1; i<2; i++) for (j=-1;j<2; j++) { g.drawLine(x_cen+i, y_cen+j, a+i, b+j); g.drawLine(a+i, b+j, x+i, y+j ); } g.setColor(new Color(120,120,255)); g.drawOval(a-4,b-4,8,8); g.setColor(new Color(255,255,255)); g.drawOval(x_cen-1,y_cen-1,2,2); g.drawOval(x-1,y-1,2,2); g.drawOval(a-1,b-1,2,2); g.setColor(new Color(127,127,255)); g.drawOval(x-wr, y-wr, 2*wr, 2*wr); g.setColor(new Color(255,155,0)); g.drawLine(x,y,c,d); g.setColor(new Color(255,255,0)); g.drawOval(c-1,d-1,2,2); for (i=0; i<5; i++) { // draw center g.setColor(new Color(50*i,50*i,255)); g.drawOval(x_cen-3*i,y_cen-3*i,6*i,6*i); } g.setColor(new Color(200,200,255)); g.drawOval(x_cen-1,y_cen-1,2,2); } // end if bracket a_old=a; b_old=b; // store old situation x_old=x; y_old=y; c_old=c; d_old=d; } }