package org.lemsml.jlems.viz.plot;
import java.awt.Color;
import org.lemsml.jlems.core.logging.E;
public class GridPainter {
final static int[] intervals = {1, 2, 5};
Color gridColor;
Color axisColor;
private boolean axesOnGrid = false;
String xlabel = null;
public void setGridColor(Color c) {
gridColor = c;
}
public void setAxisColor(Color c) {
axisColor = c;
}
public void setGridBackground(Color c) {
int ic = c.getRed() + c.getGreen() + c.getBlue();
if (ic > 380) {
gridColor = ColorUtil.verySlightlyDarker(c);
} else {
gridColor = ColorUtil.verySlightlyBrighter(c);
}
}
public void paint(Painter p) {
double[] xyxy = p.getXYXYLimits();
if (gridColor == null) {
setGridBackground(Color.gray);
}
int width = p.getCanvasWidth();
int height = p.getCanvasHeight();
double dx = xyxy[2] - xyxy[0];
double dy = xyxy[3] - xyxy[1];
double[] xpts = getTickValues(6, xyxy[0], xyxy[2]);
int[] ixpts = getTicks(xpts, xyxy[0], xyxy[2], width);
double[] ypts = getTickValues(6, xyxy[1], xyxy[3]);
int[] iypts = getTicks(ypts, xyxy[1], xyxy[3], height);
p.setColor(gridColor);
for (int i = 0; i < ixpts.length; i++) {
p.drawPixelLine(ixpts[i], 0, ixpts[i], height);
}
for (int i = 0; i < iypts.length; i++) {
p.drawPixelLine(0, height - iypts[i], width, height - iypts[i]);
}
if (axesOnGrid) {
if (axisColor != null) {
p.setColor(axisColor);
} else {
p.setColor(gridColor);
}
for (int i = 0; i < ixpts.length; i++) {
p.drawCenteredString(Formatter.format(xpts[i], dx), ixpts[i], height-10);
}
for (int i = 0; i < iypts.length; i++) {
p.drawString(Formatter.format(ypts[i], dy), 10, height-iypts[i]+4);
}
if (xlabel != null) {
p.drawString(xlabel, width/2, height-2);
}
}
}
public final static double[] getTickValues(int ntick, double vlow, double vhigh) {
double dv = 1.5 * Math.abs(vhigh - vlow) / ntick;
double log = Math.log (dv) / Math.log(10.);
double powten = (int) Math.floor(log);
int iiind = (int) (2.999 * (log - powten));
if (iiind < 0 || iiind >= 3) {
E.error (" gdc, 650: " + log + " " + powten + " " + iiind);
iiind = 2;
}
int ii = intervals[iiind];
dv = Math.pow(10.0, powten) * ii;
int i0 = (int)(vlow / dv);
int i1 = (int)(vhigh / dv);
int nl = i1 - i0 + 1;
double[] ret = new double[nl];
for (int i = 0; i < nl; i++) {
ret[i] = (i0 + i) * dv;
}
return ret;
}
public final static int[] getTicks(double[] va,
double vlow, double vhigh, int range) {
int nl = va.length;
int[] ret = new int[nl];
for (int i = 0; i < nl; i++) {
ret[i] = (int) (range * (va[i] - vlow) / (vhigh - vlow));
}
return ret;
}
public void setOnGridAxes() {
axesOnGrid = true;
}
public void setXAxisLabel(String s) {
xlabel = s;
}
}