@itwin/core-geometry 3.1.0-dev.6 → 3.2.0-dev.0
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.
- package/CHANGELOG.md +43 -3
- package/lib/cjs/bspline/BSplineCurve.d.ts +8 -0
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +14 -0
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts +8 -0
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +16 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +6 -0
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +31 -0
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +8 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +22 -2
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.js +3 -1
- package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +7 -3
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +30 -15
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +23 -9
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +18 -0
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.d.ts +6 -0
- package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js +14 -0
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +7 -0
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +20 -0
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.d.ts +6 -2
- package/lib/cjs/curve/ProxyCurve.d.ts.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js +5 -0
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +11 -0
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +26 -17
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +15 -16
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +14 -16
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +3 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +6 -0
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +20 -0
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts +36 -0
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -0
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js +73 -0
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -0
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +48 -24
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +113 -112
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +33 -7
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +8 -0
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +14 -0
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/cjs/geometry3d/Matrix3d.js +4 -4
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js +21 -8
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +2 -2
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +15 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +17 -11
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +22 -3
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +97 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +8 -0
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +14 -0
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts +8 -0
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +16 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +6 -0
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +31 -0
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +8 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +22 -2
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurveIntersectXY.js +3 -1
- package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +7 -3
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +30 -15
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +23 -9
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +18 -0
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.d.ts +6 -0
- package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/esm/curve/LineSegment3d.js +15 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +7 -0
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +20 -0
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.d.ts +6 -2
- package/lib/esm/curve/ProxyCurve.d.ts.map +1 -1
- package/lib/esm/curve/ProxyCurve.js +5 -0
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +11 -0
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +26 -17
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +15 -16
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +15 -17
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +3 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +6 -0
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +20 -0
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts +36 -0
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.d.ts.map +1 -0
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js +69 -0
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -0
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +48 -24
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +111 -111
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +33 -7
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +8 -0
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +14 -0
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +4 -4
- package/lib/esm/geometry3d/Matrix3d.js +4 -4
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js +21 -8
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +2 -2
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +15 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +17 -11
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +22 -3
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +95 -0
- package/lib/esm/topology/Merging.js.map +1 -1
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.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 Numerics\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\n\r\n/**\r\n * Blocked array with operations to sort and cluster with a tolerance.\r\n * * Primary sorting is along an \"arbitrary\" sort vector.\r\n * @internal\r\n */\r\nexport class ClusterableArray extends GrowableBlockedArray {\r\n // (This is pretty strange)\r\n // The sort vector is (1,c, c*c, ...)\r\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\r\n // c with some inobvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\r\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\r\n /** Return a component of the sort vector. */\r\n public static sortVectorComponent(index: number): number {\r\n let c = 1.0;\r\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\r\n return c;\r\n }\r\n private _numCoordinatePerPoint: number;\r\n private _numExtraDataPerPoint: number;\r\n /**\r\n * @param numCoordinatePerPoint number of coordinates per point\r\n * @param numExtraDataPerPoint of extra data values per point.\r\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\r\n */\r\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\r\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\r\n this._numExtraDataPerPoint = numExtraDataPerPoint;\r\n this._numCoordinatePerPoint = numCoordinatePerPoint;\r\n }\r\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\r\n * @param data array of numDataPerBlock values.\r\n */\r\n public override addBlock(data: number[]) {\r\n const i0 = this.newBlockIndex() + 1;\r\n const n = Math.min(this.numPerBlock - 1, data.length);\r\n for (let i = 0; i < n; i++)\r\n this._data[i0 + i] = data[i];\r\n }\r\n /** add a block with directly 2 to 5 listed content parameters.\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addDirect(x0: number, x1: number, x2?: number, x3?: number, x4?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = x0;\r\n this._data[i0 + 2] = x1;\r\n if (x2 !== undefined) this._data[i0 + 3] = x2;\r\n if (x3 !== undefined) this._data[i0 + 4] = x3;\r\n if (x4 !== undefined) this._data[i0 + 5] = x4;\r\n }\r\n\r\n /** add a block directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xy.x;\r\n this._data[i0 + 2] = xy.y;\r\n if (a !== undefined)\r\n this._data[i0 + 3] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 4] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 5] = c;\r\n }\r\n\r\n /** add a block with directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xyz.x;\r\n this._data[i0 + 2] = xyz.y;\r\n this._data[i0 + 3] = xyz.z;\r\n if (a !== undefined)\r\n this._data[i0 + 4] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 5] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 6] = c;\r\n }\r\n /** Get the xy coordinates by point index. */\r\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\r\n }\r\n /** Get the xyZ coordinates by point index. */\r\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\r\n }\r\n /** Return a single extra data value */\r\n public getExtraData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\r\n }\r\n /** Return a single data value */\r\n public getData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + i];\r\n }\r\n\r\n /** Set a single extra data value */\r\n public setExtraData(blockIndex: number, i: number, value: number): void {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\r\n }\r\n\r\n /** this value is used as cluster terminator in the Uint232rray of indcies. */\r\n public static readonly clusterTerminator = 0xFFffFFff;\r\n /** Test if `x` is the cluster terminator value. */\r\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\r\n /** Return an array giving clusters of blocks with similar coordinates.\r\n *\r\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\r\n *\r\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\r\n * candidates for clusters.\r\n * ** The usual solution is to u value which is a dot product along some skew direction and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\r\n * ** apply setupPrimaryClusterSort to prepare that!!!\r\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\r\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\r\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\r\n */\r\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\r\n // install primary sort key\r\n this.setupPrimaryClusterSort();\r\n // presort by all coordinates ....\r\n const firstSort = this.sortIndicesLexical();\r\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\r\n let m = 0; // number of cluster indices\r\n const n = this.numBlocks; // and this must match firstSort.length !!\r\n let clusterStartBlockIndex = 0;\r\n let candidateBlockIndex = 0;\r\n let barrierU = 0.0;\r\n let i = 0;\r\n let j = 0;\r\n\r\n const k0 = 1; // beginning of active column for distance\r\n const k1 = 1 + this._numCoordinatePerPoint;\r\n for (i = 0; i < n; i++) {\r\n clusterStartBlockIndex = firstSort[i];\r\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\r\n // unused block, so it becomes a cluster...\r\n clusterIndices[m++] = clusterStartBlockIndex;\r\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\r\n firstSort[i] = ClusterableArray.clusterTerminator;\r\n for (j = i + 1; j < n; j++) {\r\n candidateBlockIndex = firstSort[j];\r\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\r\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\r\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\r\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\r\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\r\n }\r\n }\r\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\r\n }\r\n }\r\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\r\n return clusterIndices.slice(0, m);\r\n }\r\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\r\n * This is normally called before clusterIndicesLexical.\r\n */\r\n public setupPrimaryClusterSort() {\r\n const nb = this.numBlocks;\r\n const nc = this._numCoordinatePerPoint;\r\n const vector = new Float64Array(nc);\r\n vector[0] = 1.0;\r\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\r\n let k = 0;\r\n let dot = 0.0;\r\n const data = this._data;\r\n for (let b = 0; b < nb; b++) {\r\n k = this.blockIndexToDoubleIndex(b);\r\n dot = 0.0;\r\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\r\n data[k] = dot;\r\n }\r\n }\r\n /** Convert the cluster data to an array of tuples with point i in the form\r\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\r\n */\r\n public toJSON(): any[] {\r\n const result: any[] = [];\r\n for (let b = 0; b < this.numBlocks; b++) {\r\n let i = this.blockIndexToDoubleIndex(b);\r\n const chunk: any[] = [b, this._data[i++]];\r\n const coordinates = [];\r\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\r\n chunk.push(coordinates);\r\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\r\n chunk.push(this._data[i++]);\r\n result.push(chunk);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array of indices from block index to cluster index.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\r\n const numBlocks = this.numBlocks;\r\n const blockToCluster = new Uint32Array(numBlocks);\r\n blockToCluster.fill(ClusterableArray.clusterTerminator);\r\n let numCluster = 0;\r\n for (const b of clusteredBlocks) {\r\n if (b >= numBlocks) {\r\n numCluster++;\r\n } else {\r\n blockToCluster[b] = numCluster;\r\n }\r\n }\r\n return blockToCluster;\r\n }\r\n /**\r\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n const n = clusteredBlocks.length;\r\n const numBlocks = this.numBlocks;\r\n const blockToClusterStart = new Uint32Array(numBlocks);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n blockToClusterStart.fill(terminator);\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k > numBlocks) {\r\n clusterStart = i + 1;\r\n } else {\r\n blockToClusterStart[k] = clusterStart;\r\n }\r\n }\r\n return blockToClusterStart;\r\n }\r\n /** count the clusters in the clusteredBlocks array. */\r\n public countClusters(clusteredBlocks: Uint32Array): number {\r\n let numClusters = 0;\r\n const terminator = ClusterableArray.clusterTerminator;\r\n for (const b of clusteredBlocks) {\r\n if (b === terminator)\r\n numClusters++;\r\n }\r\n return numClusters;\r\n }\r\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\r\n * the cluster's block indices appear in clusterBlocks\r\n */\r\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n let numCluster = this.countClusters(clusteredBlocks);\r\n const clusterToClusterStart = new Uint32Array(numCluster);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n clusterToClusterStart.fill(terminator);\r\n const n = clusteredBlocks.length;\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k === terminator) {\r\n clusterStart = i + 1;\r\n } else if (i === clusterStart) {\r\n clusterToClusterStart[numCluster++] = clusterStart;\r\n }\r\n }\r\n return clusterToClusterStart;\r\n }\r\n\r\n /**\r\n * Sort terminator-delimited subsets of an array of indices into the table, using a single extraData index as sort key.\r\n * @param blockedIndices [in] indices, organized as blocks of good indices terminated by the clusterTerminator.\r\n * @param extraDataIndex index of the extra data key.\r\n */\r\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\r\n const dataOffset = 1 + dataIndex;\r\n let kBegin = 0;\r\n let swap;\r\n let key0, key1;\r\n const numK = blockedIndices.length;\r\n for (let kEnd = 0; kEnd < numK; kEnd++) {\r\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\r\n // sort blockedIndices[kBegin ,= k < kEnd].\r\n // (search for minimum remaining, swap . . )\r\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\r\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\r\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\r\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\r\n if (key1 < key0) {\r\n swap = blockedIndices[k0];\r\n blockedIndices[k0] = blockedIndices[k1];\r\n blockedIndices[k1] = swap;\r\n key0 = key1;\r\n }\r\n }\r\n }\r\n kBegin = kEnd + 1;\r\n }\r\n }\r\n }\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, data.length);\r\n data.forEach((p: Point3d) => {\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n });\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(data.length);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0)\r\n result.packedPoints.push(data[k].clone());\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\r\n const clusterArray = new ClusterableArray(2, 0, source.length);\r\n const p = Point2d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint2dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, source.length);\r\n const p = Point3d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint3dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(source.length);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\r\n let numErrors = 0;\r\n indices.forEach((value: number, i: number, data: number[]) => {\r\n if (value < oldToNew.length) {\r\n data[i] = oldToNew[value];\r\n } else numErrors++;\r\n });\r\n return numErrors === 0;\r\n}\r\n\r\n/**\r\n * Data carrier class for\r\n * * packedPoints = an array of Point3d\r\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\r\n * @internal\r\n */\r\nclass PackedPointsWithIndex {\r\n /** Array of Point3d */\r\n public packedPoints: Point3d[];\r\n /** array of coordinates packed in GrowableXYZArray */\r\n public growablePackedPoints: GrowableXYZArray | undefined;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number) {\r\n this.packedPoints = [];\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass PackedPoint2dsWithIndex {\r\n /** array of coordinates packed in GrowableXYArray */\r\n public growablePackedPoints: GrowableXYArray;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\r\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.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 Numerics\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\n\r\n/**\r\n * Blocked array with operations to sort and cluster with a tolerance.\r\n * * Primary sorting is along an \"arbitrary\" sort vector.\r\n * @internal\r\n */\r\nexport class ClusterableArray extends GrowableBlockedArray {\r\n // (This is pretty strange)\r\n // The sort vector is (1,c, c*c, ...)\r\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\r\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\r\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\r\n /** Return a component of the sort vector. */\r\n public static sortVectorComponent(index: number): number {\r\n let c = 1.0;\r\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\r\n return c;\r\n }\r\n private _numCoordinatePerPoint: number;\r\n private _numExtraDataPerPoint: number;\r\n /**\r\n * @param numCoordinatePerPoint number of coordinates per point\r\n * @param numExtraDataPerPoint of extra data values per point.\r\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\r\n */\r\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\r\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\r\n this._numExtraDataPerPoint = numExtraDataPerPoint;\r\n this._numCoordinatePerPoint = numCoordinatePerPoint;\r\n }\r\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\r\n * @param data array of numDataPerBlock values.\r\n */\r\n public override addBlock(data: number[]) {\r\n const i0 = this.newBlockIndex() + 1;\r\n const n = Math.min(this.numPerBlock - 1, data.length);\r\n for (let i = 0; i < n; i++)\r\n this._data[i0 + i] = data[i];\r\n }\r\n /** add a block with directly 2 to 5 listed content parameters.\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addDirect(x0: number, x1: number, x2?: number, x3?: number, x4?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = x0;\r\n this._data[i0 + 2] = x1;\r\n if (x2 !== undefined) this._data[i0 + 3] = x2;\r\n if (x3 !== undefined) this._data[i0 + 4] = x3;\r\n if (x4 !== undefined) this._data[i0 + 5] = x4;\r\n }\r\n\r\n /** add a block directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xy.x;\r\n this._data[i0 + 2] = xy.y;\r\n if (a !== undefined)\r\n this._data[i0 + 3] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 4] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 5] = c;\r\n }\r\n\r\n /** add a block with directly from a Point2d with 0 to 3 extras\r\n * This assumes numDataPerPoint is sufficient for the parameters provided.\r\n */\r\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\r\n const i0 = this.newBlockIndex();\r\n this._data[i0 + 1] = xyz.x;\r\n this._data[i0 + 2] = xyz.y;\r\n this._data[i0 + 3] = xyz.z;\r\n if (a !== undefined)\r\n this._data[i0 + 4] = a;\r\n if (b !== undefined)\r\n this._data[i0 + 5] = b;\r\n if (c !== undefined)\r\n this._data[i0 + 6] = c;\r\n }\r\n /** Get the xy coordinates by point index. */\r\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\r\n }\r\n /** Get the xyZ coordinates by point index. */\r\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\r\n }\r\n /** Return a single extra data value */\r\n public getExtraData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\r\n }\r\n /** Return a single data value */\r\n public getData(blockIndex: number, i: number): number {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n return this._data[i0 + i];\r\n }\r\n\r\n /** Set a single extra data value */\r\n public setExtraData(blockIndex: number, i: number, value: number): void {\r\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\r\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\r\n }\r\n\r\n /** this value is used as cluster terminator in the Uint232Array of indices. */\r\n public static readonly clusterTerminator = 0xFFffFFff;\r\n /** Test if `x` is the cluster terminator value. */\r\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\r\n /** Return an array giving clusters of blocks with similar coordinates.\r\n *\r\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\r\n *\r\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\r\n * candidates for clusters.\r\n * ** The usual solution is to u value which is a dot product along some skew direction and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\r\n * ** apply setupPrimaryClusterSort to prepare that!!!\r\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\r\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\r\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\r\n */\r\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\r\n // install primary sort key\r\n this.setupPrimaryClusterSort();\r\n // presort by all coordinates ....\r\n const firstSort = this.sortIndicesLexical();\r\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\r\n let m = 0; // number of cluster indices\r\n const n = this.numBlocks; // and this must match firstSort.length !!\r\n let clusterStartBlockIndex = 0;\r\n let candidateBlockIndex = 0;\r\n let barrierU = 0.0;\r\n let i = 0;\r\n let j = 0;\r\n\r\n const k0 = 1; // beginning of active column for distance\r\n const k1 = 1 + this._numCoordinatePerPoint;\r\n for (i = 0; i < n; i++) {\r\n clusterStartBlockIndex = firstSort[i];\r\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\r\n // unused block, so it becomes a cluster...\r\n clusterIndices[m++] = clusterStartBlockIndex;\r\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\r\n firstSort[i] = ClusterableArray.clusterTerminator;\r\n for (j = i + 1; j < n; j++) {\r\n candidateBlockIndex = firstSort[j];\r\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\r\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\r\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\r\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\r\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\r\n }\r\n }\r\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\r\n }\r\n }\r\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\r\n return clusterIndices.slice(0, m);\r\n }\r\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\r\n * This is normally called before clusterIndicesLexical.\r\n */\r\n public setupPrimaryClusterSort() {\r\n const nb = this.numBlocks;\r\n const nc = this._numCoordinatePerPoint;\r\n const vector = new Float64Array(nc);\r\n vector[0] = 1.0;\r\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\r\n let k = 0;\r\n let dot = 0.0;\r\n const data = this._data;\r\n for (let b = 0; b < nb; b++) {\r\n k = this.blockIndexToDoubleIndex(b);\r\n dot = 0.0;\r\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\r\n data[k] = dot;\r\n }\r\n }\r\n /** Convert the cluster data to an array of tuples with point i in the form\r\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\r\n */\r\n public toJSON(): any[] {\r\n const result: any[] = [];\r\n for (let b = 0; b < this.numBlocks; b++) {\r\n let i = this.blockIndexToDoubleIndex(b);\r\n const chunk: any[] = [b, this._data[i++]];\r\n const coordinates = [];\r\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\r\n chunk.push(coordinates);\r\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\r\n chunk.push(this._data[i++]);\r\n result.push(chunk);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array of indices from block index to cluster index.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\r\n const numBlocks = this.numBlocks;\r\n const blockToCluster = new Uint32Array(numBlocks);\r\n blockToCluster.fill(ClusterableArray.clusterTerminator);\r\n let numCluster = 0;\r\n for (const b of clusteredBlocks) {\r\n if (b >= numBlocks) {\r\n numCluster++;\r\n } else {\r\n blockToCluster[b] = numCluster;\r\n }\r\n }\r\n return blockToCluster;\r\n }\r\n /**\r\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\r\n * @param clusteredBlocks clusters of block indices followed by separators.\r\n */\r\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n const n = clusteredBlocks.length;\r\n const numBlocks = this.numBlocks;\r\n const blockToClusterStart = new Uint32Array(numBlocks);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n blockToClusterStart.fill(terminator);\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k > numBlocks) {\r\n clusterStart = i + 1;\r\n } else {\r\n blockToClusterStart[k] = clusterStart;\r\n }\r\n }\r\n return blockToClusterStart;\r\n }\r\n /** count the clusters in the clusteredBlocks array. */\r\n public countClusters(clusteredBlocks: Uint32Array): number {\r\n let numClusters = 0;\r\n const terminator = ClusterableArray.clusterTerminator;\r\n for (const b of clusteredBlocks) {\r\n if (b === terminator)\r\n numClusters++;\r\n }\r\n return numClusters;\r\n }\r\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\r\n * the cluster's block indices appear in clusterBlocks\r\n */\r\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\r\n let numCluster = this.countClusters(clusteredBlocks);\r\n const clusterToClusterStart = new Uint32Array(numCluster);\r\n const terminator = ClusterableArray.clusterTerminator;\r\n clusterToClusterStart.fill(terminator);\r\n const n = clusteredBlocks.length;\r\n let clusterStart = 0;\r\n for (let i = 0; i < n; i++) {\r\n const k = clusteredBlocks[i];\r\n if (k === terminator) {\r\n clusterStart = i + 1;\r\n } else if (i === clusterStart) {\r\n clusterToClusterStart[numCluster++] = clusterStart;\r\n }\r\n }\r\n return clusterToClusterStart;\r\n }\r\n\r\n /**\r\n * Sort terminator-delimited subsets of an array of indices into the table, using a single extraData index as sort key.\r\n * @param blockedIndices [in] indices, organized as blocks of good indices terminated by the clusterTerminator.\r\n * @param extraDataIndex index of the extra data key.\r\n */\r\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\r\n const dataOffset = 1 + dataIndex;\r\n let kBegin = 0;\r\n let swap;\r\n let key0, key1;\r\n const numK = blockedIndices.length;\r\n for (let kEnd = 0; kEnd < numK; kEnd++) {\r\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\r\n // sort blockedIndices[kBegin ,= k < kEnd].\r\n // (search for minimum remaining, swap . . )\r\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\r\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\r\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\r\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\r\n if (key1 < key0) {\r\n swap = blockedIndices[k0];\r\n blockedIndices[k0] = blockedIndices[k1];\r\n blockedIndices[k1] = swap;\r\n key0 = key1;\r\n }\r\n }\r\n }\r\n kBegin = kEnd + 1;\r\n }\r\n }\r\n }\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, data.length);\r\n data.forEach((p: Point3d) => {\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n });\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(data.length);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0)\r\n result.packedPoints.push(data[k].clone());\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\r\n const clusterArray = new ClusterableArray(2, 0, source.length);\r\n const p = Point2d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint2dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns packed points with indices mapping old to new.\r\n * @param data points to cluster.\r\n */\r\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\r\n PackedPointsWithIndex {\r\n const clusterArray = new ClusterableArray(3, 0, source.length);\r\n const p = Point3d.create();\r\n const numSourcePoint = source.length;\r\n for (let i = 0; i < numSourcePoint; i++) {\r\n source.getPoint3dAtUncheckedPointIndex(i, p);\r\n clusterArray.addDirect(p.x, p.y, p.z);\r\n }\r\n const order = clusterArray.clusterIndicesLexical(tolerance);\r\n const result = new PackedPointsWithIndex(source.length);\r\n const numPackedPoints = clusterArray.countClusters(order);\r\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\r\n let currentClusterIndex = 0;\r\n let numThisCluster = 0;\r\n order.forEach((k: number) => {\r\n if (ClusterableArray.isClusterTerminator(k)) {\r\n currentClusterIndex++;\r\n numThisCluster = 0;\r\n } else {\r\n if (numThisCluster === 0) // This is the first encounter with a new cluster\r\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\r\n result.oldToNew[k] = currentClusterIndex;\r\n numThisCluster++;\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\r\n let numErrors = 0;\r\n indices.forEach((value: number, i: number, data: number[]) => {\r\n if (value < oldToNew.length) {\r\n data[i] = oldToNew[value];\r\n } else numErrors++;\r\n });\r\n return numErrors === 0;\r\n}\r\n\r\n/**\r\n * Data carrier class for\r\n * * packedPoints = an array of Point3d\r\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\r\n * @internal\r\n */\r\nclass PackedPointsWithIndex {\r\n /** Array of Point3d */\r\n public packedPoints: Point3d[];\r\n /** array of coordinates packed in GrowableXYZArray */\r\n public growablePackedPoints: GrowableXYZArray | undefined;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number) {\r\n this.packedPoints = [];\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass PackedPoint2dsWithIndex {\r\n /** array of coordinates packed in GrowableXYArray */\r\n public growablePackedPoints: GrowableXYArray;\r\n /** mapping from old point index to new point index. */\r\n public oldToNew: Uint32Array;\r\n /** integer value for unknown index. */\r\n public static readonly invalidIndex = 0xFFFFffff;\r\n\r\n /** construct a PackedPoints object with\r\n * * empty packedPoints array\r\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\r\n */\r\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\r\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\r\n this.oldToNew = new Uint32Array(numOldIndexEntry);\r\n for (let i = 0; i < numOldIndexEntry; i++) {\r\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\r\n }\r\n }\r\n /**\r\n * Use the oldToNew array to update an array of \"old\" indices.\r\n * @param indices array of indices into prepacked array.\r\n * @returns true if all input indices were valid for the oldToNew array.\r\n */\r\n public updateIndices(indices: number[]): boolean {\r\n return updateIndices(indices, this.oldToNew);\r\n }\r\n}\r\n"]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module Polyface
|
|
3
|
+
*/
|
|
4
|
+
import { Arc3d } from "../curve/Arc3d";
|
|
1
5
|
import { AnyCurve, AnyRegion } from "../curve/CurveChain";
|
|
2
6
|
import { CurvePrimitive } from "../curve/CurvePrimitive";
|
|
3
7
|
import { GeometryQuery } from "../curve/GeometryQuery";
|
|
@@ -21,6 +25,7 @@ import { Sphere } from "../solid/Sphere";
|
|
|
21
25
|
import { TorusPipe } from "../solid/TorusPipe";
|
|
22
26
|
import { HalfEdge, HalfEdgeGraph, HalfEdgeToBooleanFunction } from "../topology/Graph";
|
|
23
27
|
import { IndexedPolyface, PolyfaceVisitor } from "./Polyface";
|
|
28
|
+
import { XAndY } from "../geometry3d/XYZProps";
|
|
24
29
|
/**
|
|
25
30
|
*
|
|
26
31
|
* * Simple construction for strongly typed GeometryQuery objects:
|
|
@@ -390,6 +395,15 @@ export declare class PolyfaceBuilder extends NullGeometryHandler {
|
|
|
390
395
|
*/
|
|
391
396
|
addGreedyTriangulationBetweenLineStrings(pointsA: Point3d[] | LineString3d | IndexedXYZCollection, pointsB: Point3d[] | LineString3d | IndexedXYZCollection): void;
|
|
392
397
|
private addMiteredPipesFromPoints;
|
|
393
|
-
|
|
398
|
+
/**
|
|
399
|
+
* * Create (and add to the builder) quad facets for a mitered pipe that follows a centerline curve.
|
|
400
|
+
* * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis lengths, or a full Arc3d.
|
|
401
|
+
* * For semi-axis length input, x corresponds to an ellipse local axis nominally situated parallel to the xy-plane.
|
|
402
|
+
* * The center of Arc3d input is translated to the centerline start point to act as initial cross section.
|
|
403
|
+
* @param centerline centerline of pipe
|
|
404
|
+
* @param sectionData circle radius, ellipse semi-axis lengths, or full Arc3d
|
|
405
|
+
* @param numFacetAround how many equal parameter-space chords around each section
|
|
406
|
+
*/
|
|
407
|
+
addMiteredPipes(centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive, sectionData: number | XAndY | Arc3d, numFacetAround?: number): void;
|
|
394
408
|
}
|
|
395
409
|
//# sourceMappingURL=PolyfaceBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolyfaceBuilder.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PolyfaceBuilder.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
/** @packageDocumentation
|
|
6
|
-
* @module Polyface
|
|
7
|
-
*/
|
|
8
5
|
import { ConstructCurveBetweenCurves } from "../curve/ConstructCurveBetweenCurves";
|
|
9
6
|
import { CurveChain, CurveCollection } from "../curve/CurveCollection";
|
|
10
7
|
import { CurveFactory } from "../curve/CurveFactory";
|
|
@@ -1579,8 +1576,8 @@ export class PolyfaceBuilder extends NullGeometryHandler {
|
|
|
1579
1576
|
this.addTriangleFacet(triangle.points);
|
|
1580
1577
|
});
|
|
1581
1578
|
}
|
|
1582
|
-
addMiteredPipesFromPoints(centerline,
|
|
1583
|
-
const sections = CurveFactory.createMiteredPipeSections(centerline,
|
|
1579
|
+
addMiteredPipesFromPoints(centerline, sectionData, numFacetAround = 12) {
|
|
1580
|
+
const sections = CurveFactory.createMiteredPipeSections(centerline, sectionData);
|
|
1584
1581
|
const pointA0 = Point3d.create();
|
|
1585
1582
|
const pointA1 = Point3d.create();
|
|
1586
1583
|
const pointB0 = Point3d.create();
|
|
@@ -1601,23 +1598,32 @@ export class PolyfaceBuilder extends NullGeometryHandler {
|
|
|
1601
1598
|
}
|
|
1602
1599
|
}
|
|
1603
1600
|
}
|
|
1604
|
-
|
|
1601
|
+
/**
|
|
1602
|
+
* * Create (and add to the builder) quad facets for a mitered pipe that follows a centerline curve.
|
|
1603
|
+
* * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis lengths, or a full Arc3d.
|
|
1604
|
+
* * For semi-axis length input, x corresponds to an ellipse local axis nominally situated parallel to the xy-plane.
|
|
1605
|
+
* * The center of Arc3d input is translated to the centerline start point to act as initial cross section.
|
|
1606
|
+
* @param centerline centerline of pipe
|
|
1607
|
+
* @param sectionData circle radius, ellipse semi-axis lengths, or full Arc3d
|
|
1608
|
+
* @param numFacetAround how many equal parameter-space chords around each section
|
|
1609
|
+
*/
|
|
1610
|
+
addMiteredPipes(centerline, sectionData, numFacetAround = 12) {
|
|
1605
1611
|
if (Array.isArray(centerline)) {
|
|
1606
|
-
this.addMiteredPipesFromPoints(new Point3dArrayCarrier(centerline),
|
|
1612
|
+
this.addMiteredPipesFromPoints(new Point3dArrayCarrier(centerline), sectionData, numFacetAround);
|
|
1607
1613
|
}
|
|
1608
1614
|
else if (centerline instanceof GrowableXYZArray) {
|
|
1609
|
-
this.addMiteredPipesFromPoints(centerline,
|
|
1615
|
+
this.addMiteredPipesFromPoints(centerline, sectionData, numFacetAround);
|
|
1610
1616
|
}
|
|
1611
1617
|
else if (centerline instanceof IndexedXYZCollection) {
|
|
1612
|
-
this.addMiteredPipesFromPoints(centerline,
|
|
1618
|
+
this.addMiteredPipesFromPoints(centerline, sectionData, numFacetAround);
|
|
1613
1619
|
}
|
|
1614
1620
|
else if (centerline instanceof LineString3d) {
|
|
1615
|
-
this.addMiteredPipesFromPoints(centerline.packedPoints,
|
|
1621
|
+
this.addMiteredPipesFromPoints(centerline.packedPoints, sectionData, numFacetAround);
|
|
1616
1622
|
}
|
|
1617
1623
|
else if (centerline instanceof GeometryQuery) {
|
|
1618
1624
|
const linestring = LineString3d.create();
|
|
1619
1625
|
centerline.emitStrokes(linestring);
|
|
1620
|
-
this.addMiteredPipesFromPoints(linestring.packedPoints,
|
|
1626
|
+
this.addMiteredPipesFromPoints(linestring.packedPoints, sectionData, numFacetAround);
|
|
1621
1627
|
}
|
|
1622
1628
|
}
|
|
1623
1629
|
}
|