package View; import Model.Line; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Shape; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import javax.swing.JPanel; 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; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.util.ShapeUtilities; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * * @Author: Armin Wolf * @Email: a_wolf28@uni-muenster.de * @Date: 29.05.2017. */ public class PlotDialog extends JPanel { private JFreeChart chart; private ChartPanel panel; private XYSeriesCollection datapoints; private XYSeries series; private XYSeries linesA, linesB; private Double min; private Double max; public PlotDialog() { super(); this.setPreferredSize(new Dimension(1000, 1000)); this.setMinimumSize(new Dimension(1000, 800)); this.setLayout(new BorderLayout()); } public void createPlot(LinkedList points) { try { Thread thread = new Thread(() -> convertData(points)); thread.start(); thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } //createScatterPlot chart = ChartFactory.createXYLineChart("", "X", "Y", datapoints, PlotOrientation.VERTICAL, false, true, false); Shape diamond = ShapeUtilities.createDiamond(2f); chart.setBorderVisible(false); chart.setAntiAlias(true); chart.getPlot().setBackgroundPaint(Color.WHITE); chart.setBorderVisible(false); XYPlot xyPlot = (XYPlot) chart.getPlot(); xyPlot.setDomainCrosshairVisible(true); xyPlot.setRangeCrosshairVisible(true); XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyPlot.getRenderer(); renderer.setSeriesLinesVisible(0, false); renderer.setSeriesShapesVisible(0, true); renderer.setSeriesLinesVisible(1, true); renderer.setSeriesLinesVisible(2, true); renderer.setSeriesPaint(0, Color.blue); renderer.setSeriesShape(0, diamond); renderer.setSeriesPaint(1, Color.red); renderer.setSeriesShape(1, diamond); renderer.setSeriesStroke(1, new BasicStroke(2.0f)); renderer.setBaseSeriesVisible(true); renderer.setSeriesPaint(2, Color.GREEN); renderer.setSeriesShape(2, diamond); renderer.setSeriesStroke(2, new BasicStroke(2.0f)); renderer.setBaseSeriesVisible(true); xyPlot.setDomainCrosshairVisible(true); xyPlot.setRangeCrosshairVisible(true); panel = new ChartPanel(chart); panel.setMouseZoomable(false); this.add(panel, BorderLayout.CENTER); } public void clear(){ if (datapoints != null) datapoints.removeAllSeries(); } public void addLineToPlot(double m, double b) { linesA = new XYSeries("linesA"); linesA.add(min.intValue(), min.intValue() * m + b); linesA.add(max.intValue(), max.intValue() * m + b); datapoints.addSeries(linesA); } private void convertData(LinkedList points) { datapoints = new XYSeriesCollection(); ArrayList coordinates = new ArrayList<>(); series = new XYSeries("points"); for (Line p : points) { series.add(p.getM(), p.getB()); coordinates.add(p.getM()); } this.max = Collections.max(coordinates) + 1; this.min = Collections.min(coordinates) - 1; datapoints.addSeries(series); } }