abstract class LineGraphData { abstract float getMinDomain(); abstract float getMaxDomain(); abstract float getMinRange(); abstract float getMaxRange(); abstract int getNumData(); abstract void reset(); abstract float[] getNextData(); abstract color getColor(); abstract String getLabel(); } class LineGraph { LineGraphData[] data=null; int x, y, w, h; PFont font; int fontSize; String title=null; String xLabel=null; String yLabel=null; float xMin, xMax, yMin, yMax; float xMinX, xMaxX, yMinY, yMaxY; NumberFormat numFormat; LineGraph(PFont font, int fontSize, String title, String xLabel, String yLabel) { this.x = x; this.y = y; this.w = w; this.h = h; this.font = font; this.fontSize = fontSize; this.title = title; this.xLabel = xLabel; this.yLabel = yLabel; numFormat = new DecimalFormat("0.00"); } void addGraphData(LineGraphData gd) { LineGraphData[] newData; float xMinG, xMaxG, yMinG, yMaxG; int numData; if (gd == null) return; xMinG = gd.getMinDomain(); xMaxG = gd.getMaxDomain(); yMinG = gd.getMinRange(); yMaxG = gd.getMaxRange(); if (data==null) { newData = new LineGraphData[1]; numData = 0; xMin = xMinG; xMax = xMaxG; yMin = yMinG; yMax = yMaxG; } else { numData = data.length; newData = new LineGraphData[numData+1]; xMin = min(xMin, xMinG); xMax = max(xMax, xMaxG); yMin = min(yMin, yMinG); yMax = max(yMax, yMaxG); } for (int i=0; i 1) { labelSpacing = (xRight - xLeft - labelSum) / (numLabels - 1.0); } labelStart = xLeft; out.textAlign(LEFT, BOTTOM); for (int j=0; j < data.length; ++j) { String label = data[j].getLabel(); if (label != null) { out.fill(data[j].getColor()); out.text(label, labelStart, yBottom + 2*fontSize+8); labelStart+=labelSpacing+out.textWidth(label); } } } float getScreenX(float in) { return xMinX + (xMaxX - xMinX) * (in - xMin) / (xMax - xMin); } float getScreenY(float in) { return yMinY + (yMaxY - yMinY) * (in - yMin) / (yMax - yMin); } }