refactor, import und export bei evaluation.

This commit is contained in:
Armin Wolf 2017-09-19 13:34:06 +02:00
parent 813155347d
commit 646150d2d6
33 changed files with 388 additions and 210 deletions

View File

@ -1,53 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>wwu</groupId> <groupId>wwu</groupId>
<artifactId>masterarbeit</artifactId> <artifactId>Masterarbeit</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0</version>
<build>
<plugins> <build>
<plugin> <plugins>
<groupId>org.apache.maven.plugins</groupId> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId>
<configuration> <artifactId>maven-compiler-plugin</artifactId>
<source>1.8</source> <configuration>
<target>1.8</target> <source>1.8</source>
</configuration> <target>1.8</target>
</plugin> </configuration>
</plugins> </plugin>
</build>
<dependencies> <!-- Maven Assembly Plugin -->
<!-- https://mvnrepository.com/artifact/org.jfree/jfreechart --> <plugin>
<dependency> <groupId>org.apache.maven.plugins</groupId>
<groupId>org.jfree</groupId> <artifactId>maven-assembly-plugin</artifactId>
<artifactId>jfreechart</artifactId> <version>2.4.1</version>
<version>1.0.14</version> <configuration>
</dependency> <!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>App</mainClass>
</manifest>
</archive>
<!-- https://mvnrepository.com/artifact/junit/junit --> </configuration>
<dependency> <executions>
<groupId>junit</groupId> <execution>
<artifactId>junit</artifactId> <id>make-assembly</id>
<version>4.12</version> <!-- bind to the packaging phase -->
</dependency> <phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.googlecode.mavennatives</groupId>
<artifactId>maven-nativedependencies-plugin</artifactId>
<version>0.0.7</version>
<executions>
<execution>
<id>unpacknatives</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- OpenCSV--> </plugins>
<dependency> </build>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.9</version>
</dependency>
<!-- JTattoo Look and Feel -->
<dependency> <dependencies>
<groupId>com.jtattoo</groupId> <!-- https://mvnrepository.com/artifact/org.jfree/jfreechart -->
<artifactId>JTattoo</artifactId> <dependency>
<version>1.6.11</version> <groupId>org.jfree</groupId>
</dependency> <artifactId>jfreechart</artifactId>
</dependencies> <version>1.0.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- OpenCSV-->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.9</version>
</dependency>
<!-- JTattoo Look and Feel -->
<dependency>
<groupId>com.jtattoo</groupId>
<artifactId>JTattoo</artifactId>
<version>1.6.11</version>
</dependency>
<!-- OpenCV -->
<dependency>
<groupId>org</groupId>
<artifactId>opencv</artifactId>
<version>2.4.13</version>
<systemPath>${project.basedir}/src/main/resources/libs/opencv-2413.jar</systemPath>
</dependency>
<dependency>
<groupId>org</groupId>
<artifactId>opencv</artifactId>
<version>2.4.13</version>
<scope>system</scope>
<type>dll</type>
<systemPath>${project.basedir}/src/main/resources/libs/x64/opencv_java2413.dll</systemPath>
<classifier>native-all</classifier>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project> </project>

View File

