| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- var zrUtil = require("zrender/lib/core/util");
- var vector = require("zrender/lib/core/vector");
- var matrix = require("zrender/lib/core/matrix");
- var BoundingRect = require("zrender/lib/core/BoundingRect");
- var Transformable = require("zrender/lib/mixin/Transformable");
- /**
- * Simple view coordinate system
- * Mapping given x, y to transformd view x, y
- */
- var v2ApplyTransform = vector.applyTransform; // Dummy transform node
- function TransformDummy() {
- Transformable.call(this);
- }
- zrUtil.mixin(TransformDummy, Transformable);
- function View(name) {
- /**
- * @type {string}
- */
- this.name = name;
- /**
- * @type {Object}
- */
- this.zoomLimit;
- Transformable.call(this);
- this._roamTransform = new TransformDummy();
- this._viewTransform = new TransformDummy();
- this._center;
- this._zoom;
- }
- View.prototype = {
- constructor: View,
- type: 'view',
- /**
- * @param {Array.<string>}
- * @readOnly
- */
- dimensions: ['x', 'y'],
- /**
- * Set bounding rect
- * @param {number} x
- * @param {number} y
- * @param {number} width
- * @param {number} height
- */
- // PENDING to getRect
- setBoundingRect: function (x, y, width, height) {
- this._rect = new BoundingRect(x, y, width, height);
- return this._rect;
- },
- /**
- * @return {module:zrender/core/BoundingRect}
- */
- // PENDING to getRect
- getBoundingRect: function () {
- return this._rect;
- },
- /**
- * @param {number} x
- * @param {number} y
- * @param {number} width
- * @param {number} height
- */
- setViewRect: function (x, y, width, height) {
- this.transformTo(x, y, width, height);
- this._viewRect = new BoundingRect(x, y, width, height);
- },
- /**
- * Transformed to particular position and size
- * @param {number} x
- * @param {number} y
- * @param {number} width
- * @param {number} height
- */
- transformTo: function (x, y, width, height) {
- var rect = this.getBoundingRect();
- var viewTransform = this._viewTransform;
- viewTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));
- viewTransform.decomposeTransform();
- this._updateTransform();
- },
- /**
- * Set center of view
- * @param {Array.<number>} [centerCoord]
- */
- setCenter: function (centerCoord) {
- if (!centerCoord) {
- return;
- }
- this._center = centerCoord;
- this._updateCenterAndZoom();
- },
- /**
- * @param {number} zoom
- */
- setZoom: function (zoom) {
- zoom = zoom || 1;
- var zoomLimit = this.zoomLimit;
- if (zoomLimit) {
- if (zoomLimit.max != null) {
- zoom = Math.min(zoomLimit.max, zoom);
- }
- if (zoomLimit.min != null) {
- zoom = Math.max(zoomLimit.min, zoom);
- }
- }
- this._zoom = zoom;
- this._updateCenterAndZoom();
- },
- /**
- * Get default center without roam
- */
- getDefaultCenter: function () {
- // Rect before any transform
- var rawRect = this.getBoundingRect();
- var cx = rawRect.x + rawRect.width / 2;
- var cy = rawRect.y + rawRect.height / 2;
- return [cx, cy];
- },
- getCenter: function () {
- return this._center || this.getDefaultCenter();
- },
- getZoom: function () {
- return this._zoom || 1;
- },
- /**
- * @return {Array.<number}
- */
- getRoamTransform: function () {
- return this._roamTransform;
- },
- _updateCenterAndZoom: function () {
- // Must update after view transform updated
- var viewTransformMatrix = this._viewTransform.getLocalTransform();
- var roamTransform = this._roamTransform;
- var defaultCenter = this.getDefaultCenter();
- var center = this.getCenter();
- var zoom = this.getZoom();
- center = vector.applyTransform([], center, viewTransformMatrix);
- defaultCenter = vector.applyTransform([], defaultCenter, viewTransformMatrix);
- roamTransform.origin = center;
- roamTransform.position = [defaultCenter[0] - center[0], defaultCenter[1] - center[1]];
- roamTransform.scale = [zoom, zoom];
- this._updateTransform();
- },
- /**
- * Update transform from roam and mapLocation
- * @private
- */
- _updateTransform: function () {
- var roamTransform = this._roamTransform;
- var viewTransform = this._viewTransform;
- viewTransform.parent = roamTransform;
- roamTransform.updateTransform();
- viewTransform.updateTransform();
- viewTransform.transform && matrix.copy(this.transform || (this.transform = []), viewTransform.transform);
- if (this.transform) {
- this.invTransform = this.invTransform || [];
- matrix.invert(this.invTransform, this.transform);
- } else {
- this.invTransform = null;
- }
- this.decomposeTransform();
- },
- /**
- * @return {module:zrender/core/BoundingRect}
- */
- getViewRect: function () {
- return this._viewRect;
- },
- /**
- * Get view rect after roam transform
- * @return {module:zrender/core/BoundingRect}
- */
- getViewRectAfterRoam: function () {
- var rect = this.getBoundingRect().clone();
- rect.applyTransform(this.transform);
- return rect;
- },
- /**
- * Convert a single (lon, lat) data item to (x, y) point.
- * @param {Array.<number>} data
- * @return {Array.<number>}
- */
- dataToPoint: function (data) {
- var transform = this.transform;
- return transform ? v2ApplyTransform([], data, transform) : [data[0], data[1]];
- },
- /**
- * Convert a (x, y) point to (lon, lat) data
- * @param {Array.<number>} point
- * @return {Array.<number>}
- */
- pointToData: function (point) {
- var invTransform = this.invTransform;
- return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]];
- },
- /**
- * @implements
- * see {module:echarts/CoodinateSystem}
- */
- convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
- /**
- * @implements
- * see {module:echarts/CoodinateSystem}
- */
- convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),
- /**
- * @implements
- * see {module:echarts/CoodinateSystem}
- */
- containPoint: function (point) {
- return this.getViewRectAfterRoam().contain(point[0], point[1]);
- }
- /**
- * @return {number}
- */
- // getScalarScale: function () {
- // // Use determinant square root of transform to mutiply scalar
- // var m = this.transform;
- // var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1]));
- // return det;
- // }
- };
- zrUtil.mixin(View, Transformable);
- function doConvert(methodName, ecModel, finder, value) {
- var seriesModel = finder.seriesModel;
- var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.
- return coordSys === this ? coordSys[methodName](value) : null;
- }
- var _default = View;
- module.exports = _default;
|