@kitware/vtk.js
Version:
Visualization Toolkit for the Web
136 lines (113 loc) • 4.47 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkCardinalSpline1D from './CardinalSpline1D.js';
import vtkKochanekSpline1D from './KochanekSpline1D.js';
import { splineKind } from './Spline3D/Constants.js';
const {
vtkErrorMacro
} = macro;
// ----------------------------------------------------------------------------
// vtkSpline3D methods
// ----------------------------------------------------------------------------
function vtkSpline3D(publicAPI, model) {
// Set our classname
model.classHierarchy.push('vtkSpline3D');
// --------------------------------------------------------------------------
function computeCoefficients1D(spline, points, boundaryConditionValue) {
if (points.length === 0) {
vtkErrorMacro('Splines require at least one points');
}
// If we have only one point we create a spline
// which two extremities are the same point
if (points.length === 1) {
points.push(points[0]);
}
const size = points.length;
let work = null;
let intervals = null;
work = new Float32Array(size);
if (model.intervals.length === 0) {
intervals = new Float32Array(size);
for (let i = 0; i < intervals.length; i++) {
intervals[i] = i;
}
} else {
intervals = model.intervals;
}
if (model.close) {
spline.computeCloseCoefficients(size, work, intervals, points);
} else {
spline.computeOpenCoefficients(size, work, intervals, points, {
leftConstraint: model.boundaryCondition,
leftValue: boundaryConditionValue,
rightConstraint: model.boundaryCondition,
rightValue: boundaryConditionValue
});
}
}
// --------------------------------------------------------------------------
publicAPI.computeCoefficients = points => {
const x = points.map(pt => pt[0]);
const y = points.map(pt => pt[1]);
const z = points.map(pt => pt[2]);
computeCoefficients1D(model.splineX, x, model.boundaryConditionValues[0]);
computeCoefficients1D(model.splineY, y, model.boundaryConditionValues[1]);
computeCoefficients1D(model.splineZ, z, model.boundaryConditionValues[2]);
};
// --------------------------------------------------------------------------
publicAPI.getPoint = (intervalIndex, t) => [model.splineX.getValue(intervalIndex, t), model.splineY.getValue(intervalIndex, t), model.splineZ.getValue(intervalIndex, t)];
// --------------------------------------------------------------------------
// initialization
// --------------------------------------------------------------------------
if (model.kind === splineKind.KOCHANEK_SPLINE) {
model.splineX = vtkKochanekSpline1D.newInstance({
tension: model.tension,
continuity: model.continuity,
bias: model.bias
});
model.splineY = vtkKochanekSpline1D.newInstance({
tension: model.tension,
continuity: model.continuity,
bias: model.bias
});
model.splineZ = vtkKochanekSpline1D.newInstance({
tension: model.tension,
continuity: model.continuity,
bias: model.bias
});
} else if (model.kind === splineKind.CARDINAL_SPLINE) {
model.splineX = vtkCardinalSpline1D.newInstance();
model.splineY = vtkCardinalSpline1D.newInstance();
model.splineZ = vtkCardinalSpline1D.newInstance();
} else {
vtkErrorMacro(`Unknown spline type ${model.kind}`);
}
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
close: false,
intervals: [],
kind: splineKind.KOCHANEK_SPLINE,
boundaryConditionValues: [0, 0, 0],
// Passed to the vtkKochanekSpline1D
tension: 0,
continuity: 0,
bias: 0
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Build VTK API
macro.obj(publicAPI, model);
macro.setGet(publicAPI, model, ['close', 'intervals']);
vtkSpline3D(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkSpline3D');
// ----------------------------------------------------------------------------
var vtkSpline3D$1 = {
newInstance,
extend
};
export { vtkSpline3D$1 as default, extend, newInstance };