mightyscape-1.2/extensions/fablabchemnitz/dxf_dwg_importer/node_modules/dxf/lib/util/bSpline.js

92 lines
2.7 KiB
JavaScript
Raw Normal View History

2022-11-06 01:33:32 +01:00
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
2024-02-09 11:34:23 +01:00
var _round = _interopRequireDefault(require("./round10"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
2022-11-06 01:33:32 +01:00
/**
* Copied and ported to code standard as the b-spline library is not maintained any longer.
* Source:
* https://github.com/thibauts/b-spline
* Copyright (c) 2015 Thibaut Séguy <thibaut.seguy@gmail.com>
*/
var _default = function _default(t, degree, points, knots, weights) {
var n = points.length; // points count
var d = points[0].length; // point dimensionality
if (t < 0 || t > 1) {
throw new Error('t out of bounds [0,1]: ' + t);
}
if (degree < 1) throw new Error('degree must be at least 1 (linear)');
if (degree > n - 1) throw new Error('degree must be less than or equal to point count - 1');
if (!weights) {
// build weight vector of length [n]
weights = [];
for (var i = 0; i < n; i++) {
weights[i] = 1;
}
}
if (!knots) {
// build knot vector of length [n + degree + 1]
knots = [];
for (var _i = 0; _i < n + degree + 1; _i++) {
knots[_i] = _i;
}
} else {
if (knots.length !== n + degree + 1) throw new Error('bad knot vector length');
}
2024-02-09 11:34:23 +01:00
var domain = [degree, knots.length - 1 - degree];
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// remap t to the domain where the spline is defined
2022-11-06 01:33:32 +01:00
var low = knots[domain[0]];
var high = knots[domain[1]];
2024-02-09 11:34:23 +01:00
t = t * (high - low) + low;
// Clamp to the upper & lower bounds instead of
2022-11-06 01:33:32 +01:00
// throwing an error like in the original lib
// https://github.com/bjnortier/dxf/issues/28
t = Math.max(t, low);
2024-02-09 11:34:23 +01:00
t = Math.min(t, high);
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// find s (the spline segment) for the [t] value provided
2022-11-06 01:33:32 +01:00
var s;
for (s = domain[0]; s < domain[1]; s++) {
if (t >= knots[s] && t <= knots[s + 1]) {
break;
}
2024-02-09 11:34:23 +01:00
}
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// convert points to homogeneous coordinates
2022-11-06 01:33:32 +01:00
var v = [];
for (var _i2 = 0; _i2 < n; _i2++) {
v[_i2] = [];
for (var j = 0; j < d; j++) {
v[_i2][j] = points[_i2][j] * weights[_i2];
}
v[_i2][d] = weights[_i2];
2024-02-09 11:34:23 +01:00
}
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// l (level) goes from 1 to the curve degree + 1
2022-11-06 01:33:32 +01:00
var alpha;
for (var l = 1; l <= degree + 1; l++) {
// build level l of the pyramid
for (var _i3 = s; _i3 > s - degree - 1 + l; _i3--) {
2024-02-09 11:34:23 +01:00
alpha = (t - knots[_i3]) / (knots[_i3 + degree + 1 - l] - knots[_i3]);
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// interpolate each component
2022-11-06 01:33:32 +01:00
for (var _j = 0; _j < d + 1; _j++) {
v[_i3][_j] = (1 - alpha) * v[_i3 - 1][_j] + alpha * v[_i3][_j];
}
}
2024-02-09 11:34:23 +01:00
}
2022-11-06 01:33:32 +01:00
2024-02-09 11:34:23 +01:00
// convert back to cartesian and return
2022-11-06 01:33:32 +01:00
var result = [];
for (var _i4 = 0; _i4 < d; _i4++) {
2024-02-09 11:34:23 +01:00
result[_i4] = (0, _round["default"])(v[s][_i4] / v[s][d], -9);
2022-11-06 01:33:32 +01:00
}
return result;
};
exports["default"] = _default;