111 lines
2.5 KiB
Java
111 lines
2.5 KiB
Java
var MatrixUtil = require('../../util').MatrixUtil;
|
|
|
|
var Vector2 = MatrixUtil.vec2;
|
|
|
|
function smoothBezier(points, smooth, isLoop, constraint) {
|
|
var cps = [];
|
|
var prevPoint;
|
|
var nextPoint;
|
|
var hasConstraint = !!constraint;
|
|
var min, max;
|
|
|
|
if (hasConstraint) {
|
|
min = [Infinity, Infinity];
|
|
max = [-Infinity, -Infinity];
|
|
|
|
for (var i = 0, l = points.length; i < l; i++) {
|
|
var point = points[i];
|
|
min = Vector2.min([], min, point);
|
|
max = Vector2.max([], max, point);
|
|
}
|
|
|
|
min = Vector2.min([], min, constraint[0]);
|
|
max = Vector2.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(_point);
|
|
continue;
|
|
} else {
|
|
prevPoint = points[_i - 1];
|
|
nextPoint = points[_i + 1];
|
|
}
|
|
}
|
|
|
|
var v = [];
|
|
v = Vector2.sub(v, nextPoint, prevPoint);
|
|
v = Vector2.scale(v, v, smooth);
|
|
var d0 = Vector2.distance(_point, prevPoint);
|
|
var d1 = Vector2.distance(_point, nextPoint);
|
|
var sum = d0 + d1;
|
|
|
|
if (sum !== 0) {
|
|
d0 /= sum;
|
|
d1 /= sum;
|
|
}
|
|
|
|
var v1 = Vector2.scale([], v, -d0);
|
|
var v2 = Vector2.scale([], v, d1);
|
|
var cp0 = Vector2.add([], _point, v1);
|
|
var cp1 = Vector2.add([], _point, v2);
|
|
|
|
if (hasConstraint) {
|
|
cp0 = Vector2.max([], cp0, min);
|
|
cp0 = Vector2.min([], cp0, max);
|
|
cp1 = Vector2.max([], cp1, min);
|
|
cp1 = Vector2.min([], cp1, max);
|
|
}
|
|
|
|
cps.push(cp0);
|
|
cps.push(cp1);
|
|
}
|
|
|
|
if (isLoop) {
|
|
cps.push(cps.shift());
|
|
}
|
|
|
|
return cps;
|
|
}
|
|
|
|
function catmullRom2bezier(crp, z, constraint) {
|
|
var isLoop = !!z;
|
|
var pointList = [];
|
|
|
|
for (var i = 0, l = crp.length; i < l; i += 2) {
|
|
pointList.push([crp[i], crp[i + 1]]);
|
|
}
|
|
|
|
var controlPointList = smoothBezier(pointList, 0.4, isLoop, constraint);
|
|
var len = pointList.length;
|
|
var d1 = [];
|
|
var cp1;
|
|
var cp2;
|
|
var p;
|
|
|
|
for (var _i2 = 0; _i2 < len - 1; _i2++) {
|
|
cp1 = controlPointList[_i2 * 2];
|
|
cp2 = controlPointList[_i2 * 2 + 1];
|
|
p = pointList[_i2 + 1];
|
|
d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
|
|
}
|
|
|
|
if (isLoop) {
|
|
cp1 = controlPointList[len];
|
|
cp2 = controlPointList[len + 1];
|
|
p = pointList[0];
|
|
d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);
|
|
}
|
|
|
|
return d1;
|
|
}
|
|
|
|
module.exports = {
|
|
catmullRom2bezier: catmullRom2bezier
|
|
}; |