(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["G"] = factory(); else root["G"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 62); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var CommonUtil = __webpack_require__(12); var Util = {}; CommonUtil.merge(Util, CommonUtil, { isColorProp: function isColorProp(k) { // 是否是颜色属性 return ['fill', 'stroke', 'fillStyle', 'strokeStyle'].includes(k); }, isGradientColor: function isGradientColor(v) { // 是否是渐变色 return /^[r,R,L,l]{1}[\s]*\(/.test(v); }, mixin: function mixin(c, mixins) { var Param = c.CFG ? 'CFG' : 'ATTRS'; if (c && mixins) { c._mixins = mixins; c[Param] = c[Param] || {}; var temp = {}; Util.each(mixins, function (mixin) { Util.augment(c, mixin); var attrs = mixin[Param]; if (attrs) { Util.merge(temp, attrs); } }); c[Param] = Util.merge(temp, c[Param]); } } }); module.exports = Util; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var isPointInPath = __webpack_require__(98); var Element = __webpack_require__(38); var Inside = __webpack_require__(19); var CLONE_CFGS = ['zIndex', 'capture', 'visible']; var Shape = function Shape(cfg) { Shape.superclass.constructor.call(this, cfg); }; Shape.ATTRS = {}; Util.extend(Shape, Element); var ARRAY_ATTRS = { matrix: 'matrix', path: 'path', points: 'points', lineDash: 'lineDash' }; function _cloneArrayAttr(arr) { var result = []; for (var i = 0; i < arr.length; i++) { if (Util.isArray(arr[i])) { result.push([].concat(arr[i])); } else { result.push(arr[i]); } } return result; } Util.augment(Shape, isPointInPath, { isShape: true, drawInner: function drawInner(context) { var self = this; var attrs = self._attrs; self.createPath(context); var originOpacity = context.globalAlpha; if (self.hasFill()) { var fillOpacity = attrs.fillOpacity; if (!Util.isNil(fillOpacity) && fillOpacity !== 1) { context.globalAlpha = fillOpacity; context.fill(); context.globalAlpha = originOpacity; } else { context.fill(); } } if (self.hasStroke()) { var lineWidth = self._attrs.lineWidth; if (lineWidth > 0) { var strokeOpacity = attrs.strokeOpacity; if (!Util.isNil(strokeOpacity) && strokeOpacity !== 1) { context.globalAlpha = strokeOpacity; } context.stroke(); } } self.afterPath(context); }, afterPath: function afterPath() {}, /** * 击中图形时是否进行包围盒判断 * @return {Boolean} [description] */ isHitBox: function isHitBox() { return true; }, /** * 节点是否能够被击中 * @param {Number} x x坐标 * @param {Number} y y坐标 * @return {Boolean} 是否在图形中 */ isHit: function isHit(x, y) { var self = this; var v = [x, y, 1]; self.invert(v); // canvas if (self.isHitBox()) { var box = self.getBBox(); if (box && !Inside.box(box.minX, box.maxX, box.minY, box.maxY, v[0], v[1])) { return false; } } var clip = self._attrs.clip; if (clip) { clip.invert(v, self.get('canvas')); if (clip.isPointInPath(v[0], v[1])) { return self.isPointInPath(v[0], v[1]); } } else { return self.isPointInPath(v[0], v[1]); } return false; }, /** * @protected * 计算包围盒 * @return {Object} 包围盒 */ calculateBox: function calculateBox() { return null; }, // 获取拾取时线的宽度,需要考虑附加的线的宽度 getHitLineWidth: function getHitLineWidth() { var attrs = this._attrs; // if (!attrs.stroke) { // return 0; // } var lineAppendWidth = attrs.lineAppendWidth || 0; var lineWidth = attrs.lineWidth || 0; return lineWidth + lineAppendWidth; }, // 清除当前的矩阵 clearTotalMatrix: function clearTotalMatrix() { this._cfg.totalMatrix = null; this._cfg.region = null; }, clearBBox: function clearBBox() { this._cfg.box = null; this._cfg.region = null; }, getBBox: function getBBox() { var box = this._cfg.box; // 延迟计算 if (!box) { box = this.calculateBox(); if (box) { box.x = box.minX; box.y = box.minY; box.width = box.maxX - box.minX; box.height = box.maxY - box.minY; } this._cfg.box = box; } return box; }, clone: function clone() { var self = this; var clone = null; var _attrs = self._attrs; var attrs = {}; Util.each(_attrs, function (i, k) { if (ARRAY_ATTRS[k] && Util.isArray(_attrs[k])) { attrs[k] = _cloneArrayAttr(_attrs[k]); } else { attrs[k] = _attrs[k]; } }); clone = new self.constructor({ attrs: attrs }); // 对于一些在 cfg 中的特殊属性做 clone Util.each(CLONE_CFGS, function (cfg) { clone._cfg[cfg] = self._cfg[cfg]; }); return clone; } }); module.exports = Shape; /***/ }), /* 2 */ /***/ (function(module, exports) { var toString = {}.toString; var isType = function isType(value, type) { return toString.call(value) === '[object ' + type + ']'; }; module.exports = isType; /***/ }), /* 3 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__color_js__ = __webpack_require__(25); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__color_js__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_0__color_js__["g"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_0__color_js__["f"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lab_js__ = __webpack_require__(115); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_1__lab_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_1__lab_js__["b"]; }); /* unused harmony reexport lch */ /* unused harmony reexport gray */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__cubehelix_js__ = __webpack_require__(116); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__cubehelix_js__["a"]; }); /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var regexTags = /[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/ig; var regexDot = /[^\s\,]+/ig; module.exports = { parseRadius: function parseRadius(radius) { var r1 = 0, r2 = 0, r3 = 0, r4 = 0; if (Util.isArray(radius)) { if (radius.length === 1) { r1 = r2 = r3 = r4 = radius[0]; } else if (radius.length === 2) { r1 = r3 = radius[0]; r2 = r4 = radius[1]; } else if (radius.length === 3) { r1 = radius[0]; r2 = r4 = radius[1]; r3 = radius[2]; } else { r1 = radius[0]; r2 = radius[1]; r3 = radius[2]; r4 = radius[3]; } } else { r1 = r2 = r3 = r4 = radius; } return { r1: r1, r2: r2, r3: r3, r4: r4 }; }, parsePath: function parsePath(path) { path = path || []; if (Util.isArray(path)) { return path; } if (Util.isString(path)) { path = path.match(regexTags); Util.each(path, function (item, index) { item = item.match(regexDot); if (item[0].length > 1) { var tag = item[0].charAt(0); item.splice(1, 0, item[0].substr(1)); item[0] = tag; } Util.each(item, function (sub, i) { if (!isNaN(sub)) { item[i] = +sub; } }); path[index] = item; }); return path; } } }; /***/ }), /* 5 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["c"] = hue; /* harmony export (immutable) */ __webpack_exports__["b"] = gamma; /* harmony export (immutable) */ __webpack_exports__["a"] = nogamma; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(57); function linear(a, d) { return function (t) { return a + t * d; }; } function exponential(a, b, y) { return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { return Math.pow(a + t * b, y); }; } function hue(a, b) { var d = b - a; return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__["a" /* default */])(isNaN(a) ? b : a); } function gamma(y) { return (y = +y) === 1 ? nogamma : function (a, b) { return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__["a" /* default */])(isNaN(a) ? b : a); }; } function nogamma(a, b) { var d = b - a; return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__["a" /* default */])(isNaN(a) ? b : a); } /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { var isType = __webpack_require__(2); var isArray = Array.isArray ? Array.isArray : function (value) { return isType(value, 'Array'); }; module.exports = isArray; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { var vec2 = __webpack_require__(0).vec2; module.exports = { at: function at(p1, p2, t) { return (p2 - p1) * t + p1; }, pointDistance: function pointDistance(x1, y1, x2, y2, x, y) { var d = [x2 - x1, y2 - y1]; if (vec2.exactEquals(d, [0, 0])) { return NaN; } var u = [-d[1], d[0]]; vec2.normalize(u, u); var a = [x - x1, y - y1]; return Math.abs(vec2.dot(a, u)); }, box: function box(x1, y1, x2, y2, lineWidth) { var halfWidth = lineWidth / 2; var minX = Math.min(x1, x2); var maxX = Math.max(x1, x2); var minY = Math.min(y1, y2); var maxY = Math.max(y1, y2); return { minX: minX - halfWidth, minY: minY - halfWidth, maxX: maxX + halfWidth, maxY: maxY + halfWidth }; }, len: function len(x1, y1, x2, y2) { return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } }; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); function circlePoint(cx, cy, r, angle) { return { x: Math.cos(angle) * r + cx, y: Math.sin(angle) * r + cy }; } function angleNearTo(angle, min, max, out) { var v1; var v2; if (out) { if (angle < min) { v1 = min - angle; v2 = Math.PI * 2 - max + angle; } else if (angle > max) { v1 = Math.PI * 2 - angle + min; v2 = angle - max; } } else { v1 = angle - min; v2 = max - angle; } return v1 > v2 ? max : min; } function nearAngle(angle, startAngle, endAngle, clockwise) { var plus = 0; if (endAngle - startAngle >= Math.PI * 2) { plus = Math.PI * 2; } startAngle = Util.mod(startAngle, Math.PI * 2); endAngle = Util.mod(endAngle, Math.PI * 2) + plus; angle = Util.mod(angle, Math.PI * 2); if (clockwise) { if (startAngle >= endAngle) { if (angle > endAngle && angle < startAngle) { return angle; } return angleNearTo(angle, endAngle, startAngle, true); } if (angle < startAngle || angle > endAngle) { return angle; } return angleNearTo(angle, startAngle, endAngle); } if (startAngle <= endAngle) { if (startAngle < angle && angle < endAngle) { return angle; } return angleNearTo(angle, startAngle, endAngle, true); } if (angle > startAngle || angle < endAngle) { return angle; } return angleNearTo(angle, endAngle, startAngle); } function arcProjectPoint(cx, cy, r, startAngle, endAngle, clockwise, x, y, out) { var v = [x, y]; var v0 = [cx, cy]; var v1 = [1, 0]; var subv = Util.vec2.subtract([], v, v0); var angle = Util.vec2.angleTo(v1, subv); angle = nearAngle(angle, startAngle, endAngle, clockwise); var vpoint = [r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]; if (out) { out.x = vpoint[0]; out.y = vpoint[1]; } var d = Util.vec2.distance(vpoint, v); return d; } function arcBox(cx, cy, r, startAngle, endAngle, clockwise) { var angleRight = 0; var angleBottom = Math.PI / 2; var angleLeft = Math.PI; var angleTop = Math.PI * 3 / 2; var points = []; var angle = nearAngle(angleRight, startAngle, endAngle, clockwise); if (angle === angleRight) { points.push(circlePoint(cx, cy, r, angleRight)); } angle = nearAngle(angleBottom, startAngle, endAngle, clockwise); if (angle === angleBottom) { points.push(circlePoint(cx, cy, r, angleBottom)); } angle = nearAngle(angleLeft, startAngle, endAngle, clockwise); if (angle === angleLeft) { points.push(circlePoint(cx, cy, r, angleLeft)); } angle = nearAngle(angleTop, startAngle, endAngle, clockwise); if (angle === angleTop) { points.push(circlePoint(cx, cy, r, angleTop)); } points.push(circlePoint(cx, cy, r, startAngle)); points.push(circlePoint(cx, cy, r, endAngle)); var minX = Infinity; var maxX = -Infinity; var minY = Infinity; var maxY = -Infinity; Util.each(points, function (point) { if (minX > point.x) { minX = point.x; } if (maxX < point.x) { maxX = point.x; } if (minY > point.y) { minY = point.y; } if (maxY < point.y) { maxY = point.y; } }); return { minX: minX, minY: minY, maxX: maxX, maxY: maxY }; } module.exports = { nearAngle: nearAngle, projectPoint: function projectPoint(cx, cy, r, startAngle, endAngle, clockwise, x, y) { var rst = {}; arcProjectPoint(cx, cy, r, startAngle, endAngle, clockwise, x, y, rst); return rst; }, pointDistance: arcProjectPoint, box: arcBox }; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { var Format = __webpack_require__(4); var PathSegment = __webpack_require__(10); var PI = Math.PI; var sin = Math.sin; var cos = Math.cos; var atan2 = Math.atan2; var DEFAULT_LENGTH = 10; var DEFAULT_ANGLE = PI / 3; function _addArrow(ctx, attrs, x1, y1, x2, y2, isStart) { var leftX; var leftY; var rightX; var rightY; var offsetX; var offsetY; var angle; if (!attrs.fill) { // 闭合的不绘制箭头 var arrowLength = attrs.arrowLength || DEFAULT_LENGTH; var arrowAngle = attrs.arrowAngle ? attrs.arrowAngle * PI / 180 : DEFAULT_ANGLE; // 转换为弧 // Calculate angle angle = atan2(y1 - y2, x1 - x2); /* // Adjust angle correctly angle -= PI;*/ // Calculate offset to place arrow at edge of path offsetX = Math.abs(attrs.lineWidth * cos(angle)) / 2; offsetY = Math.abs(attrs.lineWidth * sin(angle)) / 2; if (isStart) { offsetX = -offsetX; offsetY = -offsetY; } // Calculate coordinates for left half of arrow leftX = x2 + arrowLength * cos(angle + arrowAngle / 2); leftY = y2 + arrowLength * sin(angle + arrowAngle / 2); // Calculate coordinates for right half of arrow rightX = x2 + arrowLength * cos(angle - arrowAngle / 2); rightY = y2 + arrowLength * sin(angle - arrowAngle / 2); ctx.beginPath(); // Draw left half of arrow ctx.moveTo(leftX - offsetX, leftY - offsetY); ctx.lineTo(x2 - offsetX, y2 - offsetY); // Draw right half of arrow ctx.lineTo(rightX - offsetX, rightY - offsetY); // Visually connect arrow to path ctx.moveTo(x2 - offsetX, y2 - offsetY); ctx.lineTo(x2 + offsetX, y2 + offsetY); // Move back to end of path ctx.moveTo(x2, y2); ctx.stroke(); } } function parsePath(attrs) { var segments = []; var pathArray = Format.parsePath(attrs.path); var preSegment; if (!Array.isArray(pathArray) || pathArray.length === 0 || pathArray[0][0] !== 'M' && pathArray[0][0] !== 'm') { return false; } var count = pathArray.length; for (var i = 0; i < pathArray.length; i++) { var item = pathArray[i]; preSegment = new PathSegment(item, preSegment, i === count - 1); segments.push(preSegment); } return segments; } /** * 如果自定义箭头并且有 d 需要做偏移,如果直接画,线条会超出箭头尖端,因此需要根据箭头偏移 d, 返回线需要缩短的距离 * |---------------- * |<|-------------- * | * @param {Number} x1 起始点 x * @param {number} y1 起始点 y * @param {number} x2 箭头作用点 x * @param {number} y2 箭头作用点 y * @param {number} d 箭头沿线条方向的偏移距离 * @return {{dx: number, dy: number}} 返回线条偏移距离 */ function getShortenOffset(x1, y1, x2, y2, d) { var rad = Math.atan2(y2 - y1, x2 - x1); return { dx: cos(rad) * d, dy: sin(rad) * d }; } function _addCustomizedArrow(ctx, attrs, x1, y1, x2, y2, isStart) { var shape = isStart ? attrs.startArrow : attrs.endArrow; var d = shape.d; var x = x2 - x1; var y = y2 - y1; var rad = Math.atan2(y, x); var path = parsePath(shape); if (!path) { return; } if (d) { x2 = x2 - cos(rad) * d; y2 = y2 - sin(rad) * d; } ctx.save(); ctx.beginPath(); ctx.translate(x2, y2); ctx.rotate(rad); for (var i = 0; i < path.length; i++) { path[i].draw(ctx); } ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.fillStyle = ctx.strokeStyle; ctx.fill(); ctx.restore(); } module.exports = { addStartArrow: function addStartArrow(ctx, attrs, x1, y1, x2, y2) { if (typeof attrs.startArrow === 'object') { _addCustomizedArrow(ctx, attrs, x1, y1, x2, y2, true); } else if (attrs.startArrow) { _addArrow(ctx, attrs, x1, y1, x2, y2, true); } }, addEndArrow: function addEndArrow(ctx, attrs, x1, y1, x2, y2) { if (typeof attrs.endArrow === 'object') { _addCustomizedArrow(ctx, attrs, x1, y1, x2, y2, false); } else if (attrs.endArrow) { _addArrow(ctx, attrs, x1, y1, x2, y2, false); } }, getShortenOffset: getShortenOffset }; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Inside = __webpack_require__(19); var Cubic = __webpack_require__(20); var Quadratic = __webpack_require__(40); var Ellipse = __webpack_require__(41); var vec3 = Util.vec3; var mat3 = Util.mat3; var ARR_CMD = ['m', 'l', 'c', 'a', 'q', 'h', 'v', 't', 's', 'z']; function toAbsolute(x, y, curPoint) { // 获取绝对坐标 return { x: curPoint.x + x, y: curPoint.y + y }; } function toSymmetry(point, center) { // 点对称 return { x: center.x + (center.x - point.x), y: center.y + (center.y - point.y) }; } function vMag(v) { return Math.sqrt(v[0] * v[0] + v[1] * v[1]); } function vRatio(u, v) { return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); } function vAngle(u, v) { return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v)); } function getArcParams(point1, point2, fa, fs, rx, ry, psiDeg) { var psi = Util.mod(Util.toRadian(psiDeg), Math.PI * 2); var x1 = point1.x; var y1 = point1.y; var x2 = point2.x; var y2 = point2.y; var xp = Math.cos(psi) * (x1 - x2) / 2.0 + Math.sin(psi) * (y1 - y2) / 2.0; var yp = -1 * Math.sin(psi) * (x1 - x2) / 2.0 + Math.cos(psi) * (y1 - y2) / 2.0; var lambda = xp * xp / (rx * rx) + yp * yp / (ry * ry); if (lambda > 1) { rx *= Math.sqrt(lambda); ry *= Math.sqrt(lambda); } var diff = rx * rx * (yp * yp) + ry * ry * (xp * xp); var f = Math.sqrt((rx * rx * (ry * ry) - diff) / diff); if (fa === fs) { f *= -1; } if (isNaN(f)) { f = 0; } var cxp = f * rx * yp / ry; var cyp = f * -ry * xp / rx; var cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp; var cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp; var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); var u = [(xp - cxp) / rx, (yp - cyp) / ry]; var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; var dTheta = vAngle(u, v); if (vRatio(u, v) <= -1) { dTheta = Math.PI; } if (vRatio(u, v) >= 1) { dTheta = 0; } if (fs === 0 && dTheta > 0) { dTheta = dTheta - 2 * Math.PI; } if (fs === 1 && dTheta < 0) { dTheta = dTheta + 2 * Math.PI; } return [point1, cx, cy, rx, ry, theta, dTheta, psi, fs]; } var PathSegment = function PathSegment(item, preSegment, isLast) { this.preSegment = preSegment; this.isLast = isLast; this.init(item, preSegment); }; Util.augment(PathSegment, { init: function init(item, preSegment) { var command = item[0]; preSegment = preSegment || { endPoint: { x: 0, y: 0 } }; var relative = ARR_CMD.indexOf(command) >= 0; // /[a-z]/.test(command); var cmd = relative ? command.toUpperCase() : command; var p = item; var point1; var point2; var point3; var point; var preEndPoint = preSegment.endPoint; var p1 = p[1]; var p2 = p[2]; switch (cmd) { default: break; case 'M': if (relative) { point = toAbsolute(p1, p2, preEndPoint); } else { point = { x: p1, y: p2 }; } this.command = 'M'; this.params = [preEndPoint, point]; this.subStart = point; this.endPoint = point; break; case 'L': if (relative) { point = toAbsolute(p1, p2, preEndPoint); } else { point = { x: p1, y: p2 }; } this.command = 'L'; this.params = [preEndPoint, point]; this.subStart = preSegment.subStart; this.endPoint = point; this.endTangent = function () { return [point.x - preEndPoint.x, point.y - preEndPoint.y]; }; this.startTangent = function () { return [preEndPoint.x - point.x, preEndPoint.y - point.y]; }; break; case 'H': if (relative) { point = toAbsolute(p1, 0, preEndPoint); } else { point = { x: p1, y: preEndPoint.y }; } this.command = 'L'; this.params = [preEndPoint, point]; this.subStart = preSegment.subStart; this.endPoint = point; this.endTangent = function () { return [point.x - preEndPoint.x, point.y - preEndPoint.y]; }; this.startTangent = function () { return [preEndPoint.x - point.x, preEndPoint.y - point.y]; }; break; case 'V': if (relative) { point = toAbsolute(0, p1, preEndPoint); } else { point = { x: preEndPoint.x, y: p1 }; } this.command = 'L'; this.params = [preEndPoint, point]; this.subStart = preSegment.subStart; this.endPoint = point; this.endTangent = function () { return [point.x - preEndPoint.x, point.y - preEndPoint.y]; }; this.startTangent = function () { return [preEndPoint.x - point.x, preEndPoint.y - point.y]; }; break; case 'Q': if (relative) { point1 = toAbsolute(p1, p2, preEndPoint); point2 = toAbsolute(p[3], p[4], preEndPoint); } else { point1 = { x: p1, y: p2 }; point2 = { x: p[3], y: p[4] }; } this.command = 'Q'; this.params = [preEndPoint, point1, point2]; this.subStart = preSegment.subStart; this.endPoint = point2; this.endTangent = function () { return [point2.x - point1.x, point2.y - point1.y]; }; this.startTangent = function () { return [preEndPoint.x - point1.x, preEndPoint.y - point1.y]; }; break; case 'T': if (relative) { point2 = toAbsolute(p1, p2, preEndPoint); } else { point2 = { x: p1, y: p2 }; } if (preSegment.command === 'Q') { point1 = toSymmetry(preSegment.params[1], preEndPoint); this.command = 'Q'; this.params = [preEndPoint, point1, point2]; this.subStart = preSegment.subStart; this.endPoint = point2; this.endTangent = function () { return [point2.x - point1.x, point2.y - point1.y]; }; this.startTangent = function () { return [preEndPoint.x - point1.x, preEndPoint.y - point1.y]; }; } else { this.command = 'TL'; this.params = [preEndPoint, point2]; this.subStart = preSegment.subStart; this.endPoint = point2; this.endTangent = function () { return [point2.x - preEndPoint.x, point2.y - preEndPoint.y]; }; this.startTangent = function () { return [preEndPoint.x - point2.x, preEndPoint.y - point2.y]; }; } break; case 'C': if (relative) { point1 = toAbsolute(p1, p2, preEndPoint); point2 = toAbsolute(p[3], p[4], preEndPoint); point3 = toAbsolute(p[5], p[6], preEndPoint); } else { point1 = { x: p1, y: p2 }; point2 = { x: p[3], y: p[4] }; point3 = { x: p[5], y: p[6] }; } this.command = 'C'; this.params = [preEndPoint, point1, point2, point3]; this.subStart = preSegment.subStart; this.endPoint = point3; this.endTangent = function () { return [point3.x - point2.x, point3.y - point2.y]; }; this.startTangent = function () { return [preEndPoint.x - point1.x, preEndPoint.y - point1.y]; }; break; case 'S': if (relative) { point2 = toAbsolute(p1, p2, preEndPoint); point3 = toAbsolute(p[3], p[4], preEndPoint); } else { point2 = { x: p1, y: p2 }; point3 = { x: p[3], y: p[4] }; } if (preSegment.command === 'C') { point1 = toSymmetry(preSegment.params[2], preEndPoint); this.command = 'C'; this.params = [preEndPoint, point1, point2, point3]; this.subStart = preSegment.subStart; this.endPoint = point3; this.endTangent = function () { return [point3.x - point2.x, point3.y - point2.y]; }; this.startTangent = function () { return [preEndPoint.x - point1.x, preEndPoint.y - point1.y]; }; } else { this.command = 'SQ'; this.params = [preEndPoint, point2, point3]; this.subStart = preSegment.subStart; this.endPoint = point3; this.endTangent = function () { return [point3.x - point2.x, point3.y - point2.y]; }; this.startTangent = function () { return [preEndPoint.x - point2.x, preEndPoint.y - point2.y]; }; } break; case 'A': { var rx = p1; var ry = p2; var psi = p[3]; var fa = p[4]; var fs = p[5]; if (relative) { point = toAbsolute(p[6], p[7], preEndPoint); } else { point = { x: p[6], y: p[7] }; } this.command = 'A'; var params = getArcParams(preEndPoint, point, fa, fs, rx, ry, psi); this.params = params; var start = preSegment.subStart; this.subStart = start; this.endPoint = point; var startAngle = params[5] % (Math.PI * 2); if (Util.isNumberEqual(startAngle, Math.PI * 2)) { startAngle = 0; } var endAngle = params[6] % (Math.PI * 2); if (Util.isNumberEqual(endAngle, Math.PI * 2)) { endAngle = 0; } var d = 0.001; this.startTangent = function () { if (fs === 0) { d *= -1; } var dx = params[3] * Math.cos(startAngle - d) + params[1]; var dy = params[4] * Math.sin(startAngle - d) + params[2]; return [dx - start.x, dy - start.y]; }; this.endTangent = function () { var endAngle = params[6]; if (endAngle - Math.PI * 2 < 0.0001) { endAngle = 0; } var dx = params[3] * Math.cos(startAngle + endAngle + d) + params[1]; var dy = params[4] * Math.sin(startAngle + endAngle - d) + params[2]; return [preEndPoint.x - dx, preEndPoint.y - dy]; }; break; } case 'Z': { this.command = 'Z'; this.params = [preEndPoint, preSegment.subStart]; this.subStart = preSegment.subStart; this.endPoint = preSegment.subStart; } } }, isInside: function isInside(x, y, lineWidth) { var self = this; var command = self.command; var params = self.params; var box = self.box; if (box) { if (!Inside.box(box.minX, box.maxX, box.minY, box.maxY, x, y)) { return false; } } switch (command) { default: break; case 'M': return false; case 'TL': case 'L': case 'Z': return Inside.line(params[0].x, params[0].y, params[1].x, params[1].y, lineWidth, x, y); case 'SQ': case 'Q': return Inside.quadraticline(params[0].x, params[0].y, params[1].x, params[1].y, params[2].x, params[2].y, lineWidth, x, y); case 'C': { return Inside.cubicline(params[0].x, params[0].y, params[1].x, params[1].y, params[2].x, params[2].y, params[3].x, params[3].y, lineWidth, x, y); } case 'A': { var p = params; var cx = p[1]; var cy = p[2]; var rx = p[3]; var ry = p[4]; var theta = p[5]; var dTheta = p[6]; var psi = p[7]; var fs = p[8]; var r = rx > ry ? rx : ry; var scaleX = rx > ry ? 1 : rx / ry; var scaleY = rx > ry ? ry / rx : 1; p = [x, y, 1]; var m = [1, 0, 0, 0, 1, 0, 0, 0, 1]; mat3.translate(m, m, [-cx, -cy]); mat3.rotate(m, m, -psi); mat3.scale(m, m, [1 / scaleX, 1 / scaleY]); vec3.transformMat3(p, p, m); return Inside.arcline(0, 0, r, theta, theta + dTheta, 1 - fs, lineWidth, p[0], p[1]); } } return false; }, draw: function draw(context) { var command = this.command; var params = this.params; var point1; var point2; var point3; switch (command) { default: break; case 'M': context.moveTo(params[1].x, params[1].y); break; case 'TL': case 'L': context.lineTo(params[1].x, params[1].y); break; case 'SQ': case 'Q': point1 = params[1]; point2 = params[2]; context.quadraticCurveTo(point1.x, point1.y, point2.x, point2.y); break; case 'C': point1 = params[1]; point2 = params[2]; point3 = params[3]; context.bezierCurveTo(point1.x, point1.y, point2.x, point2.y, point3.x, point3.y); break; case 'A': { var p = params; var p1 = p[1]; var p2 = p[2]; var cx = p1; var cy = p2; var rx = p[3]; var ry = p[4]; var theta = p[5]; var dTheta = p[6]; var psi = p[7]; var fs = p[8]; var r = rx > ry ? rx : ry; var scaleX = rx > ry ? 1 : rx / ry; var scaleY = rx > ry ? ry / rx : 1; context.translate(cx, cy); context.rotate(psi); context.scale(scaleX, scaleY); context.arc(0, 0, r, theta, theta + dTheta, 1 - fs); context.scale(1 / scaleX, 1 / scaleY); context.rotate(-psi); context.translate(-cx, -cy); break; } case 'Z': context.closePath(); break; } }, shortenDraw: function shortenDraw(context, dx, dy) { var command = this.command; var params = this.params; var point1; var point2; var point3; switch (command) { default: break; case 'M': context.moveTo(params[1].x - dx, params[1].y - dy); break; case 'TL': case 'L': context.lineTo(params[1].x - dx, params[1].y - dy); break; case 'SQ': case 'Q': point1 = params[1]; point2 = params[2]; context.quadraticCurveTo(point1.x, point1.y, point2.x - dx, point2.y - dy); break; case 'C': point1 = params[1]; point2 = params[2]; point3 = params[3]; context.bezierCurveTo(point1.x, point1.y, point2.x, point2.y, point3.x - dx, point3.y - dy); break; case 'A': { var p = params; var p1 = p[1]; var p2 = p[2]; var cx = p1; var cy = p2; var rx = p[3]; var ry = p[4]; var theta = p[5]; var dTheta = p[6]; var psi = p[7]; var fs = p[8]; var r = rx > ry ? rx : ry; var scaleX = rx > ry ? 1 : rx / ry; var scaleY = rx > ry ? ry / rx : 1; context.translate(cx, cy); context.rotate(psi); context.scale(scaleX, scaleY); context.arc(0, 0, r, theta, theta + dTheta, 1 - fs); context.scale(1 / scaleX, 1 / scaleY); context.rotate(-psi); context.translate(-cx, -cy); break; } case 'Z': context.closePath(); break; } }, getBBox: function getBBox(lineWidth) { var halfWidth = lineWidth / 2; var params = this.params; var yDims; var xDims; var i; var l; switch (this.command) { default: case 'M': case 'Z': break; case 'TL': case 'L': this.box = { minX: Math.min(params[0].x, params[1].x) - halfWidth, maxX: Math.max(params[0].x, params[1].x) + halfWidth, minY: Math.min(params[0].y, params[1].y) - halfWidth, maxY: Math.max(params[0].y, params[1].y) + halfWidth }; break; case 'SQ': case 'Q': xDims = Quadratic.extrema(params[0].x, params[1].x, params[2].x); for (i = 0, l = xDims.length; i < l; i++) { xDims[i] = Quadratic.at(params[0].x, params[1].x, params[2].x, xDims[i]); } xDims.push(params[0].x, params[2].x); yDims = Quadratic.extrema(params[0].y, params[1].y, params[2].y); for (i = 0, l = yDims.length; i < l; i++) { yDims[i] = Quadratic.at(params[0].y, params[1].y, params[2].y, yDims); } yDims.push(params[0].y, params[2].y); this.box = { minX: Math.min.apply(Math, xDims) - halfWidth, maxX: Math.max.apply(Math, xDims) + halfWidth, minY: Math.min.apply(Math, yDims) - halfWidth, maxY: Math.max.apply(Math, yDims) + halfWidth }; break; case 'C': xDims = Cubic.extrema(params[0].x, params[1].x, params[2].x, params[3].x); for (i = 0, l = xDims.length; i < l; i++) { xDims[i] = Cubic.at(params[0].x, params[1].x, params[2].x, params[3].x, xDims[i]); } yDims = Cubic.extrema(params[0].y, params[1].y, params[2].y, params[3].y); for (i = 0, l = yDims.length; i < l; i++) { yDims[i] = Cubic.at(params[0].y, params[1].y, params[2].y, params[3].y, yDims[i]); } xDims.push(params[0].x, params[3].x); yDims.push(params[0].y, params[3].y); this.box = { minX: Math.min.apply(Math, xDims) - halfWidth, maxX: Math.max.apply(Math, xDims) + halfWidth, minY: Math.min.apply(Math, yDims) - halfWidth, maxY: Math.max.apply(Math, yDims) + halfWidth }; break; case 'A': { // todo 待优化 var p = params; var cx = p[1]; var cy = p[2]; var rx = p[3]; var ry = p[4]; var theta = p[5]; var dTheta = p[6]; var psi = p[7]; var fs = p[8]; var start = theta; var end = theta + dTheta; var xDim = Ellipse.xExtrema(psi, rx, ry); var minX = Infinity; var maxX = -Infinity; var xs = [start, end]; for (i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) { var xAngle = xDim + i; if (fs === 1) { if (start < xAngle && xAngle < end) { xs.push(xAngle); } } else { if (end < xAngle && xAngle < start) { xs.push(xAngle); } } } for (i = 0, l = xs.length; i < l; i++) { var x = Ellipse.xAt(psi, rx, ry, cx, xs[i]); if (x < minX) { minX = x; } if (x > maxX) { maxX = x; } } var yDim = Ellipse.yExtrema(psi, rx, ry); var minY = Infinity; var maxY = -Infinity; var ys = [start, end]; for (i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) { var yAngle = yDim + i; if (fs === 1) { if (start < yAngle && yAngle < end) { ys.push(yAngle); } } else { if (end < yAngle && yAngle < start) { ys.push(yAngle); } } } for (i = 0, l = ys.length; i < l; i++) { var y = Ellipse.yAt(psi, rx, ry, cy, ys[i]); if (y < minY) { minY = y; } if (y > maxY) { maxY = y; } } this.box = { minX: minX - halfWidth, maxX: maxX + halfWidth, minY: minY - halfWidth, maxY: maxY + halfWidth }; break; } } } }); module.exports = PathSegment; /***/ }), /* 11 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { return a = +a, b -= a, function (t) { return a + b * t; }; }); /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { isFunction: __webpack_require__(13), isObject: __webpack_require__(28), isBoolean: __webpack_require__(66), isNil: __webpack_require__(14), isString: __webpack_require__(29), isArray: __webpack_require__(6), isNumber: __webpack_require__(67), isEmpty: __webpack_require__(68), // isBlank uniqueId: __webpack_require__(71), clone: __webpack_require__(30), deepMix: __webpack_require__(31), assign: __webpack_require__(16), // simpleMix merge: __webpack_require__(31), // mix upperFirst: __webpack_require__(73), // ucfirst each: __webpack_require__(33), isEqual: __webpack_require__(75), toArray: __webpack_require__(34), extend: __webpack_require__(76), augment: __webpack_require__(77), remove: __webpack_require__(78), isNumberEqual: __webpack_require__(79), toRadian: __webpack_require__(80), toDegree: __webpack_require__(81), mod: __webpack_require__(82), clamp: __webpack_require__(35), createDom: __webpack_require__(83), modifyCSS: __webpack_require__(84), requestAnimationFrame: __webpack_require__(85), getRatio: function getRatio() { return window.devicePixelRatio ? window.devicePixelRatio : 2; }, mat3: __webpack_require__(36), vec2: __webpack_require__(87), vec3: __webpack_require__(89), transform: __webpack_require__(91) }; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { /** * 是否为函数 * @param {*} fn 对象 * @return {Boolean} 是否函数 */ var isType = __webpack_require__(2); var isFunction = function isFunction(value) { return isType(value, 'Function'); }; module.exports = isFunction; /***/ }), /* 14 */ /***/ (function(module, exports) { // isFinite, var isNil = function isNil(value) { /** * isNil(null) => true * isNil() => true */ return value === null || value === undefined; }; module.exports = isNil; /***/ }), /* 15 */ /***/ (function(module, exports) { var isArrayLike = function isArrayLike(value) { /** * isArrayLike([1, 2, 3]) => true * isArrayLike(document.body.children) => true * isArrayLike('abc') => true * isArrayLike(Function) => false */ return value !== null && typeof value !== 'function' && isFinite(value.length); }; module.exports = isArrayLike; /***/ }), /* 16 */ /***/ (function(module, exports) { function _mix(dist, obj) { for (var key in obj) { if (obj.hasOwnProperty(key) && key !== 'constructor' && obj[key] !== undefined) { dist[key] = obj[key]; } } } var mix = function mix(dist, src1, src2, src3) { if (src1) _mix(dist, src1); if (src2) _mix(dist, src2); if (src3) _mix(dist, src3); return dist; }; module.exports = mix; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setMatrixArrayType = setMatrixArrayType; exports.toRadian = toRadian; exports.equals = equals; /** * Common utilities * @module glMatrix */ // Configuration Constants var EPSILON = exports.EPSILON = 0.000001; var ARRAY_TYPE = exports.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; var RANDOM = exports.RANDOM = Math.random; /** * Sets the type of array used when creating new vectors and matrices * * @param {Type} type Array type, such as Float32Array or Array */ function setMatrixArrayType(type) { exports.ARRAY_TYPE = ARRAY_TYPE = type; } var degree = Math.PI / 180; /** * Convert Degree To Radian * * @param {Number} a Angle in Degrees */ function toRadian(a) { return a * degree; } /** * Tests whether or not the arguments have approximately the same value, within an absolute * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less * than or equal to 1.0, and a relative tolerance is used for larger values) * * @param {Number} a The first number to test. * @param {Number} b The second number to test. * @returns {Boolean} True if the numbers are approximately equal, false otherwise. */ function equals(a, b) { return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); } /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Event = function Event(type, event, bubbles, cancelable) { this.type = type; // 事件类型 this.target = null; // 目标 this.currentTarget = null; // 当前目标 this.bubbles = bubbles; // 冒泡 this.cancelable = cancelable; // 是否能够阻止 this.timeStamp = new Date().getTime(); // 时间戳 this.defaultPrevented = false; // 阻止默认 this.propagationStopped = false; // 阻止冒泡 this.removed = false; // 是否被移除 this.event = event; // 触发的原生事件 }; Util.augment(Event, { preventDefault: function preventDefault() { this.defaultPrevented = this.cancelable && true; }, stopPropagation: function stopPropagation() { this.propagationStopped = true; }, remove: function remove() { this.remove = true; }, clone: function clone() { return Util.clone(this); }, toString: function toString() { return '[Event (type=' + this.type + ')]'; } }); module.exports = Event; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { var Line = __webpack_require__(7); var Quadratic = __webpack_require__(40); var Cubic = __webpack_require__(20); var Arc = __webpack_require__(8); module.exports = { line: function line(x1, y1, x2, y2, lineWidth, x, y) { var box = Line.box(x1, y1, x2, y2, lineWidth); if (!this.box(box.minX, box.maxX, box.minY, box.maxY, x, y)) { return false; } var d = Line.pointDistance(x1, y1, x2, y2, x, y); if (isNaN(d)) { return false; } return d <= lineWidth / 2; }, polyline: function polyline(points, lineWidth, x, y) { var l = points.length - 1; if (l < 1) { return false; } for (var i = 0; i < l; i++) { var x1 = points[i][0]; var y1 = points[i][1]; var x2 = points[i + 1][0]; var y2 = points[i + 1][1]; if (this.line(x1, y1, x2, y2, lineWidth, x, y)) { return true; } } return false; }, cubicline: function cubicline(x1, y1, x2, y2, x3, y3, x4, y4, lineWidth, x, y) { return Cubic.pointDistance(x1, y1, x2, y2, x3, y3, x4, y4, x, y) <= lineWidth / 2; }, quadraticline: function quadraticline(x1, y1, x2, y2, x3, y3, lineWidth, x, y) { return Quadratic.pointDistance(x1, y1, x2, y2, x3, y3, x, y) <= lineWidth / 2; }, arcline: function arcline(cx, cy, r, startAngle, endAngle, clockwise, lineWidth, x, y) { return Arc.pointDistance(cx, cy, r, startAngle, endAngle, clockwise, x, y) <= lineWidth / 2; }, rect: function rect(rx, ry, width, height, x, y) { return rx <= x && x <= rx + width && ry <= y && y <= ry + height; }, circle: function circle(cx, cy, r, x, y) { return Math.pow(x - cx, 2) + Math.pow(y - cy, 2) <= Math.pow(r, 2); }, box: function box(minX, maxX, minY, maxY, x, y) { return minX <= x && x <= maxX && minY <= y && y <= maxY; } }; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var vec2 = Util.vec2; function cubicAt(p0, p1, p2, p3, t) { var onet = 1 - t; return onet * onet * (onet * p3 + 3 * t * p2) + t * t * (t * p0 + 3 * onet * p1); } function cubicDerivativeAt(p0, p1, p2, p3, t) { var onet = 1 - t; return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + (p3 - p2) * t * t); } function cubicProjectPoint(x1, y1, x2, y2, x3, y3, x4, y4, x, y, out) { var t; var interval = 0.005; var d = Infinity; var _t; var v1; var d1; var d2; var v2; var prev; var next; var EPSILON = 0.0001; var v0 = [x, y]; for (_t = 0; _t < 1; _t += 0.05) { v1 = [cubicAt(x1, x2, x3, x4, _t), cubicAt(y1, y2, y3, y4, _t)]; d1 = vec2.squaredDistance(v0, v1); if (d1 < d) { t = _t; d = d1; } } d = Infinity; for (var i = 0; i < 32; i++) { if (interval < EPSILON) { break; } prev = t - interval; next = t + interval; v1 = [cubicAt(x1, x2, x3, x4, prev), cubicAt(y1, y2, y3, y4, prev)]; d1 = vec2.squaredDistance(v0, v1); if (prev >= 0 && d1 < d) { t = prev; d = d1; } else { v2 = [cubicAt(x1, x2, x3, x4, next), cubicAt(y1, y2, y3, y4, next)]; d2 = vec2.squaredDistance(v0, v2); if (next <= 1 && d2 < d) { t = next; d = d2; } else { interval *= 0.5; } } } if (out) { out.x = cubicAt(x1, x2, x3, x4, t); out.y = cubicAt(y1, y2, y3, y4, t); } return Math.sqrt(d); } function cubicExtrema(p0, p1, p2, p3) { var a = 3 * p0 - 9 * p1 + 9 * p2 - 3 * p3; var b = 6 * p1 - 12 * p2 + 6 * p3; var c = 3 * p2 - 3 * p3; var extrema = []; var t1; var t2; var discSqrt; if (Util.isNumberEqual(a, 0)) { if (!Util.isNumberEqual(b, 0)) { t1 = -c / b; if (t1 >= 0 && t1 <= 1) { extrema.push(t1); } } } else { var disc = b * b - 4 * a * c; if (Util.isNumberEqual(disc, 0)) { extrema.push(-b / (2 * a)); } else if (disc > 0) { discSqrt = Math.sqrt(disc); t1 = (-b + discSqrt) / (2 * a); t2 = (-b - discSqrt) / (2 * a); if (t1 >= 0 && t1 <= 1) { extrema.push(t1); } if (t2 >= 0 && t2 <= 1) { extrema.push(t2); } } } return extrema; } function base3(t, p1, p2, p3, p4) { var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4; var t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; return t * t2 - 3 * p1 + 3 * p2; } function cubiclLen(x1, y1, x2, y2, x3, y3, x4, y4, z) { if (Util.isNil(z)) { z = 1; } z = z > 1 ? 1 : z < 0 ? 0 : z; var z2 = z / 2; var n = 12; var Tvalues = [-0.1252, 0.1252, -0.3678, 0.3678, -0.5873, 0.5873, -0.7699, 0.7699, -0.9041, 0.9041, -0.9816, 0.9816]; var Cvalues = [0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069, 0.1069, 0.0472, 0.0472]; var sum = 0; for (var i = 0; i < n; i++) { var ct = z2 * Tvalues[i] + z2; var xbase = base3(ct, x1, x2, x3, x4); var ybase = base3(ct, y1, y2, y3, y4); var comb = xbase * xbase + ybase * ybase; sum += Cvalues[i] * Math.sqrt(comb); } return z2 * sum; } module.exports = { at: cubicAt, derivativeAt: cubicDerivativeAt, projectPoint: function projectPoint(x1, y1, x2, y2, x3, y3, x4, y4, x, y) { var rst = {}; cubicProjectPoint(x1, y1, x2, y2, x3, y3, x4, y4, x, y, rst); return rst; }, pointDistance: cubicProjectPoint, extrema: cubicExtrema, len: cubiclLen }; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Format = __webpack_require__(4); var PathSegment = __webpack_require__(10); var Marker = function Marker(cfg) { Marker.superclass.constructor.call(this, cfg); }; Marker.Symbols = { // 圆 circle: function circle(x, y, r) { return [['M', x, y], ['m', -r, 0], ['a', r, r, 0, 1, 0, r * 2, 0], ['a', r, r, 0, 1, 0, -r * 2, 0]]; }, // 正方形 square: function square(x, y, r) { return [['M', x - r, y - r], ['L', x + r, y - r], ['L', x + r, y + r], ['L', x - r, y + r], ['Z']]; }, // 菱形 diamond: function diamond(x, y, r) { return [['M', x - r, y], ['L', x, y - r], ['L', x + r, y], ['L', x, y + r], ['Z']]; }, // 三角形 triangle: function triangle(x, y, r) { var diffY = r * Math.sin(1 / 3 * Math.PI); return [['M', x - r, y + diffY], ['L', x, y - diffY], ['L', x + r, y + diffY], ['z']]; }, // 倒三角形 'triangle-down': function triangleDown(x, y, r) { var diffY = r * Math.sin(1 / 3 * Math.PI); return [['M', x - r, y - diffY], ['L', x + r, y - diffY], ['L', x, y + diffY], ['Z']]; } }; Marker.ATTRS = { path: null, lineWidth: 1 }; Util.extend(Marker, Shape); Util.augment(Marker, { type: 'marker', canFill: true, canStroke: true, getDefaultAttrs: function getDefaultAttrs() { return { x: 0, y: 0, lineWidth: 1 }; }, calculateBox: function calculateBox() { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.radius || attrs.r; var lineWidth = this.getHitLineWidth(); var halfWidth = lineWidth / 2 + r; return { minX: cx - halfWidth, minY: cy - halfWidth, maxX: cx + halfWidth, maxY: cy + halfWidth }; }, _getPath: function _getPath() { var attrs = this._attrs; var x = attrs.x; var y = attrs.y; var r = attrs.radius || attrs.r; var symbol = attrs.symbol || 'circle'; var method; if (Util.isFunction(symbol)) { method = symbol; } else { method = Marker.Symbols[symbol]; } if (!method) { console.warn(symbol + " marker is not supported."); return null; } return method(x, y, r); }, createPath: function createPath(context) { var segments = this._cfg.segments; if (segments && !this._cfg.hasUpdate) { context.beginPath(); for (var i = 0; i < segments.length; i++) { segments[i].draw(context); } return; } var path = Format.parsePath(this._getPath()); context.beginPath(); var preSegment; segments = []; for (var _i = 0; _i < path.length; _i++) { var item = path[_i]; preSegment = new PathSegment(item, preSegment, _i === path.length - 1); segments.push(preSegment); preSegment.draw(context); } this._cfg.segments = segments; this._cfg.hasUpdate = false; } }); module.exports = Marker; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(12); var SPACES = "\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029"; var PATH_COMMAND = new RegExp('([a-z])[' + SPACES + ',]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[' + SPACES + ']*,?[' + SPACES + ']*)+)', 'ig'); var PATH_VALUES = new RegExp('(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[' + SPACES + ']*,?[' + SPACES + ']*', 'ig'); // Parses given path string into an array of arrays of path segments var parsePathString = function parsePathString(pathString) { if (!pathString) { return null; } if (typeof pathString === typeof []) { return pathString; } var paramCounts = { a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0 }; var data = []; String(pathString).replace(PATH_COMMAND, function (a, b, c) { var params = []; var name = b.toLowerCase(); c.replace(PATH_VALUES, function (a, b) { b && params.push(+b); }); if (name === 'm' && params.length > 2) { data.push([b].concat(params.splice(0, 2))); name = 'l'; b = b === 'm' ? 'l' : 'L'; } if (name === 'o' && params.length === 1) { data.push([b, params[0]]); } if (name === 'r') { data.push([b].concat(params)); } else { while (params.length >= paramCounts[name]) { data.push([b].concat(params.splice(0, paramCounts[name]))); if (!paramCounts[name]) { break; } } } }); return data; }; // http://schepers.cc/getting-to-the-point var catmullRom2bezier = function catmullRom2bezier(crp, z) { var d = []; for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { var p = [{ x: +crp[i - 2], y: +crp[i - 1] }, { x: +crp[i], y: +crp[i + 1] }, { x: +crp[i + 2], y: +crp[i + 3] }, { x: +crp[i + 4], y: +crp[i + 5] }]; if (z) { if (!i) { p[0] = { x: +crp[iLen - 2], y: +crp[iLen - 1] }; } else if (iLen - 4 === i) { p[3] = { x: +crp[0], y: +crp[1] }; } else if (iLen - 2 === i) { p[2] = { x: +crp[0], y: +crp[1] }; p[3] = { x: +crp[2], y: +crp[3] }; } } else { if (iLen - 4 === i) { p[3] = p[2]; } else if (!i) { p[0] = { x: +crp[i], y: +crp[i + 1] }; } } d.push(['C', (-p[0].x + 6 * p[1].x + p[2].x) / 6, (-p[0].y + 6 * p[1].y + p[2].y) / 6, (p[1].x + 6 * p[2].x - p[3].x) / 6, (p[1].y + 6 * p[2].y - p[3].y) / 6, p[2].x, p[2].y]); } return d; }; var ellipsePath = function ellipsePath(x, y, rx, ry, a) { var res = []; if (a === null && ry === null) { ry = rx; } x = +x; y = +y; rx = +rx; ry = +ry; if (a !== null) { var rad = Math.PI / 180; var x1 = x + rx * Math.cos(-ry * rad); var x2 = x + rx * Math.cos(-a * rad); var y1 = y + rx * Math.sin(-ry * rad); var y2 = y + rx * Math.sin(-a * rad); res = [['M', x1, y1], ['A', rx, rx, 0, +(a - ry > 180), 0, x2, y2]]; } else { res = [['M', x, y], ['m', 0, -ry], ['a', rx, ry, 0, 1, 1, 0, 2 * ry], ['a', rx, ry, 0, 1, 1, 0, -2 * ry], ['z']]; } return res; }; var pathToAbsolute = function pathToAbsolute(pathArray) { pathArray = parsePathString(pathArray); if (!pathArray || !pathArray.length) { return [['M', 0, 0]]; } var res = []; var x = 0; var y = 0; var mx = 0; var my = 0; var start = 0; var pa0; var dots; if (pathArray[0][0] === 'M') { x = +pathArray[0][1]; y = +pathArray[0][2]; mx = x; my = y; start++; res[0] = ['M', x, y]; } var crz = pathArray.length === 3 && pathArray[0][0] === 'M' && pathArray[1][0].toUpperCase() === 'R' && pathArray[2][0].toUpperCase() === 'Z'; for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { res.push(r = []); pa = pathArray[i]; pa0 = pa[0]; if (pa0 !== pa0.toUpperCase()) { r[0] = pa0.toUpperCase(); switch (r[0]) { case 'A': r[1] = pa[1]; r[2] = pa[2]; r[3] = pa[3]; r[4] = pa[4]; r[5] = pa[5]; r[6] = +pa[6] + x; r[7] = +pa[7] + y; break; case 'V': r[1] = +pa[1] + y; break; case 'H': r[1] = +pa[1] + x; break; case 'R': dots = [x, y].concat(pa.slice(1)); for (var j = 2, jj = dots.length; j < jj; j++) { dots[j] = +dots[j] + x; dots[++j] = +dots[j] + y; } res.pop(); res = res.concat(catmullRom2bezier(dots, crz)); break; case 'O': res.pop(); dots = ellipsePath(x, y, pa[1], pa[2]); dots.push(dots[0]); res = res.concat(dots); break; case 'U': res.pop(); res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); r = ['U'].concat(res[res.length - 1].slice(-2)); break; case 'M': mx = +pa[1] + x; my = +pa[2] + y; break; // for lint default: for (var _j = 1, _jj = pa.length; _j < _jj; _j++) { r[_j] = +pa[_j] + (_j % 2 ? x : y); } } } else if (pa0 === 'R') { dots = [x, y].concat(pa.slice(1)); res.pop(); res = res.concat(catmullRom2bezier(dots, crz)); r = ['R'].concat(pa.slice(-2)); } else if (pa0 === 'O') { res.pop(); dots = ellipsePath(x, y, pa[1], pa[2]); dots.push(dots[0]); res = res.concat(dots); } else if (pa0 === 'U') { res.pop(); res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); r = ['U'].concat(res[res.length - 1].slice(-2)); } else { for (var k = 0, kk = pa.length; k < kk; k++) { r[k] = pa[k]; } } pa0 = pa0.toUpperCase(); if (pa0 !== 'O') { switch (r[0]) { case 'Z': x = +mx; y = +my; break; case 'H': x = r[1]; break; case 'V': y = r[1]; break; case 'M': mx = r[r.length - 2]; my = r[r.length - 1]; break; // for lint default: x = r[r.length - 2]; y = r[r.length - 1]; } } } return res; }; var l2c = function l2c(x1, y1, x2, y2) { return [x1, y1, x2, y2, x2, y2]; }; var q2c = function q2c(x1, y1, ax, ay, x2, y2) { var _13 = 1 / 3; var _23 = 2 / 3; return [_13 * x1 + _23 * ax, _13 * y1 + _23 * ay, _13 * x2 + _23 * ax, _13 * y2 + _23 * ay, x2, y2]; }; var a2c = function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { // for more information of where this math came from visit: // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes if (rx === ry) { rx += 1; } var _120 = Math.PI * 120 / 180; var rad = Math.PI / 180 * (+angle || 0); var res = []; var xy; var f1; var f2; var cx; var cy; var rotate = function rotate(x, y, rad) { var X = x * Math.cos(rad) - y * Math.sin(rad); var Y = x * Math.sin(rad) + y * Math.cos(rad); return { x: X, y: Y }; }; if (!recursive) { xy = rotate(x1, y1, -rad); x1 = xy.x; y1 = xy.y; xy = rotate(x2, y2, -rad); x2 = xy.x; y2 = xy.y; if (x1 === x2 && y1 === y2) { // 若弧的起始点和终点重叠则错开一点 x2 += 1; y2 += 1; } // const cos = Math.cos(Math.PI / 180 * angle); // const sin = Math.sin(Math.PI / 180 * angle); var x = (x1 - x2) / 2; var y = (y1 - y2) / 2; var h = x * x / (rx * rx) + y * y / (ry * ry); if (h > 1) { h = Math.sqrt(h); rx = h * rx; ry = h * ry; } var rx2 = rx * rx; var ry2 = ry * ry; var k = (large_arc_flag === sweep_flag ? -1 : 1) * Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))); cx = k * rx * y / ry + (x1 + x2) / 2; cy = k * -ry * x / rx + (y1 + y2) / 2; f1 = Math.asin(((y1 - cy) / ry).toFixed(9)); f2 = Math.asin(((y2 - cy) / ry).toFixed(9)); f1 = x1 < cx ? Math.PI - f1 : f1; f2 = x2 < cx ? Math.PI - f2 : f2; f1 < 0 && (f1 = Math.PI * 2 + f1); f2 < 0 && (f2 = Math.PI * 2 + f2); if (sweep_flag && f1 > f2) { f1 = f1 - Math.PI * 2; } if (!sweep_flag && f2 > f1) { f2 = f2 - Math.PI * 2; } } else { f1 = recursive[0]; f2 = recursive[1]; cx = recursive[2]; cy = recursive[3]; } var df = f2 - f1; if (Math.abs(df) > _120) { var f2old = f2; var x2old = x2; var y2old = y2; f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); x2 = cx + rx * Math.cos(f2); y2 = cy + ry * Math.sin(f2); res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); } df = f2 - f1; var c1 = Math.cos(f1); var s1 = Math.sin(f1); var c2 = Math.cos(f2); var s2 = Math.sin(f2); var t = Math.tan(df / 4); var hx = 4 / 3 * rx * t; var hy = 4 / 3 * ry * t; var m1 = [x1, y1]; var m2 = [x1 + hx * s1, y1 - hy * c1]; var m3 = [x2 + hx * s2, y2 - hy * c2]; var m4 = [x2, y2]; m2[0] = 2 * m1[0] - m2[0]; m2[1] = 2 * m1[1] - m2[1]; if (recursive) { return [m2, m3, m4].concat(res); } res = [m2, m3, m4].concat(res).join().split(','); var newres = []; for (var i = 0, ii = res.length; i < ii; i++) { newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; } return newres; }; var pathTocurve = function pathTocurve(path, path2) { var p = pathToAbsolute(path); var p2 = path2 && pathToAbsolute(path2); var attrs = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null }; var attrs2 = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null }; var pcoms1 = []; // path commands of original path p var pcoms2 = []; // path commands of original path p2 var pfirst = ''; // temporary holder for original path command var pcom = ''; // holder for previous path command of original path var ii; var processPath = function processPath(path, d, pcom) { var nx, ny; if (!path) { return ['C', d.x, d.y, d.x, d.y, d.x, d.y]; } !(path[0] in { T: 1, Q: 1 }) && (d.qx = d.qy = null); switch (path[0]) { case 'M': d.X = path[1]; d.Y = path[2]; break; case 'A': path = ['C'].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1)))); break; case 'S': if (pcom === 'C' || pcom === 'S') { // In "S" case we have to take into account, if the previous command is C/S. nx = d.x * 2 - d.bx; // And reflect the previous ny = d.y * 2 - d.by; // command's control point relative to the current point. } else { // or some else or nothing nx = d.x; ny = d.y; } path = ['C', nx, ny].concat(path.slice(1)); break; case 'T': if (pcom === 'Q' || pcom === 'T') { // In "T" case we have to take into account, if the previous command is Q/T. d.qx = d.x * 2 - d.qx; // And make a reflection similar d.qy = d.y * 2 - d.qy; // to case "S". } else { // or something else or nothing d.qx = d.x; d.qy = d.y; } path = ['C'].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); break; case 'Q': d.qx = path[1]; d.qy = path[2]; path = ['C'].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4])); break; case 'L': path = ['C'].concat(l2c(d.x, d.y, path[1], path[2])); break; case 'H': path = ['C'].concat(l2c(d.x, d.y, path[1], d.y)); break; case 'V': path = ['C'].concat(l2c(d.x, d.y, d.x, path[1])); break; case 'Z': path = ['C'].concat(l2c(d.x, d.y, d.X, d.Y)); break; default: break; } return path; }; var fixArc = function fixArc(pp, i) { if (pp[i].length > 7) { pp[i].shift(); var pi = pp[i]; while (pi.length) { pcoms1[i] = 'A'; // if created multiple C:s, their original seg is saved p2 && (pcoms2[i] = 'A'); // the same as above pp.splice(i++, 0, ['C'].concat(pi.splice(0, 6))); } pp.splice(i, 1); ii = Math.max(p.length, p2 && p2.length || 0); } }; var fixM = function fixM(path1, path2, a1, a2, i) { if (path1 && path2 && path1[i][0] === 'M' && path2[i][0] !== 'M') { path2.splice(i, 0, ['M', a2.x, a2.y]); a1.bx = 0; a1.by = 0; a1.x = path1[i][1]; a1.y = path1[i][2]; ii = Math.max(p.length, p2 && p2.length || 0); } }; ii = Math.max(p.length, p2 && p2.length || 0); for (var i = 0; i < ii; i++) { p[i] && (pfirst = p[i][0]); // save current path command if (pfirst !== 'C') { // C is not saved yet, because it may be result of conversion pcoms1[i] = pfirst; // Save current path command i && (pcom = pcoms1[i - 1]); // Get previous path command pcom } p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath if (pcoms1[i] !== 'A' && pfirst === 'C') pcoms1[i] = 'C'; // A is the only command // which may produce multiple C:s // so we have to make sure that C is also C in original path fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 if (p2) { // the same procedures is done to p2 p2[i] && (pfirst = p2[i][0]); if (pfirst !== 'C') { pcoms2[i] = pfirst; i && (pcom = pcoms2[i - 1]); } p2[i] = processPath(p2[i], attrs2, pcom); if (pcoms2[i] !== 'A' && pfirst === 'C') { pcoms2[i] = 'C'; } fixArc(p2, i); } fixM(p, p2, attrs, attrs2, i); fixM(p2, p, attrs2, attrs, i); var seg = p[i]; var seg2 = p2 && p2[i]; var seglen = seg.length; var seg2len = p2 && seg2.length; attrs.x = seg[seglen - 2]; attrs.y = seg[seglen - 1]; attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x; attrs.by = parseFloat(seg[seglen - 3]) || attrs.y; attrs2.bx = p2 && (parseFloat(seg2[seg2len - 4]) || attrs2.x); attrs2.by = p2 && (parseFloat(seg2[seg2len - 3]) || attrs2.y); attrs2.x = p2 && seg2[seg2len - 2]; attrs2.y = p2 && seg2[seg2len - 1]; } return p2 ? [p, p2] : p; }; var p2s = /,?([a-z]),?/gi; var parsePathArray = function parsePathArray(path) { return path.join(',').replace(p2s, '$1'); }; var base3 = function base3(t, p1, p2, p3, p4) { var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4; var t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; return t * t2 - 3 * p1 + 3 * p2; }; var bezlen = function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { if (z === null) { z = 1; } z = z > 1 ? 1 : z < 0 ? 0 : z; var z2 = z / 2; var n = 12; var Tvalues = [-0.1252, 0.1252, -0.3678, 0.3678, -0.5873, 0.5873, -0.7699, 0.7699, -0.9041, 0.9041, -0.9816, 0.9816]; var Cvalues = [0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069, 0.1069, 0.0472, 0.0472]; var sum = 0; for (var i = 0; i < n; i++) { var ct = z2 * Tvalues[i] + z2; var xbase = base3(ct, x1, x2, x3, x4); var ybase = base3(ct, y1, y2, y3, y4); var comb = xbase * xbase + ybase * ybase; sum += Cvalues[i] * Math.sqrt(comb); } return z2 * sum; }; var curveDim = function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) { var tvalues = []; var bounds = [[], []]; var a; var b; var c; var t; for (var i = 0; i < 2; ++i) { if (i === 0) { b = 6 * x0 - 12 * x1 + 6 * x2; a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; c = 3 * x1 - 3 * x0; } else { b = 6 * y0 - 12 * y1 + 6 * y2; a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; c = 3 * y1 - 3 * y0; } if (Math.abs(a) < 1e-12) { if (Math.abs(b) < 1e-12) { continue; } t = -c / b; if (t > 0 && t < 1) { tvalues.push(t); } continue; } var b2ac = b * b - 4 * c * a; var sqrtb2ac = Math.sqrt(b2ac); if (b2ac < 0) { continue; } var t1 = (-b + sqrtb2ac) / (2 * a); if (t1 > 0 && t1 < 1) { tvalues.push(t1); } var t2 = (-b - sqrtb2ac) / (2 * a); if (t2 > 0 && t2 < 1) { tvalues.push(t2); } } var j = tvalues.length; var jlen = j; var mt; while (j--) { t = tvalues[j]; mt = 1 - t; bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3; bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3; } bounds[0][jlen] = x0; bounds[1][jlen] = y0; bounds[0][jlen + 1] = x3; bounds[1][jlen + 1] = y3; bounds[0].length = bounds[1].length = jlen + 2; return { min: { x: Math.min.apply(0, bounds[0]), y: Math.min.apply(0, bounds[1]) }, max: { x: Math.max.apply(0, bounds[0]), y: Math.max.apply(0, bounds[1]) } }; }; var intersect = function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { if (Math.max(x1, x2) < Math.min(x3, x4) || Math.min(x1, x2) > Math.max(x3, x4) || Math.max(y1, y2) < Math.min(y3, y4) || Math.min(y1, y2) > Math.max(y3, y4)) { return; } var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4); var ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4); var denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); if (!denominator) { return; } var px = nx / denominator; var py = ny / denominator; var px2 = +px.toFixed(2); var py2 = +py.toFixed(2); if (px2 < +Math.min(x1, x2).toFixed(2) || px2 > +Math.max(x1, x2).toFixed(2) || px2 < +Math.min(x3, x4).toFixed(2) || px2 > +Math.max(x3, x4).toFixed(2) || py2 < +Math.min(y1, y2).toFixed(2) || py2 > +Math.max(y1, y2).toFixed(2) || py2 < +Math.min(y3, y4).toFixed(2) || py2 > +Math.max(y3, y4).toFixed(2)) { return; } return { x: px, y: py }; }; var isPointInsideBBox = function isPointInsideBBox(bbox, x, y) { return x >= bbox.x && x <= bbox.x + bbox.width && y >= bbox.y && y <= bbox.y + bbox.height; }; var rectPath = function rectPath(x, y, w, h, r) { if (r) { return [['M', +x + +r, y], ['l', w - r * 2, 0], ['a', r, r, 0, 0, 1, r, r], ['l', 0, h - r * 2], ['a', r, r, 0, 0, 1, -r, r], ['l', r * 2 - w, 0], ['a', r, r, 0, 0, 1, -r, -r], ['l', 0, r * 2 - h], ['a', r, r, 0, 0, 1, r, -r], ['z']]; } var res = [['M', x, y], ['l', w, 0], ['l', 0, h], ['l', -w, 0], ['z']]; res.parsePathArray = parsePathArray; return res; }; var box = function box(x, y, width, height) { if (x === null) { x = y = width = height = 0; } if (y === null) { y = x.y; width = x.width; height = x.height; x = x.x; } return { x: x, y: y, width: width, w: width, height: height, h: height, x2: x + width, y2: y + height, cx: x + width / 2, cy: y + height / 2, r1: Math.min(width, height) / 2, r2: Math.max(width, height) / 2, r0: Math.sqrt(width * width + height * height) / 2, path: rectPath(x, y, width, height), vb: [x, y, width, height].join(' ') }; }; var isBBoxIntersect = function isBBoxIntersect(bbox1, bbox2) { bbox1 = box(bbox1); bbox2 = box(bbox2); return isPointInsideBBox(bbox2, bbox1.x, bbox1.y) || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y) || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2) || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2) || isPointInsideBBox(bbox1, bbox2.x, bbox2.y) || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y) || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2) || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2) || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); }; var bezierBBox = function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { if (!Util.isArray(p1x)) { p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; } var bbox = curveDim.apply(null, p1x); return box(bbox.min.x, bbox.min.y, bbox.max.x - bbox.min.x, bbox.max.y - bbox.min.y); }; var findDotsAtSegment = function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { var t1 = 1 - t; var t13 = Math.pow(t1, 3); var t12 = Math.pow(t1, 2); var t2 = t * t; var t3 = t2 * t; var x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x; var y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y; var mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x); var my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y); var nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x); var ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y); var ax = t1 * p1x + t * c1x; var ay = t1 * p1y + t * c1y; var cx = t1 * c2x + t * p2x; var cy = t1 * c2y + t * p2y; var alpha = 90 - Math.atan2(mx - nx, my - ny) * 180 / Math.PI; // (mx > nx || my < ny) && (alpha += 180); return { x: x, y: y, m: { x: mx, y: my }, n: { x: nx, y: ny }, start: { x: ax, y: ay }, end: { x: cx, y: cy }, alpha: alpha }; }; var interHelper = function interHelper(bez1, bez2, justCount) { var bbox1 = bezierBBox(bez1); var bbox2 = bezierBBox(bez2); if (!isBBoxIntersect(bbox1, bbox2)) { return justCount ? 0 : []; } var l1 = bezlen.apply(0, bez1); var l2 = bezlen.apply(0, bez2); var n1 = ~~(l1 / 8); var n2 = ~~(l2 / 8); var dots1 = []; var dots2 = []; var xy = {}; var res = justCount ? 0 : []; for (var i = 0; i < n1 + 1; i++) { var d = findDotsAtSegment.apply(0, bez1.concat(i / n1)); dots1.push({ x: d.x, y: d.y, t: i / n1 }); } for (var _i = 0; _i < n2 + 1; _i++) { var _d = findDotsAtSegment.apply(0, bez2.concat(_i / n2)); dots2.push({ x: _d.x, y: _d.y, t: _i / n2 }); } for (var _i2 = 0; _i2 < n1; _i2++) { for (var j = 0; j < n2; j++) { var di = dots1[_i2]; var di1 = dots1[_i2 + 1]; var dj = dots2[j]; var dj1 = dots2[j + 1]; var ci = Math.abs(di1.x - di.x) < 0.001 ? 'y' : 'x'; var cj = Math.abs(dj1.x - dj.x) < 0.001 ? 'y' : 'x'; var is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); if (is) { if (xy[is.x.toFixed(4)] === is.y.toFixed(4)) { continue; } xy[is.x.toFixed(4)] = is.y.toFixed(4); var t1 = di.t + Math.abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t); var t2 = dj.t + Math.abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { if (justCount) { res++; } else { res.push({ x: is.x, y: is.y, t1: t1, t2: t2 }); } } } } } return res; }; var interPathHelper = function interPathHelper(path1, path2, justCount) { path1 = pathTocurve(path1); path2 = pathTocurve(path2); var x1; var y1; var x2; var y2; var x1m; var y1m; var x2m; var y2m; var bez1; var bez2; var res = justCount ? 0 : []; for (var i = 0, ii = path1.length; i < ii; i++) { var pi = path1[i]; if (pi[0] === 'M') { x1 = x1m = pi[1]; y1 = y1m = pi[2]; } else { if (pi[0] === 'C') { bez1 = [x1, y1].concat(pi.slice(1)); x1 = bez1[6]; y1 = bez1[7]; } else { bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; x1 = x1m; y1 = y1m; } for (var j = 0, jj = path2.length; j < jj; j++) { var pj = path2[j]; if (pj[0] === 'M') { x2 = x2m = pj[1]; y2 = y2m = pj[2]; } else { if (pj[0] === 'C') { bez2 = [x2, y2].concat(pj.slice(1)); x2 = bez2[6]; y2 = bez2[7]; } else { bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; x2 = x2m; y2 = y2m; } var intr = interHelper(bez1, bez2, justCount); if (justCount) { res += intr; } else { for (var k = 0, kk = intr.length; k < kk; k++) { intr[k].segment1 = i; intr[k].segment2 = j; intr[k].bez1 = bez1; intr[k].bez2 = bez2; } res = res.concat(intr); } } } } } return res; }; var pathIntersection = function pathIntersection(path1, path2) { return interPathHelper(path1, path2); }; function decasteljau(points, t) { var left = []; var right = []; function recurse(points, t) { if (points.length === 1) { left.push(points[0]); right.push(points[0]); } else { var middlePoints = []; for (var i = 0; i < points.length - 1; i++) { if (i === 0) { left.push(points[0]); } if (i === points.length - 2) { right.push(points[i + 1]); } middlePoints[i] = [(1 - t) * points[i][0] + t * points[i + 1][0], (1 - t) * points[i][1] + t * points[i + 1][1]]; } recurse(middlePoints, t); } } if (points.length) { recurse(points, t); } return { left: left, right: right.reverse() }; } function splitCurve(start, end, count) { var points = [[start[1], start[2]]]; count = count || 2; var segments = []; if (end[0] === 'A') { points.push(end[6]); points.push(end[7]); } else if (end[0] === 'C') { points.push([end[1], end[2]]); points.push([end[3], end[4]]); points.push([end[5], end[6]]); } else if (end[0] === 'S' || end[0] === 'Q') { points.push([end[1], end[2]]); points.push([end[3], end[4]]); } else { points.push([end[1], end[2]]); } var leftSegments = points; var t = 1 / count; for (var i = 0; i < count - 1; i++) { var rt = t / (1 - t * i); var split = decasteljau(leftSegments, rt); segments.push(split.left); leftSegments = split.right; } segments.push(leftSegments); var result = segments.map(function (segment) { var cmd = []; if (segment.length === 4) { cmd.push('C'); cmd = cmd.concat(segment[2]); } if (segment.length >= 3) { if (segment.length === 3) { cmd.push('Q'); } cmd = cmd.concat(segment[1]); } if (segment.length === 2) { cmd.push('L'); } cmd = cmd.concat(segment[segment.length - 1]); return cmd; }); return result; } var splitSegment = function splitSegment(start, end, count) { if (count === 1) { return [[].concat(start)]; } var segments = []; if (end[0] === 'L' || end[0] === 'C' || end[0] === 'Q') { segments = segments.concat(splitCurve(start, end, count)); } else { var temp = [].concat(start); if (temp[0] === 'M') { temp[0] = 'L'; } for (var i = 0; i <= count - 1; i++) { segments.push(temp); } } return segments; }; var fillPath = function fillPath(source, target) { if (source.length === 1) { return source; } var sourceLen = source.length - 1; var targetLen = target.length - 1; var ratio = sourceLen / targetLen; var segmentsToFill = []; if (source.length === 1 && source[0][0] === 'M') { for (var i = 0; i < targetLen - sourceLen; i++) { source.push(source[0]); } return source; } for (var _i3 = 0; _i3 < targetLen; _i3++) { var index = Math.floor(ratio * _i3); segmentsToFill[index] = (segmentsToFill[index] || 0) + 1; } var filled = segmentsToFill.reduce(function (filled, count, i) { if (i === sourceLen) { return filled.concat(source[sourceLen]); } return filled.concat(splitSegment(source[i], source[i + 1], count)); }, []); filled.unshift(source[0]); if (target[targetLen] === 'Z' || target[targetLen] === 'z') { filled.push('Z'); } return filled; }; var isEqual = function isEqual(obj1, obj2) { if (obj1.length !== obj2.length) { return false; } var result = true; Util.each(obj1, function (item, i) { if (item !== obj2[i]) { result = false; return false; } }); return result; }; function getMinDiff(del, add, modify) { var type = null; var min = modify; if (add < min) { min = add; type = 'add'; } if (del < min) { min = del; type = 'del'; } return { type: type, min: min }; } /* * https://en.wikipedia.org/wiki/Levenshtein_distance * 计算两条path的编辑距离 */ var levenshteinDistance = function levenshteinDistance(source, target) { var sourceLen = source.length; var targetLen = target.length; var sourceSegment, targetSegment; var temp = 0; if (sourceLen === 0 || targetLen === 0) { return null; } var dist = []; for (var i = 0; i <= sourceLen; i++) { dist[i] = []; dist[i][0] = { min: i }; } for (var j = 0; j <= targetLen; j++) { dist[0][j] = { min: j }; } for (var _i4 = 1; _i4 <= sourceLen; _i4++) { sourceSegment = source[_i4 - 1]; for (var _j2 = 1; _j2 <= targetLen; _j2++) { targetSegment = target[_j2 - 1]; if (isEqual(sourceSegment, targetSegment)) { temp = 0; } else { temp = 1; } var del = dist[_i4 - 1][_j2].min + 1; var add = dist[_i4][_j2 - 1].min + 1; var modify = dist[_i4 - 1][_j2 - 1].min + temp; dist[_i4][_j2] = getMinDiff(del, add, modify); } } return dist; }; var fillPathByDiff = function fillPathByDiff(source, target) { var diffMatrix = levenshteinDistance(source, target); var sourceLen = source.length; var targetLen = target.length; var changes = []; var index = 1; var minPos = 1; // 如果source和target不是完全不相等 if (diffMatrix[sourceLen][targetLen] !== sourceLen) { // 获取从source到target所需改动 for (var i = 1; i <= sourceLen; i++) { var min = diffMatrix[i][i].min; minPos = i; for (var j = index; j <= targetLen; j++) { if (diffMatrix[i][j].min < min) { min = diffMatrix[i][j].min; minPos = j; } } index = minPos; if (diffMatrix[i][index].type) { changes.push({ index: i - 1, type: diffMatrix[i][index].type }); } } // 对source进行增删path for (var _i5 = changes.length - 1; _i5 >= 0; _i5--) { index = changes[_i5].index; if (changes[_i5].type === 'add') { source.splice(index, 0, [].concat(source[index])); } else { source.splice(index, 1); } } } // source尾部补齐 sourceLen = source.length; var diff = targetLen - sourceLen; if (sourceLen < targetLen) { for (var _i6 = 0; _i6 < diff; _i6++) { if (source[sourceLen - 1][0] === 'z' || source[sourceLen - 1][0] === 'Z') { source.splice(sourceLen - 2, 0, source[sourceLen - 2]); } else { source.push(source[sourceLen - 1]); } sourceLen += 1; } } return source; }; // 将两个点均分成count个点 function _splitPoints(points, former, count) { var result = [].concat(points); var index; var t = 1 / (count + 1); var formerEnd = _getSegmentPoints(former)[0]; for (var i = 1; i <= count; i++) { t *= i; index = Math.floor(points.length * t); if (index === 0) { result.unshift([formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]); } else { result.splice(index, 0, [formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]); } } return result; } /* * 抽取pathSegment中的关键点 * M,L,A,Q,H,V一个端点 * Q, S抽取一个端点,一个控制点 * C抽取一个端点,两个控制点 */ function _getSegmentPoints(segment) { var points = []; switch (segment[0]) { case 'M': points.push([segment[1], segment[2]]); break; case 'L': points.push([segment[1], segment[2]]); break; case 'A': points.push([segment[6], segment[7]]); break; case 'Q': points.push([segment[3], segment[4]]); points.push([segment[1], segment[2]]); break; case 'T': points.push([segment[1], segment[2]]); break; case 'C': points.push([segment[5], segment[6]]); points.push([segment[1], segment[2]]); points.push([segment[3], segment[4]]); break; case 'S': points.push([segment[3], segment[4]]); points.push([segment[1], segment[2]]); break; case 'H': points.push([segment[1], segment[1]]); break; case 'V': points.push([segment[1], segment[1]]); break; default: } return points; } var formatPath = function formatPath(fromPath, toPath) { if (fromPath.length <= 1) { return fromPath; } var points; for (var i = 0; i < toPath.length; i++) { if (fromPath[i][0] !== toPath[i][0]) { // 获取fromPath的pathSegment的端点,根据toPath的指令对其改造 points = _getSegmentPoints(fromPath[i]); switch (toPath[i][0]) { case 'M': fromPath[i] = ['M'].concat(points[0]); break; case 'L': fromPath[i] = ['L'].concat(points[0]); break; case 'A': fromPath[i] = [].concat(toPath[i]); fromPath[i][6] = points[0][0]; fromPath[i][7] = points[0][1]; break; case 'Q': if (points.length < 2) { if (i > 0) { points = _splitPoints(points, fromPath[i - 1], 1); } else { fromPath[i] = toPath[i]; break; } } fromPath[i] = ['Q'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, [])); break; case 'T': fromPath[i] = ['T'].concat(points[0]); break; case 'C': if (points.length < 3) { if (i > 0) { points = _splitPoints(points, fromPath[i - 1], 2); } else { fromPath[i] = toPath[i]; break; } } fromPath[i] = ['C'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, [])); break; case 'S': if (points.length < 2) { if (i > 0) { points = _splitPoints(points, fromPath[i - 1], 1); } else { fromPath[i] = toPath[i]; break; } } fromPath[i] = ['S'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, [])); break; default: fromPath[i] = toPath[i]; } } } return fromPath; }; module.exports = { parsePathString: parsePathString, parsePathArray: parsePathArray, pathTocurve: pathTocurve, pathToAbsolute: pathToAbsolute, catmullRomToBezier: catmullRom2bezier, rectPath: rectPath, fillPath: fillPath, fillPathByDiff: fillPathByDiff, formatPath: formatPath, intersection: pathIntersection }; /***/ }), /* 23 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["b"] = now; /* harmony export (immutable) */ __webpack_exports__["a"] = Timer; /* harmony export (immutable) */ __webpack_exports__["c"] = timer; /* harmony export (immutable) */ __webpack_exports__["d"] = timerFlush; var frame = 0, // is an animation frame pending? timeout = 0, // is a timeout pending? interval = 0, // are any timers active? pokeDelay = 1000, // how frequently we check for clock skew taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === "object" && performance.now ? performance : Date, setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { setTimeout(f, 17); }; function now() { return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); } function clearNow() { clockNow = 0; } function Timer() { this._call = this._time = this._next = null; } Timer.prototype = timer.prototype = { constructor: Timer, restart: function (callback, delay, time) { if (typeof callback !== "function") throw new TypeError("callback is not a function"); time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); if (!this._next && taskTail !== this) { if (taskTail) taskTail._next = this;else taskHead = this; taskTail = this; } this._call = callback; this._time = time; sleep(); }, stop: function () { if (this._call) { this._call = null; this._time = Infinity; sleep(); } } }; function timer(callback, delay, time) { var t = new Timer(); t.restart(callback, delay, time); return t; } function timerFlush() { now(); // Get the current time, if not already set. ++frame; // Pretend we’ve set an alarm, if we haven’t already. var t = taskHead, e; while (t) { if ((e = clockNow - t._time) >= 0) t._call.call(null, e); t = t._next; } --frame; } function wake() { clockNow = (clockLast = clock.now()) + clockSkew; frame = timeout = 0; try { timerFlush(); } finally { frame = 0; nap(); clockNow = 0; } } function poke() { var now = clock.now(), delay = now - clockLast; if (delay > pokeDelay) clockSkew -= delay, clockLast = now; } function nap() { var t0, t1 = taskHead, t2, time = Infinity; while (t1) { if (t1._call) { if (time > t1._time) time = t1._time; t0 = t1, t1 = t1._next; } else { t2 = t1._next, t1._next = null; t1 = t0 ? t0._next = t2 : taskHead = t2; } } taskTail = t0; sleep(time); } function sleep(time) { if (frame) return; // Soonest alarm already set, or will be. if (timeout) timeout = clearTimeout(timeout); var delay = time - clockNow; // Strictly less than if we recomputed clockNow. if (delay > 24) { if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); if (interval) interval = clearInterval(interval); } else { if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); frame = 1, setFrame(wake); } } /***/ }), /* 24 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__rgb__ = __webpack_require__(55); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__array__ = __webpack_require__(58); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__date__ = __webpack_require__(59); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__number__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__object__ = __webpack_require__(60); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__string__ = __webpack_require__(61); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__constant__ = __webpack_require__(57); /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { var t = typeof b, c; return b == null || t === "boolean" ? Object(__WEBPACK_IMPORTED_MODULE_7__constant__["a" /* default */])(b) : (t === "number" ? __WEBPACK_IMPORTED_MODULE_4__number__["a" /* default */] : t === "string" ? (c = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["a" /* color */])(b)) ? (b = c, __WEBPACK_IMPORTED_MODULE_1__rgb__["a" /* default */]) : __WEBPACK_IMPORTED_MODULE_6__string__["a" /* default */] : b instanceof __WEBPACK_IMPORTED_MODULE_0_d3_color__["a" /* color */] ? __WEBPACK_IMPORTED_MODULE_1__rgb__["a" /* default */] : b instanceof Date ? __WEBPACK_IMPORTED_MODULE_3__date__["a" /* default */] : Array.isArray(b) ? __WEBPACK_IMPORTED_MODULE_2__array__["a" /* default */] : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? __WEBPACK_IMPORTED_MODULE_5__object__["a" /* default */] : __WEBPACK_IMPORTED_MODULE_4__number__["a" /* default */])(a, b); }); /***/ }), /* 25 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = Color; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return darker; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return brighter; }); /* harmony export (immutable) */ __webpack_exports__["e"] = color; /* harmony export (immutable) */ __webpack_exports__["h"] = rgbConvert; /* harmony export (immutable) */ __webpack_exports__["g"] = rgb; /* harmony export (immutable) */ __webpack_exports__["b"] = Rgb; /* unused harmony export hslConvert */ /* harmony export (immutable) */ __webpack_exports__["f"] = hsl; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__define_js__ = __webpack_require__(26); function Color() {} var darker = 0.7; var brighter = 1 / darker; var reI = "\\s*([+-]?\\d+)\\s*", reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); var named = { aliceblue: 0xf0f8ff, antiquewhite: 0xfaebd7, aqua: 0x00ffff, aquamarine: 0x7fffd4, azure: 0xf0ffff, beige: 0xf5f5dc, bisque: 0xffe4c4, black: 0x000000, blanchedalmond: 0xffebcd, blue: 0x0000ff, blueviolet: 0x8a2be2, brown: 0xa52a2a, burlywood: 0xdeb887, cadetblue: 0x5f9ea0, chartreuse: 0x7fff00, chocolate: 0xd2691e, coral: 0xff7f50, cornflowerblue: 0x6495ed, cornsilk: 0xfff8dc, crimson: 0xdc143c, cyan: 0x00ffff, darkblue: 0x00008b, darkcyan: 0x008b8b, darkgoldenrod: 0xb8860b, darkgray: 0xa9a9a9, darkgreen: 0x006400, darkgrey: 0xa9a9a9, darkkhaki: 0xbdb76b, darkmagenta: 0x8b008b, darkolivegreen: 0x556b2f, darkorange: 0xff8c00, darkorchid: 0x9932cc, darkred: 0x8b0000, darksalmon: 0xe9967a, darkseagreen: 0x8fbc8f, darkslateblue: 0x483d8b, darkslategray: 0x2f4f4f, darkslategrey: 0x2f4f4f, darkturquoise: 0x00ced1, darkviolet: 0x9400d3, deeppink: 0xff1493, deepskyblue: 0x00bfff, dimgray: 0x696969, dimgrey: 0x696969, dodgerblue: 0x1e90ff, firebrick: 0xb22222, floralwhite: 0xfffaf0, forestgreen: 0x228b22, fuchsia: 0xff00ff, gainsboro: 0xdcdcdc, ghostwhite: 0xf8f8ff, gold: 0xffd700, goldenrod: 0xdaa520, gray: 0x808080, green: 0x008000, greenyellow: 0xadff2f, grey: 0x808080, honeydew: 0xf0fff0, hotpink: 0xff69b4, indianred: 0xcd5c5c, indigo: 0x4b0082, ivory: 0xfffff0, khaki: 0xf0e68c, lavender: 0xe6e6fa, lavenderblush: 0xfff0f5, lawngreen: 0x7cfc00, lemonchiffon: 0xfffacd, lightblue: 0xadd8e6, lightcoral: 0xf08080, lightcyan: 0xe0ffff, lightgoldenrodyellow: 0xfafad2, lightgray: 0xd3d3d3, lightgreen: 0x90ee90, lightgrey: 0xd3d3d3, lightpink: 0xffb6c1, lightsalmon: 0xffa07a, lightseagreen: 0x20b2aa, lightskyblue: 0x87cefa, lightslategray: 0x778899, lightslategrey: 0x778899, lightsteelblue: 0xb0c4de, lightyellow: 0xffffe0, lime: 0x00ff00, limegreen: 0x32cd32, linen: 0xfaf0e6, magenta: 0xff00ff, maroon: 0x800000, mediumaquamarine: 0x66cdaa, mediumblue: 0x0000cd, mediumorchid: 0xba55d3, mediumpurple: 0x9370db, mediumseagreen: 0x3cb371, mediumslateblue: 0x7b68ee, mediumspringgreen: 0x00fa9a, mediumturquoise: 0x48d1cc, mediumvioletred: 0xc71585, midnightblue: 0x191970, mintcream: 0xf5fffa, mistyrose: 0xffe4e1, moccasin: 0xffe4b5, navajowhite: 0xffdead, navy: 0x000080, oldlace: 0xfdf5e6, olive: 0x808000, olivedrab: 0x6b8e23, orange: 0xffa500, orangered: 0xff4500, orchid: 0xda70d6, palegoldenrod: 0xeee8aa, palegreen: 0x98fb98, paleturquoise: 0xafeeee, palevioletred: 0xdb7093, papayawhip: 0xffefd5, peachpuff: 0xffdab9, peru: 0xcd853f, pink: 0xffc0cb, plum: 0xdda0dd, powderblue: 0xb0e0e6, purple: 0x800080, rebeccapurple: 0x663399, red: 0xff0000, rosybrown: 0xbc8f8f, royalblue: 0x4169e1, saddlebrown: 0x8b4513, salmon: 0xfa8072, sandybrown: 0xf4a460, seagreen: 0x2e8b57, seashell: 0xfff5ee, sienna: 0xa0522d, silver: 0xc0c0c0, skyblue: 0x87ceeb, slateblue: 0x6a5acd, slategray: 0x708090, slategrey: 0x708090, snow: 0xfffafa, springgreen: 0x00ff7f, steelblue: 0x4682b4, tan: 0xd2b48c, teal: 0x008080, thistle: 0xd8bfd8, tomato: 0xff6347, turquoise: 0x40e0d0, violet: 0xee82ee, wheat: 0xf5deb3, white: 0xffffff, whitesmoke: 0xf5f5f5, yellow: 0xffff00, yellowgreen: 0x9acd32 }; Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Color, color, { copy: function (channels) { return Object.assign(new this.constructor(), this, channels); }, displayable: function () { return this.rgb().displayable(); }, hex: color_formatHex, // Deprecated! Use color.formatHex. formatHex: color_formatHex, formatHsl: color_formatHsl, formatRgb: color_formatRgb, toString: color_formatRgb }); function color_formatHex() { return this.rgb().formatHex(); } function color_formatHsl() { return hslConvert(this).formatHsl(); } function color_formatRgb() { return this.rgb().formatRgb(); } function color(format) { var m, l; format = (format + "").trim().toLowerCase(); return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00 : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000 : null // invalid hex ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; } function rgbn(n) { return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); } function rgba(r, g, b, a) { if (a <= 0) r = g = b = NaN; return new Rgb(r, g, b, a); } function rgbConvert(o) { if (!(o instanceof Color)) o = color(o); if (!o) return new Rgb(); o = o.rgb(); return new Rgb(o.r, o.g, o.b, o.opacity); } function rgb(r, g, b, opacity) { return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); } function Rgb(r, g, b, opacity) { this.r = +r; this.g = +g; this.b = +b; this.opacity = +opacity; } Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Rgb, rgb, Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["b" /* extend */])(Color, { brighter: function (k) { k = k == null ? brighter : Math.pow(brighter, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, darker: function (k) { k = k == null ? darker : Math.pow(darker, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, rgb: function () { return this; }, displayable: function () { return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1; }, hex: rgb_formatHex, // Deprecated! Use color.formatHex. formatHex: rgb_formatHex, formatRgb: rgb_formatRgb, toString: rgb_formatRgb })); function rgb_formatHex() { return "#" + hex(this.r) + hex(this.g) + hex(this.b); } function rgb_formatRgb() { var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); return (a === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? ")" : ", " + a + ")"); } function hex(value) { value = Math.max(0, Math.min(255, Math.round(value) || 0)); return (value < 16 ? "0" : "") + value.toString(16); } function hsla(h, s, l, a) { if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN; return new Hsl(h, s, l, a); } function hslConvert(o) { if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); if (!(o instanceof Color)) o = color(o); if (!o) return new Hsl(); if (o instanceof Hsl) return o; o = o.rgb(); var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2; if (s) { if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4; s /= l < 0.5 ? max + min : 2 - max - min; h *= 60; } else { s = l > 0 && l < 1 ? 0 : h; } return new Hsl(h, s, l, o.opacity); } function hsl(h, s, l, opacity) { return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); } function Hsl(h, s, l, opacity) { this.h = +h; this.s = +s; this.l = +l; this.opacity = +opacity; } Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Hsl, hsl, Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["b" /* extend */])(Color, { brighter: function (k) { k = k == null ? brighter : Math.pow(brighter, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, darker: function (k) { k = k == null ? darker : Math.pow(darker, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, rgb: function () { var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity); }, displayable: function () { return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1; }, formatHsl: function () { var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); return (a === 1 ? "hsl(" : "hsla(") + (this.h || 0) + ", " + (this.s || 0) * 100 + "%, " + (this.l || 0) * 100 + "%" + (a === 1 ? ")" : ", " + a + ")"); } })); /* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) { return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; } /***/ }), /* 26 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["b"] = extend; /* harmony default export */ __webpack_exports__["a"] = (function (constructor, factory, prototype) { constructor.prototype = factory.prototype = prototype; prototype.constructor = constructor; }); function extend(parent, definition) { var prototype = Object.create(parent.prototype); for (var key in definition) prototype[key] = definition[key]; return prototype; } /***/ }), /* 27 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = basis; function basis(t1, v0, v1, v2, v3) { var t2 = t1 * t1, t3 = t2 * t1; return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; } /* harmony default export */ __webpack_exports__["b"] = (function (values) { var n = values.length - 1; return function (t) { var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; return basis((t - i / n) * n, v0, v1, v2, v3); }; }); /***/ }), /* 28 */ /***/ (function(module, exports) { var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var isObject = function isObject(value) { /** * isObject({}) => true * isObject([1, 2, 3]) => true * isObject(Function) => true * isObject(null) => false */ var type = typeof value === 'undefined' ? 'undefined' : _typeof(value); return value !== null && type === 'object' || type === 'function'; }; module.exports = isObject; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { var isType = __webpack_require__(2); var isString = function isString(str) { return isType(str, 'String'); }; module.exports = isString; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var isArray = __webpack_require__(6); var clone = function clone(obj) { if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) { return obj; } var rst = void 0; if (isArray(obj)) { rst = []; for (var i = 0, l = obj.length; i < l; i++) { if (_typeof(obj[i]) === 'object' && obj[i] != null) { rst[i] = clone(obj[i]); } else { rst[i] = obj[i]; } } } else { rst = {}; for (var k in obj) { if (_typeof(obj[k]) === 'object' && obj[k] != null) { rst[k] = clone(obj[k]); } else { rst[k] = obj[k]; } } } return rst; }; module.exports = clone; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { var isPlainObject = __webpack_require__(72); var isArray = __webpack_require__(6); var MAX_MIX_LEVEL = 5; function _deepMix(dist, src, level, maxLevel) { level = level || 0; maxLevel = maxLevel || MAX_MIX_LEVEL; for (var key in src) { if (src.hasOwnProperty(key)) { var value = src[key]; if (value !== null && isPlainObject(value)) { if (!isPlainObject(dist[key])) { dist[key] = {}; } if (level < maxLevel) { _deepMix(dist[key], value, level + 1, maxLevel); } else { dist[key] = src[key]; } } else if (isArray(value)) { dist[key] = []; dist[key] = dist[key].concat(value); } else if (value !== undefined) { dist[key] = value; } } } } var deepMix = function deepMix() { var args = new Array(arguments.length); var length = args.length; for (var i = 0; i < length; i++) { args[i] = arguments[i]; } var rst = args[0]; for (var _i = 1; _i < length; _i++) { _deepMix(rst, args[_i]); } return rst; }; module.exports = deepMix; /***/ }), /* 32 */ /***/ (function(module, exports) { var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var isObjectLike = function isObjectLike(value) { /** * isObjectLike({}) => true * isObjectLike([1, 2, 3]) => true * isObjectLike(Function) => false * isObjectLike(null) => false */ return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null; }; module.exports = isObjectLike; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(28); var isArray = __webpack_require__(6); var each = function each(elements, func) { if (!elements) { return; } var rst = void 0; if (isArray(elements)) { for (var i = 0, len = elements.length; i < len; i++) { rst = func(elements[i], i); if (rst === false) { break; } } } else if (isObject(elements)) { for (var k in elements) { if (elements.hasOwnProperty(k)) { rst = func(elements[k], k); if (rst === false) { break; } } } } }; module.exports = each; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var isArrayLike = __webpack_require__(15); function toArray(value) { return isArrayLike(value) ? Array.prototype.slice.call(value) : []; } module.exports = toArray; /***/ }), /* 35 */ /***/ (function(module, exports) { var clamp = function clamp(a, min, max) { if (a < min) { return min; } else if (a > max) { return max; } return a; }; module.exports = clamp; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { var mat3 = __webpack_require__(86); mat3.translate = function (out, a, v) { var transMat = new Array(9); mat3.fromTranslation(transMat, v); return mat3.multiply(out, transMat, a); }; mat3.rotate = function (out, a, rad) { var rotateMat = new Array(9); mat3.fromRotation(rotateMat, rad); return mat3.multiply(out, rotateMat, a); }; mat3.scale = function (out, a, v) { var scaleMat = new Array(9); mat3.fromScaling(scaleMat, v); return mat3.multiply(out, scaleMat, a); }; module.exports = mat3; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Element = __webpack_require__(38); var Shape = __webpack_require__(97); var SHAPE_MAP = {}; // 缓存图形类型 var INDEX = '_INDEX'; var CLONE_CFGS = ['zIndex', 'capture', 'visible']; function getComparer(compare) { return function (left, right) { var result = compare(left, right); return result === 0 ? left[INDEX] - right[INDEX] : result; }; } function find(children, x, y) { var rst; for (var i = children.length - 1; i >= 0; i--) { var child = children[i]; if (child._cfg.visible && child._cfg.capture) { if (child.isGroup) { rst = child.getShape(x, y); } else if (child.isHit(x, y)) { rst = child; } } if (rst) { break; } } return rst; } function _cloneArrayAttr(arr) { var result = []; for (var i = 0; i < arr.length; i++) { result.push(arr[i]); } return result; } var Group = function Group(cfg) { Group.superclass.constructor.call(this, cfg); this.set('children', []); this.set('tobeRemoved', []); this._beforeRenderUI(); this._renderUI(); this._bindUI(); }; function initClassCfgs(c) { if (c._cfg || c === Group) { return; } var superCon = c.superclass.constructor; if (superCon && !superCon._cfg) { initClassCfgs(superCon); } c._cfg = {}; Util.merge(c._cfg, superCon._cfg); Util.merge(c._cfg, c.CFG); } Util.extend(Group, Element); Util.augment(Group, { isGroup: true, type: 'group', canFill: true, canStroke: true, getDefaultCfg: function getDefaultCfg() { initClassCfgs(this.constructor); return Util.merge({}, this.constructor._cfg); }, _beforeRenderUI: function _beforeRenderUI() {}, _renderUI: function _renderUI() {}, _bindUI: function _bindUI() {}, addShape: function addShape(type, cfg) { var canvas = this.get('canvas'); cfg = cfg || {}; var shapeType = SHAPE_MAP[type]; if (!shapeType) { shapeType = Util.upperFirst(type); SHAPE_MAP[type] = shapeType; } if (cfg.attrs && canvas) { var attrs = cfg.attrs; if (type === 'text') { // 临时解决 var topFontFamily = canvas.get('fontFamily'); if (topFontFamily) { attrs.fontFamily = attrs.fontFamily ? attrs.fontFamily : topFontFamily; } } } cfg.canvas = canvas; cfg.type = type; var rst = new Shape[shapeType](cfg); this.add(rst); return rst; }, /** 添加图组 * @param {Function|Object|undefined} param 图组类 * @param {Object} cfg 配置项 * @return {Object} rst 图组 */ addGroup: function addGroup(param, cfg) { var canvas = this.get('canvas'); var rst; cfg = Util.merge({}, cfg); if (Util.isFunction(param)) { if (cfg) { cfg.canvas = canvas; cfg.parent = this; rst = new param(cfg); } else { rst = new param({ canvas: canvas, parent: this }); } this.add(rst); } else if (Util.isObject(param)) { param.canvas = canvas; rst = new Group(param); this.add(rst); } else if (param === undefined) { rst = new Group(); this.add(rst); } else { return false; } return rst; }, /** 绘制背景 * @param {Array} padding 内边距 * @param {Attrs} attrs 图形属性 * @param {Shape} backShape 背景图形 * @return {Object} 背景层对象 */ renderBack: function renderBack(padding, attrs) { var backShape = this.get('backShape'); var innerBox = this.getBBox(); // const parent = this.get('parent'); // getParent Util.merge(attrs, { x: innerBox.minX - padding[3], y: innerBox.minY - padding[0], width: innerBox.width + padding[1] + padding[3], height: innerBox.height + padding[0] + padding[2] }); if (backShape) { backShape.attr(attrs); } else { backShape = this.addShape('rect', { zIndex: -1, attrs: attrs }); } this.set('backShape', backShape); this.sort(); return backShape; }, removeChild: function removeChild(item, destroy) { if (arguments.length >= 2) { if (this.contain(item)) { item.remove(destroy); } } else { if (arguments.length === 1) { if (Util.isBoolean(item)) { destroy = item; } else { if (this.contain(item)) { item.remove(true); } return this; } } if (arguments.length === 0) { destroy = true; } Group.superclass.remove.call(this, destroy); } return this; }, /** * 向组中添加shape或者group * @param {Object} items 图形或者分组 * @return {Object} group 本尊 */ add: function add(items) { var self = this; var children = self.get('children'); if (Util.isArray(items)) { Util.each(items, function (item) { var parent = item.get('parent'); if (parent) { parent.removeChild(item, false); } self._setCfgProperty(item); }); self._cfg.children = children.concat(items); } else { var item = items; var parent = item.get('parent'); if (parent) { parent.removeChild(item, false); } self._setCfgProperty(item); children.push(item); } return self; }, _setCfgProperty: function _setCfgProperty(item) { var cfg = this._cfg; item.set('parent', this); item.set('canvas', cfg.canvas); if (cfg.timeline) { item.set('timeline', cfg.timeline); } }, contain: function contain(item) { var children = this.get('children'); return children.indexOf(item) > -1; }, getChildByIndex: function getChildByIndex(index) { var children = this.get('children'); return children[index]; }, getFirst: function getFirst() { return this.getChildByIndex(0); }, getLast: function getLast() { var lastIndex = this.get('children').length - 1; return this.getChildByIndex(lastIndex); }, getBBox: function getBBox() { var self = this; var minX = Infinity; var maxX = -Infinity; var minY = Infinity; var maxY = -Infinity; var children = self.get('children'); if (children.length > 0) { Util.each(children, function (child) { if (child.get('visible')) { if (child.isGroup && child.get('children').length === 0) { return; } var _box = child.getBBox(); if (!_box) { return true; } var leftTop = [_box.minX, _box.minY, 1]; var leftBottom = [_box.minX, _box.maxY, 1]; var rightTop = [_box.maxX, _box.minY, 1]; var rightBottom = [_box.maxX, _box.maxY, 1]; child.apply(leftTop); child.apply(leftBottom); child.apply(rightTop); child.apply(rightBottom); var boxMinX = Math.min(leftTop[0], leftBottom[0], rightTop[0], rightBottom[0]); var boxMaxX = Math.max(leftTop[0], leftBottom[0], rightTop[0], rightBottom[0]); var boxMinY = Math.min(leftTop[1], leftBottom[1], rightTop[1], rightBottom[1]); var boxMaxY = Math.max(leftTop[1], leftBottom[1], rightTop[1], rightBottom[1]); if (boxMinX < minX) { minX = boxMinX; } if (boxMaxX > maxX) { maxX = boxMaxX; } if (boxMinY < minY) { minY = boxMinY; } if (boxMaxY > maxY) { maxY = boxMaxY; } } }); } else { minX = 0; maxX = 0; minY = 0; maxY = 0; } var box = { minX: minX, minY: minY, maxX: maxX, maxY: maxY }; box.x = box.minX; box.y = box.minY; box.width = box.maxX - box.minX; box.height = box.maxY - box.minY; return box; }, getCount: function getCount() { return this.get('children').length; }, sort: function sort() { var children = this.get('children'); // 稳定排序 Util.each(children, function (child, index) { child[INDEX] = index; return child; }); children.sort(getComparer(function (obj1, obj2) { return obj1.get('zIndex') - obj2.get('zIndex'); })); return this; }, findById: function findById(id) { return this.find(function (item) { return item.get('id') === id; }); }, /** * 根据查找函数查找分组或者图形 * @param {Function} fn 匹配函数 * @return {Canvas.Base} 分组或者图形 */ find: function find(fn) { if (Util.isString(fn)) { return this.findById(fn); } var children = this.get('children'); var rst = null; Util.each(children, function (item) { if (fn(item)) { rst = item; } else if (item.find) { rst = item.find(fn); } if (rst) { return false; } }); return rst; }, /** * @param {Function} fn filter mathod * @return {Array} all the matching shapes and groups */ findAll: function findAll(fn) { var children = this.get('children'); var rst = []; var childRst = []; Util.each(children, function (item) { if (fn(item)) { rst.push(item); } if (item.findAllBy) { childRst = item.findAllBy(fn); rst = rst.concat(childRst); } }); return rst; }, /** * @Deprecated * @param {Function} fn filter method * @return {Object} found shape or group */ findBy: function findBy(fn) { var children = this.get('children'); var rst = null; Util.each(children, function (item) { if (fn(item)) { rst = item; } else if (item.findBy) { rst = item.findBy(fn); } if (rst) { return false; } }); return rst; }, /** * @Deprecated * @param {Function} fn filter mathod * @return {Array} all the matching shapes and groups */ findAllBy: function findAllBy(fn) { var children = this.get('children'); var rst = []; var childRst = []; Util.each(children, function (item) { if (fn(item)) { rst.push(item); } if (item.findAllBy) { childRst = item.findAllBy(fn); rst = rst.concat(childRst); } }); return rst; }, getShape: function getShape(x, y) { var self = this; var clip = self._attrs.clip; var children = self._cfg.children; var rst; if (clip) { var v = [x, y, 1]; clip.invert(v, self.get('canvas')); // 已经在外面转换 if (clip.isPointInPath(v[0], v[1])) { rst = find(children, x, y); } } else { rst = find(children, x, y); } return rst; }, clearTotalMatrix: function clearTotalMatrix() { var m = this.get('totalMatrix'); if (m) { this.setSilent('totalMatrix', null); var children = this._cfg.children; for (var i = 0; i < children.length; i++) { var child = children[i]; child.clearTotalMatrix(); } } }, clear: function clear(delayRemove) { if (this.get('destroyed')) { return; } var children = this._cfg.children; for (var i = children.length - 1; i >= 0; i--) { children[i].remove(true, delayRemove); } this._cfg.children = []; return this; }, destroy: function destroy() { if (this.get('destroyed')) { return; } this.clear(); Group.superclass.destroy.call(this); }, clone: function clone() { var self = this; var children = self._cfg.children; var _attrs = self._attrs; var attrs = {}; Util.each(_attrs, function (i, k) { if (k === 'matrix') { attrs[k] = _cloneArrayAttr(_attrs[k]); } else { attrs[k] = _attrs[k]; } }); var clone = new Group({ attrs: attrs, canvas: self.get('canvas') }); Util.each(children, function (child) { clone.add(child.clone()); }); // 对于一些在 cfg 中的特殊属性做 clone Util.each(CLONE_CFGS, function (cfg) { clone._cfg[cfg] = self._cfg[cfg]; }); return clone; } }); module.exports = Group; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Attribute = __webpack_require__(93); var Transform = __webpack_require__(94); var Animate = __webpack_require__(95); var EventEmitter = __webpack_require__(96); var Element = function Element(cfg) { this._cfg = { zIndex: 0, capture: true, visible: true, destroyed: false }; // 配置存放地 Util.assign(this._cfg, this.getDefaultCfg(), cfg); // Element.CFG不合并,提升性能 合并默认配置,用户配置->继承默认配置->Element默认配置 this.initAttrs(this._cfg.attrs); // 初始化绘图属性 this._cfg.attrs = {}; this.initTransform(); // 初始化变换 this.init(); // 类型初始化 }; Element.CFG = { /** * 唯一标示 * @type {Number} */ id: null, /** * Z轴的层叠关系,Z值越大离用户越近 * @type {Number} */ zIndex: 0, /** * Canvas对象 * @type: {Object} */ canvas: null, /** * 父元素指针 * @type {Object} */ parent: null, /** * 用来设置当前对象是否能被捕捉 * true 能 * false 不能 * 对象默认是都可以被捕捉的, 当capture为false时,group.getShape(x, y)方法无法获得该元素 * 通过将不必要捕捉的元素的该属性设置成false, 来提高捕捉性能 * @type {Boolean} **/ capture: true, /** * 画布的上下文 * @type {Object} */ context: null, /** * 是否显示 * @type {Boolean} */ visible: true, /** * 是否被销毁 * @type: {Boolean} */ destroyed: false }; Util.augment(Element, Attribute, Transform, EventEmitter, Animate, { init: function init() { this.setSilent('animable', true); this.setSilent('animating', false); // 初始时不处于动画状态 }, getParent: function getParent() { return this._cfg.parent; }, /** * 获取默认的配置信息 * @protected * @return {Object} 默认的属性 */ getDefaultCfg: function getDefaultCfg() { return {}; }, set: function set(name, value) { if (name === 'zIndex' && this._beforeSetZIndex) { this._beforeSetZIndex(value); } if (name === 'loading' && this._beforeSetLoading) { this._beforeSetLoading(value); } this._cfg[name] = value; return this; }, // deprecated setSilent: function setSilent(name, value) { this._cfg[name] = value; }, get: function get(name) { return this._cfg[name]; }, show: function show() { this._cfg.visible = true; return this; }, hide: function hide() { this._cfg.visible = false; return this; }, remove: function remove(destroy, delayRemove) { var cfg = this._cfg; var parent = cfg.parent; var el = cfg.el; if (parent) { Util.remove(parent.get('children'), this); } if (el) { if (delayRemove) { parent && parent._cfg.tobeRemoved.push(el); } else { el.parentNode.removeChild(el); } } if (destroy || destroy === undefined) { this.destroy(); } return this; }, destroy: function destroy() { var destroyed = this.get('destroyed'); if (destroyed) { return; } this._attrs = null; this.removeEvent(); // 移除所有的事件 this._cfg = { destroyed: true }; }, toFront: function toFront() { var cfg = this._cfg; var parent = cfg.parent; if (!parent) { return; } var children = parent._cfg.children; var el = cfg.el; var index = children.indexOf(this); children.splice(index, 1); children.push(this); if (el) { el.parentNode.removeChild(el); cfg.el = null; } }, toBack: function toBack() { var cfg = this._cfg; var parent = cfg.parent; if (!parent) { return; } var children = parent._cfg.children; var el = cfg.el; var index = children.indexOf(this); children.splice(index, 1); children.unshift(this); if (el) { var parentNode = el.parentNode; parentNode.removeChild(el); parentNode.insertBefore(el, parentNode.firstChild); } }, _beforeSetZIndex: function _beforeSetZIndex(zIndex) { var parent = this._cfg.parent; this._cfg.zIndex = zIndex; if (!Util.isNil(parent)) { parent.sort(); } var el = this._cfg.el; if (el) { var children = parent._cfg.children; var index = children.indexOf(this); var parentNode = el.parentNode; parentNode.removeChild(el); if (index === children.length - 1) { parentNode.appendChild(el); } else { parentNode.insertBefore(el, parentNode.childNodes[index]); } } return zIndex; }, _setAttrs: function _setAttrs(attrs) { this.attr(attrs); return attrs; }, setZIndex: function setZIndex(zIndex) { this._cfg.zIndex = zIndex; return this._beforeSetZIndex(zIndex); }, clone: function clone() { return Util.clone(this); }, getBBox: function getBBox() {} }); module.exports = Element; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(12); var slice = Array.prototype.slice; function indexOfCallback(events, callback) { var i = events.length; while (i--) { if (events[i].callback === callback) { return i; } } return -1; } var EventEmitter = function EventEmitter() {}; Util.augment(EventEmitter, { on: function on(evt, callback, one) { var self = this; if (!Util.isFunction(callback)) { throw new TypeError('listener should be a function'); } if (!self._cfg._events) { self._cfg._events = {}; } if (!self._cfg._events[evt]) { self._cfg._events[evt] = []; } self._cfg._events[evt].push({ callback: callback, one: one }); return this; }, one: function one(evt, callback) { this.on(evt, callback, true); return this; }, emit: function emit(evt) { if (this.get('destroyed')) { return; } if (!this._cfg._events || Util.isEmpty(this._cfg._events)) { return; } var events = this._cfg._events[evt]; if (Util.isEmpty(events)) { return; } var args = arguments; var arg = slice.call(args, 1); var length = events.length; for (var i = 0; i < length;) { if (!events[i]) { continue; } events[i].callback.apply(this, arg); if (events[i] && events[i].one) { events.splice(i, 1); length--; } else { i++; } } }, trigger: function trigger() { this.emit.apply(this, arguments); }, off: function off(evt, callback) { var events = this._cfg._events; if (!events || Util.isEmpty(events)) { return; } if (arguments.length === 0) { this._cfg._events = {}; return this; } if (events[evt]) { var index = indexOfCallback(events[evt], callback); if (index >= 0) { events[evt].splice(index, 1); } if (events[evt].length === 0) { delete events[evt]; } } }, removeEvent: function removeEvent(evt) { if (typeof evt === 'undefined') { this._cfg._events = {}; } else { delete this._cfg._events[evt]; } return this; }, _getEvents: function _getEvents() { return this._cfg._events || {}; } }); module.exports = EventEmitter; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var vec2 = Util.vec2; function quadraticAt(p0, p1, p2, t) { var onet = 1 - t; return onet * (onet * p0 + 2 * t * p1) + t * t * p2; } function quadraticProjectPoint(x1, y1, x2, y2, x3, y3, x, y, out) { var t; var interval = 0.005; var d = Infinity; var d1; var v1; var v2; var _t; var d2; var i; var EPSILON = 0.0001; var v0 = [x, y]; for (_t = 0; _t < 1; _t += 0.05) { v1 = [quadraticAt(x1, x2, x3, _t), quadraticAt(y1, y2, y3, _t)]; d1 = vec2.squaredDistance(v0, v1); if (d1 < d) { t = _t; d = d1; } } d = Infinity; for (i = 0; i < 32; i++) { if (interval < EPSILON) { break; } var prev = t - interval; var next = t + interval; v1 = [quadraticAt(x1, x2, x3, prev), quadraticAt(y1, y2, y3, prev)]; d1 = vec2.squaredDistance(v0, v1); if (prev >= 0 && d1 < d) { t = prev; d = d1; } else { v2 = [quadraticAt(x1, x2, x3, next), quadraticAt(y1, y2, y3, next)]; d2 = vec2.squaredDistance(v0, v2); if (next <= 1 && d2 < d) { t = next; d = d2; } else { interval *= 0.5; } } } if (out) { out.x = quadraticAt(x1, x2, x3, t); out.y = quadraticAt(y1, y2, y3, t); } return Math.sqrt(d); } function quadraticExtrema(p0, p1, p2) { var a = p0 + p2 - 2 * p1; if (Util.isNumberEqual(a, 0)) { return [0.5]; } var rst = (p0 - p1) / a; if (rst <= 1 && rst >= 0) { return [rst]; } return []; } module.exports = { at: quadraticAt, projectPoint: function projectPoint(x1, y1, x2, y2, x3, y3, x, y) { var rst = {}; quadraticProjectPoint(x1, y1, x2, y2, x3, y3, x, y, rst); return rst; }, pointDistance: quadraticProjectPoint, extrema: quadraticExtrema }; /***/ }), /* 41 */ /***/ (function(module, exports) { module.exports = { xAt: function xAt(psi, rx, ry, cx, t) { return rx * Math.cos(psi) * Math.cos(t) - ry * Math.sin(psi) * Math.sin(t) + cx; }, yAt: function yAt(psi, rx, ry, cy, t) { return rx * Math.sin(psi) * Math.cos(t) + ry * Math.cos(psi) * Math.sin(t) + cy; }, xExtrema: function xExtrema(psi, rx, ry) { return Math.atan(-ry / rx * Math.tan(psi)); }, yExtrema: function yExtrema(psi, rx, ry) { return Math.atan(ry / (rx * Math.tan(psi))); } }; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var ArcMath = __webpack_require__(8); var Arrow = __webpack_require__(9); function _getArcX(x, radius, angle) { return x + radius * Math.cos(angle); } function _getArcY(y, radius, angle) { return y + radius * Math.sin(angle); } var Arc = function Arc(cfg) { Arc.superclass.constructor.call(this, cfg); }; Arc.ATTRS = { x: 0, y: 0, r: 0, startAngle: 0, endAngle: 0, clockwise: false, lineWidth: 1, startArrow: false, endArrow: false }; Util.extend(Arc, Shape); Util.augment(Arc, { canStroke: true, type: 'arc', getDefaultAttrs: function getDefaultAttrs() { return { x: 0, y: 0, r: 0, startAngle: 0, endAngle: 0, clockwise: false, lineWidth: 1, startArrow: false, endArrow: false }; }, calculateBox: function calculateBox() { var attrs = this._attrs; var x = attrs.x, y = attrs.y, r = attrs.r, startAngle = attrs.startAngle, endAngle = attrs.endAngle, clockwise = attrs.clockwise; var lineWidth = this.getHitLineWidth(); var halfWidth = lineWidth / 2; var box = ArcMath.box(x, y, r, startAngle, endAngle, clockwise); box.minX -= halfWidth; box.minY -= halfWidth; box.maxX += halfWidth; box.maxY += halfWidth; return box; }, getStartTangent: function getStartTangent() { var attrs = this._attrs; var x = attrs.x, y = attrs.y, startAngle = attrs.startAngle, r = attrs.r, clockwise = attrs.clockwise; var diff = Math.PI / 180; if (clockwise) { diff *= -1; } var result = []; var x1 = _getArcX(x, r, startAngle + diff); var y1 = _getArcY(y, r, startAngle + diff); var x2 = _getArcX(x, r, startAngle); var y2 = _getArcY(y, r, startAngle); result.push([x1, y1]); result.push([x2, y2]); return result; }, getEndTangent: function getEndTangent() { var attrs = this._attrs; var x = attrs.x, y = attrs.y, endAngle = attrs.endAngle, r = attrs.r, clockwise = attrs.clockwise; var diff = Math.PI / 180; var result = []; if (clockwise) { diff *= -1; } var x1 = _getArcX(x, r, endAngle + diff); var y1 = _getArcY(y, r, endAngle + diff); var x2 = _getArcX(x, r, endAngle); var y2 = _getArcY(y, r, endAngle); result.push([x2, y2]); result.push([x1, y1]); return result; }, createPath: function createPath(context) { var attrs = this._attrs; var x = attrs.x, y = attrs.y, r = attrs.r, startAngle = attrs.startAngle, endAngle = attrs.endAngle, clockwise = attrs.clockwise; context = context || self.get('context'); context.beginPath(); context.arc(x, y, r, startAngle, endAngle, clockwise); }, afterPath: function afterPath(context) { var attrs = this._attrs; context = context || this.get('context'); if (attrs.startArrow) { var startPoints = this.getStartTangent(); Arrow.addStartArrow(context, attrs, startPoints[0][0], startPoints[0][1], startPoints[1][0], startPoints[1][1]); } if (attrs.endArrow) { var endPoints = this.getEndTangent(); Arrow.addEndArrow(context, attrs, endPoints[0][0], endPoints[0][1], endPoints[1][0], endPoints[1][1]); } } }); module.exports = Arc; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Circle = function Circle(cfg) { Circle.superclass.constructor.call(this, cfg); }; Circle.ATTRS = { x: 0, y: 0, r: 0, lineWidth: 1 }; Util.extend(Circle, Shape); Util.augment(Circle, { canFill: true, canStroke: true, type: 'circle', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1 }; }, calculateBox: function calculateBox() { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.r; var lineWidth = this.getHitLineWidth(); var halfWidth = lineWidth / 2 + r; return { minX: cx - halfWidth, minY: cy - halfWidth, maxX: cx + halfWidth, maxY: cy + halfWidth }; }, createPath: function createPath(context) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.r; context.beginPath(); context.arc(cx, cy, r, 0, Math.PI * 2, false); context.closePath(); } }); module.exports = Circle; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Dom = function Dom(cfg) { Dom.superclass.constructor.call(this, cfg); }; Util.extend(Dom, Shape); Util.augment(Dom, { canFill: true, canStroke: true, type: 'dom', calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var x = attrs.x; var y = attrs.y; var width = attrs.width; var height = attrs.height; var lineWidth = this.getHitLineWidth(); var halfWidth = lineWidth / 2; return { minX: x - halfWidth, minY: y - halfWidth, maxX: x + width + halfWidth, maxY: y + height + halfWidth }; } }); module.exports = Dom; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Ellipse = function Ellipse(cfg) { Ellipse.superclass.constructor.call(this, cfg); }; Ellipse.ATTRS = { x: 0, y: 0, rx: 1, ry: 1, lineWidth: 1 }; Util.extend(Ellipse, Shape); Util.augment(Ellipse, { canFill: true, canStroke: true, type: 'ellipse', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1 }; }, calculateBox: function calculateBox() { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var rx = attrs.rx; var ry = attrs.ry; var lineWidth = this.getHitLineWidth(); var halfXWidth = rx + lineWidth / 2; var halfYWidth = ry + lineWidth / 2; return { minX: cx - halfXWidth, minY: cy - halfYWidth, maxX: cx + halfXWidth, maxY: cy + halfYWidth }; }, createPath: function createPath(context) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var rx = attrs.rx; var ry = attrs.ry; context = context || self.get('context'); var r = rx > ry ? rx : ry; var scaleX = rx > ry ? 1 : rx / ry; var scaleY = rx > ry ? ry / rx : 1; var m = [1, 0, 0, 0, 1, 0, 0, 0, 1]; Util.mat3.scale(m, m, [scaleX, scaleY]); Util.mat3.translate(m, m, [cx, cy]); context.beginPath(); context.save(); context.transform(m[0], m[1], m[3], m[4], m[6], m[7]); context.arc(0, 0, r, 0, Math.PI * 2); context.restore(); context.closePath(); } }); module.exports = Ellipse; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var ArcMath = __webpack_require__(8); var Fan = function Fan(cfg) { Fan.superclass.constructor.call(this, cfg); }; Fan.ATTRS = { x: 0, y: 0, rs: 0, re: 0, startAngle: 0, endAngle: 0, clockwise: false, lineWidth: 1 }; Util.extend(Fan, Shape); Util.augment(Fan, { canFill: true, canStroke: true, type: 'fan', getDefaultAttrs: function getDefaultAttrs() { return { clockwise: false, lineWidth: 1, rs: 0, re: 0 }; }, calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var cx = attrs.x; var cy = attrs.y; var rs = attrs.rs; var re = attrs.re; var startAngle = attrs.startAngle; var endAngle = attrs.endAngle; var clockwise = attrs.clockwise; var lineWidth = this.getHitLineWidth(); var boxs = ArcMath.box(cx, cy, rs, startAngle, endAngle, clockwise); var boxe = ArcMath.box(cx, cy, re, startAngle, endAngle, clockwise); var minX = Math.min(boxs.minX, boxe.minX); var minY = Math.min(boxs.minY, boxe.minY); var maxX = Math.max(boxs.maxX, boxe.maxX); var maxY = Math.max(boxs.maxY, boxe.maxY); var halfWidth = lineWidth / 2; return { minX: minX - halfWidth, minY: minY - halfWidth, maxX: maxX + halfWidth, maxY: maxY + halfWidth }; }, createPath: function createPath(context) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var rs = attrs.rs; var re = attrs.re; var startAngle = attrs.startAngle; var endAngle = attrs.endAngle; var clockwise = attrs.clockwise; var ssp = { x: Math.cos(startAngle) * rs + cx, y: Math.sin(startAngle) * rs + cy }; var sep = { x: Math.cos(startAngle) * re + cx, y: Math.sin(startAngle) * re + cy }; var esp = { x: Math.cos(endAngle) * rs + cx, y: Math.sin(endAngle) * rs + cy }; context = context || self.get('context'); context.beginPath(); context.moveTo(ssp.x, ssp.y); context.lineTo(sep.x, sep.y); context.arc(cx, cy, re, startAngle, endAngle, clockwise); context.lineTo(esp.x, esp.y); context.arc(cx, cy, rs, endAngle, startAngle, !clockwise); context.closePath(); } }); module.exports = Fan; /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var CImage = function CImage(cfg) { CImage.superclass.constructor.call(this, cfg); }; CImage.ATTRS = { x: 0, y: 0, img: undefined, width: 0, height: 0, sx: null, sy: null, swidth: null, sheight: null }; Util.extend(CImage, Shape); Util.augment(CImage, { type: 'image', isHitBox: function isHitBox() { return false; }, calculateBox: function calculateBox() { var attrs = this._attrs; if (!this._cfg.attrs || this._cfg.attrs.img !== attrs.img) { this._setAttrImg(); } var x = attrs.x; var y = attrs.y; var width = attrs.width; var height = attrs.height; return { minX: x, minY: y, maxX: x + width, maxY: y + height }; }, _beforeSetLoading: function _beforeSetLoading(loading) { var canvas = this.get('canvas'); if (loading === false && this.get('toDraw') === true) { this._cfg.loading = false; canvas.draw(); } return loading; }, _setAttrImg: function _setAttrImg() { var self = this; var attrs = self._attrs; var img = attrs.img; if (Util.isString(img)) { var image = new Image(); image.onload = function () { if (self.get('destroyed')) return false; self.attr('imgSrc', img); self.attr('img', image); var callback = self.get('callback'); if (callback) { callback.call(self); } self.set('loading', false); }; image.src = img; image.crossOrigin = 'Anonymous'; self.set('loading', true); } else if (img instanceof Image) { if (!attrs.width) { self.attr('width', img.width); } if (!attrs.height) { self.attr('height', img.height); } return img; } else if (img instanceof HTMLElement && Util.isString(img.nodeName) && img.nodeName.toUpperCase() === 'CANVAS') { if (!attrs.width) { self.attr('width', Number(img.getAttribute('width'))); } if (!attrs.height) { self.attr('height', Number(img.getAttribute('height'))); } return img; } else if (img instanceof ImageData) { if (!attrs.width) { self.attr('width', img.width); } if (!attrs.height) { self.attr('height', img.height); } return img; } else { return null; } }, drawInner: function drawInner(context) { if (this._cfg.hasUpdate) { this._setAttrImg(); } if (this.get('loading')) { this.set('toDraw', true); return; } this._drawImage(context); this._cfg.hasUpdate = false; }, _drawImage: function _drawImage(context) { var attrs = this._attrs; var x = attrs.x; var y = attrs.y; var image = attrs.img; var width = attrs.width; var height = attrs.height; var sx = attrs.sx; var sy = attrs.sy; var swidth = attrs.swidth; var sheight = attrs.sheight; this.set('toDraw', false); var img = image; if (img instanceof ImageData) { img = new Image(); img.src = image; } if (img instanceof Image || img instanceof HTMLElement && Util.isString(img.nodeName) && img.nodeName.toUpperCase() === 'CANVAS') { if (Util.isNil(sx) || Util.isNil(sy) || Util.isNil(swidth) || Util.isNil(sheight)) { context.drawImage(img, x, y, width, height); return; } if (!Util.isNil(sx) && !Util.isNil(sy) && !Util.isNil(swidth) && !Util.isNil(sheight)) { context.drawImage(img, sx, sy, swidth, sheight, x, y, width, height); return; } } return; } }); module.exports = CImage; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Arrow = __webpack_require__(9); var LineMath = __webpack_require__(7); var Line = function Line(cfg) { Line.superclass.constructor.call(this, cfg); }; Line.ATTRS = { x1: 0, y1: 0, x2: 0, y2: 0, lineWidth: 1, startArrow: false, endArrow: false }; Util.extend(Line, Shape); Util.augment(Line, { canStroke: true, type: 'line', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1, startArrow: false, endArrow: false }; }, calculateBox: function calculateBox() { var attrs = this._attrs; var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2; var lineWidth = this.getHitLineWidth(); return LineMath.box(x1, y1, x2, y2, lineWidth); }, createPath: function createPath(context) { var self = this; var attrs = this._attrs; var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2; // 如果定义了箭头,并且是自定义箭头,线条相应缩进 if (attrs.startArrow && attrs.startArrow.d) { var dist = Arrow.getShortenOffset(x1, y1, x2, y2, attrs.startArrow.d); x1 += dist.dx; y1 += dist.dy; } if (attrs.endArrow && attrs.endArrow.d) { var _dist = Arrow.getShortenOffset(x1, y1, x2, y2, attrs.endArrow.d); x2 -= _dist.dx; y2 -= _dist.dy; } context = context || self.get('context'); context.beginPath(); context.moveTo(x1, y1); context.lineTo(x2, y2); }, afterPath: function afterPath(context) { var self = this; var attrs = self._attrs; var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2; context = context || self.get('context'); if (attrs.startArrow) { Arrow.addStartArrow(context, attrs, x2, y2, x1, y1); } if (attrs.endArrow) { Arrow.addEndArrow(context, attrs, x1, y1, x2, y2); } }, getPoint: function getPoint(t) { var attrs = this._attrs; return { x: LineMath.at(attrs.x1, attrs.x2, t), y: LineMath.at(attrs.y1, attrs.y2, t) }; } }); module.exports = Line; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var PathSegment = __webpack_require__(10); var Format = __webpack_require__(4); var Arrow = __webpack_require__(9); var PathUtil = __webpack_require__(22); var CubicMath = __webpack_require__(20); var Path = function Path(cfg) { Path.superclass.constructor.call(this, cfg); }; Path.ATTRS = { path: null, lineWidth: 1, startArrow: false, endArrow: false }; Util.extend(Path, Shape); Util.augment(Path, { canFill: true, canStroke: true, type: 'path', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1, startArrow: false, endArrow: false }; }, _afterSetAttrPath: function _afterSetAttrPath(path) { var self = this; if (Util.isNil(path)) { self.setSilent('segments', null); self.setSilent('box', undefined); return; } var pathArray = Format.parsePath(path); var preSegment; var segments = []; if (!Util.isArray(pathArray) || pathArray.length === 0 || pathArray[0][0] !== 'M' && pathArray[0][0] !== 'm') { return; } var count = pathArray.length; for (var i = 0; i < pathArray.length; i++) { var item = pathArray[i]; preSegment = new PathSegment(item, preSegment, i === count - 1); segments.push(preSegment); } self.setSilent('segments', segments); self.setSilent('tCache', null); self.setSilent('totalLength', null); self.setSilent('box', null); }, calculateBox: function calculateBox() { var self = this; var segments = self.get('segments'); if (!segments) { return null; } var lineWidth = this.getHitLineWidth(); var minX = Infinity; var maxX = -Infinity; var minY = Infinity; var maxY = -Infinity; Util.each(segments, function (segment) { segment.getBBox(lineWidth); var box = segment.box; if (box) { if (box.minX < minX) { minX = box.minX; } if (box.maxX > maxX) { maxX = box.maxX; } if (box.minY < minY) { minY = box.minY; } if (box.maxY > maxY) { maxY = box.maxY; } } }); if (minX === Infinity || minY === Infinity) { return { minX: 0, minY: 0, maxX: 0, maxY: 0 }; } return { minX: minX, minY: minY, maxX: maxX, maxY: maxY }; }, _setTcache: function _setTcache() { var totalLength = 0; var tempLength = 0; var tCache = []; var segmentT; var segmentL; var segmentN; var l; var curve = this._cfg.curve; if (!curve) { return; } Util.each(curve, function (segment, i) { segmentN = curve[i + 1]; l = segment.length; if (segmentN) { totalLength += CubicMath.len(segment[l - 2], segment[l - 1], segmentN[1], segmentN[2], segmentN[3], segmentN[4], segmentN[5], segmentN[6]); } }); this._cfg.totalLength = totalLength; if (totalLength === 0) { this._cfg.tCache = []; return; } Util.each(curve, function (segment, i) { segmentN = curve[i + 1]; l = segment.length; if (segmentN) { segmentT = []; segmentT[0] = tempLength / totalLength; segmentL = CubicMath.len(segment[l - 2], segment[l - 1], segmentN[1], segmentN[2], segmentN[3], segmentN[4], segmentN[5], segmentN[6]); tempLength += segmentL; segmentT[1] = tempLength / totalLength; tCache.push(segmentT); } }); this._cfg.tCache = tCache; }, getTotalLength: function getTotalLength() { var totalLength = this.get('totalLength'); if (!Util.isNil(totalLength)) { return totalLength; } this._calculateCurve(); this._setTcache(); return this.get('totalLength'); }, _calculateCurve: function _calculateCurve() { var self = this; var attrs = self._attrs; var path = attrs.path; this._cfg.curve = PathUtil.pathTocurve(path); }, getStartTangent: function getStartTangent() { var segments = this.get('segments'); var startPoint, endPoint, tangent, result; if (segments.length > 1) { startPoint = segments[0].endPoint; endPoint = segments[1].endPoint; tangent = segments[1].startTangent; result = []; if (Util.isFunction(tangent)) { var v = tangent(); result.push([startPoint.x - v[0], startPoint.y - v[1]]); result.push([startPoint.x, startPoint.y]); } else { result.push([endPoint.x, endPoint.y]); result.push([startPoint.x, startPoint.y]); } } return result; }, getEndTangent: function getEndTangent() { var segments = this.get('segments'); var segmentsLen = segments.length; var startPoint, endPoint, tangent, result; if (segmentsLen > 1) { startPoint = segments[segmentsLen - 2].endPoint; endPoint = segments[segmentsLen - 1].endPoint; tangent = segments[segmentsLen - 1].endTangent; result = []; if (Util.isFunction(tangent)) { var v = tangent(); result.push([endPoint.x - v[0], endPoint.y - v[1]]); result.push([endPoint.x, endPoint.y]); } else { result.push([startPoint.x, startPoint.y]); result.push([endPoint.x, endPoint.y]); } } return result; }, getPoint: function getPoint(t) { var tCache = this._cfg.tCache; var subt; var index; if (!tCache) { this._calculateCurve(); this._setTcache(); tCache = this._cfg.tCache; } var curve = this._cfg.curve; if (!tCache || tCache.length === 0) { if (curve) { return { x: curve[0][1], y: curve[0][2] }; } return null; } Util.each(tCache, function (v, i) { if (t >= v[0] && t <= v[1]) { subt = (t - v[0]) / (v[1] - v[0]); index = i; } }); var seg = curve[index]; if (Util.isNil(seg) || Util.isNil(index)) { return null; } var l = seg.length; var nextSeg = curve[index + 1]; return { x: CubicMath.at(seg[l - 2], nextSeg[1], nextSeg[3], nextSeg[5], 1 - subt), y: CubicMath.at(seg[l - 1], nextSeg[2], nextSeg[4], nextSeg[6], 1 - subt) }; }, createPath: function createPath(context) { var self = this; var attrs = self._attrs; var segments = self.get('segments'); if (!Util.isArray(segments)) { return; } var segmentsLen = segments.length; if (segmentsLen === 0) { return; } context = context || self.get('context'); context.beginPath(); if (attrs.startArrow && attrs.startArrow.d) { // 如果 startArrow 需要做偏移,为了保证 path 长度一定,需要向内缩进一定距离 // 如果直接修改 PathSegment 的 params 会导致画布每重绘一次线条便缩短一截 // 所以在绘制时计算要缩进的距离,直接绘制出来 var tangent = self.getStartTangent(); var dist = Arrow.getShortenOffset(tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1], attrs.startArrow.d); segments[0].shortenDraw(context, dist.dx, dist.dy); } else { segments[0].draw(context); } for (var i = 1; i < segmentsLen - 2; i++) { segments[i].draw(context); } if (attrs.endArrow && attrs.endArrow.d) { // 如果 endArrow 需要做偏移,跟 startArrow 一样处理 // 为了防止结尾为 'Z' 的 segment 缩短不起效,需要取最后两个 segment 特殊处理 var _tangent = self.getEndTangent(); var _dist = Arrow.getShortenOffset(_tangent[0][0], _tangent[0][1], _tangent[1][0], _tangent[1][1], attrs.endArrow.d); var segment = segments[segmentsLen - 1]; if (segment.command.toUpperCase() === 'Z') { if (segments[segmentsLen - 2]) { segments[segmentsLen - 2].shortenDraw(context, _dist.dx, _dist.dy); } segment.draw(context); } else { if (segmentsLen > 2) { segments[segmentsLen - 2].draw(context); } segment.shortenDraw(context, _dist.dx, _dist.dy); } } else { if (segments[segmentsLen - 2]) { segments[segmentsLen - 2].draw(context); } segments[segmentsLen - 1].draw(context); } }, afterPath: function afterPath(context) { var self = this; var attrs = self._attrs; var segments = self.get('segments'); var path = attrs.path; context = context || self.get('context'); if (!Util.isArray(segments)) { return; } if (segments.length === 1) { return; } if (!attrs.startArrow && !attrs.endArrow) { return; } if (path[path.length - 1] === 'z' || path[path.length - 1] === 'Z' || attrs.fill) { // 闭合路径不绘制箭头 return; } var startPoints = self.getStartTangent(); Arrow.addStartArrow(context, attrs, startPoints[0][0], startPoints[0][1], startPoints[1][0], startPoints[1][1]); var endPoints = self.getEndTangent(); Arrow.addEndArrow(context, attrs, endPoints[0][0], endPoints[0][1], endPoints[1][0], endPoints[1][1]); } }); module.exports = Path; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Polygon = function Polygon(cfg) { Polygon.superclass.constructor.call(this, cfg); }; Polygon.ATTRS = { points: null, lineWidth: 1 }; Util.extend(Polygon, Shape); Util.augment(Polygon, { canFill: true, canStroke: true, type: 'polygon', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1 }; }, calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var points = attrs.points; var lineWidth = this.getHitLineWidth(); if (!points || points.length === 0) { return null; } var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; Util.each(points, function (point) { var x = point[0]; var y = point[1]; if (x < minX) { minX = x; } if (x > maxX) { maxX = x; } if (y < minY) { minY = y; } if (y > maxY) { maxY = y; } }); var halfWidth = lineWidth / 2; return { minX: minX - halfWidth, minY: minY - halfWidth, maxX: maxX + halfWidth, maxY: maxY + halfWidth }; }, createPath: function createPath(context) { var self = this; var attrs = self._attrs; var points = attrs.points; if (points.length < 2) { return; } context = context || self.get('context'); context.beginPath(); Util.each(points, function (point, index) { if (index === 0) { context.moveTo(point[0], point[1]); } else { context.lineTo(point[0], point[1]); } }); context.closePath(); } }); module.exports = Polygon; /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var Arrow = __webpack_require__(9); var LineMath = __webpack_require__(7); var Polyline = function Polyline(cfg) { Polyline.superclass.constructor.call(this, cfg); }; Polyline.ATTRS = { points: null, lineWidth: 1, startArrow: false, endArrow: false, tCache: null }; Util.extend(Polyline, Shape); Util.augment(Polyline, { canStroke: true, type: 'polyline', tCache: null, // 缓存各点的t getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1, startArrow: false, endArrow: false }; }, calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var lineWidth = this.getHitLineWidth(); var points = attrs.points; if (!points || points.length === 0) { return null; } var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; Util.each(points, function (point) { var x = point[0]; var y = point[1]; if (x < minX) { minX = x; } if (x > maxX) { maxX = x; } if (y < minY) { minY = y; } if (y > maxY) { maxY = y; } }); var halfWidth = lineWidth / 2; return { minX: minX - halfWidth, minY: minY - halfWidth, maxX: maxX + halfWidth, maxY: maxY + halfWidth }; }, _setTcache: function _setTcache() { var self = this; var attrs = self._attrs; var points = attrs.points; var totalLength = 0; var tempLength = 0; var tCache = []; var segmentT; var segmentL; if (!points || points.length === 0) { return; } Util.each(points, function (p, i) { if (points[i + 1]) { totalLength += LineMath.len(p[0], p[1], points[i + 1][0], points[i + 1][1]); } }); if (totalLength <= 0) { return; } Util.each(points, function (p, i) { if (points[i + 1]) { segmentT = []; segmentT[0] = tempLength / totalLength; segmentL = LineMath.len(p[0], p[1], points[i + 1][0], points[i + 1][1]); tempLength += segmentL; segmentT[1] = tempLength / totalLength; tCache.push(segmentT); } }); this.tCache = tCache; }, createPath: function createPath(context) { var self = this; var attrs = self._attrs; var points = attrs.points; var i; if (points.length < 2) { return; } var len = points.length - 1; var x1 = points[0][0], y1 = points[0][1], x2 = points[len][0], y2 = points[len][1]; // 如果定义了箭头,并且是自定义箭头,线条相应缩进 if (attrs.startArrow && attrs.startArrow.d) { var dist = Arrow.getShortenOffset(points[0][0], points[0][1], points[1][0], points[1][1], attrs.startArrow.d); x1 += dist.dx; y1 += dist.dy; } if (attrs.endArrow && attrs.endArrow.d) { var _dist = Arrow.getShortenOffset(points[len - 1][0], points[len - 1][1], points[len][0], points[len][1], attrs.endArrow.d); x2 -= _dist.dx; y2 -= _dist.dy; } context = context || self.get('context'); context.beginPath(); context.moveTo(x1, y1); for (i = 1; i < len; i++) { context.lineTo(points[i][0], points[i][1]); } context.lineTo(x2, y2); }, getStartTangent: function getStartTangent() { var points = this.__attrs.points; var result = []; result.push([points[1][0], points[1][1]]); result.push([points[0][0], points[0][1]]); return result; }, getEndTangent: function getEndTangent() { var points = this.__attrs.points; var l = points.length - 1; var result = []; result.push([points[l - 1][0], points[l - 1][1]]); result.push([points[l][0], points[l][1]]); return result; }, afterPath: function afterPath(context) { var self = this; var attrs = self._attrs; var points = attrs.points; var l = points.length - 1; context = context || self.get('context'); if (attrs.startArrow) { Arrow.addStartArrow(context, attrs, points[1][0], points[1][1], points[0][0], points[0][1]); } if (attrs.endArrow) { Arrow.addEndArrow(context, attrs, points[l - 1][0], points[l - 1][1], points[l][0], points[l][1]); } }, getPoint: function getPoint(t) { var attrs = this._attrs; var points = attrs.points; var tCache = this.tCache; var subt; var index; if (!tCache) { this._setTcache(); tCache = this.tCache; } Util.each(tCache, function (v, i) { if (t >= v[0] && t <= v[1]) { subt = (t - v[0]) / (v[1] - v[0]); index = i; } }); return { x: LineMath.at(points[index][0], points[index + 1][0], subt), y: LineMath.at(points[index][1], points[index + 1][1], subt) }; } }); module.exports = Polyline; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var _require = __webpack_require__(4), parseRadius = _require.parseRadius; var Shape = __webpack_require__(1); var Rect = function Rect(cfg) { Rect.superclass.constructor.call(this, cfg); }; Rect.ATTRS = { x: 0, y: 0, width: 0, height: 0, radius: 0, lineWidth: 1 }; Util.extend(Rect, Shape); Util.augment(Rect, { canFill: true, canStroke: true, type: 'rect', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1, radius: 0 }; }, calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var x = attrs.x; var y = attrs.y; var width = attrs.width; var height = attrs.height; var lineWidth = this.getHitLineWidth(); var halfWidth = lineWidth / 2; return { minX: x - halfWidth, minY: y - halfWidth, maxX: x + width + halfWidth, maxY: y + height + halfWidth }; }, createPath: function createPath(context) { var self = this; var attrs = self._attrs; var x = attrs.x; var y = attrs.y; var width = attrs.width; var height = attrs.height; var radius = attrs.radius; context = context || self.get('context'); context.beginPath(); if (radius === 0) { // 改成原生的rect方法 context.rect(x, y, width, height); } else { var r = parseRadius(radius); context.moveTo(x + r.r1, y); context.lineTo(x + width - r.r2, y); r.r2 !== 0 && context.arc(x + width - r.r2, y + r.r2, r.r2, -Math.PI / 2, 0); context.lineTo(x + width, y + height - r.r3); r.r3 !== 0 && context.arc(x + width - r.r3, y + height - r.r3, r.r3, 0, Math.PI / 2); context.lineTo(x + r.r4, y + height); r.r4 !== 0 && context.arc(x + r.r4, y + height - r.r4, r.r4, Math.PI / 2, Math.PI); context.lineTo(x, y + r.r1); r.r1 !== 0 && context.arc(x + r.r1, y + r.r1, r.r1, Math.PI, Math.PI * 1.5); context.closePath(); } } }); module.exports = Rect; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Shape = __webpack_require__(1); var CText = function CText(cfg) { CText.superclass.constructor.call(this, cfg); }; CText.ATTRS = { x: 0, y: 0, text: null, fontSize: 12, fontFamily: 'sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontVariant: 'normal', textAlign: 'start', textBaseline: 'bottom', lineHeight: null, textArr: null }; Util.extend(CText, Shape); Util.augment(CText, { canFill: true, canStroke: true, type: 'text', getDefaultAttrs: function getDefaultAttrs() { return { lineWidth: 1, lineCount: 1, fontSize: 12, fontFamily: 'sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontVariant: 'normal', textAlign: 'start', textBaseline: 'bottom' }; }, initTransform: function initTransform() { var fontSize = this._attrs.fontSize; if (fontSize && +fontSize < 12) { // 小于 12 像素的文本进行 scale 处理 this.transform([['t', -1 * this._attrs.x, -1 * this._attrs.y], ['s', +fontSize / 12, +fontSize / 12], ['t', this._attrs.x, this._attrs.y]]); } }, _assembleFont: function _assembleFont() { // var self = this; var attrs = this._attrs; var fontSize = attrs.fontSize; var fontFamily = attrs.fontFamily; var fontWeight = attrs.fontWeight; var fontStyle = attrs.fontStyle; // self.attr('fontStyle'); var fontVariant = attrs.fontVariant; // self.attr('fontVariant'); // self.attr('font', [fontStyle, fontVariant, fontWeight, fontSize + 'px', fontFamily].join(' ')); attrs.font = [fontStyle, fontVariant, fontWeight, fontSize + 'px', fontFamily].join(' '); }, _setAttrText: function _setAttrText() { var attrs = this._attrs; var text = attrs.text; var textArr = null; if (Util.isString(text)) { if (text.indexOf('\n') !== -1) { textArr = text.split('\n'); var lineCount = textArr.length; attrs.lineCount = lineCount; } else { attrs.lineCount = 1; } } attrs.textArr = textArr; }, _getTextHeight: function _getTextHeight() { var attrs = this._attrs; var lineCount = attrs.lineCount; var fontSize = attrs.fontSize * 1; if (lineCount > 1) { var spaceingY = this._getSpaceingY(); return fontSize * lineCount + spaceingY * (lineCount - 1); } return fontSize; }, isHitBox: function isHitBox() { return false; }, calculateBox: function calculateBox() { var self = this; var attrs = self._attrs; var cfg = this._cfg; if (!cfg.attrs || cfg.hasUpdate) { this._assembleFont(); this._setAttrText(); } if (!attrs.textArr) { this._setAttrText(); } var x = attrs.x; var y = attrs.y; var width = self.measureText(); // attrs.width if (!width) { // 如果width不存在,四点共其实点 return { minX: x, minY: y, maxX: x, maxY: y }; } var height = self._getTextHeight(); // attrs.height var textAlign = attrs.textAlign; var textBaseline = attrs.textBaseline; var lineWidth = self.getHitLineWidth(); var point = { x: x, y: y - height }; if (textAlign) { if (textAlign === 'end' || textAlign === 'right') { point.x -= width; } else if (textAlign === 'center') { point.x -= width / 2; } } if (textBaseline) { if (textBaseline === 'top') { point.y += height; } else if (textBaseline === 'middle') { point.y += height / 2; } } this.set('startPoint', point); var halfWidth = lineWidth / 2; return { minX: point.x - halfWidth, minY: point.y - halfWidth, maxX: point.x + width + halfWidth, maxY: point.y + height + halfWidth }; }, _getSpaceingY: function _getSpaceingY() { var attrs = this._attrs; var lineHeight = attrs.lineHeight; var fontSize = attrs.fontSize * 1; return lineHeight ? lineHeight - fontSize : fontSize * 0.14; }, drawInner: function drawInner(context) { var self = this; var attrs = self._attrs; var cfg = this._cfg; if (!cfg.attrs || cfg.hasUpdate) { this._assembleFont(); this._setAttrText(); } context.font = attrs.font; var text = attrs.text; if (!text) { return; } var textArr = attrs.textArr; var x = attrs.x; var y = attrs.y; context.beginPath(); if (self.hasStroke()) { var strokeOpacity = attrs.strokeOpacity; if (!Util.isNil(strokeOpacity) && strokeOpacity !== 1) { context.globalAlpha = strokeOpacity; } if (textArr) { self._drawTextArr(context, false); } else { context.strokeText(text, x, y); } context.globalAlpha = 1; } if (self.hasFill()) { var fillOpacity = attrs.fillOpacity; if (!Util.isNil(fillOpacity) && fillOpacity !== 1) { context.globalAlpha = fillOpacity; } if (textArr) { self._drawTextArr(context, true); } else { context.fillText(text, x, y); } } cfg.hasUpdate = false; }, _drawTextArr: function _drawTextArr(context, fill) { var textArr = this._attrs.textArr; var textBaseline = this._attrs.textBaseline; var fontSize = this._attrs.fontSize * 1; var spaceingY = this._getSpaceingY(); var x = this._attrs.x; var y = this._attrs.y; var box = this.getBBox(); var height = box.maxY - box.minY; var subY; Util.each(textArr, function (subText, index) { subY = y + index * (spaceingY + fontSize) - height + fontSize; // bottom; if (textBaseline === 'middle') subY += height - fontSize - (height - fontSize) / 2; if (textBaseline === 'top') subY += height - fontSize; if (fill) { context.fillText(subText, x, subY); } else { context.strokeText(subText, x, subY); } }); }, measureText: function measureText() { var self = this; var attrs = self._attrs; var text = attrs.text; var font = attrs.font; var textArr = attrs.textArr; var measureWidth; var width = 0; if (Util.isNil(text)) return undefined; var context = document.createElement('canvas').getContext('2d'); context.save(); context.font = font; if (textArr) { Util.each(textArr, function (subText) { measureWidth = context.measureText(subText).width; if (width < measureWidth) { width = measureWidth; } context.restore(); }); } else { width = context.measureText(text).width; context.restore(); } return width; } }); module.exports = CText; /***/ }), /* 54 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return deg2rad; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return rad2deg; }); var deg2rad = Math.PI / 180; var rad2deg = 180 / Math.PI; /***/ }), /* 55 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return rgbBasis; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return rgbBasisClosed; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__basis__ = __webpack_require__(27); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__basisClosed__ = __webpack_require__(56); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__color__ = __webpack_require__(5); /* harmony default export */ __webpack_exports__["a"] = ((function rgbGamma(y) { var color = Object(__WEBPACK_IMPORTED_MODULE_3__color__["b" /* gamma */])(y); function rgb(start, end) { var r = color((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["f" /* rgb */])(start)).r, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["f" /* rgb */])(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = Object(__WEBPACK_IMPORTED_MODULE_3__color__["a" /* default */])(start.opacity, end.opacity); return function (t) { start.r = r(t); start.g = g(t); start.b = b(t); start.opacity = opacity(t); return start + ""; }; } rgb.gamma = rgbGamma; return rgb; })(1)); function rgbSpline(spline) { return function (colors) { var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color; for (i = 0; i < n; ++i) { color = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["f" /* rgb */])(colors[i]); r[i] = color.r || 0; g[i] = color.g || 0; b[i] = color.b || 0; } r = spline(r); g = spline(g); b = spline(b); color.opacity = 1; return function (t) { color.r = r(t); color.g = g(t); color.b = b(t); return color + ""; }; }; } var rgbBasis = rgbSpline(__WEBPACK_IMPORTED_MODULE_1__basis__["b" /* default */]); var rgbBasisClosed = rgbSpline(__WEBPACK_IMPORTED_MODULE_2__basisClosed__["a" /* default */]); /***/ }), /* 56 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(27); /* harmony default export */ __webpack_exports__["a"] = (function (values) { var n = values.length; return function (t) { var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; return Object(__WEBPACK_IMPORTED_MODULE_0__basis__["a" /* basis */])((t - i / n) * n, v0, v1, v2, v3); }; }); /***/ }), /* 57 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony default export */ __webpack_exports__["a"] = (function (x) { return function () { return x; }; }); /***/ }), /* 58 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(24); /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i; for (i = 0; i < na; ++i) x[i] = Object(__WEBPACK_IMPORTED_MODULE_0__value__["a" /* default */])(a[i], b[i]); for (; i < nb; ++i) c[i] = b[i]; return function (t) { for (i = 0; i < na; ++i) c[i] = x[i](t); return c; }; }); /***/ }), /* 59 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { var d = new Date(); return a = +a, b -= a, function (t) { return d.setTime(a + b * t), d; }; }); /***/ }), /* 60 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(24); /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { var i = {}, c = {}, k; if (a === null || typeof a !== "object") a = {}; if (b === null || typeof b !== "object") b = {}; for (k in b) { if (k in a) { i[k] = Object(__WEBPACK_IMPORTED_MODULE_0__value__["a" /* default */])(a[k], b[k]); } else { c[k] = b[k]; } } return function (t) { for (k in i) c[k] = i[k](t); return c; }; }); /***/ }), /* 61 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(11); var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, reB = new RegExp(reA.source, "g"); function zero(b) { return function () { return b; }; } function one(b) { return function (t) { return b(t) + ""; }; } /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b am, // current match in a bm, // current match in b bs, // string preceding current number in b, if any i = -1, // index in s s = [], // string constants and placeholders q = []; // number interpolators // Coerce inputs to strings. a = a + "", b = b + ""; // Interpolate pairs of numbers in a & b. while ((am = reA.exec(a)) && (bm = reB.exec(b))) { if ((bs = bm.index) > bi) { // a string precedes the next number in b bs = b.slice(bi, bs); if (s[i]) s[i] += bs; // coalesce with previous string else s[++i] = bs; } if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match if (s[i]) s[i] += bm; // coalesce with previous string else s[++i] = bm; } else { // interpolate non-matching numbers s[++i] = null; q.push({ i: i, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(am, bm) }); } bi = reB.lastIndex; } // Add remains of b. if (bi < b.length) { bs = b.slice(bi); if (s[i]) s[i] += bs; // coalesce with previous string else s[++i] = bs; } // Special optimization for only a single match. // Otherwise, interpolate each of the numbers and rejoin the string. return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function (t) { for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); return s.join(""); }); }); /***/ }), /* 62 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { Canvas: __webpack_require__(63), Group: __webpack_require__(37), Shape: __webpack_require__(1), Arc: __webpack_require__(42), Circle: __webpack_require__(43), Dom: __webpack_require__(44), Ellipse: __webpack_require__(45), Fan: __webpack_require__(46), Image: __webpack_require__(47), Line: __webpack_require__(48), Marker: __webpack_require__(21), Path: __webpack_require__(49), Polygon: __webpack_require__(50), Polyline: __webpack_require__(51), Rect: __webpack_require__(52), Text: __webpack_require__(53), PathSegment: __webpack_require__(10), PathUtil: __webpack_require__(22), Event: __webpack_require__(18), EventEmitter: __webpack_require__(39), // version, etc. version: '3.4.10' }; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { var _require = __webpack_require__(64), detect = _require.detect; var Util = __webpack_require__(0); var Event = __webpack_require__(92); var Group = __webpack_require__(37); var Timeline = __webpack_require__(99); var renderers = __webpack_require__(127); var browser = detect(); var isFirefox = browser && browser.name === 'firefox'; var Canvas = function Canvas(cfg) { Canvas.superclass.constructor.call(this, cfg); }; Canvas.CFG = { eventEnable: true, /** * 像素宽度 * @type {Number} */ width: null, /** * 像素高度 * @type {Number} */ height: null, /** * 画布宽度 * @type {Number} */ widthCanvas: null, /** * 画布高度 * @type {Number} */ heightCanvas: null, /** * CSS宽 * @type {String} */ widthStyle: null, /** * CSS高 * @type {String} */ heightStyle: null, /** * 容器DOM * @type {Object} */ containerDOM: null, /** * 当前Canvas的DOM * @type {Object} */ canvasDOM: null, /** * 屏幕像素比 * @type {Number} */ pixelRatio: null, /** * 渲染器,默认是canvas * @type {String} */ renderer: 'canvas', /** * 是否支持 CSS Transform * CSS transform 目前尚未经过长时间验证,为了避免影响上层业务,默认关闭,上层按需开启 */ supportCSSTransform: false }; Util.extend(Canvas, Group); Util.augment(Canvas, Event, { init: function init() { Canvas.superclass.init.call(this); this._setGlobalParam(); this._setContainer(); this._initPainter(); this._scale(); if (this.get('eventEnable')) { this.registerEvent(this); } }, _scale: function _scale() { if (this._cfg.renderType !== 'svg') { var pixelRatio = this.get('pixelRatio'); this.scale(pixelRatio, pixelRatio); } }, _setGlobalParam: function _setGlobalParam() { var renderType = this.get('renderer') || 'canvas'; if (renderType === 'svg') { this.set('pixelRatio', 1); } else if (!this.get('pixelRatio')) { this.set('pixelRatio', Util.getRatio()); } this._cfg.renderType = renderType; var renderer = renderers[renderType]; this._cfg.renderer = renderer; this._cfg.canvas = this; var timeline = new Timeline(this); this._cfg.timeline = timeline; }, _setContainer: function _setContainer() { var containerId = this.get('containerId'); var containerDOM = this.get('containerDOM'); if (!containerDOM) { containerDOM = document.getElementById(containerId); this.set('containerDOM', containerDOM); } Util.modifyCSS(containerDOM, { position: 'relative' }); }, _initPainter: function _initPainter() { var containerDOM = this.get('containerDOM'); var painter = new this._cfg.renderer.painter(containerDOM); this._cfg.painter = painter; this._cfg.canvasDOM = this._cfg.el = painter.canvas; this.changeSize(this.get('width'), this.get('height')); }, _resize: function _resize() { var canvasDOM = this.get('canvasDOM'); var widthCanvas = this.get('widthCanvas'); var heightCanvas = this.get('heightCanvas'); var widthStyle = this.get('widthStyle'); var heightStyle = this.get('heightStyle'); canvasDOM.style.width = widthStyle; canvasDOM.style.height = heightStyle; canvasDOM.setAttribute('width', widthCanvas); canvasDOM.setAttribute('height', heightCanvas); }, getWidth: function getWidth() { var pixelRatio = this.get('pixelRatio'); var width = this.get('width'); return width * pixelRatio; }, getHeight: function getHeight() { var pixelRatio = this.get('pixelRatio'); var height = this.get('height'); return height * pixelRatio; }, changeSize: function changeSize(width, height) { var pixelRatio = this.get('pixelRatio'); var widthCanvas = width * pixelRatio; var heightCanvas = height * pixelRatio; this.set('widthCanvas', widthCanvas); this.set('heightCanvas', heightCanvas); this.set('widthStyle', width + 'px'); this.set('heightStyle', height + 'px'); this.set('width', width); this.set('height', height); this._resize(); }, getPointByEvent: function getPointByEvent(ev) { var supportCSSTransform = this.get('supportCSSTransform'); if (supportCSSTransform) { var pixelRatio = this.get('pixelRatio') || 1; // For Firefox <= 38 if (isFirefox && !Util.isNil(ev.layerX) && ev.layerX !== ev.offsetX) { return { x: ev.layerX * pixelRatio, y: ev.layerY * pixelRatio }; } if (!Util.isNil(ev.offsetX)) { // For IE6+, Firefox >= 39, Chrome, Safari, Opera return { x: ev.offsetX * pixelRatio, y: ev.offsetY * pixelRatio }; } } // should calculate by self for other cases, like Safari in ios // TODO: support CSS transform var _this$getClientByEven = this.getClientByEvent(ev), clientX = _this$getClientByEven.x, clientY = _this$getClientByEven.y; return this.getPointByClient(clientX, clientY); }, // 获取 touch 事件的 clientX 和 clientY 需要单独处理 getClientByEvent: function getClientByEvent(ev) { var clientInfo = ev; if (ev.touches) { if (ev.type === 'touchend') { clientInfo = ev.changedTouches[0]; } else { clientInfo = ev.touches[0]; } } return { x: clientInfo.clientX, y: clientInfo.clientY }; }, /** * 将窗口坐标转变成 canvas 坐标 * @param {Number} clientX 窗口x坐标 * @param {Number} clientY 窗口y坐标 * @return {Object} canvas坐标 */ getPointByClient: function getPointByClient(clientX, clientY) { var el = this.get('el'); var pixelRatio = this.get('pixelRatio') || 1; var bbox = el.getBoundingClientRect(); return { x: (clientX - bbox.left) * pixelRatio, y: (clientY - bbox.top) * pixelRatio }; }, getClientByPoint: function getClientByPoint(x, y) { var el = this.get('el'); var bbox = el.getBoundingClientRect(); var pixelRatio = this.get('pixelRatio') || 1; return { clientX: x / pixelRatio + bbox.left, clientY: y / pixelRatio + bbox.top }; }, draw: function draw() { this._cfg.painter.draw(this); }, getShape: function getShape(x, y, e) { if (arguments.length === 3 && this._cfg.renderer.getShape) { return this._cfg.renderer.getShape.call(this, x, y, e); } return Canvas.superclass.getShape.call(this, x, y); }, getRenderer: function getRenderer() { return this._cfg.renderType; }, _drawSync: function _drawSync() { this._cfg.painter.drawSync(this); }, destroy: function destroy() { var cfg = this._cfg; var containerDOM = cfg.containerDOM; var canvasDOM = cfg.canvasDOM; if (canvasDOM && containerDOM) { containerDOM.removeChild(canvasDOM); } cfg.timeline.stop(); Canvas.superclass.destroy.call(this); } }); module.exports = Canvas; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(process) { var __spreadArrays = this && this.__spreadArrays || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); var BrowserInfo = /** @class */ function () { function BrowserInfo(name, version, os) { this.name = name; this.version = version; this.os = os; this.type = 'browser'; } return BrowserInfo; }(); exports.BrowserInfo = BrowserInfo; var NodeInfo = /** @class */ function () { function NodeInfo(version) { this.version = version; this.type = 'node'; this.name = 'node'; this.os = process.platform; } return NodeInfo; }(); exports.NodeInfo = NodeInfo; var SearchBotDeviceInfo = /** @class */ function () { function SearchBotDeviceInfo(name, version, os, bot) { this.name = name; this.version = version; this.os = os; this.bot = bot; this.type = 'bot-device'; } return SearchBotDeviceInfo; }(); exports.SearchBotDeviceInfo = SearchBotDeviceInfo; var BotInfo = /** @class */ function () { function BotInfo() { this.type = 'bot'; this.bot = true; // NOTE: deprecated test name instead this.name = 'bot'; this.version = null; this.os = null; } return BotInfo; }(); exports.BotInfo = BotInfo; var ReactNativeInfo = /** @class */ function () { function ReactNativeInfo() { this.type = 'react-native'; this.name = 'react-native'; this.version = null; this.os = null; } return ReactNativeInfo; }(); exports.ReactNativeInfo = ReactNativeInfo; ; // tslint:disable-next-line:max-line-length var SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/; var SEARCHBOT_OS_REGEX = /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/; var REQUIRED_VERSION_PARTS = 3; var userAgentRules = [['aol', /AOLShield\/([0-9\._]+)/], ['edge', /Edge\/([0-9\._]+)/], ['edge-ios', /EdgiOS\/([0-9\._]+)/], ['yandexbrowser', /YaBrowser\/([0-9\._]+)/], ['kakaotalk', /KAKAOTALK\s([0-9\.]+)/], ['samsung', /SamsungBrowser\/([0-9\.]+)/], ['silk', /\bSilk\/([0-9._-]+)\b/], ['miui', /MiuiBrowser\/([0-9\.]+)$/], ['beaker', /BeakerBrowser\/([0-9\.]+)/], ['edge-chromium', /Edg\/([0-9\.]+)/], ['chromium-webview', /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/], ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/], ['phantomjs', /PhantomJS\/([0-9\.]+)(:?\s|$)/], ['crios', /CriOS\/([0-9\.]+)(:?\s|$)/], ['firefox', /Firefox\/([0-9\.]+)(?:\s|$)/], ['fxios', /FxiOS\/([0-9\.]+)/], ['opera-mini', /Opera Mini.*Version\/([0-9\.]+)/], ['opera', /Opera\/([0-9\.]+)(?:\s|$)/], ['opera', /OPR\/([0-9\.]+)(:?\s|$)/], ['ie', /Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/], ['ie', /MSIE\s([0-9\.]+);.*Trident\/[4-7].0/], ['ie', /MSIE\s(7\.0)/], ['bb10', /BB10;\sTouch.*Version\/([0-9\.]+)/], ['android', /Android\s([0-9\.]+)/], ['ios', /Version\/([0-9\._]+).*Mobile.*Safari.*/], ['safari', /Version\/([0-9\._]+).*Safari/], ['facebook', /FBAV\/([0-9\.]+)/], ['instagram', /Instagram\s([0-9\.]+)/], ['ios-webview', /AppleWebKit\/([0-9\.]+).*Mobile/], ['ios-webview', /AppleWebKit\/([0-9\.]+).*Gecko\)$/], ['searchbot', SEARCHBOX_UA_REGEX]]; var operatingSystemRules = [['iOS', /iP(hone|od|ad)/], ['Android OS', /Android/], ['BlackBerry OS', /BlackBerry|BB10/], ['Windows Mobile', /IEMobile/], ['Amazon OS', /Kindle/], ['Windows 3.11', /Win16/], ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/], ['Windows 98', /(Windows 98)|(Win98)/], ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/], ['Windows XP', /(Windows NT 5.1)|(Windows XP)/], ['Windows Server 2003', /(Windows NT 5.2)/], ['Windows Vista', /(Windows NT 6.0)/], ['Windows 7', /(Windows NT 6.1)/], ['Windows 8', /(Windows NT 6.2)/], ['Windows 8.1', /(Windows NT 6.3)/], ['Windows 10', /(Windows NT 10.0)/], ['Windows ME', /Windows ME/], ['Open BSD', /OpenBSD/], ['Sun OS', /SunOS/], ['Chrome OS', /CrOS/], ['Linux', /(Linux)|(X11)/], ['Mac OS', /(Mac_PowerPC)|(Macintosh)/], ['QNX', /QNX/], ['BeOS', /BeOS/], ['OS/2', /OS\/2/]]; function detect(userAgent) { if (!!userAgent) { return parseUserAgent(userAgent); } if (typeof document === 'undefined' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { return new ReactNativeInfo(); } if (typeof navigator !== 'undefined') { return parseUserAgent(navigator.userAgent); } return getNodeVersion(); } exports.detect = detect; function matchUserAgent(ua) { // opted for using reduce here rather than Array#first with a regex.test call // this is primarily because using the reduce we only perform the regex // execution once rather than once for the test and for the exec again below // probably something that needs to be benchmarked though return ua !== '' && userAgentRules.reduce(function (matched, _a) { var browser = _a[0], regex = _a[1]; if (matched) { return matched; } var uaMatch = regex.exec(ua); return !!uaMatch && [browser, uaMatch]; }, false); } function browserName(ua) { var data = matchUserAgent(ua); return data ? data[0] : null; } exports.browserName = browserName; function parseUserAgent(ua) { var matchedRule = matchUserAgent(ua); if (!matchedRule) { return null; } var name = matchedRule[0], match = matchedRule[1]; if (name === 'searchbot') { return new BotInfo(); } var versionParts = match[1] && match[1].split(/[._]/).slice(0, 3); if (versionParts) { if (versionParts.length < REQUIRED_VERSION_PARTS) { versionParts = __spreadArrays(versionParts, createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length)); } } else { versionParts = []; } var version = versionParts.join('.'); var os = detectOS(ua); var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua); if (searchBotMatch && searchBotMatch[1]) { return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]); } return new BrowserInfo(name, versionParts.join('.'), os); } exports.parseUserAgent = parseUserAgent; function detectOS(ua) { for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) { var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1]; var match = regex.exec(ua); if (match) { return os; } } return null; } exports.detectOS = detectOS; function getNodeVersion() { var isNode = typeof process !== 'undefined' && process.version; return isNode ? new NodeInfo(process.version.slice(1)) : null; } exports.getNodeVersion = getNodeVersion; function createVersionParts(count) { var output = []; for (var ii = 0; ii < count; ii++) { output.push('0'); } return output; } /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(65))) /***/ }), /* 65 */ /***/ (function(module, exports) { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout() { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } })(); function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while (len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return []; }; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/'; }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function () { return 0; }; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { /** * 是否是布尔类型 * * @param {Object} value 测试的值 * @return {Boolean} */ var isType = __webpack_require__(2); var isBoolean = function isBoolean(value) { return isType(value, 'Boolean'); }; module.exports = isBoolean; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { /** * 判断是否数字 * @return {Boolean} 是否数字 */ var isType = __webpack_require__(2); var isNumber = function isNumber(value) { return isType(value, 'Number'); }; module.exports = isNumber; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { var isNil = __webpack_require__(14); var isArrayLike = __webpack_require__(15); var getType = __webpack_require__(69); var isPrototype = __webpack_require__(70); var hasOwnProperty = Object.prototype.hasOwnProperty; function isEmpty(value) { /** * isEmpty(null) => true * isEmpty() => true * isEmpty(true) => true * isEmpty(1) => true * isEmpty([1, 2, 3]) => false * isEmpty('abc') => false * isEmpty({ a: 1 }) => false */ if (isNil(value)) { return true; } if (isArrayLike(value)) { return !value.length; } var type = getType(value); if (type === 'Map' || type === 'Set') { return !value.size; } if (isPrototype(value)) { return !Object.keys(value).length; } for (var key in value) { if (hasOwnProperty.call(value, key)) { return false; } } return true; } module.exports = isEmpty; /***/ }), /* 69 */ /***/ (function(module, exports) { var toString = {}.toString; var getType = function getType(value) { return toString.call(value).replace(/^\[object /, '').replace(/\]$/, ''); }; module.exports = getType; /***/ }), /* 70 */ /***/ (function(module, exports) { var objectProto = Object.prototype; var isPrototype = function isPrototype(value) { var Ctor = value && value.constructor; var proto = typeof Ctor === 'function' && Ctor.prototype || objectProto; return value === proto; }; module.exports = isPrototype; /***/ }), /* 71 */ /***/ (function(module, exports) { var uniqueId = function () { var map = {}; return function (prefix) { prefix = prefix || 'g'; if (!map[prefix]) { map[prefix] = 1; } else { map[prefix] += 1; } return prefix + map[prefix]; }; }(); module.exports = uniqueId; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { var isObjectLike = __webpack_require__(32); var isType = __webpack_require__(2); var isPlainObject = function isPlainObject(value) { /** * isObjectLike(new Foo) => false * isObjectLike([1, 2, 3]) => false * isObjectLike({ x: 0, y: 0 }) => true * isObjectLike(Object.create(null)) => true */ if (!isObjectLike(value) || !isType(value, 'Object')) { return false; } if (Object.getPrototypeOf(value) === null) { return true; } var proto = value; while (Object.getPrototypeOf(proto) !== null) { proto = Object.getPrototypeOf(proto); } return Object.getPrototypeOf(value) === proto; }; module.exports = isPlainObject; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { var toString = __webpack_require__(74); var upperFirst = function upperFirst(value) { var str = toString(value); return str.charAt(0).toUpperCase() + str.substring(1); }; module.exports = upperFirst; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { var isNil = __webpack_require__(14); function toString(value) { if (isNil(value)) return ''; return value.toString(); } module.exports = toString; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { var isObjectLike = __webpack_require__(32); var isArrayLike = __webpack_require__(15); var isString = __webpack_require__(29); var isEqual = function isEqual(value, other) { if (value === other) { return true; } if (!value || !other) { return false; } if (isString(value) || isString(other)) { return false; } if (isArrayLike(value) || isArrayLike(other)) { if (value.length !== other.length) { return false; } var rst = true; for (var i = 0; i < value.length; i++) { rst = isEqual(value[i], other[i]); if (!rst) { break; } } return rst; } if (isObjectLike(value) || isObjectLike(other)) { var valueKeys = Object.keys(value); var otherKeys = Object.keys(other); if (valueKeys.length !== otherKeys.length) { return false; } var _rst = true; for (var _i = 0; _i < valueKeys.length; _i++) { _rst = isEqual(value[valueKeys[_i]], other[valueKeys[_i]]); if (!_rst) { break; } } return _rst; } return false; }; module.exports = isEqual; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(13); var mix = __webpack_require__(16); var extend = function extend(subclass, superclass, overrides, staticOverrides) { // 如果只提供父类构造函数,则自动生成子类构造函数 if (!isFunction(superclass)) { overrides = superclass; superclass = subclass; subclass = function subclass() {}; } var create = Object.create ? function (proto, c) { return Object.create(proto, { constructor: { value: c } }); } : function (proto, c) { function Tmp() {} Tmp.prototype = proto; var o = new Tmp(); o.constructor = c; return o; }; var superObj = create(superclass.prototype, subclass); // new superclass(),//实例化父类作为子类的prototype subclass.prototype = mix(superObj, subclass.prototype); // 指定子类的prototype subclass.superclass = create(superclass.prototype, superclass); mix(superObj, overrides); mix(subclass, staticOverrides); return subclass; }; module.exports = extend; /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(13); var toArray = __webpack_require__(34); var mix = __webpack_require__(16); var augment = function augment(c) { var args = toArray(arguments); for (var i = 1; i < args.length; i++) { var obj = args[i]; if (isFunction(obj)) { obj = obj.prototype; } mix(c.prototype, obj); } }; module.exports = augment; /***/ }), /* 78 */ /***/ (function(module, exports) { var arrPrototype = Array.prototype; var splice = arrPrototype.splice; var indexOf = arrPrototype.indexOf; var slice = arrPrototype.slice; var pull = function pull(arr) { var values = slice.call(arguments, 1); for (var i = 0; i < values.length; i++) { var value = values[i]; var fromIndex = -1; while ((fromIndex = indexOf.call(arr, value)) > -1) { splice.call(arr, fromIndex, 1); } } return arr; }; module.exports = pull; /***/ }), /* 79 */ /***/ (function(module, exports) { var PRECISION = 0.00001; // numbers less than this is considered as 0 module.exports = function isNumberEqual(a, b) { var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PRECISION; return Math.abs(a - b) < precision; }; /***/ }), /* 80 */ /***/ (function(module, exports) { var RADIAN = Math.PI / 180; var toRadian = function toRadian(degree) { return RADIAN * degree; }; module.exports = toRadian; /***/ }), /* 81 */ /***/ (function(module, exports) { var DEGREE = 180 / Math.PI; var toDegree = function toDegree(radian) { return DEGREE * radian; }; module.exports = toDegree; /***/ }), /* 82 */ /***/ (function(module, exports) { var mod = function mod(n, m) { return (n % m + m) % m; }; module.exports = mod; /***/ }), /* 83 */ /***/ (function(module, exports) { /** * 创建DOM 节点 * @param {String} str Dom 字符串 * @return {HTMLElement} DOM 节点 */ var TABLE = document.createElement('table'); var TABLE_TR = document.createElement('tr'); var FRAGMENT_REG = /^\s*<(\w+|!)[^>]*>/; var CONTAINERS = { tr: document.createElement('tbody'), tbody: TABLE, thead: TABLE, tfoot: TABLE, td: TABLE_TR, th: TABLE_TR, '*': document.createElement('div') }; module.exports = function createDom(str) { var name = FRAGMENT_REG.test(str) && RegExp.$1; if (!(name in CONTAINERS)) { name = '*'; } var container = CONTAINERS[name]; str = str.replace(/(^\s*)|(\s*$)/g, ''); container.innerHTML = '' + str; var dom = container.childNodes[0]; container.removeChild(dom); return dom; }; /***/ }), /* 84 */ /***/ (function(module, exports) { module.exports = function modifyCSS(dom, css) { if (dom) { for (var key in css) { if (css.hasOwnProperty(key)) { dom.style[key] = css[key]; } } } return dom; }; /***/ }), /* 85 */ /***/ (function(module, exports) { module.exports = function requestAnimationFrame(fn) { var method = window.requestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) { return setTimeout(fn, 16); }; return method(fn); }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sub = exports.mul = undefined; exports.create = create; exports.fromMat4 = fromMat4; exports.clone = clone; exports.copy = copy; exports.fromValues = fromValues; exports.set = set; exports.identity = identity; exports.transpose = transpose; exports.invert = invert; exports.adjoint = adjoint; exports.determinant = determinant; exports.multiply = multiply; exports.translate = translate; exports.rotate = rotate; exports.scale = scale; exports.fromTranslation = fromTranslation; exports.fromRotation = fromRotation; exports.fromScaling = fromScaling; exports.fromMat2d = fromMat2d; exports.fromQuat = fromQuat; exports.normalFromMat4 = normalFromMat4; exports.projection = projection; exports.str = str; exports.frob = frob; exports.add = add; exports.subtract = subtract; exports.multiplyScalar = multiplyScalar; exports.multiplyScalarAndAdd = multiplyScalarAndAdd; exports.exactEquals = exactEquals; exports.equals = equals; var _common = __webpack_require__(17); var glMatrix = _interopRequireWildcard(_common); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * 3x3 Matrix * @module mat3 */ /** * Creates a new identity mat3 * * @returns {mat3} a new 3x3 matrix */ function create() { var out = new glMatrix.ARRAY_TYPE(9); if (glMatrix.ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[5] = 0; out[6] = 0; out[7] = 0; } out[0] = 1; out[4] = 1; out[8] = 1; return out; } /** * Copies the upper-left 3x3 values into the given mat3. * * @param {mat3} out the receiving 3x3 matrix * @param {mat4} a the source 4x4 matrix * @returns {mat3} out */ function fromMat4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[4]; out[4] = a[5]; out[5] = a[6]; out[6] = a[8]; out[7] = a[9]; out[8] = a[10]; return out; } /** * Creates a new mat3 initialized with values from an existing matrix * * @param {mat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ function clone(a) { var out = new glMatrix.ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Copy the values from one mat3 to another * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Create a new mat3 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} A new mat3 */ function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) { var out = new glMatrix.ARRAY_TYPE(9); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set the components of a mat3 to the given values * * @param {mat3} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} out */ function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set a mat3 to the identity matrix * * @param {mat3} out the receiving matrix * @returns {mat3} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Transpose the values of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a12 = a[5]; out[1] = a[3]; out[2] = a[6]; out[3] = a01; out[5] = a[7]; out[6] = a02; out[7] = a12; } else { out[0] = a[0]; out[1] = a[3]; out[2] = a[6]; out[3] = a[1]; out[4] = a[4]; out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; out[8] = a[8]; } return out; } /** * Inverts a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function invert(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b01 = a22 * a11 - a12 * a21; var b11 = -a22 * a10 + a12 * a20; var b21 = a21 * a10 - a11 * a20; // Calculate the determinant var det = a00 * b01 + a01 * b11 + a02 * b21; if (!det) { return null; } det = 1.0 / det; out[0] = b01 * det; out[1] = (-a22 * a01 + a02 * a21) * det; out[2] = (a12 * a01 - a02 * a11) * det; out[3] = b11 * det; out[4] = (a22 * a00 - a02 * a20) * det; out[5] = (-a12 * a00 + a02 * a10) * det; out[6] = b21 * det; out[7] = (-a21 * a00 + a01 * a20) * det; out[8] = (a11 * a00 - a01 * a10) * det; return out; } /** * Calculates the adjugate of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function adjoint(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; out[0] = a11 * a22 - a12 * a21; out[1] = a02 * a21 - a01 * a22; out[2] = a01 * a12 - a02 * a11; out[3] = a12 * a20 - a10 * a22; out[4] = a00 * a22 - a02 * a20; out[5] = a02 * a10 - a00 * a12; out[6] = a10 * a21 - a11 * a20; out[7] = a01 * a20 - a00 * a21; out[8] = a00 * a11 - a01 * a10; return out; } /** * Calculates the determinant of a mat3 * * @param {mat3} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); } /** * Multiplies two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function multiply(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b00 = b[0], b01 = b[1], b02 = b[2]; var b10 = b[3], b11 = b[4], b12 = b[5]; var b20 = b[6], b21 = b[7], b22 = b[8]; out[0] = b00 * a00 + b01 * a10 + b02 * a20; out[1] = b00 * a01 + b01 * a11 + b02 * a21; out[2] = b00 * a02 + b01 * a12 + b02 * a22; out[3] = b10 * a00 + b11 * a10 + b12 * a20; out[4] = b10 * a01 + b11 * a11 + b12 * a21; out[5] = b10 * a02 + b11 * a12 + b12 * a22; out[6] = b20 * a00 + b21 * a10 + b22 * a20; out[7] = b20 * a01 + b21 * a11 + b22 * a21; out[8] = b20 * a02 + b21 * a12 + b22 * a22; return out; } /** * Translate a mat3 by the given vector * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to translate * @param {vec2} v vector to translate by * @returns {mat3} out */ function translate(out, a, v) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a10; out[4] = a11; out[5] = a12; out[6] = x * a00 + y * a10 + a20; out[7] = x * a01 + y * a11 + a21; out[8] = x * a02 + y * a12 + a22; return out; } /** * Rotates a mat3 by the given angle * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function rotate(out, a, rad) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad); out[0] = c * a00 + s * a10; out[1] = c * a01 + s * a11; out[2] = c * a02 + s * a12; out[3] = c * a10 - s * a00; out[4] = c * a11 - s * a01; out[5] = c * a12 - s * a02; out[6] = a20; out[7] = a21; out[8] = a22; return out; } ; /** * Scales the mat3 by the dimensions in the given vec2 * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {vec2} v the vec2 to scale the matrix by * @returns {mat3} out **/ function scale(out, a, v) { var x = v[0], y = v[1]; out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; out[3] = y * a[3]; out[4] = y * a[4]; out[5] = y * a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.translate(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Translation vector * @returns {mat3} out */ function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = v[0]; out[7] = v[1]; out[8] = 1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.rotate(dest, dest, rad); * * @param {mat3} out mat3 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function fromRotation(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.scale(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Scaling vector * @returns {mat3} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = v[1]; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Copies the values from a mat2d into a mat3 * * @param {mat3} out the receiving matrix * @param {mat2d} a the matrix to copy * @returns {mat3} out **/ function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; out[3] = a[2]; out[4] = a[3]; out[5] = 0; out[6] = a[4]; out[7] = a[5]; out[8] = 1; return out; } /** * Calculates a 3x3 matrix from the given quaternion * * @param {mat3} out mat3 receiving operation result * @param {quat} q Quaternion to create matrix from * * @returns {mat3} out */ function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[3] = yx - wz; out[6] = zx + wy; out[1] = yx + wz; out[4] = 1 - xx - zz; out[7] = zy - wx; out[2] = zx - wy; out[5] = zy + wx; out[8] = 1 - xx - yy; return out; } /** * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix * * @param {mat3} out mat3 receiving operation result * @param {mat4} a Mat4 to derive the normal matrix from * * @returns {mat3} out */ function normalFromMat4(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; return out; } /** * Generates a 2D projection matrix with the given bounds * * @param {mat3} out mat3 frustum matrix will be written into * @param {number} width Width of your gl context * @param {number} height Height of gl context * @returns {mat3} out */ function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = -2 / height; out[5] = 0; out[6] = -1; out[7] = 1; out[8] = 1; return out; } /** * Returns a string representation of a mat3 * * @param {mat3} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; } /** * Returns Frobenius norm of a mat3 * * @param {mat3} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)); } /** * Adds two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; return out; } /** * Adds two mat3's after multiplying each element of the second operand by a scalar value. * * @param {mat3} out the receiving vector * @param {mat3} a the first operand * @param {mat3} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8]; return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); } /** * Alias for {@link mat3.multiply} * @function */ var mul = exports.mul = multiply; /** * Alias for {@link mat3.subtract} * @function */ var sub = exports.sub = subtract; /***/ }), /* 87 */ /***/ (function(module, exports, __webpack_require__) { var vec2 = __webpack_require__(88); var clamp = __webpack_require__(35); vec2.angle = function (v1, v2) { var theta = vec2.dot(v1, v2) / (vec2.length(v1) * vec2.length(v2)); return Math.acos(clamp(theta, -1, 1)); }; /** * 向量 v1 到 向量 v2 夹角的方向 * @param {Array} v1 向量 * @param {Array} v2 向量 * @return {Boolean} >= 0 顺时针 < 0 逆时针 */ vec2.direction = function (v1, v2) { return v1[0] * v2[1] - v2[0] * v1[1]; }; vec2.angleTo = function (v1, v2, direct) { var angle = vec2.angle(v1, v2); var angleLargeThanPI = vec2.direction(v1, v2) >= 0; if (direct) { if (angleLargeThanPI) { return Math.PI * 2 - angle; } return angle; } if (angleLargeThanPI) { return angle; } return Math.PI * 2 - angle; }; vec2.vertical = function (out, v, flag) { if (flag) { out[0] = v[1]; out[1] = -1 * v[0]; } else { out[0] = -1 * v[1]; out[1] = v[0]; } return out; }; module.exports = vec2; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.forEach = exports.sqrLen = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = exports.len = undefined; exports.create = create; exports.clone = clone; exports.fromValues = fromValues; exports.copy = copy; exports.set = set; exports.add = add; exports.subtract = subtract; exports.multiply = multiply; exports.divide = divide; exports.ceil = ceil; exports.floor = floor; exports.min = min; exports.max = max; exports.round = round; exports.scale = scale; exports.scaleAndAdd = scaleAndAdd; exports.distance = distance; exports.squaredDistance = squaredDistance; exports.length = length; exports.squaredLength = squaredLength; exports.negate = negate; exports.inverse = inverse; exports.normalize = normalize; exports.dot = dot; exports.cross = cross; exports.lerp = lerp; exports.random = random; exports.transformMat2 = transformMat2; exports.transformMat2d = transformMat2d; exports.transformMat3 = transformMat3; exports.transformMat4 = transformMat4; exports.rotate = rotate; exports.angle = angle; exports.str = str; exports.exactEquals = exactEquals; exports.equals = equals; var _common = __webpack_require__(17); var glMatrix = _interopRequireWildcard(_common); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * 2 Dimensional Vector * @module vec2 */ /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ function create() { var out = new glMatrix.ARRAY_TYPE(2); if (glMatrix.ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; } return out; } /** * Creates a new vec2 initialized with values from an existing vector * * @param {vec2} a vector to clone * @returns {vec2} a new 2D vector */ function clone(a) { var out = new glMatrix.ARRAY_TYPE(2); out[0] = a[0]; out[1] = a[1]; return out; } /** * Creates a new vec2 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} a new 2D vector */ function fromValues(x, y) { var out = new glMatrix.ARRAY_TYPE(2); out[0] = x; out[1] = y; return out; } /** * Copy the values from one vec2 to another * * @param {vec2} out the receiving vector * @param {vec2} a the source vector * @returns {vec2} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; return out; } /** * Set the components of a vec2 to the given values * * @param {vec2} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} out */ function set(out, x, y) { out[0] = x; out[1] = y; return out; } /** * Adds two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; return out; } /** * Subtracts vector b from vector a * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; return out; } /** * Multiplies two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function multiply(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; return out; } /** * Divides two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; return out; } /** * Math.ceil the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to ceil * @returns {vec2} out */ function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); return out; } /** * Math.floor the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to floor * @returns {vec2} out */ function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); return out; } /** * Returns the minimum of two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); return out; } /** * Returns the maximum of two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); return out; } /** * Math.round the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to round * @returns {vec2} out */ function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); return out; } /** * Scales a vec2 by a scalar number * * @param {vec2} out the receiving vector * @param {vec2} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec2} out */ function scale(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; return out; } /** * Adds two vec2's after scaling the second operand by a scalar value * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec2} out */ function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; return out; } /** * Calculates the euclidian distance between two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} distance between a and b */ function distance(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared euclidian distance between two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return x * x + y * y; } /** * Calculates the length of a vec2 * * @param {vec2} a vector to calculate length of * @returns {Number} length of a */ function length(a) { var x = a[0], y = a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared length of a vec2 * * @param {vec2} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength(a) { var x = a[0], y = a[1]; return x * x + y * y; } /** * Negates the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to negate * @returns {vec2} out */ function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; return out; } /** * Returns the inverse of the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to invert * @returns {vec2} out */ function inverse(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; return out; } /** * Normalize a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to normalize * @returns {vec2} out */ function normalize(out, a) { var x = a[0], y = a[1]; var len = x * x + y * y; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); out[0] = a[0] * len; out[1] = a[1] * len; } return out; } /** * Calculates the dot product of two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} dot product of a and b */ function dot(a, b) { return a[0] * b[0] + a[1] * b[1]; } /** * Computes the cross product of two vec2's * Note that the cross product must by definition produce a 3D vector * * @param {vec3} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec3} out */ function cross(out, a, b) { var z = a[0] * b[1] - a[1] * b[0]; out[0] = out[1] = 0; out[2] = z; return out; } /** * Performs a linear interpolation between two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec2} out */ function lerp(out, a, b, t) { var ax = a[0], ay = a[1]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); return out; } /** * Generates a random vector with the given scale * * @param {vec2} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec2} out */ function random(out, scale) { scale = scale || 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; return out; } /** * Transforms the vec2 with a mat2 * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2} m matrix to transform with * @returns {vec2} out */ function transformMat2(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y; out[1] = m[1] * x + m[3] * y; return out; } /** * Transforms the vec2 with a mat2d * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2d} m matrix to transform with * @returns {vec2} out */ function transformMat2d(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out; } /** * Transforms the vec2 with a mat3 * 3rd vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat3} m matrix to transform with * @returns {vec2} out */ function transformMat3(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[3] * y + m[6]; out[1] = m[1] * x + m[4] * y + m[7]; return out; } /** * Transforms the vec2 with a mat4 * 3rd vector component is implicitly '0' * 4th vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat4} m matrix to transform with * @returns {vec2} out */ function transformMat4(out, a, m) { var x = a[0]; var y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; return out; } /** * Rotate a 2D vector * @param {vec2} out The receiving vec2 * @param {vec2} a The vec2 point to rotate * @param {vec2} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec2} out */ function rotate(out, a, b, c) { //Translate point to the origin var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(c), cosC = Math.cos(c); //perform rotation and translate to correct position out[0] = p0 * cosC - p1 * sinC + b[0]; out[1] = p0 * sinC + p1 * cosC + b[1]; return out; } /** * Get the angle between two 2D vectors * @param {vec2} a The first operand * @param {vec2} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var x1 = a[0], y1 = a[1], x2 = b[0], y2 = b[1]; var len1 = x1 * x1 + y1 * y1; if (len1 > 0) { //TODO: evaluate use of glm_invsqrt here? len1 = 1 / Math.sqrt(len1); } var len2 = x2 * x2 + y2 * y2; if (len2 > 0) { //TODO: evaluate use of glm_invsqrt here? len2 = 1 / Math.sqrt(len2); } var cosine = (x1 * x2 + y1 * y2) * len1 * len2; if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * Returns a string representation of a vector * * @param {vec2} a vector to represent as a string * @returns {String} string representation of the vector */ function str(a) { return 'vec2(' + a[0] + ', ' + a[1] + ')'; } /** * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) * * @param {vec2} a The first vector. * @param {vec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec2} a The first vector. * @param {vec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals(a, b) { var a0 = a[0], a1 = a[1]; var b0 = b[0], b1 = b[1]; return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); } /** * Alias for {@link vec2.length} * @function */ var len = exports.len = length; /** * Alias for {@link vec2.subtract} * @function */ var sub = exports.sub = subtract; /** * Alias for {@link vec2.multiply} * @function */ var mul = exports.mul = multiply; /** * Alias for {@link vec2.divide} * @function */ var div = exports.div = divide; /** * Alias for {@link vec2.distance} * @function */ var dist = exports.dist = distance; /** * Alias for {@link vec2.squaredDistance} * @function */ var sqrDist = exports.sqrDist = squaredDistance; /** * Alias for {@link vec2.squaredLength} * @function */ var sqrLen = exports.sqrLen = squaredLength; /** * Perform some operation over an array of vec2s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach = exports.forEach = function () { var vec = create(); return function (a, stride, offset, count, fn, arg) { var i = void 0, l = void 0; if (!stride) { stride = 2; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; } return a; }; }(); /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { var vec3 = __webpack_require__(90); module.exports = vec3; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = undefined; exports.create = create; exports.clone = clone; exports.length = length; exports.fromValues = fromValues; exports.copy = copy; exports.set = set; exports.add = add; exports.subtract = subtract; exports.multiply = multiply; exports.divide = divide; exports.ceil = ceil; exports.floor = floor; exports.min = min; exports.max = max; exports.round = round; exports.scale = scale; exports.scaleAndAdd = scaleAndAdd; exports.distance = distance; exports.squaredDistance = squaredDistance; exports.squaredLength = squaredLength; exports.negate = negate; exports.inverse = inverse; exports.normalize = normalize; exports.dot = dot; exports.cross = cross; exports.lerp = lerp; exports.hermite = hermite; exports.bezier = bezier; exports.random = random; exports.transformMat4 = transformMat4; exports.transformMat3 = transformMat3; exports.transformQuat = transformQuat; exports.rotateX = rotateX; exports.rotateY = rotateY; exports.rotateZ = rotateZ; exports.angle = angle; exports.str = str; exports.exactEquals = exactEquals; exports.equals = equals; var _common = __webpack_require__(17); var glMatrix = _interopRequireWildcard(_common); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /** * 3 Dimensional Vector * @module vec3 */ /** * Creates a new, empty vec3 * * @returns {vec3} a new 3D vector */ function create() { var out = new glMatrix.ARRAY_TYPE(3); if (glMatrix.ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } /** * Creates a new vec3 initialized with values from an existing vector * * @param {vec3} a vector to clone * @returns {vec3} a new 3D vector */ function clone(a) { var out = new glMatrix.ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Calculates the length of a vec3 * * @param {vec3} a vector to calculate length of * @returns {Number} length of a */ function length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Creates a new vec3 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} a new 3D vector */ function fromValues(x, y, z) { var out = new glMatrix.ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out; } /** * Copy the values from one vec3 to another * * @param {vec3} out the receiving vector * @param {vec3} a the source vector * @returns {vec3} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Set the components of a vec3 to the given values * * @param {vec3} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} out */ function set(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out; } /** * Adds two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out; } /** * Subtracts vector b from vector a * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out; } /** * Multiplies two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function multiply(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out; } /** * Divides two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out; } /** * Math.ceil the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to ceil * @returns {vec3} out */ function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out; } /** * Math.floor the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to floor * @returns {vec3} out */ function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out; } /** * Returns the minimum of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out; } /** * Returns the maximum of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out; } /** * Math.round the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to round * @returns {vec3} out */ function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); return out; } /** * Scales a vec3 by a scalar number * * @param {vec3} out the receiving vector * @param {vec3} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec3} out */ function scale(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out; } /** * Adds two vec3's after scaling the second operand by a scalar value * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec3} out */ function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; return out; } /** * Calculates the euclidian distance between two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} distance between a and b */ function distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Calculates the squared euclidian distance between two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z; } /** * Calculates the squared length of a vec3 * * @param {vec3} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z; } /** * Negates the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to negate * @returns {vec3} out */ function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out; } /** * Returns the inverse of the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to invert * @returns {vec3} out */ function inverse(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; return out; } /** * Normalize a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to normalize * @returns {vec3} out */ function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; } return out; } /** * Calculates the dot product of two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} dot product of a and b */ function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } /** * Computes the cross product of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function cross(out, a, b) { var ax = a[0], ay = a[1], az = a[2]; var bx = b[0], by = b[1], bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out; } /** * Performs a linear interpolation between two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out; } /** * Performs a hermite interpolation with two control points * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Performs a bezier interpolation with two control points * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function bezier(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Generates a random vector with the given scale * * @param {vec3} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec3} out */ function random(out, scale) { scale = scale || 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; var z = glMatrix.RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale; return out; } /** * Transforms the vec3 with a mat4. * 4th vector component is implicitly '1' * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {mat4} m matrix to transform with * @returns {vec3} out */ function transformMat4(out, a, m) { var x = a[0], y = a[1], z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1.0; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out; } /** * Transforms the vec3 with a mat3. * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {mat3} m the 3x3 matrix to transform with * @returns {vec3} out */ function transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } /** * Transforms the vec3 with a quat * Can also be used for dual quaternions. (Multiply it with the real part) * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {quat} q quaternion to transform with * @returns {vec3} out */ function transformQuat(out, a, q) { // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; var x = a[0], y = a[1], z = a[2]; // var qvec = [qx, qy, qz]; // var uv = vec3.cross([], qvec, a); var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; // vec3.scale(uuv, uuv, 2); uuvx *= 2; uuvy *= 2; uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); out[0] = x + uvx + uuvx; out[1] = y + uvy + uuvy; out[2] = z + uvz + uuvz; return out; } /** * Rotate a 3D vector around the x-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateX(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0]; r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c); r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the y-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateY(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c); r[1] = p[1]; r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the z-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateZ(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c); r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c); r[2] = p[2]; //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Get the angle between two 3D vectors * @param {vec3} a The first operand * @param {vec3} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var tempA = fromValues(a[0], a[1], a[2]); var tempB = fromValues(b[0], b[1], b[2]); normalize(tempA, tempA); normalize(tempB, tempB); var cosine = dot(tempA, tempB); if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * Returns a string representation of a vector * * @param {vec3} a vector to represent as a string * @returns {String} string representation of the vector */ function str(a) { return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {vec3} a The first vector. * @param {vec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec3} a The first vector. * @param {vec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2]; var b0 = b[0], b1 = b[1], b2 = b[2]; return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); } /** * Alias for {@link vec3.subtract} * @function */ var sub = exports.sub = subtract; /** * Alias for {@link vec3.multiply} * @function */ var mul = exports.mul = multiply; /** * Alias for {@link vec3.divide} * @function */ var div = exports.div = divide; /** * Alias for {@link vec3.distance} * @function */ var dist = exports.dist = distance; /** * Alias for {@link vec3.squaredDistance} * @function */ var sqrDist = exports.sqrDist = squaredDistance; /** * Alias for {@link vec3.length} * @function */ var len = exports.len = length; /** * Alias for {@link vec3.squaredLength} * @function */ var sqrLen = exports.sqrLen = squaredLength; /** * Perform some operation over an array of vec3s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach = exports.forEach = function () { var vec = create(); return function (a, stride, offset, count, fn, arg) { var i = void 0, l = void 0; if (!stride) { stride = 3; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; } return a; }; }(); /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { var clone = __webpack_require__(30); var each = __webpack_require__(33); var mat3 = __webpack_require__(36); module.exports = function transform(m, ts) { m = clone(m); each(ts, function (t) { switch (t[0]) { case 't': mat3.translate(m, m, [t[1], t[2]]); break; case 's': mat3.scale(m, m, [t[1], t[2]]); break; case 'r': mat3.rotate(m, m, t[1]); break; case 'm': mat3.multiply(m, m, t[1]); break; default: return false; } }); return m; }; /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Event = __webpack_require__(18); var EVENTS = ['mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseout', 'mouseover', 'mousemove', 'mouseleave']; // 获取当前时间 var getNowTime = function getNowTime() { var now = new Date(); return now.getTime(); }; var CLICK_OFFSET = 40; var LEFT_BTN_CODE = 0; var preShape = null; var mousedownShape = null; var mousedownOffset = {}; var dragging = null; var clickTimestamp = 0; module.exports = { registerEvent: function registerEvent() { var self = this; var el = this.get('el'); Util.each(EVENTS, function (evt) { el.addEventListener(evt, function (e) { self._triggerEvent(evt, e); }, false); }); // special cases el.addEventListener('touchstart', function (e) { if (!Util.isEmpty(e.touches)) { self._triggerEvent('touchstart', e.touches[0]); } }, false); el.addEventListener('touchmove', function (e) { if (!Util.isEmpty(e.touches)) { self._triggerEvent('touchmove', e.touches[0]); } }, false); el.addEventListener('touchend', function (e) { if (!Util.isEmpty(e.changedTouches)) { self._triggerEvent('touchend', e.changedTouches[0]); } }, false); el.addEventListener('contextmenu', function (e) { self._triggerEvent('contextmenu', e); e.preventDefault(); }, false); }, _getEmitter: function _getEmitter(element, event) { if (element) { if (Util.isEmpty(element._getEvents())) { var parent = element.get('parent'); if (parent && !event.propagationStopped) { return this._getEmitter(parent, event); } } else { return element; } } }, _getEventObj: function _getEventObj(type, e, point, target) { var event = new Event(type, e, true, true); // 事件的x,y应该是基于画布左上角的,与canvas的matrix无关 event.x = point.x; event.y = point.y; event.clientX = e.clientX; event.clientY = e.clientY; event.currentTarget = target; event.target = target; return event; }, _triggerEvent: function _triggerEvent(type, e) { var self = this; var point = self.getPointByEvent(e); var shape = self.getShape(point.x, point.y, e); var el = self.get('el'); // svg原生事件取不到dragover, dragout, drop等事件的对象。这边需要走数学拾取。 if (dragging && self.getRenderer() === 'svg') { shape = self.getShape(point.x, point.y); } if (type === 'mousemove') { if (preShape && preShape !== shape) { self._emitEvent('mouseout', e, point, preShape); self._emitEvent('mouseleave', e, point, preShape); if (dragging) { self._emitEvent('dragleave', e, point, preShape); } // 当 mouseleave 触发时,如果拾取到其他 shape 的 mouseenter ,鼠标样式会正常 // 当鼠标移出 shape 但是移动到画布上时,没有shape,就不恢复样式。这里判断一下,直接重置 if (!shape || shape.destroyed) { el.style.cursor = 'default'; } } if (dragging) { self._emitEvent('drag', e, point, dragging); /** * H5原生事件中drag同时不会触发mousemove * 但是在上层具有嵌套关系的item事件计算中需要用到drag时的mousemove * 才能计算dragenter etc. */ self._emitEvent('mousemove', e, point, shape); } if (shape) { if (!dragging) { if (mousedownShape === shape) { var now = getNowTime(); var timeWindow = now - clickTimestamp; var dx = mousedownOffset.x - e.clientX; var dy = mousedownOffset.y - e.clientY; var dist = dx * dx + dy * dy; if (timeWindow > 120 || dist > CLICK_OFFSET) { dragging = shape; mousedownShape = null; this._emitEvent('dragstart', e, point, shape); } else { self._emitEvent('mousemove', e, point, shape); } } else { self._emitEvent('mousemove', e, point, shape); } } if (preShape !== shape) { self._emitEvent('mouseenter', e, point, shape); self._emitEvent('mouseover', e, point, shape); if (dragging) { self._emitEvent('dragenter', e, point, shape); } } } else { var canvasmousemove = self._getEventObj('mousemove', e, point, self); self.emit('mousemove', canvasmousemove); } preShape = shape; } else { this._emitEvent(type, e, point, shape || this); // e.button === 0 保证按下左键,防止点击右键触发click if (!dragging && type === 'mousedown' && e.button === LEFT_BTN_CODE) { mousedownShape = shape; mousedownOffset = { x: e.clientX, y: e.clientY }; clickTimestamp = getNowTime(); } if (type === 'mouseup' && e.button === LEFT_BTN_CODE) { var _dx = mousedownOffset.x - e.clientX; var _dy = mousedownOffset.y - e.clientY; var _dist = _dx * _dx + _dy * _dy; var _now = getNowTime(); var _timeWindow = _now - clickTimestamp; if (_dist < CLICK_OFFSET || _timeWindow < 200) { clickTimestamp = 0; this._emitEvent('click', e, point, mousedownShape || this); } if (dragging) { dragging._cfg.capture = true; this._emitEvent('dragend', e, point, dragging); dragging = null; this._emitEvent('drop', e, point, shape || this); } mousedownShape = null; } } if (shape && !shape.get('destroyed')) { el.style.cursor = shape.attr('cursor') || 'default'; } }, _emitEvent: function _emitEvent(type, evt, point, shape) { var event = this._getEventObj(type, evt, point, shape); var emitShape = this._getEmitter(shape, evt); emitShape && !emitShape.get('destroyed') && emitShape.emit(type, event); return emitShape; } }; /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); module.exports = { canFill: false, canStroke: false, initAttrs: function initAttrs(attrs) { this._attrs = { opacity: 1, fillOpacity: 1, strokeOpacity: 1, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1] }; this.attr(Util.assign(this.getDefaultAttrs(), attrs)); return this; }, getDefaultAttrs: function getDefaultAttrs() { return {}; }, /** * 设置或者设置属性,有以下 4 种情形: * - name 不存在, 则返回属性集合 * - name 为字符串,value 为空,获取属性值 * - name 为字符串,value 不为空,设置属性值,返回 this * - name 为键值对,value 为空,设置属性值 * * @param {String | Object} name 属性名 * @param {*} value 属性值 * @return {*} 属性值 */ attr: function attr(name, value) { var self = this; if (arguments.length === 0) { return self._attrs; } if (Util.isObject(name)) { // self._attrs = Util.deepMix(self._attrs, name); for (var k in name) { this._setAttr(k, name[k]); } self.clearBBox(); this._cfg.hasUpdate = true; return self; } if (arguments.length === 2) { this._setAttr(name, value); self.clearBBox(); this._cfg.hasUpdate = true; return self; } return self._attrs[name]; }, _setAttr: function _setAttr(name, value) { var self = this; var attrs = this._attrs; attrs[name] = value; if (name === 'fill' || name === 'stroke') { attrs[name + 'Style'] = value; return; } if (name === 'opacity') { attrs.globalAlpha = value; return; } if (name === 'clip' && value) { self._setClip(value); return; } if (name === 'path' && self._afterSetAttrPath) { self._afterSetAttrPath(value); return; } if (name === 'transform') { self.transform(value); return; } if (name === 'rotate') { self.rotateAtStart(value); } }, clearBBox: function clearBBox() { this.setSilent('box', null); }, hasFill: function hasFill() { return this.canFill && this._attrs.fillStyle; }, hasStroke: function hasStroke() { return this.canStroke && this._attrs.strokeStyle; }, _setClip: function _setClip(item) { item._cfg.renderer = this._cfg.renderer; item._cfg.canvas = this._cfg.canvas; item._cfg.parent = this._cfg.parent; item.hasFill = function () { return true; }; } }; /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); // 是否未改变 function isUnchanged(m) { return m[0] === 1 && m[1] === 0 && m[3] === 0 && m[4] === 1 && m[6] === 0 && m[7] === 0; } // 是否仅仅是scale function isScale(m) { return m[1] === 0 && m[3] === 0 && m[6] === 0 && m[7] === 0; } function multiple(m1, m2) { if (!isUnchanged(m2)) { if (isScale(m2)) { m1[0] *= m2[0]; m1[4] *= m2[4]; } else { Util.mat3.multiply(m1, m1, m2); } } } module.exports = { initTransform: function initTransform() {}, resetMatrix: function resetMatrix() { this.attr('matrix', [1, 0, 0, 0, 1, 0, 0, 0, 1]); }, translate: function translate(tx, ty) { var matrix = this._attrs.matrix; Util.mat3.translate(matrix, matrix, [tx, ty]); this.clearTotalMatrix(); this.attr('matrix', matrix); return this; }, rotate: function rotate(radian) { var matrix = this._attrs.matrix; Util.mat3.rotate(matrix, matrix, radian); this.clearTotalMatrix(); this.attr('matrix', matrix); return this; }, scale: function scale(s1, s2) { var matrix = this._attrs.matrix; Util.mat3.scale(matrix, matrix, [s1, s2]); this.clearTotalMatrix(); this.attr('matrix', matrix); return this; }, rotateAtStart: function rotateAtStart(rotate) { var x = this._attrs.x || this._cfg.attrs.x; var y = this._attrs.y || this._cfg.attrs.y; if (Math.abs(rotate) > Math.PI * 2) { rotate = rotate / 180 * Math.PI; } return this.transform([['t', -x, -y], ['r', rotate], ['t', x, y]]); }, move: function move(x, y) { var cx = this.get('x') || 0; // 当前的x var cy = this.get('y') || 0; // 当前的y this.translate(x - cx, y - cy); this.set('x', x); this.set('y', y); return this; }, transform: function transform(ts) { var self = this; var matrix = this._attrs.matrix; Util.each(ts, function (t) { switch (t[0]) { case 't': self.translate(t[1], t[2]); break; case 's': self.scale(t[1], t[2]); break; case 'r': self.rotate(t[1]); break; case 'm': self.attr('matrix', Util.mat3.multiply([], matrix, t[1])); self.clearTotalMatrix(); break; default: break; } }); return self; }, setTransform: function setTransform(ts) { this.attr('matrix', [1, 0, 0, 0, 1, 0, 0, 0, 1]); return this.transform(ts); }, getMatrix: function getMatrix() { return this.attr('matrix'); }, setMatrix: function setMatrix(m) { this.attr('matrix', m); this.clearTotalMatrix(); return this; }, apply: function apply(v, root) { var m; if (root) { m = this._getMatrixByRoot(root); } else { m = this.attr('matrix'); } Util.vec3.transformMat3(v, v, m); return this; }, // 获取到达指定根节点的矩阵 _getMatrixByRoot: function _getMatrixByRoot(root) { var self = this; root = root || self; var parent = self; var parents = []; while (parent !== root) { parents.unshift(parent); parent = parent.get('parent'); } parents.unshift(parent); var m = [1, 0, 0, 0, 1, 0, 0, 0, 1]; Util.each(parents, function (child) { Util.mat3.multiply(m, child.attr('matrix'), m); }); return m; }, /** * 应用到当前元素上的总的矩阵 * @return {Matrix} 矩阵 */ getTotalMatrix: function getTotalMatrix() { var m = this._cfg.totalMatrix; if (!m) { m = [1, 0, 0, 0, 1, 0, 0, 0, 1]; var parent = this._cfg.parent; if (parent) { var pm = parent.getTotalMatrix(); multiple(m, pm); } multiple(m, this.attr('matrix')); this._cfg.totalMatrix = m; } return m; }, // 清除当前的矩阵 clearTotalMatrix: function clearTotalMatrix() {// this._cfg.totalMatrix = null; }, invert: function invert(v) { var m = this.getTotalMatrix(); // 单精屏幕下大多数矩阵没变化 if (isScale(m)) { v[0] /= m[0]; v[1] /= m[4]; } else { var inm = Util.mat3.invert([], m); if (inm) { Util.vec3.transformMat3(v, v, inm); } } return this; }, resetTransform: function resetTransform(context) { var mo = this.attr('matrix'); // 不改变时 if (!isUnchanged(mo)) { context.transform(mo[0], mo[1], mo[3], mo[4], mo[6], mo[7]); } } }; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var Util = __webpack_require__(0); var ReservedProps = { delay: 'delay', repeat: 'repeat', rotate: 'rotate' }; function getFromAttrs(toAttrs, shape) { var rst = {}; var attrs = shape._attrs; for (var k in toAttrs.attrs) { rst[k] = attrs[k]; } return rst; } function getFormatProps(props, shape) { var rst = { matrix: null, attrs: {} }; var attrs = shape._attrs; for (var k in props) { if (k === 'transform') { rst.matrix = Util.transform(shape.getMatrix(), props[k]); } else if (k === 'matrix') { rst.matrix = props[k]; } else if (Util.isColorProp(k) && Util.isGradientColor(props[k])) { // 渐变色不支持动画, 直接跳色 rst.attrs[k] = props[k]; } else if (!ReservedProps[k] && attrs[k] !== props[k]) { if (k === 'rotate') { shape._attrs.rotate = shape._attrs.rotate || 0; } rst.attrs[k] = props[k]; } } return rst; } function checkExistedAttrs(animators, animator) { if (animator.onFrame) { return animators; } var delay = animator.delay; var hasOwnProperty = Object.prototype.hasOwnProperty; Util.each(animator.toAttrs, function (v, k) { Util.each(animators, function (animator) { if (delay < animator.startTime + animator.duration) { if (hasOwnProperty.call(animator.toAttrs, k)) { delete animator.toAttrs[k]; delete animator.fromAttrs[k]; } } }); }); if (animator.toMatrix) { Util.each(animators, function (animator) { if (delay < animator.startTime + animator.duration && animator.toMatrix) { delete animator.toMatrix; } }); } return animators; } module.exports = { /** * 执行动画 * @param {Object} toProps 动画最终状态 * @param {Number} duration 动画执行时间 * @param {String} easing 动画缓动效果 * @param {Function} callback 动画执行后的回调 * @param {Number} delay 动画延迟时间 */ animate: function animate(toProps, duration, easing, callback, delay) { if (delay === void 0) { delay = 0; } var self = this; self.set('animating', true); var timeline = self.get('timeline'); if (!timeline) { timeline = self.get('canvas').get('timeline'); self.setSilent('timeline', timeline); } var animators = self.get('animators') || []; // 初始化tick if (!timeline._timer) { timeline.initTimer(); } if (Util.isNumber(callback)) { delay = callback; callback = null; } if (Util.isFunction(easing)) { callback = easing; easing = 'easeLinear'; } else { easing = easing ? easing : 'easeLinear'; } var animator = { repeat: toProps.repeat, duration: duration, easing: easing, callback: callback, delay: delay, startTime: timeline.getTime(), id: Util.uniqueId() }; if (toProps.onFrame) { animator.onFrame = toProps.onFrame; } else { var formatProps = getFormatProps(toProps, self); animator = _extends({ fromAttrs: getFromAttrs(formatProps, self), toAttrs: formatProps.attrs, fromMatrix: Util.clone(self.getMatrix()), toMatrix: formatProps.matrix }, animator); } // 如果动画队列中已经有这个图形了 if (animators.length > 0) { // 先检查是否需要合并属性。若有相同的动画,将该属性从前一个动画中删除,直接用后一个动画中 animators = checkExistedAttrs(animators, animator); } else { // 否则将图形添加到队列 timeline.addAnimator(self); } animators.push(animator); self.setSilent('animators', animators); self.setSilent('pause', { isPaused: false }); }, stopAnimate: function stopAnimate() { var _this = this; var animators = this.get('animators'); // 将动画执行到最后一帧,执行回调 Util.each(animators, function (animator) { _this.attr(animator.toAttrs || animator.onFrame(1)); if (animator.toMatrix) { _this.attr('matrix', animator.toMatrix); } if (animator.callback) { animator.callback(); } }); this.setSilent('animating', false); this.setSilent('animators', []); }, pauseAnimate: function pauseAnimate() { var self = this; var timeline = self.get('timeline'); // 记录下是在什么时候暂停的 self.setSilent('pause', { isPaused: true, pauseTime: timeline.getTime() }); return self; }, resumeAnimate: function resumeAnimate() { var self = this; var timeline = self.get('timeline'); var current = timeline.getTime(); var animators = self.get('animators'); var pauseTime = self.get('pause').pauseTime; // 之后更新属性需要计算动画已经执行的时长,如果暂停了,就把初始时间调后 Util.each(animators, function (animator) { animator.startTime = animator.startTime + (current - pauseTime); animator._paused = false; animator._pauseTime = null; }); self.setSilent('pause', { isPaused: false }); self.setSilent('animators', animators); return self; } }; /***/ }), /* 96 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Event = __webpack_require__(18); var EventEmitter = __webpack_require__(39); var PROPOGATE_EVENTS = ['click', 'mousedown', 'mouseup', 'dblclick', 'contextmenu', 'mouseout', 'mouseover', 'mousemove', 'dragstart', 'drag', 'dragend', 'dragenter', 'dragleave', 'drop']; var AdvancedEE = function AdvancedEE() {}; Util.augment(AdvancedEE, EventEmitter, { emit: function emit(evt, e) { var args = arguments; EventEmitter.prototype.emit.apply(this, args); if (args.length >= 2 && args[1] instanceof Event && args[1].propagationStopped) { return; } if (PROPOGATE_EVENTS.indexOf(evt) >= 0 && e.target === this /* prevent bubbling multiple times */ ) { var shape = this._cfg.parent; while (shape && !shape.get('destroyed')) { shape.emit.apply(shape, args); shape = shape._cfg.parent; } } } }); module.exports = AdvancedEE; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { var Shape = __webpack_require__(1); Shape.Arc = __webpack_require__(42); Shape.Circle = __webpack_require__(43); Shape.Dom = __webpack_require__(44); Shape.Ellipse = __webpack_require__(45); Shape.Fan = __webpack_require__(46); Shape.Image = __webpack_require__(47); Shape.Line = __webpack_require__(48); Shape.Marker = __webpack_require__(21); Shape.Path = __webpack_require__(49); Shape.Polygon = __webpack_require__(50); Shape.Polyline = __webpack_require__(51); Shape.Rect = __webpack_require__(52); Shape.Text = __webpack_require__(53); module.exports = Shape; /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var Inside = __webpack_require__(19); var mathUtl = { arc: __webpack_require__(8), ellipse: __webpack_require__(41), line: __webpack_require__(7) }; var canvas = Util.createDom(''); var context = canvas.getContext('2d'); function isPointInPathByContext(x, y, ctx) { ctx.createPath(context); return context.isPointInPath(x, y); } var arc = function arc(x, y) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.r, startAngle = attrs.startAngle, endAngle = attrs.endAngle, clockwise = attrs.clockwise; var lineWidth = this.getHitLineWidth(); if (this.hasStroke()) { return Inside.arcline(cx, cy, r, startAngle, endAngle, clockwise, lineWidth, x, y); } return false; }; var circle = function circle(x, y) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.r; var lineWidth = this.getHitLineWidth(); var fill = this.hasFill(); var stroke = this.hasStroke(); if (fill && stroke) { return Inside.circle(cx, cy, r, x, y) || Inside.arcline(cx, cy, r, 0, Math.PI * 2, false, lineWidth, x, y); } if (fill) { return Inside.circle(cx, cy, r, x, y); } if (stroke) { return Inside.arcline(cx, cy, r, 0, Math.PI * 2, false, lineWidth, x, y); } return false; }; var ellipse = function ellipse(x, y) { var attrs = this._attrs; var fill = this.hasFill(); var stroke = this.hasStroke(); var cx = attrs.x; var cy = attrs.y; var rx = attrs.rx; var ry = attrs.ry; var lineWidth = this.getHitLineWidth(); var r = rx > ry ? rx : ry; var scaleX = rx > ry ? 1 : rx / ry; var scaleY = rx > ry ? ry / rx : 1; var p = [x, y, 1]; var m = [1, 0, 0, 0, 1, 0, 0, 0, 1]; Util.mat3.scale(m, m, [scaleX, scaleY]); Util.mat3.translate(m, m, [cx, cy]); var inm = Util.mat3.invert([], m); Util.vec3.transformMat3(p, p, inm); if (fill && stroke) { return Inside.circle(0, 0, r, p[0], p[1]) || Inside.arcline(0, 0, r, 0, Math.PI * 2, false, lineWidth, p[0], p[1]); } if (fill) { return Inside.circle(0, 0, r, p[0], p[1]); } if (stroke) { return Inside.arcline(0, 0, r, 0, Math.PI * 2, false, lineWidth, p[0], p[1]); } return false; }; var fan = function fan(x, y) { var self = this; var fill = self.hasFill(); var stroke = self.hasStroke(); var attrs = self._attrs; var cx = attrs.x; var cy = attrs.y; var rs = attrs.rs; var re = attrs.re; var startAngle = attrs.startAngle; var endAngle = attrs.endAngle; var clockwise = attrs.clockwise; var v1 = [1, 0]; var subv = [x - cx, y - cy]; var angle = Util.vec2.angleTo(v1, subv); function _isPointInFill() { var angle1 = mathUtl.arc.nearAngle(angle, startAngle, endAngle, clockwise); if (Util.isNumberEqual(angle, angle1)) { var ls = Util.vec2.squaredLength(subv); if (rs * rs <= ls && ls <= re * re) { return true; } } return false; } function _isPointInStroke() { var lineWidth = self.getHitLineWidth(); var ssp = { x: Math.cos(startAngle) * rs + cx, y: Math.sin(startAngle) * rs + cy }; var sep = { x: Math.cos(startAngle) * re + cx, y: Math.sin(startAngle) * re + cy }; var esp = { x: Math.cos(endAngle) * rs + cx, y: Math.sin(endAngle) * rs + cy }; var eep = { x: Math.cos(endAngle) * re + cx, y: Math.sin(endAngle) * re + cy }; if (Inside.line(ssp.x, ssp.y, sep.x, sep.y, lineWidth, x, y)) { return true; } if (Inside.line(esp.x, esp.y, eep.x, eep.y, lineWidth, x, y)) { return true; } if (Inside.arcline(cx, cy, rs, startAngle, endAngle, clockwise, lineWidth, x, y)) { return true; } if (Inside.arcline(cx, cy, re, startAngle, endAngle, clockwise, lineWidth, x, y)) { return true; } return false; } if (fill && stroke) { return _isPointInFill() || _isPointInStroke(); } if (fill) { return _isPointInFill(); } if (stroke) { return _isPointInStroke(); } return false; }; var image = function image(x, y) { var attrs = this._attrs; if (this.get('toDraw') || !attrs.img) { return false; } if (!this._cfg.attrs || this._cfg.attrs.img !== attrs.img) { this._setAttrImg(); } var rx = attrs.x; var ry = attrs.y; var width = attrs.width; var height = attrs.height; return Inside.rect(rx, ry, width, height, x, y); }; var line = function line(x, y) { var attrs = this._attrs; var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2; var lineWidth = this.getHitLineWidth(); if (this.hasStroke()) { return Inside.line(x1, y1, x2, y2, lineWidth, x, y); } return false; }; var path = function path(x, y) { var self = this; var segments = self.get('segments'); var fill = self.hasFill(); var stroke = self.hasStroke(); function _isPointInStroke() { if (!Util.isEmpty(segments)) { var lineWidth = self.getHitLineWidth(); for (var i = 0, l = segments.length; i < l; i++) { if (segments[i].isInside(x, y, lineWidth)) { return true; } } return false; } } if (fill && stroke) { return isPointInPathByContext(x, y, self) || _isPointInStroke(); } if (fill) { return isPointInPathByContext(x, y, self); } if (stroke) { return _isPointInStroke(); } return false; }; var polygon = function polygon(x, y) { var self = this; var fill = self.hasFill(); var stroke = self.hasStroke(); function _isPointInStroke() { var attrs = self._attrs; var points = attrs.points; if (points.length < 2) { return false; } var lineWidth = self.getHitLineWidth(); var outPoints = points.slice(0); if (points.length >= 3) { outPoints.push(points[0]); } return Inside.polyline(outPoints, lineWidth, x, y); } if (fill && stroke) { return isPointInPathByContext(x, y, self) || _isPointInStroke(); } if (fill) { return isPointInPathByContext(x, y, self); } if (stroke) { return _isPointInStroke(); } return false; }; var marker = function marker(x, y) { var attrs = this._attrs; var cx = attrs.x; var cy = attrs.y; var r = attrs.radius || attrs.r; var lineWidth = this.getHitLineWidth(); return Inside.circle(cx, cy, r + lineWidth / 2, x, y); }; var polyline = function polyline(x, y) { var self = this; var attrs = self._attrs; if (self.hasStroke()) { var points = attrs.points; if (points.length < 2) { return false; } var lineWidth = attrs.lineWidth; return Inside.polyline(points, lineWidth, x, y); } return false; }; var rect = function rect(x, y) { var self = this; var fill = self.hasFill(); var stroke = self.hasStroke(); function _isPointInStroke() { var attrs = self._attrs; var rx = attrs.x; var ry = attrs.y; var width = attrs.width; var height = attrs.height; var radius = attrs.radius; var lineWidth = self.getHitLineWidth(); if (radius === 0) { var halfWidth = lineWidth / 2; return Inside.line(rx - halfWidth, ry, rx + width + halfWidth, ry, lineWidth, x, y) || Inside.line(rx + width, ry - halfWidth, rx + width, ry + height + halfWidth, lineWidth, x, y) || Inside.line(rx + width + halfWidth, ry + height, rx - halfWidth, ry + height, lineWidth, x, y) || Inside.line(rx, ry + height + halfWidth, rx, ry - halfWidth, lineWidth, x, y); } return Inside.line(rx + radius, ry, rx + width - radius, ry, lineWidth, x, y) || Inside.line(rx + width, ry + radius, rx + width, ry + height - radius, lineWidth, x, y) || Inside.line(rx + width - radius, ry + height, rx + radius, ry + height, lineWidth, x, y) || Inside.line(rx, ry + height - radius, rx, ry + radius, lineWidth, x, y) || Inside.arcline(rx + width - radius, ry + radius, radius, 1.5 * Math.PI, 2 * Math.PI, false, lineWidth, x, y) || Inside.arcline(rx + width - radius, ry + height - radius, radius, 0, 0.5 * Math.PI, false, lineWidth, x, y) || Inside.arcline(rx + radius, ry + height - radius, radius, 0.5 * Math.PI, Math.PI, false, lineWidth, x, y) || Inside.arcline(rx + radius, ry + radius, radius, Math.PI, 1.5 * Math.PI, false, lineWidth, x, y); } if (fill && stroke) { return isPointInPathByContext(x, y, self) || _isPointInStroke(); } if (fill) { return isPointInPathByContext(x, y, self); } if (stroke) { return _isPointInStroke(); } return false; }; var text = function text(x, y) { var self = this; var box = self.getBBox(); if (self.hasFill() || self.hasStroke()) { return Inside.box(box.minX, box.maxX, box.minY, box.maxY, x, y); } }; var dom = function dom(x, y) { if (!this._cfg.el) { return false; } var box = this._cfg.el.getBBox(); return Inside.box(box.x, box.x + box.width, box.y, box.y + box.height, x, y); }; var shapes = { arc: arc, circle: circle, dom: dom, ellipse: ellipse, fan: fan, image: image, line: line, path: path, marker: marker, polygon: polygon, polyline: polyline, rect: rect, text: text }; module.exports = { isPointInPath: function isPointInPath(x, y) { var shape = shapes[this.type]; if (shape) { return shape.call(this, x, y); } return false; } }; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var PathUtil = __webpack_require__(22); var d3Timer = __webpack_require__(100); var d3Ease = __webpack_require__(103); var _require = __webpack_require__(114), interpolate = _require.interpolate, interpolateArray = _require.interpolateArray; // 目前整体动画只需要数值和数组的差值计算 var Timeline = function Timeline(canvas) { // 待执行动画的队列 this._animators = []; // 当前时间 this._current = 0; // 计时器实例 this._timer = null; // 画布 this.canvas = canvas; }; function _update(self, animator, ratio) { var cProps = {}; // 此刻属性 var toAttrs = animator.toAttrs; var fromAttrs = animator.fromAttrs; var toMatrix = animator.toMatrix; if (self.get('destroyed')) { return; } var interf; // 差值函数 for (var k in toAttrs) { if (!Util.isEqual(fromAttrs[k], toAttrs[k])) { if (k === 'path') { var toPath = toAttrs[k]; var fromPath = fromAttrs[k]; if (toPath.length > fromPath.length) { toPath = PathUtil.parsePathString(toAttrs[k]); // 终点状态 fromPath = PathUtil.parsePathString(fromAttrs[k]); // 起始状态 fromPath = PathUtil.fillPathByDiff(fromPath, toPath); fromPath = PathUtil.formatPath(fromPath, toPath); animator.fromAttrs.path = fromPath; animator.toAttrs.path = toPath; } else if (!animator.pathFormatted) { toPath = PathUtil.parsePathString(toAttrs[k]); fromPath = PathUtil.parsePathString(fromAttrs[k]); fromPath = PathUtil.formatPath(fromPath, toPath); animator.fromAttrs.path = fromPath; animator.toAttrs.path = toPath; animator.pathFormatted = true; } cProps[k] = []; for (var i = 0; i < toPath.length; i++) { var toPathPoint = toPath[i]; var fromPathPoint = fromPath[i]; var cPathPoint = []; for (var j = 0; j < toPathPoint.length; j++) { if (Util.isNumber(toPathPoint[j]) && fromPathPoint && Util.isNumber(fromPathPoint[j])) { interf = interpolate(fromPathPoint[j], toPathPoint[j]); cPathPoint.push(interf(ratio)); } else { cPathPoint.push(toPathPoint[j]); } } cProps[k].push(cPathPoint); } } else if (Util.isColorProp(k) && Util.isGradientColor(toAttrs[k])) { // 渐变色直接赋值,不做插值 cProps[k] = toAttrs[k]; } else { interf = interpolate(fromAttrs[k], toAttrs[k]); cProps[k] = interf(ratio); } } } if (toMatrix) { var mf = interpolateArray(animator.fromMatrix, toMatrix); var cM = mf(ratio); self.setMatrix(cM); } self.attr(cProps); } function update(shape, animator, elapsed) { var startTime = animator.startTime; // 如果还没有开始执行或暂停,先不更新 if (elapsed < startTime + animator.delay || animator.isPaused) { return false; } var ratio; var duration = animator.duration; var easing = animator.easing; // 已执行时间 elapsed = elapsed - startTime - animator.delay; if (animator.repeat) { ratio = elapsed % duration / duration; ratio = d3Ease[easing](ratio); } else { ratio = elapsed / duration; if (ratio < 1) { ratio = d3Ease[easing](ratio); } else { var attrs = animator.toAttrs || animator.onFrame(1); shape.attr(attrs); if (animator.toMatrix) { shape.setMatrix(animator.toMatrix); } return true; } } if (animator.onFrame) { var _attrs = animator.onFrame(ratio); shape.attr(_attrs); } else { _update(shape, animator, ratio); } return false; } Util.augment(Timeline, { initTimer: function initTimer() { var _this = this; var self = this; var isFinished = false; var shape, animators, animator; self._timer = d3Timer.timer(function (elapsed) { self._current = elapsed; if (_this._animators.length > 0) { for (var i = _this._animators.length - 1; i >= 0; i--) { shape = _this._animators[i]; if (shape.get('destroyed')) { // 如果已经被销毁,直接移出队列 self.removeAnimator(i); continue; } if (!shape.get('pause').isPaused) { animators = shape.get('animators'); for (var j = animators.length - 1; j >= 0; j--) { animator = animators[j]; isFinished = update(shape, animator, elapsed); if (isFinished) { animators.splice(j, 1); isFinished = false; if (animator.callback) { animator.callback(); } } } } if (animators.length === 0) { self.removeAnimator(i); } } _this.canvas.draw(); } }); }, addAnimator: function addAnimator(shape) { this._animators.push(shape); }, removeAnimator: function removeAnimator(index) { this._animators.splice(index, 1); }, isAnimating: function isAnimating() { return !!this._animators.length; }, stop: function stop() { if (this._timer) { this._timer.stop(); } }, stopAllAnimations: function stopAllAnimations() { this._animators.forEach(function (animator) { animator.stopAnimate(); }); this._animators = []; this.canvas.draw(); }, getTime: function getTime() { return this._current; } }); module.exports = Timeline; /***/ }), /* 100 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__timer_js__ = __webpack_require__(23); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "now", function() { return __WEBPACK_IMPORTED_MODULE_0__timer_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return __WEBPACK_IMPORTED_MODULE_0__timer_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return __WEBPACK_IMPORTED_MODULE_0__timer_js__["d"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__timeout_js__ = __webpack_require__(101); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return __WEBPACK_IMPORTED_MODULE_1__timeout_js__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__interval_js__ = __webpack_require__(102); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return __WEBPACK_IMPORTED_MODULE_2__interval_js__["a"]; }); /***/ }), /* 101 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__timer_js__ = __webpack_require__(23); /* harmony default export */ __webpack_exports__["a"] = (function (callback, delay, time) { var t = new __WEBPACK_IMPORTED_MODULE_0__timer_js__["a" /* Timer */](); delay = delay == null ? 0 : +delay; t.restart(function (elapsed) { t.stop(); callback(elapsed + delay); }, delay, time); return t; }); /***/ }), /* 102 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__timer_js__ = __webpack_require__(23); /* harmony default export */ __webpack_exports__["a"] = (function (callback, delay, time) { var t = new __WEBPACK_IMPORTED_MODULE_0__timer_js__["a" /* Timer */](), total = delay; if (delay == null) return t.restart(callback, delay, time), t; delay = +delay, time = time == null ? Object(__WEBPACK_IMPORTED_MODULE_0__timer_js__["b" /* now */])() : +time; t.restart(function tick(elapsed) { elapsed += total; t.restart(tick, total += delay, time); callback(elapsed); }, delay, time); return t; }); /***/ }), /* 103 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__linear_js__ = __webpack_require__(104); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeLinear", function() { return __WEBPACK_IMPORTED_MODULE_0__linear_js__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__quad_js__ = __webpack_require__(105); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeQuad", function() { return __WEBPACK_IMPORTED_MODULE_1__quad_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeQuadIn", function() { return __WEBPACK_IMPORTED_MODULE_1__quad_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeQuadOut", function() { return __WEBPACK_IMPORTED_MODULE_1__quad_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeQuadInOut", function() { return __WEBPACK_IMPORTED_MODULE_1__quad_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__cubic_js__ = __webpack_require__(106); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCubic", function() { return __WEBPACK_IMPORTED_MODULE_2__cubic_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCubicIn", function() { return __WEBPACK_IMPORTED_MODULE_2__cubic_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCubicOut", function() { return __WEBPACK_IMPORTED_MODULE_2__cubic_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCubicInOut", function() { return __WEBPACK_IMPORTED_MODULE_2__cubic_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__poly_js__ = __webpack_require__(107); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easePoly", function() { return __WEBPACK_IMPORTED_MODULE_3__poly_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easePolyIn", function() { return __WEBPACK_IMPORTED_MODULE_3__poly_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easePolyOut", function() { return __WEBPACK_IMPORTED_MODULE_3__poly_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easePolyInOut", function() { return __WEBPACK_IMPORTED_MODULE_3__poly_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__sin_js__ = __webpack_require__(108); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeSin", function() { return __WEBPACK_IMPORTED_MODULE_4__sin_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeSinIn", function() { return __WEBPACK_IMPORTED_MODULE_4__sin_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeSinOut", function() { return __WEBPACK_IMPORTED_MODULE_4__sin_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeSinInOut", function() { return __WEBPACK_IMPORTED_MODULE_4__sin_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__exp_js__ = __webpack_require__(109); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeExp", function() { return __WEBPACK_IMPORTED_MODULE_5__exp_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeExpIn", function() { return __WEBPACK_IMPORTED_MODULE_5__exp_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeExpOut", function() { return __WEBPACK_IMPORTED_MODULE_5__exp_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeExpInOut", function() { return __WEBPACK_IMPORTED_MODULE_5__exp_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__circle_js__ = __webpack_require__(110); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCircle", function() { return __WEBPACK_IMPORTED_MODULE_6__circle_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCircleIn", function() { return __WEBPACK_IMPORTED_MODULE_6__circle_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCircleOut", function() { return __WEBPACK_IMPORTED_MODULE_6__circle_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeCircleInOut", function() { return __WEBPACK_IMPORTED_MODULE_6__circle_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__bounce_js__ = __webpack_require__(111); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBounce", function() { return __WEBPACK_IMPORTED_MODULE_7__bounce_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBounceIn", function() { return __WEBPACK_IMPORTED_MODULE_7__bounce_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBounceOut", function() { return __WEBPACK_IMPORTED_MODULE_7__bounce_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBounceInOut", function() { return __WEBPACK_IMPORTED_MODULE_7__bounce_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__back_js__ = __webpack_require__(112); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBack", function() { return __WEBPACK_IMPORTED_MODULE_8__back_js__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBackIn", function() { return __WEBPACK_IMPORTED_MODULE_8__back_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBackOut", function() { return __WEBPACK_IMPORTED_MODULE_8__back_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeBackInOut", function() { return __WEBPACK_IMPORTED_MODULE_8__back_js__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__elastic_js__ = __webpack_require__(113); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeElastic", function() { return __WEBPACK_IMPORTED_MODULE_9__elastic_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeElasticIn", function() { return __WEBPACK_IMPORTED_MODULE_9__elastic_js__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeElasticOut", function() { return __WEBPACK_IMPORTED_MODULE_9__elastic_js__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "easeElasticInOut", function() { return __WEBPACK_IMPORTED_MODULE_9__elastic_js__["b"]; }); /***/ }), /* 104 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = linear; function linear(t) { return +t; } /***/ }), /* 105 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = quadIn; /* harmony export (immutable) */ __webpack_exports__["c"] = quadOut; /* harmony export (immutable) */ __webpack_exports__["b"] = quadInOut; function quadIn(t) { return t * t; } function quadOut(t) { return t * (2 - t); } function quadInOut(t) { return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; } /***/ }), /* 106 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = cubicIn; /* harmony export (immutable) */ __webpack_exports__["c"] = cubicOut; /* harmony export (immutable) */ __webpack_exports__["b"] = cubicInOut; function cubicIn(t) { return t * t * t; } function cubicOut(t) { return --t * t * t + 1; } function cubicInOut(t) { return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; } /***/ }), /* 107 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return polyIn; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return polyOut; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return polyInOut; }); var exponent = 3; var polyIn = function custom(e) { e = +e; function polyIn(t) { return Math.pow(t, e); } polyIn.exponent = custom; return polyIn; }(exponent); var polyOut = function custom(e) { e = +e; function polyOut(t) { return 1 - Math.pow(1 - t, e); } polyOut.exponent = custom; return polyOut; }(exponent); var polyInOut = function custom(e) { e = +e; function polyInOut(t) { return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; } polyInOut.exponent = custom; return polyInOut; }(exponent); /***/ }), /* 108 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = sinIn; /* harmony export (immutable) */ __webpack_exports__["c"] = sinOut; /* harmony export (immutable) */ __webpack_exports__["b"] = sinInOut; var pi = Math.PI, halfPi = pi / 2; function sinIn(t) { return 1 - Math.cos(t * halfPi); } function sinOut(t) { return Math.sin(t * halfPi); } function sinInOut(t) { return (1 - Math.cos(pi * t)) / 2; } /***/ }), /* 109 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = expIn; /* harmony export (immutable) */ __webpack_exports__["c"] = expOut; /* harmony export (immutable) */ __webpack_exports__["b"] = expInOut; function expIn(t) { return Math.pow(2, 10 * t - 10); } function expOut(t) { return 1 - Math.pow(2, -10 * t); } function expInOut(t) { return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; } /***/ }), /* 110 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = circleIn; /* harmony export (immutable) */ __webpack_exports__["c"] = circleOut; /* harmony export (immutable) */ __webpack_exports__["b"] = circleInOut; function circleIn(t) { return 1 - Math.sqrt(1 - t * t); } function circleOut(t) { return Math.sqrt(1 - --t * t); } function circleInOut(t) { return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; } /***/ }), /* 111 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = bounceIn; /* harmony export (immutable) */ __webpack_exports__["c"] = bounceOut; /* harmony export (immutable) */ __webpack_exports__["b"] = bounceInOut; var b1 = 4 / 11, b2 = 6 / 11, b3 = 8 / 11, b4 = 3 / 4, b5 = 9 / 11, b6 = 10 / 11, b7 = 15 / 16, b8 = 21 / 22, b9 = 63 / 64, b0 = 1 / b1 / b1; function bounceIn(t) { return 1 - bounceOut(1 - t); } function bounceOut(t) { return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; } function bounceInOut(t) { return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; } /***/ }), /* 112 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return backIn; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return backOut; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return backInOut; }); var overshoot = 1.70158; var backIn = function custom(s) { s = +s; function backIn(t) { return t * t * ((s + 1) * t - s); } backIn.overshoot = custom; return backIn; }(overshoot); var backOut = function custom(s) { s = +s; function backOut(t) { return --t * t * ((s + 1) * t + s) + 1; } backOut.overshoot = custom; return backOut; }(overshoot); var backInOut = function custom(s) { s = +s; function backInOut(t) { return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; } backInOut.overshoot = custom; return backInOut; }(overshoot); /***/ }), /* 113 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return elasticIn; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return elasticOut; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return elasticInOut; }); var tau = 2 * Math.PI, amplitude = 1, period = 0.3; var elasticIn = function custom(a, p) { var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); function elasticIn(t) { return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); } elasticIn.amplitude = function (a) { return custom(a, p * tau); }; elasticIn.period = function (p) { return custom(a, p); }; return elasticIn; }(amplitude, period); var elasticOut = function custom(a, p) { var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); function elasticOut(t) { return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); } elasticOut.amplitude = function (a) { return custom(a, p * tau); }; elasticOut.period = function (p) { return custom(a, p); }; return elasticOut; }(amplitude, period); var elasticInOut = function custom(a, p) { var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); function elasticInOut(t) { return ((t = t * 2 - 1) < 0 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; } elasticInOut.amplitude = function (a) { return custom(a, p * tau); }; elasticInOut.period = function (p) { return custom(a, p); }; return elasticInOut; }(amplitude, period); /***/ }), /* 114 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(24); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return __WEBPACK_IMPORTED_MODULE_0__src_value__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_array__ = __webpack_require__(58); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateArray", function() { return __WEBPACK_IMPORTED_MODULE_1__src_array__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_basis__ = __webpack_require__(27); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateBasis", function() { return __WEBPACK_IMPORTED_MODULE_2__src_basis__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_basisClosed__ = __webpack_require__(56); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateBasisClosed", function() { return __WEBPACK_IMPORTED_MODULE_3__src_basisClosed__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_date__ = __webpack_require__(59); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateDate", function() { return __WEBPACK_IMPORTED_MODULE_4__src_date__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_number__ = __webpack_require__(11); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateNumber", function() { return __WEBPACK_IMPORTED_MODULE_5__src_number__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_object__ = __webpack_require__(60); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateObject", function() { return __WEBPACK_IMPORTED_MODULE_6__src_object__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_round__ = __webpack_require__(117); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateRound", function() { return __WEBPACK_IMPORTED_MODULE_7__src_round__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_string__ = __webpack_require__(61); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateString", function() { return __WEBPACK_IMPORTED_MODULE_8__src_string__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_transform_index__ = __webpack_require__(118); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return __WEBPACK_IMPORTED_MODULE_9__src_transform_index__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return __WEBPACK_IMPORTED_MODULE_9__src_transform_index__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_zoom__ = __webpack_require__(121); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateZoom", function() { return __WEBPACK_IMPORTED_MODULE_10__src_zoom__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__src_rgb__ = __webpack_require__(55); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateRgb", function() { return __WEBPACK_IMPORTED_MODULE_11__src_rgb__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasis", function() { return __WEBPACK_IMPORTED_MODULE_11__src_rgb__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasisClosed", function() { return __WEBPACK_IMPORTED_MODULE_11__src_rgb__["c"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__src_hsl__ = __webpack_require__(122); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateHsl", function() { return __WEBPACK_IMPORTED_MODULE_12__src_hsl__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateHslLong", function() { return __WEBPACK_IMPORTED_MODULE_12__src_hsl__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__src_lab__ = __webpack_require__(123); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateLab", function() { return __WEBPACK_IMPORTED_MODULE_13__src_lab__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__src_hcl__ = __webpack_require__(124); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateHcl", function() { return __WEBPACK_IMPORTED_MODULE_14__src_hcl__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateHclLong", function() { return __WEBPACK_IMPORTED_MODULE_14__src_hcl__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = __webpack_require__(125); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelix", function() { return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixLong", function() { return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__src_quantize__ = __webpack_require__(126); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "quantize", function() { return __WEBPACK_IMPORTED_MODULE_16__src_quantize__["a"]; }); /***/ }), /* 115 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export gray */ /* harmony export (immutable) */ __webpack_exports__["a"] = lab; /* unused harmony export Lab */ /* unused harmony export lch */ /* harmony export (immutable) */ __webpack_exports__["b"] = hcl; /* unused harmony export Hcl */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__define_js__ = __webpack_require__(26); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color_js__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__math_js__ = __webpack_require__(54); // https://observablehq.com/@mbostock/lab-and-rgb var K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1; function labConvert(o) { if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); if (o instanceof Hcl) return hcl2lab(o); if (!(o instanceof __WEBPACK_IMPORTED_MODULE_1__color_js__["b" /* Rgb */])) o = Object(__WEBPACK_IMPORTED_MODULE_1__color_js__["h" /* rgbConvert */])(o); var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; if (r === g && g === b) x = z = y;else { x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); } return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); } function gray(l, opacity) { return new Lab(l, 0, 0, opacity == null ? 1 : opacity); } function lab(l, a, b, opacity) { return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); } function Lab(l, a, b, opacity) { this.l = +l; this.a = +a; this.b = +b; this.opacity = +opacity; } Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Lab, lab, Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["b" /* extend */])(__WEBPACK_IMPORTED_MODULE_1__color_js__["a" /* Color */], { brighter: function (k) { return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, darker: function (k) { return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, rgb: function () { var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200; x = Xn * lab2xyz(x); y = Yn * lab2xyz(y); z = Zn * lab2xyz(z); return new __WEBPACK_IMPORTED_MODULE_1__color_js__["b" /* Rgb */](lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity); } })); function xyz2lab(t) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t) { return t > t1 ? t * t * t : t2 * (t - t0); } function lrgb2rgb(x) { return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); } function rgb2lrgb(x) { return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); } function hclConvert(o) { if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); if (!(o instanceof Lab)) o = labConvert(o); if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); var h = Math.atan2(o.b, o.a) * __WEBPACK_IMPORTED_MODULE_2__math_js__["b" /* rad2deg */]; return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); } function lch(l, c, h, opacity) { return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); } function hcl(h, c, l, opacity) { return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); } function Hcl(h, c, l, opacity) { this.h = +h; this.c = +c; this.l = +l; this.opacity = +opacity; } function hcl2lab(o) { if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); var h = o.h * __WEBPACK_IMPORTED_MODULE_2__math_js__["a" /* deg2rad */]; return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); } Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Hcl, hcl, Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["b" /* extend */])(__WEBPACK_IMPORTED_MODULE_1__color_js__["a" /* Color */], { brighter: function (k) { return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); }, darker: function (k) { return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); }, rgb: function () { return hcl2lab(this).rgb(); } })); /***/ }), /* 116 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = cubehelix; /* unused harmony export Cubehelix */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__define_js__ = __webpack_require__(26); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color_js__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__math_js__ = __webpack_require__(54); var A = -0.14861, B = +1.78277, C = -0.29227, D = -0.90649, E = +1.97294, ED = E * D, EB = E * B, BC_DA = B * C - D * A; function cubehelixConvert(o) { if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); if (!(o instanceof __WEBPACK_IMPORTED_MODULE_1__color_js__["b" /* Rgb */])) o = Object(__WEBPACK_IMPORTED_MODULE_1__color_js__["h" /* rgbConvert */])(o); var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 h = s ? Math.atan2(k, bl) * __WEBPACK_IMPORTED_MODULE_2__math_js__["b" /* rad2deg */] - 120 : NaN; return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); } function cubehelix(h, s, l, opacity) { return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); } function Cubehelix(h, s, l, opacity) { this.h = +h; this.s = +s; this.l = +l; this.opacity = +opacity; } Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["a" /* default */])(Cubehelix, cubehelix, Object(__WEBPACK_IMPORTED_MODULE_0__define_js__["b" /* extend */])(__WEBPACK_IMPORTED_MODULE_1__color_js__["a" /* Color */], { brighter: function (k) { k = k == null ? __WEBPACK_IMPORTED_MODULE_1__color_js__["c" /* brighter */] : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color_js__["c" /* brighter */], k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, darker: function (k) { k = k == null ? __WEBPACK_IMPORTED_MODULE_1__color_js__["d" /* darker */] : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color_js__["d" /* darker */], k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, rgb: function () { var h = isNaN(this.h) ? 0 : (this.h + 120) * __WEBPACK_IMPORTED_MODULE_2__math_js__["a" /* deg2rad */], l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h); return new __WEBPACK_IMPORTED_MODULE_1__color_js__["b" /* Rgb */](255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity); } })); /***/ }), /* 117 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony default export */ __webpack_exports__["a"] = (function (a, b) { return a = +a, b -= a, function (t) { return Math.round(a + b * t); }; }); /***/ }), /* 118 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return interpolateTransformCss; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return interpolateTransformSvg; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__parse__ = __webpack_require__(119); function interpolateTransform(parse, pxComma, pxParen, degParen) { function pop(s) { return s.length ? s.pop() + " " : ""; } function translate(xa, ya, xb, yb, s, q) { if (xa !== xb || ya !== yb) { var i = s.push("translate(", null, pxComma, null, pxParen); q.push({ i: i - 4, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(xa, xb) }, { i: i - 2, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(ya, yb) }); } else if (xb || yb) { s.push("translate(" + xb + pxComma + yb + pxParen); } } function rotate(a, b, s, q) { if (a !== b) { if (a - b > 180) b += 360;else if (b - a > 180) a += 360; // shortest path q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(a, b) }); } else if (b) { s.push(pop(s) + "rotate(" + b + degParen); } } function skewX(a, b, s, q) { if (a !== b) { q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(a, b) }); } else if (b) { s.push(pop(s) + "skewX(" + b + degParen); } } function scale(xa, ya, xb, yb, s, q) { if (xa !== xb || ya !== yb) { var i = s.push(pop(s) + "scale(", null, ",", null, ")"); q.push({ i: i - 4, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(xa, xb) }, { i: i - 2, x: Object(__WEBPACK_IMPORTED_MODULE_0__number__["a" /* default */])(ya, yb) }); } else if (xb !== 1 || yb !== 1) { s.push(pop(s) + "scale(" + xb + "," + yb + ")"); } } return function (a, b) { var s = [], // string constants and placeholders q = []; // number interpolators a = parse(a), b = parse(b); translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); rotate(a.rotate, b.rotate, s, q); skewX(a.skewX, b.skewX, s, q); scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); a = b = null; // gc return function (t) { var i = -1, n = q.length, o; while (++i < n) s[(o = q[i]).i] = o.x(t); return s.join(""); }; }; } var interpolateTransformCss = interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__["a" /* parseCss */], "px, ", "px)", "deg)"); var interpolateTransformSvg = interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__["b" /* parseSvg */], ", ", ")", ")"); /***/ }), /* 119 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = parseCss; /* harmony export (immutable) */ __webpack_exports__["b"] = parseSvg; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__decompose__ = __webpack_require__(120); var cssNode, cssRoot, cssView, svgNode; function parseCss(value) { if (value === "none") return __WEBPACK_IMPORTED_MODULE_0__decompose__["b" /* identity */]; if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; cssNode.style.transform = value; value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); cssRoot.removeChild(cssNode); value = value.slice(7, -1).split(","); return Object(__WEBPACK_IMPORTED_MODULE_0__decompose__["a" /* default */])(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); } function parseSvg(value) { if (value == null) return __WEBPACK_IMPORTED_MODULE_0__decompose__["b" /* identity */]; if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); svgNode.setAttribute("transform", value); if (!(value = svgNode.transform.baseVal.consolidate())) return __WEBPACK_IMPORTED_MODULE_0__decompose__["b" /* identity */]; value = value.matrix; return Object(__WEBPACK_IMPORTED_MODULE_0__decompose__["a" /* default */])(value.a, value.b, value.c, value.d, value.e, value.f); } /***/ }), /* 120 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return identity; }); var degrees = 180 / Math.PI; var identity = { translateX: 0, translateY: 0, rotate: 0, skewX: 0, scaleX: 1, scaleY: 1 }; /* harmony default export */ __webpack_exports__["a"] = (function (a, b, c, d, e, f) { var scaleX, scaleY, skewX; if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; return { translateX: e, translateY: f, rotate: Math.atan2(b, a) * degrees, skewX: Math.atan(skewX) * degrees, scaleX: scaleX, scaleY: scaleY }; }); /***/ }), /* 121 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; var rho = Math.SQRT2, rho2 = 2, rho4 = 4, epsilon2 = 1e-12; function cosh(x) { return ((x = Math.exp(x)) + 1 / x) / 2; } function sinh(x) { return ((x = Math.exp(x)) - 1 / x) / 2; } function tanh(x) { return ((x = Math.exp(2 * x)) - 1) / (x + 1); } // p0 = [ux0, uy0, w0] // p1 = [ux1, uy1, w1] /* harmony default export */ __webpack_exports__["a"] = (function (p0, p1) { var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; // Special case for u0 ≅ u1. if (d2 < epsilon2) { S = Math.log(w1 / w0) / rho; i = function (t) { return [ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(rho * t * S)]; }; } // General case. else { var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); S = (r1 - r0) / rho; i = function (t) { var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)]; }; } i.duration = S * 1000; return i; }); /***/ }), /* 122 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return hslLong; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(5); function hsl(hue) { return function (start, end) { var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["d" /* hsl */])(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["d" /* hsl */])(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.opacity, end.opacity); return function (t) { start.h = h(t); start.s = s(t); start.l = l(t); start.opacity = opacity(t); return start + ""; }; }; } /* harmony default export */ __webpack_exports__["a"] = (hsl(__WEBPACK_IMPORTED_MODULE_1__color__["c" /* hue */])); var hslLong = hsl(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */]); /***/ }), /* 123 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = lab; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(5); function lab(start, end) { var l = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["e" /* lab */])(start)).l, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["e" /* lab */])(end)).l), a = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.a, end.a), b = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.b, end.b), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.opacity, end.opacity); return function (t) { start.l = l(t); start.a = a(t); start.b = b(t); start.opacity = opacity(t); return start + ""; }; } /***/ }), /* 124 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return hclLong; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(5); function hcl(hue) { return function (start, end) { var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["c" /* hcl */])(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["c" /* hcl */])(end)).h), c = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.c, end.c), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.opacity, end.opacity); return function (t) { start.h = h(t); start.c = c(t); start.l = l(t); start.opacity = opacity(t); return start + ""; }; }; } /* harmony default export */ __webpack_exports__["a"] = (hcl(__WEBPACK_IMPORTED_MODULE_1__color__["c" /* hue */])); var hclLong = hcl(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */]); /***/ }), /* 125 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cubehelixLong; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(5); function cubehelix(hue) { return function cubehelixGamma(y) { y = +y; function cubehelix(start, end) { var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["b" /* cubehelix */])(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__["b" /* cubehelix */])(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */])(start.opacity, end.opacity); return function (t) { start.h = h(t); start.s = s(t); start.l = l(Math.pow(t, y)); start.opacity = opacity(t); return start + ""; }; } cubehelix.gamma = cubehelixGamma; return cubehelix; }(1); } /* harmony default export */ __webpack_exports__["b"] = (cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__["c" /* hue */])); var cubehelixLong = cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__["a" /* default */]); /***/ }), /* 126 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony default export */ __webpack_exports__["a"] = (function (interpolator, n) { var samples = new Array(n); for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); return samples; }); /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { canvas: __webpack_require__(128), svg: __webpack_require__(131) }; /***/ }), /* 128 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { painter: __webpack_require__(129) }; /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var renderUtil = __webpack_require__(130); var SHAPE_ATTRS = ['fillStyle', 'font', 'globalAlpha', 'lineCap', 'lineWidth', 'lineJoin', 'miterLimit', 'shadowBlur', 'shadowColor', 'shadowOffsetX', 'shadowOffsetY', 'strokeStyle', 'textAlign', 'textBaseline', 'lineDash', 'lineDashOffset']; var Painter = /*#__PURE__*/function () { function Painter(dom) { if (!dom) { return null; } var canvasId = Util.uniqueId('canvas_'); var canvasDom = Util.createDom(''); dom.appendChild(canvasDom); this.type = 'canvas'; this.canvas = canvasDom; this.context = canvasDom.getContext('2d'); this.toDraw = false; return this; } var _proto = Painter.prototype; _proto.beforeDraw = function beforeDraw() { var el = this.canvas; this.context && this.context.clearRect(0, 0, el.width, el.height); }; _proto.draw = function draw(model) { var self = this; function drawInner() { self.animateHandler = Util.requestAnimationFrame(function () { self.animateHandler = undefined; if (self.toDraw) { drawInner(); } }); self.beforeDraw(); try { self._drawGroup(model); } catch (ev) { // 绘制时异常,中断重绘 console.warn('error in draw canvas, detail as:'); console.warn(ev); } finally { self.toDraw = false; } } if (self.animateHandler) { self.toDraw = true; } else { drawInner(); } }; _proto.drawSync = function drawSync(model) { this.beforeDraw(); this._drawGroup(model); }; _proto._drawGroup = function _drawGroup(group) { if (group._cfg.removed || group._cfg.destroyed || !group._cfg.visible) { return; } var self = this; var children = group._cfg.children; var child = null; this.setContext(group); for (var i = 0; i < children.length; i++) { child = children[i]; if (children[i].isGroup) { self._drawGroup(child); } else { self._drawShape(child); } } this.restoreContext(group); }; _proto._drawShape = function _drawShape(shape) { if (shape._cfg.removed || shape._cfg.destroyed || !shape._cfg.visible) { return; } this.setContext(shape); shape.drawInner(this.context); this.restoreContext(shape); shape._cfg.attrs = shape._attrs; shape._cfg.hasUpdate = false; }; _proto.setContext = function setContext(shape) { var context = this.context; var clip = shape._attrs.clip; context.save(); if (clip) { // context.save(); clip.resetTransform(context); clip.createPath(context); context.clip(); // context.restore(); } this.resetContext(shape); shape.resetTransform(context); }; _proto.restoreContext = function restoreContext() { this.context.restore(); }; _proto.resetContext = function resetContext(shape) { var context = this.context; var elAttrs = shape._attrs; // var canvas = this.get('canvas'); if (!shape.isGroup) { for (var k in elAttrs) { if (SHAPE_ATTRS.indexOf(k) > -1) { // 非canvas属性不附加 var v = elAttrs[k]; if (k === 'fillStyle') { v = renderUtil.parseStyle(v, shape, context); } if (k === 'strokeStyle') { v = renderUtil.parseStyle(v, shape, context); } if (k === 'lineDash' && context.setLineDash) { if (Util.isArray(v)) { context.setLineDash(v); } else if (Util.isString(v)) { context.setLineDash(v.split(' ')); } } else { context[k] = v; } } } } }; return Painter; }(); module.exports = Painter; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var regexTags = /[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/ig; var regexDot = /[^\s\,]+/ig; var regexLG = /^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i; var regexRG = /^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i; var regexPR = /^p\s*\(\s*([axyn])\s*\)\s*(.*)/i; var regexColorStop = /[\d.]+:(#[^\s]+|[^\)]+\))/ig; // const numColorCache = {}; function addStop(steps, gradient) { var arr = steps.match(regexColorStop); Util.each(arr, function (item) { item = item.split(':'); gradient.addColorStop(item[0], item[1]); }); } function parseLineGradient(color, self, context) { var arr = regexLG.exec(color); var angle = Util.mod(Util.toRadian(parseFloat(arr[1])), Math.PI * 2); var steps = arr[2]; var box = self.getBBox(); var start; var end; if (angle >= 0 && angle < 0.5 * Math.PI) { start = { x: box.minX, y: box.minY }; end = { x: box.maxX, y: box.maxY }; } else if (0.5 * Math.PI <= angle && angle < Math.PI) { start = { x: box.maxX, y: box.minY }; end = { x: box.minX, y: box.maxY }; } else if (Math.PI <= angle && angle < 1.5 * Math.PI) { start = { x: box.maxX, y: box.maxY }; end = { x: box.minX, y: box.minY }; } else { start = { x: box.minX, y: box.maxY }; end = { x: box.maxX, y: box.minY }; } var tanTheta = Math.tan(angle); var tanTheta2 = tanTheta * tanTheta; var x = (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.x; var y = tanTheta * (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.y; var gradient = context.createLinearGradient(start.x, start.y, x, y); addStop(steps, gradient); return gradient; } function parseRadialGradient(color, self, context) { var arr = regexRG.exec(color); var fx = parseFloat(arr[1]); var fy = parseFloat(arr[2]); var fr = parseFloat(arr[3]); var steps = arr[4]; // 环半径为0时,默认无渐变,取渐变序列的最后一个颜色 if (fr === 0) { var colors = steps.match(regexColorStop); return colors[colors.length - 1].split(':')[1]; } var box = self.getBBox(); var width = box.maxX - box.minX; var height = box.maxY - box.minY; var r = Math.sqrt(width * width + height * height) / 2; var gradient = context.createRadialGradient(box.minX + width * fx, box.minY + height * fy, fr * r, box.minX + width / 2, box.minY + height / 2, r); addStop(steps, gradient); return gradient; } function parsePattern(color, self, context) { if (self.get('patternSource') && self.get('patternSource') === color) { return self.get('pattern'); } var pattern; var img; var arr = regexPR.exec(color); var repeat = arr[1]; var source = arr[2]; // Function to be called when pattern loads function onload() { // Create pattern pattern = context.createPattern(img, repeat); self.setSilent('pattern', pattern); // be a cache self.setSilent('patternSource', color); } switch (repeat) { case 'a': repeat = 'repeat'; break; case 'x': repeat = 'repeat-x'; break; case 'y': repeat = 'repeat-y'; break; case 'n': repeat = 'no-repeat'; break; default: repeat = 'no-repeat'; } img = new Image(); // If source URL is not a data URL if (!source.match(/^data:/i)) { // Set crossOrigin for this image img.crossOrigin = 'Anonymous'; } img.src = source; if (img.complete) { onload(); } else { img.onload = onload; // Fix onload() bug in IE9 img.src = img.src; } return pattern; } module.exports = { parsePath: function parsePath(path) { path = path || []; if (Util.isArray(path)) { return path; } if (Util.isString(path)) { path = path.match(regexTags); Util.each(path, function (item, index) { item = item.match(regexDot); if (item[0].length > 1) { var tag = item[0].charAt(0); item.splice(1, 0, item[0].substr(1)); item[0] = tag; } Util.each(item, function (sub, i) { if (!isNaN(sub)) { item[i] = +sub; } }); path[index] = item; }); return path; } }, parseStyle: function parseStyle(color, self, context) { if (Util.isString(color)) { if (color[1] === '(' || color[2] === '(') { if (color[0] === 'l') { // regexLG.test(color) return parseLineGradient(color, self, context); } else if (color[0] === 'r') { // regexRG.test(color) return parseRadialGradient(color, self, context); } else if (color[0] === 'p') { // regexPR.test(color) return parsePattern(color, self, context); } } return color; } } /* , numberToColor(num) { // 增加缓存 let color = numColorCache[num]; if (!color) { let str = num.toString(16); for (let i = str.length; i < 6; i++) { str = '0' + str; } color = '#' + str; numColorCache[num] = color; } return color; }*/ }; /***/ }), /* 131 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { painter: __webpack_require__(132), getShape: __webpack_require__(139) }; /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { var Util = __webpack_require__(0); var _require = __webpack_require__(4), parseRadius = _require.parseRadius; var Marker = __webpack_require__(21); var Defs = __webpack_require__(133); var SHAPE_TO_TAGS = { rect: 'path', circle: 'circle', line: 'line', path: 'path', marker: 'path', text: 'text', polygon: 'polygon', image: 'image', ellipse: 'ellipse', dom: 'foreignObject', fan: 'path', group: 'g' }; var LETTER_SPACING = 0.3; var SVG_ATTR_MAP = { opacity: 'opacity', fillStyle: 'fill', strokeOpacity: 'stroke-opacity', fillOpacity: 'fill-opacity', strokeStyle: 'stroke', x: 'x', y: 'y', r: 'r', rx: 'rx', ry: 'ry', width: 'width', height: 'height', x1: 'x1', x2: 'x2', y1: 'y1', y2: 'y2', lineCap: 'stroke-linecap', lineJoin: 'stroke-linejoin', lineWidth: 'stroke-width', lineDash: 'stroke-dasharray', lineDashOffset: 'stroke-dashoffset', miterLimit: 'stroke-miterlimit', font: 'font', fontSize: 'font-size', fontStyle: 'font-style', fontVariant: 'font-variant', fontWeight: 'font-weight', fontFamily: 'font-family', startArrow: 'marker-start', endArrow: 'marker-end', path: 'd', "class": 'class', id: 'id', style: 'style', preserveAspectRatio: 'preserveAspectRatio' }; var BASELINE_MAP = { top: 'before-edge', middle: 'central', bottom: 'after-edge', alphabetic: 'baseline', hanging: 'hanging' }; var ANCHOR_MAP = { left: 'left', start: 'left', center: 'middle', right: 'end', end: 'end' }; var Painter = /*#__PURE__*/function () { function Painter(dom) { if (!dom) { return null; } var svgId = Util.uniqueId('canvas_'); var canvasDom = Util.createDom(""); dom.appendChild(canvasDom); this.type = 'svg'; this.canvas = canvasDom; this.context = new Defs(canvasDom); this.toDraw = false; return this; } var _proto = Painter.prototype; _proto.draw = function draw(model) { var self = this; function drawInner() { self.animateHandler = Util.requestAnimationFrame(function () { self.animateHandler = undefined; if (self.toDraw) { drawInner(); } }); try { self._drawChildren(model); } catch (ev) { // 绘制时异常,中断重绘 console.warn('error in draw canvas, detail as:'); console.warn(ev); } finally { self.toDraw = false; } } if (self.animateHandler) { self.toDraw = true; } else { drawInner(); } }; _proto.drawSync = function drawSync(model) { this._drawChildren(model); }; _proto._drawGroup = function _drawGroup(model, index) { var cfg = model._cfg; if (cfg.removed || cfg.destroyed) { return; } if (cfg.tobeRemoved) { Util.each(cfg.tobeRemoved, function (item) { if (item.parentNode) { item.parentNode.removeChild(item); } }); cfg.tobeRemoved = []; } this._drawShape(model, index); if (cfg.children && cfg.children.length > 0) { this._drawChildren(model); } }; _proto._drawChildren = function _drawChildren(parent) { var self = this; var children = parent._cfg.children; var shape; // 防止在画children的时候,父group已经被destroy if (!children) { return; } for (var i = 0; i < children.length; i++) { shape = children[i]; if (shape.isGroup) { self._drawGroup(shape, i); } else { self._drawShape(shape, i); } } }; _proto._drawShape = function _drawShape(model, index) { var self = this; var attrs = model._attrs; var cfg = model._cfg; var el = cfg.el; // 删除 if (cfg.removed || cfg.destroyed) { if (el) { el.parentNode.removeChild(cfg.el); } return; } // 新增节点 if (!el && cfg.parent) { self._createDom(model, index); self._updateShape(model); } el = cfg.el; if (cfg.visible === false) { el.setAttribute('visibility', 'hidden'); return; } if (cfg.visible && el.hasAttribute('visibility')) { el.removeAttribute('visibility'); } // 更新 if (cfg.hasUpdate) { self._updateShape(model); } if (attrs.clip && attrs.clip._cfg.hasUpdate) { self._updateShape(attrs.clip); } }; _proto._updateShape = function _updateShape(model) { var self = this; var attrs = model._attrs; var formerAttrs = model._cfg.attrs; if (!formerAttrs) { return; } if (!model._cfg.el) { self._createDom(model); } if ('clip' in attrs) { this._setClip(model, attrs.clip); } if ('shadowOffsetX' in attrs || 'shadowOffsetY' in attrs || 'shadowBlur' in attrs || 'shadowColor' in attrs) { this._setShadow(model); } if (model.type === 'text') { self._updateText(model); return; } if (model.type === 'fan') { self._updateFan(model); } if (model.type === 'marker') { model._cfg.el.setAttribute('d', self._assembleMarker(attrs)); } if (model.type === 'rect') { model._cfg.el.setAttribute('d', self._assembleRect(attrs)); } for (var key in attrs) { if (attrs[key] !== formerAttrs[key]) { self._setAttribute(model, key, attrs[key]); } } model._cfg.attrs = Util.deepMix({}, model._attrs); model._cfg.hasUpdate = false; }; _proto._setAttribute = function _setAttribute(model, name, value) { var type = model.type; var attrs = model._attrs; var el = model._cfg.el; var defs = this.context; // 计算marker路径 if ((type === 'marker' || type === 'rect') && ~['x', 'y', 'radius', 'r'].indexOf(name)) { return; } // 圆和椭圆不是x, y, 是cx, cy。 marker的x,y 用于计算marker的路径,不需要写到dom if (~['circle', 'ellipse'].indexOf(type) && ~['x', 'y'].indexOf(name)) { el.setAttribute('c' + name, parseInt(value, 10)); return; } // 多边形 if (type === 'polygon' && name === 'points') { if (!value || value.length === 0) { value = ''; } if (Util.isArray(value)) { value = value.map(function (point) { return point[0] + ',' + point[1]; }); value = value.join(' '); } el.setAttribute('points', value); return; } // 设置path if (name === 'path' && Util.isArray(value)) { el.setAttribute('d', this._formatPath(value)); return; } // 设置图片 if (name === 'img') { this._setImage(model, value); return; } if (name === 'transform') { if (!value) { el.removeAttribute('transform'); return; } this._setTransform(model); return; } if (name === 'rotate') { if (!value) { el.removeAttribute('transform'); return; } this._setTransform(model); return; } if (name === 'matrix') { this._setTransform(model); return; } if (name === 'fillStyle' || name === 'strokeStyle') { this._setColor(model, name, value); return; } if (name === 'clip') { return; } if (~name.indexOf('Arrow')) { name = SVG_ATTR_MAP[name]; if (!value) { model._cfg[name] = null; el.removeAttribute(name); } else { var id = null; if (typeof value === 'boolean') { id = defs.getDefaultArrow(attrs, name); } else { id = defs.addArrow(attrs, name); } el.setAttribute(name, "url(#" + id + ")"); model._cfg[name] = id; } return; } // foreignObject if (name === 'html') { if (typeof value === 'string') { el.innerHTML = value; } else { el.innerHTML = ''; el.appendChild(value); } } if (SVG_ATTR_MAP[name]) { el.setAttribute(SVG_ATTR_MAP[name], value); } }; _proto._createDom = function _createDom(model, index) { var type = SHAPE_TO_TAGS[model.type]; var attrs = model._attrs; var parent = model._cfg.parent; if (!type) { throw new Error('the type' + model.type + 'is not supported by svg'); } var shape = document.createElementNS('http://www.w3.org/2000/svg', type); if (model._cfg.id) { shape.id = model._cfg.id; } model._cfg.el = shape; if (parent) { var parentNode = parent._cfg.el; if (typeof index === 'undefined') { parentNode.appendChild(shape); } else { var childNodes = parent._cfg.el.childNodes; // svg下天然有defs作为子节点,svg下子元素index需要+1 if (parentNode.tagName === 'svg') { index += 1; } if (childNodes.length <= index) { parentNode.appendChild(shape); } else { parentNode.insertBefore(shape, childNodes[index]); } } } model._cfg.attrs = {}; if (model.type === 'text') { shape.setAttribute('paint-order', 'stroke'); shape.setAttribute('style', 'stroke-linecap:butt; stroke-linejoin:miter;'); } else { if (!attrs.stroke && !attrs.strokeStyle) { shape.setAttribute('stroke', 'none'); } if (!attrs.fill && !attrs.fillStyle) { shape.setAttribute('fill', 'none'); } } return shape; }; _proto._assembleMarker = function _assembleMarker(attrs) { var r = attrs.r; if (typeof attrs.r === 'undefined') { r = attrs.radius; } if (isNaN(Number(attrs.x)) || isNaN(Number(attrs.y)) || isNaN(Number(r))) { return ''; } var d = ''; if (typeof attrs.symbol === 'function') { d = attrs.symbol(attrs.x, attrs.y, r); } else { d = Marker.Symbols[attrs.symbol || 'circle'](attrs.x, attrs.y, r); } if (Util.isArray(d)) { d = d.map(function (path) { return path.join(' '); }).join(''); } return d; }; _proto._assembleRect = function _assembleRect(attrs) { var x = attrs.x; var y = attrs.y; var w = attrs.width; var h = attrs.height; var radius = attrs.radius; if (!radius) { return "M " + x + "," + y + " l " + w + ",0 l 0," + h + " l" + -w + " 0 z"; } var r = parseRadius(radius); if (Util.isArray(radius)) { if (radius.length === 1) { r.r1 = r.r2 = r.r3 = r.r4 = radius[0]; } else if (radius.length === 2) { r.r1 = r.r3 = radius[0]; r.r2 = r.r4 = radius[1]; } else if (radius.length === 3) { r.r1 = radius[0]; r.r2 = r.r4 = radius[1]; r.r3 = radius[2]; } else { r.r1 = radius[0]; r.r2 = radius[1]; r.r3 = radius[2]; r.r4 = radius[3]; } } else { r.r1 = r.r2 = r.r3 = r.r4 = radius; } var d = [["M " + (x + r.r1) + "," + y], ["l " + (w - r.r1 - r.r2) + ",0"], ["a " + r.r2 + "," + r.r2 + ",0,0,1," + r.r2 + "," + r.r2], ["l 0," + (h - r.r2 - r.r3)], ["a " + r.r3 + "," + r.r3 + ",0,0,1," + -r.r3 + "," + r.r3], ["l " + (r.r3 + r.r4 - w) + ",0"], ["a " + r.r4 + "," + r.r4 + ",0,0,1," + -r.r4 + "," + -r.r4], ["l 0," + (r.r4 + r.r1 - h)], ["a " + r.r1 + "," + r.r1 + ",0,0,1," + r.r1 + "," + -r.r1], ['z']]; return d.join(' '); }; _proto._formatPath = function _formatPath(value) { value = value.map(function (path) { return path.join(' '); }).join(''); if (~value.indexOf('NaN')) { return ''; } return value; }; _proto._setTransform = function _setTransform(model) { var matrix = model._attrs.matrix; var el = model._cfg.el; var transform = []; for (var i = 0; i < 9; i += 3) { transform.push(matrix[i] + ',' + matrix[i + 1]); } transform = transform.join(','); if (transform.indexOf('NaN') === -1) { el.setAttribute('transform', "matrix(" + transform + ")"); } else { console.warn('invalid matrix:', matrix); } }; _proto._setImage = function _setImage(model, img) { var attrs = model._attrs; var el = model._cfg.el; if (Util.isString(img)) { el.setAttribute('href', img); } else if (img instanceof Image) { if (!attrs.width) { el.setAttribute('width', img.width); model._attrs.width = img.width; } if (!attrs.height) { el.setAttribute('height', img.height); model._attrs.height = img.height; } el.setAttribute('href', img.src); } else if (img instanceof HTMLElement && Util.isString(img.nodeName) && img.nodeName.toUpperCase() === 'CANVAS') { el.setAttribute('href', img.toDataURL()); } else if (img instanceof ImageData) { var canvas = document.createElement('canvas'); canvas.setAttribute('width', img.width); canvas.setAttribute('height', img.height); canvas.getContext('2d').putImageData(img, 0, 0); if (!attrs.width) { el.setAttribute('width', img.width); model._attrs.width = img.width; } if (!attrs.height) { el.setAttribute('height', img.height); model._attrs.height = img.height; } el.setAttribute('href', canvas.toDataURL()); } }; _proto._updateFan = function _updateFan(model) { function getPoint(angle, radius, center) { return { x: radius * Math.cos(angle) + center.x, y: radius * Math.sin(angle) + center.y }; } var attrs = model._attrs; var cfg = model._cfg; var center = { x: attrs.x, y: attrs.y }; var d = []; var startAngle = attrs.startAngle; var endAngle = attrs.endAngle; if (Util.isNumberEqual(endAngle - startAngle, Math.PI * 2)) { endAngle -= 0.00001; } var outerStart = getPoint(startAngle, attrs.re, center); var outerEnd = getPoint(endAngle, attrs.re, center); var fa = endAngle > startAngle ? 1 : 0; var fs = Math.abs(endAngle - startAngle) > Math.PI ? 1 : 0; var rs = attrs.rs; var re = attrs.re; var innerStart = getPoint(startAngle, attrs.rs, center); var innerEnd = getPoint(endAngle, attrs.rs, center); if (attrs.rs > 0) { d.push("M " + outerEnd.x + "," + outerEnd.y); d.push("L " + innerEnd.x + "," + innerEnd.y); d.push("A " + rs + "," + rs + ",0," + fs + "," + (fa === 1 ? 0 : 1) + "," + innerStart.x + "," + innerStart.y); d.push("L " + outerStart.x + " " + outerStart.y); } else { d.push("M " + center.x + "," + center.y); d.push("L " + outerStart.x + "," + outerStart.y); } d.push("A " + re + "," + re + ",0," + fs + "," + fa + "," + outerEnd.x + "," + outerEnd.y); if (attrs.rs > 0) { d.push("L " + innerEnd.x + "," + innerEnd.y); } else { d.push('Z'); } cfg.el.setAttribute('d', d.join(' ')); }; _proto._updateText = function _updateText(model) { var self = this; var attrs = model._attrs; var formerAttrs = model._cfg.attrs; var el = model._cfg.el; this._setFont(model); for (var attr in attrs) { if (attrs[attr] !== formerAttrs[attr]) { if (attr === 'text') { self._setText(model, "" + attrs[attr]); continue; } if (attr === 'fillStyle' || attr === 'strokeStyle') { this._setColor(model, attr, attrs[attr]); continue; } if (attr === 'matrix') { this._setTransform(model); continue; } if (SVG_ATTR_MAP[attr]) { el.setAttribute(SVG_ATTR_MAP[attr], attrs[attr]); } } } model._cfg.attrs = Object.assign({}, model._attrs); model._cfg.hasUpdate = false; }; _proto._setFont = function _setFont(model) { var el = model.get('el'); var attrs = model._attrs; var fontSize = attrs.fontSize; el.setAttribute('alignment-baseline', BASELINE_MAP[attrs.textBaseline] || 'baseline'); el.setAttribute('text-anchor', ANCHOR_MAP[attrs.textAlign] || 'left'); if (fontSize && +fontSize < 12) { // 小于 12 像素的文本进行 scale 处理 attrs.matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1]; model.transform([['t', -attrs.x, -attrs.y], ['s', +fontSize / 12, +fontSize / 12], ['t', attrs.x, attrs.y]]); } }; _proto._setText = function _setText(model, text) { var el = model._cfg.el; var baseline = model._attrs.textBaseline || 'bottom'; if (!text) { el.innerHTML = ''; } else if (~text.indexOf('\n')) { var x = model._attrs.x; var textArr = text.split('\n'); var textLen = textArr.length - 1; var arr = ''; Util.each(textArr, function (segment, i) { if (i === 0) { if (baseline === 'alphabetic') { arr += "" + segment + ""; } else if (baseline === 'top') { arr += "" + segment + ""; } else if (baseline === 'middle') { arr += "" + segment + ""; } else if (baseline === 'bottom') { arr += "" + segment + ""; } else if (baseline === 'hanging') { arr += "" + segment + ""; } } else { arr += "" + segment + ""; } }); el.innerHTML = arr; } else { el.innerHTML = text; } }; _proto._setClip = function _setClip(model, value) { var el = model._cfg.el; if (!value) { el.removeAttribute('clip-path'); return; } if (!el.hasAttribute('clip-path')) { this._createDom(value); this._updateShape(value); var id = this.context.addClip(value); el.setAttribute('clip-path', "url(#" + id + ")"); } else if (value._cfg.hasUpdate) { this._updateShape(value); } }; _proto._setColor = function _setColor(model, name, value) { var el = model._cfg.el; var defs = this.context; if (!value) { el.setAttribute(SVG_ATTR_MAP[name], 'none'); return; } value = value.trim(); if (/^[r,R,L,l]{1}[\s]*\(/.test(value)) { var id = defs.find('gradient', value); if (!id) { id = defs.addGradient(value); } el.setAttribute(SVG_ATTR_MAP[name], "url(#" + id + ")"); } else if (/^[p,P]{1}[\s]*\(/.test(value)) { var _id = defs.find('pattern', value); if (!_id) { _id = defs.addPattern(value); } el.setAttribute(SVG_ATTR_MAP[name], "url(#" + _id + ")"); } else { el.setAttribute(SVG_ATTR_MAP[name], value); } }; _proto._setShadow = function _setShadow(model) { var el = model._cfg.el; var attrs = model._attrs; var cfg = { dx: attrs.shadowOffsetX, dy: attrs.shadowOffsetY, blur: attrs.shadowBlur, color: attrs.shadowColor }; if (!cfg.dx && !cfg.dy && !cfg.blur && !cfg.color) { el.removeAttribute('filter'); } else { var id = this.context.find('filter', cfg); if (!id) { id = this.context.addShadow(cfg, this); } el.setAttribute('filter', "url(#" + id + ")"); } }; return Painter; }(); module.exports = Painter; /***/ }), /* 133 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/9. */ var Util = __webpack_require__(0); var Gradient = __webpack_require__(134); var Shadow = __webpack_require__(135); var Arrow = __webpack_require__(136); var Clip = __webpack_require__(137); var Pattern = __webpack_require__(138); var Defs = /*#__PURE__*/function () { function Defs(canvas) { var el = document.createElementNS('http://www.w3.org/2000/svg', 'defs'); var id = Util.uniqueId('defs_'); el.id = id; canvas.appendChild(el); this.children = []; this.defaultArrow = {}; this.el = el; this.canvas = canvas; } var _proto = Defs.prototype; _proto.find = function find(type, attr) { var children = this.children; var result = null; for (var i = 0; i < children.length; i++) { if (children[i].match(type, attr)) { result = children[i].id; break; } } return result; }; _proto.findById = function findById(id) { var children = this.children; var flag = null; for (var i = 0; i < children.length; i++) { if (children[i].id === id) { flag = children[i]; break; } } return flag; }; _proto.add = function add(item) { this.children.push(item); item.canvas = this.canvas; item.parent = this; }; _proto.getDefaultArrow = function getDefaultArrow(attrs, name) { var stroke = attrs.stroke || attrs.strokeStyle; if (this.defaultArrow[stroke]) { return this.defaultArrow[stroke].id; } var arrow = new Arrow(attrs, name); this.defaultArrow[stroke] = arrow; this.el.appendChild(arrow.el); return arrow.id; }; _proto.addGradient = function addGradient(cfg) { var gradient = new Gradient(cfg); this.el.appendChild(gradient.el); this.add(gradient); return gradient.id; }; _proto.addArrow = function addArrow(attrs, name) { var arrow = new Arrow(attrs, name); this.el.appendChild(arrow.el); return arrow.id; }; _proto.addShadow = function addShadow(cfg) { var shadow = new Shadow(cfg); this.el.appendChild(shadow.el); this.add(shadow); return shadow.id; }; _proto.addPattern = function addPattern(cfg) { var pattern = new Pattern(cfg); this.el.appendChild(pattern.el); this.add(pattern); return pattern.id; }; _proto.addClip = function addClip(cfg) { var clip = new Clip(cfg); this.el.appendChild(clip.el); this.add(clip); return clip.id; }; return Defs; }(); module.exports = Defs; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/9. */ var Util = __webpack_require__(0); var regexLG = /^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i; var regexRG = /^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i; var regexColorStop = /[\d.]+:(#[^\s]+|[^\)]+\))/ig; function addStop(steps) { var arr = steps.match(regexColorStop); if (!arr) { return ''; } var stops = ''; arr.sort(function (a, b) { a = a.split(':'); b = b.split(':'); return Number(a[0]) - Number(b[0]); }); Util.each(arr, function (item) { item = item.split(':'); stops += ""; }); return stops; } function parseLineGradient(color, el) { var arr = regexLG.exec(color); var angle = Util.mod(Util.toRadian(parseFloat(arr[1])), Math.PI * 2); var steps = arr[2]; var start; var end; if (angle >= 0 && angle < 0.5 * Math.PI) { start = { x: 0, y: 0 }; end = { x: 1, y: 1 }; } else if (0.5 * Math.PI <= angle && angle < Math.PI) { start = { x: 1, y: 0 }; end = { x: 0, y: 1 }; } else if (Math.PI <= angle && angle < 1.5 * Math.PI) { start = { x: 1, y: 1 }; end = { x: 0, y: 0 }; } else { start = { x: 0, y: 1 }; end = { x: 1, y: 0 }; } var tanTheta = Math.tan(angle); var tanTheta2 = tanTheta * tanTheta; var x = (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.x; var y = tanTheta * (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.y; el.setAttribute('x1', start.x); el.setAttribute('y1', start.y); el.setAttribute('x2', x); el.setAttribute('y2', y); el.innerHTML = addStop(steps); } function parseRadialGradient(color, self) { var arr = regexRG.exec(color); var cx = parseFloat(arr[1]); var cy = parseFloat(arr[2]); var r = parseFloat(arr[3]); var steps = arr[4]; self.setAttribute('cx', cx); self.setAttribute('cy', cy); self.setAttribute('r', r); self.innerHTML = addStop(steps); } var Gradient = /*#__PURE__*/function () { function Gradient(cfg) { var el = null; var id = Util.uniqueId('gradient_'); if (cfg.toLowerCase()[0] === 'l') { el = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient'); parseLineGradient(cfg, el); } else { el = document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient'); parseRadialGradient(cfg, el); } el.setAttribute('id', id); this.el = el; this.id = id; this.cfg = cfg; return this; } var _proto = Gradient.prototype; _proto.match = function match(type, attr) { return this.cfg === attr; }; return Gradient; }(); module.exports = Gradient; /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/10. */ var Util = __webpack_require__(0); var ATTR_MAP = { shadowColor: 'color', shadowOpacity: 'opacity', shadowBlur: 'blur', shadowOffsetX: 'dx', shadowOffsetY: 'dy' }; var SHADOW_DIMENSION = { x: '-40%', y: '-40%', width: '200%', height: '200%' }; var Shadow = /*#__PURE__*/function () { function Shadow(cfg) { this.type = 'filter'; var el = document.createElementNS('http://www.w3.org/2000/svg', 'filter'); // expand the filter region to fill in shadows Util.each(SHADOW_DIMENSION, function (v, k) { el.setAttribute(k, v); }); this.el = el; this.id = Util.uniqueId('filter_'); this.el.id = this.id; this.cfg = cfg; this._parseShadow(cfg, el); return this; } var _proto = Shadow.prototype; _proto.match = function match(type, cfg) { if (this.type !== type) { return false; } var flag = true; var config = this.cfg; Util.each(Object.keys(config), function (attr) { if (config[attr] !== cfg[attr]) { flag = false; return false; } }); return flag; }; _proto.update = function update(name, value) { var config = this.cfg; config[ATTR_MAP[name]] = value; this._parseShadow(config, this.el); return this; }; _proto._parseShadow = function _parseShadow(config, el) { var child = ""; el.innerHTML = child; }; return Shadow; }(); module.exports = Shadow; /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/11. */ var Util = __webpack_require__(0); var Arrow = /*#__PURE__*/function () { function Arrow(attrs, type) { var el = document.createElementNS('http://www.w3.org/2000/svg', 'marker'); var id = Util.uniqueId('marker_'); el.setAttribute('id', id); var shape = document.createElementNS('http://www.w3.org/2000/svg', 'path'); shape.setAttribute('stroke', 'none'); shape.setAttribute('fill', attrs.stroke || '#000'); el.appendChild(shape); el.setAttribute('overflow', 'visible'); el.setAttribute('orient', 'auto-start-reverse'); this.el = el; this.child = shape; this.id = id; this.cfg = attrs[type === 'marker-start' ? 'startArrow' : 'endArrow']; this.stroke = attrs.stroke || '#000'; if (this.cfg === true) { this._setDefaultPath(type, shape); } else { this._setMarker(attrs.lineWidth, shape); } return this; } var _proto = Arrow.prototype; _proto.match = function match() { return false; }; _proto._setDefaultPath = function _setDefaultPath(type, el) { var parent = this.el; el.setAttribute('d', 'M0,0 L6,3 L0,6 L3,3Z'); parent.setAttribute('refX', 3); parent.setAttribute('refY', 3); }; _proto._setMarker = function _setMarker(r, el) { var parent = this.el; var path = this.cfg.path; var d = this.cfg.d; if (Util.isArray(path)) { path = path.map(function (segment) { return segment.join(' '); }).join(''); } el.setAttribute('d', path); parent.appendChild(el); if (d) { parent.setAttribute('refX', d / r); } }; _proto.update = function update(fill) { var child = this.child; if (child.attr) { child.attr('fill', fill); } else { child.setAttribute('fill', fill); } }; return Arrow; }(); module.exports = Arrow; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/14. */ var Util = __webpack_require__(0); var Clip = /*#__PURE__*/function () { function Clip(cfg) { this.type = 'clip'; var el = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath'); this.el = el; this.id = Util.uniqueId('clip_'); el.id = this.id; var shapeEl = cfg._cfg.el; // just in case the clip shape is also a shape needs to be drawn el.appendChild(shapeEl.cloneNode(true)); this.cfg = cfg; return this; } var _proto = Clip.prototype; _proto.match = function match() { return false; }; _proto.remove = function remove() { var el = this.el; el.parentNode.removeChild(el); }; return Clip; }(); module.exports = Clip; /***/ }), /* 138 */ /***/ (function(module, exports, __webpack_require__) { /** * Created by Elaine on 2018/5/9. */ var Util = __webpack_require__(0); var regexPR = /^p\s*\(\s*([axyn])\s*\)\s*(.*)/i; var Pattern = /*#__PURE__*/function () { function Pattern(cfg) { var el = document.createElementNS('http://www.w3.org/2000/svg', 'pattern'); el.setAttribute('patternUnits', 'userSpaceOnUse'); var child = document.createElementNS('http://www.w3.org/2000/svg', 'image'); el.appendChild(child); var id = Util.uniqueId('pattern_'); el.id = id; this.el = el; this.id = id; this.cfg = cfg; var arr = regexPR.exec(cfg); var source = arr[2]; child.setAttribute('href', source); var img = new Image(); if (!source.match(/^data:/i)) { img.crossOrigin = 'Anonymous'; } img.src = source; function onload() { el.setAttribute('width', img.width); el.setAttribute('height', img.height); } if (img.complete) { onload(); } else { img.onload = onload; // Fix onload() bug in IE9 img.src = img.src; } return this; } var _proto = Pattern.prototype; _proto.match = function match(type, attr) { return this.cfg === attr; }; return Pattern; }(); module.exports = Pattern; /***/ }), /* 139 */ /***/ (function(module, exports) { var TAG_MAP = { svg: 'svg', circle: 'circle', rect: 'rect', text: 'text', path: 'path', foreignObject: 'foreignObject', polygon: 'polygon', ellipse: 'ellipse', image: 'image' }; module.exports = function getShape(x, y, e) { var target = e.target || e.srcElement; if (!TAG_MAP[target.tagName]) { var parent = target.parentNode; while (parent && !TAG_MAP[parent.tagName]) { parent = parent.parentNode; } target = parent; } if (this._cfg.el === target) { return this; } return this.find(function (item) { return item._cfg && item._cfg.el === target; }); }; /***/ }) /******/ ]); });