刻度轴 规范值算法

来源:互联网 发布:python使用领域 编辑:程序博客网 时间:2024/04/29 04:31
 //CorMax 数据最大值
   //CorMin 数据最小值
   //CorNumber 刻度个数
   public void Standard(ref double CorMax, ref double CorMin, int CorNumber)
        {
            double tmpMax, tmpMin;
            double CorStep, tmpStep;
            int tmpNumber;
            double temp;
            int extraNumber;
            if (CorMax > CorMin)
            {
                //计算原始步长
                CorStep = (CorMax - CorMin) / CorNumber;

                //计算步长的数量级
                if (Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10))) == CorStep)
                {
                    temp = Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10)));
                }
                else
                {
                    temp = Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10)) + 1);
                }


                //将步长修正到(O,1)问
                tmpStep = CorStep / temp;
                //选取规范步长
                if (tmpStep >= 0 && tmpStep <= 0.1)
                {
                    tmpStep = 0.1;
                }
                else if (tmpStep >= 0.100001 && tmpStep <= 0.2)
                {
                    tmpStep = 0.2;
                }
                else if (tmpStep >= 0.200001 && tmpStep <= 0.25)
                {
                    tmpStep = 0.25;
                }
                else if (tmpStep >= 0.25001 && tmpStep <= 0.5)
                {
                    tmpStep = 0.5;
                }
                else
                {
                    tmpStep = 1;
                }
              
                //规范步长按数量级还原
                tmpStep = tmpStep * temp;
                //修正起点值
                if ((int)(CorMin / tmpStep) != (CorMin / tmpStep))
                {
                    CorMin = (int)(CorMin / tmpStep) * tmpStep;
                }
              

                if ((int)(CorMax / tmpStep) != (CorMax / tmpStep))
                {
                    CorMax = (int)(CorMax / tmpStep + 1) * tmpStep;
                }

                //看最后修正是否必要,包括:刻度数、起点值、终点值

                tmpNumber = Convert.ToInt32((CorMax - CorMin) / tmpStep);

                if (tmpNumber < CorNumber)
                {
                    extraNumber = CorNumber - tmpNumber;
                    if (extraNumber % 2 == 0)
                    {
                        CorMax = CorMax + tmpStep * (int)(extraNumber / 2);
                    }
                    else
                    {

                        CorMax = CorMax + tmpStep * (int)(extraNumber / 2 + 1);

                    }
                    CorMin = CorMin - tmpStep * (int)(extraNumber / 2);

                    if (CorMin < 0)
                    {
                        CorMax = CorMax - CorMin;
                        CorMin = 0;
                    }

                }
                CorNumber = tmpNumber;
            }
        }
0 0