Advertisement
Guest User

Data Collator

a guest
Oct 13th, 2014
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.59 KB | None | 0 0
  1. package dailyprogrammer.medium.datacollator;
  2.  
  3. import javafx.application.Application;
  4. import javafx.scene.Scene;
  5. import javafx.scene.chart.LineChart;
  6. import javafx.scene.chart.NumberAxis;
  7. import javafx.scene.chart.XYChart;
  8. import javafx.stage.Stage;
  9.  
  10. import java.io.BufferedReader;
  11. import java.io.File;
  12. import java.io.FileReader;
  13. import java.util.function.Function;
  14.  
  15. public class Graph extends Application {
  16.  
  17.     private String chartTitle;
  18.     private String xAxisLabel;
  19.     private String yAxisLabel;
  20.     XYChart.Series<Number, Number> absData;
  21.     XYChart.Series<Number, Number> apprxData;
  22.  
  23.     public Graph() {
  24.         absData   = new XYChart.Series<>();
  25.         apprxData = new XYChart.Series<>();
  26.         readData(new File("src/dailyprogrammer/medium/datacollator/input"));
  27.         makeApproxData();
  28.     }
  29.  
  30.     @Override
  31.     public void start(Stage stage) {
  32.         NumberAxis xAxis = new NumberAxis();
  33.         NumberAxis yAxis = new NumberAxis();
  34.         LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
  35.  
  36.         stage.setTitle("Data Collator From Jamaica");
  37.         lineChart.setTitle(chartTitle);
  38.         xAxis.setLabel(xAxisLabel);
  39.         yAxis.setLabel(yAxisLabel);
  40.  
  41.         Scene scene  = new Scene(lineChart, 800, 600);
  42.         lineChart.getData().addAll(absData, apprxData);
  43.  
  44.         stage.setScene(scene);
  45.         scene.getStylesheets().add("/dailyprogrammer/medium/datacollator/chart.css");
  46.         stage.show();
  47.     }
  48.  
  49.     public void readData(File file) {
  50.         try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
  51.             String[] chartData = reader.readLine().split(":");
  52.             chartTitle         = chartData[1];
  53.             xAxisLabel         = chartData[2];
  54.             yAxisLabel         = chartData[3];
  55.             reader.lines().forEach(line -> {
  56.                 String[] tokens = line.split(":");
  57.                 double x = Double.parseDouble(tokens[0]);
  58.                 double y = Double.parseDouble(tokens[1]);
  59.                 XYChart.Data<Number, Number> data = new XYChart.Data<>(x, y);
  60.                 absData.getData().add(data);
  61.             });
  62.         } catch (Exception e) {
  63.             e.printStackTrace();
  64.         }
  65.     }
  66.  
  67.     private void makeApproxData() {
  68.         double xUpper = absData.getData().stream()
  69.             .mapToDouble(xy -> (double)xy.getXValue())
  70.             .average().getAsDouble();
  71.         double yUpper = absData.getData().stream()
  72.             .mapToDouble(xy -> (double)xy.getYValue())
  73.             .average().getAsDouble();
  74.  
  75.         Function<XYChart.Data<Number, Number>, Double> f1 = xy -> {
  76.             double x = (double)xy.getXValue();
  77.             double y = (double)xy.getYValue();
  78.             return (x - xUpper) * (y - yUpper);
  79.         };
  80.  
  81.         Function<XYChart.Data<Number, Number>, Double> f2 = xy -> {
  82.             double x = (double)xy.getXValue();
  83.             return Math.pow(x - xUpper, 2);
  84.         };
  85.  
  86.         double m =
  87.             absData.getData().stream()
  88.             .mapToDouble(xy ->f1.apply(xy)).sum()
  89.                 /
  90.             absData.getData().stream()
  91.             .mapToDouble(xy -> f2.apply(xy)).sum();
  92.  
  93.         double c = yUpper - (m * xUpper);
  94.  
  95.         absData.getData().stream()
  96.             .mapToDouble(xy -> (double)xy.getXValue())
  97.             .forEach(x -> {
  98.                 double y = m * x + c;
  99.                 XYChart.Data<Number, Number> data = new XYChart.Data<>(x, y);
  100.                 apprxData.getData().add(data);
  101.             });
  102.     }
  103.  
  104.  
  105.     public static void main(String[] args) {
  106.         launch(args);
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement