2017-05-29 12:15:51 +00:00
|
|
|
package View;
|
|
|
|
|
2017-06-12 19:30:27 +00:00
|
|
|
import Model.Line;
|
2017-05-29 13:42:25 +00:00
|
|
|
import org.jfree.chart.ChartFactory;
|
|
|
|
import org.jfree.chart.ChartPanel;
|
|
|
|
import org.jfree.chart.JFreeChart;
|
|
|
|
import org.jfree.chart.plot.PlotOrientation;
|
|
|
|
import org.jfree.chart.plot.XYPlot;
|
2017-06-16 11:24:35 +00:00
|
|
|
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
|
2017-05-29 13:42:25 +00:00
|
|
|
import org.jfree.data.xy.XYSeries;
|
|
|
|
import org.jfree.data.xy.XYSeriesCollection;
|
|
|
|
import org.jfree.util.ShapeUtilities;
|
|
|
|
|
2017-08-03 18:37:59 +00:00
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
2017-05-29 12:15:51 +00:00
|
|
|
/**
|
|
|
|
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
|
|
|
|
*
|
|
|
|
* @Author: Armin Wolf
|
|
|
|
* @Email: a_wolf28@uni-muenster.de
|
|
|
|
* @Date: 29.05.2017.
|
|
|
|
*/
|
2017-05-29 13:42:25 +00:00
|
|
|
public class PlotDialog extends JPanel {
|
|
|
|
|
2017-06-20 14:59:24 +00:00
|
|
|
private JFreeChart chart;
|
|
|
|
private ChartPanel panel;
|
|
|
|
private XYSeriesCollection datapoints;
|
|
|
|
private XYSeries series;
|
|
|
|
private Double min;
|
|
|
|
private Double max;
|
2017-09-05 18:39:52 +00:00
|
|
|
private XYPlot xyPlot;
|
|
|
|
private int seriesCount;
|
|
|
|
|
|
|
|
private XYLineAndShapeRenderer renderer;
|
|
|
|
private Shape diamond;
|
2017-06-20 14:59:24 +00:00
|
|
|
|
|
|
|
public PlotDialog() {
|
|
|
|
super();
|
2017-09-05 18:39:52 +00:00
|
|
|
// this.setPreferredSize(new Dimension(1000, 1000));
|
|
|
|
// this.setMinimumSize(new Dimension(1000, 800));
|
2017-06-20 14:59:24 +00:00
|
|
|
this.setLayout(new BorderLayout());
|
2017-09-05 18:39:52 +00:00
|
|
|
seriesCount = 1;
|
2017-06-20 14:59:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void createPlot(LinkedList<Line> points) {
|
2017-09-05 18:39:52 +00:00
|
|
|
if (!points.isEmpty()) {
|
|
|
|
try {
|
|
|
|
Thread thread = new Thread(() -> convertData(points));
|
|
|
|
thread.start();
|
|
|
|
thread.join();
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2017-05-29 13:42:25 +00:00
|
|
|
}
|
2017-06-20 14:59:24 +00:00
|
|
|
//createScatterPlot
|
|
|
|
chart = ChartFactory.createXYLineChart("",
|
2017-09-05 18:39:52 +00:00
|
|
|
"X", "Y", datapoints, PlotOrientation.VERTICAL, true, true, false);
|
|
|
|
diamond = ShapeUtilities.createDiamond(2f);
|
2017-06-20 14:59:24 +00:00
|
|
|
chart.setBorderVisible(false);
|
|
|
|
chart.setAntiAlias(true);
|
|
|
|
chart.getPlot().setBackgroundPaint(Color.WHITE);
|
2017-06-21 15:41:40 +00:00
|
|
|
chart.setBorderVisible(false);
|
|
|
|
|
2017-06-20 14:59:24 +00:00
|
|
|
|
2017-09-05 18:39:52 +00:00
|
|
|
xyPlot = (XYPlot) chart.getPlot();
|
2017-06-20 14:59:24 +00:00
|
|
|
xyPlot.setDomainCrosshairVisible(true);
|
|
|
|
xyPlot.setRangeCrosshairVisible(true);
|
|
|
|
|
2017-09-05 18:39:52 +00:00
|
|
|
|
|
|
|
renderer = (XYLineAndShapeRenderer) xyPlot.getRenderer();
|
2017-06-20 14:59:24 +00:00
|
|
|
renderer.setSeriesLinesVisible(0, false);
|
|
|
|
renderer.setSeriesShapesVisible(0, true);
|
|
|
|
renderer.setSeriesLinesVisible(1, true);
|
2017-09-05 18:39:52 +00:00
|
|
|
renderer.setSeriesLinesVisible(1, true);
|
2017-06-20 14:59:24 +00:00
|
|
|
renderer.setSeriesPaint(0, Color.blue);
|
|
|
|
renderer.setSeriesShape(0, diamond);
|
|
|
|
renderer.setBaseSeriesVisible(true);
|
|
|
|
|
|
|
|
|
|
|
|
xyPlot.setDomainCrosshairVisible(true);
|
|
|
|
xyPlot.setRangeCrosshairVisible(true);
|
|
|
|
|
|
|
|
panel = new ChartPanel(chart);
|
2017-06-21 15:41:40 +00:00
|
|
|
panel.setMouseZoomable(false);
|
2017-06-20 14:59:24 +00:00
|
|
|
this.add(panel, BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
|
2017-06-21 15:41:40 +00:00
|
|
|
public void clear(){
|
|
|
|
if (datapoints != null)
|
|
|
|
datapoints.removeAllSeries();
|
|
|
|
}
|
|
|
|
|
2017-09-05 18:39:52 +00:00
|
|
|
public void addLineToPlot(double m, double b, Paint color, String name) {
|
|
|
|
|
|
|
|
XYSeries linesA = new XYSeries(name);
|
2017-09-08 19:23:02 +00:00
|
|
|
linesA.add(min.doubleValue(), min * m + b);
|
|
|
|
linesA.add(max.doubleValue(), max * m + b);
|
2017-09-05 18:39:52 +00:00
|
|
|
|
|
|
|
datapoints.addSeries(linesA);
|
|
|
|
|
|
|
|
renderer.setSeriesPaint(seriesCount, color);
|
|
|
|
renderer.setSeriesStroke(seriesCount, new BasicStroke(2.0f));
|
|
|
|
renderer.setBaseSeriesVisible(true);
|
|
|
|
renderer.setSeriesLinesVisible(seriesCount, true);
|
|
|
|
seriesCount++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void addLineToPlot(double m, double b, String name) {
|
|
|
|
|
|
|
|
XYSeries linesA = new XYSeries(name);
|
2017-09-07 09:21:48 +00:00
|
|
|
linesA.add(min.intValue(), min.intValue() * m + b);
|
|
|
|
linesA.add(max.intValue(), max.intValue() * m + b);
|
2017-06-20 14:59:24 +00:00
|
|
|
|
|
|
|
datapoints.addSeries(linesA);
|
2017-09-05 18:39:52 +00:00
|
|
|
seriesCount = xyPlot.getSeriesCount();
|
|
|
|
renderer.setSeriesPaint(seriesCount, Color.red);
|
|
|
|
renderer.setSeriesStroke(seriesCount, new BasicStroke(2.0f));
|
|
|
|
renderer.setBaseSeriesVisible(true);
|
|
|
|
renderer.setSeriesLinesVisible(seriesCount, true);
|
2017-06-20 14:59:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void convertData(LinkedList<Line> points) {
|
|
|
|
datapoints = new XYSeriesCollection();
|
|
|
|
ArrayList<Double> coordinates = new ArrayList<>();
|
|
|
|
series = new XYSeries("points");
|
|
|
|
for (Line p : points) {
|
2017-08-03 18:37:59 +00:00
|
|
|
series.add(p.getM().doubleValue(), p.getB().doubleValue() * (-1));
|
2017-06-20 14:59:24 +00:00
|
|
|
coordinates.add(p.getM());
|
2017-05-29 13:42:25 +00:00
|
|
|
|
|
|
|
}
|
2017-09-05 18:39:52 +00:00
|
|
|
this.max = series.getMaxX();
|
|
|
|
this.min = series.getMinX();
|
2017-06-20 14:59:24 +00:00
|
|
|
datapoints.addSeries(series);
|
|
|
|
}
|
2017-05-29 13:42:25 +00:00
|
|
|
|
|
|
|
|
2017-05-29 12:15:51 +00:00
|
|
|
}
|
2017-05-29 13:42:25 +00:00
|
|
|
|