ticks.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. var e10 = Math.sqrt(50),
  2. e5 = Math.sqrt(10),
  3. e2 = Math.sqrt(2);
  4. export default function(start, stop, count) {
  5. var reverse,
  6. i = -1,
  7. n,
  8. ticks,
  9. step;
  10. stop = +stop, start = +start, count = +count;
  11. if (start === stop && count > 0) return [start];
  12. if (reverse = stop < start) n = start, start = stop, stop = n;
  13. if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
  14. if (step > 0) {
  15. start = Math.ceil(start / step);
  16. stop = Math.floor(stop / step);
  17. ticks = new Array(n = Math.ceil(stop - start + 1));
  18. while (++i < n) ticks[i] = (start + i) * step;
  19. } else {
  20. start = Math.floor(start * step);
  21. stop = Math.ceil(stop * step);
  22. ticks = new Array(n = Math.ceil(start - stop + 1));
  23. while (++i < n) ticks[i] = (start - i) / step;
  24. }
  25. if (reverse) ticks.reverse();
  26. return ticks;
  27. }
  28. export function tickIncrement(start, stop, count) {
  29. var step = (stop - start) / Math.max(0, count),
  30. power = Math.floor(Math.log(step) / Math.LN10),
  31. error = step / Math.pow(10, power);
  32. return power >= 0
  33. ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
  34. : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
  35. }
  36. export function tickStep(start, stop, count) {
  37. var step0 = Math.abs(stop - start) / Math.max(0, count),
  38. step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
  39. error = step0 / step1;
  40. if (error >= e10) step1 *= 10;
  41. else if (error >= e5) step1 *= 5;
  42. else if (error >= e2) step1 *= 2;
  43. return stop < start ? -step1 : step1;
  44. }