一种简单的坐标自适应的算法(java版本)

/**
 * 刻度计算的帮助类
 * 已知条件:最大值,最小值,初始设定的刻度数
 * 第一步,计算步长
 * 第二步,重新计算刻度数
 * 第三步,重新计算最大值和最小值
 */
public class ScaleCaculateHelper {

    /**
     * 最小值
     */
    private double mMin;

    /**
     * 最大值
     */
    private double mMax;

    /**
     * 刻度数
     */
    private int mNumTicks;

    /**
     * 步长
     */
    private double mStep;

    /**
     * 最小的刻度数
     */
    private static final int MIN_NUM_TICKS = 4;

    public ScaleCaculateHelper(double mMin, double mMax, int mNumTicks) {
        this.mMin = mMin;
        this.mMax = mMax;
        this.mNumTicks = mNumTicks;
    }

    /**
     * 调整坐标
     */
    public void adjustAxis(){
        //计算步长
        if(mNumTicks < MIN_NUM_TICKS){
            mNumTicks = MIN_NUM_TICKS;
        }
        double grossStep = (mMax - mMin) / mNumTicks;
        //1--10之间取1, 10---100之间取10, 100--1000之间取100
        double step = Math.pow(10, Math.floor(Math.log10(grossStep)));//floor()四舍五入取小值
        if(grossStep < 2 * step){
            step = step * 1;
        }else if(grossStep >= 2 * step && grossStep < 5 * step ){
            step = step * 2;
        } else{
            step = step * 5;
        }
        mStep = step;

        //重新计算刻度数
        mNumTicks = (int) (Math.ceil(mMax / step) - Math.floor(mMin / step));//ceil()四舍五入取大值

        //重新计算最小值和最大值
        mMin = Math.floor(mMin / step) * step;
        mMax = Math.ceil(mMax / step) * step;
    }

    public double getmMin() {
        return mMin;
    }

    public double getmMax() {
        return mMax;
    }

    public int getmNumTicks() {
        return mNumTicks;
    }

    public double getmStep() {
        return mStep;
    }
}

猜你喜欢

转载自blog.csdn.net/liangshui999/article/details/88976383