You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
11 KiB
353 lines
11 KiB
1 month ago
|
|
||
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance
|
||
|
* with the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing,
|
||
|
* software distributed under the License is distributed on an
|
||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
* KIND, either express or implied. See the License for the
|
||
|
* specific language governing permissions and limitations
|
||
|
* under the License.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance
|
||
|
* with the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing,
|
||
|
* software distributed under the License is distributed on an
|
||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
* KIND, either express or implied. See the License for the
|
||
|
* specific language governing permissions and limitations
|
||
|
* under the License.
|
||
|
*/
|
||
|
import { __extends } from "tslib";
|
||
|
// Poly path support NaN point
|
||
|
import Path from 'zrender/lib/graphic/Path.js';
|
||
|
import PathProxy from 'zrender/lib/core/PathProxy.js';
|
||
|
import { cubicRootAt, cubicAt } from 'zrender/lib/core/curve.js';
|
||
|
var mathMin = Math.min;
|
||
|
var mathMax = Math.max;
|
||
|
function isPointNull(x, y) {
|
||
|
return isNaN(x) || isNaN(y);
|
||
|
}
|
||
|
/**
|
||
|
* Draw smoothed line in non-monotone, in may cause undesired curve in extreme
|
||
|
* situations. This should be used when points are non-monotone neither in x or
|
||
|
* y dimension.
|
||
|
*/
|
||
|
function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) {
|
||
|
var prevX;
|
||
|
var prevY;
|
||
|
var cpx0;
|
||
|
var cpy0;
|
||
|
var cpx1;
|
||
|
var cpy1;
|
||
|
var idx = start;
|
||
|
var k = 0;
|
||
|
for (; k < segLen; k++) {
|
||
|
var x = points[idx * 2];
|
||
|
var y = points[idx * 2 + 1];
|
||
|
if (idx >= allLen || idx < 0) {
|
||
|
break;
|
||
|
}
|
||
|
if (isPointNull(x, y)) {
|
||
|
if (connectNulls) {
|
||
|
idx += dir;
|
||
|
continue;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
if (idx === start) {
|
||
|
ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y);
|
||
|
cpx0 = x;
|
||
|
cpy0 = y;
|
||
|
} else {
|
||
|
var dx = x - prevX;
|
||
|
var dy = y - prevY;
|
||
|
// Ignore tiny segment.
|
||
|
if (dx * dx + dy * dy < 0.5) {
|
||
|
idx += dir;
|
||
|
continue;
|
||
|
}
|
||
|
if (smooth > 0) {
|
||
|
var nextIdx = idx + dir;
|
||
|
var nextX = points[nextIdx * 2];
|
||
|
var nextY = points[nextIdx * 2 + 1];
|
||
|
// Ignore duplicate point
|
||
|
while (nextX === x && nextY === y && k < segLen) {
|
||
|
k++;
|
||
|
nextIdx += dir;
|
||
|
idx += dir;
|
||
|
nextX = points[nextIdx * 2];
|
||
|
nextY = points[nextIdx * 2 + 1];
|
||
|
x = points[idx * 2];
|
||
|
y = points[idx * 2 + 1];
|
||
|
dx = x - prevX;
|
||
|
dy = y - prevY;
|
||
|
}
|
||
|
var tmpK = k + 1;
|
||
|
if (connectNulls) {
|
||
|
// Find next point not null
|
||
|
while (isPointNull(nextX, nextY) && tmpK < segLen) {
|
||
|
tmpK++;
|
||
|
nextIdx += dir;
|
||
|
nextX = points[nextIdx * 2];
|
||
|
nextY = points[nextIdx * 2 + 1];
|
||
|
}
|
||
|
}
|
||
|
var ratioNextSeg = 0.5;
|
||
|
var vx = 0;
|
||
|
var vy = 0;
|
||
|
var nextCpx0 = void 0;
|
||
|
var nextCpy0 = void 0;
|
||
|
// Is last point
|
||
|
if (tmpK >= segLen || isPointNull(nextX, nextY)) {
|
||
|
cpx1 = x;
|
||
|
cpy1 = y;
|
||
|
} else {
|
||
|
vx = nextX - prevX;
|
||
|
vy = nextY - prevY;
|
||
|
var dx0 = x - prevX;
|
||
|
var dx1 = nextX - x;
|
||
|
var dy0 = y - prevY;
|
||
|
var dy1 = nextY - y;
|
||
|
var lenPrevSeg = void 0;
|
||
|
var lenNextSeg = void 0;
|
||
|
if (smoothMonotone === 'x') {
|
||
|
lenPrevSeg = Math.abs(dx0);
|
||
|
lenNextSeg = Math.abs(dx1);
|
||
|
var dir_1 = vx > 0 ? 1 : -1;
|
||
|
cpx1 = x - dir_1 * lenPrevSeg * smooth;
|
||
|
cpy1 = y;
|
||
|
nextCpx0 = x + dir_1 * lenNextSeg * smooth;
|
||
|
nextCpy0 = y;
|
||
|
} else if (smoothMonotone === 'y') {
|
||
|
lenPrevSeg = Math.abs(dy0);
|
||
|
lenNextSeg = Math.abs(dy1);
|
||
|
var dir_2 = vy > 0 ? 1 : -1;
|
||
|
cpx1 = x;
|
||
|
cpy1 = y - dir_2 * lenPrevSeg * smooth;
|
||
|
nextCpx0 = x;
|
||
|
nextCpy0 = y + dir_2 * lenNextSeg * smooth;
|
||
|
} else {
|
||
|
lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0);
|
||
|
lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1);
|
||
|
// Use ratio of seg length
|
||
|
ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);
|
||
|
cpx1 = x - vx * smooth * (1 - ratioNextSeg);
|
||
|
cpy1 = y - vy * smooth * (1 - ratioNextSeg);
|
||
|
// cp0 of next segment
|
||
|
nextCpx0 = x + vx * smooth * ratioNextSeg;
|
||
|
nextCpy0 = y + vy * smooth * ratioNextSeg;
|
||
|
// Smooth constraint between point and next point.
|
||
|
// Avoid exceeding extreme after smoothing.
|
||
|
nextCpx0 = mathMin(nextCpx0, mathMax(nextX, x));
|
||
|
nextCpy0 = mathMin(nextCpy0, mathMax(nextY, y));
|
||
|
nextCpx0 = mathMax(nextCpx0, mathMin(nextX, x));
|
||
|
nextCpy0 = mathMax(nextCpy0, mathMin(nextY, y));
|
||
|
// Reclaculate cp1 based on the adjusted cp0 of next seg.
|
||
|
vx = nextCpx0 - x;
|
||
|
vy = nextCpy0 - y;
|
||
|
cpx1 = x - vx * lenPrevSeg / lenNextSeg;
|
||
|
cpy1 = y - vy * lenPrevSeg / lenNextSeg;
|
||
|
// Smooth constraint between point and prev point.
|
||
|
// Avoid exceeding extreme after smoothing.
|
||
|
cpx1 = mathMin(cpx1, mathMax(prevX, x));
|
||
|
cpy1 = mathMin(cpy1, mathMax(prevY, y));
|
||
|
cpx1 = mathMax(cpx1, mathMin(prevX, x));
|
||
|
cpy1 = mathMax(cpy1, mathMin(prevY, y));
|
||
|
// Adjust next cp0 again.
|
||
|
vx = x - cpx1;
|
||
|
vy = y - cpy1;
|
||
|
nextCpx0 = x + vx * lenNextSeg / lenPrevSeg;
|
||
|
nextCpy0 = y + vy * lenNextSeg / lenPrevSeg;
|
||
|
}
|
||
|
}
|
||
|
ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y);
|
||
|
cpx0 = nextCpx0;
|
||
|
cpy0 = nextCpy0;
|
||
|
} else {
|
||
|
ctx.lineTo(x, y);
|
||
|
}
|
||
|
}
|
||
|
prevX = x;
|
||
|
prevY = y;
|
||
|
idx += dir;
|
||
|
}
|
||
|
return k;
|
||
|
}
|
||
|
var ECPolylineShape = /** @class */function () {
|
||
|
function ECPolylineShape() {
|
||
|
this.smooth = 0;
|
||
|
this.smoothConstraint = true;
|
||
|
}
|
||
|
return ECPolylineShape;
|
||
|
}();
|
||
|
var ECPolyline = /** @class */function (_super) {
|
||
|
__extends(ECPolyline, _super);
|
||
|
function ECPolyline(opts) {
|
||
|
var _this = _super.call(this, opts) || this;
|
||
|
_this.type = 'ec-polyline';
|
||
|
return _this;
|
||
|
}
|
||
|
ECPolyline.prototype.getDefaultStyle = function () {
|
||
|
return {
|
||
|
stroke: '#000',
|
||
|
fill: null
|
||
|
};
|
||
|
};
|
||
|
ECPolyline.prototype.getDefaultShape = function () {
|
||
|
return new ECPolylineShape();
|
||
|
};
|
||
|
ECPolyline.prototype.buildPath = function (ctx, shape) {
|
||
|
var points = shape.points;
|
||
|
var i = 0;
|
||
|
var len = points.length / 2;
|
||
|
// const result = getBoundingBox(points, shape.smoothConstraint);
|
||
|
if (shape.connectNulls) {
|
||
|
// Must remove first and last null values avoid draw error in polygon
|
||
|
for (; len > 0; len--) {
|
||
|
if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
for (; i < len; i++) {
|
||
|
if (!isPointNull(points[i * 2], points[i * 2 + 1])) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
while (i < len) {
|
||
|
i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1;
|
||
|
}
|
||
|
};
|
||
|
ECPolyline.prototype.getPointOn = function (xOrY, dim) {
|
||
|
if (!this.path) {
|
||
|
this.createPathProxy();
|
||
|
this.buildPath(this.path, this.shape);
|
||
|
}
|
||
|
var path = this.path;
|
||
|
var data = path.data;
|
||
|
var CMD = PathProxy.CMD;
|
||
|
var x0;
|
||
|
var y0;
|
||
|
var isDimX = dim === 'x';
|
||
|
var roots = [];
|
||
|
for (var i = 0; i < data.length;) {
|
||
|
var cmd = data[i++];
|
||
|
var x = void 0;
|
||
|
var y = void 0;
|
||
|
var x2 = void 0;
|
||
|
var y2 = void 0;
|
||
|
var x3 = void 0;
|
||
|
var y3 = void 0;
|
||
|
var t = void 0;
|
||
|
switch (cmd) {
|
||
|
case CMD.M:
|
||
|
x0 = data[i++];
|
||
|
y0 = data[i++];
|
||
|
break;
|
||
|
case CMD.L:
|
||
|
x = data[i++];
|
||
|
y = data[i++];
|
||
|
t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0);
|
||
|
if (t <= 1 && t >= 0) {
|
||
|
var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0;
|
||
|
return isDimX ? [xOrY, val] : [val, xOrY];
|
||
|
}
|
||
|
x0 = x;
|
||
|
y0 = y;
|
||
|
break;
|
||
|
case CMD.C:
|
||
|
x = data[i++];
|
||
|
y = data[i++];
|
||
|
x2 = data[i++];
|
||
|
y2 = data[i++];
|
||
|
x3 = data[i++];
|
||
|
y3 = data[i++];
|
||
|
var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots);
|
||
|
if (nRoot > 0) {
|
||
|
for (var i_1 = 0; i_1 < nRoot; i_1++) {
|
||
|
var t_1 = roots[i_1];
|
||
|
if (t_1 <= 1 && t_1 >= 0) {
|
||
|
var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1);
|
||
|
return isDimX ? [xOrY, val] : [val, xOrY];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
x0 = x3;
|
||
|
y0 = y3;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
return ECPolyline;
|
||
|
}(Path);
|
||
|
export { ECPolyline };
|
||
|
var ECPolygonShape = /** @class */function (_super) {
|
||
|
__extends(ECPolygonShape, _super);
|
||
|
function ECPolygonShape() {
|
||
|
return _super !== null && _super.apply(this, arguments) || this;
|
||
|
}
|
||
|
return ECPolygonShape;
|
||
|
}(ECPolylineShape);
|
||
|
var ECPolygon = /** @class */function (_super) {
|
||
|
__extends(ECPolygon, _super);
|
||
|
function ECPolygon(opts) {
|
||
|
var _this = _super.call(this, opts) || this;
|
||
|
_this.type = 'ec-polygon';
|
||
|
return _this;
|
||
|
}
|
||
|
ECPolygon.prototype.getDefaultShape = function () {
|
||
|
return new ECPolygonShape();
|
||
|
};
|
||
|
ECPolygon.prototype.buildPath = function (ctx, shape) {
|
||
|
var points = shape.points;
|
||
|
var stackedOnPoints = shape.stackedOnPoints;
|
||
|
var i = 0;
|
||
|
var len = points.length / 2;
|
||
|
var smoothMonotone = shape.smoothMonotone;
|
||
|
if (shape.connectNulls) {
|
||
|
// Must remove first and last null values avoid draw error in polygon
|
||
|
for (; len > 0; len--) {
|
||
|
if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
for (; i < len; i++) {
|
||
|
if (!isPointNull(points[i * 2], points[i * 2 + 1])) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
while (i < len) {
|
||
|
var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls);
|
||
|
drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls);
|
||
|
i += k + 1;
|
||
|
ctx.closePath();
|
||
|
}
|
||
|
};
|
||
|
return ECPolygon;
|
||
|
}(Path);
|
||
|
export { ECPolygon };
|