/* * This is the CurveControl class for the Famous Curves applet. * It controls the actions of a CurvePanel object (and also the * CurvePanel's Curve). * Author: Ben Soares < bs@st-and.ac.uk > * */ import java.awt.*; import java.applet.*; import java.util.Vector; public class CurveControls extends Panel { // member variables CurvePanel curvepanel; Panel cards; Panel textcard; Panel controlcard; int cardposx = 0; int cardposy = 0; int showing; Choice curvechoice; TextPanel textpanel; final static String TEXTCARD = "textcard"; final static String CONTROLCARD = "controlcard"; Choice show; Choice reset; Button zoomin; Button zoomout; Button nozoom; PointButton up; PointButton down; PointButton left; PointButton right; PointButton centre; boolean parameters; boolean ap = false; boolean bp = false; boolean cp = false; boolean dp = false; boolean ep = false; boolean fp = false; boolean hp = false; boolean kp = false; boolean mp = false; boolean np = false; boolean pp = false; PointButton aleft = new PointButton("West", 10); Label alabel = new Label("a", Label.LEFT); PointButton aright = new PointButton("East", 10); PointButton bleft = new PointButton("West", 10); Label blabel = new Label("b", Label.LEFT); PointButton bright = new PointButton("East", 10); PointButton cleft = new PointButton("West", 10); Label clabel = new Label("c", Label.LEFT); PointButton cright = new PointButton("East", 10); PointButton dleft = new PointButton("West", 10); Label dlabel = new Label("d", Label.LEFT); PointButton dright = new PointButton("East", 10); PointButton eleft = new PointButton("West", 10); Label elabel = new Label("e", Label.LEFT); PointButton eright = new PointButton("East", 10); PointButton fleft = new PointButton("West", 10); Label flabel = new Label("f", Label.LEFT); PointButton fright = new PointButton("East", 10); PointButton hleft = new PointButton("West", 10); Label hlabel = new Label("h", Label.LEFT); PointButton hright = new PointButton("East", 10); PointButton kleft = new PointButton("West", 10); Label klabel = new Label("k", Label.LEFT); PointButton kright = new PointButton("East", 10); PointButton mleft = new PointButton("West", 10); Label mlabel = new Label("m", Label.LEFT); PointButton mright = new PointButton("East", 10); PointButton nleft = new PointButton("West", 10); Label nlabel = new Label("n", Label.LEFT); PointButton nright = new PointButton("East", 10); PointButton pleft = new PointButton("West", 10); Label plabel = new Label("p", Label.LEFT); PointButton pright = new PointButton("East", 10); double paramincrement = 0.1; // parameter increment PointButton piup = new PointButton("North", 10); Label pilabel = new Label("inc", Label.CENTER); PointButton pidown = new PointButton("South", 10); // CurveControls constructor methods (2) public CurveControls(CurvePanel curvepanel) { this.parameters = false; this.curvepanel = curvepanel; this.showing = 0; setBackground(Color.lightGray); GridBagLayout gb = new GridBagLayout(); setFont(new Font("Helvetica", Font.PLAIN, 10)); setLayout(gb); this.curvechoice = new Choice(); curvechoice.addItem("Curve"); curvechoice.addItem("Evolute"); curvechoice.addItem("Involute"); curvechoice.addItem("Inverse"); curvechoice.addItem("Pedal"); curvechoice.addItem("Negative Pedal"); curvechoice.addItem("Caustic (radial)"); curvechoice.addItem("Caustic (parallel)"); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(curvechoice, c); add(curvechoice); this.show = new Choice(); show.addItem("Controls"); show.addItem("Instructions"); show.addItem("Definition"); c.weightx = 0.0; c.weighty = 0.0; c.gridx = 1; c.gridy = 1; c.gridwidth = 1; gb.setConstraints(show, c); add(show); this.reset = new Choice(); reset.addItem("Slow"); reset.addItem("Medium"); reset.addItem("Fast"); reset.addItem("RESET"); c.gridx = 0; c.gridy = 2; c.gridwidth = 1; gb.setConstraints(reset, c); add(reset); Vector temp = new Vector(2); temp.addElement("Choose an associated curve"); temp.addElement("from the list on the left."); this.textpanel = new TextPanel(temp); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 1.0; c.gridx = 1; c.gridy = 0; c.gridwidth = 1; c.gridheight = 3; gb.setConstraints(textpanel, c); add(textpanel); this.zoomin = new Button("+10%"); c.fill = GridBagConstraints.NONE; c.weightx = 0.0; c.weighty = 0.0; c.gridx = 2; c.gridy = 0; c.gridwidth = 1; c.gridheight = 1; gb.setConstraints(zoomin, c); add(zoomin); this.nozoom = new Button("100%"); c.gridy = 1; gb.setConstraints(nozoom, c); add(nozoom); this.zoomout = new Button("-10%"); c.gridy = 2; gb.setConstraints(zoomout, c); add(zoomout); this.up = new PointButton("North", 10); c.gridx = 4; c.gridy = 0; c.fill = GridBagConstraints.NONE; gb.setConstraints(up, c); add(up); this.left = new PointButton("West", 10); c.gridx = 3; c.gridy = 1; gb.setConstraints(left, c); add(left); this.right = new PointButton("East", 10); c.gridx = 5; gb.setConstraints(right, c); add(right); this.down = new PointButton("South", 10); c.gridx = 4; c.gridy = 2; gb.setConstraints(down, c); add(down); this.centre = new PointButton("Square", 10); c.gridy = 1; gb.setConstraints(centre, c); add(centre); validate(); } /* end of constructor method 1 */ // beginning of constructor method 2 (recommended use) public CurveControls(CurvePanel curvepanel, boolean ap, boolean bp, boolean cp, boolean dp, boolean ep, boolean fp, boolean hp, boolean kp, boolean mp, boolean np, boolean pp) { this.curvepanel = curvepanel; this.showing = 0; this.ap = ap; this.bp = bp; this.cp = cp; this.dp = dp; this.ep = ep; this.fp = fp; this.hp = hp; this.kp = kp; this.mp = mp; this.np = np; this.pp = pp; this.parameters = true; int numberofparameters = 0; if (ap) { numberofparameters++; } if (bp) { numberofparameters++; } if (cp) { numberofparameters++; } if (dp) { numberofparameters++; } if (ep) { numberofparameters++; } if (fp) { numberofparameters++; } if (hp) { numberofparameters++; } if (kp) { numberofparameters++; } if (mp) { numberofparameters++; } if (np) { numberofparameters++; } if (pp) { numberofparameters++; } setBackground(Color.lightGray); GridBagLayout gb = new GridBagLayout(); setFont(new Font("Helvetica", Font.PLAIN, 10)); setLayout(gb); this.cards = new Panel(); cards.setLayout(new CardLayout()); this.textcard = new Panel(); GridBagLayout tcgb = new GridBagLayout(); textcard.setLayout(tcgb); this.controlcard = new Panel(); GridBagLayout ccgb = new GridBagLayout(); controlcard.setLayout(ccgb); this.curvechoice = new Choice(); curvechoice.addItem("Curve"); curvechoice.addItem("Evolute"); curvechoice.addItem("Involute"); curvechoice.addItem("Inverse"); curvechoice.addItem("Pedal"); curvechoice.addItem("Negative Pedal"); curvechoice.addItem("Caustic (radial)"); curvechoice.addItem("Caustic (parallel)"); GridBagConstraints c = new GridBagConstraints(); c.gridx = 1; c.gridy = 0; c.weightx = 1; c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.HORIZONTAL; gb.setConstraints(curvechoice, c); add(curvechoice); Label blank0 = new Label(" "); c.gridx = 0; gb.setConstraints(blank0, c); add(blank0); Label blank1 = new Label(" "); c.gridx = 2; gb.setConstraints(blank1, c); add(blank1); this.show = new Choice(); show.addItem("Controls"); show.addItem("Instructions"); show.addItem("Definition"); c.gridx = 3; c.gridwidth = 1; gb.setConstraints(show, c); add(show); Label blank2 = new Label(" "); c.gridx = 4; gb.setConstraints(blank2, c); add(blank2); this.reset = new Choice(); reset.addItem("Slow"); reset.addItem("Medium"); reset.addItem("Fast"); reset.addItem("RESET"); c.gridx = 5; c.gridwidth = 1; gb.setConstraints(reset, c); add(reset); reset.select(1); Label blankr = new Label(" "); c.gridx = 6; gb.setConstraints(blankr, c); add(blankr); Vector temp = new Vector(2); temp.addElement("Choose an associated curve"); temp.addElement("from the list above left."); this.textpanel = new TextPanel(temp); c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.BOTH; tcgb.setConstraints(textpanel, c); textcard.add(textpanel); textcard.validate(); c = new GridBagConstraints(); c.anchor = GridBagConstraints.CENTER; c.insets = new Insets(1, 1, 1, 1); c.weightx = 1; c.weighty = 1; Label blank3 = new Label(" "); c.gridx = 4; c.gridy = 1; c.fill = GridBagConstraints.HORIZONTAL; ccgb.setConstraints(blank3, c); controlcard.add(blank3); Label blank4 = new Label(" "); c.gridx = c.gridx+2; ccgb.setConstraints(blank4, c); controlcard.add(blank4); c.fill = GridBagConstraints.NONE; this.zoomin = new Button("+10%"); c.gridx = c.gridx-1; c.gridy = Math.max(1, numberofparameters-2); ccgb.setConstraints(zoomin, c); controlcard.add(zoomin); this.nozoom = new Button("100%"); c.gridy = c.gridy+1; ccgb.setConstraints(nozoom, c); controlcard.add(nozoom); this.zoomout = new Button("-10%"); c.gridy = c.gridy+1; ccgb.setConstraints(zoomout, c); controlcard.add(zoomout); this.up = new PointButton("North", 10); c.gridx = c.gridx+3; c.gridy = c.gridy-2; ccgb.setConstraints(up, c); controlcard.add(up); this.left = new PointButton("West", 10); c.gridx = c.gridx-1; c.gridy = c.gridy+1; ccgb.setConstraints(left, c); controlcard.add(left); this.right = new PointButton("East", 10); c.gridx = c.gridx+2; ccgb.setConstraints(right, c); controlcard.add(right); this.down = new PointButton("South", 10); c.gridx = c.gridx-1; c.gridy = c.gridy+1; ccgb.setConstraints(down, c); controlcard.add(down); this.centre = new PointButton("Square", 10); c.gridy = c.gridy-1; ccgb.setConstraints(centre, c); controlcard.add(centre); c.gridy = Math.max(3, numberofparameters); c.gridwidth = 1; c.gridheight = 1; c.fill = GridBagConstraints.NONE; // next three items are the parameter increment controls and label if (numberofparameters>0) { c.anchor = GridBagConstraints.CENTER; c.gridx = 3; ccgb.setConstraints(pidown, c); controlcard.add(pidown); c.gridy -= 2; ccgb.setConstraints(piup, c); controlcard.add(piup); c.gridy++; c.fill = GridBagConstraints.HORIZONTAL; pilabel.setText(" inc="+paramincrement+" "); ccgb.setConstraints(pilabel, c); controlcard.add(pilabel); c.gridy++; } // next lot of ifs adds the parameter control buttons (starting at the bottom) if (pp) { plabel.setText(" p="+curvepanel.curve.p+" "); c.gridx = 0; ccgb.setConstraints(pleft, c); controlcard.add(pleft); c.gridx = 1; ccgb.setConstraints(plabel, c); controlcard.add(plabel); c.gridx = 2; ccgb.setConstraints(pright, c); controlcard.add(pright); c.gridy--; } if (np) { nlabel.setText(" n="+curvepanel.curve.n+" "); c.gridx = 0; ccgb.setConstraints(nleft, c); controlcard.add(nleft); c.gridx = 1; ccgb.setConstraints(nlabel, c); controlcard.add(nlabel); c.gridx = 2; ccgb.setConstraints(nright, c); controlcard.add(nright); c.gridy--; } if (mp) { mlabel.setText(" m="+curvepanel.curve.m+" "); c.gridx = 0; ccgb.setConstraints(mleft, c); controlcard.add(mleft); c.gridx = 1; ccgb.setConstraints(mlabel, c); controlcard.add(mlabel); c.gridx = 2; ccgb.setConstraints(mright, c); controlcard.add(mright); c.gridy--; } if (kp) { klabel.setText(" k="+curvepanel.curve.k+" "); c.gridx = 0; ccgb.setConstraints(kleft, c); controlcard.add(kleft); c.gridx = 1; ccgb.setConstraints(klabel, c); controlcard.add(klabel); c.gridx = 2; ccgb.setConstraints(kright, c); controlcard.add(kright); c.gridy--; } if (hp) { hlabel.setText(" h="+curvepanel.curve.h+" "); c.gridx = 0; ccgb.setConstraints(hleft, c); controlcard.add(hleft); c.gridx = 1; ccgb.setConstraints(hlabel, c); controlcard.add(hlabel); c.gridx = 2; ccgb.setConstraints(hright, c); controlcard.add(hright); c.gridy--; } if (fp) { flabel.setText(" f="+curvepanel.curve.f+" "); c.gridx = 0; ccgb.setConstraints(fleft, c); controlcard.add(fleft); c.gridx = 1; ccgb.setConstraints(flabel, c); controlcard.add(flabel); c.gridx = 2; ccgb.setConstraints(fright, c); controlcard.add(fright); c.gridy--; } if (ep) { elabel.setText(" e="+curvepanel.curve.e+" "); c.gridx = 0; ccgb.setConstraints(eleft, c); controlcard.add(eleft); c.gridx = 1; ccgb.setConstraints(elabel, c); controlcard.add(elabel); c.gridx = 2; ccgb.setConstraints(eright, c); controlcard.add(eright); c.gridy--; } if (dp) { dlabel.setText(" d="+curvepanel.curve.d+" "); c.gridx = 0; ccgb.setConstraints(dleft, c); controlcard.add(dleft); c.gridx = 1; ccgb.setConstraints(dlabel, c); controlcard.add(dlabel); c.gridx = 2; ccgb.setConstraints(dright, c); controlcard.add(dright); c.gridy--; } if (cp) { clabel.setText(" c="+curvepanel.curve.c+" "); c.gridx = 0; ccgb.setConstraints(cleft, c); controlcard.add(cleft); c.gridx = 1; ccgb.setConstraints(clabel, c); controlcard.add(clabel); c.gridx = 2; ccgb.setConstraints(cright, c); controlcard.add(cright); c.gridy--; } if (bp) { blabel.setText(" b="+curvepanel.curve.b+" "); c.gridx = 0; ccgb.setConstraints(bleft, c); controlcard.add(bleft); c.gridx = 1; ccgb.setConstraints(blabel, c); controlcard.add(blabel); c.gridx = 2; ccgb.setConstraints(bright, c); controlcard.add(bright); c.gridy--; } if (ap) { alabel.setText(" a="+curvepanel.curve.a+" "); c.gridx = 0; ccgb.setConstraints(aleft, c); controlcard.add(aleft); c.gridx = 1; ccgb.setConstraints(alabel, c); controlcard.add(alabel); c.gridx = 2; ccgb.setConstraints(aright, c); controlcard.add(aright); } controlcard.validate(); cards.add(CONTROLCARD, controlcard); cards.add(TEXTCARD, textcard); cards.validate(); c = new GridBagConstraints(); c.gridx = 1; c.gridy = 1; c.gridwidth = 5; c.gridheight = 2; c.fill = GridBagConstraints.BOTH; gb.setConstraints(cards, c); add(cards); validate(); } /* end of constructor methods */ // beginning of paint method public void paint(Graphics g) { } /* end of paint method */ // beginning of action method public boolean action(Event e, Object arg) { if (e.target instanceof Choice) { if (e.target == curvechoice) { int i = curvechoice.getSelectedIndex(); switch (i) { case 0: break; case 1: curvepanel.associatedcurve = curvepanel.curve.evolutePixels(); break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; } if (showing==0) { printcontrols(); } else if (showing==1) { printinstructions(i); } else if (showing==2) { printdefinition(i); } curvepanel.associatedcurveindex = i; curvepanel.pointstage = 0; curvepanel.circlestage = 0; curvepanel.clear = true; } else if (e.target == show) { showing = show.getSelectedIndex(); switch (showing) { case 0: printcontrols(); break; case 1: printinstructions(curvechoice.getSelectedIndex()); break; case 2: printdefinition(curvechoice.getSelectedIndex()); break; } } else if (e.target == reset) { switch(reset.getSelectedIndex()) { case 0: curvepanel.steps = 1; break; case 1: curvepanel.steps = 2; break; case 2: curvepanel.steps = 4; break; case 3: curvepanel.resetCurveParameters(); this.alabel.setText("a="+curvepanel.curve.a); this.blabel.setText("b="+curvepanel.curve.b); this.clabel.setText("c="+curvepanel.curve.c); this.dlabel.setText("d="+curvepanel.curve.d); this.elabel.setText("e="+curvepanel.curve.e); this.flabel.setText("f="+curvepanel.curve.f); this.hlabel.setText("h="+curvepanel.curve.h); this.klabel.setText("k="+curvepanel.curve.k); this.mlabel.setText("m="+curvepanel.curve.m); this.nlabel.setText("n="+curvepanel.curve.n); this.plabel.setText("p="+curvepanel.curve.p); curvepanel.curve.setCurve(); curvepanel.pointstage = 0; curvepanel.circlestage = 0; curvepanel.pointX = 0; curvepanel.pointY = 0; curvepanel.circleX = 0; curvepanel.circleY = 0; curvepanel.circleCX = 0; curvepanel.circleCY = 0; curvepanel.circleR = 0; curvepanel.associatedcurveindex = 0; curvepanel.clear = false; curvepanel.setaxis = false; curvepanel.steps = 1; this.reset.select(1); this.showing = 0; this.show.select(0); this.curvechoice.select(0); this.printcontrols(); break; } } } else if (e.target instanceof Button) { if (e.target == zoomin) { curvepanel.curve.scale(1.10); curvepanel.scale(1.10); } else if (e.target == zoomout) { curvepanel.curve.scale(0.90); curvepanel.scale(0.90); } else if (e.target == nozoom) { int sc = (int)(curvepanel.size().height/curvepanel.curve.yrange); double oldsc = curvepanel.curve.xsc; curvepanel.scale(sc/oldsc); curvepanel.curve.scale(sc/oldsc); } } if (e.target != show) { curvepanel.recalculate(); curvepanel.repaint(); } return true; } /* end of action method */ // mouseUp, mouseDrag and mouseDown methods (required to detect a PointButton depression) public boolean mouseDown(Event e, int mx, int my) { // these are the translation buttons if (e.target == up) { up.fill = true; up.repaint(); } else if (e.target == down) { down.fill = true; down.repaint(); } else if (e.target == left) { left.fill = true; left.repaint(); } else if (e.target == right) { right.fill = true; right.repaint(); } else if (e.target == centre) { centre.fill = true; centre.repaint(); // these are the parameter increment adjustment buttons } else if (e.target == piup) { piup.fill = true; piup.repaint(); } else if (e.target == pidown) { pidown.fill = true; pidown.repaint(); // these are the parameter adjustment buttons } else if (e.target == aleft) { aleft.fill = true; aleft.repaint(); } else if (e.target == aright) { aright.fill = true; aright.repaint(); } else if (e.target == bleft) { bleft.fill = true; bleft.repaint(); } else if (e.target == bright) { bright.fill = true; bright.repaint(); } else if (e.target == cleft) { cleft.fill = true; cleft.repaint(); } else if (e.target == cright) { cright.fill = true; cright.repaint(); } else if (e.target == dleft) { dleft.fill = true; dleft.repaint(); } else if (e.target == dright) { dright.fill = true; dright.repaint(); } else if (e.target == eleft) { eleft.fill = true; eleft.repaint(); } else if (e.target == eright) { eright.fill = true; eright.repaint(); } else if (e.target == fleft) { fleft.fill = true; fleft.repaint(); } else if (e.target == fright) { fright.fill = true; fright.repaint(); } else if (e.target == hleft) { hleft.fill = true; hleft.repaint(); } else if (e.target == hright) { hright.fill = true; hright.repaint(); } else if (e.target == kleft) { kleft.fill = true; kleft.repaint(); } else if (e.target == kright) { kright.fill = true; kright.repaint(); } else if (e.target == mleft) { mleft.fill = true; mleft.repaint(); } else if (e.target == mright) { mright.fill = true; mright.repaint(); } else if (e.target == nleft) { nleft.fill = true; nleft.repaint(); } else if (e.target == nright) { nright.fill = true; nright.repaint(); } else if (e.target == pleft) { pleft.fill = true; pleft.repaint(); } else if (e.target == pright) { pright.fill = true; pright.repaint(); } return true; } public boolean mouseDrag(Event e, int mx1, int my1) { int mx = mx1; int my = my1; // these are the translation buttons if (e.target == up) { if (up.inside(mx, my)) { up.fill = true; } else { up.fill = true; } up.repaint(); } else if (e.target == down) { if (down.inside(mx, my) ) { down.fill = false; } else { down.fill = true; } down.repaint(); } else if (e.target == left) { if (left.inside(mx, my) ) { left.fill = false; } else { left.fill = true; } left.repaint(); } else if (e.target == right) { if (right.inside(mx, my) ) { right.fill = false; } else { right.fill = true; } right.repaint(); } else if (e.target == centre) { if (centre.inside(mx, my) ) { centre.fill = false; } else { centre.fill = true; } centre.repaint(); // these are the parameter increment adjustment buttons } else if (e.target == piup) { if (piup.inside(mx, my) ) { piup.fill = false; } else { piup.fill = true; } piup.repaint(); } else if (e.target == pidown) { if (pidown.inside(mx, my) ) { pidown.fill = false; } else { pidown.fill = true; } pidown.repaint(); // these are the parameter adjustment buttons } else if (e.target == aleft) { if (aleft.inside(mx, my) ) { aleft.fill = false; } else { aleft.fill = true; } aleft.repaint(); } else if (e.target == aright) { if (aright.inside(mx, my) ) { aright.fill = false; } else { aright.fill = true; } aright.repaint(); } else if (e.target == bleft) { if (bleft.inside(mx, my) ) { bleft.fill = false; } else { bleft.fill = true; } bleft.repaint(); } else if (e.target == bright) { if (bright.inside(mx, my) ) { bright.fill = false; } else { bright.fill = true; } bright.repaint(); } else if (e.target == cleft) { if (cleft.inside(mx, my) ) { cleft.fill = false; } else { cleft.fill = true; } cleft.repaint(); } else if (e.target == cright) { if (cright.inside(mx, my) ) { cright.fill = false; } else { cright.fill = true; } cright.repaint(); } else if (e.target == dleft) { if (dleft.inside(mx, my) ) { dleft.fill = false; } else { dleft.fill = true; } dleft.repaint(); } else if (e.target == dright) { if (dright.inside(mx, my) ) { dright.fill = false; } else { dright.fill = true; } dright.repaint(); } else if (e.target == eleft) { if (eleft.inside(mx, my) ) { eleft.fill = false; } else { eleft.fill = true; } eleft.repaint(); } else if (e.target == eright) { if (eright.inside(mx, my) ) { eright.fill = false; } else { eright.fill = true; } eright.repaint(); } else if (e.target == fleft) { if (fleft.inside(mx, my) ) { fleft.fill = false; } else { fleft.fill = true; } fleft.repaint(); } else if (e.target == fright) { if (fright.inside(mx, my) ) { fright.fill = false; } else { fright.fill = true; } fright.repaint(); } else if (e.target == hleft) { if (hleft.inside(mx, my) ) { hleft.fill = false; } else { hleft.fill = true; } hleft.repaint(); } else if (e.target == hright) { if (hright.inside(mx, my) ) { hright.fill = false; } else { hright.fill = true; } hright.repaint(); } else if (e.target == kleft) { if (kleft.inside(mx, my) ) { kleft.fill = false; } else { kleft.fill = true; } kleft.repaint(); } else if (e.target == kright) { if (kright.inside(mx, my) ) { kright.fill = false; } else { kright.fill = true; } kright.repaint(); } else if (e.target == mleft) { if (mleft.inside(mx, my) ) { mleft.fill = false; } else { mleft.fill = true; } mleft.repaint(); } else if (e.target == mright) { if (mright.inside(mx, my) ) { mright.fill = false; } else { mright.fill = true; } mright.repaint(); } else if (e.target == nleft) { if (nleft.inside(mx, my) ) { nleft.fill = false; } else { nleft.fill = true; } nleft.repaint(); } else if (e.target == nright) { if (nright.inside(mx, my) ) { nright.fill = false; } else { nright.fill = true; } nright.repaint(); } else if (e.target == pleft) { if (pleft.inside(mx, my) ) { pleft.fill = false; } else { pleft.fill = true; } pleft.repaint(); } else if (e.target == pright) { if (pright.inside(mx, my) ) { pright.fill = false; } else { pright.fill = true; } pright.repaint(); } return true; } public boolean mouseUp(Event e, int mx, int my) { boolean redraw = true; // these are the translation buttons if (up.fill && e.target == up) { up.fill = false; curvepanel.curve.translate(0, -5); curvepanel.translate(0, -5); up.repaint(); } else if (down.fill && e.target == down) { down.fill = false; curvepanel.curve.translate(0, 5); curvepanel.translate(0, 5); down.repaint(); } else if (left.fill && e.target == left) { left.fill = false; curvepanel.curve.translate(-5, 0); curvepanel.translate(-5, 0); left.repaint(); } else if (right.fill && e.target == right) { right.fill = false; curvepanel.curve.translate(5, 0); curvepanel.translate(5, 0); right.repaint(); } else if (centre.fill && e.target == centre) { centre.fill = false; int tx = curvepanel.curve.Ox; int ty = curvepanel.curve.Oy; curvepanel.curve.translate((int)(curvepanel.size().width/2 - tx), (int)(curvepanel.size().height/2 - ty)); curvepanel.translate((int)(curvepanel.size().width/2 - tx), (int)(curvepanel.size().height/2 - ty)); centre.repaint(); } // these are the parameter incremenet adjustment buttons if (pidown.fill && e.target == pidown) { pidown.fill = false; if (Math.abs(paramincrement)>10) { paramincrement -= 10; } else if (Math.abs(paramincrement)>1) { paramincrement -= 1; } else if (Math.abs(paramincrement)>0) { paramincrement -= 0.1; } if (Math.abs(paramincrement)<0.05) { paramincrement = 0.0; } this.pilabel.setText("inc="+paramincrement); pidown.repaint(); redraw = false; } else if (piup.fill && e.target == piup) { piup.fill = false; if (Math.abs(paramincrement)>9) { paramincrement += 10; } else if (Math.abs(paramincrement)>=0.9) { paramincrement += 1; } else { paramincrement += 0.1; } if (Math.abs(paramincrement)<0.05) { paramincrement = 0.0; } this.pilabel.setText("inc="+paramincrement); piup.repaint(); redraw = false; } // these are the parameter adjustment buttons if (aleft.fill && e.target == aleft) { aleft.fill = false; curvepanel.curve.a -= paramincrement; if (Math.abs(curvepanel.curve.a)<0.05) { curvepanel.curve.a = 0.0; } curvepanel.curve.setCurve(); this.alabel.setText("a="+curvepanel.curve.a); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); aleft.repaint(); } else if (aright.fill && e.target == aright) { aright.fill = false; curvepanel.curve.a += paramincrement; if (Math.abs(curvepanel.curve.a)<0.05) { curvepanel.curve.a = 0.0; } curvepanel.curve.setCurve(); this.alabel.setText("a="+curvepanel.curve.a); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); aright.repaint(); } else if (bleft.fill && e.target == bleft) { bleft.fill = false; curvepanel.curve.b -= paramincrement; if (Math.abs(curvepanel.curve.b)<0.05) { curvepanel.curve.b = 0.0; } curvepanel.curve.setCurve(); this.blabel.setText("b="+curvepanel.curve.b); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); bleft.repaint(); } else if (bright.fill && e.target == bright) { bright.fill = false; curvepanel.curve.b += paramincrement; if (Math.abs(curvepanel.curve.b)<0.05) { curvepanel.curve.b = 0.0; } curvepanel.curve.setCurve(); this.blabel.setText("b="+curvepanel.curve.b); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); bright.repaint(); } else if (cleft.fill && e.target == cleft) { cleft.fill = false; curvepanel.curve.c -= paramincrement; if (Math.abs(curvepanel.curve.c)<0.05) { curvepanel.curve.c = 0.0; } curvepanel.curve.setCurve(); this.clabel.setText("c="+curvepanel.curve.c); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); cleft.repaint(); } else if (cright.fill && e.target == cright) { cright.fill = false; curvepanel.curve.c += paramincrement; if (Math.abs(curvepanel.curve.c)<0.05) { curvepanel.curve.c = 0.0; } curvepanel.curve.setCurve(); this.clabel.setText("c="+curvepanel.curve.c); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); cright.repaint(); } else if (dleft.fill && e.target == dleft) { dleft.fill = false; curvepanel.curve.d -= paramincrement; if (Math.abs(curvepanel.curve.d)<0.05) { curvepanel.curve.d = 0.0; } curvepanel.curve.setCurve(); this.dlabel.setText("d="+curvepanel.curve.d); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); dleft.repaint(); } else if (dright.fill && e.target == dright) { dright.fill = false; curvepanel.curve.d += paramincrement; if (Math.abs(curvepanel.curve.d)<0.05) { curvepanel.curve.d = 0.0; } curvepanel.curve.setCurve(); this.dlabel.setText("d="+curvepanel.curve.d); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); dright.repaint(); } else if (eleft.fill && e.target == eleft) { eleft.fill = false; curvepanel.curve.e -= paramincrement; if (Math.abs(curvepanel.curve.e)<0.05) { curvepanel.curve.e = 0.0; } curvepanel.curve.setCurve(); this.elabel.setText("e="+curvepanel.curve.e); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); eleft.repaint(); } else if (eright.fill && e.target == eright) { eright.fill = false; curvepanel.curve.e += paramincrement; if (Math.abs(curvepanel.curve.e)<0.05) { curvepanel.curve.e = 0.0; } curvepanel.curve.setCurve(); this.elabel.setText("e="+curvepanel.curve.e); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); eright.repaint(); } else if (fleft.fill && e.target == fleft) { fleft.fill = false; curvepanel.curve.f -= paramincrement; if (Math.abs(curvepanel.curve.f)<0.05) { curvepanel.curve.f = 0.0; } curvepanel.curve.setCurve(); this.flabel.setText("f="+curvepanel.curve.f); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); fleft.repaint(); } else if (fright.fill && e.target == fright) { fright.fill = false; curvepanel.curve.f += paramincrement; if (Math.abs(curvepanel.curve.f)<0.05) { curvepanel.curve.f = 0.0; } curvepanel.curve.setCurve(); this.flabel.setText("f="+curvepanel.curve.f); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); fright.repaint(); } else if (hleft.fill && e.target == hleft) { hleft.fill = false; curvepanel.curve.h -= paramincrement; if (Math.abs(curvepanel.curve.h)<0.05) { curvepanel.curve.h = 0.0; } curvepanel.curve.setCurve(); this.hlabel.setText("h="+curvepanel.curve.h); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); hleft.repaint(); } else if (hright.fill && e.target == hright) { hright.fill = false; curvepanel.curve.h += paramincrement; if (Math.abs(curvepanel.curve.h)<0.05) { curvepanel.curve.h = 0.0; } curvepanel.curve.setCurve(); this.hlabel.setText("h="+curvepanel.curve.h); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); hright.repaint(); } else if (kleft.fill && e.target == kleft) { kleft.fill = false; curvepanel.curve.k -= paramincrement; if (Math.abs(curvepanel.curve.k)<0.05) { curvepanel.curve.k = 0.0; } curvepanel.curve.setCurve(); this.klabel.setText("k="+curvepanel.curve.k); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); kleft.repaint(); } else if (kright.fill && e.target == kright) { kright.fill = false; curvepanel.curve.k += paramincrement; if (Math.abs(curvepanel.curve.k)<0.05) { curvepanel.curve.k = 0.0; } curvepanel.curve.setCurve(); this.klabel.setText("k="+curvepanel.curve.k); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); kright.repaint(); } else if (mleft.fill && e.target == mleft) { mleft.fill = false; curvepanel.curve.m -= paramincrement; if (Math.abs(curvepanel.curve.m)<0.05) { curvepanel.curve.m = 0.0; } curvepanel.curve.setCurve(); this.mlabel.setText("m="+curvepanel.curve.m); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); mleft.repaint(); } else if (mright.fill && e.target == mright) { mright.fill = false; curvepanel.curve.m += paramincrement; if (Math.abs(curvepanel.curve.m)<0.05) { curvepanel.curve.m = 0.0; } curvepanel.curve.setCurve(); this.mlabel.setText("m="+curvepanel.curve.m); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); mright.repaint(); } else if (nleft.fill && e.target == nleft) { nleft.fill = false; curvepanel.curve.n -= paramincrement; if (Math.abs(curvepanel.curve.n)<0.05) { curvepanel.curve.n = 0.0; } curvepanel.curve.setCurve(); this.nlabel.setText("n="+curvepanel.curve.n); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); nleft.repaint(); } else if (nright.fill && e.target == nright) { nright.fill = false; curvepanel.curve.n += paramincrement; if (Math.abs(curvepanel.curve.n)<0.05) { curvepanel.curve.n = 0.0; } curvepanel.curve.setCurve(); this.nlabel.setText("n="+curvepanel.curve.n); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); nright.repaint(); } else if (pleft.fill && e.target == pleft) { pleft.fill = false; curvepanel.curve.p -= paramincrement; if (Math.abs(curvepanel.curve.p)<0.05) { curvepanel.curve.p = 0.0; } curvepanel.curve.setCurve(); this.plabel.setText("p="+curvepanel.curve.p); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); pleft.repaint(); } else if (pright.fill && e.target == pright) { pright.fill = false; curvepanel.curve.p += paramincrement; if (Math.abs(curvepanel.curve.p)<0.05) { curvepanel.curve.p = 0.0; } curvepanel.curve.setCurve(); this.plabel.setText("p="+curvepanel.curve.p); curvepanel.curve.translate(0, 0); curvepanel.translate(0, 0); pright.repaint(); } if (redraw) { curvepanel.recalculate(); curvepanel.repaint(); } return true; } /* end of mouse methods */ // beginning of printdefinition method public void printdefinition(int i) { textpanel.setColor(new Color(160,0,0)); ((CardLayout)cards.getLayout()).show(cards, TEXTCARD); Vector temp = new Vector(); switch (i) { case 0: temp.addElement("The equation of the curve is given below."); break; case 1: temp.addElement("The Evolute is the envelope of"); temp.addElement("the normals to a given curve."); break; case 2: temp.addElement("If C is a curve, and C' is its envolute,"); temp.addElement("then C is called an Involute of C'."); break; case 3: temp.addElement("Given a circle C with centre O and radius r then"); temp.addElement("two points P & Q are inverse wrt C if OP.OQ=r."); temp.addElement("If P describes a curve C1 then Q describes a curve C2"); temp.addElement("called the Inverse of C1 wrt the circle C"); break; case 4: temp.addElement("The Pedal Curve of C wrt a fixed \"pedal point\" O is"); temp.addElement("the locus of the point P of intersection of"); temp.addElement("the perpendicular from O to a tangent to C."); break; case 5: temp.addElement("Given a curve C and a fixed point O then for a point"); temp.addElement("P on C draw a line perpendicular to OP."); temp.addElement("The envelope of these lines as P describes C is"); temp.addElement("the negative pedal of C."); break; case 6: temp.addElement("When light reflects off a curve then the envelope of"); temp.addElement("the reflected rays is a caustic."); temp.addElement("These light rays are radial to the chosen point."); break; case 7: temp.addElement("When light reflects off a curve then the envelope of"); temp.addElement("the reflected rays is a caustic."); temp.addElement("These light rays are parallel to the chosen line."); break; } textpanel.setText(temp); textpanel.setFontSize(12); } /* end of printdefinition method */ // beginning of printinstructions method public void printinstructions (int i) { if (i == 0) { textpanel.setColor(Color.black); } else { textpanel.setColor(CurvePanel.darkGreen); } ((CardLayout)cards.getLayout()).show(cards, TEXTCARD); Vector temp = new Vector(); switch (i) { case 0: temp.addElement("Choose an associated curve"); temp.addElement( "from the list above left."); break; case 1: temp.addElement("The Evolute is the curve drawn in red."); break; case 2: temp.addElement("Click on a point."); temp.addElement("You can drag the mouse to move the point"); break; case 3: temp.addElement("Click on the centre of a circle and"); temp.addElement("drag to a point on the circumference."); temp.addElement("You can drag the centre dot or readjust the radius."); break; case 4: temp.addElement("Click on a point."); temp.addElement("You can drag the mouse to move the point."); break; case 5: temp.addElement("Click on a point."); temp.addElement("You can drag the mouse to move the point."); break; case 6: temp.addElement("Click on a point."); temp.addElement("You can drag the mouse to move the point."); break; case 7: temp.addElement("Click on the point of a line"); temp.addElement("that goes through the origin."); temp.addElement("You can drag the mouse to alter the line."); break; } textpanel.setText(temp); textpanel.setFontSize(12); } /* end of printinstructions method */ // beginning of printcontrols method public void printcontrols() { ((CardLayout)cards.getLayout()).show(cards, CONTROLCARD); } /* end of printcontrols method */ } /* end of CurveControls class */