坐标轴范围及刻度的自适应算法

tuonioooo 2017-03-24

本文参考博客:http://blog.csdn.net/heyzol/article/details/22912389

由于我是固定了刻度数,美观的呈现图表,所以在原博主算法上进行了修改

var calculateRulerMark = function(arrMark, numMin, numMax, iHeight, iActualMarkNum)
{
	if(numMax <= numMin)
	{
		return; 
	}
	var iMinMark = numMin;
	var iMaxMark = numMax;
	var iSuggestMarkNum = parseInt(iHeight / 20) + 1;
	//传了实际的进来说明,实际的比建议的大
	iActualMarkNum = iActualMarkNum ? iActualMarkNum - 1 : iSuggestMarkNum;
	var iSuggestStep = (numMax - numMin) / iActualMarkNum;
	var iBase = Math.pow(10, parseInt(Math.log(iSuggestStep)/Math.log(10)));
	if(iBase != iSuggestStep)
	{
		iBase = 10 * iBase;
	}
	var iTempStep = (iSuggestStep / iBase).toFixed(6);
	// 常规步长 0.1, 0.2, 0.25, 0.5 , 1 
	if(iTempStep >= 0 && iTempStep <= 0.1)
	{
		iTempStep = 0.1;
	}
	else if(iTempStep >=0.100001 && iTempStep <= 0.2)
	{
		iTempStep = 0.2;
	}
	else if(iTempStep >= 0.200001 && iTempStep <= 0.25)
	{
		iTempStep = 0.25;
	}
	else if(iTempStep >= 0.250001 && iTempStep <= 0.5)
	{
		iTempStep = 0.5
	}
	else
	{
		iTempStep = 1;
	}
	iTempStep = iTempStep * iBase;
	//判断最小刻度是否需要+1
	if(parseInt(numMin / iTempStep) != numMin / iTempStep)
	{
		if(numMin < 0)
		{
			iMinMark = (-1) * Math.ceil(Math.abs(numMin/iTempStep))*iTempStep;
		}
		else
		{
			iMinMark = parseInt(Math.abs(numMin/iTempStep))*iTempStep;
		}
	}
	//判断最大刻度是否需要+1
	if(parseInt(numMax / iTempStep) != numMax / iTempStep)
	{
		if(numMax < 0)
		{
			iMaxMark = (-1) * Math.floor(Math.abs(numMax/iTempStep))*iTempStep;
		}
		else
		{
			iMaxMark = parseInt(numMax/iTempStep + 1)*iTempStep;
		}
	}
	var iTempMarkNum = (iMaxMark - iMinMark) / iTempStep + 1;
	if(iTempMarkNum > iSuggestMarkNum)
	{
		calculateRulerMark(arrMark, numMin, numMax, iHeight, iActualMarkNum)
	}
	else
	{
		iSuggestMarkNum = iTempMarkNum;
		for(var i = 0; i < iSuggestMarkNum; i++)
		{
			arrMark.push(iMinMark+ iTempStep * i);
		}
	}
}

相关推荐