@visactor/vrender-components 0.19.4-alpha.4 → 0.19.4-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/cjs/axis/index.d.ts +1 -0
  2. package/cjs/axis/index.js +2 -1
  3. package/cjs/axis/index.js.map +1 -1
  4. package/cjs/axis/tick-data/continuous.d.ts +4 -0
  5. package/cjs/axis/tick-data/continuous.js +61 -0
  6. package/cjs/axis/tick-data/continuous.js.map +1 -0
  7. package/cjs/axis/tick-data/discrete/linear.d.ts +6 -0
  8. package/cjs/axis/tick-data/discrete/linear.js +101 -0
  9. package/cjs/axis/tick-data/discrete/linear.js.map +1 -0
  10. package/cjs/axis/tick-data/discrete/polar-angle.d.ts +3 -0
  11. package/cjs/axis/tick-data/discrete/polar-angle.js +53 -0
  12. package/cjs/axis/tick-data/discrete/polar-angle.js.map +1 -0
  13. package/cjs/axis/tick-data/index.d.ts +5 -0
  14. package/cjs/axis/tick-data/index.js +26 -0
  15. package/cjs/axis/tick-data/index.js.map +1 -0
  16. package/cjs/axis/tick-data/util.d.ts +13 -0
  17. package/cjs/axis/tick-data/util.js +91 -0
  18. package/cjs/axis/tick-data/util.js.map +1 -0
  19. package/cjs/axis/type.d.ts +41 -1
  20. package/cjs/axis/type.js.map +1 -1
  21. package/cjs/axis/util.d.ts +11 -0
  22. package/cjs/axis/util.js +21 -2
  23. package/cjs/axis/util.js.map +1 -1
  24. package/cjs/constant.d.ts +2 -2
  25. package/cjs/constant.js +2 -2
  26. package/cjs/constant.js.map +1 -1
  27. package/cjs/index.d.ts +1 -1
  28. package/cjs/index.js +1 -1
  29. package/cjs/index.js.map +1 -1
  30. package/cjs/label/index.js +2 -1
  31. package/cjs/label/line.js +1 -1
  32. package/cjs/label/polygon.js +1 -1
  33. package/cjs/label/rect.js +1 -1
  34. package/cjs/label/register.js +1 -1
  35. package/cjs/label/symbol.js +1 -1
  36. package/cjs/label/type.js +1 -1
  37. package/cjs/legend/base.js +1 -1
  38. package/cjs/legend/constant.js +1 -1
  39. package/cjs/legend/discrete/discrete.d.ts +1 -0
  40. package/cjs/legend/discrete/discrete.js +3 -0
  41. package/cjs/legend/discrete/discrete.js.map +1 -1
  42. package/cjs/legend/index.js +1 -1
  43. package/cjs/legend/register.js +1 -1
  44. package/cjs/legend/type.js +1 -2
  45. package/cjs/legend/util.js +1 -1
  46. package/cjs/tooltip/util.js +1 -1
  47. package/cjs/tooltip/util.js.map +1 -1
  48. package/cjs/util/text.d.ts +1 -1
  49. package/cjs/util/text.js +3 -3
  50. package/cjs/util/text.js.map +1 -1
  51. package/es/axis/index.d.ts +1 -0
  52. package/es/axis/index.js +2 -0
  53. package/es/axis/index.js.map +1 -1
  54. package/es/axis/tick-data/continuous.d.ts +4 -0
  55. package/es/axis/tick-data/continuous.js +56 -0
  56. package/es/axis/tick-data/continuous.js.map +1 -0
  57. package/es/axis/tick-data/discrete/linear.d.ts +6 -0
  58. package/es/axis/tick-data/discrete/linear.js +90 -0
  59. package/es/axis/tick-data/discrete/linear.js.map +1 -0
  60. package/es/axis/tick-data/discrete/polar-angle.d.ts +3 -0
  61. package/es/axis/tick-data/discrete/polar-angle.js +45 -0
  62. package/es/axis/tick-data/discrete/polar-angle.js.map +1 -0
  63. package/es/axis/tick-data/index.d.ts +5 -0
  64. package/es/axis/tick-data/index.js +21 -0
  65. package/es/axis/tick-data/index.js.map +1 -0
  66. package/es/axis/tick-data/util.d.ts +13 -0
  67. package/es/axis/tick-data/util.js +80 -0
  68. package/es/axis/tick-data/util.js.map +1 -0
  69. package/es/axis/type.d.ts +41 -1
  70. package/es/axis/type.js.map +1 -1
  71. package/es/axis/util.d.ts +11 -0
  72. package/es/axis/util.js +19 -1
  73. package/es/axis/util.js.map +1 -1
  74. package/es/constant.d.ts +2 -2
  75. package/es/constant.js +2 -2
  76. package/es/constant.js.map +1 -1
  77. package/es/index.d.ts +1 -1
  78. package/es/index.js +1 -1
  79. package/es/index.js.map +1 -1
  80. package/es/label/index.js +2 -1
  81. package/es/label/line.js +1 -1
  82. package/es/label/polygon.js +1 -1
  83. package/es/label/rect.js +1 -1
  84. package/es/label/register.js +1 -1
  85. package/es/label/symbol.js +1 -1
  86. package/es/label/type.js +1 -1
  87. package/es/legend/base.js +1 -1
  88. package/es/legend/constant.js +1 -1
  89. package/es/legend/discrete/discrete.d.ts +1 -0
  90. package/es/legend/discrete/discrete.js +3 -0
  91. package/es/legend/discrete/discrete.js.map +1 -1
  92. package/es/legend/index.js +1 -1
  93. package/es/legend/register.js +1 -1
  94. package/es/legend/type.js +1 -2
  95. package/es/legend/util.js +1 -1
  96. package/es/tooltip/util.js +1 -1
  97. package/es/tooltip/util.js.map +1 -1
  98. package/es/util/text.d.ts +1 -1
  99. package/es/util/text.js +3 -3
  100. package/es/util/text.js.map +1 -1
  101. package/package.json +8 -8
@@ -4,3 +4,4 @@ export * from './type';
4
4
  export * from './animate';
5
5
  export * from './constant';
6
6
  export * from './util';
7
+ export * from './tick-data';
package/cjs/axis/index.js CHANGED
@@ -19,5 +19,6 @@ Object.defineProperty(exports, "__esModule", {
19
19
  value: !0
20
20
  }), __exportStar(require("./line"), exports), __exportStar(require("./circle"), exports),
21
21
  __exportStar(require("./type"), exports), __exportStar(require("./animate"), exports),
