|
|
@ -1,5 +1,7 @@ |
|
|
|
package verteiltesysteme.mandelbrot.rmi; |
|
|
|
|
|
|
|
import java.awt.BorderLayout; |
|
|
|
|
|
|
|
//Mandelbot Example A. Gepperth |
|
|
|
|
|
|
|
import java.awt.Color; |
|
|
@ -22,6 +24,8 @@ import javax.swing.JFrame; |
|
|
|
import javax.swing.JLabel; |
|
|
|
import javax.swing.JPanel; |
|
|
|
import javax.swing.JSlider; |
|
|
|
import javax.swing.JTextField; |
|
|
|
import javax.swing.border.BevelBorder; |
|
|
|
import javax.swing.event.ChangeEvent; |
|
|
|
import javax.swing.event.ChangeListener; |
|
|
|
|
|
|
@ -51,7 +55,7 @@ class MyJLabel extends JLabel { |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void paintComponent(Graphics g) { |
|
|
|
super.paintComponent(g); |
|
|
|
super.paintComponent(g); |
|
|
|
g.setColor(Color.black); |
|
|
|
g.drawRect(this.boxULx, this.boxULy, this.boxW, this.boxH); |
|
|
|
} |
|
|
@ -66,8 +70,10 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
JButton endButton; |
|
|
|
JButton backButton; |
|
|
|
JButton calcButton; |
|
|
|
JTextField hostTextField; |
|
|
|
JSlider maxIterations; |
|
|
|
MyJLabel view; |
|
|
|
JLabel message; |
|
|
|
int nrIterations; |
|
|
|
|
|
|
|
// box management |
|
|
@ -79,8 +85,8 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
|
|
|
|
// how many points in the image? |
|
|
|
// change if you want a higher resolution |
|
|
|
public static final int RESX = 600; |
|
|
|
public static final int RESY = 600; |
|
|
|
public static int RESX = 600; |
|
|
|
public static int RESY = 600; |
|
|
|
|
|
|
|
MGuiRMI() { |
|
|
|
// set up GUI |
|
|
@ -88,17 +94,23 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
this.panel = new JPanel(); |
|
|
|
this.endButton = new JButton("Ende"); |
|
|
|
this.panel.add(this.endButton); |
|
|
|
this.backButton = new JButton("Zurueck"); |
|
|
|
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(500, 500); |
|
|
|
this.frame.setSize(700, 720); |
|
|
|
this.frame.setVisible(true); |
|
|
|
this.view = new MyJLabel("Platzhalter"); |
|
|
|
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); |
|
|
@ -116,16 +128,10 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
this.boxULy = 0; |
|
|
|
this.boxW = MGuiRMI.RESX; |
|
|
|
this.boxH = MGuiRMI.RESY; |
|
|
|
|
|
|
|
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
|
|
|
|
|
|
// Non-Gui stuff |
|
|
|
String host = ""; |
|
|
|
try { |
|
|
|
Registry registry = LocateRegistry.getRegistry(host); |
|
|
|
this.remoteCalcObj = (RMIMandelbrotCalculationsInterface) registry.lookup("RMIEchoInterface"); |
|
|
|
} catch (RemoteException | NotBoundException e) { |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
this.nrIterations = 1000; |
|
|
|
} |
|
|
|
|
|
|
@ -157,6 +163,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
|
|
|
|
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; |
|
|
@ -167,68 +174,85 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
this.boxH = MGuiRMI.RESY; |
|
|
|
this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); |
|
|
|
this.view.repaint(); |
|
|
|
try { |
|
|
|
this.remoteCalcObj.setView(ULx, ULy, LRx, LRy); |
|
|
|
} catch (RemoteException e) { |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
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"); |
|
|
|
} |
|
|
|
} else |
|
|
|
|
|
|
|
if (ae.getSource() == this.calcButton) { |
|
|
|
System.out.println("Rechnen"); |
|
|
|
long timestampStart = System.currentTimeMillis(); |
|
|
|
|
|
|
|
double ULx = 0; |
|
|
|
double ULy = 0; |
|
|
|
double LRx = 0; |
|
|
|
double LRy = 0; |
|
|
|
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("RMIEchoInterface"); |
|
|
|
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(); |
|
|
|
} catch (RemoteException e) { |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
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; |
|
|
|
try { |
|
|
|
|
|
|
|
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); |
|
|
|
} catch (RemoteException e) { |
|
|
|
// TODO Auto-generated catch block |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
|
|
|
|
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)); |
|
|
|
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(); |
|
|
|
this.view.setBox(this.boxULx, this.boxULy, this.boxW, this.boxH); |
|
|
|
this.view.repaint(); |
|
|
|
|
|
|
|
long timestampEnd = System.currentTimeMillis(); |
|
|
|
|
|
|
|
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(); |
|
|
|
} |
|
|
|
|
|
|
|
String timeElapsed = "Zeit: " + ((timestampEnd - timestampStart) / 1000.0) + " sec"; |
|
|
|
System.out.println(timeElapsed); |
|
|
|
this.view.setText(timeElapsed); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -238,6 +262,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
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) { |
|
|
@ -247,6 +272,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
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(); |
|
|
|
} |
|
|
|
|
|
|
@ -254,6 +280,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
|
|
|
|
if (e.getButton() == MouseEvent.BUTTON1) { |
|
|
|
this.view.repaint(); |
|
|
|
this.message.setText("Gesetzt: boxULx: " + this.boxULx + " boxULy: " + this.boxULy + " boxW: " + this.boxW + " boxH: " + this.boxH); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -272,7 +299,7 @@ public class MGuiRMI implements ActionListener, ChangeListener, MouseListener, M |
|
|
|
// process a new slider value |
|
|
|
public void stateChanged(ChangeEvent ce) { |
|
|
|
if (ce.getSource() == this.maxIterations) { |
|
|
|
//System.out.println("Neuer Wert"); |
|
|
|
// System.out.println("Neuer Wert"); |
|
|
|
this.nrIterations = this.maxIterations.getValue() * 1000; |
|
|
|
} |
|
|
|
} |
|
|
|