var _vector = require("../../core/vector"); var v2Min = _vector.min; var v2Max = _vector.max; var v2Scale = _vector.scale; var v2Distance = _vector.distance; var v2Add = _vector.add; var v2Clone = _vector.clone; var v2Sub = _vector.sub; /** * 璐濆灏斿钩婊戞洸绾� * @module zrender/shape/util/smoothBezier * @author pissang (https://www.github.com/pissang) * Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com) * errorrik (errorrik@gmail.com) */ /** * 璐濆灏斿钩婊戞洸绾� * @alias module:zrender/shape/util/smoothBezier * @param {Array} points 绾挎椤剁偣鏁扮粍 * @param {number} smooth 骞虫粦绛夌骇, 0-1 * @param {boolean} isLoop * @param {Array} constraint 灏嗚绠楀嚭鏉ョ殑鎺у埗鐐圭害鏉熷湪涓€涓寘鍥寸洅鍐� * 姣斿 [[0, 0], [100, 100]], 杩欎釜鍖呭洿鐩掍細涓� * 鏁翠釜鎶樼嚎鐨勫寘鍥寸洅鍋氫竴涓苟闆嗙敤鏉ョ害鏉熸帶鍒剁偣銆� * @param {Array} 璁$畻鍑烘潵鐨勬帶鍒剁偣鏁扮粍 */ function _default(points, smooth, isLoop, constraint) { var cps = []; var v = []; var v1 = []; var v2 = []; var prevPoint; var nextPoint; var min; var max; if (constraint) { min = [Infinity, Infinity]; max = [-Infinity, -Infinity]; for (var i = 0, len = points.length; i < len; i++) { v2Min(min, min, points[i]); v2Max(max, max, points[i]); } // 涓庢寚瀹氱殑鍖呭洿鐩掑仛骞堕泦 v2Min(min, min, constraint[0]); v2Max(max, max, constraint[1]); } for (var i = 0, len = points.length; i < len; i++) { var point = points[i]; if (isLoop) { prevPoint = points[i ? i - 1 : len - 1]; nextPoint = points[(i + 1) % len]; } else { if (i === 0 || i === len - 1) { cps.push(v2Clone(points[i])); continue; } else { prevPoint = points[i - 1]; nextPoint = points[i + 1]; } } v2Sub(v, nextPoint, prevPoint); // use degree to scale the handle length v2Scale(v, v, smooth); var d0 = v2Distance(point, prevPoint); var d1 = v2Distance(point, nextPoint); var sum = d0 + d1; if (sum !== 0) { d0 /= sum; d1 /= sum; } v2Scale(v1, v, -d0); v2Scale(v2, v, d1); var cp0 = v2Add([], point, v1); var cp1 = v2Add([], point, v2); if (constraint) { v2Max(cp0, cp0, min); v2Min(cp0, cp0, max); v2Max(cp1, cp1, min); v2Min(cp1, cp1, max); } cps.push(cp0); cps.push(cp1); } if (isLoop) { cps.push(cps.shift()); } return cps; } module.exports = _default;