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);
}
}
}