// // Eigenvalue.java // A simple Java Swing applet // import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class Eigenvalue extends JApplet { private Font font = new Font("serif", Font.PLAIN + Font.BOLD, 18); int mouse_x, mouse_y; // Integer pixel coordinates of independent variable, x int image_x, image_y; // Integer pixel coordinates of dependent variable, y int dot_x, dot_y; // Integer pixel coordinates of target, b // Looking at y = Ax or trying to solve Ax = b double a_11, a_12, a_21, a_22; double x_1, x_2, b_1, b_2; String a_11_string, a_12_string, a_21_string, a_22_string; String x_1_string, x_2_string, b_1_string, b_2_string; VCRButton mark_button, clear_button; Color mark_button_color = new Color(128, 128, 255); Color mark_button_shadow_color = new Color(0, 0, 192); Color clear_button_color = new Color(128, 255, 128); Color clear_button_shadow_color = new Color(0, 192, 0); int mark_x[] = new int[1000]; int mark_y[] = new int[1000]; int mark_sw = 1; int mark_index = 0; int check_out_sw = 1; int add_dot_sw; int show_x_sw, show_b_sw; int enable_marks_sw; public static void main(String[] args) { Frame f = new Frame(); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); }; }); Eigenvalue eg = new Eigenvalue(); eg.setSize(701,401); // same size as defined in the HTML APPLET f.add(eg); f.pack(); eg.init(); f.setSize(701,401 + 20); // add 20, seems enough for the Frame title, f.show(); } public void init() { // set the default look and feel String laf = UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) { System.err.println ("Warning: UnsupportedLookAndFeel: " + laf); } catch (Exception exc) { System.err.println ("Error loading " + laf + ": " + exc); } getContentPane().setLayout (null); mark_button = new VCRButton(420, 40, 80, 30, mark_button_color, Color.white, mark_button_shadow_color, "Mark"); clear_button = new VCRButton(550, 40, 80, 30, clear_button_color, Color.white, clear_button_shadow_color, "Clear"); a_11_string = getString("a11", "0"); a_12_string = getString("a12", "-1"); a_21_string = getString("a21", "1"); a_22_string = getString("a22", "0"); b_1_string = getString("b1", "2"); b_2_string = getString("b2", "4"); x_1_string = getString("x1", "5"); x_2_string = getString("x2", "-3"); add_dot_sw = getInteger("add_dot_sw", 0, 1, 1); show_x_sw = getInteger("show_x_sw", 0, 1, 1); show_b_sw = getInteger("show_b_sw", 0, 1, 1); enable_marks_sw = getInteger("enable_marks_sw", 0, 1, 1); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { int mx, my; mx = e.getX(); my = e.getY(); if (mx < 402) { x_1_string = double_to_string((mx - 200.0)/20.0); x_2_string = double_to_string((200.0 - my)/20.0); mark_sw = 1; repaint(); } } } ); addMouseListener( new MouseAdapter() { public void mouseClicked(MouseEvent e) { int mx, my; mx = e.getX(); my = e.getY(); if (mx < 402) // Change x { x_1_string = double_to_string((mx - 200.0)/20.0); x_2_string = double_to_string((200.0 - my)/20.0); mark_sw = 1; repaint(); } if ((mx > 415) && (mx < 540) && (my > 100) && (my < 200)) // Change a11 { a_11_string = JOptionPane.showInputDialog(" Enter a11"); mark_sw = 1; mark_index = 0; repaint(); } if ((mx > 550) && (my > 100) && (my < 200)) // Change a12 { a_12_string = JOptionPane.showInputDialog(" Enter a12"); mark_sw = 1; mark_index = 0; repaint(); } if ((mx > 415) && (mx < 540) && (my > 220) && (my < 255)) // Change a21 { a_21_string = JOptionPane.showInputDialog(" Enter a21"); mark_sw = 1; mark_index = 0; repaint(); } if ((mx > 550) && (my > 220) && (my < 255)) // Change a22 { a_22_string = JOptionPane.showInputDialog(" Enter a22"); mark_sw = 1; mark_index = 0; repaint(); } if ((mx > 415) && (mx < 540) && (my > 260) && (my < 310)) // Change b1 { b_1_string = JOptionPane.showInputDialog(" Enter b1"); repaint(); } if ((mx > 415) && (mx > 550) && (my > 260) && (my < 310)) // Change b2 { b_2_string = JOptionPane.showInputDialog(" Enter b2"); repaint(); } if (mark_button.test(mx, my) && (mark_sw == 1)) // Mark point { mark_x[mark_index] = mouse_x; mark_y[mark_index] = mouse_y; mark_index = java.lang.Math.min(999, mark_index + 1); mark_sw = 0; repaint(); } if (clear_button.test(mx, my)) // Clear marked points { mark_index = 0; mark_sw = 1; repaint(); } } } ); } // // Convert a double to a string of the form x.x // public String double_to_string(double z) { String sign; double w; int integer_part, decimal_part; w = java.lang.Math.min(10, z); w = java.lang.Math.max(-10, w); if (w < 0) sign = "-"; else sign = ""; w = java.lang.Math.abs(w); integer_part = (int) java.lang.Math.floor(w + 0.0001); decimal_part = (int) java.lang.Math.floor(10 * (w - integer_part) + 0.0001); return sign + java.lang.Integer.toString(integer_part) + "." + java.lang.Integer.toString(decimal_part); } public void paint (Graphics g) { a_11 = Double.parseDouble(a_11_string); a_12 = Double.parseDouble(a_12_string); a_21 = Double.parseDouble(a_21_string); a_22 = Double.parseDouble(a_22_string); g.setFont(font); g.setColor(Color.white); g.fillRect(0, 0, 801, 401); g.setColor(Color.black); for (int i = 0; i <= 400; i = i + 20) { g.drawLine(0, i, 400, i); g.drawLine(i, 0, i, 400); } g.drawLine(199, 0, 199, 400); g.drawLine(201, 0, 201, 400); g.drawLine(0, 199, 400, 199); g.drawLine(0, 201, 400, 201); g.drawString("a11 = " + a_11_string, 420, 200); g.drawString("a21 = " + a_21_string, 420, 250); g.drawString("a12 = " + a_12_string, 550, 200); g.drawString("a22 = " + a_22_string, 550, 250); if (show_b_sw == 1) { g.drawString("b1 = " + b_1_string, 420, 300); g.drawString("b2 = " + b_2_string, 550, 300); } if (show_x_sw == 1) { g.drawString("x1 = " + x_1_string, 420, 350); g.drawString("x2 = " + x_2_string, 550, 350); } x_1 = Double.parseDouble(x_1_string); x_2 = Double.parseDouble(x_2_string); mouse_x = (int) java.lang.Math.round(200 + x_1 * 20); mouse_y = (int) java.lang.Math.round(200 - x_2 * 20); g.setColor(Color.red); g.drawLine(200, 200, mouse_x, mouse_y); g.fillOval(mouse_x - 5, mouse_y - 5, 11, 11); image_x = (int) java.lang.Math.round(200 + a_11 * (mouse_x - 200) + a_12 * (200 - mouse_y)); image_y = (int) java.lang.Math.round(200 - ( a_21 * (mouse_x - 200) + a_22 * (200 - mouse_y))); if (add_dot_sw == 1) { b_1 = Double.parseDouble(b_1_string); b_2 = Double.parseDouble(b_2_string); b_1 = java.lang.Math.min(10, b_1); b_1 = java.lang.Math.max(-10, b_1); b_2 = java.lang.Math.min(10, b_2); b_2 = java.lang.Math.max(-10, b_2); dot_x = (int) java.lang.Math.round(200 + b_1 * 20); dot_y = (int) java.lang.Math.round(200 - b_2 * 20); g.setColor(Color.gray); g.fillRect(dot_x - 5, dot_y - 5, 11, 11); } g.setColor(Color.blue); g.drawLine(200, 200, image_x, image_y); g.fillOval(image_x - 3, image_y - 3, 7, 7); if (enable_marks_sw == 1) { if (mark_sw == 1) mark_button.draw_off(g); else mark_button.draw_on(g); if (mark_index == 0) clear_button.draw_on(g); else clear_button.draw_off(g); g.setColor(Color.black); for (int i = 0; i < mark_index; i = i + 1) { g.drawLine(mark_x[i] - 3, mark_y[i] - 3, mark_x[i] + 4, mark_y[i] + 4); g.drawLine(mark_x[i] - 3, mark_y[i] + 4, mark_x[i] + 4, mark_y[i] - 3); } } } public int getInteger(String param_name, int low, int high, int no_param) { int value; if (check_out_sw == 1) { System.out.println("Parameter: " + param_name); System.out.println(" Default value: " + java.lang.Integer.toString(no_param)); } if (getParameter(param_name) != null) { value = Integer.parseInt(getParameter(param_name)); value = java.lang.Math.min(high, java.lang.Math.max(low, value)); } else { value = no_param; } if (check_out_sw == 1) { System.out.println(" Actual value: " + java.lang.Integer.toString(value)); } return value; } public String getString(String param_name, String no_param) { String value; if (check_out_sw == 1) { System.out.println("Parameter: " + param_name); System.out.println(" Default value: " + no_param); } if (getParameter(param_name) != null) { value = getParameter(param_name); } else { value = no_param; } if (check_out_sw == 1) { System.out.println(" Actual value: " + value); } return value; } public double getDouble(String param_name, double low, double high, double no_param) { double value; if (check_out_sw == 1) { System.out.println("Parameter: " + param_name); System.out.println(" Default value: " + java.lang.Double.toString(no_param)); } if (getParameter(param_name) != null) { value = java.lang.Double.valueOf(getParameter(param_name)).doubleValue(); value = java.lang.Math.min(high, java.lang.Math.max(low, value)); } else { value = no_param; } if (check_out_sw == 1) { System.out.println(" Actual value: " + java.lang.Double.toString(value)); } return value; } public Color getColor(String color_parameter, String default_color_parameter) { int red, green, blue; Color color_variable; String work; work = getString(color_parameter, default_color_parameter); if (work.length() != 9) work = default_color_parameter; red = Integer.parseInt(work.substring(0, 3)); green = Integer.parseInt(work.substring(3, 6)); blue = Integer.parseInt(work.substring(6, 9)); red = java.lang.Math.max(0, java.lang.Math.min(255, red)); green = java.lang.Math.max(0, java.lang.Math.min(255, green)); blue = java.lang.Math.max(0, java.lang.Math.min(255, blue)); color_variable = new Color(red, green, blue); return color_variable; } } // // The following class is used for VCR like buttons // class VCRButton { // // On-off button // Click to turn on // public int left; public int top; public int width; public int height; public String label; public Color button_color, back_color, shadow_color; public VCRButton(int left, int top, int width, int height, Color button_color, Color back_color, Color shadow_color, String label) { this.left = left; this.top = top; this.width = width; this.height = height; this.button_color = button_color; this.back_color = back_color; this.shadow_color = shadow_color; this.label = label; } public void draw_on(Graphics g) { g.setColor(back_color); g.fillRect(left, top, width, height); g.setColor(button_color); g.fillRect(left + 3, top + 3, width - 3, height - 3); g.setColor(shadow_color); g.drawString(label, left + width/2 - g.getFontMetrics().stringWidth(label)/2, top + height + height/2); } public void draw_off(Graphics g) { g.setColor(back_color); g.fillRect(left, top, width, height); g.setColor(shadow_color); g.fillRect(left + 3, top + 3, width - 3, height - 3); g.setColor(button_color); g.fillRect(left, top, width - 3, height - 3); g.setColor(shadow_color); g.drawString(label, left + width/2 - g.getFontMetrics().stringWidth(label)/2, top + height + height/2); } public boolean test(int mx, int my) { if ((mx >= left) & (mx <= left + width) & (my >= top) & (my <= top + height)) return true; else return false; } }