图表中有规律的刻度是如何实现的?

大家在用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是我们图标要显示的最大值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值