@ -1,12 +1,16 @@
import model.LineModel; import model.LineModel;
import org.apache.commons.io.IOUtils;
import org.opencv.core.Core; import org.opencv.core.Core;
import presenter.Presenter; import presenter.Presenter;
import presenter.evaluation.PictureProcessor;
import view.MainFrame; import view.MainFrame;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.lang.reflect.InvocationTargetException; import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/** /**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
@ -17,7 +21,33 @@ import java.lang.reflect.InvocationTargetException;
*/ */
public class App { public class App {
static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
private static void loadLibrary() {
try {
InputStream in = null;
File fileOut = null;
String osName = System.getProperty("os.name");
int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
if(bitness == 32){
in = App.class.getResourceAsStream("/libs/x86/opencv_java2413.dll");
fileOut = File.createTempFile("tmp", ".dll");
}
else if (bitness == 64){
in = App.class.getResourceAsStream("/libs/x64/opencv_java2413.dll");
fileOut = File.createTempFile("tmp", ".dll");
}
OutputStream out = new FileOutputStream(fileOut);
IOUtils.copy(in, out);
in.close();
out.close();
System.load(fileOut.toString());
} catch (Exception e) {
throw new RuntimeException("Failed to load opencv native library", e);
}
}
private static void setUIFont(javax.swing.plaf.FontUIResource f) { private static void setUIFont(javax.swing.plaf.FontUIResource f) {
java.util.Enumeration<Object> keys = UIManager.getDefaults().keys(); java.util.Enumeration<Object> keys = UIManager.getDefaults().keys();
@ -32,10 +62,10 @@ public class App {
private static void setLookAndFeel(JFrame view) { private static void setLookAndFeel(JFrame view) {
String[] laf = {"com.jtattoo.plaf.aluminium.AluminiumLookAndFeel", String[] laf = {"com.jtattoo.plaf.aluminium.AluminiumLookAndFeel",
"com.jtattoo.plaf.acryl.AcrylLookAndFeel", "com.jtattoo.plaf.acryl.AcrylLookAndFeel",
"com.jtattoo.plaf.aero.AeroLookAndFeel", "com.jtattoo.plaf.aero.AeroLookAndFeel",
"com.jtattoo.plaf.fast.FastLookAndFeel", "com.jtattoo.plaf.fast.FastLookAndFeel",
"com.jtattoo.plaf.graphite.GraphiteLookAndFeel"}; "com.jtattoo.plaf.graphite.GraphiteLookAndFeel"};
try { try {
UIManager.setLookAndFeel(laf[4]); UIManager.setLookAndFeel(laf[4]);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
@ -51,6 +81,7 @@ public class App {
} }
public static void main(String[] args) { public static void main(String[] args) {
loadLibrary();
final Presenter presenter = new Presenter(new LineModel(), null); final Presenter presenter = new Presenter(new LineModel(), null);

View File

@ -103,8 +103,8 @@ public class Line {
this.y2 = y2; this.y2 = y2;
} }
public boolean equals(Line other){ public boolean equals(Line other) {
if (other.getM() == this.getM() && other.getB() == this.getB()){ if (other.getM() == this.getM() && other.getB() == this.getB()) {
return true; return true;
} else { } else {
return false; return false;

View File

@ -1,11 +1,7 @@
package model; package model;
import sun.awt.image.ImageWatched;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
/** /**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
@ -90,7 +86,7 @@ public class LineModel {
this.yMaximum = yMaximum; this.yMaximum = yMaximum;
} }
public void resetRanges(){ public void resetRanges() {
xMinimum = Double.MAX_VALUE; xMinimum = Double.MAX_VALUE;
xMaximum = Double.MIN_VALUE; xMaximum = Double.MIN_VALUE;
yMinimum = Double.MAX_VALUE; yMinimum = Double.MAX_VALUE;

View File

@ -55,8 +55,8 @@ public class Point implements Comparable<Point> {
} }
} }
public boolean equals(Point other){ public boolean equals(Point other) {
if (other.getX() == this.getX() && other.getY() == this.getY()){ if (other.getX() == this.getX() && other.getY() == this.getY()) {
return true; return true;
} else { } else {
return false; return false;

View File

@ -1,9 +1,7 @@
package presenter; package presenter;
import model.Interval;
import model.LineModel; import model.LineModel;
import presenter.algorithms.util.IntersectionComputer; import presenter.algorithms.util.IntersectionComputer;
import presenter.algorithms.util.IntersectionCounter;
import presenter.evaluation.EvaluateAlgorithms; import presenter.evaluation.EvaluateAlgorithms;
import view.MainFrame; import view.MainFrame;
@ -111,8 +109,8 @@ public abstract class AbstractPresenter implements Observer {
getView().enableFunctionality(); getView().enableFunctionality();
getView().getProgressDialog().dispose(); getView().getProgressDialog().dispose();
getView().logHeading("Import aus Datei"); getView().logHeading("Import aus Datei");
getView().log("Anzahl der Geraden: "+ getModel().getLines().size() + "."); getView().log("Anzahl der Geraden: " + getModel().getLines().size() + ".");
getView().log("Anzahl der Schnittpunkte: "+getModel().getNodes().size()+"."); getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + ".");
getView().logSuccess("Import war Erfolgreich! <hr>"); getView().logSuccess("Import war Erfolgreich! <hr>");
}); });
} else { } else {
@ -152,8 +150,8 @@ public abstract class AbstractPresenter implements Observer {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
getView().enableFunctionality(); getView().enableFunctionality();
getView().logHeading("Import eines Bildes"); getView().logHeading("Import eines Bildes");
getView().log("Anzahl der Geraden: "+ getModel().getLines().size() + "."); getView().log("Anzahl der Geraden: " + getModel().getLines().size() + ".");
getView().log("Anzahl der Schnittpunkte: "+getModel().getNodes().size()+"."); getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + ".");
getView().logSuccess("Der Import war Erfolgreich! <hr>"); getView().logSuccess("Der Import war Erfolgreich! <hr>");
}); });
@ -161,8 +159,6 @@ public abstract class AbstractPresenter implements Observer {
} }
public void calculateIntersections() { public void calculateIntersections() {
try { try {
Thread thread = new Thread(() -> { Thread thread = new Thread(() -> {

View File

@ -23,7 +23,7 @@ import java.io.File;
* @Email: a_wolf28@uni-muenster.de * @Email: a_wolf28@uni-muenster.de
* @Date: 28.05.2017. * @Date: 28.05.2017.
*/ */
public class Presenter extends AbstractPresenter{ public class Presenter extends AbstractPresenter {
/* Threads */ /* Threads */
private Thread tsThread; private Thread tsThread;
@ -118,9 +118,9 @@ public class Presenter extends AbstractPresenter{
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, this); DataImporter importer = new DataImporter(file);
importer.addObserver(this); importer.addObserver(this);
importer.run(); getModel().setLines(importer.run());
}); });
importThread.start(); importThread.start();
try { try {
@ -131,7 +131,7 @@ public class Presenter extends AbstractPresenter{
} }
} }
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);
@ -147,13 +147,28 @@ public class Presenter extends AbstractPresenter{
} }
} }
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(() -> {
DataExporter exporter = new DataExporter(getModel(), file); DataExporter exporter = new DataExporter(getModel().getLines(), file);
exporter.addObserver(this);
exporter.export();
});
exportThread.start();
try {
exportThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void startDatasetExportEvaluation(File file) {
if (exportThread == null || !exportThread.isAlive()) {
exportThread = new Thread(() -> {
DataExporter exporter = new DataExporter(getEval().getData(), file);
exporter.addObserver(this); exporter.addObserver(this);
exporter.export(); exporter.export();
}); });
@ -214,4 +229,20 @@ public class Presenter extends AbstractPresenter{
evalThread.start(); evalThread.start();
} }
} }
public void startEvaluation(int typ, int n, int alg, File file) {
if (evalThread == null || !evalThread.isAlive()) {
evalThread = new Thread(() -> {
try {
setEval(new EvaluateAlgorithms(typ, n, alg, file));
getEval().addObserver(this);
getEval().run();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
evalThread.start();
}
}
} }

View File

@ -23,13 +23,13 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
private Double ds, b, m; private Double ds, b, m;
public NaivLeastMedianOfSquaresEstimator(LinkedList<Line> lines) { public NaivLeastMedianOfSquaresEstimator(LinkedList<Line> lines) {
for (Line l :lines){ for (Line l : lines) {
set.add(new Point(l.getM(),l.getB())); set.add(new Point(l.getM(), l.getB()));
} }
} }
private void crudeAlg(){ private void crudeAlg() {
ds = Double.MAX_VALUE; ds = Double.MAX_VALUE;
b = 0d; b = 0d;
m = 0d; m = 0d;
@ -37,21 +37,21 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
Double beta; Double beta;
Double alpha; Double alpha;
Double dijk; Double dijk;
for (Point i : set){ for (Point i : set) {
for (Point j : set) { for (Point j : set) {
for (Point k : set){ for (Point k : set) {
triple.add(i); triple.add(i);
triple.add(j); triple.add(j);
triple.add(k); triple.add(k);
Collections.sort(triple); Collections.sort(triple);
beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX()); beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX());
alpha = (triple.get(1).getY() + triple.get(2).getY() - ( beta * (triple.get(1).getX() + triple.get(2).getX()))) / 2f; alpha = (triple.get(1).getY() + triple.get(2).getY() - (beta * (triple.get(1).getX() + triple.get(2).getX()))) / 2f;
dijk = f(alpha, beta); dijk = f(alpha, beta);
if (dijk < ds){ if (dijk < ds) {
ds = dijk; ds = dijk;
b = alpha; b = alpha;
m = beta; m = beta;
// System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m); // System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m);
} }
triple.clear(); triple.clear();
} }
@ -61,13 +61,12 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
} }
private Double f(Double a, Double b) {
private Double f(Double a, Double b){
ArrayList<Double> res = new ArrayList<>(); ArrayList<Double> res = new ArrayList<>();
for (Point p : set){ for (Point p : set) {
res.add(Math.abs(p.getY() - (a + b * p.getX()))); res.add(Math.abs(p.getY() - (a + b * p.getX())));
} }
return FastElementSelector.randomizedSelect(res, res.size()/2); return FastElementSelector.randomizedSelect(res, res.size() / 2);
} }
@Override @Override

View File

@ -16,7 +16,7 @@ import java.util.LinkedList;
* @Email: a_wolf28@uni-muenster.de * @Email: a_wolf28@uni-muenster.de
* @Date: 15.09.2017. * @Date: 15.09.2017.
*/ */
public class NaivRepeatedMedianEstimator implements Algorithm{ public class NaivRepeatedMedianEstimator implements Algorithm {
private LinkedList<Line> lines; private LinkedList<Line> lines;
private HashMap<String, ArrayList<Double>> slopesPerLine; private HashMap<String, ArrayList<Double>> slopesPerLine;
@ -36,7 +36,7 @@ public class NaivRepeatedMedianEstimator implements Algorithm{
@Override @Override
public void run() { public void run() {
//init the List for the slopes //init the List for the slopes
for (int j=0;j<lines.size();j++) { for (int j = 0; j < lines.size(); j++) {
Line leq = lines.get(j); Line leq = lines.get(j);
if (slopesPerLine.get(leq.getId()) == null) { if (slopesPerLine.get(leq.getId()) == null) {
slopesPerLine.put(leq.getId(), new ArrayList<>()); slopesPerLine.put(leq.getId(), new ArrayList<>());
@ -49,8 +49,8 @@ public class NaivRepeatedMedianEstimator implements Algorithm{
//calculate all slopes for each line //calculate all slopes for each line
Point ret; Point ret;
for (int i=0;i<lines.size();i++) { for (int i = 0; i < lines.size(); i++) {
for (int j=i+1;j<lines.size();j++){ for (int j = i + 1; j < lines.size(); j++) {
ret = calculateSlope(lines.get(i), lines.get(j)); ret = calculateSlope(lines.get(i), lines.get(j));
slopesPerLine.get(lines.get(i).getId()).add(ret.getX()); slopesPerLine.get(lines.get(i).getId()).add(ret.getX());
interceptPerLine.get(lines.get(i).getId()).add(ret.getY()); interceptPerLine.get(lines.get(i).getId()).add(ret.getY());
@ -77,8 +77,8 @@ public class NaivRepeatedMedianEstimator implements Algorithm{
} }
} }
medianX = FastElementSelector.randomizedSelect(xMedians, xMedians.size()/2); medianX = FastElementSelector.randomizedSelect(xMedians, xMedians.size() / 2);
medianY = FastElementSelector.randomizedSelect(yMedians, yMedians.size()/2); medianY = FastElementSelector.randomizedSelect(yMedians, yMedians.size() / 2);
System.out.printf("Naiv RM: %6.2f * x + %6.2f \n", medianX, medianY); System.out.printf("Naiv RM: %6.2f * x + %6.2f \n", medianX, medianY);
} }
@ -87,13 +87,13 @@ public class NaivRepeatedMedianEstimator implements Algorithm{
} }
private Point calculateSlope(Line lineA, Line lineB){ private Point calculateSlope(Line lineA, Line lineB) {
Double xi; Double xi;
Double xj; Double xj;
Double yi; Double yi;
Double yj; Double yj;
if (lineB.getM() > lineA.getM()){ if (lineB.getM() > lineA.getM()) {
xi = lineA.getM(); xi = lineA.getM();
yi = lineA.getB(); yi = lineA.getB();
xj = lineB.getM(); xj = lineB.getM();
@ -106,9 +106,9 @@ public class NaivRepeatedMedianEstimator implements Algorithm{
} }
Double m = (yj - yi) / (xj -xi); Double m = (yj - yi) / (xj - xi);
Double b = ((xj * yi) - (xi * yj)) / (xj - xi); Double b = ((xj * yi) - (xi * yj)) / (xj - xi);
return new Point(m,b); return new Point(m, b);
} }
public Double getM() { public Double getM() {

View File

@ -48,15 +48,15 @@ public class NaivTheilSenEstimator implements Algorithm {
ArrayList<Double> list1 = new ArrayList<>(); ArrayList<Double> list1 = new ArrayList<>();
ArrayList<Double> list2 = new ArrayList<>(); ArrayList<Double> list2 = new ArrayList<>();
for (int i=0;i<lines.size();i++){ for (int i = 0; i < lines.size(); i++) {
list1.add(lines.get(i).getM()); list1.add(lines.get(i).getM());
list2.add(lines.get(i).getB()); list2.add(lines.get(i).getB());
} }
Double median1 = FastElementSelector.randomizedSelect(list1, list1.size()/2); Double median1 = FastElementSelector.randomizedSelect(list1, list1.size() / 2);
Double median2 = FastElementSelector.randomizedSelect(list2, list2.size()/2); Double median2 = FastElementSelector.randomizedSelect(list2, list2.size() / 2);
slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size()/2); slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size() / 2);
yInterception = median2 - slope * median1; yInterception = median2 - slope * median1;
System.out.printf("Naiv TS: %6.2f * x + %6.3f\n",slope, yInterception); System.out.printf("Naiv TS: %6.2f * x + %6.3f\n", slope, yInterception);
} }
@Override @Override

View File

@ -1,6 +1,5 @@
package presenter.algorithms.util; package presenter.algorithms.util;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;

View File

@ -41,7 +41,7 @@ public class IntersectionComputer {
yMaximum = Double.MIN_VALUE; yMaximum = Double.MIN_VALUE;
} }
public ArrayList<Point> compute(){ public ArrayList<Point> compute() {
if (lines.size() >= 12) { if (lines.size() >= 12) {
worker[0] = new Thread(() -> { worker[0] = new Thread(() -> {
@ -77,12 +77,12 @@ public class IntersectionComputer {
} }
private synchronized void work(List<Line> lines){ private synchronized void work(List<Line> lines) {
IntersectionCounter counter = new IntersectionCounter(); IntersectionCounter counter = new IntersectionCounter();
counter.run(lines, new Interval(-99999, 99999)); counter.run(lines, new Interval(-99999, 99999));
ArrayList<Point> points = counter.calculateIntersectionAbscissas(); ArrayList<Point> points = counter.calculateIntersectionAbscissas();
for (Point p :points){ for (Point p : points) {
if (!isFound(p)){ if (!isFound(p)) {
addIntersection(p); addIntersection(p);
setRanges(p); setRanges(p);
} }
@ -94,19 +94,19 @@ public class IntersectionComputer {
return lines; return lines;
} }
public synchronized void addIntersection(Point p){ public synchronized void addIntersection(Point p) {
this.intersections.add(p); this.intersections.add(p);
} }
public synchronized boolean isFound(Point p){ public synchronized boolean isFound(Point p) {
if (intersections.contains(p)){ if (intersections.contains(p)) {
return true; return true;
} else { } else {
return false; return false;
} }
} }
public synchronized void setRanges(Point point){ public synchronized 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;

View File

@ -4,15 +4,17 @@ import model.Interval;
import model.Line; import model.Line;
import model.LineModel; import model.LineModel;
import model.Point; import model.Point;
import presenter.algorithms.advanced.LeastMedianOfSquaresEstimator;
import presenter.algorithms.advanced.RepeatedMedianEstimator;
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.IntersectionCounter; import presenter.algorithms.util.IntersectionCounter;
import presenter.algorithms.advanced.LeastMedianOfSquaresEstimator;
import presenter.algorithms.advanced.RepeatedMedianEstimator;
import presenter.algorithms.advanced.TheilSenEstimator;
import presenter.generator.DatasetGenerator; import presenter.generator.DatasetGenerator;
import presenter.io.DataImporter;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Observable; import java.util.Observable;
@ -45,7 +47,7 @@ public class EvaluateAlgorithms extends Observable {
private DatasetGenerator generator; private DatasetGenerator generator;
private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE","Steigung","y-Achsenabschnitt", "S-MSE", "S-RMSE", "S-MAE", "S-MDAE", "Brute-force Steigung", "Brute-force y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE","Steigung","y-Achsenabschnitt"}}; private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE", "Steigung", "y-Achsenabschnitt", "S-MSE", "S-RMSE", "S-MAE", "S-MDAE", "Brute-force Steigung", "Brute-force y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE", "Steigung", "y-Achsenabschnitt"}};
//übergebene Parameter //übergebene Parameter
private int type; private int type;
@ -96,6 +98,30 @@ public class EvaluateAlgorithms extends Observable {
tsP = new ArrayList<>(arrangement.getNodes()); tsP = new ArrayList<>(arrangement.getNodes());
} }
public EvaluateAlgorithms(int type, int n, int alg, File file) {
this.arrangement = new LineModel();
DataImporter importer = new DataImporter(file);
this.arrangement.setLines(importer.run());
this.type = type;
this.iterations = n;
this.alg = alg;
IntersectionCounter counter = new IntersectionCounter();
counter.run(arrangement.getLines(), new Interval(-99999, 99999));
counter.calculateIntersectionAbscissas(arrangement);
lmsL = new LinkedList<>(arrangement.getLines());
rmL = new LinkedList<>(arrangement.getLines());
tsL = new LinkedList<>(arrangement.getLines());
lmsP = new ArrayList<>(arrangement.getNodes());
tsP = new ArrayList<>(arrangement.getNodes());
}
public void run() throws InterruptedException { public void run() throws InterruptedException {
setChanged(); setChanged();
String[] msg = {"eval-dataset-generated"}; String[] msg = {"eval-dataset-generated"};
@ -134,8 +160,8 @@ public class EvaluateAlgorithms extends Observable {
t.join(); t.join();
result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1],m[0], b[0])); result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1], m[0], b[0]));
Double[] tmp = {lmsRes[0], lmsRes[1],m[0], b[0]}; Double[] tmp = {lmsRes[0], lmsRes[1], m[0], b[0]};
sendPlotLineResults(tmp, 0); sendPlotLineResults(tmp, 0);
} else if (alg == 1) { } else if (alg == 1) {
final double[] m = new double[1]; final double[] m = new double[1];
@ -149,8 +175,8 @@ public class EvaluateAlgorithms extends Observable {
t.start(); t.start();
startRM(); startRM();
result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]); result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1],m[0], b[0])); result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1], m[0], b[0]));
Double[] tmp = {rmRes[0], rmRes[1],m[0], b[0]}; Double[] tmp = {rmRes[0], rmRes[1], m[0], b[0]};
sendPlotLineResults(tmp, 1); sendPlotLineResults(tmp, 1);
} else { } else {
final double[] m = new double[1]; final double[] m = new double[1];
@ -164,8 +190,8 @@ public class EvaluateAlgorithms extends Observable {
t.start(); t.start();
startTS(); startTS();
result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]); result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1],m[0], b[0])); result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1], m[0], b[0]));
Double[] tmp = {tsRes[0], tsRes[1],m[0], b[0]}; Double[] tmp = {tsRes[0], tsRes[1], m[0], b[0]};
sendPlotLineResults(tmp, 2); sendPlotLineResults(tmp, 2);
} }
sendTableApproximationTypes(); sendTableApproximationTypes();
@ -186,7 +212,7 @@ public class EvaluateAlgorithms extends Observable {
lineRes = new ArrayList<>(); lineRes = new ArrayList<>();
lineRes.add(lmsRes); lineRes.add(lmsRes);
lineRes.add(rmRes); lineRes.add(rmRes);
sendPloteLineResults(lineRes, new Integer[]{0,1}); sendPloteLineResults(lineRes, new Integer[]{0, 1});
break; break;
case 4: case 4:
@ -298,7 +324,7 @@ public class EvaluateAlgorithms extends Observable {
lines.add("lines-res"); lines.add("lines-res");
lines.add("" + alg); lines.add("" + alg);
//lms res //lms res
for (int i=0;i<res.length;i++) { for (int i = 0; i < res.length; i++) {
lines.add(res[i] + ""); lines.add(res[i] + "");
} }
setChanged(); setChanged();
@ -322,7 +348,7 @@ public class EvaluateAlgorithms extends Observable {
public void startLMS() throws InterruptedException { public void startLMS() throws InterruptedException {
lmsThread = new Thread(() -> { lmsThread = new Thread(() -> {
LeastMedianOfSquaresEstimator lmsAlg = new LeastMedianOfSquaresEstimator(lmsL,lmsP); LeastMedianOfSquaresEstimator lmsAlg = new LeastMedianOfSquaresEstimator(lmsL, lmsP);
lmsAlg.run(); lmsAlg.run();
lmsAlg.getResult(); lmsAlg.getResult();
lmsRes[0] = lmsAlg.getSlope(); lmsRes[0] = lmsAlg.getSlope();
@ -347,7 +373,7 @@ public class EvaluateAlgorithms extends Observable {
public void startTS() throws InterruptedException { public void startTS() throws InterruptedException {
tsThread = new Thread(() -> { tsThread = new Thread(() -> {
TheilSenEstimator tsAlg = new TheilSenEstimator(tsL,tsP); TheilSenEstimator tsAlg = new TheilSenEstimator(tsL, tsP);
tsAlg.run(); tsAlg.run();
tsAlg.getResult(); tsAlg.getResult();
tsRes[0] = tsAlg.getSlope(); tsRes[0] = tsAlg.getSlope();
@ -358,7 +384,6 @@ public class EvaluateAlgorithms extends Observable {
} }
public ArrayList<String> getScaleDependentMeasure(final LinkedList<Line> lines, final Double m, final Double b) { public ArrayList<String> getScaleDependentMeasure(final LinkedList<Line> lines, final Double m, final Double b) {
ScaleDependentMeasure scaleDependentMeasure = new ScaleDependentMeasure(lines, m, b); ScaleDependentMeasure scaleDependentMeasure = new ScaleDependentMeasure(lines, m, b);
ArrayList<String> ret = new ArrayList<>(); ArrayList<String> ret = new ArrayList<>();

View File

@ -1,8 +1,8 @@
package presenter.evaluation; package presenter.evaluation;
import jdk.nashorn.internal.scripts.JD;
import model.Line; import model.Line;
import org.opencv.core.*; import org.opencv.core.*;
import org.opencv.highgui.*; import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc; import org.opencv.imgproc.Imgproc;
import presenter.Presenter; import presenter.Presenter;
@ -20,7 +20,7 @@ import java.util.Observable;
* @Email: a_wolf28@uni-muenster.de * @Email: a_wolf28@uni-muenster.de
* @Date: 17.09.2017. * @Date: 17.09.2017.
*/ */
public class PictureProcessor extends Observable{ public class PictureProcessor extends Observable {
private Mat image; private Mat image;
private Mat contour; private Mat contour;
@ -29,43 +29,43 @@ public class PictureProcessor extends Observable{
private ArrayList<MatOfPoint> contours; private ArrayList<MatOfPoint> contours;
private double contourLength; private double contourLength;
public PictureProcessor(Presenter presenter, File file) { public PictureProcessor(Presenter presenter, File file) {
this.file = file; this.file = file;
this.presenter = presenter; this.presenter = presenter;
} }
public void run(){ public void run() {
image = Highgui.imread(file.getAbsolutePath()); image = Highgui.imread(file.getAbsolutePath());
contour = process(image); contour = process(image);
contourLength = image.width() * 0.3; contourLength = image.width() * 0.3;
createInputData(); createInputData();
} }
private Mat process(Mat image){ private Mat process(Mat image) {
Mat threshold = new Mat(image.width(), image.height(), CvType.CV_8UC1); Mat threshold = new Mat(image.width(), image.height(), CvType.CV_8UC1);
Mat source = new Mat(image.width(), image.height(), CvType.CV_8UC1); Mat source = new Mat(image.width(), image.height(), CvType.CV_8UC1);
Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY); Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(source, threshold, new Size(3,3),0,0); Imgproc.GaussianBlur(source, threshold, new Size(3, 3), 0, 0);
Imgproc.Canny(threshold, source,300,600,5,true); Imgproc.Canny(threshold, source, 300, 600, 5, true);
//Konturen berechnen und filtern //Konturen berechnen und filtern
contours = new ArrayList<>(); contours = new ArrayList<>();
Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
Mat viscont = new Mat(source.size(), source.type()); Mat viscont = new Mat(source.size(), source.type());
double minArea = 50; double minArea = 50;
double maxArea = 0.2 * image.cols() * image.rows(); double maxArea = 0.2 * image.cols() * image.rows();
for (int i=0;i<contours.size();i++) { for (int i = 0; i < contours.size(); i++) {
double acutualArea = Imgproc.contourArea(contours.get(i)); double acutualArea = Imgproc.contourArea(contours.get(i));
if (minArea < acutualArea && maxArea > acutualArea) { if (minArea < acutualArea && maxArea > acutualArea) {
Imgproc.drawContours(viscont, contours, i, new Scalar(255, 0, 0), 1); Imgproc.drawContours(viscont, contours, i, new Scalar(255, 0, 0), 1);
} }
} }
Mat resized = new Mat(); Mat resized = new Mat();
Imgproc.resize(viscont, resized,new Size(560,560)); Imgproc.resize(viscont, resized, new Size(560, 560));
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
JDialog dialog = new JDialog(); JDialog dialog = new JDialog();
dialog.setSize(560,560); dialog.setSize(560, 560);
JLabel label = new JLabel(); JLabel label = new JLabel();
label.setSize(560,560); label.setSize(560, 560);
label.setIcon(new ImageIcon(toBufferedImage(resized))); label.setIcon(new ImageIcon(toBufferedImage(resized)));
dialog.add(label); dialog.add(label);
dialog.setVisible(true); dialog.setVisible(true);
@ -89,12 +89,12 @@ public class PictureProcessor extends Observable{
} }
private void createInputData(){ private void createInputData() {
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
double minArea = 50; double minArea = 50;
double maxArea = 0.2 * image.cols() * image.rows(); double maxArea = 0.2 * image.cols() * image.rows();
int id = 0; int id = 0;
for (int j=0;j<contours.size();j++){ for (int j = 0; j < contours.size(); j++) {
Point[] p = contours.get(j).toArray(); Point[] p = contours.get(j).toArray();
double acutualArea = Imgproc.contourArea(contours.get(j)); double acutualArea = Imgproc.contourArea(contours.get(j));
if (minArea < acutualArea && maxArea > acutualArea) { if (minArea < acutualArea && maxArea > acutualArea) {

View File

@ -37,7 +37,7 @@ public class ScaledErrorBasedMeasure {
sampsonError.add(e); sampsonError.add(e);
} }
for (int i=0;i<sampsonError.size();i++){ for (int i = 0; i < sampsonError.size(); i++) {
scaledError.add(sampsonError.get(i) / naivSampsonError.get(i)); scaledError.add(sampsonError.get(i) / naivSampsonError.get(i));
} }

View File

@ -1,12 +1,13 @@
package presenter.io; package presenter.io;
import com.opencsv.CSVWriter;
import model.Line; import model.Line;
import model.LineModel; import model.LineModel;
import com.opencsv.CSVWriter;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList;
import java.util.Observable; import java.util.Observable;
/** /**
@ -18,12 +19,12 @@ import java.util.Observable;
*/ */
public class DataExporter extends Observable { public class DataExporter extends Observable {
private LineModel lineModel; private LinkedList<Line> lines;
private File file; private File file;
public DataExporter(LineModel model, File file) { public DataExporter(LinkedList<Line> lines, File file) {
this.file = file; this.file = file;
this.lineModel = model; this.lines = lines;
} }
public void export() { public void export() {
@ -33,7 +34,7 @@ public class DataExporter extends Observable {
writer = new CSVWriter(new FileWriter(file), ','); writer = new CSVWriter(new FileWriter(file), ',');
// feed in your array (or convert your data to an array) // feed in your array (or convert your data to an array)
String[] entries = new String[3]; String[] entries = new String[3];
for (Line line : lineModel.getLines()) { for (Line line : lines) {
entries[0] = line.getId(); entries[0] = line.getId();
entries[1] = line.getM().toString(); entries[1] = line.getM().toString();
Double tmp = (-1) * line.getB(); Double tmp = (-1) * line.getB();

View File

@ -1,14 +1,15 @@
package presenter.io; package presenter.io;
import com.opencsv.CSVReader;
import model.Line; import model.Line;
import model.LineModel; import model.LineModel;
import presenter.Presenter; import presenter.Presenter;
import com.opencsv.CSVReader;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Observable; import java.util.Observable;
@ -24,17 +25,10 @@ public class DataImporter extends Observable {
private File file; private File file;
private CSVReader reader; private CSVReader reader;
private LineModel model;
private Presenter presenter;
public DataImporter(File file, Presenter presenter) { public DataImporter(File file) {
this.model = new LineModel();
this.presenter = presenter;
this.presenter.setModel(this.model);
//System.out.println(this.model.getLines().size()+ " die Anzahl der aktuellen Lines."); //System.out.println(this.model.getLines().size()+ " die Anzahl der aktuellen Lines.");
this.file = file; this.file = file;
try { try {
@ -44,8 +38,9 @@ public class DataImporter extends Observable {
} }
} }
public void run() { public LinkedList<Line> run() {
LinkedList<Line> list = new LinkedList<>();
try { try {
List<String[]> lines = reader.readAll(); List<String[]> lines = reader.readAll();
int counter = 0; int counter = 0;
@ -57,8 +52,8 @@ public class DataImporter extends Observable {
Double y = Double.parseDouble(nextLine[2]) * (-1); Double y = Double.parseDouble(nextLine[2]) * (-1);
Line line = new Line(x, y); Line line = new Line(x, y);
line.setId(counter + ""); line.setId(counter + "");
if (!this.presenter.getModel().getLines().contains(line)) { if (!list.contains(line)) {
this.presenter.getModel().addLine(line); list.add(line);
} }
//System.out.format("|\t\t\t\t\t %-11d \t|\t\t\t\t\t %-11f \t|\t\t\t\t\t %-11f \t\t\t\t\t|\n", id,x,y); //System.out.format("|\t\t\t\t\t %-11d \t|\t\t\t\t\t %-11f \t|\t\t\t\t\t %-11f \t\t\t\t\t|\n", id,x,y);
setChanged(); setChanged();
@ -74,6 +69,7 @@ public class DataImporter extends Observable {
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
return list;
} }
} }

View File

@ -5,7 +5,10 @@ import model.Line;
import presenter.AbstractPresenter; import presenter.AbstractPresenter;
import presenter.Presenter; import presenter.Presenter;
import view.listener.*; import view.listener.*;
import view.panels.*; import view.panels.DualityPanel;
import view.panels.EvaluationPanel;
import view.panels.InfoPanel;
import view.panels.PlotPanel;
import view.panels.tabs.LMSPanel; import view.panels.tabs.LMSPanel;
import view.panels.tabs.RMPanel; import view.panels.tabs.RMPanel;
import view.panels.tabs.TSPanel; import view.panels.tabs.TSPanel;
@ -282,7 +285,7 @@ public class MainFrame extends JFrame {
private void setDimensions() { private void setDimensions() {
this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setMinimumSize(new Dimension(1024,768)); this.setMinimumSize(new Dimension(1024, 768));
this.setResizable(true); this.setResizable(true);
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
this.setMaximizedBounds(env.getMaximumWindowBounds()); this.setMaximizedBounds(env.getMaximumWindowBounds());
@ -360,8 +363,8 @@ public class MainFrame extends JFrame {
lmsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), lmsPanel)); lmsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), lmsPanel));
rmPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), rmPanel)); rmPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), rmPanel));
tsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), tsPanel)); tsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), tsPanel));
importButton.addActionListener(new ImportDataListener((Presenter) this.getPresenter() , this)); importButton.addActionListener(new ImportDataListener((Presenter) this.getPresenter(), this));
exportButton.addActionListener(new ExportDataListener((Presenter) this.getPresenter() , this)); exportButton.addActionListener(new ExportDataListener((Presenter) this.getPresenter(), this));
generateButton.addActionListener(new GenerateDataListener((Presenter) this.getPresenter())); generateButton.addActionListener(new GenerateDataListener((Presenter) this.getPresenter()));
} }

View File

@ -1,7 +1,6 @@
package view; package view;
import presenter.Presenter; import presenter.Presenter;
import view.MainFrame;
import view.listener.ExportDataListener; import view.listener.ExportDataListener;
import view.listener.GenerateDataListener; import view.listener.GenerateDataListener;
import view.listener.ImportDataListener; import view.listener.ImportDataListener;
@ -9,7 +8,6 @@ import view.listener.PictureImportListener;
import view.panels.AboutPanel; import view.panels.AboutPanel;
import javax.swing.*; import javax.swing.*;
import java.awt.*;
/** /**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
@ -69,16 +67,20 @@ public class MenuBar {
menuBar.add(aboutMenu); menuBar.add(aboutMenu);
} }
public void addActionListeners(){ public void addActionListeners() {
this.exitItem.addActionListener(e -> {System.exit(0);}); this.exitItem.addActionListener(e -> {
this.evaluateItem.addActionListener(e -> {view.showEvauluationDialog();}); System.exit(0);
});
this.evaluateItem.addActionListener(e -> {
view.showEvauluationDialog();
});
this.importItem.addActionListener(new ImportDataListener((Presenter) view.getPresenter(), view)); this.importItem.addActionListener(new ImportDataListener((Presenter) view.getPresenter(), view));
this.exportItem.addActionListener(new ExportDataListener((Presenter) view.getPresenter(), view)); this.exportItem.addActionListener(new ExportDataListener((Presenter) view.getPresenter(), view));
this.generateItem.addActionListener(new GenerateDataListener((Presenter) view.getPresenter())); this.generateItem.addActionListener(new GenerateDataListener((Presenter) view.getPresenter()));
this.aboutItem.addActionListener(e -> { this.aboutItem.addActionListener(e -> {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
JDialog dialog = new JDialog(); JDialog dialog = new JDialog();
dialog.setSize(410,420); dialog.setSize(410, 420);
dialog.setResizable(false); dialog.setResizable(false);
dialog.add(new AboutPanel()); dialog.add(new AboutPanel());
dialog.setVisible(true); dialog.setVisible(true);

View File

@ -33,7 +33,7 @@ public class ExportDataListener implements ActionListener {
File file = null; File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700)); chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value", "csv", "text")); chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false); chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

View File

@ -2,7 +2,6 @@ package view.listener;
import presenter.Presenter; import presenter.Presenter;
import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;

View File

@ -33,7 +33,7 @@ public class ImportDataListener implements ActionListener {
File file = null; File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700)); chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value", "csv", "text")); chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false); chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

View File

@ -32,7 +32,7 @@ public class PictureImportListener implements ActionListener {
File file = null; File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700)); chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Bilder", "tiff", "png","jpg","jpeg")); chooser.setFileFilter(new FileNameExtensionFilter("Bilder", "tiff", "png", "jpg", "jpeg"));
chooser.setMultiSelectionEnabled(false); chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

View File

@ -28,19 +28,19 @@ public class StartAlgorithmListener implements ActionListener {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (tabPanel instanceof LMSPanel){ if (tabPanel instanceof LMSPanel) {
if ( ((LMSPanel) tabPanel).getInput() != null) { if (((LMSPanel) tabPanel).getInput() != null) {
Thread t = new Thread( Thread t = new Thread(
() -> presenter.calculateLMS(((LMSPanel) tabPanel).getInput())); () -> presenter.calculateLMS(((LMSPanel) tabPanel).getInput()));
t.start(); t.start();
} }
} else if (tabPanel instanceof RMPanel){ } else if (tabPanel instanceof RMPanel) {
if ( ((RMPanel) tabPanel).getInput() != null) { if (((RMPanel) tabPanel).getInput() != null) {
Thread t = new Thread( Thread t = new Thread(
() -> presenter.calculateRM(((RMPanel) tabPanel).getInput())); () -> presenter.calculateRM(((RMPanel) tabPanel).getInput()));
t.start(); t.start();
} }
} else if(tabPanel instanceof TSPanel){ } else if (tabPanel instanceof TSPanel) {
Thread t = new Thread( Thread t = new Thread(
() -> presenter.calculateTS("")); () -> presenter.calculateTS(""));
t.start(); t.start();

View File

@ -19,14 +19,14 @@ public class AboutPanel extends JPanel {
private JPanel contentPane; private JPanel contentPane;
private ImageIcon image; private ImageIcon image;
public AboutPanel(){ public AboutPanel() {
super(); super();
this.setSize(new Dimension(410,400)); this.setSize(new Dimension(410, 400));
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
contentPane = new JPanel(new BorderLayout()); contentPane = new JPanel(new BorderLayout());
this.textArea = new JTextArea(); this.textArea = new JTextArea();
this.textArea.setEditable(false); this.textArea.setEditable(false);
this.textArea.setBackground(new Color(0,0,0,0)); this.textArea.setBackground(new Color(0, 0, 0, 0));
contentPane.add(this.textArea, BorderLayout.CENTER); contentPane.add(this.textArea, BorderLayout.CENTER);
ClassLoader classLoader = getClass().getClassLoader(); ClassLoader classLoader = getClass().getClassLoader();
try { try {

View File

@ -75,7 +75,7 @@ public class EvaluationPanel extends JPanel {
datasetCountLabel = new JLabel("Größe des Datensatzes"); datasetCountLabel = new JLabel("Größe des Datensatzes");
Integer[] choice = {50, 100, 200, 500, 1000, 1500}; Integer[] choice = {50, 100, 200, 500, 1000, 1500};
datasetCountChoice = new JComboBox(choice); datasetCountChoice = new JComboBox(choice);
String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade"}; String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade", "Import von CSV-Datei"};
datasetType = new JComboBox<>(datatypes); datasetType = new JComboBox<>(datatypes);
start = new JButton("Start"); start = new JButton("Start");
@ -191,7 +191,29 @@ public class EvaluationPanel extends JPanel {
alg = checkSelection(); alg = checkSelection();
n = (Integer) datasetCountChoice.getSelectedItem(); n = (Integer) datasetCountChoice.getSelectedItem();
String datatyp = (String) datasetType.getSelectedItem(); String datatyp = (String) datasetType.getSelectedItem();
((Presenter) view.getPresenter()).startEvaluation(type, n, alg, datatyp); if (datatyp == "Import von CSV-Datei"){
SwingUtilities.invokeLater(() -> {
File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
//System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt.");
file = chooser.getSelectedFile();
final File input = file;
Thread t = new Thread(() -> ((Presenter) view.getPresenter()).startEvaluation(type, n, alg, input));
t.start();
}
});
} else {
((Presenter) view.getPresenter()).startEvaluation(type, n, alg, datatyp);
}
clearTable.setEnabled(true); clearTable.setEnabled(true);
latexExport.setEnabled(true); latexExport.setEnabled(true);
exportData.setEnabled(true); exportData.setEnabled(true);
@ -224,7 +246,7 @@ public class EvaluationPanel extends JPanel {
File file = null; File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700)); chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("LaTeX-Datei", "tex", "text")); chooser.setFileFilter(new FileNameExtensionFilter("LaTeX-Datei, (*.tex)", "tex", "text"));
chooser.setMultiSelectionEnabled(false); chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
@ -257,7 +279,26 @@ public class EvaluationPanel extends JPanel {
exportData.addActionListener(e -> { exportData.addActionListener(e -> {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(this, "Boooooooooooooooooooooooooooooooooooooooooooooooooooooo! :)"); SwingUtilities.invokeLater(() -> {
File file = null;
JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
chooser.setPreferredSize(new Dimension(800, 700));
chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text"));
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
//System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt.");
file = chooser.getSelectedFile();
String filename = file.getAbsolutePath().contains(".csv") ? file.getAbsolutePath() : file.getAbsolutePath().concat(".csv");
File withExtension = new File(filename);
final File input = withExtension;
Thread t = new Thread(() ->((Presenter) view.getPresenter()).startDatasetExportEvaluation(input));
t.start();
}
});
}); });
}); });

View File

@ -1,10 +1,6 @@
package view.panels.tabs; package view.panels.tabs;
import com.sun.istack.internal.Nullable;
import view.panels.PlotPanel;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*; import java.awt.*;
/** /**
@ -84,7 +80,6 @@ public class LMSPanel extends TabPanel {
} }
@Nullable
public String[] getInput() { public String[] getInput() {
String[] input = new String[3]; String[] input = new String[3];
input[0] = this.input[0].getText(); input[0] = this.input[0].getText();

View File

@ -1,10 +1,6 @@
package view.panels.tabs; package view.panels.tabs;
import com.sun.istack.internal.Nullable;
import view.panels.PlotPanel;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*; import java.awt.*;
/** /**
@ -77,7 +73,6 @@ public class RMPanel extends TabPanel {
} }
@Nullable
public String getInput() { public String getInput() {
String input = ""; String input = "";
input = this.input.getText(); input = this.input.getText();

View File

@ -1,10 +1,6 @@
package view.panels.tabs; package view.panels.tabs;
import com.sun.istack.internal.Nullable;
import view.panels.PlotPanel;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*; import java.awt.*;
/** /**

View File

@ -13,7 +13,7 @@ import java.awt.*;
* @Email: a_wolf28@uni-muenster.de * @Email: a_wolf28@uni-muenster.de
* @Date: 10.09.2017. * @Date: 10.09.2017.
*/ */
public abstract class TabPanel extends JPanel{ public abstract class TabPanel extends JPanel {
private PlotPanel plotPanel; private PlotPanel plotPanel;
@ -41,6 +41,14 @@ public abstract class TabPanel extends JPanel{
this.startButton.setFont(new Font("Verdana", Font.PLAIN, 16)); this.startButton.setFont(new Font("Verdana", Font.PLAIN, 16));
} }
protected void addTextfieldAndInput(int row, String name, Double value) {
//muss nicht obligatorisch implementiert werden
}
public PlotPanel getPlotPanel() {
return plotPanel;
}
public void setPlotPanel(PlotPanel plotPanel) { public void setPlotPanel(PlotPanel plotPanel) {
this.plotPanel = plotPanel; this.plotPanel = plotPanel;
if (this.centerPanel.getComponents().length > 0) if (this.centerPanel.getComponents().length > 0)
@ -52,14 +60,6 @@ public abstract class TabPanel extends JPanel{
this.revalidate(); this.revalidate();
} }
protected void addTextfieldAndInput(int row, String name, Double value){
//muss nicht obligatorisch implementiert werden
}
public PlotPanel getPlotPanel() {
return plotPanel;
}
public JButton getStartButton() { public JButton getStartButton() {
return startButton; return startButton;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 MiB