@numericelements/knot-sequence
Version:
A library for generating and manipulating knot sequences for b-spline curves and surfaces
52 lines (48 loc) • 3.41 kB
JavaScript
;
var IncreasingOpenKnotSequenceClosedCurve = require('../IncreasingOpenKnotSequenceClosedCurve.cjs');
var KnotIndexStrictlyIncreasingSequence = require('../KnotIndexStrictlyIncreasingSequence.cjs');
var KnotSequenceConstructorInterface = require('../KnotSequenceConstructorInterface.cjs');
var fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence = require('./fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence.cjs');
function fromIncreasingPeriodicToIncreasingOpenKnotSequenceCC(increasingSeq) {
const knotsOpenSequence = [];
const multiplicityAtOrigin = increasingSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(0));
const strictlyIncSeq = fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence.fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence(increasingSeq);
const strictSeqLength = strictlyIncSeq.length();
const lastAbscissa = strictlyIncSeq.uMax;
let knotNumber = 1;
for (let i = 1; i <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)); i++) {
for (let j = 0; j < strictlyIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(strictSeqLength - 1 - i)); j++) {
if (knotNumber <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)))
knotsOpenSequence.splice(0, 0, (strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(strictSeqLength - 1 - i)) - lastAbscissa));
else
break;
knotNumber++;
}
if (knotNumber > (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)))
break;
}
for (const knot of increasingSeq) {
if (knot !== undefined)
knotsOpenSequence.push(knot);
}
knotNumber = 1;
for (let i = 1; i <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)); i++) {
for (let j = 0; j < strictlyIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(i)); j++) {
if (knotNumber <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1))) {
if (i === (strictSeqLength - 1)) {
knotsOpenSequence.push(lastAbscissa + (lastAbscissa - strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(0))));
}
else {
knotsOpenSequence.push(lastAbscissa + (strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(i)) - strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(0))));
}
}
else
break;
knotNumber++;
}
if (knotNumber > (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)))
break;
}
return new IncreasingOpenKnotSequenceClosedCurve.IncreasingOpenKnotSequenceClosedCurve(increasingSeq.maxMultiplicityOrder + 1, { type: KnotSequenceConstructorInterface.INCREASINGOPENKNOTSEQUENCECLOSEDCURVEALLKNOTS, knots: knotsOpenSequence });
}
exports.fromIncreasingPeriodicToIncreasingOpenKnotSequenceCC = fromIncreasingPeriodicToIncreasingOpenKnotSequenceCC;