NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/geom/util/spline.js
2023-09-14 14:47:11 +08:00

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
};