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