式中,Log代表自然对数。至于取哪个公式,需 要根据CorStep是否是10的整数次幂而定。
2)将步长其规范化到0到1的范围
将步长其规范化到0到1的范围内,方法如下:float newCorStep=CorStep/(10^Temp) (newCorStep 取到 0-1范围)
式中,符号“^”代表取幂的意思。
然后根据新的步长取值范围,将新的取值定位 在:0.1、 0.2、 0.25、 0.5、 1 几个常规步长上,称为StandardStep.
standardStep 的取值可以自己定,这里比如 newCorStep = 0.21, 则取 standardStep = 0.2;
最后再根据数量级将规范的步长恢复 到本来的数量级上,见下式:
FinalStep=standardStp*Temp
FinalStep 为最后确定的步长!
(2)起点的规范化
一般说来.我们的起点应该是小于等于原来的 起点,同时,起点坐标是步长的整数倍比较符合人 们的习惯。这一点容易做到,见下式:
NewCorMin=( int(CorMin/FinalStep) ) * Finalstep;
其中,int是取整函数。
(3)终点的规范化
按惯例,我们的终点应该是大于等于原来的终点,同样,终点坐标是步长的整数倍比较符合人们的习惯,见下式:
NewCorMax= ( int(CorMax/FinalStep) +1 ) 十 FinaIStep
其中,int是取整函数。
(4)最后的修正
我们按上面的公式确定完参数后,新确定的步长、起点、终点值有可能使得刻度数与原来刻度数不等。这里是否需要调整呢?如果需要,我们应该如何调整呢?
两种情况:
1)起点和终点可变,即图像显示的范围没有确定的情况
如果新算得的刻度数大于等于原来设定的刻度数,就不应该调整了。如果新算得的刻度数小于原来设定的刻度数,就应该将其 调整为原来的刻度数。同时,在步长不动的情况下,分别将起点与终点进行再次修正。
2) 起点和终点 固定的情况,即输入参数 cormax ,cormin 为确定值
如果算得的刻度少于原来的刻度数,就应该将步长减小,然后刻度数增加,一般情况下,输入的刻度数只是一个建议值,最终得到的刻度数不会相差很大,可以接受的话就不需要修正了。
以下测试程序:
const float c_scale_standard_step[6] = {0.1,0.2,0.25,0.5,1.0};
void getBestScale(float min, float max, int Ticks)
{
float corStep = (max- min)/Ticks;
printf("cor step:%f\n",corStep);
//步长的数量级
int temp = ceil(log(corStep)/log(10));
printf("temp :%d\n",temp);
//步长规范到 0-1
float newCorStep = corStep/pow(10,temp);
printf("new cor Step :%f\n",newCorStep);
//定步长
float standard_step;
int i=0;
for(;i<6;i++)
{
if(newCorStep<=c_scale_standard_step[i]){
standard_step = c_scale_standard_step[i];
break;
}
}
printf("standard Step :%f\n",standard_step);
float finalStep = standard_step*pow(10,temp);
printf("final Step :%f\n",finalStep);
//修正
float cormin = finalStep*ceil(min/finalStep);
float cormax = finalStep*floor(max/finalStep);
//根据需要做修正....
}