@itwin/core-geometry 3.0.0-dev.143 → 3.0.0-dev.147

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"KnotVector.js","sourceRoot":"","sources":["../../../src/bspline/KnotVector.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\n// import { Point2d } from \"../Geometry2d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty, no-console*/\r\nimport { Geometry } from \"../Geometry\";\r\nimport { NumberArray } from \"../geometry3d/PointHelpers\";\r\n\r\n/**\r\n * Enumeration of the possible ways of converting a \"periodic\" knot vector to an open knot vector.\r\n * None (0) ==> no wrap possible\r\n * OpenByAddingControlPoints (1) ==> wrapped by adding poles\r\n * OpenByRemovingKnots (2) ==> wrapped by deleting extreme knots.\r\n * @public\r\n */\r\nexport enum BSplineWrapMode {\r\n /** No conversion to periodic */\r\n None = 0,\r\n /** Convert to periodic by removing control points. This is typical for closed bcurve constructed by control points with maximum continuity.\r\n * * Knots stay the same in open and periodic form.\r\n * * Periodic form omits {degree} control points.\r\n */\r\n OpenByAddingControlPoints = 1,\r\n /** Convert to periodic by adding special knots. This is typical of closed bcurve constructed as exact circular or elliptic arc\r\n * * 2 knots on each end are omitted in open form\r\n * * poles stay the same.\r\n */\r\n OpenByRemovingKnots = 2,\r\n}\r\n/**\r\n * Array of non-decreasing numbers acting as a knot array for bsplines.\r\n *\r\n * * Essential identity: numKnots = numPoles + order = numPoles + degree - 1\r\n * * Various bspline libraries have confusion over how many \"end knots\" are needed. \"Many\" libraries (including MicroStation)\r\n * incorrectly demand \"order\" knots at each end for clamping. But only \"order - 1\" are really needed.\r\n * * This class uses the \"order-1\" convention.\r\n * * This class provides queries to convert among spanIndex and knotIndex\r\n * * A span is a single interval of the knots.\r\n * * The left knot of span {k} is knot {k+degree-1}\r\n * * This class provides queries to convert among spanFraction, fraction of knot range, and knot\r\n * * core computations (evaluateBasisFunctions) have leftKnotIndex and global knot value as inputs. Caller's need to\r\n * know their primary values (global knot, spanFraction).\r\n * @public\r\n */\r\nexport class KnotVector {\r\n /** The simple array of knot values. */\r\n public knots: Float64Array;\r\n /** Return the degree of basis functions defined in these knots. */\r\n public degree: number;\r\n private _knot0: number;\r\n private _knot1: number;\r\n\r\n private _wrapMode?: BSplineWrapMode;\r\n /** tolerance for considering two knots to be the same. */\r\n public static readonly knotTolerance = 1.0e-9;\r\n /** Return the leftmost knot value (of the active interval, ignoring unclamped leading knots)*/\r\n public get leftKnot() { return this._knot0; }\r\n /** Return the rightmost knot value (of the active interval, ignoring unclamped leading knots)*/\r\n public get rightKnot() { return this._knot1; }\r\n /** Return the index of the leftmost knot of the active interval */\r\n public get leftKnotIndex() { return this.degree - 1; }\r\n /** Return the index of the rightmost knot of the active interval */\r\n public get rightKnotIndex() { return this.knots.length - this.degree; }\r\n /** Whether the bspline was created by adding poles into \"closed\" structure. This is used by serialize/deserialize to mark knotVector's that were converted from periodic style. */\r\n public get wrappable() { return this._wrapMode === undefined ? BSplineWrapMode.None : this._wrapMode; }\r\n public set wrappable(value: BSplineWrapMode) { this._wrapMode = value; }\r\n /** Return the number of bezier spans. Not that this includes zero-length spans if there are repeated knots. */\r\n public get numSpans() { return this.rightKnotIndex - this.leftKnotIndex; }\r\n /**\r\n *\r\n * * If knots is a number array or Float64Array, the those values become the local knot array.\r\n * * If knots is a simple number, the local knot array is allocated to that size but left as zeros.\r\n * @param knots\r\n * @param degree\r\n */\r\n private constructor(knots: number[] | Float64Array | number, degree: number, wrapMode?: BSplineWrapMode) {\r\n this.degree = degree;\r\n this._wrapMode = wrapMode;\r\n // default values to satisfy compiler -- real values hapn setupFixedValues or final else defers to user\r\n this._knot0 = 0.0;\r\n this._knot1 = 1.0;\r\n // satisfy the initialize checker ..\r\n if (Array.isArray(knots)) { // remark: This ctor is private. The callers (as of April 2019) do not use this path.\r\n this.knots = new Float64Array(knots.length);\r\n this.setKnots(knots);\r\n this.setupFixedValues();\r\n } else if (knots instanceof Float64Array) {\r\n this.knots = knots.slice();\r\n this.setupFixedValues();\r\n } else { // caller is responsible for filling array separately ...\r\n this.knots = new Float64Array(knots);\r\n }\r\n }\r\n /** copy degree and knots to a new KnotVector. */\r\n public clone(): KnotVector { return new KnotVector(this.knots, this.degree, this.wrappable); }\r\n private setupFixedValues() {\r\n // These should be read-only . ..\r\n this._knot0 = this.knots[this.degree - 1];\r\n this._knot1 = this.knots[this.knots.length - this.degree];\r\n }\r\n /** Return the total knot distance from beginning to end. */\r\n public get knotLength01(): number { return this._knot1 - this._knot0; }\r\n /**\r\n * Returns true if all numeric values have wraparound conditions for \"closed\" knotVector with specified wrap mode\r\n * @param mode optional test mode. If undefined, use the this.wrappable.\r\n */\r\n public testClosable(mode?: BSplineWrapMode): boolean {\r\n if (mode === undefined)\r\n mode = this.wrappable;\r\n const leftKnotIndex = this.leftKnotIndex;\r\n const rightKnotIndex = this.rightKnotIndex;\r\n const period = this.rightKnot - this.leftKnot;\r\n const degree = this.degree;\r\n const indexDelta = rightKnotIndex - leftKnotIndex;\r\n // maximum continuity mode . . .\r\n if (mode === BSplineWrapMode.OpenByAddingControlPoints) {\r\n for (let k0 = leftKnotIndex - degree + 1; k0 < leftKnotIndex + degree - 1; k0++) {\r\n const k1 = k0 + indexDelta;\r\n if (!Geometry.isSameCoordinate(this.knots[k0] + period, this.knots[k1]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // arc mode ...\r\n if (mode === BSplineWrapMode.OpenByRemovingKnots) {\r\n // we expect {degree} replicated knots at each end . . .\r\n const numRepeated = degree - 1;\r\n const leftKnot = this.knots[leftKnotIndex];\r\n const rightKnot = this.knots[rightKnotIndex];\r\n for (let i = 0; i < numRepeated; i++) {\r\n if (!Geometry.isSameCoordinate(leftKnot, this.knots[leftKnotIndex - i - 1]))\r\n return false;\r\n if (!Geometry.isSameCoordinate(rightKnot, this.knots[rightKnotIndex + i + 1]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n /** Test matching degree and knot values */\r\n public isAlmostEqual(other: KnotVector): boolean {\r\n if (this.degree !== other.degree) return false;\r\n return NumberArray.isAlmostEqual(this.knots, other.knots, KnotVector.knotTolerance);\r\n }\r\n /** install knot values from an array, optionally ignoring first and last.\r\n */\r\n public setKnots(knots: number[] | Float64Array, skipFirstAndLast?: boolean) {\r\n const numAllocate = skipFirstAndLast ? knots.length - 2 : knots.length;\r\n if (numAllocate !== this.knots.length)\r\n this.knots = new Float64Array(numAllocate);\r\n if (skipFirstAndLast) {\r\n for (let i = 1; i + 1 < knots.length; i++)\r\n this.knots[i - 1] = knots[i];\r\n\r\n } else {\r\n for (let i = 0; i < knots.length; i++)\r\n this.knots[i] = knots[i];\r\n }\r\n this.setupFixedValues();\r\n }\r\n /**\r\n * Create knot vector with {degree-1} replicated knots at start and end, and uniform knots between.\r\n * @param numPoles Number of poles\r\n * @param degree degree of polynomial\r\n * @param a0 left knot value for active interval\r\n * @param a1 right knot value for active interval\r\n */\r\n public static createUniformClamped(numPoles: number, degree: number, a0: number, a1: number): KnotVector {\r\n const knots = new KnotVector(numPoles + degree - 1, degree);\r\n let k = 0;\r\n for (let m = 0; m < degree; m++)knots.knots[k++] = a0;\r\n const du = 1.0 / (numPoles - degree);\r\n for (let i = 1; i + degree < numPoles; i++)\r\n knots.knots[k++] = a0 + i * du * (a1 - a0);\r\n for (let m = 0; m < degree; m++)knots.knots[k++] = a1;\r\n knots.setupFixedValues();\r\n return knots;\r\n }\r\n /**\r\n * Create knot vector with {degree-1} replicated knots at start and end, and uniform knots between.\r\n * @param numInterval number of intervals in knot space. (NOT POLE COUNT)\r\n * @param degree degree of polynomial\r\n * @param a0 left knot value for active interval\r\n * @param a1 right knot value for active interval\r\n */\r\n public static createUniformWrapped(numInterval: number, degree: number, a0: number, a1: number): KnotVector {\r\n const knots = new KnotVector(numInterval + 2 * degree - 1, degree);\r\n const du = 1.0 / numInterval;\r\n for (let i = 1 - degree, k = 0; i < numInterval + degree; i++, k++) {\r\n knots.knots[k] = Geometry.interpolate(a0, i * du, a1);\r\n }\r\n knots.setupFixedValues();\r\n return knots;\r\n }\r\n\r\n /**\r\n * Create knot vector with given knot values and degree.\r\n * @param knotArray knot values\r\n * @param degree degree of polynomial\r\n * @param skipFirstAndLast true to skip class overclamped end knots.\r\n */\r\n public static create(knotArray: number[] | Float64Array, degree: number, skipFirstAndLast?: boolean): KnotVector {\r\n const numAllocate = skipFirstAndLast ? knotArray.length - 2 : knotArray.length;\r\n const knots = new KnotVector(numAllocate, degree);\r\n knots.setKnots(knotArray, skipFirstAndLast);\r\n return knots;\r\n }\r\n\r\n /**\r\n * Return the average of degree consecutive knots beginning at spanIndex.\r\n */\r\n public grevilleKnot(spanIndex: number): number {\r\n if (spanIndex < 0) return this.leftKnot;\r\n if (spanIndex > this.rightKnotIndex) return this.rightKnot;\r\n let sum = 0.0;\r\n for (let i = spanIndex; i < spanIndex + this.degree; i++)\r\n sum += this.knots[i];\r\n return sum / this.degree;\r\n }\r\n /** Return an array sized for a set of the basis function values. */\r\n public createBasisArray(): Float64Array { return new Float64Array(this.degree + 1); }\r\n /** Convert localFraction within the interval following an indexed knot to a knot value. */\r\n public baseKnotFractionToKnot(knotIndex0: number, localFraction: number): number {\r\n const knot0 = this.knots[knotIndex0];\r\n return knot0 + localFraction * (this.knots[knotIndex0 + 1] - knot0);\r\n }\r\n /** Convert localFraction within an indexed bezier span to a knot value. */\r\n public spanFractionToKnot(spanIndex: number, localFraction: number): number {\r\n const k = this.spanIndexToLeftKnotIndex(spanIndex);\r\n return this.knots[k] + localFraction * (this.knots[k + 1] - this.knots[k]);\r\n }\r\n /** Convert localFraction within an indexed bezier span to fraction of active knot range. */\r\n public spanFractionToFraction(spanIndex: number, localFraction: number): number {\r\n const knot = this.spanFractionToKnot(spanIndex, localFraction);\r\n return (knot - this.leftKnot) / (this.rightKnot - this.leftKnot);\r\n }\r\n /** Return fraction of active knot range to knot value. */\r\n public fractionToKnot(fraction: number): number {\r\n return Geometry.interpolate(this.knots[this.degree - 1], fraction, this.knots[this.knots.length - this.degree]);\r\n }\r\n /**\r\n * Evaluate basis functions f[] at knot value u.\r\n *\r\n * @param u knot value for evaluation\r\n * @param f array of basis values. ASSUMED PROPER LENGTH\r\n */\r\n public evaluateBasisFunctions(knotIndex0: number, u: number, f: Float64Array) {\r\n f[0] = 1.0;\r\n if (this.degree < 1) return;\r\n // direct compute for linear part ...\r\n const u0 = this.knots[knotIndex0];\r\n const u1 = this.knots[knotIndex0 + 1];\r\n f[1] = (u - u0) / (u1 - u0);\r\n f[0] = 1.0 - f[1];\r\n if (this.degree < 2) return;\r\n\r\n for (let depth = 1; depth < this.degree; depth++) {\r\n let kLeft = knotIndex0 - depth;\r\n let kRight = kLeft + depth + 1;\r\n let gCarry = 0.0;\r\n for (let step = 0; step <= depth; step++) {\r\n const tLeft = this.knots[kLeft++];\r\n const tRight = this.knots[kRight++];\r\n const fraction = (u - tLeft) / (tRight - tLeft);\r\n const g1 = f[step] * fraction;\r\n const g0 = f[step] * (1.0 - fraction);\r\n f[step] = gCarry + g0;\r\n gCarry = g1;\r\n }\r\n f[depth + 1] = gCarry;\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate basis fucntions f[] at knot value u.\r\n *\r\n * @param u knot value for evaluation\r\n * @param f array of basis values. ASSUMED PROPER LENGTH\r\n */\r\n public evaluateBasisFunctions1(knotIndex0: number, u: number, f: Float64Array, df: Float64Array, ddf?: Float64Array) {\r\n f[0] = 1.0; df[0] = 0.0;\r\n if (this.degree < 1) return;\r\n // direct compute for linear part ...\r\n const u0 = this.knots[knotIndex0];\r\n const u1 = this.knots[knotIndex0 + 1];\r\n // ah = 1/(u1-u0) is the derivative of fraction0\r\n // (-ah) is the derivative of fraction1.\r\n let ah = 1.0 / (u1 - u0);\r\n f[1] = (u - u0) * ah;\r\n f[0] = 1.0 - f[1];\r\n df[0] = -ah; df[1] = ah;\r\n if (ddf) { // first derivative started constant, second derivative started zero.\r\n ddf[0] = 0.0; ddf[1] = 0.0;\r\n }\r\n if (this.degree < 2) return;\r\n for (let depth = 1; depth < this.degree; depth++) {\r\n let kLeft = knotIndex0 - depth;\r\n let kRight = kLeft + depth + 1;\r\n let gCarry = 0.0;\r\n let dgCarry = 0.0;\r\n let ddgCarry = 0.0;\r\n // f, df, ddf, are each row vectors with product of `step` linear terms.\r\n // f is multiplied on the right by matrix V. Each row has 2 nonzero entries (which sum to 1) (0,0,1-fraction, fraction,0,0,0)\r\n // Each row of the derivative dV is two entries (0,0, -1/h, 1/h,0,0,0)\r\n // Hence fnew = f * V\r\n // dfnew = df * V + f * dV\r\n // ddfnew = ddf * V + df*dV + df * dV + f * ddV\r\n // but ddV is zero so\r\n // ddfnew = ddf * V + 2 * df * dV\r\n for (let step = 0; step <= depth; step++) {\r\n const tLeft = this.knots[kLeft++];\r\n const tRight = this.knots[kRight++];\r\n ah = 1.0 / (tRight - tLeft);\r\n const fraction = (u - tLeft) * ah;\r\n const fraction1 = 1.0 - fraction;\r\n const g1 = f[step] * fraction;\r\n const g0 = f[step] * fraction1;\r\n const dg1 = df[step] * fraction + f[step] * ah;\r\n const dg0 = df[step] * fraction1 - f[step] * ah;\r\n const dfSave = 2.0 * df[step] * ah;\r\n f[step] = gCarry + g0;\r\n df[step] = dgCarry + dg0;\r\n gCarry = g1;\r\n dgCarry = dg1;\r\n if (ddf) { // do the backward reference to df before rewriting df !!!\r\n const ddg1 = ddf[step] * fraction + dfSave;\r\n const ddg0 = ddf[step] * fraction1 - dfSave;\r\n ddf[step] = ddgCarry + ddg0;\r\n ddgCarry = ddg1;\r\n }\r\n }\r\n f[depth + 1] = gCarry;\r\n df[depth + 1] = dgCarry;\r\n if (ddf)\r\n ddf[depth + 1] = ddgCarry;\r\n }\r\n }\r\n /** Return the (highest) index of the knot less than or equal to u */\r\n public knotToLeftKnotIndex(u: number): number {\r\n // Anything to left is in the first span . .\r\n const firstLeftKnot = this.degree - 1;\r\n if (u < this.knots[firstLeftKnot + 1]) return firstLeftKnot;\r\n // Anything to right is in the last span ...\r\n const lastLeftKnot = this.knots.length - this.degree - 1;\r\n if (u >= this.knots.length - this.degree) return this.knots[lastLeftKnot];\r\n // ugh ... linear search ...\r\n for (let i = firstLeftKnot + 1; i < lastLeftKnot; i++)\r\n if (u < this.knots[i + 1]) return i; // testing against right side skips over multiple knot cases???\r\n return lastLeftKnot;\r\n }\r\n /**\r\n * Given a span index, return the index of the knot at its left.\r\n * @param spanIndex index of span\r\n */\r\n public spanIndexToLeftKnotIndex(spanIndex: number): number {\r\n const d = this.degree;\r\n if (spanIndex <= 0.0) return d - 1;\r\n return Math.min(spanIndex + d - 1, this.knots.length - d);\r\n }\r\n /** Return the knot interval length of indexed bezier span. */\r\n public spanIndexToSpanLength(spanIndex: number): number {\r\n const k = this.spanIndexToLeftKnotIndex(spanIndex);\r\n return this.knots[k + 1] - this.knots[k];\r\n }\r\n /**\r\n * Given a span index, test if it is within range and has nonzero length.\r\n * * note that a false return does not imply there are no more spans. This may be a double knot (zero length span) followed by more real spans\r\n * @param spanIndex index of span to test.\r\n */\r\n public isIndexOfRealSpan(spanIndex: number): boolean {\r\n if (spanIndex >= 0 && spanIndex < this.knots.length - this.degree)\r\n return !Geometry.isSmallMetricDistance(this.spanIndexToSpanLength(spanIndex));\r\n return false;\r\n }\r\n /** Reflect all knots so `leftKnot` and `rightKnot` are maintained but interval lengths reverse. */\r\n public reflectKnots() {\r\n const a = this.leftKnot;\r\n const b = this.rightKnot;\r\n const numKnots = this.knots.length;\r\n for (let i = 0; i < numKnots; i++)\r\n this.knots[i] = a + (b - this.knots[i]);\r\n this.knots.reverse();\r\n }\r\n /**\r\n * return a simple array form of the knots. optionally replicate the first and last\r\n * in classic over-clamped manner\r\n */\r\n public copyKnots(includeExtraEndKnot: boolean): number[] {\r\n const wrap = this.wrappable === BSplineWrapMode.OpenByAddingControlPoints && this.testClosable();\r\n const leftIndex = this.leftKnotIndex;\r\n const rightIndex = this.rightKnotIndex;\r\n const a0 = this.leftKnot;\r\n const a1 = this.rightKnot;\r\n const delta = a1 - a0;\r\n const degree = this.degree;\r\n const values: number[] = [];\r\n if (includeExtraEndKnot) {\r\n if (wrap) {\r\n values.push(this.knots[rightIndex - degree] - delta);\r\n } else {\r\n values.push(this.knots[0]);\r\n }\r\n }\r\n for (const u of this.knots) values.push(u);\r\n if (includeExtraEndKnot) {\r\n if (wrap) {\r\n values.push(this.knots[leftIndex + degree] + delta);\r\n } else\r\n values.push(values[values.length - 1]);\r\n }\r\n return values;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"KnotVector.js","sourceRoot":"","sources":["../../../src/bspline/KnotVector.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\n// import { Point2d } from \"../Geometry2d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty, no-console*/\r\nimport { Geometry } from \"../Geometry\";\r\nimport { NumberArray } from \"../geometry3d/PointHelpers\";\r\n\r\n/**\r\n * Enumeration of the possible ways of converting a \"periodic\" knot vector to an open knot vector.\r\n * None (0) ==> no wrap possible\r\n * OpenByAddingControlPoints (1) ==> wrapped by adding poles\r\n * OpenByRemovingKnots (2) ==> wrapped by deleting extreme knots.\r\n * @public\r\n */\r\nexport enum BSplineWrapMode {\r\n /** No conversion to periodic */\r\n None = 0,\r\n /** Convert to periodic by removing control points. This is typical for closed bcurve constructed by control points with maximum continuity.\r\n * * Knots stay the same in open and periodic form.\r\n * * Periodic form omits {degree} control points.\r\n */\r\n OpenByAddingControlPoints = 1,\r\n /** Convert to periodic by adding special knots. This is typical of closed bcurve constructed as exact circular or elliptic arc\r\n * * 2 knots on each end are omitted in open form\r\n * * poles stay the same.\r\n */\r\n OpenByRemovingKnots = 2,\r\n}\r\n/**\r\n * Array of non-decreasing numbers acting as a knot array for bsplines.\r\n *\r\n * * Essential identity: numKnots = numPoles + order = numPoles + degree - 1\r\n * * Various bspline libraries have confusion over how many \"end knots\" are needed. \"Many\" libraries (including MicroStation)\r\n * incorrectly demand \"order\" knots at each end for clamping. But only \"order - 1\" are really needed.\r\n * * This class uses the \"order-1\" convention.\r\n * * This class provides queries to convert among spanIndex and knotIndex\r\n * * A span is a single interval of the knots.\r\n * * The left knot of span {k} is knot {k+degree-1}\r\n * * This class provides queries to convert among spanFraction, fraction of knot range, and knot\r\n * * core computations (evaluateBasisFunctions) have leftKnotIndex and global knot value as inputs. Caller's need to\r\n * know their primary values (global knot, spanFraction).\r\n * @public\r\n */\r\nexport class KnotVector {\r\n /** The simple array of knot values. */\r\n public knots: Float64Array;\r\n /** Return the degree of basis functions defined in these knots. */\r\n public degree: number;\r\n private _knot0: number;\r\n private _knot1: number;\r\n\r\n private _wrapMode?: BSplineWrapMode;\r\n /** tolerance for considering two knots to be the same. */\r\n public static readonly knotTolerance = 1.0e-9;\r\n /** Return the leftmost knot value (of the active interval, ignoring unclamped leading knots)*/\r\n public get leftKnot() { return this._knot0; }\r\n /** Return the rightmost knot value (of the active interval, ignoring unclamped leading knots)*/\r\n public get rightKnot() { return this._knot1; }\r\n /** Return the index of the leftmost knot of the active interval */\r\n public get leftKnotIndex() { return this.degree - 1; }\r\n /** Return the index of the rightmost knot of the active interval */\r\n public get rightKnotIndex() { return this.knots.length - this.degree; }\r\n /** Whether the bspline was created by adding poles into \"closed\" structure. This is used by serialize/deserialize to mark knotVector's that were converted from periodic style. */\r\n public get wrappable() { return this._wrapMode === undefined ? BSplineWrapMode.None : this._wrapMode; }\r\n public set wrappable(value: BSplineWrapMode) { this._wrapMode = value; }\r\n /** Return the number of bezier spans. Note that this includes zero-length spans if there are repeated knots. */\r\n public get numSpans() { return this.rightKnotIndex - this.leftKnotIndex; }\r\n /**\r\n *\r\n * * If knots is a number array or Float64Array, the those values become the local knot array.\r\n * * If knots is a simple number, the local knot array is allocated to that size but left as zeros.\r\n * @param knots\r\n * @param degree\r\n */\r\n private constructor(knots: number[] | Float64Array | number, degree: number, wrapMode?: BSplineWrapMode) {\r\n this.degree = degree;\r\n this._wrapMode = wrapMode;\r\n // default values to satisfy compiler -- real values hapn setupFixedValues or final else defers to user\r\n this._knot0 = 0.0;\r\n this._knot1 = 1.0;\r\n // satisfy the initialize checker ..\r\n if (Array.isArray(knots)) { // remark: This ctor is private. The callers (as of April 2019) do not use this path.\r\n this.knots = new Float64Array(knots.length);\r\n this.setKnots(knots);\r\n this.setupFixedValues();\r\n } else if (knots instanceof Float64Array) {\r\n this.knots = knots.slice();\r\n this.setupFixedValues();\r\n } else { // caller is responsible for filling array separately ...\r\n this.knots = new Float64Array(knots);\r\n }\r\n }\r\n /** copy degree and knots to a new KnotVector. */\r\n public clone(): KnotVector { return new KnotVector(this.knots, this.degree, this.wrappable); }\r\n private setupFixedValues() {\r\n // These should be read-only . ..\r\n this._knot0 = this.knots[this.degree - 1];\r\n this._knot1 = this.knots[this.knots.length - this.degree];\r\n }\r\n /** Return the total knot distance from beginning to end. */\r\n public get knotLength01(): number { return this._knot1 - this._knot0; }\r\n /**\r\n * Returns true if all numeric values have wraparound conditions for \"closed\" knotVector with specified wrap mode\r\n * @param mode optional test mode. If undefined, use the this.wrappable.\r\n */\r\n public testClosable(mode?: BSplineWrapMode): boolean {\r\n if (mode === undefined)\r\n mode = this.wrappable;\r\n const leftKnotIndex = this.leftKnotIndex;\r\n const rightKnotIndex = this.rightKnotIndex;\r\n const period = this.rightKnot - this.leftKnot;\r\n const degree = this.degree;\r\n const indexDelta = rightKnotIndex - leftKnotIndex;\r\n // maximum continuity mode . . .\r\n if (mode === BSplineWrapMode.OpenByAddingControlPoints) {\r\n for (let k0 = leftKnotIndex - degree + 1; k0 < leftKnotIndex + degree - 1; k0++) {\r\n const k1 = k0 + indexDelta;\r\n if (!Geometry.isSameCoordinate(this.knots[k0] + period, this.knots[k1]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n // arc mode ...\r\n if (mode === BSplineWrapMode.OpenByRemovingKnots) {\r\n // we expect {degree} replicated knots at each end . . .\r\n const numRepeated = degree - 1;\r\n const leftKnot = this.knots[leftKnotIndex];\r\n const rightKnot = this.knots[rightKnotIndex];\r\n for (let i = 0; i < numRepeated; i++) {\r\n if (!Geometry.isSameCoordinate(leftKnot, this.knots[leftKnotIndex - i - 1]))\r\n return false;\r\n if (!Geometry.isSameCoordinate(rightKnot, this.knots[rightKnotIndex + i + 1]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n /** Test matching degree and knot values */\r\n public isAlmostEqual(other: KnotVector): boolean {\r\n if (this.degree !== other.degree) return false;\r\n return NumberArray.isAlmostEqual(this.knots, other.knots, KnotVector.knotTolerance);\r\n }\r\n /** install knot values from an array, optionally ignoring first and last.\r\n */\r\n public setKnots(knots: number[] | Float64Array, skipFirstAndLast?: boolean) {\r\n const numAllocate = skipFirstAndLast ? knots.length - 2 : knots.length;\r\n if (numAllocate !== this.knots.length)\r\n this.knots = new Float64Array(numAllocate);\r\n if (skipFirstAndLast) {\r\n for (let i = 1; i + 1 < knots.length; i++)\r\n this.knots[i - 1] = knots[i];\r\n\r\n } else {\r\n for (let i = 0; i < knots.length; i++)\r\n this.knots[i] = knots[i];\r\n }\r\n this.setupFixedValues();\r\n }\r\n /**\r\n * Create knot vector with {degree-1} replicated knots at start and end, and uniform knots between.\r\n * @param numPoles Number of poles\r\n * @param degree degree of polynomial\r\n * @param a0 left knot value for active interval\r\n * @param a1 right knot value for active interval\r\n */\r\n public static createUniformClamped(numPoles: number, degree: number, a0: number, a1: number): KnotVector {\r\n const knots = new KnotVector(numPoles + degree - 1, degree);\r\n let k = 0;\r\n for (let m = 0; m < degree; m++)knots.knots[k++] = a0;\r\n const du = 1.0 / (numPoles - degree);\r\n for (let i = 1; i + degree < numPoles; i++)\r\n knots.knots[k++] = a0 + i * du * (a1 - a0);\r\n for (let m = 0; m < degree; m++)knots.knots[k++] = a1;\r\n knots.setupFixedValues();\r\n return knots;\r\n }\r\n /**\r\n * Create knot vector with wraparound knots at start and end, and uniform knots between.\r\n * @param numInterval number of intervals in knot space. (NOT POLE COUNT)\r\n * @param degree degree of polynomial\r\n * @param a0 left knot value for active interval\r\n * @param a1 right knot value for active interval\r\n */\r\n public static createUniformWrapped(numInterval: number, degree: number, a0: number, a1: number): KnotVector {\r\n const knots = new KnotVector(numInterval + 2 * degree - 1, degree);\r\n const du = 1.0 / numInterval;\r\n for (let i = 1 - degree, k = 0; i < numInterval + degree; i++, k++) {\r\n knots.knots[k] = Geometry.interpolate(a0, i * du, a1);\r\n }\r\n knots.setupFixedValues();\r\n return knots;\r\n }\r\n\r\n /**\r\n * Create knot vector with given knot values and degree.\r\n * @param knotArray knot values\r\n * @param degree degree of polynomial\r\n * @param skipFirstAndLast true to skip class overclamped end knots.\r\n */\r\n public static create(knotArray: number[] | Float64Array, degree: number, skipFirstAndLast?: boolean): KnotVector {\r\n const numAllocate = skipFirstAndLast ? knotArray.length - 2 : knotArray.length;\r\n const knots = new KnotVector(numAllocate, degree);\r\n knots.setKnots(knotArray, skipFirstAndLast);\r\n return knots;\r\n }\r\n\r\n /**\r\n * Return the average of degree consecutive knots beginning at spanIndex.\r\n */\r\n public grevilleKnot(spanIndex: number): number {\r\n if (spanIndex < 0) return this.leftKnot;\r\n if (spanIndex > this.rightKnotIndex) return this.rightKnot;\r\n let sum = 0.0;\r\n for (let i = spanIndex; i < spanIndex + this.degree; i++)\r\n sum += this.knots[i];\r\n return sum / this.degree;\r\n }\r\n /** Return an array sized for a set of the basis function values. */\r\n public createBasisArray(): Float64Array { return new Float64Array(this.degree + 1); }\r\n /** Convert localFraction within the interval following an indexed knot to a knot value. */\r\n public baseKnotFractionToKnot(knotIndex0: number, localFraction: number): number {\r\n const knot0 = this.knots[knotIndex0];\r\n return knot0 + localFraction * (this.knots[knotIndex0 + 1] - knot0);\r\n }\r\n /** Convert localFraction within an indexed bezier span to a knot value. */\r\n public spanFractionToKnot(spanIndex: number, localFraction: number): number {\r\n const k = this.spanIndexToLeftKnotIndex(spanIndex);\r\n return this.knots[k] + localFraction * (this.knots[k + 1] - this.knots[k]);\r\n }\r\n /** Convert localFraction within an indexed bezier span to fraction of active knot range. */\r\n public spanFractionToFraction(spanIndex: number, localFraction: number): number {\r\n const knot = this.spanFractionToKnot(spanIndex, localFraction);\r\n return (knot - this.leftKnot) / (this.rightKnot - this.leftKnot);\r\n }\r\n /** Return fraction of active knot range to knot value. */\r\n public fractionToKnot(fraction: number): number {\r\n return Geometry.interpolate(this.knots[this.degree - 1], fraction, this.knots[this.knots.length - this.degree]);\r\n }\r\n /**\r\n * Evaluate basis functions f[] at knot value u.\r\n *\r\n * @param u knot value for evaluation\r\n * @param f array of basis values. ASSUMED PROPER LENGTH\r\n */\r\n public evaluateBasisFunctions(knotIndex0: number, u: number, f: Float64Array) {\r\n f[0] = 1.0;\r\n if (this.degree < 1) return;\r\n // direct compute for linear part ...\r\n const u0 = this.knots[knotIndex0];\r\n const u1 = this.knots[knotIndex0 + 1];\r\n f[1] = (u - u0) / (u1 - u0);\r\n f[0] = 1.0 - f[1];\r\n if (this.degree < 2) return;\r\n\r\n for (let depth = 1; depth < this.degree; depth++) {\r\n let kLeft = knotIndex0 - depth;\r\n let kRight = kLeft + depth + 1;\r\n let gCarry = 0.0;\r\n for (let step = 0; step <= depth; step++) {\r\n const tLeft = this.knots[kLeft++];\r\n const tRight = this.knots[kRight++];\r\n const fraction = (u - tLeft) / (tRight - tLeft);\r\n const g1 = f[step] * fraction;\r\n const g0 = f[step] * (1.0 - fraction);\r\n f[step] = gCarry + g0;\r\n gCarry = g1;\r\n }\r\n f[depth + 1] = gCarry;\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate basis fucntions f[] at knot value u.\r\n *\r\n * @param u knot value for evaluation\r\n * @param f array of basis values. ASSUMED PROPER LENGTH\r\n */\r\n public evaluateBasisFunctions1(knotIndex0: number, u: number, f: Float64Array, df: Float64Array, ddf?: Float64Array) {\r\n f[0] = 1.0; df[0] = 0.0;\r\n if (this.degree < 1) return;\r\n // direct compute for linear part ...\r\n const u0 = this.knots[knotIndex0];\r\n const u1 = this.knots[knotIndex0 + 1];\r\n // ah = 1/(u1-u0) is the derivative of fraction0\r\n // (-ah) is the derivative of fraction1.\r\n let ah = 1.0 / (u1 - u0);\r\n f[1] = (u - u0) * ah;\r\n f[0] = 1.0 - f[1];\r\n df[0] = -ah; df[1] = ah;\r\n if (ddf) { // first derivative started constant, second derivative started zero.\r\n ddf[0] = 0.0; ddf[1] = 0.0;\r\n }\r\n if (this.degree < 2) return;\r\n for (let depth = 1; depth < this.degree; depth++) {\r\n let kLeft = knotIndex0 - depth;\r\n let kRight = kLeft + depth + 1;\r\n let gCarry = 0.0;\r\n let dgCarry = 0.0;\r\n let ddgCarry = 0.0;\r\n // f, df, ddf, are each row vectors with product of `step` linear terms.\r\n // f is multiplied on the right by matrix V. Each row has 2 nonzero entries (which sum to 1) (0,0,1-fraction, fraction,0,0,0)\r\n // Each row of the derivative dV is two entries (0,0, -1/h, 1/h,0,0,0)\r\n // Hence fnew = f * V\r\n // dfnew = df * V + f * dV\r\n // ddfnew = ddf * V + df*dV + df * dV + f * ddV\r\n // but ddV is zero so\r\n // ddfnew = ddf * V + 2 * df * dV\r\n for (let step = 0; step <= depth; step++) {\r\n const tLeft = this.knots[kLeft++];\r\n const tRight = this.knots[kRight++];\r\n ah = 1.0 / (tRight - tLeft);\r\n const fraction = (u - tLeft) * ah;\r\n const fraction1 = 1.0 - fraction;\r\n const g1 = f[step] * fraction;\r\n const g0 = f[step] * fraction1;\r\n const dg1 = df[step] * fraction + f[step] * ah;\r\n const dg0 = df[step] * fraction1 - f[step] * ah;\r\n const dfSave = 2.0 * df[step] * ah;\r\n f[step] = gCarry + g0;\r\n df[step] = dgCarry + dg0;\r\n gCarry = g1;\r\n dgCarry = dg1;\r\n if (ddf) { // do the backward reference to df before rewriting df !!!\r\n const ddg1 = ddf[step] * fraction + dfSave;\r\n const ddg0 = ddf[step] * fraction1 - dfSave;\r\n ddf[step] = ddgCarry + ddg0;\r\n ddgCarry = ddg1;\r\n }\r\n }\r\n f[depth + 1] = gCarry;\r\n df[depth + 1] = dgCarry;\r\n if (ddf)\r\n ddf[depth + 1] = ddgCarry;\r\n }\r\n }\r\n /** Return the (highest) index of the knot less than or equal to u */\r\n public knotToLeftKnotIndex(u: number): number {\r\n // Anything to left is in the first span . .\r\n const firstLeftKnot = this.degree - 1;\r\n if (u < this.knots[firstLeftKnot + 1]) return firstLeftKnot;\r\n // Anything to right is in the last span ...\r\n const lastLeftKnot = this.knots.length - this.degree - 1;\r\n if (u >= this.knots.length - this.degree) return this.knots[lastLeftKnot];\r\n // ugh ... linear search ...\r\n for (let i = firstLeftKnot + 1; i < lastLeftKnot; i++)\r\n if (u < this.knots[i + 1]) return i; // testing against right side skips over multiple knot cases???\r\n return lastLeftKnot;\r\n }\r\n /**\r\n * Given a span index, return the index of the knot at its left.\r\n * @param spanIndex index of span\r\n */\r\n public spanIndexToLeftKnotIndex(spanIndex: number): number {\r\n const d = this.degree;\r\n if (spanIndex <= 0.0) return d - 1;\r\n return Math.min(spanIndex + d - 1, this.knots.length - d);\r\n }\r\n /** Return the knot interval length of indexed bezier span. */\r\n public spanIndexToSpanLength(spanIndex: number): number {\r\n const k = this.spanIndexToLeftKnotIndex(spanIndex);\r\n return this.knots[k + 1] - this.knots[k];\r\n }\r\n /**\r\n * Given a span index, test if it is within range and has nonzero length.\r\n * * note that a false return does not imply there are no more spans. This may be a double knot (zero length span) followed by more real spans\r\n * @param spanIndex index of span to test.\r\n */\r\n public isIndexOfRealSpan(spanIndex: number): boolean {\r\n if (spanIndex >= 0 && spanIndex < this.knots.length - this.degree)\r\n return !Geometry.isSmallMetricDistance(this.spanIndexToSpanLength(spanIndex));\r\n return false;\r\n }\r\n /** Reflect all knots so `leftKnot` and `rightKnot` are maintained but interval lengths reverse. */\r\n public reflectKnots() {\r\n const a = this.leftKnot;\r\n const b = this.rightKnot;\r\n const numKnots = this.knots.length;\r\n for (let i = 0; i < numKnots; i++)\r\n this.knots[i] = a + (b - this.knots[i]);\r\n this.knots.reverse();\r\n }\r\n /**\r\n * return a simple array form of the knots. optionally replicate the first and last\r\n * in classic over-clamped manner\r\n */\r\n public copyKnots(includeExtraEndKnot: boolean): number[] {\r\n const wrap = this.wrappable === BSplineWrapMode.OpenByAddingControlPoints && this.testClosable();\r\n const leftIndex = this.leftKnotIndex;\r\n const rightIndex = this.rightKnotIndex;\r\n const a0 = this.leftKnot;\r\n const a1 = this.rightKnot;\r\n const delta = a1 - a0;\r\n const degree = this.degree;\r\n const values: number[] = [];\r\n if (includeExtraEndKnot) {\r\n if (wrap) {\r\n values.push(this.knots[rightIndex - degree] - delta);\r\n } else {\r\n values.push(this.knots[0]);\r\n }\r\n }\r\n for (const u of this.knots) values.push(u);\r\n if (includeExtraEndKnot) {\r\n if (wrap) {\r\n values.push(this.knots[leftIndex + degree] + delta);\r\n } else\r\n values.push(values[values.length - 1]);\r\n }\r\n return values;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAa,eAAe,EAAY,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,6BAA6B;IAOrC,kDAAkD;IAC3C,KAAK;;IAEZ;;;;OAIG;IACI,iBAAiB,CAAC,eAAe,GAAE,OAAe,GAAG,SAAS,GAAG,SAAS;IAuBjF,kGAAkG;IAC3F,oBAAoB,CAAC,MAAM,CAAC,EAAE,QAAQ;IAK7C,8DAA8D;IAC9D,IAAW,SAAS,IAAI,OAAO,CAAuC;IACtE;OACG;IACI,gBAAgB,IAAI,MAAM;IASjC,8HAA8H;IACvH,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAU5C,6BAA6B;IACtB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM;IA0B/C;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,GAAG;IA4DzB;;;;;OAKG;WACW,sBAAsB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAgCpH;;;;OAIG;WACW,6BAA6B,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAWpF;;;;;;OAMG;WACW,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IAalF;;;;;;OAMG;WACW,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IASjF;;;;;;;;OAQG;WACW,kCAAkC,CAC9C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,eAA4D,EACzE,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,iBAAiB,GAAE,MAAY,GAAG,SAAS;CAgB9C"}
1
+ {"version":3,"file":"FrameBuilder.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAa,eAAe,EAAY,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,6BAA6B;IAOrC,kDAAkD;IAC3C,KAAK;;IAEZ;;;;OAIG;IACI,iBAAiB,CAAC,eAAe,GAAE,OAAe,GAAG,SAAS,GAAG,SAAS;IAuBjF,kGAAkG;IAC3F,oBAAoB,CAAC,MAAM,CAAC,EAAE,QAAQ;IAK7C,8DAA8D;IAC9D,IAAW,SAAS,IAAI,OAAO,CAAuC;IACtE;OACG;IACI,gBAAgB,IAAI,MAAM;IASjC,8HAA8H;IACvH,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAU5C,6BAA6B;IACtB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM;IA0B/C;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,GAAG;IAkEzB;;;;;OAKG;WACW,sBAAsB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAgCpH;;;;OAIG;WACW,6BAA6B,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS;IAWpF;;;;;;OAMG;WACW,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IAalF;;;;;;OAMG;WACW,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,SAAS;IASjF;;;;;;;;OAQG;WACW,kCAAkC,CAC9C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,eAA4D,EACzE,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,SAAS,GAAE,MAAU,EACrB,iBAAiB,GAAE,MAAY,GAAG,SAAS;CAgB9C"}
@@ -182,7 +182,7 @@ export class FrameBuilder {
182
182
  else if (data instanceof InterpolationCurve3d) {
183
183
  const point = Point3d.create();
184
184
  for (let i = 0; this.savedVectorCount() < 2; i++) {
185
- if (i < data.options.fitPoints.length - 1) {
185
+ if (i < data.options.fitPoints.length) {
186
186
  point.setFrom(data.options.fitPoints[i]);
187
187
  this.announcePoint(point);
188
188
  }
@@ -190,7 +190,14 @@ export class FrameBuilder {
190
190
  break;
191
191
  }
192
192
  }
193
- // TODO: unknown curve type. Stroke? FrenetFrame?
193
+ else { // unimplemented CurvePrimitive type
194
+ const frame = data.fractionToFrenetFrame(0.0);
195
+ if (undefined !== frame) {
196
+ this.announcePoint(frame.getOrigin());
197
+ this.announceVector(frame.matrix.getColumn(0));
198
+ this.announceVector(frame.matrix.getColumn(1));
199
+ }
200
+ }
194
201
  }
195
202
  else if (data instanceof CurveCollection) {
196
203
  if (data.children)
@@ -1 +1 @@
1
- {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * After each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * to build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** clear all accumulated point and vector data */\r\n public clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }\r\n constructor() { this.clear(); }\r\n /** Try to assemble the data into a non-singular transform.\r\n *\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n if (!allowLeftHanded) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean { return this._origin !== undefined; }\r\n /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n\r\n if (!this._vector0) { this._vector0 = vector.clone(this._vector0); return 1; }\r\n\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes\r\n * sufficient for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1) return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length-1) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n }\r\n // TODO: unknown curve type. Stroke? FrenetFrame?\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n }\r\n }\r\n /** create a localToWorld frame for the given data.\r\n *\r\n * * origin is at first point\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n const result = builder.getValidatedFrame(false);\r\n if (result !== undefined) {\r\n if (defaultUpVector) {\r\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n result.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return result;\r\n }\r\n }\r\n // try direct evaluation of curve primitives?\r\n for (const data of params) {\r\n if (data instanceof CurveCollection) {\r\n const children = data.children;\r\n if (children) {\r\n for (const curve of children) {\r\n if (curve instanceof CurvePrimitive) {\r\n const frenetFrame = curve.fractionToFrenetFrame(0.0);\r\n if (frenetFrame)\r\n return frenetFrame;\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n return undefined;\r\n }\r\n /** create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n const localToWorld = builder.getValidatedFrame(false);\r\n if (localToWorld !== undefined)\r\n return localToWorld;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * try to create a frame whose xy plane is through points.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0].clone();\r\n const vector01 = Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createRefs(origin, matrix);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points);\r\n if (ray) {\r\n return ray.toRigidZFrame();\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range [in] range to inspect\r\n * @param fractionX [in] fractional coordinate of frame origin x\r\n * @param fractionY [in] fractional coordinate of frame origin y\r\n * @param fractionZ [in] fractional coordinate of frame origin z\r\n * @param scaleSelect [in] selects size of localToWorld axes.\r\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity();\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,mEAAmE;AACnE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,YAAY;IAevB,gBAAgB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAV/B,uEAAuE;IAC/D,6BAA6B,CAAC,OAAiB,EAAE,OAAiB,EAAE,mBAA2B,QAAQ,CAAC,iBAAiB;QAC/H,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;YAClD,MAAM,CAAC,GAAG,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,gBAAgB,CAAC;SAC7B;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,kDAAkD;IAC3C,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;IAE7H;;;;OAIG;IACI,iBAAiB,CAAC,kBAA2B,KAAK;QACvD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClD,IAAI,CAAC,eAAe,EAAE;gBACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5F,IAAI,MAAM;oBACR,OAAO,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/D,gFAAgF;gBAChF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;aAC3C;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5F,IAAI,MAAM,EAAE;oBACV,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAC/D,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;oBACtC,OAAO,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;iBAC9D;gBACD,sFAAsF;gBACtF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;aAC9B;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,kGAAkG;IAC3F,oBAAoB,CAAC,MAAiB;QAC3C,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACpF,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACpD;IACH,CAAC;IACD,8DAA8D;IAC9D,IAAW,SAAS,KAAc,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC;IACtE;OACG;IACI,gBAAgB;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,OAAO,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,OAAO,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ;YAChB,OAAO,CAAC,CAAC;QACX,OAAO,CAAC,CAAC;IACX,CAAC;IACD,8HAA8H;IACvH,aAAa,CAAC,KAAc;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAChC;QACD,iDAAiD;QACjD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC;YACnC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,6BAA6B;IACtB,cAAc,CAAC,MAAgB;QACpC,IAAI,MAAM,CAAC,YAAY;YACrB,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;SAAE;QAE9E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACrE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5C,OAAO,CAAC,CAAC;aACV;YACD,OAAO,CAAC,CAAC;SACV;QAED,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxE,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE;gBAC5F,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5C,OAAO,CAAC,CAAC;aACV;YACD,OAAO,CAAC,CAAC;SACV;QACD,0EAA0E;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;OAEG;IACI,QAAQ,CAAC,IAAS;QACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;YAAE,OAAO;QACxC,IAAI,IAAI,YAAY,OAAO;YACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aACtB,IAAI,IAAI,YAAY,QAAQ;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;gBACxB,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;oBAC7B,MAAM;gBACR,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACtB;SACF;aAAM,IAAI,IAAI,YAAY,cAAc,EAAE;YACzC,IAAI,IAAI,YAAY,aAAa,EAAE;gBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aACrC;iBAAM,IAAI,IAAI,YAAY,KAAK,EAAE;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBACnD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;aACvE;iBAAM,IAAI,IAAI,YAAY,YAAY,EAAE;gBACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;oBAC/B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;wBAC7B,MAAM;iBACT;aACF;iBAAM,IAAI,IAAI,YAAY,cAAc,EAAE;gBACzC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAChD,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,OAAO;wBAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;;wBACvB,MAAM;iBACZ;aACF;iBAAM,IAAI,IAAI,YAAY,oBAAoB,EAAE;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAChD,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE;wBACrC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;wBACzC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;qBAC3B;;wBAAM,MAAM;iBACd;aACF;iBAAM,EAAE,oCAAoC;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,SAAS,KAAK,KAAK,EAAE;oBACvB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;SACF;aAAM,IAAI,IAAI,YAAY,eAAe,EAAE;YAC1C,IAAI,IAAI,CAAC,QAAQ;gBACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACrB,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;wBAC7B,MAAM;iBACT;SACJ;aAAM,IAAI,IAAI,YAAY,gBAAgB,EAAE;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChD,IAAI,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,OAAO;oBACjE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;;oBACvB,MAAM;aACZ;SACF;IACH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CAAC,eAAqC,EAAE,GAAG,MAAa;QAC1F,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACxB,IAAI,eAAe,EAAE;oBACnB,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,GAAG;wBACjD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;iBAChD;gBACD,OAAO,MAAM,CAAC;aACf;SACF;QACD,6CAA6C;QAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;YACzB,IAAI,IAAI,YAAY,eAAe,EAAE;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC/B,IAAI,QAAQ,EAAE;oBACZ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;wBAC5B,IAAI,KAAK,YAAY,cAAc,EAAE;4BACnC,MAAM,WAAW,GAAG,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;4BACrD,IAAI,WAAW;gCACb,OAAO,WAAW,CAAC;yBACtB;qBACF;iBACF;aACF;SAEF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,6BAA6B,CAAC,GAAG,MAAa;QAC1D,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;YACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,YAAY,KAAK,SAAS;gBAC5B,OAAO,YAAY,CAAC;SACvB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,0BAA0B,CAAC,MAAiB;QACxD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,YAAY,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,YAAY,CAAC,wCAAwC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1F,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YAClF,IAAI,MAAM;gBACR,OAAO,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC/C;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,yBAAyB,CAAC,MAAiB;QACvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,GAAG,EAAE;gBACP,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;aAC5B;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,kCAAkC,CAC9C,KAAc,EACd,cAA+B,eAAe,CAAC,0BAA0B,EACzE,YAAoB,CAAC,EACrB,YAAoB,CAAC,EACrB,YAAoB,CAAC,EACrB,oBAA4B,GAAG;QAC/B,IAAI,KAAK,CAAC,MAAM;YACd,OAAO,SAAS,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,IAAI,WAAW,KAAK,eAAe,CAAC,qBAAqB,EAAE;YACzD,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,iBAAiB,CAAC,CAAC;SACvF;aAAM,IAAI,WAAW,KAAK,eAAe,CAAC,0BAA0B,EAAE;YACrE,CAAC,GAAG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnH,CAAC,GAAG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnH,CAAC,GAAG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACpH;QACD,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrH,CAAC;CAEF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * After each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * to build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** clear all accumulated point and vector data */\r\n public clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }\r\n constructor() { this.clear(); }\r\n /** Try to assemble the data into a non-singular transform.\r\n *\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n if (!allowLeftHanded) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean { return this._origin !== undefined; }\r\n /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n\r\n if (!this._vector0) { this._vector0 = vector.clone(this._vector0); return 1; }\r\n\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes\r\n * sufficient for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1) return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n } else { // unimplemented CurvePrimitive type\r\n const frame = data.fractionToFrenetFrame(0.0);\r\n if (undefined !== frame) {\r\n this.announcePoint(frame.getOrigin());\r\n this.announceVector(frame.matrix.getColumn(0));\r\n this.announceVector(frame.matrix.getColumn(1));\r\n }\r\n }\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n }\r\n }\r\n /** create a localToWorld frame for the given data.\r\n *\r\n * * origin is at first point\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n const result = builder.getValidatedFrame(false);\r\n if (result !== undefined) {\r\n if (defaultUpVector) {\r\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n result.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return result;\r\n }\r\n }\r\n // try direct evaluation of curve primitives?\r\n for (const data of params) {\r\n if (data instanceof CurveCollection) {\r\n const children = data.children;\r\n if (children) {\r\n for (const curve of children) {\r\n if (curve instanceof CurvePrimitive) {\r\n const frenetFrame = curve.fractionToFrenetFrame(0.0);\r\n if (frenetFrame)\r\n return frenetFrame;\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n return undefined;\r\n }\r\n /** create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n const localToWorld = builder.getValidatedFrame(false);\r\n if (localToWorld !== undefined)\r\n return localToWorld;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * try to create a frame whose xy plane is through points.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0].clone();\r\n const vector01 = Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createRefs(origin, matrix);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n *\r\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\r\n * point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points);\r\n if (ray) {\r\n return ray.toRigidZFrame();\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range [in] range to inspect\r\n * @param fractionX [in] fractional coordinate of frame origin x\r\n * @param fractionY [in] fractional coordinate of frame origin y\r\n * @param fractionZ [in] fractional coordinate of frame origin z\r\n * @param scaleSelect [in] selects size of localToWorld axes.\r\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity();\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\r\n }\r\n\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-geometry",
3
- "version": "3.0.0-dev.143",
3
+ "version": "3.0.0-dev.147",
4
4
  "description": "iTwin.js Core Geometry library",
5
5
  "main": "lib/cjs/core-geometry.js",
6
6
  "module": "lib/esm/core-geometry.js",
@@ -21,8 +21,8 @@
21
21
  "url": "http://www.bentley.com"
22
22
  },
23
23
  "devDependencies": {
24
- "@itwin/build-tools": "3.0.0-dev.143",
25
- "@itwin/eslint-plugin": "3.0.0-dev.143",
24
+ "@itwin/build-tools": "3.0.0-dev.147",
25
+ "@itwin/eslint-plugin": "3.0.0-dev.147",
26
26
  "@types/chai": "^4.1.4",
27
27
  "@types/flatbuffers": "~1.10.0",
28
28
  "@types/mocha": "^8.2.2",
@@ -37,7 +37,7 @@
37
37
  "typescript": "~4.4.0"
38
38
  },
39
39
  "dependencies": {
40
- "@itwin/core-bentley": "3.0.0-dev.143",
40
+ "@itwin/core-bentley": "3.0.0-dev.147",
41
41
  "flatbuffers": "~1.12.0"
42
42
  },
43
43
  "nyc": {