| 15967 | * @param {Array} 计算出来的控制点数组 |
| 15968 | */ |
| 15969 | var smoothBezier = function (points, smooth, isLoop, constraint) { |
| 15970 | var cps = []; |
| 15971 | |
| 15972 | var v = []; |
| 15973 | var v1 = []; |
| 15974 | var v2 = []; |
| 15975 | var prevPoint; |
| 15976 | var nextPoint; |
| 15977 | |
| 15978 | var min$$1; |
| 15979 | var max$$1; |
| 15980 | if (constraint) { |
| 15981 | min$$1 = [Infinity, Infinity]; |
| 15982 | max$$1 = [-Infinity, -Infinity]; |
| 15983 | for (var i = 0, len$$1 = points.length; i < len$$1; i++) { |
| 15984 | min(min$$1, min$$1, points[i]); |
| 15985 | max(max$$1, max$$1, points[i]); |
| 15986 | } |
| 15987 | // 与指定的包围盒做并集 |
| 15988 | min(min$$1, min$$1, constraint[0]); |
| 15989 | max(max$$1, max$$1, constraint[1]); |
| 15990 | } |
| 15991 | |
| 15992 | for (var i = 0, len$$1 = points.length; i < len$$1; i++) { |
| 15993 | var point = points[i]; |
| 15994 | |
| 15995 | if (isLoop) { |
| 15996 | prevPoint = points[i ? i - 1 : len$$1 - 1]; |
| 15997 | nextPoint = points[(i + 1) % len$$1]; |
| 15998 | } |
| 15999 | else { |
| 16000 | if (i === 0 || i === len$$1 - 1) { |
| 16001 | cps.push(clone$1(points[i])); |
| 16002 | continue; |
| 16003 | } |
| 16004 | else { |
| 16005 | prevPoint = points[i - 1]; |
| 16006 | nextPoint = points[i + 1]; |
| 16007 | } |
| 16008 | } |
| 16009 | |
| 16010 | sub(v, nextPoint, prevPoint); |
| 16011 | |
| 16012 | // use degree to scale the handle length |
| 16013 | scale(v, v, smooth); |
| 16014 | |
| 16015 | var d0 = distance(point, prevPoint); |
| 16016 | var d1 = distance(point, nextPoint); |
| 16017 | var sum = d0 + d1; |
| 16018 | if (sum !== 0) { |
| 16019 | d0 /= sum; |
| 16020 | d1 /= sum; |
| 16021 | } |
| 16022 | |
| 16023 | scale(v1, v, -d0); |
| 16024 | scale(v2, v, d1); |
| 16025 | var cp0 = add([], point, v1); |
| 16026 | var cp1 = add([], point, v2); |