import java.lang.Math; /**===========================================================
* Determines tick values:

* (First tick value, Last Tick value, distance between two tick)
* such that the given intervalle has about 10 ticks *============================================================*/ public class Scale { private static double rap[]={10.0, 5.0, 2.0, 1.0, 0.5, 0.2, 0.1}; private final double loga10 = 2.302585093; private double Decc; private double expo; private int NX1, NX2; /** First tick value */ public double getMin() {return(NX1 * Decc);} /** Last tick value */ public double getMax() {return(NX2 * Decc);} /** Intervalle between two ticks*/ public double getStep() {return(Decc);} /** Specify entire intervalle*/ public void setMinMax(double m, double M) {double Xmin = m; double Xmax = M; if(Xmax == Xmin) Xmax += 1.0; int mult = (int)Math.floor(Math.log(Xmax - Xmin) / loga10); Decc = (Xmax - Xmin) / Math.pow(10.0, mult); double n; int i = 0; do n = Decc / rap[i++]; while (n <= 8 && i<7); i -= 2; Decc = rap[i] * Math.pow(10.0, mult); NX2 = (int)Math.floor(Xmax / Decc); NX1 = (int)Math.floor(Xmin / Decc) + 1; if(Math.abs(Xmin - (double)(NX1 - 1) * Decc) < .01 * Decc) NX1 -= 1; if(Math.abs(Xmax - (double)(NX2 + 1) * Decc) < .01 * Decc) NX2 += 1; if(NX1 == 0 || NX2 == 0) {expo = 0; return;} expo = (int)Math.floor(Math.log(Math.abs((double)NX2) * Decc)/loga10); int b = (int)Math.floor(Math.log(Math.abs((double)NX1) * Decc)/loga10); if( b < expo) expo = b; int c = (int)Math.floor(Math.log((double)(NX2-NX1) * Decc)/loga10) + 1; if( c < expo) expo = c; } /** Constructor specifies default entire intervalle*/ public Scale(double m, double M) {setMinMax(m,M);} }