No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

100 líneas
2.6 KiB

  1. import { fillArray } from './helpers';
  2. export function getBarHeightAndYAttr(yTop, zeroLine) {
  3. let height, y;
  4. if (yTop <= zeroLine) {
  5. height = zeroLine - yTop;
  6. y = yTop;
  7. } else {
  8. height = yTop - zeroLine;
  9. y = zeroLine;
  10. }
  11. return [height, y];
  12. }
  13. export function equilizeNoOfElements(array1, array2,
  14. extraCount = array2.length - array1.length) {
  15. // Doesn't work if either has zero elements.
  16. if(extraCount > 0) {
  17. array1 = fillArray(array1, extraCount);
  18. } else {
  19. array2 = fillArray(array2, extraCount);
  20. }
  21. return [array1, array2];
  22. }
  23. export function truncateString(txt, len) {
  24. if (!txt) {
  25. return;
  26. }
  27. if (txt.length > len) {
  28. return txt.slice(0, len-3) + '...';
  29. } else {
  30. return txt;
  31. }
  32. }
  33. export function shortenLargeNumber(label) {
  34. let number;
  35. if (typeof label === 'number') number = label;
  36. else if (typeof label === 'string') {
  37. number = Number(label);
  38. if (Number.isNaN(number)) return label;
  39. }
  40. // Using absolute since log wont work for negative numbers
  41. let p = Math.floor(Math.log10(Math.abs(number)));
  42. if (p <= 2) return number; // Return as is for a 3 digit number of less
  43. let l = Math.floor(p / 3);
  44. let shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));
  45. // Correct for floating point error upto 2 decimal places
  46. return Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];
  47. }
  48. // cubic bezier curve calculation (from example by François Romain)
  49. export function getSplineCurvePointsStr(xList, yList) {
  50. let points=[];
  51. for(let i=0;i<xList.length;i++){
  52. points.push([xList[i], yList[i]]);
  53. }
  54. let smoothing = 0.2;
  55. let line = (pointA, pointB) => {
  56. let lengthX = pointB[0] - pointA[0];
  57. let lengthY = pointB[1] - pointA[1];
  58. return {
  59. length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),
  60. angle: Math.atan2(lengthY, lengthX)
  61. };
  62. };
  63. let controlPoint = (current, previous, next, reverse) => {
  64. let p = previous || current;
  65. let n = next || current;
  66. let o = line(p, n);
  67. let angle = o.angle + (reverse ? Math.PI : 0);
  68. let length = o.length * smoothing;
  69. let x = current[0] + Math.cos(angle) * length;
  70. let y = current[1] + Math.sin(angle) * length;
  71. return [x, y];
  72. };
  73. let bezierCommand = (point, i, a) => {
  74. let cps = controlPoint(a[i - 1], a[i - 2], point);
  75. let cpe = controlPoint(point, a[i - 1], a[i + 1], true);
  76. return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;
  77. };
  78. let pointStr = (points, command) => {
  79. return points.reduce((acc, point, i, a) => i === 0
  80. ? `${point[0]},${point[1]}`
  81. : `${acc} ${command(point, i, a)}`, '');
  82. };
  83. return pointStr(points, bezierCommand);
  84. }