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.
169 lines
6.8 KiB
169 lines
6.8 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";
|
||
|
import BoundingRect from 'zrender/lib/core/BoundingRect.js';
|
||
|
import Cartesian from './Cartesian.js';
|
||
|
import { invert } from 'zrender/lib/core/matrix.js';
|
||
|
import { applyTransform } from 'zrender/lib/core/vector.js';
|
||
|
export var cartesian2DDimensions = ['x', 'y'];
|
||
|
function canCalculateAffineTransform(scale) {
|
||
|
return scale.type === 'interval' || scale.type === 'time';
|
||
|
}
|
||
|
var Cartesian2D = /** @class */function (_super) {
|
||
|
__extends(Cartesian2D, _super);
|
||
|
function Cartesian2D() {
|
||
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
||
|
_this.type = 'cartesian2d';
|
||
|
_this.dimensions = cartesian2DDimensions;
|
||
|
return _this;
|
||
|
}
|
||
|
/**
|
||
|
* Calculate an affine transform matrix if two axes are time or value.
|
||
|
* It's mainly for accelartion on the large time series data.
|
||
|
*/
|
||
|
Cartesian2D.prototype.calcAffineTransform = function () {
|
||
|
this._transform = this._invTransform = null;
|
||
|
var xAxisScale = this.getAxis('x').scale;
|
||
|
var yAxisScale = this.getAxis('y').scale;
|
||
|
if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) {
|
||
|
return;
|
||
|
}
|
||
|
var xScaleExtent = xAxisScale.getExtent();
|
||
|
var yScaleExtent = yAxisScale.getExtent();
|
||
|
var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]);
|
||
|
var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]);
|
||
|
var xScaleSpan = xScaleExtent[1] - xScaleExtent[0];
|
||
|
var yScaleSpan = yScaleExtent[1] - yScaleExtent[0];
|
||
|
if (!xScaleSpan || !yScaleSpan) {
|
||
|
return;
|
||
|
}
|
||
|
// Accelerate data to point calculation on the special large time series data.
|
||
|
var scaleX = (end[0] - start[0]) / xScaleSpan;
|
||
|
var scaleY = (end[1] - start[1]) / yScaleSpan;
|
||
|
var translateX = start[0] - xScaleExtent[0] * scaleX;
|
||
|
var translateY = start[1] - yScaleExtent[0] * scaleY;
|
||
|
var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY];
|
||
|
this._invTransform = invert([], m);
|
||
|
};
|
||
|
/**
|
||
|
* Base axis will be used on stacking.
|
||
|
*/
|
||
|
Cartesian2D.prototype.getBaseAxis = function () {
|
||
|
return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x');
|
||
|
};
|
||
|
Cartesian2D.prototype.containPoint = function (point) {
|
||
|
var axisX = this.getAxis('x');
|
||
|
var axisY = this.getAxis('y');
|
||
|
return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1]));
|
||
|
};
|
||
|
Cartesian2D.prototype.containData = function (data) {
|
||
|
return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]);
|
||
|
};
|
||
|
Cartesian2D.prototype.containZone = function (data1, data2) {
|
||
|
var zoneDiag1 = this.dataToPoint(data1);
|
||
|
var zoneDiag2 = this.dataToPoint(data2);
|
||
|
var area = this.getArea();
|
||
|
var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]);
|
||
|
return area.intersect(zone);
|
||
|
};
|
||
|
Cartesian2D.prototype.dataToPoint = function (data, clamp, out) {
|
||
|
out = out || [];
|
||
|
var xVal = data[0];
|
||
|
var yVal = data[1];
|
||
|
// Fast path
|
||
|
if (this._transform
|
||
|
// It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated.
|
||
|
&& xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) {
|
||
|
return applyTransform(out, data, this._transform);
|
||
|
}
|
||
|
var xAxis = this.getAxis('x');
|
||
|
var yAxis = this.getAxis('y');
|
||
|
out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp));
|
||
|
out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp));
|
||
|
return out;
|
||
|
};
|
||
|
Cartesian2D.prototype.clampData = function (data, out) {
|
||
|
var xScale = this.getAxis('x').scale;
|
||
|
var yScale = this.getAxis('y').scale;
|
||
|
var xAxisExtent = xScale.getExtent();
|
||
|
var yAxisExtent = yScale.getExtent();
|
||
|
var x = xScale.parse(data[0]);
|
||
|
var y = yScale.parse(data[1]);
|
||
|
out = out || [];
|
||
|
out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1]));
|
||
|
out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1]));
|
||
|
return out;
|
||
|
};
|
||
|
Cartesian2D.prototype.pointToData = function (point, clamp) {
|
||
|
var out = [];
|
||
|
if (this._invTransform) {
|
||
|
return applyTransform(out, point, this._invTransform);
|
||
|
}
|
||
|
var xAxis = this.getAxis('x');
|
||
|
var yAxis = this.getAxis('y');
|
||
|
out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp);
|
||
|
out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp);
|
||
|
return out;
|
||
|
};
|
||
|
Cartesian2D.prototype.getOtherAxis = function (axis) {
|
||
|
return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
|
||
|
};
|
||
|
/**
|
||
|
* Get rect area of cartesian.
|
||
|
* Area will have a contain function to determine if a point is in the coordinate system.
|
||
|
*/
|
||
|
Cartesian2D.prototype.getArea = function (tolerance) {
|
||
|
tolerance = tolerance || 0;
|
||
|
var xExtent = this.getAxis('x').getGlobalExtent();
|
||
|
var yExtent = this.getAxis('y').getGlobalExtent();
|
||
|
var x = Math.min(xExtent[0], xExtent[1]) - tolerance;
|
||
|
var y = Math.min(yExtent[0], yExtent[1]) - tolerance;
|
||
|
var width = Math.max(xExtent[0], xExtent[1]) - x + tolerance;
|
||
|
var height = Math.max(yExtent[0], yExtent[1]) - y + tolerance;
|
||
|
return new BoundingRect(x, y, width, height);
|
||
|
};
|
||
|
return Cartesian2D;
|
||
|
}(Cartesian);
|
||
|
;
|
||
|
export default Cartesian2D;
|