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);}
}