2D 绘图中刻度规划和计算的方法

QT 2D 绘图中,经常用到刻度计算,这篇文章提供了很好的思路,大家可以根据实际情况稍微做更改,计算自己想要的刻度。
(1)步长规范化是关键
1)步长数量级:
  一般地,我们在标定坐标轴时,给出的参数是:起点、终点和刻度数,因为我们程序设计人员对在一个多大的区域面积内绘制多少个刻度比较美观有直观感觉,相反,而对多大步长则印象较浅。当然,知道刻度数和起点与终点值求步长是很容易 的,如下式:
float CorStep=(CorMax一CorMin)/CorNumber
式中,CorMax、CorMin、CorNmnber分别对应 起点、终点和刻度数。 步长求出后。我们只要将步长求以 10 为底的 对数,即可获得步长的数量级,见下式:
int Temp=Log(corStep)/Log(10)       (corStep 为 10 的整数次幂)
或者 
int Temp=Log(CorStep)/Log(10)+1  (corStep 不为 10 的整数次幂)

式中,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);
    
    //根据需要做修正....
}






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值