package org.jzy3d.plot3d.primitives.axes.layout.providers;
/** Compute the ticks placements automatically between values min and max.
*
* @author Jerome Kodjabachian
*/
public class SmartTickProvider extends AbstractTickProvider implements ITickProvider{
public SmartTickProvider(){
this(5);
}
public SmartTickProvider(int steps){
this.steps = steps;
}
@Override
public double[] generateTicks(double min, double max, int steps) {
if(min == max){
double[] ticks = new double[1];
ticks[0] = min;
return ticks;
}
else if(min > max)
return new double[0];
double absscale = Math.floor(Math.log10(max-min));
double relscale = Math.log10(max-min) - absscale;
double ticksize = 0;
if( relscale < Math.log10(0.2*steps) )
ticksize = (Math.pow(10,absscale)*0.2);
else if( relscale < Math.log10(0.5*steps) )
ticksize = (Math.pow(10,absscale)*0.5);
else if( relscale < Math.log10(1*steps) )
ticksize = Math.pow(10,absscale)*1;
else
ticksize = Math.pow(10,absscale)*2;
double start = (int)Math.ceil(min/ticksize);
double stop = (int)Math.floor(max/ticksize);
double[] ticks = new double[(int)(stop-start+1)];
for(double t=start; t<=stop; t++)
ticks[(int)(t-start)] = (t*ticksize);
return ticks;
}
@Override
public int getDefaultSteps() {
return steps;
}
protected int steps;
}
Ads help maintain this website.