UNPKG

@numericelements/knot-sequence

Version:

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

173 lines (169 loc) 10.4 kB
'use strict'; var tslib = require('tslib'); var AbstractOpenKnotSequence = require('./AbstractOpenKnotSequence.cjs'); var Knot = require('./Knot.cjs'); var KnotSequenceConstructorInterface = require('./KnotSequenceConstructorInterface.cjs'); var KnotSequences = require('./ErrorMessages/KnotSequences.cjs'); var KnotSequences$1 = require('./namedConstants/KnotSequences.cjs'); var KnotIndexStrictlyIncreasingSequence = require('./KnotIndexStrictlyIncreasingSequence.cjs'); var Knots = require('./namedConstants/Knots.cjs'); var adaptParameterInsertKnot = require('./KnotSequenceAndUtilities/adaptParameterInsertKnot.cjs'); var adaptParameterRaiseKnotMultiplicity = require('./KnotSequenceAndUtilities/adaptParameterRaiseKnotMultiplicity.cjs'); var ErrorLoging = require('./errorProcessing/ErrorLoging.cjs'); var KnotSequences$2 = require('./WarningMessages/KnotSequences.cjs'); class AbstractStrictlyIncreasingOpenKnotSequence extends AbstractOpenKnotSequence.AbstractOpenKnotSequence { constructor(maxMultiplicityOrder, knotParameters) { super(maxMultiplicityOrder, knotParameters); this._indexKnotOrigin = new KnotIndexStrictlyIncreasingSequence.KnotIndexStrictlyIncreasingSequence(Knots.DEFAULT_KNOT_INDEX); this._isSequenceUpToC0Discontinuity = false; if (knotParameters.type === KnotSequenceConstructorInterface.NO_KNOT_OPEN_CURVE) { this._indexKnotOrigin.knotIndex = 0; } else if (knotParameters.type === KnotSequenceConstructorInterface.NO_KNOT_CLOSED_CURVE) { this._indexKnotOrigin.knotIndex = this._maxMultiplicityOrder - 1; } else if (knotParameters.type === KnotSequenceConstructorInterface.UNIFORM_OPENKNOTSEQUENCE) { this._indexKnotOrigin.knotIndex = this._maxMultiplicityOrder - 1; } else if (knotParameters.type === KnotSequenceConstructorInterface.UNIFORMLYSPREADINTERKNOTS_OPENKNOTSEQUENCE) { this._indexKnotOrigin.knotIndex = 0; } else if (knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE || knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE_UPTOC0DISCONTINUITY || knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCECLOSEDCURVEALLKNOTS || knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE_UPTOC0DISCONTINUITY_CLOSEDCURVEALLKNOTS) { if (knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE_UPTOC0DISCONTINUITY || knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE_UPTOC0DISCONTINUITY_CLOSEDCURVEALLKNOTS) this._isSequenceUpToC0Discontinuity = true; this.generateKnotSequence(knotParameters); } } get allAbscissae() { const abscissae = []; for (const knot of this) { if (knot !== undefined) abscissae.push(knot.abscissa); } return abscissae; } get indexKnotOrigin() { return this._indexKnotOrigin; } [Symbol.iterator]() { const lastIndex = this.knotSequence.length - 1; let index = 0; return { next: () => { if (index <= lastIndex) { const abscissa = this.knotSequence[index].abscissa; const multiplicity = this.knotSequence[index].multiplicity; index++; return { value: { abscissa: abscissa, multiplicity: multiplicity }, done: false }; } else { index = 0; return { done: true }; } } }; } checkKnotMultiplicities(multiplicities) { for (let i = 0; i < multiplicities.length; i++) { if (multiplicities[i] <= 0) this.throwRangeErrorMessage("checkKnotMultiplicities", KnotSequences.EM_KNOT_MULTIPLICITY_OUT_OF_RANGE); } } updateNormalizedBasisOrigin() { const normalizedBasisAtStart = this.getKnotIndexNormalizedBasisAtSequenceStart(); let abscissaOrigin = Knots.DEFAULT_KNOT_ABSCISSA_VALUE; if (normalizedBasisAtStart.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.StrictlyNormalized) { abscissaOrigin = this.abscissaAtIndex(normalizedBasisAtStart.knot); } if (abscissaOrigin !== KnotSequences$1.KNOT_SEQUENCE_ORIGIN) this.throwRangeErrorMessage("checkNormalizedBasisOrigin", KnotSequences.EM_ORIGIN_NORMALIZEDKNOT_SEQUENCE); } generateKnotSequence(knotParameters) { const minValueMaxMultiplicityOrder = 1; this.constructorInputMultOrderAssessment(minValueMaxMultiplicityOrder); this.constructorInputArrayAssessment(knotParameters); this.checkKnotStrictlyIncreasingValues(knotParameters.knots); this.checkKnotMultiplicities(knotParameters.multiplicities); for (let i = 0; i < knotParameters.knots.length; i++) { this.knotSequence.push(new Knot.Knot(knotParameters.knots[i], knotParameters.multiplicities[i])); } this.checkMaxMultiplicityOrderConsistency(); if (!this._isSequenceUpToC0Discontinuity) this.checkMaxKnotMultiplicityAtIntermediateKnots(); const { start: normalizedBasisAtStart, end: normalizedBasisAtEnd } = this.getKnotIndicesBoundingNormalizedBasis(); if (normalizedBasisAtEnd.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.NotNormalized || normalizedBasisAtStart.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.NotNormalized) { this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_NOT_NORMALIZED_BASIS); } else if (normalizedBasisAtEnd.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.StrictlyNormalized) { this._uMax = this.abscissaAtIndex(normalizedBasisAtEnd.knot); } else if (normalizedBasisAtEnd.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.OverDefined) { this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_CUMULATIVE_KNOTMULTIPLICITY_ATEND); } if (normalizedBasisAtStart.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.StrictlyNormalized) { this._indexKnotOrigin = normalizedBasisAtStart.knot; } else if (normalizedBasisAtStart.basisAtSeqExt === KnotSequences$1.NormalizedBasisAtSequenceExtremity.OverDefined) { this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_CUMULATIVE_KNOTMULTIPLICITY_ATSTART); } if (normalizedBasisAtEnd.knot.knotIndex <= normalizedBasisAtStart.knot.knotIndex) this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_NORMALIZED_BASIS_INTERVAL_NOTSUFFICIENT); if (knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCECLOSEDCURVEALLKNOTS || knotParameters.type === KnotSequenceConstructorInterface.STRICTLYINCREASINGOPENKNOTSEQUENCE_UPTOC0DISCONTINUITY_CLOSEDCURVEALLKNOTS) { this.checkKnotMultiplicitiesAtNormalizedBasisBoundaries(); const periodicKnotLength = normalizedBasisAtEnd.knot.knotIndex - normalizedBasisAtStart.knot.knotIndex; if (this._maxMultiplicityOrder === 2 && periodicKnotLength < 3) this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_SIZENORMALIZED_BSPLINEBASIS); let cumulative_multiplicities = 0; for (let i = this._indexKnotOrigin.knotIndex + 1; i < this._indexKnotOrigin.knotIndex + periodicKnotLength; i++) { cumulative_multiplicities += knotParameters.multiplicities[i]; } if (cumulative_multiplicities < (this._maxMultiplicityOrder - this.knotMultiplicity(this._indexKnotOrigin))) { const warning = new ErrorLoging.WarningLog(this.constructor.name, "generateKnotSequence", KnotSequences$2.WM_GEOMETRIC_CONSTRAINTS_POLYGON_VERTICES); warning.logMessage(); if (this.knotMultiplicity(this._indexKnotOrigin) === 1) this.throwRangeErrorMessage("generateKnotSequence", KnotSequences.EM_SIZENORMALIZED_BSPLINEBASIS); } } } length() { return this.knotSequence.length; } knotIndexInputParamAssessment(index, methodName) { if (index.knotIndex > (this.allAbscissae.length - 1)) { this.throwRangeErrorMessage(methodName, KnotSequences.EM_KNOTINDEX_INC_SEQ_TOO_LARGE); } } abscissaAtIndex(index) { this.knotIndexInputParamAssessment(index, "abscissaAtIndex"); let abscissa = KnotSequences$1.UPPER_BOUND_NORMALIZED_BASIS_DEFAULT_ABSCISSA; let i = 0; for (const knot of this) { if (i === index.knotIndex && knot !== undefined) abscissa = knot.abscissa; i++; } return abscissa; } raiseKnotMultiplicityKnotArrayMutSeq(arrayIndices, multiplicity = 1, checkSequenceConsistency = true) { return super.raiseKnotMultiplicityKnotArrayMutSeq(arrayIndices, multiplicity, checkSequenceConsistency); } insertKnotAbscissaArrayMutSeq(abscissa, multiplicity = 1) { return super.insertKnotAbscissaArrayMutSeq(abscissa, multiplicity); } } tslib.__decorate([ adaptParameterRaiseKnotMultiplicity.adaptParameterRaiseKnotMultiplicity(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [Object, Number, Boolean]), tslib.__metadata("design:returntype", void 0) ], AbstractStrictlyIncreasingOpenKnotSequence.prototype, "raiseKnotMultiplicityKnotArrayMutSeq", null); tslib.__decorate([ adaptParameterInsertKnot.adaptParameterInsertKnot(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [Object, Number]), tslib.__metadata("design:returntype", void 0) ], AbstractStrictlyIncreasingOpenKnotSequence.prototype, "insertKnotAbscissaArrayMutSeq", null); exports.AbstractStrictlyIncreasingOpenKnotSequence = AbstractStrictlyIncreasingOpenKnotSequence;