package kg.apc.charting.plotters;
import java.awt.Graphics2D;
import kg.apc.charting.AbstractGraphRow;
import kg.apc.charting.ChartSettings;
import kg.apc.charting.CubicSpline;
import org.apache.jorphan.gui.NumberRenderer;
public class CSplineRowPlotter extends AbstractRowPlotter {
private long splineLinesCount = 200L;
public CSplineRowPlotter(ChartSettings chartSettings, NumberRenderer labelRenderer) {
super(chartSettings, labelRenderer);
allowMarkers = true;
}
@Override
protected void processPoint(Graphics2D g2d, int granulation) {
//do nothing
}
@Override
protected void postPaintRow(AbstractGraphRow row, Graphics2D g2d) {
if(chartSettings.getLineWidth() == 0) return;
if (row.size() >= 3) {
CubicSpline cs = new CubicSpline(row);
long minX = row.getMinX();
long maxX = row.getMaxX();
double step = (double)(maxX - minX) / splineLinesCount;
double currentX = minX;
while (currentX <= maxX) {
x = chartRect.x + (int) ((currentX - minXVal) * dxForDVal);
int yHeight = (int) ((cs.interpolate(currentX) - minYVal) * dyForDVal);
y = chartRect.y + chartRect.height - yHeight;
//prevent out of range
if (y < chartRect.y) {
y = chartRect.y;
}
if (y > chartRect.y + chartRect.height) {
y = chartRect.y + chartRect.height;
}
currentX += step;
if (prevX >= 0) {
g2d.drawLine(prevX, prevY, x, y);
}
prevX = x;
prevY = y;
}
}
}
}