// import java.io.*; import java.awt.*; import java.applet.*; import java.math.*; public class QuadForm extends Applet { Image title; final Color back = new Color(178,221,238); ///////// Global Panels ////////// TextField tfa, tfb, tfc, tf1, tf2, tf11, tf12, tf21, tf22; Choice ch; Calculations c1; ExactCalc c2; ////////////////////////////////// static boolean aiszero, biszero, ciszero; public void init(){ title = getImage(getCodeBase(),"title.gif"); setBackground(back); c1 = new Calculations(); c2 = new ExactCalc(); initPanels(); aiszero = false; ciszero =false; biszero = false; } public void initPanels(){ setLayout(new BorderLayout()); tfa = new TextField(9); tfb = new TextField(9); tfc = new TextField(9); Panel c = new Panel(); c.setLayout(new BorderLayout(10,10)); Panel p5 = new Panel(); p5.setLayout(new BorderLayout(5,5)); Panel p = new Panel(); p.setLayout(new BorderLayout(5,5)); Panel b_out= new Panel(); b_out.add(new Label(" a:")); b_out.add(tfa); b_out.add(new Label(" b:")); b_out.add(tfb); b_out.add(new Label(" c:")); b_out.add(tfc); c.add("North",b_out); Panel c_Pan= new Panel(); c_Pan.add(new Label("Precision:")); ch = new Choice(); ch.addItem("1"); ch.addItem("2"); ch.addItem("3"); ch.addItem("4"); ch.addItem("5"); ch.addItem("6"); ch.addItem("7"); ch.addItem("8"); ch.addItem("9"); ch.addItem("10"); ch.select(3); c_Pan.add(ch); Panel b_Pan= new Panel(); b_Pan.setLayout(new GridLayout(5,1)); b_Pan.add(new Button("Choose Random")); b_Pan.add(new Button("Choose Example")); b_Pan.add(new Button("Scale by Largest")); b_Pan.add(new Button("Calculate")); b_Pan.add(c_Pan); p.add("West",b_Pan); p5.add("South",c2); p.add("Center",c1); c.add("Center",p); p5.add("Center",c); add("South",p5); } public void paint(Graphics g){ g.drawImage(title,12,15,this); } public boolean action(Event evt, Object arg){ String s = (String)arg; ciszero = false; aiszero = false; biszero = false; if (s.equals("Choose Example")) setText(new BigDecimal("0.05010"),new BigDecimal("-98.78"), new BigDecimal("5.015")); if (s.equals("Choose Random")) fixRandom(); if (s.equals("Scale by Largest")) scaleLargest(); if (!s.equals("Calculate")){ c1.show = false; c2.show = false; } else calculate(new BigDecimal(tfa.getText()),new BigDecimal(tfb.getText()), new BigDecimal(tfc.getText())); c1.repaint(); c2.repaint(); return true; } // //////////////////////////////////// Action Functions //////////////////////// // public void calculate(BigDecimal a, BigDecimal b, BigDecimal c){ setText(a,b,c); a = correctScale(a); b = correctScale(b); c = correctScale(c); if (noZero(a,b,c)) { aiszero = false; ciszero = false; c1.set(quad(a,b,c),b.multiply(new BigDecimal("-1"))); c2.set(quadExact(a,b,c)[0],quadExact(a,b,c)[1]); } } public void setText(BigDecimal a, BigDecimal b, BigDecimal c){ a = correctScale(a); b = correctScale(b); c = correctScale(c); tfa.setText(a.toString()); tfb.setText(b.toString()); tfc.setText(c.toString()); } public void calculateImagine(BigDecimal a,BigDecimal b, BigDecimal c){ BigDecimal discriminant = getDiscriminantExact(a,b,c); BigDecimal two = new BigDecimal("2.0"); BigDecimal x = (b.negate()).divide(a.multiply(two),30,BigDecimal.ROUND_HALF_UP); BigDecimal y = sqrt(discriminant.negate()).divide(a.multiply(two),30,BigDecimal.ROUND_HALF_UP); c2.setSpecial(correctScale(x.negate()).toString()+"+i*"+correctScale(y.negate()).toString(), correctScale(x.negate()).toString()+"-i*"+correctScale(y.negate()).toString()); } // //////////////////////////////////// Math Functions //////////////////////// // public boolean noZero(BigDecimal a,BigDecimal b, BigDecimal c){ boolean stat = true; BigDecimal zero = new BigDecimal("0"); System.out.println("here: "+zero.toString() +" "+ a.toString()); if (b.compareTo(zero) == 0 && a.compareTo(zero)==0){ stat = false; c1.show = false; biszero = true; ciszero = false; aiszero = false; c2.setSpecial("Division by zero",", there are no roots."); repaint(); } else if (a.compareTo(zero) == 0){ stat = false; c1.show = false; aiszero = true; ciszero = false; biszero = false; c2.setSpecial(correctScale(c.negate().divide(b,30,BigDecimal.ROUND_HALF_UP)).toString()," there is only 1 root."); } else if (c.compareTo(zero) == 0){ stat = false; c1.show = false; ciszero = true; aiszero = false; biszero = false; c2.setSpecial(correctScale(b.negate().divide(a,30,BigDecimal.ROUND_HALF_UP)).toString()," there is only 1 root."); } else if (getDiscriminantExact(a,b,c).compareTo(zero) < 0){ stat = false; repaint(); calculateImagine(a,b,c); } return stat; } public BigDecimal sqrt(BigDecimal b){ BigDecimal a = new BigDecimal(".5"); BigDecimal prev = b.multiply(a); for (int i=0;i<25;i++) prev = a.multiply(prev.add(b.divide(prev,30,BigDecimal.ROUND_HALF_EVEN))); return prev; } public void fixRandom(){ BigDecimal a,b,c; a = new BigDecimal(""+(Math.random()-.5)*2000); b = new BigDecimal(""+(Math.random()-.5)*2000); c = new BigDecimal(""+(Math.random()-.5)*2000); setText(a,b,c); } public void scaleLargest(){ int pr = 1+ ch.getSelectedIndex(); BigDecimal a,b,c,a1,b1,c1; a = new BigDecimal(tfa.getText()); b = new BigDecimal(tfb.getText()); c = new BigDecimal(tfc.getText()); a1 = a.abs(); b1 = b.abs(); c1 = c.abs(); if (a1.compareTo(b1)>=0 && a1.compareTo(c1) >= 0) { b = b.divide(a,30,BigDecimal.ROUND_HALF_DOWN); c = c.divide(a,30,BigDecimal.ROUND_HALF_DOWN); a = new BigDecimal("1.0"); } else if (b1.compareTo(a1)>=0 && b1.compareTo(c1) >= 0) { a = a.divide(b,30,BigDecimal.ROUND_HALF_DOWN); c = c.divide(b,30,BigDecimal.ROUND_HALF_DOWN); b = new BigDecimal("1.0"); } else if (c1.compareTo(b1)>=0 && c1.compareTo(a1) >= 0) { a = a.divide(c,30,BigDecimal.ROUND_HALF_DOWN); b = b.divide(c,30,BigDecimal.ROUND_HALF_DOWN); c = new BigDecimal("1.0"); } setText(a,b,c); } public BigDecimal getDiscriminantExact(BigDecimal a, BigDecimal b, BigDecimal c){ BigDecimal discriminant = b.multiply(b); BigDecimal part2 = a.multiply(c); part2 = part2.multiply(new BigDecimal("4")); return discriminant.subtract(part2); } public BigDecimal[] quadExact(BigDecimal a, BigDecimal b, BigDecimal c){ int pr = 25; BigDecimal discriminant = sqrt(getDiscriminantExact(a,b,c)); BigDecimal x[] = new BigDecimal[2]; b = b.negate(); c = c.multiply(new BigDecimal("2")); a = a.multiply(new BigDecimal("2")); x[0] = b.add(discriminant); x[0] = x[0].divide(a,pr,BigDecimal.ROUND_HALF_EVEN); x[1] = b.subtract(discriminant); x[1] = x[1].divide(a,pr,BigDecimal.ROUND_HALF_EVEN); x[0] = correctScale(x[0]); x[1] = correctScale(x[1]); return x; } public BigDecimal getDiscriminant(BigDecimal a, BigDecimal b, BigDecimal c){ BigDecimal discriminant = correctScale(b.multiply(b)); BigDecimal part2 = correctScale(a.multiply(c)); part2 = correctScale(part2.multiply(new BigDecimal("4"))); return correctScale(discriminant.subtract(part2)); } public BigDecimal[] quad(BigDecimal a, BigDecimal b, BigDecimal c){ BigDecimal discriminant = correctScale(sqrt(getDiscriminant(a,b,c))); BigDecimal x[] = new BigDecimal[7]; b = b.negate(); c = correctScale(c.multiply(new BigDecimal("2"))); a = correctScale(a.multiply(new BigDecimal("2"))); x[0] = b.add(discriminant); try { x[0] = x[0].divide(a,30,BigDecimal.ROUND_HALF_DOWN); }catch(ArithmeticException e){ x[0] = new BigDecimal("0");} x[1] = b.subtract(discriminant); try { x[1] = x[1].divide(a,30,BigDecimal.ROUND_HALF_DOWN); }catch(ArithmeticException e){ x[1] = new BigDecimal("0");} x[2] = b.subtract(discriminant); try { x[2] = c.divide(x[2],30,BigDecimal.ROUND_HALF_DOWN); }catch(ArithmeticException e){ x[2] = new BigDecimal("0");} x[3] = b.add(discriminant); try{ x[3] = c.divide(x[3],30,BigDecimal.ROUND_HALF_DOWN); //x[0] = (-b+discriminant)/(2*a); }catch(ArithmeticException e){ x[3] = new BigDecimal("0");} x[0] = correctScale(x[0]); x[1] = correctScale(x[1]); x[2] = correctScale(x[2]); x[3] = correctScale(x[3]); x[4] = discriminant; x[5] = a; x[6] = c; return x; } public BigDecimal correctScale(BigDecimal b){ int sc = 1+ch.getSelectedIndex(); boolean stillZero = true; int x = b.toString().indexOf('.'); if (x < 0) x = b.toString().length(); b = b.movePointLeft(x); int ggg = slide(b); b = b.movePointRight(ggg); b = b.setScale(sc,BigDecimal.ROUND_HALF_EVEN); b = b.movePointLeft(ggg); b = b.movePointRight(x); return b; } public int slide(BigDecimal b){ int slideRight = 0; boolean stillZero = true; for (int i=b.toString().indexOf('.')+1;i tl) { g.drawString(top,x+bl/2-tl/2,y-h/2); g.drawString(bot,x,y+h/2); g.drawLine(x,y-h/2+2,x+bl,y-h/2+2); } else { //center bottom g.drawString(top,x,y-h/2); g.drawString(bot,x+tl/2-bl/2,y+h/2); g.drawLine(x,y-h/2+2,x+tl,y-h/2+2); } // Return end position return (bl > tl) ? bl+x: tl+y; } /////////////////////////// public void set(BigDecimal x[],BigDecimal h1){ this.a = x[0]; this.b = x[1]; this.c = x[2]; this.d = x[3]; this.e = x[4]; this.f = x[5]; this.g = x[6]; this.h1 = h1; show=true; repaint(); } public Dimension getMinimumSize() { return size; } // end of method minimumSize public Dimension getPreferredSize() { return size; } // end of method preferredSize public boolean mouseDown(Event evt,int x, int y){ System.out.println("X: "+x+" Y: "+y); return true; } } // End Calculations // //////////////////////////////////////////////////////////////// // class ExactCalc extends Panel { int w = 380, h = 40; Dimension size = new Dimension(w,h); String root1, root2; boolean show = false; public ExactCalc(){ } public void set(BigDecimal a, BigDecimal b){ root1 = a.toString(); root2 = b.toString(); show = true; } public void setSpecial(String a, String b){ root1 = a; root2 = b; show = true; } public void paint(Graphics g1){ // Draw Box g1.setColor(Color.white); g1.fillRect(5,5,w-10,h-10); g1.setColor(Color.black); g1.drawRect(5,5,w-10,h-10); if (show) g1.drawString("Correctly rounded roots: "+root1+" and "+root2,10,25); } public Dimension getMinimumSize() { return size; } // end of method minimumSize public Dimension getPreferredSize() { return size; } // end of method preferredSize public boolean mouseDown(Event evt,int x, int y){ System.out.println("X: "+x+" Y: "+y); return true; } } // End ExactCalc // //////////////////////////////////////////////////////////////////////////// //public String drawSquareRoot();