@numericelements/knot-sequence
Version:
A library for generating and manipulating knot sequences for b-spline curves and surfaces
50 lines (47 loc) • 2.97 kB
JavaScript
import { IncreasingOpenKnotSequenceClosedCurve } from '../IncreasingOpenKnotSequenceClosedCurve.js';
import { KnotIndexStrictlyIncreasingSequence } from '../KnotIndexStrictlyIncreasingSequence.js';
import { INCREASINGOPENKNOTSEQUENCECLOSEDCURVEALLKNOTS } from '../KnotSequenceConstructorInterface.js';
import { fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence } from './fromIncreasingPeriodicToStrictlyIncreasingPeriodicKnotSequence.js';
function fromIncreasingPeriodicToIncreasingOpenKnotSequenceCC(increasingSeq) {
const knotsOpenSequence = [];
const multiplicityAtOrigin = increasingSeq.knotMultiplicity(new KnotIndexStrictlyIncreasingSequence(0));
const strictlyIncSeq = 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(strictSeqLength - 1 - i)); j++) {
if (knotNumber <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)))
knotsOpenSequence.splice(0, 0, (strictlyIncSeq.abscissaAtIndex(new 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(i)); j++) {
if (knotNumber <= (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1))) {
if (i === (strictSeqLength - 1)) {
knotsOpenSequence.push(lastAbscissa + (lastAbscissa - strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(0))));
}
else {
knotsOpenSequence.push(lastAbscissa + (strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(i)) - strictlyIncSeq.abscissaAtIndex(new KnotIndexStrictlyIncreasingSequence(0))));
}
}
else
break;
knotNumber++;
}
if (knotNumber > (increasingSeq.maxMultiplicityOrder - (multiplicityAtOrigin - 1)))
break;
}
return new IncreasingOpenKnotSequenceClosedCurve(increasingSeq.maxMultiplicityOrder + 1, { type: INCREASINGOPENKNOTSEQUENCECLOSEDCURVEALLKNOTS, knots: knotsOpenSequence });
}
export { fromIncreasingPeriodicToIncreasingOpenKnotSequenceCC };