/* * 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. */ 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"); /* * 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. */ /** * 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._roamTransformable = new TransformDummy(); this._rawTransformable = new TransformDummy(); this._center; this._zoom; } View.prototype = { constructor: View, type: 'view', /** * @param {Array.} * @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 rawTransform = this._rawTransformable; rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); rawTransform.decomposeTransform(); this._updateTransform(); }, /** * Set center of view * @param {Array.} [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.} data * @param {boolean} noRoam * @param {Array.} [out] * @return {Array.} */ dataToPoint: function (data, noRoam, out) { var transform = noRoam ? this._rawTransform : this.transform; out = out || []; return transform ? v2ApplyTransform(out, data, transform) : vector.copy(out, data); }, /** * Convert a (x, y) point to (lon, lat) data * @param {Array.} point * @return {Array.} */ 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;