// // trigDrill1.java // trigDrill1 // // Created by Chris Thiel on 2/4/05. // Copyright (c) 2005 Chris Thiel. All rights reserved. // A simple Java applet for practicing exact values // of trig ratios of special angles // import java.awt.*; import java.applet.*; import java.lang.*; import java.awt.Graphics; import java.awt.Color; import java.awt.Event; import java.util.*; public class trigDrill1 extends Applet { int MAX=24; private String[] fName = new String[6]; // names of the 6 functions private String[] aName = new String[16]; // names of 5 angles private String[] rName = new String[20]; // names of 20 ratios private Rectangle[] b = new Rectangle[20]; // button rectangles Date today; long dStart,dEnd; int diff; boolean ShowScore=true; boolean ShowMore=false; boolean AcuteOnly=true; boolean EasyFunctions=true; private Color[] buttonColor = new Color[3]; private int [][] k = new int [6][16]; //answer key private int [][] e = new int [6][16]; // error grid int buttonWidth=85; int buttonHeight=40; int Correct, Incorrect, a, f; double accuracy, n, avg, sd,ss,acc; Rectangle Reset, Next, EA, EF, More, Done ; private Image img = null; String message = "Trig Drill 1!"; String lastQuestion; private Font font = new Font("serif", Font.ITALIC + Font.BOLD, 36); Font Hel = new Font("Helvetica",1,14); public void init() { setLayout (null); lastQuestion=" "; setBackground(new Color(0xF0F0D0)); img = getImage(getCodeBase(), "drill.gif"); for (int i=0;i<6;i++) for (int j=0;j<16;j++)e[i][j]=0; //clear error grid // answer key: //sine k[0][0]=0; k[0][1]=1; k[0][2]=3; k[0][3]=4; k[0][4]=5; k[0][5]=4; k[0][6]=3; k[0][7]=1; k[0][8]=0; k[0][9]=11; k[0][10]=13; k[0][11]=14; k[0][12]=15; k[0][13]=14; k[0][14]=13; k[0][15]=11; //cosine k[1][0]=5; k[1][1]=4; k[1][2]=3; k[1][3]=1; k[1][4]=0; k[1][5]=11; k[1][6]=13; k[1][7]=14; k[1][8]=15; k[1][9]=14; k[1][10]=13; k[1][11]=11; k[1][12]=0; k[1][13]=1; k[1][14]=3; k[1][15]=4; //tan k[2][0]=0; k[2][1]=2; k[2][2]=5; k[2][3]=7; k[2][4]=10; k[2][5]=17; k[2][6]=15; k[2][7]=12; k[2][8]=0; k[2][9]=2; k[2][10]=5; k[2][11]=7; k[2][12]=10; k[2][13]=17; k[2][14]=15; k[2][15]=12; //csc k[3][0]=10; k[3][1]=6; k[3][2]=8; k[3][3]=9; k[3][4]=5; k[3][5]=9; k[3][6]=8; k[3][7]=6; k[3][8]=10; k[3][9]=16; k[3][10]=18; k[3][11]=19; k[3][12]=15; k[3][13]=19; k[3][14]=18; k[3][15]=16; //sec k[4][0]=5; k[4][1]=9; k[4][2]=8; k[4][3]=6; k[4][4]=10; k[4][5]=16; k[4][6]=18; k[4][7]=19; k[4][8]=15; k[4][9]=19; k[4][10]=18; k[4][11]=16; k[4][12]=10; k[4][13]=6; k[4][14]=8; k[4][15]=9; //cot k[5][0]=10; k[5][1]=7; k[5][2]=5; k[5][3]=2; k[5][4]=0; k[5][5]=12; k[5][6]=15; k[5][7]=17; k[5][8]=10; k[5][9]=7; k[5][10]=5; k[5][11]=2; k[5][12]=0; k[5][13]=12; k[5][14]=15; k[5][15]=17; fName[0]="sin"; fName[1]="cos"; fName[2]="tan"; fName[3]="csc"; fName[4]="sec"; fName[5]="cot"; // \u03c0 is the Pi symbol aName[0]="0"; aName[1]="\u03c0"+"/6"; aName[2]="\u03c0"+"/4"; aName[3]="\u03c0"+"/3"; aName[4]="\u03c0"+"/2"; aName[5]="2\u03c0"+"/3"; aName[6]="3\u03c0"+"/4"; aName[7]="5\u03c0"+"/6"; aName[8]="\u03c0"; aName[9]="7\u03c0"+"/6"; aName[10]="5\u03c0"+"/4"; aName[11]="4\u03c0"+"/3"; aName[12]="3\u03c0/2"; aName[13]="5\u03c0"+"/3"; aName[14]="7\u03c0"+"/4"; aName[15]="11\u03c0"+"/6"; // \u221A is the square root symbol rName[0]=" 0 "; rName[1]="1/2"; rName[2]="\u221A3/3"; rName[3]="\u221A2/2"; rName[4]="\u221A3/2"; rName[5]=" 1 "; rName[9]="2\u221A3/3"; rName[7]="\u221A3"; rName[8]="\u221A2"; rName[6]=" 2 "; rName[10]="undef."; rName[11]="-1/2"; rName[12]="-\u221A3/3"; rName[13]="-\u221A2/2"; rName[14]="-\u221A3/2"; rName[15]=" -1 "; rName[19]="-2\u221A3/3"; rName[17]="-\u221A3"; rName[18]="-\u221A2"; rName[16]=" -2 "; //Initailize the timing variables today = new Date(); dStart=today.getTime(); //setup the buttons and such buttonColor[0] = new Color( 200,250, 220); //positive numbers buttonColor[1] = new Color( 250,200, 220); //negative number buttonColor[2] = new Color( 200,200, 250); Reset= new Rectangle (40, 210, 100,25); More = new Rectangle (170, 210, 100, 25); Done = new Rectangle (size().width-130, size().height-40, 115, 25); Next= new Rectangle ( 300, 210, 160,25); EA = new Rectangle (465, 85, 10,10); EF = new Rectangle (465, 105, 10,10); for (int i=0;i<5;i++) { b[i] = new Rectangle (15+i*(buttonWidth+10),size().height-4*(buttonHeight+10)-10, buttonWidth, buttonHeight); b[i+5] = new Rectangle (15+i*(buttonWidth+10),size().height-3*(buttonHeight+10)-10, buttonWidth, buttonHeight); b[i+10] = new Rectangle (15+i*(buttonWidth+10),size().height-2*(buttonHeight+10)-10, buttonWidth, buttonHeight); b[i+15] = new Rectangle (15+i*(buttonWidth+10),size().height-(buttonHeight+10)-10, buttonWidth, buttonHeight); } repaint(); } public void paint (Graphics g) { g.setColor(Color.blue); g.setFont(font); g.drawImage (img, 0,0,null); if (ShowScore && !ShowMore){ // Then we need to draw the basic statistics/Start screen // Show Stats g.drawString(message, 80, 40); g.setColor(Color.red); g.setFont(font); g.drawString(message, 80, 40); g.setFont(Hel); g.setColor(Color.blue); g.drawString(lastQuestion, 150, 65); g.setFont(font); g.setColor(Color.black); g.drawString("Number Correct: "+Correct,40, 100); g.drawString("Number Incorrect: "+Incorrect,15, 140); g.drawString(" "+accuracy+"%",250, 180); g.drawString("When correct, ",15, 280); g.drawString("Average Time: "+avg,121, 320); g.drawString("Standard Deviation: "+sd,35, 360); // Draw easy angles / functions g.setFont(new Font("Helvetica",1,12)); g.setColor(Color.orange); g.fillRect(360, 75, 130, 50); g.setColor(Color.black); g.drawRect(EA.x, EA.y, EA.width, EA.height); g.drawRect(EF.x, EF.y, EF.width, EF.height); if (AcuteOnly) { g.drawLine(EA.x, EA.y, EA.x+10, EA.y+10); g.drawLine(EA.x, EA.y+10, EA.x+10, EA.y); } if (EasyFunctions) { g.drawLine(EF.x, EF.y, EF.x+10, EF.y+10); g.drawLine(EF.x, EF.y+10, EF.x+10, EF.y); } g.drawString("Easy Angles", 385, 95); g.drawString("Easy Functions", 370, 115); g.setFont(font); //Draw reset mpre and next buttons g.setColor( buttonColor[2]); g.fill3DRect(Reset.x, Reset.y, Reset.width, Reset.height,true); g.fill3DRect(Next.x, Next.y, Next.width, Next.height,true); g.fill3DRect(More.x, More.y, More.width, More.height,true); g.setColor( Color.black); g.draw3DRect(Reset.x, Reset.y, Reset.width, Reset.height,true); g.draw3DRect(Next.x, Next.y, Next.width, Next.height,true); g.draw3DRect(More.x, More.y, More.width, More.height,true); g.setColor(Color.blue); g.setFont(Hel); g.drawString("Reset Stats", Reset.x+10,Reset.y+17); g.drawString("Start Next Question", Next.x+10,Next.y+17); g.drawString("More Stats", More.x+10,More.y+17); }else if (ShowScore && ShowMore){ // Show the grid of errors g.setColor(new Color(0xFAFADA)); for (int j=0;j<16;j=j+2) {g.fillRect(80+j*25, 80, 25, 220);} g.setColor(Color.black); g.setFont(font); g.drawString("Frequecy of Mistakes", 80, 50); g.setFont(new Font("serif", Font.ITALIC + Font.BOLD, 12)); for(int j=0;j<16;j=j+2) {g.drawString(" "+aName[j], 80+j*25, 100);} for(int j=1;j<16;j=j+2) {g.drawString(" "+aName[j], 80+j*25, 117);} g.setFont(Hel); for (int i=0;i<6;i++){ g.drawString(" "+fName[i], 30, 140+i*30); for (int j=0;j<16;j++){ g.drawString (" "+e[i][j] , 90+j*25, 140+i*30); } } g.setColor( buttonColor[1]); g.fill3DRect(Done.x, Done.y, Done.width, Done.height,true); g.setColor( Color.black); g.draw3DRect(Done.x, Done.y, Done.width, Done.height,true); g.setColor(Color.blue); g.setFont(Hel); g.drawString("Okay Already", Done.x+10,Done.y+17); }else{ // We need to draw the question/Answer screen g.drawString(fName[f]+"("+aName[a]+") = ?", 150,110); //Draw the 20 answer buttons for student to chose for (int i=0;i<20;i++){ g.setColor( buttonColor[i/10]); g.fill3DRect(b[i].x, b[i].y, b[i].width, b[i].height,true); g.setColor( Color.black); g.draw3DRect(b[i].x, b[i].y, b[i].width, b[i].height,true); g.setColor(Color.blue); g.setFont(Hel); g.drawString(rName[i], b[i].x+(int)(.3*buttonWidth),b[i].y+7+buttonHeight/2); } }// end of question answer screen }// end of paint subroutine public void updateStats(boolean right, int t){ if (right) { Correct++; n=1.0*Correct; double tm=100*t/100000.0; acc=acc+tm; ss= ss+ tm*tm; avg= acc/n; message="Yes! \ntime="+tm+" sec"; sd= Math.sqrt((n*ss-acc*acc)/(n*(n-1))); } else { Incorrect++; e[f][a]=e[f][a]+1; // increase the error counter message="No... "+fName[f]+"("+aName[a]+") \u2260 "+rName[t]; } accuracy=(int)(1000*Correct/(Correct+Incorrect))/10.0; } public void flushData() { Correct=0; Incorrect=0; avg=0.0; //percent correct sd=0.0; // sd of reaction time n=0.0; // number of attempts acc=0.0; // sum of accurate response times ss=0.0; // sum of squares of accurate response times accuracy=0; for(int i=0;i<6;i++){for (int j=0;j<16;j++){ e[i][j]=0;}} // clear error counter } ////////////////////// // MOUSE STUFF ///////////////////// public boolean mouseDown(java.awt.Event e, int x, int y){ if (ShowScore && !ShowMore && Reset.inside(x,y)){ flushData(); }else if (ShowScore && !ShowMore && More.inside(x,y)){ ShowMore=true; }else if (ShowScore && ShowMore && Done.inside(x,y)){ ShowMore=false; }else if (ShowScore && !ShowMore && Next.inside(x,y)){ ShowScore=false; if(EasyFunctions){ f = (int)(3*Math.random());//pick one of the 3 functions }else { f = (int)(6*Math.random());//pick one of the 6 functions } if(AcuteOnly) { a = (int)(5*Math.random());//pick one of the 5 angles }else { a = (int)(16*Math.random()); // pick one of the 16 angles } lastQuestion=fName[f]+"("+aName[a]+") = "+rName[k[f][a]]; //reset stopwatch today = new Date(); dStart=today.getTime(); }else if (ShowScore && !ShowMore && EA.inside(x,y)){ AcuteOnly=!AcuteOnly; flushData(); }else if (ShowScore && !ShowMore && EF.inside(x,y)){ EasyFunctions=!EasyFunctions; flushData(); }else if (!ShowScore && b[0].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==0){ updateStats(true, diff); }else{ updateStats(false, 0); } ShowScore=true; }else if (!ShowScore && b[1].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==1){ updateStats(true, diff); }else{ updateStats(false, 1); } ShowScore=true; }else if (!ShowScore && b[2].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==2){ updateStats(true, diff); }else{ updateStats(false, 2); } ShowScore=true; }else if (!ShowScore && b[3].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==3){ updateStats(true, diff); }else{ updateStats(false, 3); } ShowScore=true; }else if (!ShowScore && b[4].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==4){ updateStats(true, diff); }else{ updateStats(false, 4); } ShowScore=true; }else if (!ShowScore && b[5].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==5){ updateStats(true, diff); }else{ updateStats(false, 5); } ShowScore=true; }else if (!ShowScore && b[6].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==6){ updateStats(true, diff); }else{ updateStats(false, 6); } ShowScore=true; }else if (!ShowScore && b[7].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==7){ updateStats(true, diff); }else{ updateStats(false, 7); } ShowScore=true; }else if (!ShowScore && b[8].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==8){ updateStats(true, diff); }else{ updateStats(false, 8); } ShowScore=true; }else if (!ShowScore && b[9].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==9){ updateStats(true, diff); }else{ updateStats(false, 9); } ShowScore=true; }else if (!ShowScore && b[10].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==10){ updateStats(true, diff); }else{ updateStats(false, 10); } ShowScore=true; }else if (!ShowScore && b[11].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==11){ updateStats(true, diff); }else{ updateStats(false, 11); } ShowScore=true; }else if (!ShowScore && b[12].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==12){ updateStats(true, diff); }else{ updateStats(false, 12); } ShowScore=true; }else if (!ShowScore && b[13].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==13){ updateStats(true, diff); }else{ updateStats(false, 13); } ShowScore=true; }else if (!ShowScore && b[14].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==14){ updateStats(true, diff); }else{ updateStats(false, 14); } ShowScore=true; }else if (!ShowScore && b[15].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==15){ updateStats(true, diff); }else{ updateStats(false, 15); } ShowScore=true; }else if (!ShowScore && b[16].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==16){ updateStats(true, diff); }else{ updateStats(false, 16); } ShowScore=true; }else if (!ShowScore && b[17].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==17){ updateStats(true, diff); }else{ updateStats(false, 17); } ShowScore=true; }else if (!ShowScore && b[18].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==18){ updateStats(true, diff); }else{ updateStats(false, 18); } ShowScore=true; }else if (!ShowScore && b[19].inside(x,y)){ //record the time today = new Date(); dEnd=today.getTime(); diff=(int)(dEnd-dStart); // check for accuracy if (k[f][a]==19){ updateStats(true, diff); }else{ updateStats(false, 19); } ShowScore=true; } repaint(); return true; }//end of mouseDown public boolean mouseMove(java.awt.Event e, int x, int y) { return true; } public void mouseEnter() { repaint(); } public void mouseExit() { repaint(); } }// end of applet