UNPKG

@thewtex/vtk.js-esm

Version:

Visualization Toolkit for the Web

120 lines (91 loc) 4.85 kB
import macro from '../../macro.js'; import vtkSpline1D from './Spline1D.js'; var vtkErrorMacro = macro.vtkErrorMacro; // ---------------------------------------------------------------------------- // vtkKochanekSpline1D methods // ---------------------------------------------------------------------------- function vtkKochanekSpline1D(publicAPI, model) { // Set our classname model.classHierarchy.push('vtkKochanekSpline1D'); // -------------------------------------------------------------------------- publicAPI.computeCloseCoefficients = function (size, work, x, y) { if (!model.coefficients || model.coefficients.length !== 4 * size) { model.coefficients = new Float32Array(4 * size); } var N = size - 1; for (var i = 1; i < N; i++) { var _cs = y[i] - y[i - 1]; var _cd = y[i + 1] - y[i]; var _ds = _cs * ((1 - model.tension) * (1 - model.continuity) * (1 + model.bias)) + _cd * ((1 - model.tension) * (1 + model.continuity) * (1 - model.bias)); var _dd = _cs * ((1 - model.tension) * (1 + model.continuity) * (1 + model.bias)) + _cd * ((1 - model.tension) * (1 - model.continuity) * (1 - model.bias)); // adjust deriviatives for non uniform spacing between nodes var _n = x[i + 1] - x[i]; var _n2 = x[i] - x[i - 1]; _ds *= _n2 / (_n2 + _n); _dd *= _n / (_n2 + _n); model.coefficients[4 * i + 0] = y[i]; model.coefficients[4 * i + 1] = _dd; model.coefficients[4 * i + 2] = _ds; } // Calculate the deriviatives at the end points model.coefficients[4 * 0 + 0] = y[0]; model.coefficients[4 * N + 0] = y[N]; model.coefficients[4 * N + 1] = 0; model.coefficients[4 * N + 2] = 0; model.coefficients[4 * N + 3] = 0; // The curve is continuous and closed at P0=Pn var cs = y[N] - y[N - 1]; var cd = y[1] - y[0]; var ds = cs * ((1 - model.tension) * (1 - model.continuity) * (1 + model.bias)) + cd * ((1 - model.tension) * (1 + model.continuity) * (1 - model.bias)); var dd = cs * ((1 - model.tension) * (1 + model.continuity) * (1 + model.bias)) + cd * ((1 - model.tension) * (1 - model.continuity) * (1 - model.bias)); // adjust deriviatives for non uniform spacing between nodes var n1 = x[1] - x[0]; var n0 = x[N] - x[N - 1]; ds *= n0 / (n0 + n1); dd *= n1 / (n0 + n1); model.coefficients[4 * 0 + 1] = dd; model.coefficients[4 * 0 + 2] = ds; model.coefficients[4 * N + 1] = dd; model.coefficients[4 * N + 2] = ds; for (var _i = 0; _i < N; _i++) { // // c0 = P ; c1 = DD ; // i i i i // // c1 = P ; c2 = DS ; // i+1 i+1 i+1 i+1 // // c2 = -3P + 3P - 2DD - DS ; // i i i+1 i i+1 // // c3 = 2P - 2P + DD + DS ; // i i i+1 i i+1 // model.coefficients[4 * _i + 2] = -3 * y[_i] + 3 * y[_i + 1] + -2 * model.coefficients[4 * _i + 1] + -1 * model.coefficients[4 * (_i + 1) + 2]; model.coefficients[4 * _i + 3] = 2 * y[_i] + -2 * y[_i + 1] + 1 * model.coefficients[4 * _i + 1] + 1 * model.coefficients[4 * (_i + 1) + 2]; } }; // -------------------------------------------------------------------------- publicAPI.computeOpenCoefficients = function (size, work, x, y) { vtkErrorMacro('Open splines are not implemented yet!'); }; // -------------------------------------------------------------------------- publicAPI.getValue = function (intervalIndex, t) { var t2 = t * t; var t3 = t * t * t; return model.coefficients[4 * intervalIndex + 3] * t3 + model.coefficients[4 * intervalIndex + 2] * t2 + model.coefficients[4 * intervalIndex + 1] * t + model.coefficients[4 * intervalIndex + 0]; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- var DEFAULT_VALUES = { tension: 0, bias: 0, continuity: 0 }; // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES, initialValues); vtkSpline1D.extend(publicAPI, model, initialValues); // Build VTK API macro.obj(publicAPI, model); vtkKochanekSpline1D(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = macro.newInstance(extend, 'vtkKochanekSpline1D'); // ---------------------------------------------------------------------------- var vtkKochanekSpline1D$1 = { newInstance: newInstance, extend: extend }; export default vtkKochanekSpline1D$1; export { extend, newInstance };