@visactor/vrender-components 0.21.2 → 0.21.3
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.
- package/cjs/axis/overlap/util.d.ts +2 -2
- package/cjs/axis/overlap/util.js +4 -4
- package/cjs/axis/overlap/util.js.map +1 -1
- package/cjs/axis/tick-data/continuous.js +16 -5
- package/cjs/axis/tick-data/continuous.js.map +1 -1
- package/cjs/axis/util.js +6 -3
- package/cjs/axis/util.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/label/base.d.ts +1 -1
- package/cjs/label/base.js +4 -4
- package/cjs/label/base.js.map +1 -1
- package/cjs/label/overlap/place.js +3 -3
- package/cjs/label/overlap/place.js.map +1 -1
- package/cjs/label/type.js.map +1 -1
- package/cjs/legend/discrete/discrete.js +16 -6
- package/cjs/legend/discrete/discrete.js.map +1 -1
- package/cjs/legend/discrete/type.d.ts +1 -0
- package/cjs/legend/discrete/type.js.map +1 -1
- package/dist/index.es.js +177 -93
- package/es/axis/overlap/util.d.ts +2 -2
- package/es/axis/overlap/util.js +4 -4
- package/es/axis/overlap/util.js.map +1 -1
- package/es/axis/tick-data/continuous.js +17 -4
- package/es/axis/tick-data/continuous.js.map +1 -1
- package/es/axis/util.js +7 -2
- package/es/axis/util.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/label/base.d.ts +1 -1
- package/es/label/base.js +4 -4
- package/es/label/base.js.map +1 -1
- package/es/label/overlap/place.js +3 -3
- package/es/label/overlap/place.js.map +1 -1
- package/es/label/type.js.map +1 -1
- package/es/legend/discrete/discrete.js +16 -6
- package/es/legend/discrete/discrete.js.map +1 -1
- package/es/legend/discrete/type.d.ts +1 -0
- package/es/legend/discrete/type.js.map +1 -1
- package/package.json +3 -3
package/dist/index.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { tau, halfPi as halfPi$1, AABBBounds, degreeToRadian, Point, PointService, abs, max, min, atan2, epsilon, Matrix, pi2, Logger, pi, isArray, isNumberClose, TextMeasure, EventEmitter, isBoolean, isObject, isFunction, cos, sin, isString, pointAt, isNumber, getDecimalPlaces, isNil, Color, OBBBounds, has, normalTransform, isValidUrl, isBase64, acos, sqrt, transformBoundsWithMatrix, arrayEqual, getContextFont, rotatePoint, clampAngleByRadian, asin, Bounds, getRectIntersect, isRectIntersect, isPlainObject, merge, clamp, clampRange, normalizePadding, debounce, throttle, hexToRgb, crossProduct, isValid, isEmpty, rectInsideAnotherRect, radianToDegree, getAngleByPoint, polarToCartesian, array, isValidNumber, calculateAnchorOfBounds, computeQuadrant, isGreater, isLess, normalizeAngle, flattenArray, cloneDeep, get, last,
|
|
1
|
+
import { tau, halfPi as halfPi$1, AABBBounds, degreeToRadian, Point, PointService, abs, max, min, atan2, epsilon, Matrix, pi2, Logger, pi, isArray, isNumberClose, TextMeasure, EventEmitter, isBoolean, isObject, isFunction, cos, sin, isString, pointAt, isNumber, getDecimalPlaces, isNil, Color, OBBBounds, has, normalTransform, isValidUrl, isBase64, acos, sqrt, transformBoundsWithMatrix, arrayEqual, getContextFont, rotatePoint, clampAngleByRadian, asin, Bounds, getRectIntersect, isRectIntersect, isPlainObject, merge, clamp, clampRange, normalizePadding, debounce, throttle, hexToRgb, crossProduct, isValid, isEmpty, rectInsideAnotherRect, radianToDegree, getAngleByPoint, polarToCartesian, array, isValidNumber, calculateAnchorOfBounds, computeQuadrant, isGreater, isLess, normalizeAngle, flattenArray, isRotateAABBIntersect, cloneDeep, get, last, mixin, isEqual, interpolateString, minInArray, maxInArray, binaryFuzzySearchInNumberRange, polygonContainPoint } from '@visactor/vutils';
|
|
2
2
|
import { isContinuous, isDiscrete, LinearScale } from '@visactor/vscale';
|
|
3
3
|
|
|
4
4
|
class Generator {
|
|
@@ -588,6 +588,31 @@ var __decorate$P = undefined && undefined.__decorate || function (decorators, ta
|
|
|
588
588
|
return function (target, key) {
|
|
589
589
|
decorator(target, key, paramIndex);
|
|
590
590
|
};
|
|
591
|
+
},
|
|
592
|
+
__awaiter$4 = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
|
|
593
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
594
|
+
function fulfilled(value) {
|
|
595
|
+
try {
|
|
596
|
+
step(generator.next(value));
|
|
597
|
+
} catch (e) {
|
|
598
|
+
reject(e);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
function rejected(value) {
|
|
602
|
+
try {
|
|
603
|
+
step(generator.throw(value));
|
|
604
|
+
} catch (e) {
|
|
605
|
+
reject(e);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
function step(result) {
|
|
609
|
+
var value;
|
|
610
|
+
result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P(function (resolve) {
|
|
611
|
+
resolve(value);
|
|
612
|
+
})).then(fulfilled, rejected);
|
|
613
|
+
}
|
|
614
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
615
|
+
});
|
|
591
616
|
};
|
|
592
617
|
let DefaultGlobal = class {
|
|
593
618
|
get env() {
|
|
@@ -713,6 +738,11 @@ let DefaultGlobal = class {
|
|
|
713
738
|
loadBlob(url) {
|
|
714
739
|
return this._env || this.setEnv("browser"), this.envContribution.loadBlob(url);
|
|
715
740
|
}
|
|
741
|
+
loadFont(name, source, descriptors) {
|
|
742
|
+
return __awaiter$4(this, void 0, void 0, function* () {
|
|
743
|
+
return this._env || this.setEnv("browser"), this.envContribution.loadFont(name, source, descriptors);
|
|
744
|
+
});
|
|
745
|
+
}
|
|
716
746
|
isChrome() {
|
|
717
747
|
return null != this._isChrome || (this._env || this.setEnv("browser"), this._isChrome = "browser" === this._env && navigator.userAgent.indexOf("Chrome") > -1), this._isChrome;
|
|
718
748
|
}
|
|
@@ -7418,7 +7448,9 @@ class DefaultImageBackgroundRenderContribution extends DefaultBaseBackgroundRend
|
|
|
7418
7448
|
const {
|
|
7419
7449
|
background: background,
|
|
7420
7450
|
backgroundMode = graphicAttribute.backgroundMode,
|
|
7421
|
-
backgroundFit = graphicAttribute.backgroundFit
|
|
7451
|
+
backgroundFit = graphicAttribute.backgroundFit,
|
|
7452
|
+
width: width,
|
|
7453
|
+
height: height
|
|
7422
7454
|
} = graphic.attribute;
|
|
7423
7455
|
if (background) if (graphic.backgroundImg) {
|
|
7424
7456
|
const res = graphic.resources.get(background);
|
|
@@ -7451,11 +7483,7 @@ class DefaultImageBackgroundRenderContribution extends DefaultBaseBackgroundRend
|
|
|
7451
7483
|
height: height
|
|
7452
7484
|
} = getActualPosition(graphic);
|
|
7453
7485
|
cornerRadius ? createRectPath(context, x - expandX, y - expandY, width + 2 * expandX, height + 2 * expandY, cornerRadius) : context.rect(x - expandX, y - expandY, width + 2 * expandX, height + 2 * expandY), context.globalAlpha = 1, fill && (context.fillStyle = fill, context.fill()), stroke && lineWidth > 0 && (context.lineWidth = lineWidth, context.strokeStyle = stroke, context.stroke());
|
|
7454
|
-
} else
|
|
7455
|
-
context.beginPath();
|
|
7456
|
-
const b = graphic.AABBBounds;
|
|
7457
|
-
context.rect(x, y, b.width(), b.height()), context.fillStyle = background, context.globalAlpha = 1, context.fill();
|
|
7458
|
-
}
|
|
7486
|
+
} else context.beginPath(), context.rect(x, y, width || 0, height || 0), context.fillStyle = background, context.globalAlpha = 1, context.fill();
|
|
7459
7487
|
}
|
|
7460
7488
|
}
|
|
7461
7489
|
function getActualPosition(graphic) {
|
|
@@ -9160,7 +9188,7 @@ let DefaultCanvasImageRender = class extends BaseRender {
|
|
|
9160
9188
|
doFill: doFill,
|
|
9161
9189
|
doStroke: doStroke
|
|
9162
9190
|
} = data;
|
|
9163
|
-
context.setShadowBlendStyle && context.setShadowBlendStyle(image, imageAttribute), this.beforeRenderStep(image, context, x, y, doFill, !1, fVisible, !1, imageAttribute, drawContext, fillCb);
|
|
9191
|
+
context.setShadowBlendStyle && context.setShadowBlendStyle(image, image.attribute, imageAttribute), this.beforeRenderStep(image, context, x, y, doFill, !1, fVisible, !1, imageAttribute, drawContext, fillCb);
|
|
9164
9192
|
const _runFill = () => {
|
|
9165
9193
|
if (doFill) if (fillCb) fillCb(context, image.attribute, imageAttribute);else if (fVisible) {
|
|
9166
9194
|
if (!url || !image.resources) return;
|
|
@@ -9177,7 +9205,7 @@ let DefaultCanvasImageRender = class extends BaseRender {
|
|
|
9177
9205
|
}
|
|
9178
9206
|
},
|
|
9179
9207
|
_runStroke = () => {
|
|
9180
|
-
doStroke && (strokeCb ? strokeCb(context, image.attribute, imageAttribute) : sVisible && (context.setStrokeStyle(image, image.attribute, originX - x, originY - y, imageAttribute), context.
|
|
9208
|
+
doStroke && (strokeCb ? strokeCb(context, image.attribute, imageAttribute) : sVisible && (context.setStrokeStyle(image, image.attribute, originX - x, originY - y, imageAttribute), context.strokeRect(x, y, width, height)));
|
|
9181
9209
|
};
|
|
9182
9210
|
fillStrokeOrder ? (_runStroke(), _runFill()) : (_runFill(), _runStroke()), this.afterRenderStep(image, context, x, y, doFill, !1, fVisible, !1, imageAttribute, drawContext, fillCb);
|
|
9183
9211
|
}
|
|
@@ -13140,7 +13168,7 @@ let DefaultCanvasRichTextRender = class extends BaseRender {
|
|
|
13140
13168
|
const fVisible = fillVisible(opacity, fillOpacity, !0),
|
|
13141
13169
|
sVisible = fillVisible(opacity, strokeOpacity, !0);
|
|
13142
13170
|
if (!fVisible) return;
|
|
13143
|
-
context.translate(x, y), this.beforeRenderStep(richtext, context, x, y, fVisible, sVisible, fVisible, sVisible, richtextAttribute, drawContext);
|
|
13171
|
+
context.setShadowBlendStyle && context.setShadowBlendStyle(richtext, richtext.attribute, richtextAttribute), context.translate(x, y), this.beforeRenderStep(richtext, context, x, y, fVisible, sVisible, fVisible, sVisible, richtextAttribute, drawContext);
|
|
13144
13172
|
richtext.getFrameCache().draw(context, this.drawIcon), this.afterRenderStep(richtext, context, x, y, fVisible, sVisible, fVisible, sVisible, richtextAttribute, drawContext);
|
|
13145
13173
|
}
|
|
13146
13174
|
drawIcon(icon, context, x, y, baseline) {
|
|
@@ -16353,17 +16381,17 @@ function clampText(text, width, height, padding = {}) {
|
|
|
16353
16381
|
const maxYWithPadding = height + bottom;
|
|
16354
16382
|
let dx = 0;
|
|
16355
16383
|
let dy = 0;
|
|
16356
|
-
if (minX < minXWithPadding
|
|
16384
|
+
if (minX < minXWithPadding) {
|
|
16357
16385
|
dx = -minX;
|
|
16358
16386
|
}
|
|
16359
|
-
else if (maxX > maxXWithPadding
|
|
16360
|
-
dx =
|
|
16387
|
+
else if (maxX > maxXWithPadding) {
|
|
16388
|
+
dx = maxXWithPadding - maxX;
|
|
16361
16389
|
}
|
|
16362
|
-
if (minY < minYWithPadding
|
|
16390
|
+
if (minY < minYWithPadding) {
|
|
16363
16391
|
dy = -minY;
|
|
16364
16392
|
}
|
|
16365
|
-
else if (maxY > maxYWithPadding
|
|
16366
|
-
dy =
|
|
16393
|
+
else if (maxY > maxYWithPadding) {
|
|
16394
|
+
dy = maxYWithPadding - maxY;
|
|
16367
16395
|
}
|
|
16368
16396
|
return { dx, dy };
|
|
16369
16397
|
}
|
|
@@ -17199,7 +17227,7 @@ class LabelBase extends AbstractComponent {
|
|
|
17199
17227
|
}
|
|
17200
17228
|
else {
|
|
17201
17229
|
if (clampForce) {
|
|
17202
|
-
const placedAfterClampForce = this._processClampForce(text, bmpTool, bitmap);
|
|
17230
|
+
const placedAfterClampForce = this._processClampForce(text, bmpTool, bitmap, overlapPadding);
|
|
17203
17231
|
if (placedAfterClampForce) {
|
|
17204
17232
|
continue;
|
|
17205
17233
|
}
|
|
@@ -17214,10 +17242,10 @@ class LabelBase extends AbstractComponent {
|
|
|
17214
17242
|
}
|
|
17215
17243
|
return result;
|
|
17216
17244
|
}
|
|
17217
|
-
_processClampForce(text, bmpTool, bitmap) {
|
|
17245
|
+
_processClampForce(text, bmpTool, bitmap, overlapPadding = 0) {
|
|
17218
17246
|
const { dy = 0, dx = 0 } = clampText(text, bmpTool.width, bmpTool.height, bmpTool.padding);
|
|
17219
17247
|
if (dx === 0 && dy === 0) {
|
|
17220
|
-
if (canPlace(bmpTool, bitmap, text.AABBBounds)) {
|
|
17248
|
+
if (canPlace(bmpTool, bitmap, text.AABBBounds, false, overlapPadding)) {
|
|
17221
17249
|
bitmap.setRange(boundToRange(bmpTool, text.AABBBounds, true));
|
|
17222
17250
|
return true;
|
|
17223
17251
|
}
|
|
@@ -17293,7 +17321,7 @@ class LabelBase extends AbstractComponent {
|
|
|
17293
17321
|
}
|
|
17294
17322
|
}
|
|
17295
17323
|
if (!hasPlace && clampForce) {
|
|
17296
|
-
const placedAfterClampForce = this._processClampForce(text, bmpTool, bitmap);
|
|
17324
|
+
const placedAfterClampForce = this._processClampForce(text, bmpTool, bitmap, overlapPadding);
|
|
17297
17325
|
if (placedAfterClampForce) {
|
|
17298
17326
|
result.push(text);
|
|
17299
17327
|
continue;
|
|
@@ -18984,6 +19012,61 @@ const DEFAULT_AXIS_BREAK_SYMBOL_STYLE = {
|
|
|
18984
19012
|
zIndex: 1
|
|
18985
19013
|
};
|
|
18986
19014
|
|
|
19015
|
+
function genNormalBounds(item) {
|
|
19016
|
+
const bounds = item.AABBBounds;
|
|
19017
|
+
return {
|
|
19018
|
+
x1: bounds.x1,
|
|
19019
|
+
x2: bounds.x2,
|
|
19020
|
+
y1: bounds.y1,
|
|
19021
|
+
y2: bounds.y2,
|
|
19022
|
+
centerX: item.attribute.x,
|
|
19023
|
+
centerY: item.attribute.y,
|
|
19024
|
+
angle: item.attribute.angle
|
|
19025
|
+
};
|
|
19026
|
+
}
|
|
19027
|
+
function genRotateBounds(items) {
|
|
19028
|
+
items.forEach(item => {
|
|
19029
|
+
if (item.rotatedBounds || !item.attribute.angle) {
|
|
19030
|
+
return;
|
|
19031
|
+
}
|
|
19032
|
+
const bounds = genNormalBounds(item);
|
|
19033
|
+
const rotatedCenter = rotatePoint({ x: item.attribute.x, y: item.attribute.y }, bounds.angle, {
|
|
19034
|
+
x: bounds.centerX,
|
|
19035
|
+
y: bounds.centerY
|
|
19036
|
+
});
|
|
19037
|
+
const deltaX = rotatedCenter.x - bounds.centerX;
|
|
19038
|
+
const deltaY = rotatedCenter.y - bounds.centerY;
|
|
19039
|
+
bounds.x1 += deltaX;
|
|
19040
|
+
bounds.x2 += deltaX;
|
|
19041
|
+
bounds.y1 += deltaY;
|
|
19042
|
+
bounds.y2 += deltaY;
|
|
19043
|
+
bounds.centerX += deltaX;
|
|
19044
|
+
bounds.centerY += deltaY;
|
|
19045
|
+
item.rotatedBounds = bounds;
|
|
19046
|
+
});
|
|
19047
|
+
}
|
|
19048
|
+
function itemIntersect(item1, item2) {
|
|
19049
|
+
var _a, _b;
|
|
19050
|
+
if (!((_a = item1.OBBBounds) === null || _a === void 0 ? void 0 : _a.empty()) && !((_b = item2.OBBBounds) === null || _b === void 0 ? void 0 : _b.empty())) {
|
|
19051
|
+
return item1.OBBBounds.intersects(item2.OBBBounds);
|
|
19052
|
+
}
|
|
19053
|
+
return (isRectIntersect(item1.AABBBounds, item2.AABBBounds, false) &&
|
|
19054
|
+
(item1.rotatedBounds && item2.rotatedBounds
|
|
19055
|
+
? isRotateAABBIntersect(item1.rotatedBounds, item2.rotatedBounds, true)
|
|
19056
|
+
: true));
|
|
19057
|
+
}
|
|
19058
|
+
const DELTA_ANGLE = Math.sin(Math.PI / 10);
|
|
19059
|
+
function isAngleVertical(angle, delta = DELTA_ANGLE) {
|
|
19060
|
+
const hasAngle = !isNil(angle) && angle !== 0;
|
|
19061
|
+
const cos = hasAngle ? Math.cos(angle) : 1;
|
|
19062
|
+
return hasAngle && Math.abs(cos) <= delta;
|
|
19063
|
+
}
|
|
19064
|
+
function isAngleHorizontal(angle, delta = DELTA_ANGLE) {
|
|
19065
|
+
const hasAngle = !isNil(angle) && angle !== 0;
|
|
19066
|
+
const sin = hasAngle ? Math.sin(angle) : 0;
|
|
19067
|
+
return !hasAngle || Math.abs(sin) <= delta;
|
|
19068
|
+
}
|
|
19069
|
+
|
|
18987
19070
|
const clampRadian = (angle = 0) => {
|
|
18988
19071
|
if (angle < 0) {
|
|
18989
19072
|
while (angle < 0) {
|
|
@@ -19090,14 +19173,25 @@ function getPolygonPath(points, closed) {
|
|
|
19090
19173
|
return path;
|
|
19091
19174
|
}
|
|
19092
19175
|
function textIntersect(textA, textB, sep) {
|
|
19093
|
-
|
|
19094
|
-
let
|
|
19095
|
-
|
|
19096
|
-
|
|
19176
|
+
var _a;
|
|
19177
|
+
let a;
|
|
19178
|
+
let b;
|
|
19179
|
+
const angle = (_a = textA.attribute) === null || _a === void 0 ? void 0 : _a.angle;
|
|
19180
|
+
const isHorizontal = isAngleHorizontal(angle, Number.EPSILON);
|
|
19181
|
+
const isAABBIntersects = (textA, textB, sep) => {
|
|
19182
|
+
a = textA.AABBBounds;
|
|
19183
|
+
b = textB.AABBBounds;
|
|
19184
|
+
return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);
|
|
19185
|
+
};
|
|
19186
|
+
if (isHorizontal) {
|
|
19187
|
+
return isAABBIntersects(textA, textB, sep);
|
|
19188
|
+
}
|
|
19189
|
+
a = textA.OBBBounds;
|
|
19190
|
+
b = textB.OBBBounds;
|
|
19191
|
+
if (!a || !b || a.empty() || b.empty()) {
|
|
19192
|
+
return isAABBIntersects(textA, textB, sep);
|
|
19097
19193
|
}
|
|
19098
|
-
a
|
|
19099
|
-
b = textB.AABBBounds;
|
|
19100
|
-
return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);
|
|
19194
|
+
return a.intersects(b);
|
|
19101
19195
|
}
|
|
19102
19196
|
function hasOverlap(items, pad) {
|
|
19103
19197
|
for (let i = 1, n = items.length, a = items[0], b; i < n; a = b, ++i) {
|
|
@@ -19611,61 +19705,6 @@ function autoHide(labels, config) {
|
|
|
19611
19705
|
});
|
|
19612
19706
|
}
|
|
19613
19707
|
|
|
19614
|
-
function genNormalBounds(item) {
|
|
19615
|
-
const bounds = item.AABBBounds;
|
|
19616
|
-
return {
|
|
19617
|
-
x1: bounds.x1,
|
|
19618
|
-
x2: bounds.x2,
|
|
19619
|
-
y1: bounds.y1,
|
|
19620
|
-
y2: bounds.y2,
|
|
19621
|
-
centerX: item.attribute.x,
|
|
19622
|
-
centerY: item.attribute.y,
|
|
19623
|
-
angle: item.attribute.angle
|
|
19624
|
-
};
|
|
19625
|
-
}
|
|
19626
|
-
function genRotateBounds(items) {
|
|
19627
|
-
items.forEach(item => {
|
|
19628
|
-
if (item.rotatedBounds || !item.attribute.angle) {
|
|
19629
|
-
return;
|
|
19630
|
-
}
|
|
19631
|
-
const bounds = genNormalBounds(item);
|
|
19632
|
-
const rotatedCenter = rotatePoint({ x: item.attribute.x, y: item.attribute.y }, bounds.angle, {
|
|
19633
|
-
x: bounds.centerX,
|
|
19634
|
-
y: bounds.centerY
|
|
19635
|
-
});
|
|
19636
|
-
const deltaX = rotatedCenter.x - bounds.centerX;
|
|
19637
|
-
const deltaY = rotatedCenter.y - bounds.centerY;
|
|
19638
|
-
bounds.x1 += deltaX;
|
|
19639
|
-
bounds.x2 += deltaX;
|
|
19640
|
-
bounds.y1 += deltaY;
|
|
19641
|
-
bounds.y2 += deltaY;
|
|
19642
|
-
bounds.centerX += deltaX;
|
|
19643
|
-
bounds.centerY += deltaY;
|
|
19644
|
-
item.rotatedBounds = bounds;
|
|
19645
|
-
});
|
|
19646
|
-
}
|
|
19647
|
-
function itemIntersect(item1, item2) {
|
|
19648
|
-
var _a, _b;
|
|
19649
|
-
if (!((_a = item1.OBBBounds) === null || _a === void 0 ? void 0 : _a.empty()) && !((_b = item2.OBBBounds) === null || _b === void 0 ? void 0 : _b.empty())) {
|
|
19650
|
-
return item1.OBBBounds.intersects(item2.OBBBounds);
|
|
19651
|
-
}
|
|
19652
|
-
return (isRectIntersect(item1.AABBBounds, item2.AABBBounds, false) &&
|
|
19653
|
-
(item1.rotatedBounds && item2.rotatedBounds
|
|
19654
|
-
? isRotateAABBIntersect(item1.rotatedBounds, item2.rotatedBounds, true)
|
|
19655
|
-
: true));
|
|
19656
|
-
}
|
|
19657
|
-
const DELTA_ANGLE = Math.sin(Math.PI / 10);
|
|
19658
|
-
function isAngleVertical(angle) {
|
|
19659
|
-
const hasAngle = !isNil(angle) && angle !== 0;
|
|
19660
|
-
const cos = hasAngle ? Math.cos(angle) : 1;
|
|
19661
|
-
return hasAngle && Math.abs(cos) <= DELTA_ANGLE;
|
|
19662
|
-
}
|
|
19663
|
-
function isAngleHorizontal(angle) {
|
|
19664
|
-
const hasAngle = !isNil(angle) && angle !== 0;
|
|
19665
|
-
const sin = hasAngle ? Math.sin(angle) : 0;
|
|
19666
|
-
return !hasAngle || Math.abs(sin) <= DELTA_ANGLE;
|
|
19667
|
-
}
|
|
19668
|
-
|
|
19669
19708
|
function autoRotate(items, rotateConfig) {
|
|
19670
19709
|
if (isEmpty(items)) {
|
|
19671
19710
|
return;
|
|
@@ -21050,6 +21089,15 @@ const isAxisHorizontal = (axisOrientType) => {
|
|
|
21050
21089
|
return ['bottom', 'top', 'z'].includes(axisOrientType);
|
|
21051
21090
|
};
|
|
21052
21091
|
|
|
21092
|
+
const filterTicksByBreak = (ticks, breakDomains) => {
|
|
21093
|
+
return breakDomains && breakDomains.length
|
|
21094
|
+
? ticks.filter(tick => {
|
|
21095
|
+
return breakDomains.every(breakDomain => {
|
|
21096
|
+
return tick < breakDomain[0] || tick > breakDomain[1];
|
|
21097
|
+
});
|
|
21098
|
+
})
|
|
21099
|
+
: ticks;
|
|
21100
|
+
};
|
|
21053
21101
|
function getScaleTicks(op, scale, count, getTicks) {
|
|
21054
21102
|
let scaleTicks;
|
|
21055
21103
|
const { breakData } = op;
|
|
@@ -21111,7 +21159,7 @@ const continuousTicks = (scale, op) => {
|
|
|
21111
21159
|
const { tickCount, forceTickCount, tickStep, noDecimals = false, labelStyle, breakData } = op;
|
|
21112
21160
|
let scaleTicks;
|
|
21113
21161
|
if (isValid(tickStep)) {
|
|
21114
|
-
scaleTicks = scale.stepTicks(tickStep);
|
|
21162
|
+
scaleTicks = filterTicksByBreak(scale.stepTicks(tickStep), breakData && breakData() ? breakData().breakDomains : null);
|
|
21115
21163
|
}
|
|
21116
21164
|
else if (isValid(forceTickCount)) {
|
|
21117
21165
|
scaleTicks = getScaleTicks(op, scale, forceTickCount, (count, subDomain) => {
|
|
@@ -21152,13 +21200,29 @@ const continuousTicks = (scale, op) => {
|
|
|
21152
21200
|
if (op.sampling && scaleTicks.length > 1) {
|
|
21153
21201
|
if (op.coordinateType === 'cartesian' || (op.coordinateType === 'polar' && op.axisOrientType === 'radius')) {
|
|
21154
21202
|
const { labelGap = 4, labelFlush } = op;
|
|
21155
|
-
|
|
21156
|
-
|
|
21157
|
-
|
|
21158
|
-
|
|
21159
|
-
|
|
21160
|
-
|
|
21161
|
-
|
|
21203
|
+
const MIN_FONT_SIZE = 6;
|
|
21204
|
+
let items;
|
|
21205
|
+
if (scaleTicks.length * MIN_FONT_SIZE > rangeSize) {
|
|
21206
|
+
const samplingScaleTicks = [];
|
|
21207
|
+
const step = Math.floor((scaleTicks.length * MIN_FONT_SIZE) / rangeSize);
|
|
21208
|
+
scaleTicks.forEach((tick, index) => {
|
|
21209
|
+
if (index % step === 0 || index === scaleTicks.length - 1) {
|
|
21210
|
+
samplingScaleTicks.push(tick);
|
|
21211
|
+
}
|
|
21212
|
+
});
|
|
21213
|
+
items = getCartesianLabelBounds(scale, samplingScaleTicks, op).map((bounds, i) => ({
|
|
21214
|
+
AABBBounds: bounds,
|
|
21215
|
+
value: samplingScaleTicks[i]
|
|
21216
|
+
}));
|
|
21217
|
+
}
|
|
21218
|
+
else {
|
|
21219
|
+
items = getCartesianLabelBounds(scale, scaleTicks, op).map((bounds, i) => ({
|
|
21220
|
+
AABBBounds: bounds,
|
|
21221
|
+
value: scaleTicks[i]
|
|
21222
|
+
}));
|
|
21223
|
+
}
|
|
21224
|
+
const firstSourceItem = items[0];
|
|
21225
|
+
const lastSourceItem = last(items);
|
|
21162
21226
|
const samplingMethod = breakData && breakData() ? methods.greedy : methods.parity;
|
|
21163
21227
|
while (items.length >= 3 && hasOverlap(items, labelGap)) {
|
|
21164
21228
|
items = samplingMethod(items, labelGap);
|
|
@@ -25170,7 +25234,7 @@ class DiscreteLegend extends LegendBase {
|
|
|
25170
25234
|
}
|
|
25171
25235
|
_renderItems() {
|
|
25172
25236
|
const { item: itemAttrs = {}, maxCol = 1, maxRow = 2, maxWidth, defaultSelected, lazyload, autoPage } = this.attribute;
|
|
25173
|
-
const { spaceCol = DEFAULT_ITEM_SPACE_COL, spaceRow = DEFAULT_ITEM_SPACE_ROW } = itemAttrs;
|
|
25237
|
+
const { spaceCol = DEFAULT_ITEM_SPACE_COL, spaceRow = DEFAULT_ITEM_SPACE_ROW, verticalAlign = 'middle' } = itemAttrs;
|
|
25174
25238
|
const itemsContainer = this._itemsContainer;
|
|
25175
25239
|
const { items: legendItems, isHorizontal, startIndex, isScrollbar } = this._itemContext;
|
|
25176
25240
|
const maxPages = isScrollbar ? 1 : isHorizontal ? maxRow : maxCol;
|
|
@@ -25178,6 +25242,8 @@ class DiscreteLegend extends LegendBase {
|
|
|
25178
25242
|
let { doWrap, maxWidthInCol, startX, startY, pages } = this._itemContext;
|
|
25179
25243
|
let item;
|
|
25180
25244
|
let lastItemWidth = 0;
|
|
25245
|
+
let lastLineHeight = 0;
|
|
25246
|
+
const lastLineItemGroup = [];
|
|
25181
25247
|
for (let index = startIndex, len = legendItems.length; index < len; index++) {
|
|
25182
25248
|
if (lazyload && pages > this._itemContext.currentPage * maxPages) {
|
|
25183
25249
|
break;
|
|
@@ -25209,9 +25275,18 @@ class DiscreteLegend extends LegendBase {
|
|
|
25209
25275
|
else if (startX + itemWidth > maxWidth) {
|
|
25210
25276
|
doWrap = true;
|
|
25211
25277
|
if (startX > 0) {
|
|
25278
|
+
if (verticalAlign === 'middle' || verticalAlign === 'bottom') {
|
|
25279
|
+
lastLineItemGroup.forEach(i => {
|
|
25280
|
+
i.setAttributes({
|
|
25281
|
+
y: i.attribute.y + (lastLineHeight - i.attribute.height) / (verticalAlign === 'middle' ? 2 : 1)
|
|
25282
|
+
});
|
|
25283
|
+
});
|
|
25284
|
+
}
|
|
25212
25285
|
pages += 1;
|
|
25213
25286
|
startX = 0;
|
|
25214
|
-
startY +=
|
|
25287
|
+
startY += lastLineHeight + spaceRow;
|
|
25288
|
+
lastLineHeight = 0;
|
|
25289
|
+
lastLineItemGroup.length = 0;
|
|
25215
25290
|
}
|
|
25216
25291
|
}
|
|
25217
25292
|
}
|
|
@@ -25222,6 +25297,8 @@ class DiscreteLegend extends LegendBase {
|
|
|
25222
25297
|
});
|
|
25223
25298
|
}
|
|
25224
25299
|
startX += spaceCol + itemWidth;
|
|
25300
|
+
lastLineHeight = Math.max(lastLineHeight, itemHeight);
|
|
25301
|
+
lastLineItemGroup.push(itemGroup);
|
|
25225
25302
|
}
|
|
25226
25303
|
else {
|
|
25227
25304
|
if (isValid(maxHeight)) {
|
|
@@ -25256,6 +25333,13 @@ class DiscreteLegend extends LegendBase {
|
|
|
25256
25333
|
itemsContainer.add(itemGroup);
|
|
25257
25334
|
lastItemWidth = itemWidth;
|
|
25258
25335
|
}
|
|
25336
|
+
if (isHorizontal && (verticalAlign === 'middle' || verticalAlign === 'bottom')) {
|
|
25337
|
+
lastLineItemGroup.forEach(i => {
|
|
25338
|
+
i.setAttributes({
|
|
25339
|
+
y: i.attribute.y + (lastLineHeight - i.attribute.height) / (verticalAlign === 'middle' ? 2 : 1)
|
|
25340
|
+
});
|
|
25341
|
+
});
|
|
25342
|
+
}
|
|
25259
25343
|
this._itemContext.doWrap = doWrap;
|
|
25260
25344
|
this._itemContext.startX = startX;
|
|
25261
25345
|
this._itemContext.startY = startY;
|
|
@@ -30097,6 +30181,6 @@ EmptyTip.defaultAttributes = {
|
|
|
30097
30181
|
}
|
|
30098
30182
|
};
|
|
30099
30183
|
|
|
30100
|
-
const version = "0.21.
|
|
30184
|
+
const version = "0.21.3";
|
|
30101
30185
|
|
|
30102
30186
|
export { AXIS_ELEMENT_NAME, AbstractComponent, ArcInfo, ArcLabel, ArcSegment, AxisStateValue, BasePlayer, Brush, CheckBox, CircleAxis, CircleAxisGrid, CircleCrosshair, ColorContinuousLegend, ContinuousPlayer, DEFAULT_ITEM_SPACE_COL, DEFAULT_ITEM_SPACE_ROW, DEFAULT_LABEL_SPACE, DEFAULT_PAGER_SPACE, DEFAULT_SHAPE_SIZE, DEFAULT_SHAPE_SPACE, DEFAULT_STATES$1 as DEFAULT_STATES, DEFAULT_TITLE_SPACE, DEFAULT_VALUE_SPACE, DataLabel, DataZoom, DataZoomActiveTag, DirectionEnum, DiscreteLegend, DiscretePlayer, EmptyTip, GroupTransition, IMarkAreaLabelPosition, IMarkCommonArcLabelPosition, IMarkLineLabelPosition, IMarkPointItemPosition, IOperateType, Indicator, LEGEND_ELEMENT_NAME, LabelBase, LegendEvent, LegendStateValue, LineAxis, LineAxisGrid, LineCrosshair, LineLabel, LinkPath, MarkArcArea, MarkArcLine, MarkArea, MarkLine, MarkPoint, Pager, PlayerEventEnum, PolygonCrosshair, PopTip, Radio, RectCrosshair, RectLabel, SLIDER_ELEMENT_NAME, ScrollBar, SectorCrosshair, Segment, SizeContinuousLegend, Slider, SymbolLabel, Tag, Timeline, Title, Tooltip, TopZIndex, VTag, alignTextInLine, angle, angleLabelOrientAttribute, angleTo, cartesianTicks, clampRadian, computeOffsetForlimit, continuousTicks, contrastAccessibilityChecker, convertDomainToTickData, createTextGraphicByType, deltaXYToAngle, fuzzyEqualNumber, getAxisBreakSymbolAttrs, getCircleLabelPosition, getCirclePoints, getCircleVerticalVector, getElMap, getHorizontalPath, getMarksByName, getNoneGroupMarksByName, getPolarAngleLabelPosition, getPolygonPath, getSizeHandlerPath, getTextAlignAttrOfVerticalDir, getTextType, getVerticalCoord, getVerticalPath, hasOverlap, htmlAttributeTransform, initTextMeasure, isInRange, isPostiveXAxis, isRichText, isVisible, labelSmartInvert, length, limitShapeInBounds, linearDiscreteTicks, loadPoptip, loadScrollbar, measureTextSize, normalize, polarAngleAxisDiscreteTicks, polarTicks, reactAttributeTransform, registerArcDataLabel, registerLineDataLabel, registerMarkArcAreaAnimate, registerMarkArcLineAnimate, registerMarkAreaAnimate, registerMarkLineAnimate, registerMarkPointAnimate, registerRectDataLabel, registerSymbolDataLabel, removeRepeatPoint, richTextAttributeTransform, scale, scrollbarModule, setPoptipTheme, smartInvertStrategy, tan2AngleToAngle, textIntersect, ticks, traverseGroup, version };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IText } from '@visactor/vrender-core';
|
|
2
2
|
export declare function genRotateBounds(items: IText[]): void;
|
|
3
3
|
export declare function itemIntersect(item1: IText, item2: IText): boolean;
|
|
4
|
-
export declare function isAngleVertical(angle: number): boolean;
|
|
5
|
-
export declare function isAngleHorizontal(angle: number): boolean;
|
|
4
|
+
export declare function isAngleVertical(angle: number, delta?: number): boolean;
|
|
5
|
+
export declare function isAngleHorizontal(angle: number, delta?: number): boolean;
|
package/es/axis/overlap/util.js
CHANGED
|
@@ -35,13 +35,13 @@ export function itemIntersect(item1, item2) {
|
|
|
35
35
|
|
|
36
36
|
const DELTA_ANGLE = Math.sin(Math.PI / 10);
|
|
37
37
|
|
|
38
|
-
export function isAngleVertical(angle) {
|
|
38
|
+
export function isAngleVertical(angle, delta = DELTA_ANGLE) {
|
|
39
39
|
const hasAngle = !isNil(angle) && 0 !== angle, cos = hasAngle ? Math.cos(angle) : 1;
|
|
40
|
-
return hasAngle && Math.abs(cos) <=
|
|
40
|
+
return hasAngle && Math.abs(cos) <= delta;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export function isAngleHorizontal(angle) {
|
|
43
|
+
export function isAngleHorizontal(angle, delta = DELTA_ANGLE) {
|
|
44
44
|
const hasAngle = !isNil(angle) && 0 !== angle, sin = hasAngle ? Math.sin(angle) : 0;
|
|
45
|
-
return !hasAngle || Math.abs(sin) <=
|
|
45
|
+
return !hasAngle || Math.abs(sin) <= delta;
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/axis/overlap/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG9F,SAAS,eAAe,CAAC,IAAW;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAE/B,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YAC/C,OAAO;SACR;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE;YAC5F,CAAC,EAAE,MAAM,CAAC,OAAO;YACjB,CAAC,EAAE,MAAM,CAAC,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;QACpB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QACzB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,KAAY;;IACtD,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,KAAK,EAAE,CAAA,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,KAAK,EAAE,CAAA,EAAE;QAC1D,OAAO,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;KACpD;IACD,OAAO,CACL,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;QAC1D,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa;YACzC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC;YACvE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3C,MAAM,UAAU,eAAe,CAAC,KAAa;
|
|
1
|
+
{"version":3,"sources":["../src/axis/overlap/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\nimport { isNil, isRectIntersect, isRotateAABBIntersect, rotatePoint } from '@visactor/vutils';\n\n// 计算水平情况下的包围盒\nfunction genNormalBounds(item: IText) {\n const bounds = item.AABBBounds;\n\n return {\n x1: bounds.x1,\n x2: bounds.x2,\n y1: bounds.y1,\n y2: bounds.y2,\n centerX: item.attribute.x,\n centerY: item.attribute.y,\n angle: item.attribute.angle\n };\n}\n\nexport function genRotateBounds(items: IText[]) {\n items.forEach(item => {\n if (item.rotatedBounds || !item.attribute.angle) {\n return;\n }\n // 计算水平情况下的包围盒\n const bounds = genNormalBounds(item);\n const rotatedCenter = rotatePoint({ x: item.attribute.x, y: item.attribute.y }, bounds.angle, {\n x: bounds.centerX,\n y: bounds.centerY\n });\n\n const deltaX = rotatedCenter.x - bounds.centerX;\n const deltaY = rotatedCenter.y - bounds.centerY;\n bounds.x1 += deltaX;\n bounds.x2 += deltaX;\n bounds.y1 += deltaY;\n bounds.y2 += deltaY;\n bounds.centerX += deltaX;\n bounds.centerY += deltaY;\n item.rotatedBounds = bounds;\n });\n}\n\nexport function itemIntersect(item1: IText, item2: IText) {\n if (!item1.OBBBounds?.empty() && !item2.OBBBounds?.empty()) {\n return item1.OBBBounds.intersects(item2.OBBBounds);\n }\n return (\n isRectIntersect(item1.AABBBounds, item2.AABBBounds, false) &&\n (item1.rotatedBounds && item2.rotatedBounds\n ? isRotateAABBIntersect(item1.rotatedBounds, item2.rotatedBounds, true)\n : true)\n );\n}\n\nconst DELTA_ANGLE = Math.sin(Math.PI / 10);\nexport function isAngleVertical(angle: number, delta = DELTA_ANGLE) {\n const hasAngle = !isNil(angle) && angle !== 0;\n const cos = hasAngle ? Math.cos(angle) : 1;\n return hasAngle && Math.abs(cos) <= delta;\n}\n\nexport function isAngleHorizontal(angle: number, delta = DELTA_ANGLE) {\n const hasAngle = !isNil(angle) && angle !== 0;\n const sin = hasAngle ? Math.sin(angle) : 0;\n return !hasAngle || Math.abs(sin) <= delta;\n}\n"]}
|
|
@@ -6,6 +6,8 @@ import { convertDomainToTickData, getCartesianLabelBounds } from "./util";
|
|
|
6
6
|
|
|
7
7
|
import { textIntersect as intersect, hasOverlap } from "../util";
|
|
8
8
|
|
|
9
|
+
const filterTicksByBreak = (ticks, breakDomains) => breakDomains && breakDomains.length ? ticks.filter((tick => breakDomains.every((breakDomain => tick < breakDomain[0] || tick > breakDomain[1])))) : ticks;
|
|
10
|
+
|
|
9
11
|
function getScaleTicks(op, scale, count, getTicks) {
|
|
10
12
|
let scaleTicks;
|
|
11
13
|
const {breakData: breakData} = op;
|
|
@@ -45,7 +47,8 @@ export const continuousTicks = (scale, op) => {
|
|
|
45
47
|
if (rangeSize < 2) return convertDomainToTickData([ scale.domain()[0] ]);
|
|
46
48
|
const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, noDecimals: noDecimals = !1, labelStyle: labelStyle, breakData: breakData} = op;
|
|
47
49
|
let scaleTicks;
|
|
48
|
-
if (isValid(tickStep))
|
|
50
|
+
if (isValid(tickStep)) ticks = scale.stepTicks(tickStep), breakDomains = breakData && breakData() ? breakData().breakDomains : null,
|
|
51
|
+
scaleTicks = breakDomains && breakDomains.length ? ticks.filter((tick => breakDomains.every((breakDomain => tick < breakDomain[0] || tick > breakDomain[1])))) : ticks; else if (isValid(forceTickCount)) scaleTicks = getScaleTicks(op, scale, forceTickCount, ((count, subDomain) => subDomain && subDomain.length ? scale.domain(subDomain, !0).forceTicks(count) : scale.forceTicks(count))); else if ("d3" === op.tickMode) {
|
|
49
52
|
const count = null !== (_a = isFunction(tickCount) ? tickCount({
|
|
50
53
|
axisLength: rangeSize,
|
|
51
54
|
labelStyle: labelStyle
|
|
@@ -68,16 +71,26 @@ export const continuousTicks = (scale, op) => {
|
|
|
68
71
|
customTicks: customTicks
|
|
69
72
|
})));
|
|
70
73
|
}
|
|
74
|
+
var ticks, breakDomains;
|
|
71
75
|
const domain = scale.domain();
|
|
72
76
|
if (op.labelFirstVisible && domain[0] !== scaleTicks[0] && !scaleTicks.includes(domain[0]) && scaleTicks.unshift(domain[0]),
|
|
73
77
|
op.labelLastVisible && domain[domain.length - 1] !== scaleTicks[scaleTicks.length - 1] && !scaleTicks.includes(domain[domain.length - 1]) && scaleTicks.push(domain[domain.length - 1]),
|
|
74
78
|
op.sampling && scaleTicks.length > 1 && ("cartesian" === op.coordinateType || "polar" === op.coordinateType && "radius" === op.axisOrientType)) {
|
|
75
|
-
const {labelGap: labelGap = 4, labelFlush: labelFlush} = op;
|
|
76
|
-
let items
|
|
79
|
+
const {labelGap: labelGap = 4, labelFlush: labelFlush} = op, MIN_FONT_SIZE = 6;
|
|
80
|
+
let items;
|
|
81
|
+
if (scaleTicks.length * MIN_FONT_SIZE > rangeSize) {
|
|
82
|
+
const samplingScaleTicks = [], step = Math.floor(scaleTicks.length * MIN_FONT_SIZE / rangeSize);
|
|
83
|
+
scaleTicks.forEach(((tick, index) => {
|
|
84
|
+
index % step != 0 && index !== scaleTicks.length - 1 || samplingScaleTicks.push(tick);
|
|
85
|
+
})), items = getCartesianLabelBounds(scale, samplingScaleTicks, op).map(((bounds, i) => ({
|
|
86
|
+
AABBBounds: bounds,
|
|
87
|
+
value: samplingScaleTicks[i]
|
|
88
|
+
})));
|
|
89
|
+
} else items = getCartesianLabelBounds(scale, scaleTicks, op).map(((bounds, i) => ({
|
|
77
90
|
AABBBounds: bounds,
|
|
78
91
|
value: scaleTicks[i]
|
|
79
92
|
})));
|
|
80
|
-
const
|
|
93
|
+
const firstSourceItem = items[0], lastSourceItem = last(items), samplingMethod = breakData && breakData() ? methods.greedy : methods.parity;
|
|
81
94
|
for (;items.length >= 3 && hasOverlap(items, labelGap); ) items = samplingMethod(items, labelGap);
|
|
82
95
|
const checkFirst = op.labelFirstVisible;
|
|
83
96
|
let checkLast = op.labelLastVisible;
|
|
@@ -1 +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 } from './util';\nimport { textIntersect as intersect, hasOverlap } from '../util';\nfunction getScaleTicks(\n op: ITickDataOpt,\n scale: ContinuousScale,\n count: number,\n getTicks: (count: number, domain?: [number, number]) => number[]\n) {\n let scaleTicks: number[];\n const { breakData } = op;\n\n // Todo: @zwx 将截断的逻辑挪到 scale 中\n if (breakData && breakData()) {\n const { breakDomains } = breakData();\n const domain = scale.domain();\n scaleTicks = [];\n for (let i = 0; i < domain.length - 1; i++) {\n const subDomain: [number, number] = [domain[i], domain[i + 1]];\n const ticks = getTicks(count, subDomain); // 暂时不对个数进行分段\n ticks.forEach(tick => {\n if (!breakDomains.some(breakDomain => tick >= breakDomain[0] && tick <= breakDomain[1])) {\n scaleTicks.push(tick);\n }\n });\n }\n // reset\n (scale as LinearScale).domain(domain);\n } else {\n scaleTicks = getTicks(count);\n }\n\n return scaleTicks;\n}\n\nfunction forceItemVisible(\n sourceItem: ILabelItem<number>,\n items: ILabelItem<number>[],\n check: boolean,\n comparator: any,\n inverse = false\n) {\n if (check && !items.includes(sourceItem)) {\n let remainLength = items.length;\n if (remainLength > 1) {\n if (inverse) {\n items.push(sourceItem);\n } else {\n items.unshift(sourceItem);\n }\n for (let i = 0; i < remainLength; i++) {\n const index = inverse ? remainLength - 1 - i : i;\n if (comparator(items[index])) {\n items.splice(index, 1);\n i--;\n remainLength--;\n } else {\n break;\n }\n }\n }\n }\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, breakData } = op;\n\n let scaleTicks: number[];\n if (isValid(tickStep)) {\n scaleTicks = (scale as LinearScale).stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = getScaleTicks(op, scale, forceTickCount, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).forceTicks(count);\n }\n return (scale as LinearScale).forceTicks(count);\n });\n } else if (op.tickMode === 'd3') {\n const count =\n (isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount) ??\n DEFAULT_CONTINUOUS_TICK_COUNT;\n\n scaleTicks = getScaleTicks(op, scale, count, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).d3Ticks(count, { noDecimals });\n }\n return (scale as LinearScale).d3Ticks(count, { noDecimals });\n });\n } else {\n const count =\n (isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount) ??\n DEFAULT_CONTINUOUS_TICK_COUNT;\n const customTicks = isFunction(op.tickMode) ? op.tickMode : undefined;\n\n scaleTicks = getScaleTicks(op, scale, count, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).ticks(count, { noDecimals, customTicks });\n }\n return (scale as LinearScale).ticks(count, { noDecimals, customTicks });\n });\n }\n\n const domain = scale.domain();\n\n if (op.labelFirstVisible && domain[0] !== scaleTicks[0] && !scaleTicks.includes(domain[0])) {\n scaleTicks.unshift(domain[0]);\n }\n\n if (\n op.labelLastVisible &&\n domain[domain.length - 1] !== scaleTicks[scaleTicks.length - 1] &&\n !scaleTicks.includes(domain[domain.length - 1])\n ) {\n scaleTicks.push(domain[domain.length - 1]);\n }\n if (op.sampling && scaleTicks.length > 1) {\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 const source = [...items];\n const firstSourceItem = source[0];\n const lastSourceItem = last(source);\n\n const samplingMethod = breakData && breakData() ? methods.greedy : methods.parity; // 由于轴截断后刻度会存在不均匀的情况,所以不能使用 parity 算法\n while (items.length >= 3 && hasOverlap(items as any, labelGap)) {\n items = samplingMethod(items, labelGap);\n }\n\n const checkFirst = op.labelFirstVisible;\n let checkLast = op.labelLastVisible; // 这里和 auto-hide 里的逻辑有差异,不根据 length 自动强制显示最后一个(会引起 vtable 较多 badcase)。\n\n if (intersect(firstSourceItem as any, lastSourceItem as any, labelGap)) {\n if (items.includes(lastSourceItem) && items.length > 1 && checkFirst && checkLast) {\n items.splice(items.indexOf(lastSourceItem), 1);\n checkLast = false;\n }\n }\n\n forceItemVisible(firstSourceItem, items, checkFirst, (item: ILabelItem<number>) =>\n intersect(item as any, firstSourceItem as any, labelGap)\n );\n forceItemVisible(\n lastSourceItem,\n items,\n checkLast,\n (item: ILabelItem<number>) =>\n intersect(item as any, lastSourceItem as any, labelGap) ||\n (checkFirst && item !== firstSourceItem ? intersect(item as any, firstSourceItem as any, labelGap) : false),\n true\n );\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 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 as any, b as any, sep)) {\n a = b;\n return true;\n }\n return false;\n });\n }\n};\n"]}
|
|
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 } from './util';\nimport { textIntersect as intersect, hasOverlap } from '../util';\n\nconst filterTicksByBreak = (ticks: number[], breakDomains: [number, number][]) => {\n return breakDomains && breakDomains.length\n ? ticks.filter(tick => {\n return breakDomains.every(breakDomain => {\n return tick < breakDomain[0] || tick > breakDomain[1];\n });\n })\n : ticks;\n};\nfunction getScaleTicks(\n op: ITickDataOpt,\n scale: ContinuousScale,\n count: number,\n getTicks: (count: number, domain?: [number, number]) => number[]\n) {\n let scaleTicks: number[];\n const { breakData } = op;\n\n // Todo: @zwx 将截断的逻辑挪到 scale 中\n if (breakData && breakData()) {\n const { breakDomains } = breakData();\n const domain = scale.domain();\n scaleTicks = [];\n for (let i = 0; i < domain.length - 1; i++) {\n const subDomain: [number, number] = [domain[i], domain[i + 1]];\n const ticks = getTicks(count, subDomain); // 暂时不对个数进行分段\n ticks.forEach(tick => {\n if (!breakDomains.some(breakDomain => tick >= breakDomain[0] && tick <= breakDomain[1])) {\n scaleTicks.push(tick);\n }\n });\n }\n // reset\n (scale as LinearScale).domain(domain);\n } else {\n scaleTicks = getTicks(count);\n }\n\n return scaleTicks;\n}\n\nfunction forceItemVisible(\n sourceItem: ILabelItem<number>,\n items: ILabelItem<number>[],\n check: boolean,\n comparator: any,\n inverse = false\n) {\n if (check && !items.includes(sourceItem)) {\n let remainLength = items.length;\n if (remainLength > 1) {\n if (inverse) {\n items.push(sourceItem);\n } else {\n items.unshift(sourceItem);\n }\n for (let i = 0; i < remainLength; i++) {\n const index = inverse ? remainLength - 1 - i : i;\n if (comparator(items[index])) {\n items.splice(index, 1);\n i--;\n remainLength--;\n } else {\n break;\n }\n }\n }\n }\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, breakData } = op;\n\n let scaleTicks: number[];\n if (isValid(tickStep)) {\n scaleTicks = filterTicksByBreak(\n (scale as LinearScale).stepTicks(tickStep),\n breakData && breakData() ? breakData().breakDomains : null\n );\n } else if (isValid(forceTickCount)) {\n scaleTicks = getScaleTicks(op, scale, forceTickCount, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).forceTicks(count);\n }\n return (scale as LinearScale).forceTicks(count);\n });\n } else if (op.tickMode === 'd3') {\n const count =\n (isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount) ??\n DEFAULT_CONTINUOUS_TICK_COUNT;\n\n scaleTicks = getScaleTicks(op, scale, count, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).d3Ticks(count, { noDecimals });\n }\n return (scale as LinearScale).d3Ticks(count, { noDecimals });\n });\n } else {\n const count =\n (isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount) ??\n DEFAULT_CONTINUOUS_TICK_COUNT;\n const customTicks = isFunction(op.tickMode) ? op.tickMode : undefined;\n\n scaleTicks = getScaleTicks(op, scale, count, (count: number, subDomain?: [number, number]) => {\n if (subDomain && subDomain.length) {\n return (scale as LinearScale).domain(subDomain, true).ticks(count, { noDecimals, customTicks });\n }\n return (scale as LinearScale).ticks(count, { noDecimals, customTicks });\n });\n }\n\n const domain = scale.domain();\n\n if (op.labelFirstVisible && domain[0] !== scaleTicks[0] && !scaleTicks.includes(domain[0])) {\n scaleTicks.unshift(domain[0]);\n }\n\n if (\n op.labelLastVisible &&\n domain[domain.length - 1] !== scaleTicks[scaleTicks.length - 1] &&\n !scaleTicks.includes(domain[domain.length - 1])\n ) {\n scaleTicks.push(domain[domain.length - 1]);\n }\n if (op.sampling && scaleTicks.length > 1) {\n // 判断重叠\n if (op.coordinateType === 'cartesian' || (op.coordinateType === 'polar' && op.axisOrientType === 'radius')) {\n const { labelGap = 4, labelFlush } = op as ICartesianTickDataOpt;\n const MIN_FONT_SIZE = 6;\n let items: ILabelItem<number>[];\n // 刻度个数 > 像素个数的情况,先做一层预估,减少计算,避免卡死的情况\n if (scaleTicks.length * MIN_FONT_SIZE > rangeSize) {\n const samplingScaleTicks: number[] = [];\n const step = Math.floor((scaleTicks.length * MIN_FONT_SIZE) / rangeSize);\n scaleTicks.forEach((tick, index) => {\n if (index % step === 0 || index === scaleTicks.length - 1) {\n samplingScaleTicks.push(tick);\n }\n });\n items = getCartesianLabelBounds(scale, samplingScaleTicks, op as ICartesianTickDataOpt).map(\n (bounds, i) =>\n ({\n AABBBounds: bounds,\n value: samplingScaleTicks[i]\n } as ILabelItem<number>)\n );\n } else {\n 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 }\n const firstSourceItem = items[0];\n const lastSourceItem = last(items);\n\n const samplingMethod = breakData && breakData() ? methods.greedy : methods.parity; // 由于轴截断后刻度会存在不均匀的情况,所以不能使用 parity 算法\n while (items.length >= 3 && hasOverlap(items as any, labelGap)) {\n items = samplingMethod(items, labelGap);\n }\n\n const checkFirst = op.labelFirstVisible;\n let checkLast = op.labelLastVisible; // 这里和 auto-hide 里的逻辑有差异,不根据 length 自动强制显示最后一个(会引起 vtable 较多 badcase)。\n\n if (intersect(firstSourceItem as any, lastSourceItem as any, labelGap)) {\n if (items.includes(lastSourceItem) && items.length > 1 && checkFirst && checkLast) {\n items.splice(items.indexOf(lastSourceItem), 1);\n checkLast = false;\n }\n }\n\n forceItemVisible(firstSourceItem, items, checkFirst, (item: ILabelItem<number>) =>\n intersect(item as any, firstSourceItem as any, labelGap)\n );\n forceItemVisible(\n lastSourceItem,\n items,\n checkLast,\n (item: ILabelItem<number>) =>\n intersect(item as any, lastSourceItem as any, labelGap) ||\n (checkFirst && item !== firstSourceItem ? intersect(item as any, firstSourceItem as any, labelGap) : false),\n true\n );\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 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 as any, b as any, sep)) {\n a = b;\n return true;\n }\n return false;\n });\n }\n};\n"]}
|
package/es/axis/util.js
CHANGED
|
@@ -6,6 +6,8 @@ import { scale, length } from "../util";
|
|
|
6
6
|
|
|
7
7
|
import { DEFAULT_AXIS_BREAK_SYMBOL_STYLE } from "./config";
|
|
8
8
|
|
|
9
|
+
import { isAngleHorizontal } from "./overlap/util";
|
|
10
|
+
|
|
9
11
|
export const clampRadian = (angle = 0) => {
|
|
10
12
|
if (angle < 0) for (;angle < 0; ) angle += tau; else if (angle > 0) for (;angle > tau; ) angle -= tau;
|
|
11
13
|
return angle;
|
|
@@ -85,9 +87,12 @@ export function getPolygonPath(points, closed) {
|
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
export function textIntersect(textA, textB, sep) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
var _a;
|
|
91
|
+
let a, b;
|
|
92
|
+
const angle = null === (_a = textA.attribute) || void 0 === _a ? void 0 : _a.angle, isAABBIntersects = (textA, textB, sep) => (a = textA.AABBBounds,
|
|
90
93
|
b = textB.AABBBounds, sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2));
|
|
94
|
+
return isAngleHorizontal(angle, Number.EPSILON) ? isAABBIntersects(textA, textB, sep) : (a = textA.OBBBounds,
|
|
95
|
+
b = textB.OBBBounds, !a || !b || a.empty() || b.empty() ? isAABBIntersects(textA, textB, sep) : a.intersects(b));
|
|
91
96
|
}
|
|
92
97
|
|
|
93
98
|
export function hasOverlap(items, pad) {
|