diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java index 2b3a7f1..83be002 100644 --- a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java +++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/MGuiRMI.java @@ -31,282 +31,402 @@ import javax.swing.event.ChangeListener; class MyJLabel extends JLabel { - /** - * - */ - private static final long serialVersionUID = -7750935382747799343L; - - int boxULx, boxULy, boxW, boxH; - - MyJLabel() { - super(); - } - - MyJLabel(String s) { - super(s); - } - - void setBox(int boxULx, int boxULy, int boxW, int boxH) { - this.boxULx = boxULx; - this.boxULy = boxULy; - this.boxW = boxW; - this.boxH = boxH; - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.setColor(Color.black); - g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH); - } + /** + * + */ + private static final long serialVersionUID = -7750935382747799343L; + + int boxULx, boxULy, boxW, boxH; + + MyJLabel() { + super(); + } + + MyJLabel(String s) { + super(s); + } + + void setBox(int boxULx, int boxULy, int boxW, int boxH) { + this.boxULx = boxULx; + this.boxULy = boxULy; + this.boxW = boxW; + this.boxH = boxH; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.setColor(Color.black); + g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH); + } } -public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, MouseMotionListener { - - // GUI elements - JFrame frame; - JPanel panel; - JButton endButton; - JButton backButton; - JButton calcButton; - JTextField hostTextField; - JSlider maxIterations; +class RMIMandelbrotCalculationThread extends Thread { MyJLabel view; - JLabel message; - int nrIterations; - - // box management - int boxULx, boxULy, boxW, boxH; - boolean dragging = false; - - // this one does all the calculating work RMIMandelbrotCalculationsInterface remoteCalcObj; - - // how many points in the image? - // change if you want a higher resolution + int boxULx, boxULy, boxW, boxH; public static int RESX = 600; public static int RESY = 600; - - MGuiRMI() { - // set up GUI - this.frame = new JFrame("Mandelbrotmenge"); - this.panel = new JPanel(); - this.endButton = new JButton("Ende"); - this.panel.add(this.endButton); - this.backButton = new JButton("Zurück"); - this.panel.add(this.backButton); - this.calcButton = new JButton("Rechnen"); - this.hostTextField = new JTextField(20); - this.hostTextField.setText("localhost"); - this.panel.add(this.calcButton); - this.panel.add(this.hostTextField); - this.frame.add(this.panel); - this.frame.setSize(700, 720); - this.frame.setVisible(true); - this.view = new MyJLabel(); - this.maxIterations = new JSlider(0, 50, 30); - this.panel.add(this.maxIterations); - this.panel.add(this.view); - this.message = new JLabel("Status"); - this.message.setBorder(new BevelBorder(BevelBorder.LOWERED)); - this.frame.add(this.message,BorderLayout.SOUTH); - - this.endButton.addActionListener(this); - this.backButton.addActionListener(this); - this.calcButton.addActionListener(this); - this.maxIterations.addChangeListener(this); - - this.maxIterations.setMajorTickSpacing(10); - this.maxIterations.setPaintTicks(true); - this.maxIterations.setPaintLabels(true); - - this.view.addMouseListener(this); - this.view.addMouseMotionListener(this); - - this.boxULx = 0; - this.boxULy = 0; - this.boxW = MGuiRMI.RESX; - this.boxH = MGuiRMI.RESY; - - this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - // Non-Gui stuff - this.nrIterations = 1000; - } - - // visualization related stuff, do not touch! - int[] generateLookupTable(int nrHues) { - int[] tmp = new int[nrHues + 1]; - int cycle = 2048; - for (int i = 0; i < nrHues; i++) { - float hue = 1 * ((float) (i % cycle)) / cycle/* ((float)nrHues) */ ; - tmp[i] = Color.HSBtoRGB(hue, 0.8f, 1.0f); - } - tmp[0] = Color.HSBtoRGB(0f, 1.0f, 0.0f); - return tmp; - } - - // visualization - static void applyLookupTable(int[] data, int[] dest, int[] lookupTable) { - for (int i = 0; i < data.length; i++) { - dest[i] = lookupTable[data[i]]; - } - } - - // here we check what the buttons do - public void actionPerformed(ActionEvent ae) { - if (ae.getSource() == this.endButton) { - System.out.println("Ende"); - System.exit(0); - } else - - if (ae.getSource() == this.backButton) { - System.out.println("Zurueck"); - // Zoom und Ausschnitt zurücksetzen - double ULx = -0.16099999999999995; - double ULy = -0.9365333333333333; - double LRx = -0.03533333333333327; - double LRy = -0.8108666666666666; - this.boxULx = 0; - this.boxULy = 0; - this.boxW = MGuiRMI.RESX; - this.boxH = MGuiRMI.RESY; - this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); - this.view.repaint(); - if (this.remoteCalcObj == null) + Boolean upperPart; + int maxIterations; + + RMIMandelbrotCalculationThread(Boolean upperPart, MyJLabel view, RMIMandelbrotCalculationsInterface remoteCalcObj, int maxIterations) { + this.view = view; + this.remoteCalcObj = remoteCalcObj; + this.upperPart = upperPart; + this.maxIterations = maxIterations; + } + + // visualization related stuff, do not touch! + int[] generateLookupTable(int nrHues) { + int[] tmp = new int[nrHues + 1]; + int cycle = 2048; + for (int i = 0; i < nrHues; i++) { + float hue = 1 * ((float) (i % cycle)) / cycle/* ((float)nrHues) */ ; + tmp[i] = Color.HSBtoRGB(hue, 0.8f, 1.0f); + } + tmp[0] = Color.HSBtoRGB(0f, 1.0f, 0.0f); + return tmp; + } + + public void run() { + try { + long timestampStart = System.currentTimeMillis(); + + double ULx = this.remoteCalcObj.getULx(); + double ULy = this.remoteCalcObj.getULy(); + double LRx = this.remoteCalcObj.getLRx(); + double LRy = this.remoteCalcObj.getLRy(); + System.out.println("actual="+ULx + "/" + ULy + "/" + LRx + "/" + LRy); + double w = LRx - ULx; + double h = LRy - ULy; + // AG change define box such that it contains only upper half of apple man :-) + if (this.upperPart == true) { - String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgeführt"; - this.message.setText(message); - System.out.println(message); + boxULx = 0 ; boxULy = 0; boxW = MGuiRMI.RESX ; boxH = MGuiRMI.RESY/2; } else { - try { - this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - this.message.setText("Ausschnitt zurückgesetzt"); - } - } else - - if (ae.getSource() == this.calcButton) { - String hostname = this.hostTextField.getText(); - System.out.println("Verbinde mit RMI Registry auf Host: " + hostname); - try { - Registry registry = LocateRegistry.getRegistry(hostname); - this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface"); - System.out.println("Rechnen"); - long timestampStart = System.currentTimeMillis(); - - //this.boxW = this.boxW / 2; - //MGuiRMI.RESX = MGuiRMI.RESX / 2; - - double ULx = 0; - double ULy = 0; - double LRx = 0; - double LRy = 0; - - ULx = this.remoteCalcObj.getULx(); - ULy = this.remoteCalcObj.getULy(); - LRx = this.remoteCalcObj.getLRx(); - LRy = this.remoteCalcObj.getLRy(); - - double w = LRx - ULx; - double h = LRy - ULy; - ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX; - ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY; - w *= this.boxW / (double) (RESX); - h *= this.boxH / (double) (RESX); - LRx = ULx + w; - LRy = ULy + h; - System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy); - this.boxULx = 0; - this.boxULy = 0; - this.boxW = MGuiRMI.RESX; - this.boxH = MGuiRMI.RESY; - int[] colors = null; - - //this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); - this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); - this.remoteCalcObj.iterateAllPoints(this.maxIterations.getValue() * 1000, MGuiRMI.RESX, MGuiRMI.RESY); - int[] lookupTable = generateLookupTable(this.maxIterations.getValue() * 1000); - colors = new int[MGuiRMI.RESX * MGuiRMI.RESY]; - MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable); - - BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB); - colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX); - this.view.setIcon(new ImageIcon(colorImage)); - - this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); - this.view.repaint(); - - long timestampEnd = System.currentTimeMillis(); - - String timeElapsed = "Dauer: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; - System.out.println(timeElapsed); - this.message.setText(timeElapsed); - } catch (RemoteException | NotBoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + // for lower half: + boxULx = 0 ; boxULy = RESY/2; boxW = RESX ; boxH = RESY/2; } - } - } - - public void mousePressed(MouseEvent e) { - this.boxULx = e.getX(); - this.boxULy = e.getY(); - this.boxW = 1; - this.boxH = 1; - this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); - this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); - } - - public void mouseDragged(MouseEvent e) { - this.boxW = e.getX() - this.boxULx + 1; - this.boxH = e.getY() - this.boxULy + 1; - int m = Math.min(boxW, boxH); - this.boxW = m; - this.boxH = m; - this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); - this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); - this.view.repaint(); - } - - public void mouseReleased(MouseEvent e) { - - if (e.getButton() == MouseEvent.BUTTON1) { - this.view.repaint(); - this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); - } - } - public void mouseMoved(MouseEvent e) { - } + ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX; + ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY; + w *= this.boxW / (double) (RESX); + h *= this.boxH / (double) (RESY); + LRx = ULx + w; + LRy = ULy + h; + System.out.println("computed="+ULx + "/" + ULy + "/" + LRx + "/" + LRy); + this.boxULx = 0; + this.boxULy = 0; + this.boxW = MGuiRMI.RESX; + this.boxH = MGuiRMI.RESY; + this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); + // end alex + int[] colors = null; + + + this.remoteCalcObj.iterateAllPoints(this.maxIterations * 1000, MGuiRMI.RESX, MGuiRMI.RESY/2); + + /* + int[] lookupTable = generateLookupTable(this.maxIterations.getValue() * 1000); + colors = new int[MGuiRMI.RESX * MGuiRMI.RESY]; + MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable); + + BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY, BufferedImage.TYPE_INT_ARGB); + colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY, colors, 0, MGuiRMI.RESX); + this.view.setIcon(new ImageIcon(colorImage)); + + this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.view.repaint(); - public void mouseExited(MouseEvent e) { - } + long timestampEnd = System.currentTimeMillis(); - public void mouseEntered(MouseEvent e) { - } + String timeElapsed = "Dauer: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; + System.out.println(timeElapsed); + this.message.setText(timeElapsed); + * */ - public void mouseClicked(MouseEvent e) { - } + int[] lookupTable = generateLookupTable(this.maxIterations * 1000); + colors = new int[MGuiRMI.RESX * MGuiRMI.RESY/2]; + MGuiRMI.applyLookupTable(remoteCalcObj.getResult(), colors, lookupTable); - // process a new slider value - public void stateChanged(ChangeEvent ce) { - if (ce.getSource() == this.maxIterations) { - // System.out.println("Neuer Wert"); - this.nrIterations = this.maxIterations.getValue() * 1000; + BufferedImage colorImage = new BufferedImage(MGuiRMI.RESX, MGuiRMI.RESY/2, BufferedImage.TYPE_INT_ARGB); + colorImage.setRGB(0, 0, MGuiRMI.RESX, MGuiRMI.RESY/2, colors, 0, MGuiRMI.RESX); + this.view.setIcon(new ImageIcon(colorImage)); + + long timestampEnd = System.currentTimeMillis(); + + String timeElapsed = "Zeit: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; + System.out.println(timeElapsed); + //this.view.setText(timeElapsed); + + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - } + } +} + +public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, MouseMotionListener { - // main, just instantiate an MGui object, gives control to the Gui - public static void main(String[] args) { - @SuppressWarnings("unused") - MGuiRMI gui = new MGuiRMI(); - } + // GUI elements + JFrame frame; + JPanel panel; + JButton endButton; + JButton backButton; + JButton calcButton; + JTextField hostTextField; + JSlider maxIterations; + MyJLabel viewUpper; + MyJLabel viewLower; + JLabel message; + int nrIterations; + + // box management + int boxULx, boxULy, boxW, boxH; + boolean dragging = false; + + // this one does all the calculating work + RMIMandelbrotCalculationsInterface remoteCalcObj; + RMIMandelbrotCalculationsInterface remoteCalcObj2; + + // how many points in the image? + // change if you want a higher resolution + public static int RESX = 600; + public static int RESY = 600; + + MGuiRMI() { + // set up GUI + this.frame = new JFrame("Mandelbrotmenge"); + this.panel = new JPanel(); + this.endButton = new JButton("Ende"); + this.panel.add(this.endButton); + this.backButton = new JButton("Zurück"); + this.panel.add(this.backButton); + this.calcButton = new JButton("Rechnen"); + this.hostTextField = new JTextField(20); + this.hostTextField.setText("localhost"); + this.panel.add(this.calcButton); + this.panel.add(this.hostTextField); + this.frame.add(this.panel); + this.frame.setSize(700, 720); + this.frame.setVisible(true); + this.viewUpper = new MyJLabel(); + this.viewLower = new MyJLabel(); + this.maxIterations = new JSlider(0, 50, 30); + this.panel.add(this.maxIterations); + this.panel.add(this.viewUpper); + this.panel.add(this.viewLower); + this.message = new JLabel("Status"); + this.message.setBorder(new BevelBorder(BevelBorder.LOWERED)); + this.frame.add(this.message,BorderLayout.SOUTH); + + this.endButton.addActionListener(this); + this.backButton.addActionListener(this); + this.calcButton.addActionListener(this); + this.maxIterations.addChangeListener(this); + + this.maxIterations.setMajorTickSpacing(10); + this.maxIterations.setPaintTicks(true); + this.maxIterations.setPaintLabels(true); + + this.viewUpper.addMouseListener(this); + this.viewUpper.addMouseMotionListener(this); + this.viewLower.addMouseListener(this); + this.viewLower.addMouseMotionListener(this); + + this.boxULx = 0; + this.boxULy = 0; + this.boxW = MGuiRMI.RESX; + this.boxH = MGuiRMI.RESY; + + this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // Non-Gui stuff + this.nrIterations = 1000; + } + + // visualization + static void applyLookupTable(int[] data, int[] dest, int[] lookupTable) { + for (int i = 0; i < data.length; i++) { + dest[i] = lookupTable[data[i]]; + } + } + + // here we check what the buttons do + public void actionPerformed(ActionEvent ae) { + if (ae.getSource() == this.endButton) { + System.out.println("Ende"); + System.exit(0); + } else + + if (ae.getSource() == this.backButton) { + System.out.println("Zurueck"); + // Zoom und Ausschnitt zurücksetzen + + double ULx = -2; + double ULy = 2; + double LRx = 2; + double LRy = -2; + this.boxULx = 0; + this.boxULy = 0; + this.boxW = MGuiRMI.RESX; + this.boxH = MGuiRMI.RESY; + this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.viewUpper.repaint(); + this.viewLower.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.viewLower.repaint(); + if (this.remoteCalcObj == null) + { + String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgeführt"; + this.message.setText(message); + System.out.println(message); + } + else + { + try { + this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.message.setText("Ausschnitt zurückgesetzt"); + } + if (this.remoteCalcObj2 == null) + { + String message = "Fehler: noch nicht verbunden, noch keine Berechnung durchgeführt"; + this.message.setText(message); + System.out.println(message); + } + else + { + try { + this.remoteCalcObj2.setView(ULx, ULy, LRx, LRy); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.message.setText("Ausschnitt zurückgesetzt"); + } + } else + + if (ae.getSource() == this.calcButton) { + String hostname = this.hostTextField.getText(); + System.out.println("Verbinde mit RMI Registry auf Host: " + hostname); + try { + Registry registry = LocateRegistry.getRegistry(hostname); + this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface"); + this.remoteCalcObj2 = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIMandelbrotCalculationsInterface2"); + /** CODE SEBASTIAN + + System.out.println("Rechnen"); + long timestampStart = System.currentTimeMillis(); + + //this.boxW = this.boxW / 2; + //MGuiRMI.RESX = MGuiRMI.RESX / 2; + + double ULx = 0; + double ULy = 0; + double LRx = 0; + double LRy = 0; + + ULx = this.remoteCalcObj.getULx(); + ULy = this.remoteCalcObj.getULy(); + LRx = this.remoteCalcObj.getLRx(); + LRy = this.remoteCalcObj.getLRy(); + + double w = LRx - ULx; + double h = LRy - ULy; + ULx = ULx + w * this.boxULx / (double) MGuiRMI.RESX; + ULy = ULy + h * this.boxULy / (double) MGuiRMI.RESY; + w *= this.boxW / (double) (RESX); + h *= this.boxH / (double) (RESX); + LRx = ULx + w; + LRy = ULy + h; + System.out.println(ULx + "/" + ULy + "/" + LRx + "/" + LRy); + this.boxULx = 0; + this.boxULy = 0; + this.boxW = MGuiRMI.RESX; + this.boxH = MGuiRMI.RESY; + int[] colors = null; + + //this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); + this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); + + end */ + /* Code Alex */ + System.out.println("Rechnen"); + + RMIMandelbrotCalculationThread rmimct = new RMIMandelbrotCalculationThread(true, this.viewUpper, this.remoteCalcObj, maxIterations.getValue()); + new Thread(rmimct).start(); + RMIMandelbrotCalculationThread rmimct2 = new RMIMandelbrotCalculationThread(false, this.viewLower, this.remoteCalcObj2, maxIterations.getValue()); + new Thread(rmimct2).start(); + + } catch (RemoteException | NotBoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + // Zoom not wirking for lower... + + public void mousePressed(MouseEvent e) { + this.boxULx = e.getX(); + this.boxULy = e.getY(); + this.boxW = 1; + this.boxH = 1; + this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); + } + + public void mouseDragged(MouseEvent e) { + this.boxW = e.getX() - this.boxULx + 1; + this.boxH = e.getY() - this.boxULy + 1; + int m = Math.min(boxW, boxH); + this.boxW = m; + this.boxH = m; + this.viewUpper.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); + this.message.setText("boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); + this.viewUpper.repaint(); + } + + public void mouseReleased(MouseEvent e) { + + if (e.getButton() == MouseEvent.BUTTON1) { + this.viewUpper.repaint(); + this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); + } + } + + public void mouseMoved(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseClicked(MouseEvent e) { + } + + // process a new slider value + public void stateChanged(ChangeEvent ce) { + if (ce.getSource() == this.maxIterations) { + // System.out.println("Neuer Wert"); + this.nrIterations = this.maxIterations.getValue() * 1000; + } + } + + // main, just instantiate an MGui object, gives control to the Gui + public static void main(String[] args) { + @SuppressWarnings("unused") + MGuiRMI gui = new MGuiRMI(); + } } diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java index ba6b699..9997b42 100644 --- a/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java +++ b/VerteilteSysteme-Examples/src/verteiltesysteme/mandelbrot/rmi/RMIMandelbrotCalculationsServer.java @@ -21,53 +21,53 @@ class LoopbackSocketFactory extends RMISocketFactory { .createSocket(host, port); } } -*/ +*/ class Complex { - double r; - double i; - - Complex() { - r = 0.0; - i = 0.0; - } - - Complex(double r, double i) { - this.r = r; - this.i = i; - } - - void mulBy(Complex other) { - double rTmp = this.r * other.r - this.i * other.i; - this.i = this.r * other.i + this.i * other.r; - this.r = rTmp; - } - - void add(Complex other) { - this.r += other.r; - this.i += other.i; - } - - void sub(Complex other) { - this.r -= other.r; - this.i -= other.i; - } - - double absValue() { - return Math.sqrt(this.r * this.r + this.i * this.i); - } + double r; + double i; + + Complex() { + r = 0.0; + i = 0.0; + } + + Complex(double r, double i) { + this.r = r; + this.i = i; + } + + void mulBy(Complex other) { + double rTmp = this.r * other.r - this.i * other.i; + this.i = this.r * other.i + this.i * other.r; + this.r = rTmp; + } + + void add(Complex other) { + this.r += other.r; + this.i += other.i; + } + + void sub(Complex other) { + this.r -= other.r; + this.i -= other.i; + } + + double absValue() { + return Math.sqrt(this.r * this.r + this.i * this.i); + } } public class RMIMandelbrotCalculationsServer implements RMIMandelbrotCalculationsInterface { public RMIMandelbrotCalculationsServer() {} - + public static void main(String args[]) { try { - //RMISocketFactory.setSocketFactory(new LoopbackSocketFactory()); - - RMIMandelbrotCalculationsServer obj = new RMIMandelbrotCalculationsServer(); - RMIMandelbrotCalculationsInterface stub = (RMIMandelbrotCalculationsInterface) UnicastRemoteObject.exportObject(obj, 0); + //RMISocketFactory.setSocketFactory(new LoopbackSocketFactory()); + + RMIMandelbrotCalculationsServer obj = new RMIMandelbrotCalculationsServer(); + RMIMandelbrotCalculationsInterface stub = (RMIMandelbrotCalculationsInterface) UnicastRemoteObject.exportObject(obj, 0); // Bind the remote object's stub in the registry Registry registry = LocateRegistry.getRegistry(); @@ -79,73 +79,72 @@ public class RMIMandelbrotCalculationsServer implements RMIMandelbrotCalculation e.printStackTrace(); } } - - // hier wird das Ergebnis von iterateAll() gespeichert - protected int[] result = null; - - // der augenblicklich gewaehlte Ausschnitt - //double ULx = -2, ULy = -2, LRx = 2, LRy = 2; - double ULx = -0.16099999999999995, ULy = -0.9365333333333333, LRx = -0.03533333333333327, LRy = -0.8108666666666666; - - int iterateOnePoint(Complex c, int maxIterations, double maxModulus) { - Complex z = new Complex(0., 0.); - - for (int i = 0; i < maxIterations; i++) { - z.mulBy(z); - z.add(c); - double m = z.absValue(); - if (m > maxModulus) { - return i; - } - } - return maxIterations; - } - - public void iterateAllPoints(int maxIterations, double nrPointsX, double nrPointsY) { - - this.result = new int[(int) (nrPointsX * nrPointsY)]; - - int counter = 0; - double stepX = (this.LRx - this.ULx) / nrPointsX; - double stepY = (this.LRy - this.ULy) / nrPointsY; - double i = this.ULy; - for (int cy = 0; cy < nrPointsY; cy++) { - double r = this.ULx; - for (int cx = 0; cx < nrPointsX; cx++) { - Complex c = new Complex(r, i); - this.result[counter] = maxIterations - this.iterateOnePoint(c, maxIterations, 2.0); - counter += 1; - r += stepX; - } - i += stepY; - } - } - - public int[] getResult() { - return this.result; - } - - public double getULx() { - return this.ULx; - } - - public double getLRx() { - return this.LRx; - } - - public double getULy() { - return this.ULy; - } - - public double getLRy() { - return this.LRy; - } - - public void setView(double ULx, double ULy, double LRx, double LRy) { - this.ULx = ULx; - this.ULy = ULy; - this.LRx = LRx; - this.LRy = LRy; - } + + // hier wird das Ergebnis von iterateAll() gespeichert + protected int[] result = null; + + // der augenblicklich gewaehlte Ausschnitt + double ULx = -2, ULy = 2, LRx = 2, LRy = -2; + + int iterateOnePoint(Complex c, int maxIterations, double maxModulus) { + Complex z = new Complex(0., 0.); + + for (int i = 0; i < maxIterations; i++) { + z.mulBy(z); + z.add(c); + double m = z.absValue(); + if (m > maxModulus) { + return i; + } + } + return maxIterations; + } + + public void iterateAllPoints(int maxIterations, double nrPointsX, double nrPointsY) { + + this.result = new int[(int) (nrPointsX * nrPointsY)]; + + int counter = 0; + double stepX = (this.LRx - this.ULx) / nrPointsX; + double stepY = (this.LRy - this.ULy) / nrPointsY; + double i = this.ULy; + for (int cy = 0; cy < nrPointsY; cy++) { + double r = this.ULx; + for (int cx = 0; cx < nrPointsX; cx++) { + Complex c = new Complex(r, i); + this.result[counter] = maxIterations - this.iterateOnePoint(c, maxIterations, 2.0); + counter += 1; + r += stepX; + } + i += stepY; + } + } + + public int[] getResult() { + return this.result; + } + + public double getULx() { + return this.ULx; + } + + public double getLRx() { + return this.LRx; + } + + public double getULy() { + return this.ULy; + } + + public double getLRy() { + return this.LRy; + } + + public void setView(double ULx, double ULy, double LRx, double LRy) { + this.ULx = ULx; + this.ULy = ULy; + this.LRx = LRx; + this.LRy = LRy; + } }