大家在用Matlab或word的时候发现它们的图表的X轴和Y轴上的刻度都是非常有规律的,比如都是0、1、2、3、4、5……
或者是5、10、15、20……或者是0.2、0.4、0.6、0.8…… 或者是100、200、300、400……
它们是怎么根据我们的数据范围得到这些有规律的值的呢?
由于我们项目中也要用到类似的功能所以请教了项目组的数学高手,发现采用下的方法可以实现这个功能,废话
不多说,直接上代码:
void GetRules(float minValue,float maxValue,QList<float>& rules)
{
rules.clear();
if(maxValue<=minValue) return;
//计算最大最小值之差
double length =maxValue - minValue;
//确定步长和刻度个数
float step = 0; //步长只能为1,2,5
int ruleCount = 5; //刻度个数
//获取第一位或前两位有效数字
int npt = (int)(log10(length));
int fSD = (int)(length * pow(10.0f, -1*npt)); //第一位有效数字
if (fSD <= 3)
{
//如果为1,2,3则取前两位有效数字
int dSD = (int)(length * pow(10.0f, -1 * (npt-1))); //前两位有效数字
if (dSD <= 12)
{
step = (float)(2 * pow(10.0f, npt-1));
ruleCount = dSD / 2;
}
else
{
step = (float)(5 * pow(10.0f, npt - 1));
ruleCount = dSD / 5;
}
}
else if (fSD <= 7)
{
//如果大于等于4,小于等于7,则步长为1
step = (float)(1 * pow(10.0f, npt));
ruleCount = fSD;
}
else
{
//如果大于等于8,则步长为2
step = (float)(2 * pow(10.0f, npt));
ruleCount = fSD/2;
}
//到目前为止已经得到了step和ruleCount
///获取起始点
float startValue = (int)(minValue / step) * step;
for (int i = 0; i < ruleCount+5;i++ )
{
float d = startValue + i * step;
if (d >= minValue && d <= maxValue)
{
rules.push_back(d); //添加刻度
}
}
}
这是获取刻度的函数,最后的刻度值会保存在rules中,minValue是我们图标要显示的最下值,maxValue是我们图标要显示的最大值。