BUGFIX!!! Schnittpunkte werden korrrekt berechnet.

This commit is contained in:
Armin Wolf 2017-10-15 09:55:29 +02:00
parent 274778b780
commit 16b0ad7bec
6 changed files with 135 additions and 76 deletions

View File

@ -93,31 +93,10 @@ public abstract class AbstractPresenter implements Observer {
Double current = Double.parseDouble(result[2]); Double current = Double.parseDouble(result[2]);
Integer progress = (int) (100 * (current / max)); Integer progress = (int) (100 * (current / max));
//100% erreicht //100% erreicht
if (progress == 100) { SwingUtilities.invokeLater(() -> {
Thread t = new Thread(() -> { getView().showImportProgress(progress);
calculateIntersections(); });
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(() -> {
getView().showImportProgress(progress);
getView().enableFunctionality();
getView().getProgressDialog().dispose();
getView().logHeading("Import aus Datei");
getView().log("Anzahl der Geraden: " + getModel().getLines().size() + ".");
getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + ".");
getView().logSuccess("Import war Erfolgreich! <hr>");
});
} else {
SwingUtilities.invokeLater(() -> {
getView().showImportProgress(progress);
});
}
} }
if (result[0] == "export") { if (result[0] == "export") {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
@ -133,33 +112,10 @@ public abstract class AbstractPresenter implements Observer {
getView().log(result[1] + "<hr>"); getView().log(result[1] + "<hr>");
}); });
} }
if (result[0] == "import-picture") {
//100% erreicht
Thread t = new Thread(() -> {
calculateIntersections();
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(() -> {
getView().enableFunctionality();
getView().logHeading("Import eines Bildes");
getView().log("Anzahl der Geraden: " + getModel().getLines().size() + ".");
getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + ".");
getView().logSuccess("Der Import war Erfolgreich! <hr>");
});
}
} }
public void calculateIntersections() { private void calculateIntersections() {
try { try {
Thread thread = new Thread(() -> { Thread thread = new Thread(() -> {
getModel().resetRanges(); getModel().resetRanges();
@ -178,6 +134,28 @@ public abstract class AbstractPresenter implements Observer {
} }
} }
protected void computeIntersections(){
System.out.println("Anzahl der Geraden: "+ getModel().getLines().size());
Thread t = new Thread(() -> {
calculateIntersections();
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(() -> {
getView().enableFunctionality();
getView().getProgressDialog().dispose();
getView().logHeading("Informationen zu dem aktuellen Modell");
getView().log("Anzahl der Geraden: " + getModel().getLines().size() + ".");
getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + ".");
getView().logSuccess("Import war Erfolgreich! <hr>");
});
}
public LineModel getModel() { public LineModel getModel() {
return model; return model;

View File

@ -48,6 +48,11 @@ public class Presenter extends AbstractPresenter {
/*************************************************************************************************************************** /***************************************************************************************************************************
* Ausführung der Algorithmen * Ausführung der Algorithmen
***************************************************************************************************************************/ ***************************************************************************************************************************/
/**
* Die Berechnung durch des Algorithmus zum LMS-Schätzer wird gestartet.
* @param input Parameter für den Algorithmus
*/
public void calculateLMS(String[] input) { public void calculateLMS(String[] input) {
if (input[0] != null && input[1] != null) { if (input[0] != null && input[1] != null) {
if (lmsThread == null || !lmsThread.isAlive()) { if (lmsThread == null || !lmsThread.isAlive()) {
@ -71,6 +76,10 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
* Die Berechnung durch des Algorithmus zum RM-Schätzer wird gestartet.
* @param input Parameter für den Algorithmus
*/
public void calculateRM(String input) { public void calculateRM(String input) {
if (input != null) { if (input != null) {
if (rmThread == null || !rmThread.isAlive()) { if (rmThread == null || !rmThread.isAlive()) {
@ -92,6 +101,10 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
* Die Berechnung durch des Algorithmus zum TS-Schätzer wird gestartet.
* @param input Parameter für den Algorithmus
*/
public void calculateTS(String input) { public void calculateTS(String input) {
if (input != null) { if (input != null) {
if (tsThread == null || !tsThread.isAlive()) { if (tsThread == null || !tsThread.isAlive()) {
@ -115,12 +128,17 @@ public class Presenter extends AbstractPresenter {
* Hilfsmethoden * Hilfsmethoden
***************************************************************************************************************************/ ***************************************************************************************************************************/
/**
* Startet den Import des Datensatzes.
* @param file importierender Datensatz
*/
public void startImport(File file) { public void startImport(File file) {
if (importThread == null || !importThread.isAlive()) { if (importThread == null || !importThread.isAlive()) {
importThread = new Thread(() -> { importThread = new Thread(() -> {
DataImporter importer = new DataImporter(file); DataImporter importer = new DataImporter(file);
importer.addObserver(this); importer.addObserver(this);
getModel().setLines(importer.run()); getModel().setLines(importer.run());
computeIntersections();
}); });
importThread.start(); importThread.start();
try { try {
@ -131,12 +149,17 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
* Startet den Import eines Bildes.
* @param file importierendes Bild
*/
public void startPictureDataImport(File file) { public void startPictureDataImport(File file) {
if (importPictureThread == null || !importPictureThread.isAlive()) { if (importPictureThread == null || !importPictureThread.isAlive()) {
importPictureThread = new Thread(() -> { importPictureThread = new Thread(() -> {
PictureProcessor pictureProcessor = new PictureProcessor(this, file); PictureProcessor pictureProcessor = new PictureProcessor(this, file);
pictureProcessor.addObserver(this); pictureProcessor.addObserver(this);
pictureProcessor.run(); pictureProcessor.run();
computeIntersections();
}); });
importPictureThread.start(); importPictureThread.start();
try { try {
@ -149,6 +172,10 @@ public class Presenter extends AbstractPresenter {
} }
/**
* Startet den Export des akteullen Datensatzes (nur der Geraden)
* @param file Datei in der die Informationen gespeichert werden sollen
*/
public void startExport(File file) { public void startExport(File file) {
if (exportThread == null || !exportThread.isAlive()) { if (exportThread == null || !exportThread.isAlive()) {
exportThread = new Thread(() -> { exportThread = new Thread(() -> {
@ -165,6 +192,10 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
* Startet den Export des akteullen Datensatzes im Rahmen der Evaluation (nur der Geraden)
* @param file Datei in der die Informationen gespeichert werden sollen
*/
public void startDatasetExportEvaluation(File file) { public void startDatasetExportEvaluation(File file) {
if (exportThread == null || !exportThread.isAlive()) { if (exportThread == null || !exportThread.isAlive()) {
exportThread = new Thread(() -> { exportThread = new Thread(() -> {
@ -181,6 +212,11 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
* Startet den Export der Ergebnisse der Evaluation in Form einer LaTeX Datei
* @param model TableModel das die Berechnenten Ergebnisse enthält
* @param file Datei in die exportiert werden soll
*/
public void startResultExport(DefaultTableModel model, File file) { public void startResultExport(DefaultTableModel model, File file) {
if (exportResultThread == null || !exportResultThread.isAlive()) { if (exportResultThread == null || !exportResultThread.isAlive()) {
exportResultThread = new Thread(() -> { exportResultThread = new Thread(() -> {
@ -196,13 +232,32 @@ public class Presenter extends AbstractPresenter {
} }
} }
public void generateDataset(int n) { /**
* Startet das generieren der Datensätze der Größe <code>n</code>
* @param n Größe des Datensatzes
* @param type Art der Datensatzes
*/
public void generateDataset(int n, int type) {
if (generatorThread == null || !generatorThread.isAlive()) { if (generatorThread == null || !generatorThread.isAlive()) {
generatorThread = new Thread(() -> { generatorThread = new Thread(() -> {
DatasetGenerator generator = new DatasetGenerator(); DatasetGenerator generator = new DatasetGenerator();
generator.addObserver(this); generator.addObserver(this);
getModel().setLines(generator.generateDataCloud(n)); switch (type){
calculateIntersections(); case 0:
getModel().setLines(generator.generateDataCloud(n));
break;
case 1:
getModel().setLines(generator.generateDataLines(n));
break;
case 2:
getModel().setLines(generator.generateCircle(n));
break;
default:
getModel().setLines(generator.generateDataCloud(n));
break;
}
computeIntersections();
getView().enableFunctionality(); getView().enableFunctionality();
}); });
generatorThread.start(); generatorThread.start();
@ -214,8 +269,14 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
*
* @param typ
* @param n
* @param alg
* @param datasettyp
*/
public void startEvaluation(int typ, int n, int alg, String datasettyp) { public void startEvaluation(int typ, int n, int alg, String datasettyp) {
if (evalThread == null || !evalThread.isAlive()) { if (evalThread == null || !evalThread.isAlive()) {
evalThread = new Thread(() -> { evalThread = new Thread(() -> {
try { try {
@ -230,8 +291,14 @@ public class Presenter extends AbstractPresenter {
} }
} }
/**
*
* @param typ
* @param n
* @param alg
* @param file
*/
public void startEvaluation(int typ, int n, int alg, File file) { public void startEvaluation(int typ, int n, int alg, File file) {
if (evalThread == null || !evalThread.isAlive()) { if (evalThread == null || !evalThread.isAlive()) {
evalThread = new Thread(() -> { evalThread = new Thread(() -> {
try { try {

View File

@ -18,8 +18,7 @@ import java.util.TreeSet;
*/ */
public class IntersectionComputer { public class IntersectionComputer {
private LinkedList<Line> lines; private LinkedList<Line> lines;
private List<Line>[] subList;
private TreeSet<Point> intersections; private TreeSet<Point> intersections;
private Double xMinimum; private Double xMinimum;
@ -32,7 +31,6 @@ public class IntersectionComputer {
public IntersectionComputer(LinkedList<Line> lines) { public IntersectionComputer(LinkedList<Line> lines) {
this.lines = lines; this.lines = lines;
this.worker = new Thread[4]; this.worker = new Thread[4];
this.subList = new LinkedList[4];
this.intersections = new TreeSet<>(); this.intersections = new TreeSet<>();
xMinimum = Double.MAX_VALUE; xMinimum = Double.MAX_VALUE;
@ -41,9 +39,9 @@ public class IntersectionComputer {
yMaximum = Double.MIN_VALUE; yMaximum = Double.MIN_VALUE;
} }
public ArrayList<Point> compute(double lower, double higher) { public ArrayList<Point> compute(final double lower, final double higher) {
if (lines.size() >= 12) { if (lines.size() > 10) {
worker[0] = new Thread(() -> { worker[0] = new Thread(() -> {
work(lines.subList(0, (lines.size() / 4)),lower,higher); work(lines.subList(0, (lines.size() / 4)),lower,higher);
}); });
@ -81,9 +79,10 @@ public class IntersectionComputer {
return compute(-99999, 99999); return compute(-99999, 99999);
} }
private synchronized void work(List<Line> lines, double lower, double higher) { private void work(List<Line> lines, double lower, double higher) {
IntersectionCounter counter = new IntersectionCounter(); IntersectionCounter counter = new IntersectionCounter();
counter.run(lines, new Interval(lower, higher)); int count = counter.run(lines, new Interval(lower, higher));
System.out.println("count: "+count);
ArrayList<Point> points = counter.calculateIntersectionAbscissas(); ArrayList<Point> points = counter.calculateIntersectionAbscissas();
for (Point p : points) { for (Point p : points) {
if (!isFound(p)) { if (!isFound(p)) {
@ -110,26 +109,26 @@ public class IntersectionComputer {
} }
} }
public synchronized void setRanges(Point point) { public void setRanges(Point point) {
xMaximum = (point.getX() > xMaximum) ? point.getX() : xMaximum; xMaximum = (point.getX() > xMaximum) ? point.getX() : xMaximum;
xMinimum = (point.getX() < xMinimum) ? point.getX() : xMinimum; xMinimum = (point.getX() < xMinimum) ? point.getX() : xMinimum;
yMaximum = (point.getY() > yMaximum) ? point.getY() : yMaximum; yMaximum = (point.getY() > yMaximum) ? point.getY() : yMaximum;
yMinimum = (point.getY() < yMinimum) ? point.getY() : yMinimum; yMinimum = (point.getY() < yMinimum) ? point.getY() : yMinimum;
} }
public Double getxMinimum() { public synchronized Double getxMinimum() {
return xMinimum; return xMinimum;
} }
public Double getxMaximum() { public synchronized Double getxMaximum() {
return xMaximum; return xMaximum;
} }
public Double getyMinimum() { public synchronized Double getyMinimum() {
return yMinimum; return yMinimum;
} }
public Double getyMaximum() { public synchronized Double getyMaximum() {
return yMaximum; return yMaximum;
} }
} }

View File

@ -10,6 +10,7 @@ import presenter.algorithms.advanced.TheilSenEstimator;
import presenter.algorithms.naiv.NaivLeastMedianOfSquaresEstimator; import presenter.algorithms.naiv.NaivLeastMedianOfSquaresEstimator;
import presenter.algorithms.naiv.NaivRepeatedMedianEstimator; import presenter.algorithms.naiv.NaivRepeatedMedianEstimator;
import presenter.algorithms.naiv.NaivTheilSenEstimator; import presenter.algorithms.naiv.NaivTheilSenEstimator;
import presenter.algorithms.util.IntersectionComputer;
import presenter.algorithms.util.IntersectionCounter; import presenter.algorithms.util.IntersectionCounter;
import presenter.generator.DatasetGenerator; import presenter.generator.DatasetGenerator;
import presenter.io.DataImporter; import presenter.io.DataImporter;
@ -85,10 +86,12 @@ public class EvaluateAlgorithms extends Observable {
this.iterations = n; this.iterations = n;
this.alg = alg; this.alg = alg;
IntersectionCounter counter = new IntersectionCounter(); //IntersectionCounter counter = new IntersectionCounter();
counter.run(arrangement.getLines(), new Interval(-99999, 99999)); //counter.run(arrangement.getLines(), new Interval(-99999, 99999));
counter.calculateIntersectionAbscissas(arrangement); //counter.calculateIntersectionAbscissas(arrangement);
IntersectionComputer computer = new IntersectionComputer(arrangement.getLines());
arrangement.setNodes(computer.compute());
lmsL = new LinkedList<>(arrangement.getLines()); lmsL = new LinkedList<>(arrangement.getLines());
rmL = new LinkedList<>(arrangement.getLines()); rmL = new LinkedList<>(arrangement.getLines());
@ -109,9 +112,12 @@ public class EvaluateAlgorithms extends Observable {
this.iterations = n; this.iterations = n;
this.alg = alg; this.alg = alg;
IntersectionCounter counter = new IntersectionCounter(); //IntersectionCounter counter = new IntersectionCounter();
counter.run(arrangement.getLines(), new Interval(-99999, 99999)); //counter.run(arrangement.getLines(), new Interval(-99999, 99999));
counter.calculateIntersectionAbscissas(arrangement); //counter.calculateIntersectionAbscissas(arrangement);
IntersectionComputer computer = new IntersectionComputer(arrangement.getLines());
arrangement.setNodes(computer.compute());
lmsL = new LinkedList<>(arrangement.getLines()); lmsL = new LinkedList<>(arrangement.getLines());

View File

@ -34,22 +34,28 @@ public class GenerateDataListener implements ActionListener {
if (dialog == null || !dialog.isVisible()) { if (dialog == null || !dialog.isVisible()) {
dialog = new JDialog(); dialog = new JDialog();
dialog.setTitle("generiere Datensatz");
dialog.setAlwaysOnTop(true); dialog.setAlwaysOnTop(true);
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault()); NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
DecimalFormat decimalFormat = (DecimalFormat) numberFormat; DecimalFormat decimalFormat = (DecimalFormat) numberFormat;
decimalFormat.setGroupingUsed(false); decimalFormat.setGroupingUsed(false);
JTextField textField = new JFormattedTextField(decimalFormat); JTextField textField = new JFormattedTextField(decimalFormat);
textField.setColumns(20); textField.setColumns(10);
textField.setText("20");
JButton aproveButton = new JButton("start"); JButton aproveButton = new JButton("start");
String[] options = {"Punktwolke", "Gerade", "Kreis und Gerade"};
JComboBox<String> datasetTypeComboBox = new JComboBox<>(options);
dialog.setSize(350, 70); dialog.setSize(350, 70);
dialog.setLayout(new FlowLayout()); dialog.setLayout(new FlowLayout());
dialog.setResizable(false); dialog.setResizable(false);
dialog.setLocationRelativeTo(presenter.getView()); dialog.setLocationRelativeTo(presenter.getView());
dialog.add(datasetTypeComboBox);
dialog.add(textField); dialog.add(textField);
dialog.add(aproveButton); dialog.add(aproveButton);
aproveButton.addActionListener(e1 -> { aproveButton.addActionListener(e1 -> {
int n = Integer.parseInt(textField.getText()); int n = Integer.parseInt(textField.getText());
Thread t = new Thread(() -> presenter.generateDataset(n)); int type = datasetTypeComboBox.getSelectedIndex();
Thread t = new Thread(() -> presenter.generateDataset(n,type));
t.start(); t.start();
dialog.dispose(); dialog.dispose();
}); });

View File

@ -121,10 +121,13 @@ public class DualityPanel extends JPanel {
this.setFocusable(true); this.setFocusable(true);
JTextArea info = new JTextArea(); JTextArea info = new JTextArea();
info.setText("Um in dem Plot hineinzuzoomen kann das Mausrad verwendett werden. \nUm sich anschließen vertikal bzw. horizontal zu bewegen kann die Kombination (Umschalt/Steuerung)\nund Mausrad verwendett werden."); info.setWrapStyleWord(true);
Font font = new Font("Serif", Font.ITALIC, 12); info.setLineWrap(true);
info.setAlignmentX(JTextArea.CENTER_ALIGNMENT);
info.setText("Um in dem Plot hineinzuzoomen kann das Mausrad verwendett werden. Um sich anschließen vertikal bzw. horizontal zu bewegen kann die Kombination (Umschalt/Steuerung) und Mausrad verwendett werden.");
Font font = new Font("Serif", Font.ITALIC, 14);
info.setFont(font); info.setFont(font);
info.setForeground(Color.DARK_GRAY); //info.setForeground(Color.DARK_GRAY);
info.setEditable(false); info.setEditable(false);
info.setWrapStyleWord(true); info.setWrapStyleWord(true);