package View; import Model.Line; import Model.Point; 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.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.util.ShapeUtilities; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; /** * 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(800, 500)); this.setMinimumSize(new Dimension(800, 500)); 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); 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); this.add(panel, BorderLayout.CENTER); } public void addLineToPlot(double m, double b) { linesA = new XYSeries("linesA"); JOptionPane.showMessageDialog(null, "m: "+m+" b: "+b); 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); } }