@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
JavaScript
'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;