我知道如何使用range.js和d3.scale.linear,也知道域和范围。
但是当我读到range.js和linear.js中的代码时,我很困惑,为什么它看起来如此复杂和神秘: 例如linear.js中的代码:
step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),
err = m / span * step;
// Filter ticks to get closer to the desired count.
if (err <= .15) step *= 10;
else if (err <= .35) step *= 5;
else if (err <= .75) step *= 2;
通常,我使用&#34; ax + b = y&#34;来实现该功能。 ,例如:
domain(inputMin, inputMax);
stick = 4;
a = (inputMax-inputMin)/stick;
for(i = 0; i<a; i++)
{
arr[] = i*a+inputMin;
}
那么为什么d3使用Math.log(Math.pow ...)来获得&#39;步骤&#39;?
代码的含义和作用是什么?
感谢您提供的任何帮助。
答案 0 :(得分:1)
我上周必须为这个算法编写单元测试。在这里我的解释:
// Approximate the step to the closest power of ten by transforming to the
// commom log scale, truncating the mantissa, and transforming back.
step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),
// Calculate how closely the step covers the span of the domain.
err = (m * step) / span;
// Given the coverage of the current step against the domain span, multiply
// (if necessary) by a constant to get closer to the desired tick count.
if (err <= 0.15) step *= 10;
else if (err <= 0.35) step *= 5;
else if (err <= 0.75) step *= 2;