UNPKG

@numericelements/knot-sequence

Version:

A library for generating and manipulating knot sequences for b-spline curves and surfaces

77 lines (74 loc) 3.92 kB
import { KnotIndexStrictlyIncreasingSequence } from '../KnotIndexStrictlyIncreasingSequence.js'; function prepareStrictlyIncreasingOpenKnotSeqCCfromStrictlyIncreasingPeriodicKnotSeq(strictIncSeq) { const knotsOpenSequence = []; const multiplicitiesOpenSequence = []; const maxMultOrder = strictIncSeq.maxMultiplicityOrder; const lastIndex = strictIncSeq.length() - 1; const lastAbscissa = strictIncSeq.uMax; const multiplicityAtOrigin = strictIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(0)); let nbComplementaryKnots = maxMultOrder - (multiplicityAtOrigin - 1); let index = 0; while (index < nbComplementaryKnots) { const multiplicityExcess = nbComplementaryKnots - strictIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(lastIndex - (index + 1))) - index; if (multiplicityExcess <= 0) { nbComplementaryKnots = index + 1; break; } else if (multiplicityExcess < (nbComplementaryKnots - (index + 1))) { nbComplementaryKnots = nbComplementaryKnots - multiplicityExcess; index++; } else { index++; } } let cumulativeMultiplicityFromOrigin = multiplicityAtOrigin; for (let i = 0; i < nbComplementaryKnots; i++) { knotsOpenSequence.splice(0, 0, (strictIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(lastIndex - (i + 1))) - lastAbscissa)); let multiplicityCurrentKnot = strictIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(lastIndex - (i + 1))); if ((cumulativeMultiplicityFromOrigin + multiplicityCurrentKnot) > maxMultOrder) { multiplicityCurrentKnot = maxMultOrder - cumulativeMultiplicityFromOrigin + 1; } cumulativeMultiplicityFromOrigin += multiplicityCurrentKnot; multiplicitiesOpenSequence.splice(0, 0, multiplicityCurrentKnot); } for (const knot of strictIncSeq) { if (knot !== undefined) { knotsOpenSequence.push(knot.abscissa); multiplicitiesOpenSequence.push(knot.multiplicity); } } nbComplementaryKnots = maxMultOrder - (multiplicityAtOrigin - 1); index = 0; while (index < nbComplementaryKnots) { const multiplicityExcess = nbComplementaryKnots - strictIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(index + 1)) - index; if (multiplicityExcess <= 0) { nbComplementaryKnots = index + 1; break; } else if (multiplicityExcess < (nbComplementaryKnots - (index + 1))) { nbComplementaryKnots = nbComplementaryKnots - multiplicityExcess; index++; } else { index++; } } cumulativeMultiplicityFromOrigin = multiplicityAtOrigin; for (let i = 0; i < nbComplementaryKnots; i++) { if ((i + 1) === lastIndex) { knotsOpenSequence.push(lastAbscissa + (lastAbscissa - strictIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(0)))); } else { knotsOpenSequence.push(lastAbscissa + (strictIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(i + 1)) - strictIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(0)))); } let multiplicityCurrentKnot = strictIncSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(i + 1)); if ((cumulativeMultiplicityFromOrigin + multiplicityCurrentKnot) > maxMultOrder) { multiplicityCurrentKnot = maxMultOrder - cumulativeMultiplicityFromOrigin + 1; } cumulativeMultiplicityFromOrigin += multiplicityCurrentKnot; multiplicitiesOpenSequence.push(multiplicityCurrentKnot); } return { knots: knotsOpenSequence, multiplicities: multiplicitiesOpenSequence }; } export { prepareStrictlyIncreasingOpenKnotSeqCCfromStrictlyIncreasingPeriodicKnotSeq };