package electrosphere.renderer.ui.imgui; import java.util.LinkedList; import java.util.List; import imgui.ImVec2; import imgui.extension.implot.ImPlot; import imgui.extension.implot.flag.ImPlotAxisFlags; /** * A line plot of a given set of data */ public class ImGuiLinePlot implements ImGuiElement { //the title of the plot String plotTitle; //the data sets to draw List dataSets = new LinkedList(); /** * Creates an im gui line plot */ public ImGuiLinePlot(String plotTitle){ this.plotTitle = plotTitle; } @Override public void draw() { if(ImPlot.beginPlot(plotTitle,"","",new ImVec2(-1,-1),0,ImPlotAxisFlags.AutoFit,ImPlotAxisFlags.AutoFit)){ for(ImGuiLinePlotDataset dataSet : dataSets){ double[] xs = dataSet.xData.stream().mapToDouble(Double::doubleValue).toArray();//(Double[])dataSet.xData.toArray(new Double[dataSet.xData.size()]); double[] ys = dataSet.yData.stream().mapToDouble(Double::doubleValue).toArray();//(Double[])dataSet.yData.toArray(new Double[dataSet.yData.size()]); ImPlot.plotLine(dataSet.label, xs, ys, xs.length, 0); } ImPlot.endPlot(); } } /** * Adds a dataset to the line plot * @param dataset The dataset */ public void addDataset(ImGuiLinePlotDataset dataset){ this.dataSets.add(dataset); } /** * A single set of data to be plotted in this graph */ public static class ImGuiLinePlotDataset { //x data List xData = new LinkedList(); //y data List yData = new LinkedList(); //the label of the line String label; //the max number of points int limit; /** * Creates a dataset object * @param x the x data * @param y the y data * @param label the label for the data * @param limit the maximum number of objects to keep in the dataset */ public ImGuiLinePlotDataset(String label, int limit){ this.label = label; this.limit = limit; } /** * Adds data to the data set. If the amount of data is greater than the limit, it will remove the oldest datapoint * @param x the x value * @param y the y value */ public void addPoint(double x, double y){ xData.add(x); yData.add(y); while(xData.size() > limit){ xData.remove(0); } while(yData.size() > limit){ yData.remove(0); } } /** * Adds data to the data set. If the amount of data is greater than the limit, it will remove the oldest datapoint. * Does not clear the x axis so can constantly receive data and update without axis freaking out. * @param y the y value */ public void addPoint(double y){ yData.add(y); while(yData.size() > limit){ yData.remove(0); } } } }