import java.applet.Applet; import java.awt.*; import java.lang.*; public class Deriv extends Applet { DerivPanel mainpanel; Button restartButton, newStartButton, answerButton, errorButton; String buttonStatus, buttonOptions; Panel buttonpanel = new Panel(); int point,temp; boolean startedDraw=false, doneDrawing=false, drawAnswer=false, fill=false, defaultCurve=true; public void init() { mainpanel = new DerivPanel(); setLayout(new BorderLayout()); add("Center",mainpanel); mainpanel.init(); add("South",buttonpanel); buttonpanel.setLayout(new GridLayout(1,4)); restartButton = new Button("A. Original start"); buttonpanel.add(restartButton); newStartButton = new Button("B. New start"); buttonpanel.add(newStartButton); answerButton = new Button("C. Answer (derivative)"); buttonpanel.add(answerButton); errorButton = new Button("D. Show Error"); buttonpanel.add(errorButton); buttonStatus = "justCurve"; } public boolean action(Event e, Object o) { if (e.target.equals(restartButton)) {point=0; startedDraw = false; doneDrawing = false; drawAnswer=false; fill=false; defaultCurve=true; buttonStatus ="justCurve"; mainpanel.init(); } if (e.target.equals(newStartButton)) {mainpanel.components=!mainpanel.components; point=0; startedDraw = false; doneDrawing = false; drawAnswer=false; fill=false; defaultCurve=false; buttonStatus = "justCurve"; mainpanel.init(); } if (e.target.equals(answerButton) && (buttonStatus=="justCurve" || buttonStatus=="finishedDraw")) {drawAnswer=true; if (doneDrawing==true) {buttonStatus="all3";} else {buttonStatus="justCorrect";} doneDrawing=false; } if (e.target.equals(errorButton)) { if (drawAnswer==true && buttonStatus=="all3") {fill=true; buttonStatus="filled"; }} mainpanel.repaint(); return true; } public class DerivPanel extends Panel { // int transx(double x) {return (int) (5.5+x*31);} // int transy(double y) {return (int) (188.5-y*31);} double a[]={0.0,0.0,0.0,0.0,0.0,0.0}, b[]={0.0,0.0,0.0,0.0,0.0,0.0}, c[]={0.0,0.0,0.0,0.0,0.0,0.0}, d[]={0.0,0.0,0.0,0.0,0.0,0.0}; double aa[]={0.0,0.0,0.0,0.0,0.0,0.0}, bb[]={0.0,0.0,0.0,0.0,0.0,0.0}, cc[]={0.0,0.0,0.0,0.0,0.0,0.0}, dd[]={0.0,0.0,0.0,0.0,0.0,0.0}, ee[]={0.0,0.0,0.0,0.0,0.0,0.0}; int numzeros, doublezero, signum, zeroplace, zz, temp; double zeros[]={0.0,0.0,0.0,0.0,0.0,0.0}; double maxx=19.0; double maxloc, maxvalue, miny, maxy, x, y, x2, y2, shift, area; // boolean startedDraw = false, doneDrawing = false; int[] xx = new int[600]; int[] yy= new int[600]; int[] xxt = new int[600]; int[] yyt = new int[600]; int[] xxx = new int[600]; int[] yyy= new int[600]; // int point; Image back; Graphics bg; Dimension bsize = size(); boolean components=false; boolean busy = false; Color tan_col = new Color(.9f,.8f,.6f); public void init() { buttonStatus = "justCurve"; maxy=11.0; miny=-11.0; while (maxy-miny>12){ //get to fit vertically (omits troublesome about 5%) if (defaultCurve) { numzeros=4; zeros[0]=-1.0; zeros[numzeros+1]=maxx+1; for (int i=1;i<=numzeros;i++) zeros[i]=((double)i-0.5+((double)(i)/30.0))*maxx/numzeros; doublezero=3; signum=1; buttonStatus="justCurve"; } else { buttonStatus="justCurve"; numzeros=4; //if (Math.random()<.5) numzeros=3; zeros[0]=-0.5-Math.random()*2; zeros[numzeros+1]=maxx+.5+Math.random()*2; for (int i=1;i<=numzeros;i++) zeros[i]=((double)i-.5+(Math.random()-.5)*2/3)*maxx/numzeros; signum=1; if (Math.random()<.5) signum=-1; doublezero=(int)(Math.random()*numzeros+1); } for (int i=1;i<=numzeros+1;i++){ d[i]=-zeros[i-1]*zeros[i]; c[i]=zeros[i-1]+zeros[i]; b[i]=-1; a[i]=0; maxloc=(zeros[i]+zeros[i-1])/2; if (doublezero==i-1){ a[i]=b[i]; b[i]=c[i]-b[i]*zeros[i-1]; c[i]=d[i]-c[i]*zeros[i-1]; d[i]=-d[i]*zeros[i-1]; maxloc=(2*zeros[i]+zeros[i-1])/3; } if (doublezero==i){ a[i]=-b[i]; b[i]=-c[i]+b[i]*zeros[i]; c[i]=-d[i]+c[i]*zeros[i]; d[i]=d[i]*zeros[i]; maxloc=(zeros[i]+2*zeros[i-1])/3; } maxvalue=((a[i]*maxloc+b[i])*maxloc+c[i])*maxloc+d[i]; //normalize a[i]=a[i]/maxvalue*2*signum; b[i]=b[i]/maxvalue*2*signum; c[i]=c[i]/maxvalue*2*signum; d[i]=d[i]/maxvalue*2*signum; if (doublezero!=i) signum=-signum; } //antiderivative for (int i=1;i<=numzeros+1;i++){aa[i]=a[i]/4; bb[i]=b[i]/3; cc[i]=c[i]/2; dd[i]=d[i];} miny=0.0; maxy=0.0; y=0.0; for (int i=1;i<=numzeros+1;i++){ x=zeros[i-1]; ee[i]=y-((((aa[i]*x+bb[i])*x+cc[i])*x+dd[i])*x); x=zeros[i]; y=(((aa[i]*x+bb[i])*x+cc[i])*x+dd[i])*x+ee[i]; miny=Math.min(miny,y); maxy=Math.max(maxy,y); } } shift=(miny+maxy)/2; for (int i=1;i<=numzeros+1;i++) ee[i]=ee[i]-shift ; components=false; reset(); } DerivPanel(){} public void reset() { repaint(); } public boolean mouseDown(Event e, int x, int y) { if (startedDraw==false && x<5 && !drawAnswer) {buttonStatus = "startedDraw"; startedDraw=true; point=1; xx[point]=x; yy[point]=y; } else { if (startedDraw==true && x>xx[point] && doneDrawing==false) {point=point+1; xx[point]=x; yy[point]=y; buttonStatus = "startedDraw"; } } if (startedDraw==true && x>579) {doneDrawing=true; buttonStatus = "finishedDraw"; } repaint(); return true; } public boolean mouseDrag(Event e, int x, int y) { if (startedDraw==false && x<5 && !drawAnswer) {startedDraw=true; point=1; xx[point]=x; yy[point]=y; buttonStatus = "startedDraw"; } else { if (startedDraw==true && x>xx[point] && doneDrawing==false) {point=point+1; xx[point]=x; yy[point]=y; buttonStatus = "startedDraw"; } } if (startedDraw==true && x>579) {doneDrawing=true; buttonStatus = "finishedDraw"; } repaint(); return true; } public void update(Graphics g) { if (!busy) { busy = true; paint(g); } } public void paint(Graphics g) { if (back == null || bsize.width!=size().width || bsize.height!=size().height) { back = createImage(size().width, size().height); bsize = size(); bg = back.getGraphics(); } if (back != null) { dopaint(bg); g.drawImage(back,0,0,this); } else { dopaint(g); } done(); } public void dopaint(Graphics g) { g.setColor(Color.white); g.setFont(new Font("Dialog",0,15)); g.fillRect(0,0,size().width,size().height); g.setColor(Color.blue); for (int i=1; i<=numzeros+1; i++){ double stepsize=(zeros[i]-zeros[i-1])/20; for (int stepnum=0; stepnum<20; stepnum++){ x=zeros[i-1]+stepnum*stepsize; y=(((aa[i]*x+bb[i])*x+cc[i])*x+dd[i])*x+ee[i]; x2=x+stepsize; y2=(((aa[i]*x2+bb[i])*x2+cc[i])*x2+dd[i])*x2+ee[i]; g.drawLine((int)(5.5+x*31),(int)(188-y*31),(int)(5.5+x2*31),(int)(188-y2*31)); g.drawLine((int)(5.5+x*31),(int)(189-y*31),(int)(5.5+x2*31),(int)(189-y2*31)); } } g.setColor(Color.black); g.drawRect(0,0,599,376); //boxit //axes g.drawLine(4,188,595,188); g.drawLine(4,187,595,187); g.drawLine(4,189,595,189); g.drawLine(5,4,5,372); g.drawLine(4,126,595,126); g.drawLine(4,250,595,250); g.drawString("2",7,124); g.drawString("-2",7,248); g.drawString("0",7,185); for (int i = 2; i<20; i+=2) { int y=5+31*i; g.drawLine(y,193,y,183); g.drawString(""+i,y,182); } g.setColor(Color.black); String s; if (defaultCurve) s = "Original Curve"; else s = "New Random Curve"; g.drawString(s,10,20); g.setColor(Color.red); if (startedDraw) {for (int i=2; i<=point; i++) g.drawLine(xx[i-1],yy[i-1],xx[i],yy[i]);} if (drawAnswer) {g.setColor(Color.green); for (int i=1; i<=numzeros+1; i++){ double stepsize=(zeros[i]-zeros[i-1])/20; for (int stepnum=0; stepnum<20; stepnum++){ x=zeros[i-1]+stepnum*stepsize; y=((a[i]*x+b[i])*x+c[i])*x+d[i]; x2=x+stepsize; y2=((a[i]*x2+b[i])*x2+c[i])*x2+d[i]; g.drawLine((int)(5.5+x*31),(int)(188.5-y*31),(int)(5.5+x2*31),(int)(188.5-y2*31)); } } if (fill){temp=0; for (int i=1;i<=point;i++){temp++; xxt[temp]=xx[i]; yyt[temp]=yy[i]; if (i=5.5+31*zeros[zeroplace+1]) zeroplace++ ; xxx[i]=xx[i]; x=((double)(xx[i])-5.5)/31.0; zz=zeroplace+1; yyy[i]=(int)(188.5-(((a[zz]*x+b[zz])*x+c[zz])*x+d[zz])*31); g.drawLine(xx[i],yy[i],xxx[i],yyy[i]); } area=0; for (int i=1;i