22
- __exportStar(require("./constant"), exports), __exportStar(require("./util"), exports);
22
+ __exportStar(require("./constant"), exports), __exportStar(require("./util"), exports),
23
+ __exportStar(require("./tick-data"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,2CAAyB;AAEzB,yCAAuB;AACvB,4CAA0B;AAC1B,6CAA2B;AAE3B,yCAAuB","file":"index.js","sourcesContent":["export * from './line';\nexport * from './circle';\n\nexport * from './type';\nexport * from './animate';\nexport * from './constant';\n\nexport * from './util';\n"]}
1
+ {"version":3,"sources":["../src/axis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,2CAAyB;AAEzB,yCAAuB;AACvB,4CAA0B;AAC1B,6CAA2B;AAE3B,yCAAuB;AAEvB,8CAA4B","file":"index.js","sourcesContent":["export * from './line';\nexport * from './circle';\n\nexport * from './type';\nexport * from './animate';\nexport * from './constant';\n\nexport * from './util';\n\nexport * from './tick-data';\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ContinuousScale } from '@visactor/vscale';
2
+ import type { ITickData, ITickDataOpt } from '../type';
3
+ export declare const DEFAULT_CONTINUOUS_TICK_COUNT = 5;
4
+ export declare const continuousTicks: (scale: ContinuousScale, op: ITickDataOpt) => ITickData[];
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.continuousTicks = exports.DEFAULT_CONTINUOUS_TICK_COUNT = void 0;
6
+
7
+ const vscale_1 = require("@visactor/vscale"), vutils_1 = require("@visactor/vutils"), util_1 = require("./util");
8
+
9
+ exports.DEFAULT_CONTINUOUS_TICK_COUNT = 5;
10
+
11
+ const continuousTicks = (scale, op) => {
12
+ if (!(0, vscale_1.isContinuous)(scale.type)) return (0, util_1.convertDomainToTickData)(scale.domain());
13
+ const range = scale.range(), rangeSize = Math.abs(range[range.length - 1] - range[0]);
14
+ if (rangeSize < 2) return (0, util_1.convertDomainToTickData)([ scale.domain()[0] ]);
15
+ const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, noDecimals: noDecimals = !1, labelStyle: labelStyle} = op;
16
+ let scaleTicks;
17
+ if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
18
+ vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ("d3" === op.tickMode) {
19
+ const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
20
+ axisLength: rangeSize,
21
+ labelStyle: labelStyle
22
+ }) : tickCount;
23
+ scaleTicks = scale.d3Ticks(null != count ? count : exports.DEFAULT_CONTINUOUS_TICK_COUNT, {
24
+ noDecimals: noDecimals
25
+ });
26
+ } else {
27
+ const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
28
+ axisLength: rangeSize,
29
+ labelStyle: labelStyle
30
+ }) : tickCount;
31
+ scaleTicks = scale.ticks(null != count ? count : exports.DEFAULT_CONTINUOUS_TICK_COUNT, {
32
+ noDecimals: noDecimals
33
+ });
34
+ }
35
+ if (op.sampling && ("cartesian" === op.coordinateType || "polar" === op.coordinateType && "radius" === op.axisOrientType)) {
36
+ const {labelGap: labelGap = 4, labelFlush: labelFlush} = op;
37
+ let items = (0, util_1.getCartesianLabelBounds)(scale, scaleTicks, op).map(((bounds, i) => ({
38
+ AABBBounds: bounds,
39
+ value: scaleTicks[i]
40
+ })));
41
+ for (;items.length >= 3 && (0, util_1.hasOverlap)(items, labelGap); ) items = methods.parity(items);
42
+ const ticks = items.map((item => item.value));
43
+ ticks.length < 3 && labelFlush && (ticks.length > 1 && ticks.pop(), (0, vutils_1.last)(ticks) !== (0,
44
+ vutils_1.last)(scaleTicks) && ticks.push((0, vutils_1.last)(scaleTicks))), scaleTicks = ticks;
45
+ }
46
+ return (0, util_1.convertDomainToTickData)(scaleTicks);
47
+ };
48
+
49
+ exports.continuousTicks = continuousTicks;
50
+
51
+ const methods = {
52
+ parity: function(items) {
53
+ return items.filter(((item, i) => i % 2 == 0));
54
+ },
55
+ greedy: function(items, sep) {
56
+ let a;
57
+ return items.filter(((b, i) => (!i || !(0, util_1.intersect)(a.AABBBounds, b.AABBBounds, sep)) && (a = b,
58
+ !0)));
59
+ }
60
+ };
61
+ //# sourceMappingURL=continuous.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axis/tick-data/continuous.ts"],"names":[],"mappings":"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","file":"continuous.js","sourcesContent":["import type { LinearScale, ContinuousScale } from '@visactor/vscale';\n// eslint-disable-next-line no-duplicate-imports\nimport { isContinuous } from '@visactor/vscale';\nimport { isFunction, isValid, last } from '@visactor/vutils';\nimport type { ICartesianTickDataOpt, ILabelItem, ITickData, ITickDataOpt } from '../type';\n// eslint-disable-next-line no-duplicate-imports\nimport { convertDomainToTickData, getCartesianLabelBounds, hasOverlap, intersect } from './util';\n\n/** 连续轴默认 tick 数量 */\nexport const DEFAULT_CONTINUOUS_TICK_COUNT = 5;\n/**\n * 对于连续轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出LinearScale的ticks()、forceTicks()、stepTicks()结果;\n * - 默认输出tickCount为10的ticks()结果。\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const continuousTicks = (scale: ContinuousScale, op: ITickDataOpt): ITickData[] => {\n if (!isContinuous(scale.type)) {\n return convertDomainToTickData(scale.domain());\n }\n // if range is so small\n const range = scale.range();\n const rangeSize = Math.abs(range[range.length - 1] - range[0]);\n if (rangeSize < 2) {\n return convertDomainToTickData([scale.domain()[0]]);\n }\n\n const { tickCount, forceTickCount, tickStep, noDecimals = false, labelStyle } = op;\n\n let scaleTicks: number[];\n if (isValid(tickStep)) {\n scaleTicks = (scale as LinearScale).stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = (scale as LinearScale).forceTicks(forceTickCount);\n } else if (op.tickMode === 'd3') {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = (scale as LinearScale).d3Ticks(count ?? DEFAULT_CONTINUOUS_TICK_COUNT, { noDecimals });\n } else {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = (scale as LinearScale).ticks(count ?? DEFAULT_CONTINUOUS_TICK_COUNT, { noDecimals });\n }\n\n if (op.sampling) {\n // 判断重叠\n if (op.coordinateType === 'cartesian' || (op.coordinateType === 'polar' && op.axisOrientType === 'radius')) {\n const { labelGap = 4, labelFlush } = op as ICartesianTickDataOpt;\n let items = getCartesianLabelBounds(scale, scaleTicks, op as ICartesianTickDataOpt).map(\n (bounds, i) =>\n ({\n AABBBounds: bounds,\n value: scaleTicks[i]\n } as ILabelItem<number>)\n );\n while (items.length >= 3 && hasOverlap(items, labelGap)) {\n items = methods.parity(items);\n }\n const ticks = items.map(item => item.value);\n\n if (ticks.length < 3 && labelFlush) {\n if (ticks.length > 1) {\n ticks.pop();\n }\n if (last(ticks) !== last(scaleTicks)) {\n ticks.push(last(scaleTicks));\n }\n }\n\n scaleTicks = ticks;\n }\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\nconst methods = {\n parity: function <T>(items: ILabelItem<T>[]) {\n return items.filter((item, i) => i % 2 === 0);\n },\n greedy: function <T>(items: ILabelItem<T>[], sep: number) {\n let a: ILabelItem<T>;\n return items.filter((b, i) => {\n if (!i || !intersect(a.AABBBounds, b.AABBBounds, sep)) {\n a = b;\n return true;\n }\n return false;\n });\n }\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import type { BandScale } from '@visactor/vscale';
2
+ import type { ICartesianTickDataOpt, ITickData } from '../../type';
3
+ type OneDimensionalBounds = [number, number, number];
4
+ export declare const boundsDistance: (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds) => number;
5
+ export declare const linearDiscreteTicks: (scale: BandScale, op: ICartesianTickDataOpt) => ITickData[];
6
+ export {};
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.linearDiscreteTicks = exports.boundsDistance = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), util_1 = require("../util"), getOneDimensionalLabelBounds = (scale, domain, op, isHorizontal) => (0,
8
+ util_1.getCartesianLabelBounds)(scale, domain, op).map((bounds => isHorizontal ? [ bounds.x1, bounds.x2, bounds.width() ] : [ bounds.y1, bounds.y2, bounds.height() ])), boundsOverlap = (prevBounds, nextBounds, gap = 0) => Math.max(prevBounds[0], nextBounds[0]) - gap / 2 <= Math.min(prevBounds[1], nextBounds[1]) + gap / 2, boundsDistance = (prevBounds, nextBounds) => prevBounds[1] < nextBounds[0] ? nextBounds[0] - prevBounds[1] : nextBounds[1] < prevBounds[0] ? prevBounds[0] - nextBounds[1] : 0;
9
+
10
+ exports.boundsDistance = boundsDistance;
11
+
12
+ const linearDiscreteTicks = (scale, op) => {
13
+ var _a;
14
+ const domain = scale.domain();
15
+ if (!domain.length) return [];
16
+ const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, labelGap: labelGap = 4, axisOrientType: axisOrientType, labelStyle: labelStyle} = op, isHorizontal = (0,
17
+ util_1.isAxisHorizontal)(axisOrientType), range = scale.range(), rangeSize = scale.calculateWholeRangeSize();
18
+ if (rangeSize < 2) return op.labelLastVisible ? (0, util_1.convertDomainToTickData)([ domain[domain.length - 1] ]) : (0,
19
+ util_1.convertDomainToTickData)([ domain[0] ]);
20
+ let scaleTicks;
21
+ if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
22
+ vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ((0,
23
+ vutils_1.isValid)(tickCount)) {
24
+ const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
25
+ axisLength: rangeSize,
26
+ labelStyle: labelStyle
27
+ }) : tickCount;
28
+ scaleTicks = scale.ticks(count);
29
+ } else if (op.sampling) {
30
+ const fontSize = (null !== (_a = op.labelStyle.fontSize) && void 0 !== _a ? _a : 12) + 2, rangeStart = (0,
31
+ vutils_1.minInArray)(range), rangeEnd = (0, vutils_1.maxInArray)(range);
32
+ if (domain.length <= rangeSize / fontSize) {
33
+ const incrementUnit = (rangeEnd - rangeStart) / domain.length, labelBoundsList = getOneDimensionalLabelBounds(scale, domain, op, isHorizontal), minBoundsLength = Math.min(...labelBoundsList.map((bounds => bounds[2]))), stepResult = getStep(domain, labelBoundsList, labelGap, op.labelLastVisible, Math.floor(minBoundsLength / incrementUnit), !1);
34
+ scaleTicks = scale.stepTicks(stepResult.step), op.labelLastVisible && (stepResult.delCount && (scaleTicks = scaleTicks.slice(0, scaleTicks.length - stepResult.delCount)),
35
+ scaleTicks.push(domain[domain.length - 1]));
36
+ } else {
37
+ const tempDomain = [ domain[0], domain[Math.floor(domain.length / 2)], domain[domain.length - 1] ], tempList = getOneDimensionalLabelBounds(scale, tempDomain, op, isHorizontal);
38
+ let maxBounds = null;
39
+ tempList.forEach((current => {
40
+ maxBounds ? maxBounds[2] < current[2] && (maxBounds = current) : maxBounds = current;
41
+ }));
42
+ const step = rangeEnd - rangeStart - labelGap > 0 ? Math.ceil(domain.length * (labelGap + maxBounds[2]) / (rangeEnd - rangeStart - labelGap)) : domain.length - 1;
43
+ scaleTicks = scale.stepTicks(step), !op.labelLastVisible || scaleTicks.length && scaleTicks[scaleTicks.length - 1] === domain[domain.length - 1] || (scaleTicks.length && Math.abs(scale.scale(scaleTicks[scaleTicks.length - 1]) - scale.scale(domain[domain.length - 1])) < maxBounds[2] && (scaleTicks = scaleTicks.slice(0, -1)),
44
+ scaleTicks.push(domain[domain.length - 1]));
45
+ }
46
+ } else scaleTicks = scale.domain();
47
+ return (0, util_1.convertDomainToTickData)(scaleTicks);
48
+ };
49
+
50
+ exports.linearDiscreteTicks = linearDiscreteTicks;
51
+
52
+ const getStep = (domain, labelBoundsList, labelGap, labelLastVisible, defaultStep, areAllBoundsSame) => {
53
+ let resultDelCount = 0, resultStep = 0, resultTickCount = -1, minDiff = Number.MAX_VALUE;
54
+ const validateStep = step => {
55
+ let success = !0, ptr = 0;
56
+ do {
57
+ ptr + step < domain.length && boundsOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap) && (success = !1),
58
+ ptr += step;
59
+ } while (success && ptr < domain.length);
60
+ return success;
61
+ }, minValidStep = (0, vutils_1.binaryFuzzySearchInNumberRange)(defaultStep, domain.length, (step => validateStep(step) ? 1 : -1));
62
+ let step = minValidStep;
63
+ do {
64
+ if (step > minValidStep && !areAllBoundsSame && !validateStep(step)) step++; else {
65
+ if (!labelLastVisible) {
66
+ resultStep = step;
67
+ break;
68
+ }
69
+ {
70
+ const lastIndex = domain.length - 1;
71
+ let ptr, delCount = 0;
72
+ ptr = domain.length % step > 0 ? domain.length - domain.length % step + step : domain.length;
73
+ do {
74
+ if (ptr -= step, ptr !== lastIndex && !boundsOverlap(labelBoundsList[ptr], labelBoundsList[lastIndex], labelGap)) break;
75
+ delCount++;
76
+ } while (ptr > 0);
77
+ if (ptr === lastIndex) {
78
+ resultStep = step, resultDelCount = delCount;
79
+ break;
80
+ }
81
+ {
82
+ const tickCount = Math.floor(domain.length / step) - delCount + 1;
83
+ if (tickCount < resultTickCount) break;
84
+ {
85
+ resultTickCount = tickCount;
86
+ const distance1 = (0, exports.boundsDistance)(labelBoundsList[ptr], labelBoundsList[lastIndex]), distance2 = ptr - step >= 0 ? (0,
87
+ exports.boundsDistance)(labelBoundsList[ptr - step], labelBoundsList[ptr]) : distance1, diff = Math.abs(distance1 - distance2);
88
+ if (diff < minDiff && (minDiff = diff, resultStep = step, resultDelCount = delCount),
89
+ distance1 <= distance2) break;
90
+ }
91
+ }
92
+ }
93
+ step++;
94
+ }
95
+ } while (step <= domain.length);
96
+ return {
97
+ step: resultStep,
98
+ delCount: resultDelCount
99
+ };
100
+ };
101
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axis/tick-data/discrete/linear.ts"],"names":[],"mappings":"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","file":"linear.js","sourcesContent":["import type { BandScale, IBaseScale } from '@visactor/vscale';\nimport { isFunction, isValid, maxInArray, minInArray, binaryFuzzySearchInNumberRange } from '@visactor/vutils';\nimport type { ICartesianTickDataOpt, ITickData } from '../../type';\nimport { convertDomainToTickData, getCartesianLabelBounds, isAxisHorizontal } from '../util';\n\n/** x1, x2, length */\ntype OneDimensionalBounds = [number, number, number];\n\nconst getOneDimensionalLabelBounds = (\n scale: IBaseScale,\n domain: any[],\n op: ICartesianTickDataOpt,\n isHorizontal: boolean\n): OneDimensionalBounds[] => {\n const labelBoundsList = getCartesianLabelBounds(scale, domain, op);\n return labelBoundsList.map(bounds => {\n if (isHorizontal) {\n return [bounds.x1, bounds.x2, bounds.width()];\n }\n return [bounds.y1, bounds.y2, bounds.height()];\n });\n};\n\n/** 判断两个 bounds 是否有重叠情况 */\nconst boundsOverlap = (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds, gap = 0): boolean => {\n return Math.max(prevBounds[0], nextBounds[0]) - gap / 2 <= Math.min(prevBounds[1], nextBounds[1]) + gap / 2;\n};\n\n/** 判断两个不相交的 bounds 相隔的距离 */\nexport const boundsDistance = (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds): number => {\n if (prevBounds[1] < nextBounds[0]) {\n return nextBounds[0] - prevBounds[1];\n } else if (nextBounds[1] < prevBounds[0]) {\n return prevBounds[0] - nextBounds[1];\n }\n return 0;\n};\n\n/**\n * 对于离散轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出BandScale的ticks()、forceTicks()、stepTicks()结果;\n * - 估算所有轴label的宽度(或高度,在竖轴的情况下)并存为数组domainLengthList;\n * - 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡(此处用到domainLengthList和scale.range());\n * - 如果用户配置了spec.label.lastVisible,则处理右边界:强制采样最后一个tick数据,并删掉这个tick的label所覆盖的那些tick数据。\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const linearDiscreteTicks = (scale: BandScale, op: ICartesianTickDataOpt): ITickData[] => {\n const domain = scale.domain();\n if (!domain.length) {\n return [];\n }\n const { tickCount, forceTickCount, tickStep, labelGap = 4, axisOrientType, labelStyle } = op;\n const isHorizontal = isAxisHorizontal(axisOrientType);\n const range = scale.range();\n\n // if range is so small\n const rangeSize = scale.calculateWholeRangeSize();\n if (rangeSize < 2) {\n if (op.labelLastVisible) {\n return convertDomainToTickData([domain[domain.length - 1]]);\n }\n return convertDomainToTickData([domain[0]]);\n }\n\n let scaleTicks;\n if (isValid(tickStep)) {\n scaleTicks = scale.stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = scale.forceTicks(forceTickCount);\n } else if (isValid(tickCount)) {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = scale.ticks(count);\n } else if (op.sampling) {\n const fontSize = (op.labelStyle.fontSize ?? 12) + 2;\n const rangeStart = minInArray(range);\n const rangeEnd = maxInArray(range);\n\n if (domain.length <= rangeSize / fontSize) {\n const incrementUnit = (rangeEnd - rangeStart) / domain.length;\n const labelBoundsList = getOneDimensionalLabelBounds(scale, domain, op, isHorizontal);\n const minBoundsLength = Math.min(...labelBoundsList.map(bounds => bounds[2]));\n\n const stepResult = getStep(\n domain,\n labelBoundsList,\n labelGap,\n op.labelLastVisible,\n Math.floor(minBoundsLength / incrementUnit), // 给step赋上合适的初值,有效改善外层循环次数\n false\n );\n\n scaleTicks = (scale as BandScale).stepTicks(stepResult.step);\n if (op.labelLastVisible) {\n if (stepResult.delCount) {\n scaleTicks = scaleTicks.slice(0, scaleTicks.length - stepResult.delCount);\n }\n scaleTicks.push(domain[domain.length - 1]);\n }\n } else {\n // only check first middle last, use the max size to sampling\n const tempDomain = [domain[0], domain[Math.floor(domain.length / 2)], domain[domain.length - 1]];\n const tempList = getOneDimensionalLabelBounds(scale, tempDomain, op, isHorizontal);\n let maxBounds: OneDimensionalBounds = null;\n tempList.forEach(current => {\n if (!maxBounds) {\n maxBounds = current;\n return;\n }\n if (maxBounds[2] < current[2]) {\n maxBounds = current;\n }\n });\n\n const step =\n rangeEnd - rangeStart - labelGap > 0\n ? Math.ceil((domain.length * (labelGap + maxBounds[2])) / (rangeEnd - rangeStart - labelGap))\n : domain.length - 1;\n\n scaleTicks = (scale as BandScale).stepTicks(step);\n\n if (\n op.labelLastVisible &&\n (!scaleTicks.length || scaleTicks[scaleTicks.length - 1] !== domain[domain.length - 1])\n ) {\n if (\n scaleTicks.length &&\n Math.abs(scale.scale(scaleTicks[scaleTicks.length - 1]) - scale.scale(domain[domain.length - 1])) <\n maxBounds[2]\n ) {\n scaleTicks = scaleTicks.slice(0, -1);\n }\n scaleTicks.push(domain[domain.length - 1]);\n }\n }\n } else {\n scaleTicks = scale.domain();\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\n/** 计算合适的step */\nconst getStep = (\n domain: any[],\n labelBoundsList: OneDimensionalBounds[],\n labelGap: number,\n labelLastVisible: boolean,\n defaultStep: number,\n areAllBoundsSame: boolean\n) => {\n let resultDelCount = 0;\n let resultStep = 0;\n let resultTickCount = -1;\n let minDiff = Number.MAX_VALUE;\n\n /** 验证在当前 step 下是否会产生重叠 */\n const validateStep = (step: number) => {\n let success = true;\n let ptr = 0;\n do {\n if (ptr + step < domain.length && boundsOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap)) {\n success = false;\n }\n ptr += step;\n } while (success && ptr < domain.length);\n return success;\n };\n\n // 通过二分来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡\n const minValidStep = binaryFuzzySearchInNumberRange(defaultStep, domain.length, step =>\n validateStep(step) ? 1 : -1\n );\n\n // 对 step 进行微调\n let step = minValidStep;\n do {\n if (step > minValidStep && !areAllBoundsSame) {\n if (!validateStep(step)) {\n step++;\n continue;\n }\n }\n if (labelLastVisible) {\n const lastIndex = domain.length - 1;\n let delCount = 0;\n let ptr;\n if (domain.length % step > 0) {\n ptr = domain.length - (domain.length % step) + step;\n } else {\n ptr = domain.length;\n }\n do {\n ptr -= step; // 获取最后一个label位置\n if (ptr === lastIndex || boundsOverlap(labelBoundsList[ptr], labelBoundsList[lastIndex], labelGap)) {\n delCount++;\n } else {\n break;\n }\n } while (ptr > 0);\n if (ptr === lastIndex) {\n // 采到的最后的一个 label 刚好是最后一项,直接退出\n resultStep = step;\n resultDelCount = delCount;\n break;\n } else {\n // 尝试获取最均匀的结果,防止倒数第二项和最后一项有大的空档\n const tickCount = Math.floor(domain.length / step) - delCount + 1;\n if (tickCount < resultTickCount) {\n break;\n } else {\n resultTickCount = tickCount;\n const distance1 = boundsDistance(labelBoundsList[ptr], labelBoundsList[lastIndex]); // 倒数第2项和最后一项的距离\n const distance2 =\n ptr - step >= 0 ? boundsDistance(labelBoundsList[ptr - step], labelBoundsList[ptr]) : distance1; // 倒数第3项和倒数第2项的距离\n const diff = Math.abs(distance1 - distance2);\n if (diff < minDiff) {\n minDiff = diff;\n resultStep = step; // 记录最均匀的 step\n resultDelCount = delCount;\n }\n if (distance1 <= distance2) {\n break;\n }\n }\n }\n } else {\n resultStep = step;\n break;\n }\n step++;\n } while (step <= domain.length);\n\n return {\n step: resultStep,\n delCount: resultDelCount\n };\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { BandScale } from '@visactor/vscale';
2
+ import type { IPolarTickDataOpt, ITickData } from '../../type';
3
+ export declare const polarAngleAxisDiscreteTicks: (scale: BandScale, op: IPolarTickDataOpt) => ITickData[];
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.polarAngleAxisDiscreteTicks = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), util_1 = require("../util"), polarAngleAxisDiscreteTicks = (scale, op) => {
8
+ const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, getRadius: getRadius, labelOffset: labelOffset, labelGap: labelGap = 0, labelStyle: labelStyle} = op, radius = null == getRadius ? void 0 : getRadius();
9
+ if (!radius) return (0, util_1.convertDomainToTickData)(scale.domain());
10
+ let scaleTicks;
11
+ if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
12
+ vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ((0,
13
+ vutils_1.isValid)(tickCount)) {
14
+ const range = scale.range(), rangeSize = Math.abs(range[range.length - 1] - range[0]), count = (0,
15
+ vutils_1.isFunction)(tickCount) ? tickCount({
16
+ axisLength: rangeSize,
17
+ labelStyle: labelStyle
18
+ }) : tickCount;
19
+ scaleTicks = scale.ticks(count);
20
+ } else if (op.sampling) {
21
+ const domain = scale.domain(), range = scale.range(), labelBoundsList = (0, util_1.getPolarAngleLabelBounds)(scale, domain, op), rangeStart = (0,
22
+ vutils_1.minInArray)(range), rangeEnd = (0, vutils_1.maxInArray)(range), incrementUnit = Math.abs(rangeEnd - rangeStart) * (radius + labelOffset) / domain.length, {step: step, delCount: delCount} = getStep(domain, labelBoundsList, labelGap, Math.floor(labelBoundsList.reduce(((min, curBounds) => Math.min(min, curBounds.width(), curBounds.height())), Number.MAX_VALUE) / incrementUnit));
23
+ scaleTicks = scale.stepTicks(step), scaleTicks = scaleTicks.slice(0, scaleTicks.length - delCount);
24
+ } else scaleTicks = scale.domain();
25
+ return (0, util_1.convertDomainToTickData)(scaleTicks);
26
+ };
27
+
28
+ exports.polarAngleAxisDiscreteTicks = polarAngleAxisDiscreteTicks;
29
+
30
+ const getStep = (domain, labelBoundsList, labelGap, defaultStep) => {
31
+ let step = defaultStep;
32
+ do {
33
+ let success = !0;
34
+ step++;
35
+ let ptr = 0;
36
+ do {
37
+ ptr + step < domain.length && (0, util_1.labelOverlap)(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap) && (success = !1),
38
+ ptr += step;
39
+ } while (success && ptr < domain.length);
40
+ if (success) break;
41
+ } while (step <= domain.length);
42
+ let delCount = 0;
43
+ if (domain.length > 2) {
44
+ let ptr = domain.length - domain.length % step;
45
+ for (ptr >= domain.length && (ptr -= step); ptr > 0 && (0, util_1.labelOverlap)(labelBoundsList[0], labelBoundsList[ptr]); ) delCount++,
46
+ ptr -= step;
47
+ }
48
+ return {
49
+ step: step,
50
+ delCount: delCount
51
+ };
52
+ };
53
+ //# sourceMappingURL=polar-angle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axis/tick-data/discrete/polar-angle.ts"],"names":[],"mappings":"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","file":"polar-angle.js","sourcesContent":["import type { BandScale } from '@visactor/vscale';\nimport { isFunction, isValid, maxInArray, minInArray } from '@visactor/vutils';\nimport type { IPolarTickDataOpt, ITickData } from '../../type';\nimport { convertDomainToTickData, getPolarAngleLabelBounds, labelOverlap } from '../util';\nimport type { AABBBounds } from '@visactor/vutils';\n\n/**\n * 对于离散轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出BandScale的ticks()、forceTicks()、stepTicks()结果;\n * - 估算所有轴label的宽高并存为数组labelBoundsList;\n * - 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡(此处用到labelBoundsList和scale.range());\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const polarAngleAxisDiscreteTicks = (scale: BandScale, op: IPolarTickDataOpt): ITickData[] => {\n const { tickCount, forceTickCount, tickStep, getRadius, labelOffset, labelGap = 0, labelStyle } = op;\n const radius = getRadius?.();\n if (!radius) {\n return convertDomainToTickData(scale.domain());\n }\n\n let scaleTicks;\n if (isValid(tickStep)) {\n scaleTicks = scale.stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = scale.forceTicks(forceTickCount);\n } else if (isValid(tickCount)) {\n const range = scale.range();\n const rangeSize = Math.abs(range[range.length - 1] - range[0]);\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = scale.ticks(count);\n } else if (op.sampling) {\n const domain = scale.domain();\n const range = scale.range();\n\n const labelBoundsList = getPolarAngleLabelBounds(scale, domain, op);\n\n const rangeStart = minInArray(range);\n const rangeEnd = maxInArray(range);\n\n const axisLength = Math.abs(rangeEnd - rangeStart) * (radius + labelOffset);\n const incrementUnit = axisLength / domain.length;\n const { step, delCount } = getStep(\n domain,\n labelBoundsList,\n labelGap,\n Math.floor(\n labelBoundsList.reduce((min, curBounds) => {\n return Math.min(min, curBounds.width(), curBounds.height());\n }, Number.MAX_VALUE) / incrementUnit\n ) // 给step赋上合适的初值,有效改善外层循环次数\n );\n\n scaleTicks = (scale as BandScale).stepTicks(step);\n scaleTicks = scaleTicks.slice(0, scaleTicks.length - delCount);\n } else {\n scaleTicks = scale.domain();\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\n/** 计算合适的step */\nconst getStep = (domain: any[], labelBoundsList: AABBBounds[], labelGap: number, defaultStep: number) => {\n let step = defaultStep;\n // 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡\n do {\n let success = true;\n step++;\n let ptr = 0;\n do {\n if (ptr + step < domain.length && labelOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap)) {\n success = false;\n }\n ptr += step;\n } while (success && ptr < domain.length);\n if (success) {\n break;\n }\n } while (step <= domain.length);\n\n let delCount = 0;\n if (domain.length > 2) {\n let ptr = domain.length - (domain.length % step);\n if (ptr >= domain.length) {\n ptr -= step;\n }\n // 判断首尾是否互相覆盖\n while (ptr > 0 && labelOverlap(labelBoundsList[0], labelBoundsList[ptr])) {\n delCount++;\n ptr -= step;\n }\n }\n\n return {\n step,\n delCount\n };\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { IBaseScale } from '@visactor/vscale';
2
+ import type { ITickData, ITickDataOpt } from '../type';
3
+ import { convertDomainToTickData } from './util';
4
+ export { convertDomainToTickData };
5
+ export declare const ticks: (scale: IBaseScale, op: ITickDataOpt) => ITickData[];
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.ticks = exports.convertDomainToTickData = void 0;
6
+
7
+ const vscale_1 = require("@visactor/vscale"), continuous_1 = require("./continuous"), linear_1 = require("./discrete/linear"), polar_angle_1 = require("./discrete/polar-angle"), util_1 = require("./util");
8
+
9
+ Object.defineProperty(exports, "convertDomainToTickData", {
10
+ enumerable: !0,
11
+ get: function() {
12
+ return util_1.convertDomainToTickData;
13
+ }
14
+ });
15
+
16
+ const ticks = (scale, op) => {
17
+ if ((0, vscale_1.isContinuous)(scale.type)) return (0, continuous_1.continuousTicks)(scale, op);
18
+ if ((0, vscale_1.isDiscrete)(scale.type)) {
19
+ if ("cartesian" === op.coordinateType) return (0, linear_1.linearDiscreteTicks)(scale, op);
20
+ if ("polar" === op.coordinateType && "angle" === op.axisOrientType) return (0, polar_angle_1.polarAngleAxisDiscreteTicks)(scale, op);
21
+ }
22
+ return (0, util_1.convertDomainToTickData)(scale.domain());
23
+ };
24
+
25
+ exports.ticks = ticks;
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axis/tick-data/index.ts"],"names":[],"mappings":";;;AAEA,6CAA4D;AAC5D,6CAA+C;AAC/C,8CAAwD;AACxD,wDAAqE;AAErE,iCAAiD;AAExC,wGAFA,8BAAuB,OAEA;AAGzB,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAE,EAAgB,EAAe,EAAE;IACxE,IAAI,IAAA,qBAAY,EAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QAC5B,OAAO,IAAA,4BAAe,EAAC,KAAwB,EAAE,EAAE,CAAC,CAAC;KACtD;SAAM,IAAI,IAAA,mBAAU,EAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACjC,IAAI,EAAE,CAAC,cAAc,KAAK,WAAW,EAAE;YACrC,OAAO,IAAA,4BAAmB,EAAC,KAAkB,EAAE,EAA2B,CAAC,CAAC;SAC7E;aAAM,IAAI,EAAE,CAAC,cAAc,KAAK,OAAO,EAAE;YACxC,IAAI,EAAE,CAAC,cAAc,KAAK,OAAO,EAAE;gBACjC,OAAO,IAAA,yCAA2B,EAAC,KAAkB,EAAE,EAAuB,CAAC,CAAC;aACjF;SACF;KACF;IACD,OAAO,IAAA,8BAAuB,EAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AAbW,QAAA,KAAK,SAahB","file":"index.js","sourcesContent":["import type { BandScale, ContinuousScale, IBaseScale } from '@visactor/vscale';\n// eslint-disable-next-line no-duplicate-imports\nimport { isContinuous, isDiscrete } from '@visactor/vscale';\nimport { continuousTicks } from './continuous';\nimport { linearDiscreteTicks } from './discrete/linear';\nimport { polarAngleAxisDiscreteTicks } from './discrete/polar-angle';\nimport type { ICartesianTickDataOpt, IPolarTickDataOpt, ITickData, ITickDataOpt } from '../type';\nimport { convertDomainToTickData } from './util';\n\nexport { convertDomainToTickData };\n\n// 总入口\nexport const ticks = (scale: IBaseScale, op: ITickDataOpt): ITickData[] => {\n if (isContinuous(scale.type)) {\n return continuousTicks(scale as ContinuousScale, op);\n } else if (isDiscrete(scale.type)) {\n if (op.coordinateType === 'cartesian') {\n return linearDiscreteTicks(scale as BandScale, op as ICartesianTickDataOpt);\n } else if (op.coordinateType === 'polar') {\n if (op.axisOrientType === 'angle') {\n return polarAngleAxisDiscreteTicks(scale as BandScale, op as IPolarTickDataOpt);\n }\n }\n }\n return convertDomainToTickData(scale.domain());\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import type { IBaseScale } from '@visactor/vscale';
2
+ import type { IBoundsLike } from '@visactor/vutils';
3
+ import { AABBBounds } from '@visactor/vutils';
4
+ import type { ICartesianTickDataOpt, ILabelItem, IOrientType, IPolarTickDataOpt, ITickData } from '../type';
5
+ export declare const convertDomainToTickData: (domain: any[]) => ITickData[];
6
+ export declare const labelOverlap: (prevLabel: AABBBounds, nextLabel: AABBBounds, gap?: number) => boolean;
7
+ export declare const labelDistance: (prevLabel: AABBBounds, nextLabel: AABBBounds) => [number, number];
8
+ export declare function intersect(a: IBoundsLike, b: IBoundsLike, sep: number): boolean;
9
+ export declare function hasOverlap<T>(items: ILabelItem<T>[], pad: number): boolean;
10
+ export declare const MIN_TICK_GAP = 12;
11
+ export declare const getCartesianLabelBounds: (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt) => AABBBounds[];
12
+ export declare const getPolarAngleLabelBounds: (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt) => AABBBounds[];
13
+ export declare const isAxisHorizontal: (axisOrientType: IOrientType) => boolean;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.isAxisHorizontal = exports.getPolarAngleLabelBounds = exports.getCartesianLabelBounds = exports.MIN_TICK_GAP = exports.hasOverlap = exports.intersect = exports.labelDistance = exports.labelOverlap = exports.convertDomainToTickData = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), text_1 = require("../../util/text"), util_1 = require("../util"), convertDomainToTickData = domain => domain.map(((t, index) => ({
8
+ index: index,
9
+ value: t
10
+ })));
11
+
12
+ exports.convertDomainToTickData = convertDomainToTickData;
13
+
14
+ const labelOverlap = (prevLabel, nextLabel, gap = 0) => {
15
+ const prevBounds = new vutils_1.AABBBounds(prevLabel).expand(gap / 2), nextBounds = new vutils_1.AABBBounds(nextLabel).expand(gap / 2);
16
+ return prevBounds.intersects(nextBounds);
17
+ };
18
+
19
+ exports.labelOverlap = labelOverlap;
20
+
21
+ const labelDistance = (prevLabel, nextLabel) => {
22
+ let horizontal = 0;
23
+ prevLabel.x2 < nextLabel.x1 ? horizontal = nextLabel.x1 - prevLabel.x2 : nextLabel.x2 < prevLabel.x1 && (horizontal = prevLabel.x1 - nextLabel.x2);
24
+ let vertical = 0;
25
+ return prevLabel.y2 < nextLabel.y1 ? vertical = nextLabel.y1 - prevLabel.y2 : nextLabel.y2 < prevLabel.y1 && (vertical = prevLabel.y1 - nextLabel.y2),
26
+ [ horizontal, vertical ];
27
+ };
28
+
29
+ function intersect(a, b, sep) {
30
+ return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);
31
+ }
32
+
33
+ function hasOverlap(items, pad) {
34
+ for (let b, i = 1, n = items.length, a = items[0]; i < n; a = b, ++i) if (b = items[i],
35
+ intersect(a.AABBBounds, b.AABBBounds, pad)) return !0;
36
+ return !1;
37
+ }
38
+
39
+ exports.labelDistance = labelDistance, exports.intersect = intersect, exports.hasOverlap = hasOverlap,
40
+ exports.MIN_TICK_GAP = 12;
41
+
42
+ const calculateFlushPos = (basePosition, size, rangePosition, otherEnd) => rangePosition < basePosition ? Math.max(basePosition - size / 2, rangePosition) : rangePosition > basePosition ? Math.min(basePosition - size / 2, rangePosition - size) : rangePosition < otherEnd ? rangePosition : rangePosition - size, getCartesianLabelBounds = (scale, domain, op) => {
43
+ var _a;
44
+ const {labelStyle: labelStyle, axisOrientType: axisOrientType, labelFlush: labelFlush, labelFormatter: labelFormatter, startAngle: startAngle = 0} = op;
45
+ let labelAngle = null !== (_a = labelStyle.angle) && void 0 !== _a ? _a : 0;
46
+ "vertical" === labelStyle.direction && (labelAngle += (0, vutils_1.degreeToRadian)(90));
47
+ const isHorizontal = [ "bottom", "top" ].includes(axisOrientType), isVertical = [ "left", "right" ].includes(axisOrientType);
48
+ let scaleX = 1, scaleY = 0;
49
+ isHorizontal || (isVertical ? (scaleX = 0, scaleY = 1) : startAngle && (scaleX = Math.cos(startAngle),
50
+ scaleY = -Math.sin(startAngle)));
51
+ const textMeasure = (0, text_1.initTextMeasure)(labelStyle), range = scale.range(), labelBoundsList = domain.map(((v, i) => {
52
+ var _a, _b;
53
+ const str = labelFormatter ? labelFormatter(v) : `${v}`, {width: width, height: height} = textMeasure.quickMeasure(str), textWidth = Math.max(width, exports.MIN_TICK_GAP), textHeight = Math.max(height, exports.MIN_TICK_GAP), pos = scale.scale(v), baseTextX = scaleX * pos, baseTextY = scaleY * pos;
54
+ let align, baseline, textX = baseTextX, textY = baseTextY;
55
+ labelFlush && isHorizontal && 0 === i ? textX = calculateFlushPos(baseTextX, textWidth, range[0], range[range.length - 1]) : labelFlush && isHorizontal && i === domain.length - 1 ? textX = calculateFlushPos(baseTextX, textWidth, range[range.length - 1], range[0]) : align = null !== (_a = labelStyle.textAlign) && void 0 !== _a ? _a : "center",
56
+ "right" === align ? textX -= textWidth : "center" === align && (textX -= textWidth / 2),
57
+ labelFlush && isVertical && 0 === i ? textY = calculateFlushPos(baseTextY, textHeight, range[0], range[range.length - 1]) : labelFlush && isVertical && i === domain.length - 1 ? textY = calculateFlushPos(baseTextY, textHeight, range[range.length - 1], range[0]) : baseline = null !== (_b = labelStyle.textBaseline) && void 0 !== _b ? _b : "middle",
58
+ "bottom" === baseline ? textY -= textHeight : "middle" === baseline && (textY -= textHeight / 2);
59
+ const bounds = (new vutils_1.AABBBounds).set(textX, textY, textX + textWidth, textY + textHeight);
60
+ return labelAngle && bounds.rotate(labelAngle, baseTextX, baseTextY), bounds;
61
+ }));
62
+ return labelBoundsList;
63
+ };
64
+
65
+ exports.getCartesianLabelBounds = getCartesianLabelBounds;
66
+
67
+ const getPolarAngleLabelBounds = (scale, domain, op) => {
68
+ var _a;
69
+ const {labelStyle: labelStyle, getRadius: getRadius, labelOffset: labelOffset, labelFormatter: labelFormatter, inside: inside} = op, radius = null == getRadius ? void 0 : getRadius(), labelAngle = null !== (_a = labelStyle.angle) && void 0 !== _a ? _a : 0, textMeasure = (0,
70
+ text_1.initTextMeasure)(labelStyle), labelBoundsList = domain.map((v => {
71
+ var _a, _b;
72
+ const str = labelFormatter ? labelFormatter(v) : `${v}`, {width: width, height: height} = textMeasure.quickMeasure(str), textWidth = Math.max(width, exports.MIN_TICK_GAP), textHeight = Math.max(height, exports.MIN_TICK_GAP), angle = scale.scale(v);
73
+ let textX = 0, textY = 0;
74
+ const orient_align = null !== (_a = labelStyle.textAlign) && void 0 !== _a ? _a : "center", orient_baseline = null !== (_b = labelStyle.textBaseline) && void 0 !== _b ? _b : "middle", {x: x, y: y} = (0,
75
+ util_1.getPolarAngleLabelPosition)(angle, {
76
+ x: 0,
77
+ y: 0
78
+ }, radius, labelOffset, inside, str, labelStyle);
79
+ textX = x + ("right" === orient_align ? -textWidth : "center" === orient_align ? -textWidth / 2 : 0),
80
+ textY = y + ("bottom" === orient_baseline ? -textHeight : "middle" === orient_baseline ? -textHeight / 2 : 0);
81
+ return (new vutils_1.AABBBounds).set(textX, textY, textX + textWidth, textY + textHeight).rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);
82
+ }));
83
+ return labelBoundsList;
84
+ };
85
+
86
+ exports.getPolarAngleLabelBounds = getPolarAngleLabelBounds;
87
+
88
+ const isAxisHorizontal = axisOrientType => [ "bottom", "top", "z" ].includes(axisOrientType);
89
+
90
+ exports.isAxisHorizontal = isAxisHorizontal;
91
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/axis/tick-data/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["import type { IBaseScale } from '@visactor/vscale';\nimport type { IBoundsLike } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { AABBBounds, degreeToRadian } from '@visactor/vutils';\nimport type { TextAlignType, TextBaselineType } from '@visactor/vrender-core';\nimport { initTextMeasure } from '../../util/text';\nimport type { ICartesianTickDataOpt, ILabelItem, IOrientType, IPolarTickDataOpt, ITickData } from '../type';\nimport { getPolarAngleLabelPosition } from '../util';\n\nexport const convertDomainToTickData = (domain: any[]): ITickData[] => {\n const ticks = domain.map((t: number, index: number) => {\n return {\n index,\n value: t\n };\n });\n return ticks;\n};\n\n/** 判断两个label是否有重叠情况 */\nexport const labelOverlap = (prevLabel: AABBBounds, nextLabel: AABBBounds, gap = 0): boolean => {\n const prevBounds = new AABBBounds(prevLabel).expand(gap / 2);\n const nextBounds = new AABBBounds(nextLabel).expand(gap / 2);\n return prevBounds.intersects(nextBounds);\n};\n\n/** 判断两个不相交的label相隔的距离 */\nexport const labelDistance = (prevLabel: AABBBounds, nextLabel: AABBBounds): [number, number] => {\n let horizontal = 0;\n if (prevLabel.x2 < nextLabel.x1) {\n horizontal = nextLabel.x1 - prevLabel.x2;\n } else if (nextLabel.x2 < prevLabel.x1) {\n horizontal = prevLabel.x1 - nextLabel.x2;\n }\n\n let vertical = 0;\n if (prevLabel.y2 < nextLabel.y1) {\n vertical = nextLabel.y1 - prevLabel.y2;\n } else if (nextLabel.y2 < prevLabel.y1) {\n vertical = prevLabel.y1 - nextLabel.y2;\n }\n\n return [horizontal, vertical];\n};\n\nexport function intersect(a: IBoundsLike, b: IBoundsLike, sep: number) {\n return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\n}\n\nexport function hasOverlap<T>(items: ILabelItem<T>[], pad: number): boolean {\n for (let i = 1, n = items.length, a = items[0], b; i < n; a = b, ++i) {\n b = items[i];\n if (intersect(a.AABBBounds, b.AABBBounds, pad)) {\n return true;\n }\n }\n return false;\n}\n\nexport const MIN_TICK_GAP = 12;\n\nconst calculateFlushPos = (basePosition: number, size: number, rangePosition: number, otherEnd: number) => {\n return rangePosition < basePosition\n ? Math.max(basePosition - size / 2, rangePosition)\n : rangePosition > basePosition\n ? Math.min(basePosition - size / 2, rangePosition - size)\n : rangePosition < otherEnd\n ? rangePosition\n : rangePosition - size;\n};\n\nexport const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt): AABBBounds[] => {\n const { labelStyle, axisOrientType, labelFlush, labelFormatter, startAngle = 0 } = op;\n let labelAngle = labelStyle.angle ?? 0;\n if (labelStyle.direction === 'vertical') {\n labelAngle += degreeToRadian(90);\n }\n const isHorizontal = ['bottom', 'top'].includes(axisOrientType);\n const isVertical = ['left', 'right'].includes(axisOrientType);\n let scaleX = 1;\n let scaleY = 0;\n if (isHorizontal) {\n // nothing to update\n } else if (isVertical) {\n scaleX = 0;\n scaleY = 1;\n } else if (startAngle) {\n scaleX = Math.cos(startAngle);\n scaleY = -Math.sin(startAngle);\n }\n\n const textMeasure = initTextMeasure(labelStyle);\n const range = scale.range();\n const labelBoundsList = domain.map((v: any, i: number) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const pos = scale.scale(v);\n const baseTextX = scaleX * pos;\n const baseTextY = scaleY * pos;\n let textX = baseTextX;\n let textY = baseTextY;\n\n let align: TextAlignType;\n if (labelFlush && isHorizontal && i === 0) {\n textX = calculateFlushPos(baseTextX, textWidth, range[0], range[range.length - 1]);\n } else if (labelFlush && isHorizontal && i === domain.length - 1) {\n textX = calculateFlushPos(baseTextX, textWidth, range[range.length - 1], range[0]);\n } else {\n align = labelStyle.textAlign ?? 'center';\n }\n if (align === 'right') {\n textX -= textWidth;\n } else if (align === 'center') {\n textX -= textWidth / 2;\n }\n\n let baseline: TextBaselineType;\n if (labelFlush && isVertical && i === 0) {\n textY = calculateFlushPos(baseTextY, textHeight, range[0], range[range.length - 1]);\n } else if (labelFlush && isVertical && i === domain.length - 1) {\n textY = calculateFlushPos(baseTextY, textHeight, range[range.length - 1], range[0]);\n } else {\n baseline = labelStyle.textBaseline ?? 'middle';\n }\n if (baseline === 'bottom') {\n textY -= textHeight;\n } else if (baseline === 'middle') {\n textY -= textHeight / 2;\n }\n\n // 计算 label 包围盒\n const bounds = new AABBBounds().set(textX, textY, textX + textWidth, textY + textHeight);\n\n if (labelAngle) {\n bounds.rotate(labelAngle, baseTextX, baseTextY);\n }\n\n return bounds;\n });\n\n return labelBoundsList;\n};\n\nexport const getPolarAngleLabelBounds = (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt): AABBBounds[] => {\n const { labelStyle, getRadius, labelOffset, labelFormatter, inside } = op;\n const radius = getRadius?.();\n const labelAngle = labelStyle.angle ?? 0;\n\n const textMeasure = initTextMeasure(labelStyle);\n const labelBoundsList = domain.map((v: any) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const angle = scale.scale(v);\n let textX = 0;\n let textY = 0;\n const orient = {\n align: labelStyle.textAlign ?? 'center',\n baseline: labelStyle.textBaseline ?? 'middle'\n };\n\n const { x, y } = getPolarAngleLabelPosition(angle, { x: 0, y: 0 }, radius, labelOffset, inside, str, labelStyle);\n textX = x + (orient.align === 'right' ? -textWidth : orient.align === 'center' ? -textWidth / 2 : 0);\n textY = y + (orient.baseline === 'bottom' ? -textHeight : orient.baseline === 'middle' ? -textHeight / 2 : 0);\n\n // 计算 label 包围盒\n const bounds = new AABBBounds()\n .set(textX, textY, textX + textWidth, textY + textHeight)\n .rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);\n return bounds;\n });\n\n return labelBoundsList;\n};\n\nexport const isAxisHorizontal = (axisOrientType: IOrientType) => {\n return (['bottom', 'top', 'z'] as IOrientType[]).includes(axisOrientType);\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { IGraphicAttribute, ILineGraphicAttribute, SymbolType, ITextGraphicAttribute, ISymbolGraphicAttribute, IRectGraphicAttribute, IGroupGraphicAttribute, IText, IGroup } from '@visactor/vrender-core';
1
+ import type { IGraphicAttribute, ILineGraphicAttribute, SymbolType, ITextGraphicAttribute, ISymbolGraphicAttribute, IRectGraphicAttribute, IGroupGraphicAttribute, IText, IGroup, IGraphic } from '@visactor/vrender-core';
2
2
  import type { Dict } from '@visactor/vutils';
3
3
  import type { Point, TextContent } from '../core/type';
4
4
  import type { SegmentAttributes } from '../segment';
@@ -135,3 +135,43 @@ export type LabelAttributes = Omit<AxisLabelOverlap, 'text'> & TextContent & {
135
135
  state?: AxisItemStateStyle<Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>>;
136
136
  dataFilter?: (data: AxisItem[], layer: number) => AxisItem[];
137
137
  };
138
+ export type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';
139
+ export type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';
140
+ export type IPolarOrientType = 'radius' | 'angle';
141
+ export interface ITickDataOpt {
142
+ sampling?: boolean;
143
+ tickCount?: number | ((option: ITickCallbackOption) => number);
144
+ forceTickCount?: number;
145
+ tickStep?: number;
146
+ tickMode?: 'average' | 'd3' | string;
147
+ noDecimals?: boolean;
148
+ coordinateType: CoordinateType;
149
+ axisOrientType: IOrientType | IPolarOrientType;
150
+ startAngle?: number;
151
+ labelFormatter?: (value: any) => string;
152
+ labelStyle: ITextGraphicAttribute;
153
+ labelGap?: number;
154
+ }
155
+ export interface ICartesianTickDataOpt extends ITickDataOpt {
156
+ axisOrientType: IOrientType;
157
+ labelLastVisible: boolean;
158
+ labelFlush: boolean;
159
+ }
160
+ export interface IPolarTickDataOpt extends ITickDataOpt {
161
+ axisOrientType: IPolarOrientType;
162
+ getRadius: () => number;
163
+ labelOffset: number;
164
+ inside: boolean;
165
+ }
166
+ export interface ITickData {
167
+ index: number;
168
+ value: number | string;
169
+ }
170
+ type ITickCallbackOption = {
171
+ axisLength?: number;
172
+ labelStyle?: ITextGraphicAttribute;
173
+ };
174
+ export interface ILabelItem<T> extends Pick<IGraphic, 'AABBBounds'> {
175
+ value?: T;
176
+ }
177
+ export {};