UNPKG

@numericelements/knot-sequence

Version:

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

46 lines (43 loc) 2.55 kB
import { EM_MAXMULTIPLICITY_ORDER_KNOT } from '../ErrorMessages/KnotSequences.js'; import { ErrorLog } from '../errorProcessing/ErrorLoging.js'; import { IncreasingPeriodicKnotSequenceClosedCurve } from '../IncreasingPeriodicKnotSequenceClosedCurve.js'; import { KnotIndexStrictlyIncreasingSequence } from '../KnotIndexStrictlyIncreasingSequence.js'; import { INCREASINGPERIODICKNOTSEQUENCE } from '../KnotSequenceConstructorInterface.js'; import { KNOT_SEQUENCE_ORIGIN } from '../namedConstants/KnotSequences.js'; import { prepareIncreasingOpenKnotSeqCCfromIncreasingPeriodicKnotSeq } from './prepareIncreasingOpenKnotSeqCCfromIncreasingPeriodicKnotSeq.js'; function prepareIncreasingOpenKnotSequenceCC(maxMultiplicityOrder, knotParameters) { let multiplicityFirstKnot = 0; let i = 0; while (knotParameters.periodicKnots[i] === KNOT_SEQUENCE_ORIGIN) { i++; multiplicityFirstKnot++; } if (multiplicityFirstKnot < maxMultiplicityOrder) { const periodicSeq = new IncreasingPeriodicKnotSequenceClosedCurve((maxMultiplicityOrder - 1), { type: INCREASINGPERIODICKNOTSEQUENCE, periodicKnots: knotParameters.periodicKnots }); const openSequence = prepareIncreasingOpenKnotSeqCCfromIncreasingPeriodicKnotSeq(periodicSeq); return { knots: openSequence.knots, multiplicities: openSequence.multiplicities, uMax: openSequence.uMax, indexKnotOrigin: openSequence.indexKnotOrigin }; } else if (multiplicityFirstKnot === maxMultiplicityOrder) { const knots = []; const multiplicities = []; knots.push(knotParameters.periodicKnots[0]); multiplicities.push(1); for (let i = 1; i < knotParameters.periodicKnots.length; i++) { if (knotParameters.periodicKnots[i] === knots[knots.length - 1]) { multiplicities[multiplicities.length - 1]++; } else { knots.push(knotParameters.periodicKnots[i]); multiplicities.push(1); } } return { knots: knots, multiplicities: multiplicities, uMax: knotParameters.periodicKnots[knotParameters.periodicKnots.length - 1], indexKnotOrigin: new KnotIndexStrictlyIncreasingSequence(0) }; } else { const error = new ErrorLog('function', 'prepareIncreasingOpenKnotSequenceCC'); error.addMessage(EM_MAXMULTIPLICITY_ORDER_KNOT); console.log(error.generateMessageString()); throw new RangeError(error.generateMessageString()); } } export { prepareIncreasingOpenKnotSequenceCC };