@itwin/core-geometry 5.1.0-dev.52 → 5.1.0-dev.53
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/lib/cjs/Geometry.d.ts +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js +0 -2
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +7 -0
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +11 -0
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +3 -2
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +6 -5
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +3 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +6 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +7 -0
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +11 -0
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.d.ts +2 -0
- package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js +4 -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 +15 -3
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +28 -4
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +25 -3
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +102 -22
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts +4 -3
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js +20 -9
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.d.ts +1 -1
- package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js +6 -3
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +23 -14
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +60 -21
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +9 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +91 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +2 -2
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +6 -6
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +9 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +14 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts +7 -9
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +12 -22
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.d.ts +1 -4
- package/lib/cjs/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js +48 -43
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +3 -3
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/solid/Sphere.js +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.d.ts +1 -1
- package/lib/cjs/solid/SweepContour.js +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +64 -14
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +149 -32
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +2 -2
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -2
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js +2 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/Geometry.d.ts +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js +0 -2
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +7 -0
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +11 -0
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +3 -2
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +6 -5
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +3 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +6 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +7 -0
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +11 -0
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.d.ts +2 -0
- package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/esm/curve/LineSegment3d.js +4 -0
- 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 +15 -3
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.d.ts.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +28 -4
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +25 -3
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +104 -24
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts +4 -3
- package/lib/esm/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js +20 -9
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.d.ts +1 -1
- package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js +6 -3
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +23 -14
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +60 -21
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +9 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +91 -2
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +2 -2
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +6 -6
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +9 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +14 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +7 -9
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +12 -22
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.d.ts +1 -4
- package/lib/esm/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js +48 -43
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +3 -3
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/solid/Sphere.js +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.d.ts +1 -1
- package/lib/esm/solid/SweepContour.js +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +64 -14
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +149 -32
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +2 -2
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -2
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/esm/topology/RegularizeFace.js +2 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveCollection.js","sourceRoot":"","sources":["../../../src/curve/CurveCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { Geometry } from \"../Geometry\";\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { VariantCurveExtendParameter } from \"./CurveExtendMode\";\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\nimport { CurvePrimitive, TangentOptions } from \"./CurvePrimitive\";\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\nimport { AnyCurve, type AnyRegion } from \"./CurveTypes\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { CloneCurvesContext } from \"./internalContexts/CloneCurvesContext\";\nimport { CloneWithExpandedLineStrings } from \"./internalContexts/CloneWithExpandedLineStrings\";\nimport { CountLinearPartsSearchContext } from \"./internalContexts/CountLinearPartsSearchContext\";\nimport { GapSearchContext } from \"./internalContexts/GapSearchContext\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { SumLengthsContext } from \"./internalContexts/SumLengthsContext\";\nimport { TransformInPlaceContext } from \"./internalContexts/TransformInPlaceContext\";\nimport { LineString3d } from \"./LineString3d\";\nimport { ProxyCurve } from \"./ProxyCurve\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\nimport type { Path } from \"./Path\";\nimport type { Loop } from \"./Loop\";\nimport { AnnounceTangentStrokeHandler } from \"./internalContexts/AnnounceTangentStrokeHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\n\n/** Note: CurveChain and BagOfCurves classes are located in this file to prevent circular dependency. */\n\n/**\n * Describes the concrete type of a [[CurveCollection]]. Each type name maps to a specific subclass and can be\n * used in conditional statements for type-switching.\n * - \"loop\" => [[Loop]]\n * - \"path\" => [[Path]]\n * - \"unionRegion\" => [[UnionRegion]]\n * - \"parityRegion\" => [[ParityRegion]]\n * - \"bagOfCurves\" => [[BagOfCurves]]\n * @public\n */\nexport type CurveCollectionType = \"loop\" | \"path\" | \"unionRegion\" | \"parityRegion\" | \"bagOfCurves\";\n\n/**\n * A `CurveCollection` is an abstract (non-instantiable) class for various sets of curves with particular structures:\n * - [[CurveChain]] - a non-instantiable intermediate class for a sequence of [[CurvePrimitive]] joining head-to-tail.\n * The two instantiable forms of `CurveChain` are:\n * - [[Path]] - a chain of curves. Does not have to be closed or planar. A closed `Path` is not treated as bounding a surface.\n * - [[Loop]] - a closed and planar chain of curves. A `Loop` is treated as bounding a planar area.\n * - [[ParityRegion]] - a collection of coplanar `Loop`, with \"in/out\" classification by parity rules.\n * - [[UnionRegion]] - a collection of coplanar `Loop` and/or `ParityRegion`, with \"in/out\" classification by union rules.\n * - [[BagOfCurves]] - a collection of [[AnyCurve]] with no implied structure.\n *\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\n * @public\n */\nexport abstract class CurveCollection extends GeometryQuery {\n /** String name for schema properties */\n public readonly geometryCategory = \"curveCollection\";\n /** Type discriminator. */\n public abstract readonly curveCollectionType: CurveCollectionType;\n /** Flag for inner loop status. Only used by `Loop`. */\n public isInner: boolean = false;\n /** Return the curve children. */\n public abstract override get children(): AnyCurve[];\n /** Return the sum of the lengths of all contained curves. */\n public sumLengths(): number {\n return SumLengthsContext.sumLengths(this);\n }\n /**\n * Return the closest point on the contained curves.\n * @param spacePoint point in space.\n * @param _extend unused here (pass false), but applicable to overrides in [[Path]] and [[BagOfCurves]].\n * @param result optional pre-allocated detail to populate and return.\n * @returns details of the closest point.\n */\n public closestPoint(\n spacePoint: Point3d, _extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n let detailA: CurveLocationDetail | undefined;\n const detailB = new CurveLocationDetail();\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child.closestPoint(spacePoint, false, detailB))\n detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB)!.clone(result);\n }\n }\n return detailA;\n }\n /**\n * Announce all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to\n * the contained curves in the view defined by `options.vectorToEye`.\n * * Strictly speaking, each tangent line lies in the plane through `P` whose normal is the cross product of the curve\n * tangent at `P` and `options.vectorToEye`. This is equivalent to tangency as seen in a view plane perpendicular to\n * `options.vectorToEye`.\n * @param spacePoint point in space.\n * @param announceTangent callback to announce each computed tangent. The received [[CurveLocationDetail]] is reused\n * internally, so it should be cloned in the callback if it needs to be saved.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n */\n public emitTangents(\n spacePoint: Point3d, announceTangent: (tangent: CurveLocationDetail) => any, options?: TangentOptions,\n ): void {\n const strokeHandler = new AnnounceTangentStrokeHandler(spacePoint, announceTangent, options);\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child instanceof CurvePrimitive)\n child.emitStrokableParts(strokeHandler, options?.strokeOptions);\n else if (child instanceof CurveCollection)\n child.emitTangents(spacePoint, announceTangent, options);\n }\n }\n }\n /**\n * Return all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the\n * contained curves in the view defined by `options.vectorToEye`.\n * * See [[emitTangents]] for the definition of tangency employed.\n * @param spacePoint point in space.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n * @returns an array of details of all tangent points or undefined if no tangent was found.\n */\n public allTangents(spacePoint: Point3d, options?: TangentOptions): CurveLocationDetail[] | undefined {\n const tangents: CurveLocationDetail[] = [];\n this.emitTangents(spacePoint, (t: CurveLocationDetail) => tangents.push(t.clone()), options);\n return (tangents.length === 0) ? undefined : tangents;\n }\n /**\n * Return the point `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the\n * contained curves in the view defined by `options.vectorToEye`, and `P` is closest to `options.hintPoint` in this view.\n * * See [[emitTangents]] for the definition of tangency employed.\n * @param spacePoint point in space.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n * @returns the detail of the closest tangent point or undefined if no tangent was found.\n */\n public closestTangent(spacePoint: Point3d, options?: TangentOptions): CurveLocationDetail | undefined {\n const hint = options?.hintPoint ?? spacePoint;\n let toLocal: Matrix3d | undefined;\n if (options?.vectorToEye && !options.vectorToEye.isExactEqual({ x: 0, y: 0, z: 1 }))\n toLocal = Matrix3d.createRigidViewAxesZTowardsEye(options.vectorToEye.x, options.vectorToEye.y, options.vectorToEye.z);\n const measureHintDist2 = (pt: Point3d): number => { // measure distance to hint in view plane coordinates\n return toLocal?.multiplyTransposeXYZ(hint.x - pt.x, hint.y - pt.y, hint.z - pt.z).magnitudeSquaredXY() ?? pt.distanceSquaredXY(hint);\n };\n let closestTangent: CurveLocationDetail | undefined;\n let closestDist2 = Geometry.largeCoordinateResult;\n const collectClosestTangent = (tangent: CurveLocationDetail) => {\n const dist2 = measureHintDist2(tangent.point);\n if (!closestTangent || dist2 < closestDist2) {\n closestTangent = tangent.clone(closestTangent);\n closestDist2 = dist2;\n }\n };\n this.emitTangents(spacePoint, collectClosestTangent, options);\n return closestTangent;\n }\n /** Reverse the collection's data so that each child curve's fractional stroking moves in the opposite direction. */\n public reverseInPlace(): void {\n for (const curve of this.children)\n curve.reverseInPlace();\n }\n /**\n * Return the max gap between adjacent primitives in Path and Loop collections.\n * * In a Path, gaps are computed between consecutive primitives.\n * * In a Loop, gaps are computed between consecutive primitives and between last and first.\n * * Gaps are NOT computed between consecutive CurvePrimitives in \"unstructured\" collections. The type is\n * \"unstructured\" so gaps should not be semantically meaningful.\n */\n public maxGap(): number {\n return GapSearchContext.maxGap(this);\n }\n /** Return true if the curve collection has any primitives other than LineSegment3d and LineString3d */\n public checkForNonLinearPrimitives(): boolean {\n return CountLinearPartsSearchContext.hasNonLinearPrimitives(this);\n }\n /** Apply transform recursively to children */\n public tryTransformInPlace(transform: Transform): boolean {\n return TransformInPlaceContext.tryTransformInPlace(this, transform);\n }\n /** Return a deep copy. */\n public override clone(): CurveCollection {\n return CloneCurvesContext.clone(this) as CurveCollection;\n }\n /** Create a deep copy of transformed curves. */\n public override cloneTransformed(transform: Transform): CurveCollection | undefined {\n return CloneCurvesContext.clone(this, transform);\n }\n /** Create a deep copy with all linestrings broken down into multiple LineSegment3d. */\n public cloneWithExpandedLineStrings(): CurveCollection {\n return CloneWithExpandedLineStrings.clone(this);\n }\n /**\n * Push all CurvePrimitives contained in the instance onto the `results` array.\n * * This method is recursive. For example, if the CurveCollection contains a Loop, all CurvePrimitives\n * of the Loop are pushed onto `results`.\n */\n private collectCurvePrimitivesGo(\n results: CurvePrimitive[], smallestPossiblePrimitives: boolean, explodeLinestrings: boolean = false,\n ): void {\n if (this.children) {\n for (const child of this.children) {\n if (child instanceof CurvePrimitive)\n child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);\n else if (child instanceof CurveCollection)\n child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);\n }\n }\n }\n /**\n * Return an array containing all CurvePrimitives in the instance.\n * * This method is recursive. For example, if the CurveCollection contains a Loop, all CurvePrimitives of\n * the Loop are pushed onto the returned array.\n * @param collectorArray optional array to receive primitives. If present, new primitives are ADDED (without\n * clearing the array).\n * @param smallestPossiblePrimitives if false, CurvePrimitiveWithDistanceIndex returns only itself. If true,\n * it recurses to its (otherwise hidden) children.\n */\n public collectCurvePrimitives(\n collectorArray?: CurvePrimitive[], smallestPossiblePrimitives: boolean = false, explodeLineStrings: boolean = false,\n ): CurvePrimitive[] {\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\n this.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLineStrings);\n return results;\n }\n /**\n * Return true for planar region types:\n * * `Loop`\n * * `ParityRegion`\n * * `UnionRegion`\n * @see isAnyRegion\n */\n public get isAnyRegionType(): boolean {\n return this.dgnBoundaryType() === 2 || this.dgnBoundaryType() === 4 || this.dgnBoundaryType() === 5;\n }\n /** Type guard for AnyRegion */\n public isAnyRegion(): this is AnyRegion {\n return this.isAnyRegionType;\n }\n /**\n * Return true for a `Path`, i.e. a chain of curves joined head-to-tail\n * @see isPath\n */\n public get isOpenPath(): boolean {\n return this.dgnBoundaryType() === 1;\n }\n /** Type guard for Path */\n public isPath(): this is Path {\n return this.isOpenPath;\n }\n /**\n * Return true for a single-loop planar region type, i.e. `Loop`.\n * * This is NOT a test for physical closure of a `Path`.\n * @see isLoop\n */\n public get isClosedPath(): boolean {\n return this.dgnBoundaryType() === 2;\n }\n /** Type guard for Loop */\n public isLoop(): this is Loop {\n return this.isClosedPath;\n }\n\n /** Return a CurveCollection with the same structure but all curves replaced by strokes. */\n public abstract cloneStroked(options?: StrokeOptions): CurveCollection;\n /** Support method for ICurvePrimitive ... one line call to specific announce method . . */\n public abstract announceToCurveProcessor(processor: RecursiveCurveProcessor): void;\n /** Clone an empty collection. */\n public abstract cloneEmptyPeer(): CurveCollection;\n /**\n * Return the boundary type of a corresponding MicroStation CurveVector.\n * * Derived class must implement.\n */\n public abstract dgnBoundaryType(): number;\n /**\n * Try to add a child.\n * @param child child to add.\n * @return true if child is an acceptable type for this collection.\n */\n public abstract tryAddChild(child: AnyCurve | undefined): boolean;\n /** Return a child identified by by index */\n public abstract getChild(i: number): AnyCurve | undefined;\n /**\n * Extend (increase) the given range as needed to encompass all curves in the curve collection.\n * @param rangeToExtend the given range.\n * @param transform if supplied, the range is extended with transformed curves.\n */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n const children = this.children;\n if (children) {\n for (const c of children) {\n c.extendRange(rangeToExtend, transform);\n }\n }\n }\n /**\n * Find any CurvePrimitive in the source and evaluate it at the given fraction.\n * * The first CurvePrimitive found is evaluated. Any other CurvePrimitives are ignored.\n * @param source containing `CurvePrimitive` or `CurveCollection`\n * @param fraction fraction to use in `curve.fractionToPoint(fraction)`\n */\n public static createCurveLocationDetailOnAnyCurvePrimitive(\n source: GeometryQuery | undefined, fraction: number = 0.5,\n ): CurveLocationDetail | undefined {\n if (!source)\n return undefined;\n if (source instanceof CurvePrimitive) {\n return CurveLocationDetail.createCurveEvaluatedFraction(source, fraction);\n } else if (source instanceof CurveCollection && source.children !== undefined)\n for (const child of source.children) {\n const detail = this.createCurveLocationDetailOnAnyCurvePrimitive(child, fraction);\n if (detail)\n return detail;\n }\n return undefined;\n }\n /**\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters\n * of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the\n * end of the ray.\n */\n public projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n /** Return the immediate parent of the input curve in the instance, or undefined if it is not a descendant. */\n public findParentOfDescendant(descendant: AnyCurve): CurveCollection | undefined {\n for (const child of this.children) {\n if (child === descendant)\n return this;\n if (child instanceof CurveCollection) {\n const parent = child.findParentOfDescendant(descendant);\n if (parent)\n return parent;\n }\n }\n return undefined;\n };\n}\n\n/**\n * Shared base class for use by both open and closed paths.\n * * A `CurveChain` contains only CurvePrimitives. No other paths, loops, or regions allowed.\n * * The specific derived classes are `Path` and `Loop`.\n * * `CurveChain` is an intermediate class. It is not instantiable on its own.\n * * The related class `CurveChainWithDistanceIndex` is a `CurvePrimitive` whose API presents well-defined mappings\n * from fraction to xyz over the entire chain, but in fact does all the calculations over multiple primitives.\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\n * @public\n */\nexport abstract class CurveChain extends CurveCollection {\n /** The curve primitives in the chain. */\n protected _curves: CurvePrimitive[];\n /** Constructor */\n protected constructor() {\n super();\n this._curves = [];\n }\n /** Return the array of `CurvePrimitive` */\n public override get children(): CurvePrimitive[] {\n return this._curves;\n }\n /** Return the start point of the curve chain (start point of the first child). */\n public startPoint(result?: Point3d): Point3d | undefined {\n const firstChild = this.getChild(0);\n if (firstChild)\n return firstChild.fractionToPoint(0.0, result);\n else\n return undefined;\n }\n /** Return the end point of the curve chain (end point of the last child). */\n public endPoint(result?: Point3d): Point3d | undefined {\n const lastChild = this.getChild(this._curves.length - 1);\n if (lastChild)\n return lastChild.fractionToPoint(1.0, result);\n else\n return undefined;\n }\n /**\n * Return the start point and derivative of the first child of the curve chain.\n * * For queries interior to the chain, use [[CurveChainWithDistanceIndex.fractionToPointAndDerivative]].\n */\n public startPointAndDerivative(result?: Ray3d): Ray3d | undefined {\n const firstChild = this.getChild(0);\n if (firstChild)\n return firstChild.fractionToPointAndDerivative(0.0, result);\n else\n return undefined;\n }\n /**\n * Return the end point and derivative of the last child of the curve chain.\n * * For queries interior to the chain, use [[CurveChainWithDistanceIndex.fractionToPointAndDerivative]].\n */\n public endPointAndDerivative(result?: Ray3d): Ray3d | undefined {\n const lastChild = this.getChild(this._curves.length - 1);\n if (lastChild)\n return lastChild.fractionToPointAndDerivative(1.0, result);\n else\n return undefined;\n }\n /**\n * Return the curve primitive at the given `index`, optionally using `modulo` to map `index` to the cyclic indexing.\n * * In particular, `-1` is the final curve.\n * @param index cyclic index\n */\n public cyclicCurvePrimitive(index: number, cyclic: boolean = true): CurvePrimitive | undefined {\n const n = this.children.length;\n if (n === 0)\n return undefined;\n if (index >= 0 && index < n) // try simplest non-cyclic access first\n return this.children[index];\n if (cyclic) {\n const index2 = Geometry.modulo(index, n);\n return this.children[index2];\n }\n return undefined;\n }\n /**\n * Stroke the chain into a simple xyz array.\n * @param options tolerance parameters controlling the stroking.\n */\n public getPackedStrokes(options?: StrokeOptions): GrowableXYZArray | undefined {\n /**\n * The object returned by \"cloneStroked\" has the same type (Loop or Path) but instead of a chain of\n * CurvePrimitives as children, it has a single LineString3d child. \"getPackedStrokes\" just returns\n * the points of that LineString3d using \"packedPoints\".\n */\n const tree = this.cloneStroked(options);\n if (tree instanceof CurveChain) {\n const children = tree.children;\n if (children.length === 1) {\n const ls = children[0];\n if (ls instanceof LineString3d)\n return ls.packedPoints;\n }\n }\n return undefined;\n }\n /** Return a structural clone, with CurvePrimitive objects stroked. */\n public abstract override cloneStroked(options?: StrokeOptions): CurveChain;\n /**\n * Add a child curve.\n * @param child curve to add to the chain. The curve is captured by this instance.\n * @return whether the child was added\n */\n public tryAddChild(child: AnyCurve | undefined): boolean {\n if (child && child instanceof CurvePrimitive) {\n this._curves.push(child);\n return true;\n }\n return false;\n }\n /** Return a child by index */\n public getChild(i: number): CurvePrimitive | undefined {\n if (i < this._curves.length) return this._curves[i];\n return undefined;\n }\n /** Invoke `curve.extendRange(range, transform)` for each child */\n public override extendRange(range: Range3d, transform?: Transform): void {\n for (const curve of this._curves)\n curve.extendRange(range, transform);\n }\n /**\n * Reverse each child curve (in place).\n * Reverse the order of the children array.\n */\n public reverseChildrenInPlace(): void {\n for (const curve of this._curves)\n curve.reverseInPlace();\n this._curves.reverse();\n }\n /** Same as [[reverseChildrenInPlace]]. */\n public override reverseInPlace(): void {\n this.reverseChildrenInPlace();\n }\n /**\n * Return the index where target is found in the array of children.\n * @param alsoSearchProxies whether to also check proxy curves of the children\n */\n public childIndex(target: CurvePrimitive | undefined, alsoSearchProxies?: boolean): number | undefined {\n for (let i = 0; i < this._curves.length; i++) {\n if (this._curves[i] === target)\n return i;\n }\n if (alsoSearchProxies ?? false) {\n for (let i = 0; i < this._curves.length; i++) {\n const childCurve = this._curves[i];\n if (childCurve instanceof ProxyCurve) {\n if (childCurve.proxyCurve === target)\n return i;\n }\n }\n }\n return undefined;\n }\n /** Evaluate an indexed curve at a fraction. Return as a CurveLocationDetail that indicates the primitive. */\n public primitiveIndexAndFractionToCurveLocationDetailPointAndDerivative(\n index: number, fraction: number, cyclic: boolean = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n const primitive = this.cyclicCurvePrimitive(index, cyclic);\n if (primitive) {\n return CurveLocationDetail.createCurveEvaluatedFractionPointAndDerivative(primitive, fraction, result);\n }\n return undefined;\n }\n}\n\n/**\n * * A `BagOfCurves` object is a collection of `AnyCurve` objects.\n * * A `BagOfCurves` has no implied properties such as being planar.\n * @public\n */\nexport class BagOfCurves extends CurveCollection {\n /** String name for schema properties */\n public readonly curveCollectionType = \"bagOfCurves\";\n /** Test if `other` is an instance of `BagOfCurves` */\n public isSameGeometryClass(other: GeometryQuery): boolean {\n return other instanceof BagOfCurves;\n }\n /**\n * Array of children.\n * * No restrictions on type.\n */\n protected _children: AnyCurve[];\n /** Construct an empty `BagOfCurves` */\n public constructor() {\n super();\n this._children = [];\n }\n /** Return the (reference to) array of children */\n public override get children(): AnyCurve[] {\n return this._children;\n }\n /** Create with given curves. */\n public static create(...data: AnyCurve[]): BagOfCurves {\n const result = new BagOfCurves();\n for (const child of data) {\n result.tryAddChild(child);\n }\n return result;\n }\n /** Return the boundary type (0) of a corresponding MicroStation CurveVector */\n public dgnBoundaryType(): number {\n return 0;\n }\n /** Invoke `processor.announceBagOfCurves(this, indexInParent);` */\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\n return processor.announceBagOfCurves(this, indexInParent);\n }\n /** Clone all children in stroked form. */\n public cloneStroked(options?: StrokeOptions): BagOfCurves {\n const clone = new BagOfCurves();\n let child;\n for (child of this.children) {\n if (child instanceof CurvePrimitive) {\n const ls = LineString3d.create();\n child.emitStrokes(ls, options);\n if (ls)\n clone.children.push(ls);\n } else if (child instanceof CurveCollection) {\n const childStrokes = child.cloneStroked(options);\n if (childStrokes)\n clone.children.push(childStrokes);\n }\n }\n return clone;\n }\n /**\n * Return the closest point on the contained curves.\n * @param spacePoint point in space.\n * @param extend applicable only to children of type [[CurvePrimitive]], [[Path]], or [[BagOfCurves]]\n * @param result optional pre-allocated detail to populate and return.\n * @returns details of the closest point.\n */\n public override closestPoint(\n spacePoint: Point3d, extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n let detailA: CurveLocationDetail | undefined;\n const detailB = new CurveLocationDetail();\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child.closestPoint(spacePoint, extend, detailB))\n detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB)!.clone(result);\n }\n }\n return detailA;\n }\n /** Return an empty `BagOfCurves` */\n public cloneEmptyPeer(): BagOfCurves {\n return new BagOfCurves();\n }\n /** Add a child */\n public tryAddChild(child: AnyCurve | undefined): boolean {\n if (child)\n this._children.push(child);\n return true;\n }\n /** Get a child by index */\n public getChild(i: number): AnyCurve | undefined {\n if (i < this._children.length)\n return this._children[i];\n return undefined;\n }\n /** Second step of double dispatch: call `handler.handleBagOfCurves(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleBagOfCurves(this);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CurveCollection.js","sourceRoot":"","sources":["../../../src/curve/CurveCollection.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AACH,0CAAuC;AAQvC,+DAA4D;AAC5D,qDAAkE;AAGlE,mDAAgD;AAChD,8EAA2E;AAC3E,kGAA+F;AAC/F,oGAAiG;AACjG,0EAAuE;AACvE,4FAAyF;AACzF,4EAAyE;AACzE,wFAAqF;AACrF,iDAA8C;AAC9C,6CAA0C;AAK1C,kGAA+F;AAC/F,qDAAkD;AAgBlD;;;;;;;;;;;;GAYG;AACH,MAAsB,eAAgB,SAAQ,6BAAa;IACzD,wCAAwC;IACxB,gBAAgB,GAAG,iBAAiB,CAAC;IAGrD,uDAAuD;IAChD,OAAO,GAAY,KAAK,CAAC;IAGhC,6DAA6D;IACtD,UAAU;QACf,OAAO,qCAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD;;;;;;OAMG;IACI,YAAY,CACjB,UAAmB,EAAE,UAAuC,KAAK,EAAE,MAA4B;QAE/F,IAAI,OAAwC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,yCAAmB,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC;oBAChD,OAAO,GAAG,MAAM,GAAG,yCAAmB,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;;;;;;OAUG;IACI,YAAY,CACjB,UAAmB,EAAE,eAAsD,EAAE,OAAwB;QAErG,MAAM,aAAa,GAAG,IAAI,2DAA4B,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,KAAK,YAAY,+BAAc;oBACjC,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;qBAC7D,IAAI,KAAK,YAAY,eAAe;oBACvC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;;;;OAOG;IACI,WAAW,CAAC,UAAmB,EAAE,OAAwB;QAC9D,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7F,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxD,CAAC;IACD;;;;;;;OAOG;IACI,cAAc,CAAC,UAAmB,EAAE,OAAwB;QACjE,MAAM,IAAI,GAAG,OAAO,EAAE,SAAS,IAAI,UAAU,CAAC;QAC9C,IAAI,OAA6B,CAAC;QAClC,IAAI,OAAO,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACjF,OAAO,GAAG,mBAAQ,CAAC,8BAA8B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACzH,MAAM,gBAAgB,GAAG,CAAC,EAAW,EAAU,EAAE;YAC/C,OAAO,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvI,CAAC,CAAC;QACF,IAAI,cAA+C,CAAC;QACpD,IAAI,YAAY,GAAG,mBAAQ,CAAC,qBAAqB,CAAC;QAClD,MAAM,qBAAqB,GAAG,CAAC,OAA4B,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;gBAC5C,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/C,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,oHAAoH;IAC7G,cAAc;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;IAC3B,CAAC;IACD;;;;;;OAMG;IACI,MAAM;QACX,OAAO,mCAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,wGAAwG;IACjG,2BAA2B;QAChC,OAAO,6DAA6B,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,8CAA8C;IACvC,mBAAmB,CAAC,SAAoB;QAC7C,OAAO,iDAAuB,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IACD,0BAA0B;IACV,KAAK;QACnB,OAAO,uCAAkB,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;IAC3D,CAAC;IACD,gDAAgD;IAChC,gBAAgB,CAAC,SAAoB;QACnD,OAAO,uCAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IACD,uFAAuF;IAChF,4BAA4B;QACjC,OAAO,2DAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD;;;;OAIG;IACK,wBAAwB,CAC9B,OAAyB,EAAE,0BAAmC,EAAE,qBAA8B,KAAK;QAEnG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,KAAK,YAAY,+BAAc;oBACjC,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;qBACrF,IAAI,KAAK,YAAY,eAAe;oBACvC,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;;;;;OAQG;IACI,sBAAsB,CAC3B,cAAiC,EAAE,6BAAsC,KAAK,EAAE,qBAA8B,KAAK;QAEnH,MAAM,OAAO,GAAqB,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACrF,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;QACvF,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;;OAMG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtG,CAAC;IACD,+BAA+B;IACxB,WAAW;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD;;;OAGG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,0BAA0B;IACnB,MAAM;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD;;;;OAIG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,0BAA0B;IACnB,MAAM;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAqBD;;;;OAIG;IACI,WAAW,CAAC,aAAsB,EAAE,SAAqB;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,CAAC,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,4CAA4C,CACxD,MAAiC,EAAE,WAAmB,GAAG;QAEzD,IAAI,CAAC,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,YAAY,+BAAc,EAAE,CAAC;YACrC,OAAO,yCAAmB,CAAC,4BAA4B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,MAAM,YAAY,eAAe,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,4CAA4C,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAClF,IAAI,MAAM;oBACR,OAAO,MAAM,CAAC;YAClB,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACI,uBAAuB,CAAC,GAAqB,EAAE,OAAiB;QACrE,OAAO,qDAAyB,CAAC,kCAAkC,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC;IACD,8GAA8G;IACvG,sBAAsB,CAAC,UAAoB;QAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,KAAK,KAAK,UAAU;gBACtB,OAAO,IAAI,CAAC;YACd,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,KAAK,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;gBACxD,IAAI,MAAM;oBACR,OAAO,MAAM,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAA,CAAC;CACH;AAzRD,0CAyRC;AAED;;;;;;;;;GASG;AACH,MAAsB,UAAW,SAAQ,eAAe;IACtD,yCAAyC;IAC/B,OAAO,CAAmB;IACpC,kBAAkB;IAClB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IACD,2CAA2C;IAC3C,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,kFAAkF;IAC3E,UAAU,CAAC,MAAgB;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,UAAU;YACZ,OAAO,UAAU,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YAE/C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,6EAA6E;IACtE,QAAQ,CAAC,MAAgB;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YAE9C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD;;;;;OAKG;IACI,uBAAuB,CAAC,YAAoB,mBAAQ,CAAC,mBAAmB,EAAE,SAAkB,KAAK;QACtG,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAChI,CAAC;IACD;;;OAGG;IACI,uBAAuB,CAAC,MAAc;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,UAAU;YACZ,OAAO,UAAU,CAAC,4BAA4B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YAE5D,OAAO,SAAS,CAAC;IACrB,CAAC;IACD;;;OAGG;IACI,qBAAqB,CAAC,MAAc;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC,4BAA4B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;YAE3D,OAAO,SAAS,CAAC;IACrB,CAAC;IACD;;;;OAIG;IACI,oBAAoB,CAAC,KAAa,EAAE,SAAkB,IAAI;QAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,uCAAuC;YAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,mBAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;OAGG;IACI,gBAAgB,CAAC,OAAuB;QAC7C;;;;WAIG;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,EAAE,YAAY,2BAAY;oBAC5B,OAAO,EAAE,CAAC,YAAY,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD;;;;OAIG;IACI,WAAW,CAAC,KAA2B;QAC5C,IAAI,KAAK,IAAI,KAAK,YAAY,+BAAc,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8BAA8B;IACvB,QAAQ,CAAC,CAAS;QACvB,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,mEAAmE;IACnD,WAAW,CAAC,KAAc,EAAE,SAAqB;QAC/D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;YAC9B,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IACD;;;OAGG;IACI,sBAAsB;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;YAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1B,cAAc;QAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IACD;;;OAGG;IACI,UAAU,CAAC,MAAkC,EAAE,iBAA2B;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM;gBAC5B,OAAO,CAAC,CAAC;QACb,CAAC;QACD,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,UAAU,YAAY,uBAAU,EAAE,CAAC;oBACrC,IAAI,UAAU,CAAC,UAAU,KAAK,MAAM;wBAClC,OAAO,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,6GAA6G;IACtG,gEAAgE,CACrE,KAAa,EAAE,QAAgB,EAAE,SAAkB,KAAK,EAAE,MAA4B;QAEtF,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,yCAAmB,CAAC,8CAA8C,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAtKD,gCAsKC;AAED;;;;GAIG;AACH,MAAa,WAAY,SAAQ,eAAe;IAC9C,wCAAwC;IACxB,mBAAmB,GAAG,aAAa,CAAC;IACpD,sDAAsD;IAC/C,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC;IACD;;;OAGG;IACO,SAAS,CAAa;IAChC,uCAAuC;IACvC;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,kDAAkD;IAClD,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,gCAAgC;IACzB,MAAM,CAAC,MAAM,CAAC,GAAG,IAAgB;QACtC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,gFAAgF;IACzE,eAAe;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,mEAAmE;IAC5D,wBAAwB,CAAC,SAAkC,EAAE,gBAAwB,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IACD,0CAA0C;IACnC,YAAY,CAAC,OAAuB;QACzC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,KAAK,YAAY,+BAAc,EAAE,CAAC;gBACpC,MAAM,EAAE,GAAG,2BAAY,CAAC,MAAM,EAAE,CAAC;gBACjC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,EAAE;oBACJ,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,YAAY;oBACd,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;OAMG;IACa,YAAY,CAC1B,UAAmB,EAAE,SAAsC,KAAK,EAAE,MAA4B;QAE9F,IAAI,OAAwC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,yCAAmB,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;oBACjD,OAAO,GAAG,MAAM,GAAG,yCAAmB,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,oCAAoC;IAC7B,cAAc;QACnB,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD,mBAAmB;IACZ,WAAW,CAAC,KAA2B;QAC5C,IAAI,KAAK;YACP,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2BAA2B;IACpB,QAAQ,CAAC,CAAS;QACvB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,8EAA8E;IACvE,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AA/FD,kCA+FC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { Geometry } from \"../Geometry\";\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { VariantCurveExtendParameter } from \"./CurveExtendMode\";\nimport { CurveLocationDetail } from \"./CurveLocationDetail\";\nimport { CurvePrimitive, TangentOptions } from \"./CurvePrimitive\";\nimport { RecursiveCurveProcessor } from \"./CurveProcessor\";\nimport { AnyCurve, type AnyRegion } from \"./CurveTypes\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { CloneCurvesContext } from \"./internalContexts/CloneCurvesContext\";\nimport { CloneWithExpandedLineStrings } from \"./internalContexts/CloneWithExpandedLineStrings\";\nimport { CountLinearPartsSearchContext } from \"./internalContexts/CountLinearPartsSearchContext\";\nimport { GapSearchContext } from \"./internalContexts/GapSearchContext\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { SumLengthsContext } from \"./internalContexts/SumLengthsContext\";\nimport { TransformInPlaceContext } from \"./internalContexts/TransformInPlaceContext\";\nimport { LineString3d } from \"./LineString3d\";\nimport { ProxyCurve } from \"./ProxyCurve\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\nimport type { Path } from \"./Path\";\nimport type { Loop } from \"./Loop\";\nimport { AnnounceTangentStrokeHandler } from \"./internalContexts/AnnounceTangentStrokeHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\n\n/** Note: CurveChain and BagOfCurves classes are located in this file to prevent circular dependency. */\n\n/**\n * Describes the concrete type of a [[CurveCollection]]. Each type name maps to a specific subclass and can be\n * used in conditional statements for type-switching.\n * - \"loop\" => [[Loop]]\n * - \"path\" => [[Path]]\n * - \"unionRegion\" => [[UnionRegion]]\n * - \"parityRegion\" => [[ParityRegion]]\n * - \"bagOfCurves\" => [[BagOfCurves]]\n * @public\n */\nexport type CurveCollectionType = \"loop\" | \"path\" | \"unionRegion\" | \"parityRegion\" | \"bagOfCurves\";\n\n/**\n * A `CurveCollection` is an abstract (non-instantiable) class for various sets of curves with particular structures:\n * - [[CurveChain]] - a non-instantiable intermediate class for a sequence of [[CurvePrimitive]] joining head-to-tail.\n * The two instantiable forms of `CurveChain` are:\n * - [[Path]] - a chain of curves. Does not have to be closed or planar. A closed `Path` is not treated as bounding a surface.\n * - [[Loop]] - a closed and planar chain of curves. A `Loop` is treated as bounding a planar area.\n * - [[ParityRegion]] - a collection of coplanar `Loop`, with \"in/out\" classification by parity rules.\n * - [[UnionRegion]] - a collection of coplanar `Loop` and/or `ParityRegion`, with \"in/out\" classification by union rules.\n * - [[BagOfCurves]] - a collection of [[AnyCurve]] with no implied structure.\n *\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\n * @public\n */\nexport abstract class CurveCollection extends GeometryQuery {\n /** String name for schema properties */\n public readonly geometryCategory = \"curveCollection\";\n /** Type discriminator. */\n public abstract readonly curveCollectionType: CurveCollectionType;\n /** Flag for inner loop status. Only used by `Loop`. */\n public isInner: boolean = false;\n /** Return the curve children. */\n public abstract override get children(): AnyCurve[];\n /** Return the sum of the lengths of all contained curves. */\n public sumLengths(): number {\n return SumLengthsContext.sumLengths(this);\n }\n /**\n * Return the closest point on the contained curves.\n * @param spacePoint point in space.\n * @param _extend unused here (pass false), but applicable to overrides in [[Path]] and [[BagOfCurves]].\n * @param result optional pre-allocated detail to populate and return.\n * @returns details of the closest point.\n */\n public closestPoint(\n spacePoint: Point3d, _extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n let detailA: CurveLocationDetail | undefined;\n const detailB = new CurveLocationDetail();\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child.closestPoint(spacePoint, false, detailB))\n detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB)!.clone(result);\n }\n }\n return detailA;\n }\n /**\n * Announce all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to\n * the contained curves in the view defined by `options.vectorToEye`.\n * * Strictly speaking, each tangent line lies in the plane through `P` whose normal is the cross product of the curve\n * tangent at `P` and `options.vectorToEye`. This is equivalent to tangency as seen in a view plane perpendicular to\n * `options.vectorToEye`.\n * @param spacePoint point in space.\n * @param announceTangent callback to announce each computed tangent. The received [[CurveLocationDetail]] is reused\n * internally, so it should be cloned in the callback if it needs to be saved.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n */\n public emitTangents(\n spacePoint: Point3d, announceTangent: (tangent: CurveLocationDetail) => any, options?: TangentOptions,\n ): void {\n const strokeHandler = new AnnounceTangentStrokeHandler(spacePoint, announceTangent, options);\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child instanceof CurvePrimitive)\n child.emitStrokableParts(strokeHandler, options?.strokeOptions);\n else if (child instanceof CurveCollection)\n child.emitTangents(spacePoint, announceTangent, options);\n }\n }\n }\n /**\n * Return all points `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the\n * contained curves in the view defined by `options.vectorToEye`.\n * * See [[emitTangents]] for the definition of tangency employed.\n * @param spacePoint point in space.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n * @returns an array of details of all tangent points or undefined if no tangent was found.\n */\n public allTangents(spacePoint: Point3d, options?: TangentOptions): CurveLocationDetail[] | undefined {\n const tangents: CurveLocationDetail[] = [];\n this.emitTangents(spacePoint, (t: CurveLocationDetail) => tangents.push(t.clone()), options);\n return (tangents.length === 0) ? undefined : tangents;\n }\n /**\n * Return the point `P` on the contained curves such that the line containing `spacePoint` and `P` is tangent to the\n * contained curves in the view defined by `options.vectorToEye`, and `P` is closest to `options.hintPoint` in this view.\n * * See [[emitTangents]] for the definition of tangency employed.\n * @param spacePoint point in space.\n * @param options (optional) options for computing tangents. See [[TangentOptions]] for defaults.\n * @returns the detail of the closest tangent point or undefined if no tangent was found.\n */\n public closestTangent(spacePoint: Point3d, options?: TangentOptions): CurveLocationDetail | undefined {\n const hint = options?.hintPoint ?? spacePoint;\n let toLocal: Matrix3d | undefined;\n if (options?.vectorToEye && !options.vectorToEye.isExactEqual({ x: 0, y: 0, z: 1 }))\n toLocal = Matrix3d.createRigidViewAxesZTowardsEye(options.vectorToEye.x, options.vectorToEye.y, options.vectorToEye.z);\n const measureHintDist2 = (pt: Point3d): number => { // measure distance to hint in view plane coordinates\n return toLocal?.multiplyTransposeXYZ(hint.x - pt.x, hint.y - pt.y, hint.z - pt.z).magnitudeSquaredXY() ?? pt.distanceSquaredXY(hint);\n };\n let closestTangent: CurveLocationDetail | undefined;\n let closestDist2 = Geometry.largeCoordinateResult;\n const collectClosestTangent = (tangent: CurveLocationDetail) => {\n const dist2 = measureHintDist2(tangent.point);\n if (!closestTangent || dist2 < closestDist2) {\n closestTangent = tangent.clone(closestTangent);\n closestDist2 = dist2;\n }\n };\n this.emitTangents(spacePoint, collectClosestTangent, options);\n return closestTangent;\n }\n /** Reverse the collection's data so that each child curve's fractional stroking moves in the opposite direction. */\n public reverseInPlace(): void {\n for (const curve of this.children)\n curve.reverseInPlace();\n }\n /**\n * Return the max gap between adjacent primitives in Path and Loop collections.\n * * In a Path, gaps are computed between consecutive primitives.\n * * In a Loop, gaps are computed between consecutive primitives and between last and first.\n * * Gaps are NOT computed between consecutive CurvePrimitives in \"unstructured\" collections. The type is\n * \"unstructured\" so gaps should not be semantically meaningful.\n */\n public maxGap(): number {\n return GapSearchContext.maxGap(this);\n }\n /** Return true if the curve collection has any primitives other than LineSegment3d and LineString3d */\n public checkForNonLinearPrimitives(): boolean {\n return CountLinearPartsSearchContext.hasNonLinearPrimitives(this);\n }\n /** Apply transform recursively to children */\n public tryTransformInPlace(transform: Transform): boolean {\n return TransformInPlaceContext.tryTransformInPlace(this, transform);\n }\n /** Return a deep copy. */\n public override clone(): CurveCollection {\n return CloneCurvesContext.clone(this) as CurveCollection;\n }\n /** Create a deep copy of transformed curves. */\n public override cloneTransformed(transform: Transform): CurveCollection | undefined {\n return CloneCurvesContext.clone(this, transform);\n }\n /** Create a deep copy with all linestrings broken down into multiple LineSegment3d. */\n public cloneWithExpandedLineStrings(): CurveCollection {\n return CloneWithExpandedLineStrings.clone(this);\n }\n /**\n * Push all CurvePrimitives contained in the instance onto the `results` array.\n * * This method is recursive. For example, if the CurveCollection contains a Loop, all CurvePrimitives\n * of the Loop are pushed onto `results`.\n */\n private collectCurvePrimitivesGo(\n results: CurvePrimitive[], smallestPossiblePrimitives: boolean, explodeLinestrings: boolean = false,\n ): void {\n if (this.children) {\n for (const child of this.children) {\n if (child instanceof CurvePrimitive)\n child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);\n else if (child instanceof CurveCollection)\n child.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLinestrings);\n }\n }\n }\n /**\n * Return an array containing all CurvePrimitives in the instance.\n * * This method is recursive. For example, if the CurveCollection contains a Loop, all CurvePrimitives of\n * the Loop are pushed onto the returned array.\n * @param collectorArray optional array to receive primitives. If present, new primitives are ADDED (without\n * clearing the array).\n * @param smallestPossiblePrimitives if false, CurvePrimitiveWithDistanceIndex returns only itself. If true,\n * it recurses to its (otherwise hidden) children.\n */\n public collectCurvePrimitives(\n collectorArray?: CurvePrimitive[], smallestPossiblePrimitives: boolean = false, explodeLineStrings: boolean = false,\n ): CurvePrimitive[] {\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\n this.collectCurvePrimitivesGo(results, smallestPossiblePrimitives, explodeLineStrings);\n return results;\n }\n /**\n * Return true for planar region types:\n * * `Loop`\n * * `ParityRegion`\n * * `UnionRegion`\n * @see isAnyRegion\n */\n public get isAnyRegionType(): boolean {\n return this.dgnBoundaryType() === 2 || this.dgnBoundaryType() === 4 || this.dgnBoundaryType() === 5;\n }\n /** Type guard for AnyRegion */\n public isAnyRegion(): this is AnyRegion {\n return this.isAnyRegionType;\n }\n /**\n * Return true for a `Path`, i.e. a chain of curves joined head-to-tail\n * @see isPath\n */\n public get isOpenPath(): boolean {\n return this.dgnBoundaryType() === 1;\n }\n /** Type guard for Path */\n public isPath(): this is Path {\n return this.isOpenPath;\n }\n /**\n * Return true for a single-loop planar region type, i.e. `Loop`.\n * * This is NOT a test for physical closure of a `Path`.\n * @see isLoop\n */\n public get isClosedPath(): boolean {\n return this.dgnBoundaryType() === 2;\n }\n /** Type guard for Loop */\n public isLoop(): this is Loop {\n return this.isClosedPath;\n }\n\n /** Return a CurveCollection with the same structure but all curves replaced by strokes. */\n public abstract cloneStroked(options?: StrokeOptions): CurveCollection;\n /** Support method for ICurvePrimitive ... one line call to specific announce method . . */\n public abstract announceToCurveProcessor(processor: RecursiveCurveProcessor): void;\n /** Clone an empty collection. */\n public abstract cloneEmptyPeer(): CurveCollection;\n /**\n * Return the boundary type of a corresponding MicroStation CurveVector.\n * * Derived class must implement.\n */\n public abstract dgnBoundaryType(): number;\n /**\n * Try to add a child.\n * @param child child to add.\n * @return true if child is an acceptable type for this collection.\n */\n public abstract tryAddChild(child: AnyCurve | undefined): boolean;\n /** Return a child identified by by index */\n public abstract getChild(i: number): AnyCurve | undefined;\n /**\n * Extend (increase) the given range as needed to encompass all curves in the curve collection.\n * @param rangeToExtend the given range.\n * @param transform if supplied, the range is extended with transformed curves.\n */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n const children = this.children;\n if (children) {\n for (const c of children) {\n c.extendRange(rangeToExtend, transform);\n }\n }\n }\n /**\n * Find any CurvePrimitive in the source and evaluate it at the given fraction.\n * * The first CurvePrimitive found is evaluated. Any other CurvePrimitives are ignored.\n * @param source containing `CurvePrimitive` or `CurveCollection`\n * @param fraction fraction to use in `curve.fractionToPoint(fraction)`\n */\n public static createCurveLocationDetailOnAnyCurvePrimitive(\n source: GeometryQuery | undefined, fraction: number = 0.5,\n ): CurveLocationDetail | undefined {\n if (!source)\n return undefined;\n if (source instanceof CurvePrimitive) {\n return CurveLocationDetail.createCurveEvaluatedFraction(source, fraction);\n } else if (source instanceof CurveCollection && source.children !== undefined)\n for (const child of source.children) {\n const detail = this.createCurveLocationDetailOnAnyCurvePrimitive(child, fraction);\n if (detail)\n return detail;\n }\n return undefined;\n }\n /**\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters\n * of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the\n * end of the ray.\n */\n public projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n /** Return the immediate parent of the input curve in the instance, or undefined if it is not a descendant. */\n public findParentOfDescendant(descendant: AnyCurve): CurveCollection | undefined {\n for (const child of this.children) {\n if (child === descendant)\n return this;\n if (child instanceof CurveCollection) {\n const parent = child.findParentOfDescendant(descendant);\n if (parent)\n return parent;\n }\n }\n return undefined;\n };\n}\n\n/**\n * Shared base class for use by both open and closed paths.\n * * A `CurveChain` contains only CurvePrimitives. No other paths, loops, or regions allowed.\n * * The specific derived classes are `Path` and `Loop`.\n * * `CurveChain` is an intermediate class. It is not instantiable on its own.\n * * The related class `CurveChainWithDistanceIndex` is a `CurvePrimitive` whose API presents well-defined mappings\n * from fraction to xyz over the entire chain, but in fact does all the calculations over multiple primitives.\n * @see [Curve Collections]($docs/learning/geometry/CurveCollection.md) learning article.\n * @public\n */\nexport abstract class CurveChain extends CurveCollection {\n /** The curve primitives in the chain. */\n protected _curves: CurvePrimitive[];\n /** Constructor */\n protected constructor() {\n super();\n this._curves = [];\n }\n /** Return the array of `CurvePrimitive` */\n public override get children(): CurvePrimitive[] {\n return this._curves;\n }\n /** Return the start point of the curve chain (start point of the first child). */\n public startPoint(result?: Point3d): Point3d | undefined {\n const firstChild = this.getChild(0);\n if (firstChild)\n return firstChild.fractionToPoint(0.0, result);\n else\n return undefined;\n }\n /** Return the end point of the curve chain (end point of the last child). */\n public endPoint(result?: Point3d): Point3d | undefined {\n const lastChild = this.getChild(this._curves.length - 1);\n if (lastChild)\n return lastChild.fractionToPoint(1.0, result);\n else\n return undefined;\n }\n /**\n * Whether the chain start and end points are defined and within tolerance.\n * * Does not check for planarity or degeneracy.\n * @param tolerance optional distance tolerance (default is [[Geometry.smallMetricDistance]])\n * @param xyOnly if true, ignore z coordinate (default is `false`)\n */\n public isPhysicallyClosedCurve(tolerance: number = Geometry.smallMetricDistance, xyOnly: boolean = false): boolean {\n const p0 = this.startPoint();\n const p1 = this.endPoint();\n return p0 !== undefined && p1 !== undefined && (xyOnly ? p0.isAlmostEqualXY(p1, tolerance) : p0.isAlmostEqual(p1, tolerance));\n }\n /**\n * Return the start point and derivative of the first child of the curve chain.\n * * For queries interior to the chain, use [[CurveChainWithDistanceIndex.fractionToPointAndDerivative]].\n */\n public startPointAndDerivative(result?: Ray3d): Ray3d | undefined {\n const firstChild = this.getChild(0);\n if (firstChild)\n return firstChild.fractionToPointAndDerivative(0.0, result);\n else\n return undefined;\n }\n /**\n * Return the end point and derivative of the last child of the curve chain.\n * * For queries interior to the chain, use [[CurveChainWithDistanceIndex.fractionToPointAndDerivative]].\n */\n public endPointAndDerivative(result?: Ray3d): Ray3d | undefined {\n const lastChild = this.getChild(this._curves.length - 1);\n if (lastChild)\n return lastChild.fractionToPointAndDerivative(1.0, result);\n else\n return undefined;\n }\n /**\n * Return the curve primitive at the given `index`, optionally using `modulo` to map `index` to the cyclic indexing.\n * * In particular, `-1` is the final curve.\n * @param index cyclic index\n */\n public cyclicCurvePrimitive(index: number, cyclic: boolean = true): CurvePrimitive | undefined {\n const n = this.children.length;\n if (n === 0)\n return undefined;\n if (index >= 0 && index < n) // try simplest non-cyclic access first\n return this.children[index];\n if (cyclic) {\n const index2 = Geometry.modulo(index, n);\n return this.children[index2];\n }\n return undefined;\n }\n /**\n * Stroke the chain into a simple xyz array.\n * @param options tolerance parameters controlling the stroking.\n */\n public getPackedStrokes(options?: StrokeOptions): GrowableXYZArray | undefined {\n /**\n * The object returned by \"cloneStroked\" has the same type (Loop or Path) but instead of a chain of\n * CurvePrimitives as children, it has a single LineString3d child. \"getPackedStrokes\" just returns\n * the points of that LineString3d using \"packedPoints\".\n */\n const tree = this.cloneStroked(options);\n if (tree instanceof CurveChain) {\n const children = tree.children;\n if (children.length === 1) {\n const ls = children[0];\n if (ls instanceof LineString3d)\n return ls.packedPoints;\n }\n }\n return undefined;\n }\n /** Return a structural clone, with CurvePrimitive objects stroked. */\n public abstract override cloneStroked(options?: StrokeOptions): CurveChain;\n /**\n * Add a child curve.\n * @param child curve to add to the chain. The curve is captured by this instance.\n * @return whether the child was added\n */\n public tryAddChild(child: AnyCurve | undefined): boolean {\n if (child && child instanceof CurvePrimitive) {\n this._curves.push(child);\n return true;\n }\n return false;\n }\n /** Return a child by index */\n public getChild(i: number): CurvePrimitive | undefined {\n if (i < this._curves.length) return this._curves[i];\n return undefined;\n }\n /** Invoke `curve.extendRange(range, transform)` for each child */\n public override extendRange(range: Range3d, transform?: Transform): void {\n for (const curve of this._curves)\n curve.extendRange(range, transform);\n }\n /**\n * Reverse each child curve (in place).\n * Reverse the order of the children array.\n */\n public reverseChildrenInPlace(): void {\n for (const curve of this._curves)\n curve.reverseInPlace();\n this._curves.reverse();\n }\n /** Same as [[reverseChildrenInPlace]]. */\n public override reverseInPlace(): void {\n this.reverseChildrenInPlace();\n }\n /**\n * Return the index where target is found in the array of children.\n * @param alsoSearchProxies whether to also check proxy curves of the children\n */\n public childIndex(target: CurvePrimitive | undefined, alsoSearchProxies?: boolean): number | undefined {\n for (let i = 0; i < this._curves.length; i++) {\n if (this._curves[i] === target)\n return i;\n }\n if (alsoSearchProxies ?? false) {\n for (let i = 0; i < this._curves.length; i++) {\n const childCurve = this._curves[i];\n if (childCurve instanceof ProxyCurve) {\n if (childCurve.proxyCurve === target)\n return i;\n }\n }\n }\n return undefined;\n }\n /** Evaluate an indexed curve at a fraction. Return as a CurveLocationDetail that indicates the primitive. */\n public primitiveIndexAndFractionToCurveLocationDetailPointAndDerivative(\n index: number, fraction: number, cyclic: boolean = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n const primitive = this.cyclicCurvePrimitive(index, cyclic);\n if (primitive) {\n return CurveLocationDetail.createCurveEvaluatedFractionPointAndDerivative(primitive, fraction, result);\n }\n return undefined;\n }\n}\n\n/**\n * * A `BagOfCurves` object is a collection of `AnyCurve` objects.\n * * A `BagOfCurves` has no implied properties such as being planar.\n * @public\n */\nexport class BagOfCurves extends CurveCollection {\n /** String name for schema properties */\n public readonly curveCollectionType = \"bagOfCurves\";\n /** Test if `other` is an instance of `BagOfCurves` */\n public isSameGeometryClass(other: GeometryQuery): boolean {\n return other instanceof BagOfCurves;\n }\n /**\n * Array of children.\n * * No restrictions on type.\n */\n protected _children: AnyCurve[];\n /** Construct an empty `BagOfCurves` */\n public constructor() {\n super();\n this._children = [];\n }\n /** Return the (reference to) array of children */\n public override get children(): AnyCurve[] {\n return this._children;\n }\n /** Create with given curves. */\n public static create(...data: AnyCurve[]): BagOfCurves {\n const result = new BagOfCurves();\n for (const child of data) {\n result.tryAddChild(child);\n }\n return result;\n }\n /** Return the boundary type (0) of a corresponding MicroStation CurveVector */\n public dgnBoundaryType(): number {\n return 0;\n }\n /** Invoke `processor.announceBagOfCurves(this, indexInParent);` */\n public announceToCurveProcessor(processor: RecursiveCurveProcessor, indexInParent: number = -1): void {\n return processor.announceBagOfCurves(this, indexInParent);\n }\n /** Clone all children in stroked form. */\n public cloneStroked(options?: StrokeOptions): BagOfCurves {\n const clone = new BagOfCurves();\n let child;\n for (child of this.children) {\n if (child instanceof CurvePrimitive) {\n const ls = LineString3d.create();\n child.emitStrokes(ls, options);\n if (ls)\n clone.children.push(ls);\n } else if (child instanceof CurveCollection) {\n const childStrokes = child.cloneStroked(options);\n if (childStrokes)\n clone.children.push(childStrokes);\n }\n }\n return clone;\n }\n /**\n * Return the closest point on the contained curves.\n * @param spacePoint point in space.\n * @param extend applicable only to children of type [[CurvePrimitive]], [[Path]], or [[BagOfCurves]]\n * @param result optional pre-allocated detail to populate and return.\n * @returns details of the closest point.\n */\n public override closestPoint(\n spacePoint: Point3d, extend: VariantCurveExtendParameter = false, result?: CurveLocationDetail,\n ): CurveLocationDetail | undefined {\n let detailA: CurveLocationDetail | undefined;\n const detailB = new CurveLocationDetail();\n if (this.children !== undefined) {\n for (const child of this.children) {\n if (child.closestPoint(spacePoint, extend, detailB))\n detailA = result = CurveLocationDetail.chooseSmallerA(detailA, detailB)!.clone(result);\n }\n }\n return detailA;\n }\n /** Return an empty `BagOfCurves` */\n public cloneEmptyPeer(): BagOfCurves {\n return new BagOfCurves();\n }\n /** Add a child */\n public tryAddChild(child: AnyCurve | undefined): boolean {\n if (child)\n this._children.push(child);\n return true;\n }\n /** Get a child by index */\n public getChild(i: number): AnyCurve | undefined {\n if (i < this._children.length)\n return this._children[i];\n return undefined;\n }\n /** Second step of double dispatch: call `handler.handleBagOfCurves(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleBagOfCurves(this);\n }\n}\n"]}
|
|
@@ -105,10 +105,11 @@ export declare class CurveFactory {
|
|
|
105
105
|
* * This only succeeds if the two arcs are part of identical complete arcs and end of `arcA` matches the beginning of `arcB`.
|
|
106
106
|
* @param arcA first arc, modified in place.
|
|
107
107
|
* @param arcB second arc, unmodified.
|
|
108
|
-
* @param allowReversed whether to consolidate even when second arc is reversed.
|
|
108
|
+
* @param allowReversed whether to consolidate even when second arc is reversed (default is `false`).
|
|
109
|
+
* @param tolerance optional coordinate tolerance for point equality (default is `Geometry.smallMetricDistance`).
|
|
109
110
|
* @returns whether `arcA` was modified.
|
|
110
111
|
*/
|
|
111
|
-
static appendToArcInPlace(arcA: Arc3d, arcB: Arc3d, allowReverse?: boolean): boolean;
|
|
112
|
+
static appendToArcInPlace(arcA: Arc3d, arcB: Arc3d, allowReverse?: boolean, tolerance?: number): boolean;
|
|
112
113
|
/**
|
|
113
114
|
* Return a `Path` containing arcs are on the surface of an ellipsoid and pass through a sequence of points.
|
|
114
115
|
* * Each arc passes through the two given endpoints and in the plane containing the true surface normal at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveFactory.d.ts","sourceRoot":"","sources":["../../../src/curve/CurveFactory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CurveFactory.d.ts","sourceRoot":"","sources":["../../../src/curve/CurveFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -204,11 +204,12 @@ class CurveFactory {
|
|
|
204
204
|
* * This only succeeds if the two arcs are part of identical complete arcs and end of `arcA` matches the beginning of `arcB`.
|
|
205
205
|
* @param arcA first arc, modified in place.
|
|
206
206
|
* @param arcB second arc, unmodified.
|
|
207
|
-
* @param allowReversed whether to consolidate even when second arc is reversed.
|
|
207
|
+
* @param allowReversed whether to consolidate even when second arc is reversed (default is `false`).
|
|
208
|
+
* @param tolerance optional coordinate tolerance for point equality (default is `Geometry.smallMetricDistance`).
|
|
208
209
|
* @returns whether `arcA` was modified.
|
|
209
210
|
*/
|
|
210
|
-
static appendToArcInPlace(arcA, arcB, allowReverse = false) {
|
|
211
|
-
if (arcA.center.isAlmostEqual(arcB.center)) {
|
|
211
|
+
static appendToArcInPlace(arcA, arcB, allowReverse = false, tolerance = Geometry_1.Geometry.smallMetricDistance) {
|
|
212
|
+
if (arcA.center.isAlmostEqual(arcB.center, tolerance)) {
|
|
212
213
|
const sweepSign = Geometry_1.Geometry.split3WaySign(arcA.sweep.sweepRadians * arcB.sweep.sweepRadians, -1, 0, 1);
|
|
213
214
|
// evaluate derivatives wrt radians (not fraction!), but adjust direction for sweep signs
|
|
214
215
|
const endA = arcA.angleToPointAndDerivative(arcA.sweep.fractionToAngle(1.0));
|
|
@@ -217,14 +218,14 @@ class CurveFactory {
|
|
|
217
218
|
const startB = arcB.angleToPointAndDerivative(arcB.sweep.fractionToAngle(0.0));
|
|
218
219
|
if (arcB.sweep.sweepRadians < 0)
|
|
219
220
|
startB.direction.scaleInPlace(-1.0);
|
|
220
|
-
if (endA.isAlmostEqual(startB)) {
|
|
221
|
+
if (endA.isAlmostEqual(startB, tolerance)) {
|
|
221
222
|
arcA.sweep.setStartEndRadians(arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians + sweepSign * arcB.sweep.sweepRadians);
|
|
222
223
|
return true;
|
|
223
224
|
}
|
|
224
225
|
// Also ok if negated tangent
|
|
225
226
|
if (allowReverse) {
|
|
226
227
|
startB.direction.scaleInPlace(-1.0);
|
|
227
|
-
if (endA.isAlmostEqual(startB)) {
|
|
228
|
+
if (endA.isAlmostEqual(startB, tolerance)) {
|
|
228
229
|
arcA.sweep.setStartEndRadians(arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians - sweepSign * arcB.sweep.sweepRadians);
|
|
229
230
|
return true;
|
|
230
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurveFactory.js","sourceRoot":"","sources":["../../../src/curve/CurveFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { AxisIndex, AxisOrder, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\nimport { Ellipsoid, GeodesicPathPoint } from \"../geometry3d/Ellipsoid\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { PolylineOps } from \"../geometry3d/PolylineOps\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Segment1d } from \"../geometry3d/Segment1d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { IndexedPolyface } from \"../polyface/Polyface\";\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\nimport { Cone } from \"../solid/Cone\";\nimport { RuledSweep } from \"../solid/RuledSweep\";\nimport { TorusPipe } from \"../solid/TorusPipe\";\nimport { Arc3d, ArcBlendData } from \"./Arc3d\";\nimport { CurveChain } from \"./CurveCollection\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { AnyCurve, AnyRegion } from \"./CurveTypes\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { LineString3d } from \"./LineString3d\";\nimport { Loop } from \"./Loop\";\nimport { Path } from \"./Path\";\nimport { RegionOps } from \"./RegionOps\";\nimport { IntegratedSpiral3d } from \"./spiral/IntegratedSpiral3d\";\nimport { IntegratedSpiralTypeName } from \"./spiral/TransitionSpiral3d\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\n/**\n * Interface to carry parallel arrays of planes and sections, and optional geometry assembled from them,\n * as returned by [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport interface SectionSequenceWithPlanes {\n /** The plane of each section. */\n planes: Plane3dByOriginAndUnitNormal[];\n /** Section curve projected onto the corresponding plane. */\n sections: AnyCurve[];\n /**\n * Optional `RuledSweep` generated from the sections.\n * * The `RuledSweep` and sections array refer to the same section objects.\n */\n ruledSweep?: RuledSweep;\n /** Optional mesh generated from the `RuledSweep` generated from the sections. */\n mesh?: IndexedPolyface;\n}\n\n/**\n * Enumeration of geometric output for [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport enum MiteredSweepOutputSelect {\n /** Output only the parallel arrays of planes and sections. */\n Sections = 0,\n /** Output planes and sections, as well as the assembled ruled sweep. */\n AlsoRuledSweep = 1,\n /** Output planes and sections, as well as the assembled ruled sweep and its stroked mesh. */\n AlsoMesh = 2,\n}\n\n/**\n * Interface bundling options for [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport interface MiteredSweepOptions {\n /** Whether first and last planes are averaged and equated when the centerline is physically closed. Default value is `false`. */\n wrapIfPhysicallyClosed?: boolean;\n /** Whether to output sections only, or sections plus optional geometry constructed from them. Default value is `MiteredSweepOutputSelect.Sections`. */\n outputSelect?: MiteredSweepOutputSelect;\n /** How to stroke smooth input curves. If undefined, default stroke options are used. */\n strokeOptions?: StrokeOptions;\n /** Whether to cap the ruled sweep if outputting a ruled sweep or mesh. Default value is `false`. */\n capped?: boolean;\n /** The first section's normal is aligned to this vector, typically the start tangent of the smooth curve stroked for the centerline. */\n startTangent?: Vector3d;\n /** The last section's normal is aligned to this vector, typically the end tangent of the smooth curve stroked for the centerline. */\n endTangent?: Vector3d;\n}\n\n/**\n * Curve strokes plus start/end tangents.\n * @internal\n*/\ninterface SmoothCurveData {\n /** Samples along a curve. */\n strokes: IndexedXYZCollection;\n /** Start tangent (unnormalized). May be undefined if the curve is linear. */\n startTangent?: Vector3d;\n /** End tangent (unnormalized). May be undefined if the curve is linear. */\n endTangent?: Vector3d;\n};\n\n/**\n * The `CurveFactory` class contains methods for specialized curve constructions.\n * @public\n */\nexport class CurveFactory {\n /** (Cautiously) construct and save a line segment between fractional positions. */\n private static addPartialSegment(\n path: Path, allowBackup: boolean,\n pointA: Point3d | undefined, pointB: Point3d | undefined,\n fraction0: number, fraction1: number,\n ) {\n if (allowBackup || (fraction1 > fraction0)) {\n if (pointA !== undefined && pointB !== undefined && !Geometry.isAlmostEqualNumber(fraction0, fraction1))\n path.tryAddChild(LineSegment3d.create(pointA.interpolate(fraction0, pointB), pointA.interpolate(fraction1, pointB)));\n }\n }\n /**\n * Create a circular arc defined by start point, tangent at start point, and end point.\n * * The circular arc is swept from start to end toward direction of the `tangentAtStart`.\n * * If tangent is parallel to line segment from start to end, return `undefined`.\n */\n public static createArcPointTangentPoint(start: Point3d, tangentAtStart: Vector3d, end: Point3d): Arc3d | undefined {\n const ret = Arc3d.createCircularStartTangentEnd(start, tangentAtStart, end);\n if (ret instanceof Arc3d)\n return ret;\n else\n return undefined;\n }\n /**\n * Construct a sequence of alternating lines and arcs with the arcs creating tangent transition between consecutive edges.\n * * If the radius parameter is a number, that radius is used throughout.\n * * If the radius parameter is an array of numbers, `radius[i]` is applied at `point[i]`.\n * * Note that since no fillet is constructed at the initial or final point, those entries in `radius[]` are never referenced.\n * * A zero radius for any point indicates to leave the as a simple corner.\n * @param points point source\n * @param radius fillet radius or array of radii indexed to correspond to the points.\n * @param allowBackupAlongEdge true to allow edges to be created going \"backwards\" along edges if needed to create the blend.\n */\n public static createFilletsInLineString(\n points: LineString3d | IndexedXYZCollection | Point3d[],\n radius: number | number[],\n allowBackupAlongEdge: boolean = true,\n ): Path | undefined {\n if (Array.isArray(points))\n return this.createFilletsInLineString(new Point3dArrayCarrier(points), radius, allowBackupAlongEdge);\n if (points instanceof LineString3d)\n return this.createFilletsInLineString(points.packedPoints, radius, allowBackupAlongEdge);\n const n = points.length;\n if (n <= 1)\n return undefined;\n const pointA = points.getPoint3dAtCheckedPointIndex(0)!;\n const pointB = points.getPoint3dAtCheckedPointIndex(1)!;\n // remark: n=2 and n=3 cases should fall out from loop logic\n const blendArray: ArcBlendData[] = [];\n // build one-sided blends at each end . .\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointA.clone() });\n for (let i = 1; i + 1 < n; i++) {\n const pointC = points.getPoint3dAtCheckedPointIndex(i + 1)!;\n let thisRadius = 0;\n if (Array.isArray(radius)) {\n if (i < radius.length)\n thisRadius = radius[i];\n } else if (Number.isFinite(radius))\n thisRadius = radius;\n if (thisRadius !== 0.0)\n blendArray.push(Arc3d.createFilletArc(pointA, pointB, pointC, thisRadius));\n else\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointB.clone() });\n pointA.setFromPoint3d(pointB);\n pointB.setFromPoint3d(pointC);\n }\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointB.clone() });\n if (!allowBackupAlongEdge) {\n // suppress arcs that have overlap with both neighbors or flood either neighbor ..\n for (let i = 1; i + 1 < n; i++) {\n const b = blendArray[i];\n if (b.fraction10 > 1.0\n || b.fraction12 > 1.0\n || 1.0 - b.fraction10 < blendArray[i - 1].fraction12\n || b.fraction12 > 1.0 - blendArray[i + 1].fraction10) {\n b.fraction10 = 0.0;\n b.fraction12 = 0.0;\n blendArray[i].arc = undefined;\n }\n }\n /* The \"1-b\" logic above prevents this loop from ever doing anything.\n // on edge with conflict, suppress the arc with larger fraction\n for (let i = 1; i < n; i++) {\n const b0 = blendArray[i - 1];\n const b1 = blendArray[i];\n if (b0.fraction12 > 1 - b1.fraction10) {\n const b = b0.fraction12 > b1.fraction12 ? b1 : b0;\n b.fraction10 = 0.0;\n b.fraction12 = 0.0;\n blendArray[i].arc = undefined;\n }\n } */\n }\n const path = Path.create();\n this.addPartialSegment(\n path, allowBackupAlongEdge,\n blendArray[0].point, blendArray[1].point,\n blendArray[0].fraction12, 1.0 - blendArray[1].fraction10,\n );\n // add each path and successor edge ...\n for (let i = 1; i + 1 < points.length; i++) {\n const b0 = blendArray[i];\n const b1 = blendArray[i + 1];\n path.tryAddChild(b0.arc);\n this.addPartialSegment(path, allowBackupAlongEdge, b0.point, b1.point, b0.fraction12, 1.0 - b1.fraction10);\n }\n return path;\n }\n /**\n * Create a `Loop` with given xy corners and fixed z.\n * * The corners always proceed counter clockwise from lower left.\n * * If the radius is too large for the outer rectangle size, it is reduced to half of the the smaller x or y size.\n */\n public static createRectangleXY(\n x0: number, y0: number, x1: number, y1: number, z: number = 0, filletRadius?: number,\n ): Loop {\n let radius = Geometry.correctSmallMetricDistance(filletRadius);\n const xMin = Math.min(x0, x1);\n const xMax = Math.max(x0, x1);\n const yMin = Math.min(y0, y1);\n const yMax = Math.max(y0, y1);\n radius = Math.min(Math.abs(radius), 0.5 * (xMax - xMin), 0.5 * (yMax - yMin));\n if (radius === 0.0)\n return Loop.createPolygon([\n Point3d.create(xMin, yMin, z),\n Point3d.create(xMax, yMin, z),\n Point3d.create(xMax, yMax, z),\n Point3d.create(xMin, yMax, z),\n Point3d.create(xMin, yMin, z),\n ]);\n else {\n const vectorU = Vector3d.create(radius, 0, 0);\n const vectorV = Vector3d.create(0, radius, 0);\n const x0A = xMin + radius;\n const y0A = yMin + radius;\n const x1A = xMax - radius;\n const y1A = yMax - radius;\n const centers = [\n Point3d.create(x1A, y1A, z),\n Point3d.create(x0A, y1A, z),\n Point3d.create(x0A, y0A, z),\n Point3d.create(x1A, y0A, z),\n ];\n const loop = Loop.create();\n for (let i = 0; i < 4; i++) {\n const center = centers[i];\n const nextCenter = centers[(i + 1) % 4];\n const edgeVector = Vector3d.createStartEnd(center, nextCenter);\n const arc = Arc3d.create(center, vectorU, vectorV, AngleSweep.createStartEndDegrees(0, 90));\n loop.tryAddChild(arc);\n const arcEnd = arc.endPoint();\n if (!edgeVector.isAlmostZero)\n loop.tryAddChild(LineSegment3d.create(arcEnd, arcEnd.plus(edgeVector)));\n vectorU.rotate90CCWXY(vectorU);\n vectorV.rotate90CCWXY(vectorV);\n }\n return loop;\n }\n }\n /**\n * If `arcB` is a continuation of `arcA`, extend `arcA` (in place) to include the range of `arcB`\n * * This only succeeds if the two arcs are part of identical complete arcs and end of `arcA` matches the beginning of `arcB`.\n * @param arcA first arc, modified in place.\n * @param arcB second arc, unmodified.\n * @param allowReversed whether to consolidate even when second arc is reversed.\n * @returns whether `arcA` was modified.\n */\n public static appendToArcInPlace(arcA: Arc3d, arcB: Arc3d, allowReverse: boolean = false): boolean {\n if (arcA.center.isAlmostEqual(arcB.center)) {\n const sweepSign = Geometry.split3WaySign(arcA.sweep.sweepRadians * arcB.sweep.sweepRadians, -1, 0, 1);\n // evaluate derivatives wrt radians (not fraction!), but adjust direction for sweep signs\n const endA = arcA.angleToPointAndDerivative(arcA.sweep.fractionToAngle(1.0));\n if (arcA.sweep.sweepRadians < 0)\n endA.direction.scaleInPlace(-1.0);\n const startB = arcB.angleToPointAndDerivative(arcB.sweep.fractionToAngle(0.0));\n if (arcB.sweep.sweepRadians < 0)\n startB.direction.scaleInPlace(-1.0);\n if (endA.isAlmostEqual(startB)) {\n arcA.sweep.setStartEndRadians(\n arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians + sweepSign * arcB.sweep.sweepRadians,\n );\n return true;\n }\n // Also ok if negated tangent\n if (allowReverse) {\n startB.direction.scaleInPlace(-1.0);\n if (endA.isAlmostEqual(startB)) {\n arcA.sweep.setStartEndRadians(\n arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians - sweepSign * arcB.sweep.sweepRadians,\n );\n return true;\n }\n }\n }\n return false;\n }\n /**\n * Return a `Path` containing arcs are on the surface of an ellipsoid and pass through a sequence of points.\n * * Each arc passes through the two given endpoints and in the plane containing the true surface normal at\n * given `fractionForIntermediateNormal`\n * @param ellipsoid\n * @param pathPoints\n * @param fractionForIntermediateNormal fractional position for surface normal used to create the section plane.\n */\n public static assembleArcChainOnEllipsoid(\n ellipsoid: Ellipsoid, pathPoints: GeodesicPathPoint[], fractionForIntermediateNormal: number = 0.5,\n ): Path {\n const arcPath = Path.create();\n for (let i = 0; i + 1 < pathPoints.length; i++) {\n const arc = ellipsoid.sectionArcWithIntermediateNormal(\n pathPoints[i].toAngles(),\n fractionForIntermediateNormal,\n pathPoints[i + 1].toAngles());\n arcPath.tryAddChild(arc);\n }\n return arcPath;\n }\n private static appendGeometryQueryArray(candidate: GeometryQuery | GeometryQuery[] | undefined, result: GeometryQuery[]) {\n if (candidate instanceof GeometryQuery)\n result.push(candidate);\n else if (Array.isArray(candidate)) {\n for (const p of candidate)\n this.appendGeometryQueryArray(p, result);\n }\n }\n /**\n * Create solid primitives for pipe segments (e.g. Cone or TorusPipe) around line and arc primitives.\n * @param centerline centerline geometry.\n * @param pipeRadius radius of pipe.\n */\n public static createPipeSegments(\n centerline: CurvePrimitive | CurveChain, pipeRadius: number,\n ): GeometryQuery | GeometryQuery[] | undefined {\n if (centerline instanceof LineSegment3d) {\n return Cone.createAxisPoints(centerline.startPoint(), centerline.endPoint(), pipeRadius, pipeRadius, false);\n } else if (centerline instanceof Arc3d) {\n return TorusPipe.createAlongArc(centerline, pipeRadius, false);\n } else if (centerline instanceof CurvePrimitive) {\n const builder = PolyfaceBuilder.create();\n builder.addMiteredPipes(centerline, pipeRadius);\n return builder.claimPolyface();\n } else if (centerline instanceof CurveChain) {\n const result: GeometryQuery[] = [];\n for (const p of centerline.children) {\n const pipe = this.createPipeSegments(p, pipeRadius);\n this.appendGeometryQueryArray(pipe, result);\n }\n return result;\n }\n return undefined;\n }\n /** Get start point and tangent for variant curve data. */\n private static startPointAndTangent(curve: IndexedXYZCollection | Point3d[] | CurvePrimitive): Ray3d | undefined {\n if (curve instanceof CurvePrimitive)\n return curve.fractionToPointAndDerivative(0.0);\n if (curve.length < 2)\n return undefined;\n if (Array.isArray(curve))\n curve = new Point3dArrayCarrier(curve);\n const ray = Ray3d.createZero();\n curve.getPoint3dAtUncheckedPointIndex(0, ray.origin);\n curve.vectorIndexIndex(0, 1, ray.direction);\n return ray;\n };\n /** Create an [[Arc3d]] from `sectionData` that has its center at the start point of the centerline. */\n public static createArcFromSectionData(\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive, sectionData: number | XAndY | Arc3d,\n ): Arc3d | undefined {\n const ray = CurveFactory.startPointAndTangent(centerline);\n if (!ray)\n return undefined;\n let arc: Arc3d;\n if (sectionData instanceof Arc3d) {\n arc = sectionData.clone();\n arc.center = ray.origin;\n } else {\n const vector0 = Vector3d.create();\n const vector90 = Vector3d.create();\n const length0 = (typeof sectionData === \"number\") ? sectionData : sectionData.x;\n const length90 = (typeof sectionData === \"number\") ? sectionData : sectionData.y;\n const baseFrame = Matrix3d.createRigidHeadsUp(ray.direction, AxisOrder.ZXY);\n baseFrame.columnX(vector0).scaleInPlace(length0);\n baseFrame.columnY(vector90).scaleInPlace(length90);\n arc = Arc3d.create(ray.origin, vector0, vector90);\n }\n if (arc.binormalVector().dotProduct(ray.direction) < 0.0)\n arc.reverseInPlace();\n return arc;\n }\n /**\n * Create section arcs for mitered pipe.\n * * At the end of each pipe segment, the pipe is mitered by the plane that bisects the angle between successive\n * centerline segments.\n * * The section arcs are constructed so that lines between corresponding fractional positions on the arcs are\n * axial lines on the pipes.\n * * This means that the initial arc's vector0 and vector90 lengths and angular separation are _not_ preserved in\n * the section arcs.\n * * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis\n * lengths, or an Arc3d:\n * * For semi-axis length input, x and y correspond to ellipse local axes perpendicular to each other and to the\n * start tangent.\n * * For Arc3d input, the center is translated to the centerline start point. For best results, ensure this arc\n * is perpendicular to the centerline start tangent.\n * * This function internally calls [[createMiteredSweepSections]] with default options.\n * @param centerline centerline of pipe. For best results, ensure no successive duplicate points with e.g.,\n * [[GrowableXYZArray.createCompressed]].\n * @param sectionData circle radius, ellipse semi-axis lengths, or full Arc3d (if not full, function makes it full).\n * @returns array of sections or empty array if section creation failed.\n */\n public static createMiteredPipeSections(centerline: IndexedXYZCollection, sectionData: number | XAndY | Arc3d): Arc3d[] {\n const arc = CurveFactory.createArcFromSectionData(centerline, sectionData);\n if (!arc)\n return [];\n const miteredSweeps = CurveFactory.createMiteredSweepSections(centerline, arc);\n if (miteredSweeps)\n return miteredSweeps.sections as Arc3d[];\n return [];\n }\n\n /** For a smooth curve, stroke and return unnormalized start/end tangents. */\n private static strokeSmoothCurve(\n curve: IndexedXYZCollection | Point3d[] | CurvePrimitive | CurveChain,\n options?: StrokeOptions,\n ): SmoothCurveData | undefined {\n let startTangent, endTangent: Vector3d | undefined;\n if (curve instanceof CurvePrimitive) {\n startTangent = curve.fractionToPointAndDerivative(0.0).direction;\n endTangent = curve.fractionToPointAndDerivative(1.0).direction;\n const strokes = LineString3d.create();\n curve.emitStrokes(strokes, options);\n curve = strokes.packedPoints;\n } else if (curve instanceof CurveChain) {\n startTangent = curve.startPointAndDerivative()?.direction;\n endTangent = curve.endPointAndDerivative()?.direction;\n const strokes = curve.getPackedStrokes(options);\n if (!strokes)\n return undefined;\n curve = strokes;\n } else if (Array.isArray(curve))\n curve = new Point3dArrayCarrier(curve);\n return { strokes: curve, startTangent, endTangent };\n }\n\n /**\n * Align two bisector plane normals to given smooth rail tangents or optional overrides.\n * * Optionally average the normals for physically closed rail.\n */\n private static alignFirstAndLastBisectorPlanes(\n firstPlane: Plane3dByOriginAndUnitNormal,\n lastPlane: Plane3dByOriginAndUnitNormal,\n smoothRailData?: SmoothCurveData,\n options?: MiteredSweepOptions,\n ) {\n const normal0 = options?.startTangent ?? (smoothRailData?.startTangent ?? firstPlane.getNormalRef());\n const normal1 = options?.endTangent ?? (smoothRailData?.endTangent ?? lastPlane.getNormalRef());\n if (options?.wrapIfPhysicallyClosed && firstPlane.getOriginRef().isAlmostEqual(lastPlane.getOriginRef())) {\n const avgNormal = normal0.plus(normal1);\n if (avgNormal.tryNormalizeInPlace()) { // ignore cusp at seam\n firstPlane.getNormalRef().setFrom(avgNormal);\n lastPlane.getNormalRef().setFrom(avgNormal);\n return;\n }\n }\n if (normal0.tryNormalizeInPlace())\n firstPlane.getNormalRef().setFrom(normal0);\n if (normal1.tryNormalizeInPlace())\n lastPlane.getNormalRef().setFrom(normal1);\n }\n\n /** Reverse a closed curve or region if necessary so that its orientation is CCW with respect to the plane normal. */\n private static alignClosedCurveToPlane(curve: AnyCurve, planeNormal: Vector3d) {\n let closedCurve: AnyRegion | undefined;\n if (curve instanceof CurvePrimitive) {\n if (curve.startPoint().isAlmostEqual(curve.endPoint()))\n closedCurve = Loop.create(curve);\n } else if (curve.isAnyRegion())\n closedCurve = curve;\n if (closedCurve) {\n // The alignment condition is equivalent to positive projected curve area computed wrt to the plane normal.\n const toLocal = Matrix3d.createRigidHeadsUp(planeNormal).transpose();\n const projection = closedCurve.cloneTransformed(Transform.createOriginAndMatrix(undefined, toLocal));\n if (projection) { // now we can ignore z-coords\n const areaXY = RegionOps.computeXYArea(projection as AnyRegion);\n if (areaXY && areaXY < 0)\n curve.reverseInPlace();\n }\n }\n }\n\n /**\n * Projection to target plane, constructing sweep direction from two given planes.\n * * If successful, push the target plane and swept section to the output arrays and return the swept section.\n * * If unsuccessful, leave the output arrays alone and return the input section.\n */\n private static doSweepToPlane(\n output: SectionSequenceWithPlanes,\n edgePlane0: Plane3dByOriginAndUnitNormal,\n edgePlane1: Plane3dByOriginAndUnitNormal,\n targetPlane: Plane3dByOriginAndUnitNormal,\n section: AnyCurve,\n ): AnyCurve {\n const sweepVector = Vector3d.createStartEnd(edgePlane0.getOriginRef(), edgePlane1.getOriginRef());\n const transform = Transform.createFlattenAlongVectorToPlane(\n sweepVector, targetPlane.getOriginRef(), targetPlane.getNormalRef(),\n );\n if (transform === undefined)\n return section;\n const transformedSection = section.cloneTransformed(transform);\n if (transformedSection === undefined)\n return section;\n output.planes.push(targetPlane);\n output.sections.push(transformedSection);\n return transformedSection;\n }\n\n /**\n * Sweep the `initialSection` along each segment of the (stroked) `centerline` until it hits the bisector plane at\n * the next vertex.\n * * For best results, the caller should place `initialSection` in a plane perpendicular to the `centerline`\n * start tangent.\n * * This plane is commonly (but not necessarily) through the centerline start point itself.\n * * To compute the sections, `initialSection` is projected in the direction of the centerline start tangent onto\n * the first bisector plane at the centerline start. The result of this projection will be likewise projected onto\n * the second plane, and so on in sequence.\n * * By default, the first/last bisector plane normals are set to the centerline start/end tangents. The caller can\n * override these with tangents supplied in `options`. If the centerline is physically closed and\n * `options.wrapIfPhysicallyClosed` is true, the first and last plane normals are averaged and equated.\n * * The centerline path does NOT have to be planar, however non-planarity will result in twisting of the sections\n * in the bisector planes.\n * @param centerline sweep path. Will be stroked if smooth.\n * @param initialSection profile curve to be swept. As noted above, this should be on a plane perpendicular to the\n * centerline start tangent.\n * @param options options for computation and output.\n * @return array of sections, formed from projecting `initialSection` successively onto the bisector planes.\n */\n public static createMiteredSweepSections(\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive | CurveChain,\n initialSection: AnyCurve,\n options?: MiteredSweepOptions,\n ): SectionSequenceWithPlanes | undefined {\n if (!options)\n options = {};\n const rail = this.strokeSmoothCurve(centerline, options.strokeOptions);\n if (!rail)\n return undefined;\n const planes = PolylineOps.createBisectorPlanesForDistinctPoints(rail.strokes);\n if (!planes || planes.length < 2)\n return undefined;\n this.alignFirstAndLastBisectorPlanes(planes[0], planes[planes.length - 1], rail, options);\n\n // RuledSweep facet construction assumes the contours are oriented CCW with respect to the sweep direction so that\n // facet normals point outward. We only have to align the first contour; the rest will inherit its orientation.\n this.alignClosedCurveToPlane(initialSection, planes[0].getNormalRef());\n\n const sectionData: SectionSequenceWithPlanes = { sections: [], planes: [] };\n let currentSection = this.doSweepToPlane(sectionData, planes[0], planes[1], planes[0], initialSection);\n for (let i = 1; i < planes.length; i++)\n currentSection = this.doSweepToPlane(sectionData, planes[i - 1], planes[i], planes[i], currentSection);\n\n if (options.outputSelect) {\n const ruledSweep = RuledSweep.create(sectionData.sections, options.capped ?? false);\n if (ruledSweep) {\n sectionData.ruledSweep = ruledSweep;\n if (MiteredSweepOutputSelect.AlsoMesh === options.outputSelect) {\n const builder = PolyfaceBuilder.create(options.strokeOptions);\n builder.addRuledSweep(ruledSweep);\n sectionData.mesh = builder.claimPolyface();\n }\n }\n }\n return sectionData;\n }\n /**\n * Create a circular arc from start point, tangent at start, radius, optional plane normal, arc sweep.\n * * The vector from start point to center is in the direction of upVector crossed with tangentA.\n * @param start start point.\n * @param tangentAtStart vector in tangent direction at the start.\n * @param radius signed radius.\n * @param upVector optional out-of-plane vector. Defaults to positive Z.\n * @param sweep angular range. If single `Angle` is given, start angle is at 0 degrees (the start point).\n */\n public static createArcPointTangentRadius(\n start: Point3d, tangentAtStart: Vector3d, radius: number, upVector?: Vector3d, sweep?: Angle | AngleSweep,\n ): Arc3d | undefined {\n return Arc3d.createCircularStartTangentRadius(start, tangentAtStart, radius, upVector, sweep);\n }\n /**\n * Compute 2 spirals (all in XY) for a symmetric line-to-line transition.\n * * First spiral begins at given start point.\n * * first tangent aims at shoulder.\n * * outbound spiral joins line from shoulder to target.\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param startPoint inbound start point.\n * @param shoulder point target point for (both) spiral-to-line tangencies.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralSpiralLine(\n spiralType: IntegratedSpiralTypeName,\n startPoint: Point3d,\n shoulderPoint: Point3d,\n targetPoint: Point3d,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(startPoint, shoulderPoint);\n const vectorBC0 = Vector3d.createStartEnd(shoulderPoint, targetPoint);\n const referenceLength = vectorAB.magnitude();\n const radiansAB = Math.atan2(vectorAB.y, vectorAB.x);\n const lineTurnRadians = vectorAB.angleToXY(vectorBC0);\n const spiralTurnRadians = 0.5 * lineTurnRadians.radians;\n const radiansBC = radiansAB + lineTurnRadians.radians;\n const axesA = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansAB));\n const frameA = Transform.createRefs(startPoint.clone(), axesA);\n // We know how much it has to turn, and but not the length or end radius.\n // make a spiral of referenceLength and scale it back to the junction line\n const spiralARefLength = IntegratedSpiral3d.createFrom4OutOf5(spiralType, 0.0, undefined,\n Angle.createRadians(0), Angle.createRadians(spiralTurnRadians), referenceLength, undefined, frameA);\n if (spiralARefLength) {\n const midPlanePerpendicularRadians = radiansAB + spiralTurnRadians;\n const midPlanePerpendicularVector = Vector3d.createPolar(1.0, Angle.createRadians(midPlanePerpendicularRadians));\n const altitudeB = midPlanePerpendicularVector.dotProductStartEnd(startPoint, shoulderPoint);\n const altitudeSpiralEnd = midPlanePerpendicularVector.dotProductStartEnd(startPoint, spiralARefLength.endPoint());\n const scaleFactor = altitudeB / altitudeSpiralEnd;\n const spiralA = IntegratedSpiral3d.createFrom4OutOf5(spiralType, 0.0, undefined,\n Angle.createRadians(0), Angle.createRadians(spiralTurnRadians), referenceLength * scaleFactor, undefined, frameA)!;\n const distanceAB = vectorAB.magnitude();\n const vectorBC = Vector3d.createStartEnd(shoulderPoint, targetPoint);\n vectorBC.scaleToLength(distanceAB, vectorBC);\n const pointC = shoulderPoint.plus(vectorBC);\n const axesC = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansBC + Math.PI));\n const frameC = Transform.createRefs(pointC, axesC);\n const spiralC = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, -spiralA.radius01.x1, Angle.zero(), undefined, spiralA.curveLength(), Segment1d.create(1, 0), frameC)!;\n return [spiralA, spiralC];\n }\n return undefined;\n }\n /**\n * Compute 2 spirals (all in XY) for a symmetric line-to-line transition.\n * * Spiral length is given.\n * * tangency points float on both lines.\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param pointA inbound start point.\n * @param shoulder point target point for (both) spiral-to-line tangencies.\n * @param spiralLength for each part of the spiral pair.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralSpiralLineWithSpiralLength(\n spiralType: IntegratedSpiralTypeName,\n pointA: Point3d,\n pointB: Point3d,\n pointC: Point3d,\n spiralLength: number,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(pointA, pointB);\n const vectorBC = Vector3d.createStartEnd(pointB, pointC);\n const radiansAB = Math.atan2(vectorAB.y, vectorAB.x);\n const lineTurnAngle = vectorAB.angleToXY(vectorBC);\n const spiralTurnRadians = 0.5 * lineTurnAngle.radians;\n const bisectorRadians = 0.5 * (Math.PI - lineTurnAngle.radians);\n const radiansCB = Math.atan2(-vectorBC.y, -vectorBC.x);\n const spiralAB0 = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(spiralTurnRadians),\n spiralLength, undefined, Transform.createIdentity(),\n );\n if (spiralAB0) {\n const localEndPoint = spiralAB0.fractionToPoint(1);\n const distanceAB = pointA.distance(pointB);\n const distanceCB = pointC.distance(pointB);\n // The spiral eventually has to end on the bisector, at localEndPoint.y height from the inbound line\n // distance from shoulder to projection of that point to point E on the inbound line is\n const distanceBE = localEndPoint.y / Math.tan(bisectorRadians);\n const xFractionAB = Geometry.conditionalDivideFraction(distanceAB - distanceBE - localEndPoint.x, distanceAB);\n const xFractionCB = Geometry.conditionalDivideFraction(distanceCB - distanceBE - localEndPoint.x, distanceCB);\n if (xFractionAB !== undefined && xFractionCB !== undefined) {\n const axesA = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansAB));\n const frameAOrigin = pointA.interpolate(xFractionAB, pointB);\n const frameA = Transform.createRefs(frameAOrigin, axesA);\n const spiralAB = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(spiralTurnRadians),\n spiralLength, undefined, frameA,\n )!;\n const axesB = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansCB));\n const frameBOrigin = pointC.interpolate(xFractionCB, pointB);\n const frameB = Transform.createRefs(frameBOrigin, axesB);\n const spiralBC = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(-spiralTurnRadians),\n spiralLength, undefined, frameB,\n )!;\n return [spiralAB, spiralBC];\n }\n }\n return undefined;\n }\n /**\n * Compute 2 spirals and an arc (all in XY) for a symmetric line-to-line transition.\n * Spiral lengths and arc radius are given (e.g., from design speed standards).\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param pointA inbound start point.\n * @param pointB shoulder (target) point for (both) spiral-to-line tangencies.\n * @param lengthA inbound spiral length.\n * @param lengthB outbound spiral length.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralArcSpiralLine(\n spiralType: IntegratedSpiralTypeName,\n pointA: Point3d,\n pointB: Point3d,\n pointC: Point3d,\n lengthA: number,\n lengthB: number,\n arcRadius: number,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(pointA, pointB); vectorAB.z = 0;\n const vectorCB = Vector3d.createStartEnd(pointC, pointB); vectorCB.z = 0;\n const unitAB = vectorAB.normalize();\n const unitCB = vectorCB.normalize();\n if (unitAB === undefined || unitCB === undefined)\n return undefined;\n const unitPerpAB = unitAB.unitPerpendicularXY();\n const unitPerpCB = unitCB.unitPerpendicularXY();\n const thetaABC = vectorAB.angleToXY(vectorCB);\n const sideA = Geometry.split3WaySign(thetaABC.radians, 1, -1, -1);\n const sideB = - sideA;\n const radiusA = sideA * Math.abs(arcRadius);\n const radiusB = sideB * Math.abs(arcRadius);\n const spiralA = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, radiusA, Angle.zero(), undefined, lengthA, undefined, Transform.createIdentity())!;\n const spiralB = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, radiusB, Angle.zero(), undefined, lengthB, undefined, Transform.createIdentity())!;\n const spiralEndA = spiralA.fractionToPointAndUnitTangent(1.0);\n const spiralEndB = spiralB.fractionToPointAndUnitTangent(1.0);\n // From the end of spiral, step away to arc center (and this is in local coordinates of each spiral)\n const sA = spiralEndA.origin.x - radiusA * spiralEndA.direction.y;\n const tA = spiralEndA.origin.y + radiusA * spiralEndA.direction.x;\n const sB = spiralEndB.origin.x - radiusB * spiralEndB.direction.y;\n const tB = spiralEndB.origin.y + radiusB * spiralEndB.direction.x;\n // Those local coordinates are rotated to unitAB and unitBC ...\n const vectorA = Vector3d.createAdd2Scaled(unitAB, sA, unitPerpAB, tA);\n const vectorB = Vector3d.createAdd2Scaled(unitCB, sB, unitPerpCB, tB);\n const uv = Vector2d.create();\n if (SmallSystem.linearSystem2d(\n unitAB.x, -unitCB.x,\n unitAB.y, -unitCB.y,\n vectorB.x - vectorA.x, vectorB.y - vectorA.y, uv)) {\n const tangencyAB = pointB.plusScaled(unitAB, uv.x);\n const tangencyCB = pointB.plusScaled(unitCB, uv.y);\n const frameA = Transform.createOriginAndMatrixColumns(tangencyAB, unitAB, unitPerpAB, Vector3d.unitZ());\n const frameB = Transform.createOriginAndMatrixColumns(tangencyCB, unitCB, unitPerpCB, Vector3d.unitZ());\n spiralA.tryTransformInPlace(frameA);\n spiralB.tryTransformInPlace(frameB);\n const rayA1 = spiralA.fractionToPointAndUnitTangent(1.0);\n const rayB0 = spiralB.fractionToPointAndUnitTangent(1.0);\n rayB0.direction.scaleInPlace(-1.0);\n const sweep = rayA1.direction.angleToXY(rayB0.direction);\n if (radiusA < 0)\n sweep.setRadians(- sweep.radians);\n const arc = CurveFactory.createArcPointTangentRadius(rayA1.origin, rayA1.direction, radiusA, undefined, sweep)!;\n return [spiralA, arc, spiralB];\n }\n return undefined;\n }\n /** Return the intersection point of 3 planes. */\n public static planePlaneIntersectionRay(\n planeA: PlaneAltitudeEvaluator, planeB: PlaneAltitudeEvaluator): Ray3d | undefined {\n const altitudeA = planeA.altitudeXYZ(0, 0, 0);\n const altitudeB = planeB.altitudeXYZ(0, 0, 0);\n const normalAx = planeA.normalX();\n const normalAy = planeA.normalY();\n const normalAz = planeA.normalZ();\n const normalBx = planeB.normalX();\n const normalBy = planeB.normalY();\n const normalBz = planeB.normalZ();\n const normalCx = Geometry.crossProductXYXY(normalAy, normalAz, normalBy, normalBz);\n const normalCy = Geometry.crossProductXYXY(normalAz, normalAx, normalBz, normalBx);\n const normalCz = Geometry.crossProductXYXY(normalAx, normalAy, normalBx, normalBy);\n const rayOrigin = SmallSystem.linearSystem3d(\n normalAx, normalAy, normalAz,\n normalBx, normalBy, normalBz,\n normalCx, normalCy, normalCz,\n -altitudeA, -altitudeB, 0.0);\n if (rayOrigin !== undefined) {\n return Ray3d.createXYZUVW(rayOrigin.x, rayOrigin.y, rayOrigin.z, normalCx, normalCy, normalCz);\n }\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CurveFactory.js","sourceRoot":"","sources":["../../../src/curve/CurveFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { AxisIndex, AxisOrder, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\nimport { Ellipsoid, GeodesicPathPoint } from \"../geometry3d/Ellipsoid\";\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { PolylineOps } from \"../geometry3d/PolylineOps\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Segment1d } from \"../geometry3d/Segment1d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XAndY } from \"../geometry3d/XYZProps\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { IndexedPolyface } from \"../polyface/Polyface\";\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\nimport { Cone } from \"../solid/Cone\";\nimport { RuledSweep } from \"../solid/RuledSweep\";\nimport { TorusPipe } from \"../solid/TorusPipe\";\nimport { Arc3d, ArcBlendData } from \"./Arc3d\";\nimport { CurveChain } from \"./CurveCollection\";\nimport { CurvePrimitive } from \"./CurvePrimitive\";\nimport { AnyCurve, AnyRegion } from \"./CurveTypes\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { LineString3d } from \"./LineString3d\";\nimport { Loop } from \"./Loop\";\nimport { Path } from \"./Path\";\nimport { RegionOps } from \"./RegionOps\";\nimport { IntegratedSpiral3d } from \"./spiral/IntegratedSpiral3d\";\nimport { IntegratedSpiralTypeName } from \"./spiral/TransitionSpiral3d\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\n/**\n * Interface to carry parallel arrays of planes and sections, and optional geometry assembled from them,\n * as returned by [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport interface SectionSequenceWithPlanes {\n /** The plane of each section. */\n planes: Plane3dByOriginAndUnitNormal[];\n /** Section curve projected onto the corresponding plane. */\n sections: AnyCurve[];\n /**\n * Optional `RuledSweep` generated from the sections.\n * * The `RuledSweep` and sections array refer to the same section objects.\n */\n ruledSweep?: RuledSweep;\n /** Optional mesh generated from the `RuledSweep` generated from the sections. */\n mesh?: IndexedPolyface;\n}\n\n/**\n * Enumeration of geometric output for [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport enum MiteredSweepOutputSelect {\n /** Output only the parallel arrays of planes and sections. */\n Sections = 0,\n /** Output planes and sections, as well as the assembled ruled sweep. */\n AlsoRuledSweep = 1,\n /** Output planes and sections, as well as the assembled ruled sweep and its stroked mesh. */\n AlsoMesh = 2,\n}\n\n/**\n * Interface bundling options for [CurveFactory.createMiteredSweepSections].\n * @public\n */\nexport interface MiteredSweepOptions {\n /** Whether first and last planes are averaged and equated when the centerline is physically closed. Default value is `false`. */\n wrapIfPhysicallyClosed?: boolean;\n /** Whether to output sections only, or sections plus optional geometry constructed from them. Default value is `MiteredSweepOutputSelect.Sections`. */\n outputSelect?: MiteredSweepOutputSelect;\n /** How to stroke smooth input curves. If undefined, default stroke options are used. */\n strokeOptions?: StrokeOptions;\n /** Whether to cap the ruled sweep if outputting a ruled sweep or mesh. Default value is `false`. */\n capped?: boolean;\n /** The first section's normal is aligned to this vector, typically the start tangent of the smooth curve stroked for the centerline. */\n startTangent?: Vector3d;\n /** The last section's normal is aligned to this vector, typically the end tangent of the smooth curve stroked for the centerline. */\n endTangent?: Vector3d;\n}\n\n/**\n * Curve strokes plus start/end tangents.\n * @internal\n*/\ninterface SmoothCurveData {\n /** Samples along a curve. */\n strokes: IndexedXYZCollection;\n /** Start tangent (unnormalized). May be undefined if the curve is linear. */\n startTangent?: Vector3d;\n /** End tangent (unnormalized). May be undefined if the curve is linear. */\n endTangent?: Vector3d;\n};\n\n/**\n * The `CurveFactory` class contains methods for specialized curve constructions.\n * @public\n */\nexport class CurveFactory {\n /** (Cautiously) construct and save a line segment between fractional positions. */\n private static addPartialSegment(\n path: Path, allowBackup: boolean,\n pointA: Point3d | undefined, pointB: Point3d | undefined,\n fraction0: number, fraction1: number,\n ) {\n if (allowBackup || (fraction1 > fraction0)) {\n if (pointA !== undefined && pointB !== undefined && !Geometry.isAlmostEqualNumber(fraction0, fraction1))\n path.tryAddChild(LineSegment3d.create(pointA.interpolate(fraction0, pointB), pointA.interpolate(fraction1, pointB)));\n }\n }\n /**\n * Create a circular arc defined by start point, tangent at start point, and end point.\n * * The circular arc is swept from start to end toward direction of the `tangentAtStart`.\n * * If tangent is parallel to line segment from start to end, return `undefined`.\n */\n public static createArcPointTangentPoint(start: Point3d, tangentAtStart: Vector3d, end: Point3d): Arc3d | undefined {\n const ret = Arc3d.createCircularStartTangentEnd(start, tangentAtStart, end);\n if (ret instanceof Arc3d)\n return ret;\n else\n return undefined;\n }\n /**\n * Construct a sequence of alternating lines and arcs with the arcs creating tangent transition between consecutive edges.\n * * If the radius parameter is a number, that radius is used throughout.\n * * If the radius parameter is an array of numbers, `radius[i]` is applied at `point[i]`.\n * * Note that since no fillet is constructed at the initial or final point, those entries in `radius[]` are never referenced.\n * * A zero radius for any point indicates to leave the as a simple corner.\n * @param points point source\n * @param radius fillet radius or array of radii indexed to correspond to the points.\n * @param allowBackupAlongEdge true to allow edges to be created going \"backwards\" along edges if needed to create the blend.\n */\n public static createFilletsInLineString(\n points: LineString3d | IndexedXYZCollection | Point3d[],\n radius: number | number[],\n allowBackupAlongEdge: boolean = true,\n ): Path | undefined {\n if (Array.isArray(points))\n return this.createFilletsInLineString(new Point3dArrayCarrier(points), radius, allowBackupAlongEdge);\n if (points instanceof LineString3d)\n return this.createFilletsInLineString(points.packedPoints, radius, allowBackupAlongEdge);\n const n = points.length;\n if (n <= 1)\n return undefined;\n const pointA = points.getPoint3dAtCheckedPointIndex(0)!;\n const pointB = points.getPoint3dAtCheckedPointIndex(1)!;\n // remark: n=2 and n=3 cases should fall out from loop logic\n const blendArray: ArcBlendData[] = [];\n // build one-sided blends at each end . .\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointA.clone() });\n for (let i = 1; i + 1 < n; i++) {\n const pointC = points.getPoint3dAtCheckedPointIndex(i + 1)!;\n let thisRadius = 0;\n if (Array.isArray(radius)) {\n if (i < radius.length)\n thisRadius = radius[i];\n } else if (Number.isFinite(radius))\n thisRadius = radius;\n if (thisRadius !== 0.0)\n blendArray.push(Arc3d.createFilletArc(pointA, pointB, pointC, thisRadius));\n else\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointB.clone() });\n pointA.setFromPoint3d(pointB);\n pointB.setFromPoint3d(pointC);\n }\n blendArray.push({ fraction10: 0.0, fraction12: 0.0, point: pointB.clone() });\n if (!allowBackupAlongEdge) {\n // suppress arcs that have overlap with both neighbors or flood either neighbor ..\n for (let i = 1; i + 1 < n; i++) {\n const b = blendArray[i];\n if (b.fraction10 > 1.0\n || b.fraction12 > 1.0\n || 1.0 - b.fraction10 < blendArray[i - 1].fraction12\n || b.fraction12 > 1.0 - blendArray[i + 1].fraction10) {\n b.fraction10 = 0.0;\n b.fraction12 = 0.0;\n blendArray[i].arc = undefined;\n }\n }\n /* The \"1-b\" logic above prevents this loop from ever doing anything.\n // on edge with conflict, suppress the arc with larger fraction\n for (let i = 1; i < n; i++) {\n const b0 = blendArray[i - 1];\n const b1 = blendArray[i];\n if (b0.fraction12 > 1 - b1.fraction10) {\n const b = b0.fraction12 > b1.fraction12 ? b1 : b0;\n b.fraction10 = 0.0;\n b.fraction12 = 0.0;\n blendArray[i].arc = undefined;\n }\n } */\n }\n const path = Path.create();\n this.addPartialSegment(\n path, allowBackupAlongEdge,\n blendArray[0].point, blendArray[1].point,\n blendArray[0].fraction12, 1.0 - blendArray[1].fraction10,\n );\n // add each path and successor edge ...\n for (let i = 1; i + 1 < points.length; i++) {\n const b0 = blendArray[i];\n const b1 = blendArray[i + 1];\n path.tryAddChild(b0.arc);\n this.addPartialSegment(path, allowBackupAlongEdge, b0.point, b1.point, b0.fraction12, 1.0 - b1.fraction10);\n }\n return path;\n }\n /**\n * Create a `Loop` with given xy corners and fixed z.\n * * The corners always proceed counter clockwise from lower left.\n * * If the radius is too large for the outer rectangle size, it is reduced to half of the the smaller x or y size.\n */\n public static createRectangleXY(\n x0: number, y0: number, x1: number, y1: number, z: number = 0, filletRadius?: number,\n ): Loop {\n let radius = Geometry.correctSmallMetricDistance(filletRadius);\n const xMin = Math.min(x0, x1);\n const xMax = Math.max(x0, x1);\n const yMin = Math.min(y0, y1);\n const yMax = Math.max(y0, y1);\n radius = Math.min(Math.abs(radius), 0.5 * (xMax - xMin), 0.5 * (yMax - yMin));\n if (radius === 0.0)\n return Loop.createPolygon([\n Point3d.create(xMin, yMin, z),\n Point3d.create(xMax, yMin, z),\n Point3d.create(xMax, yMax, z),\n Point3d.create(xMin, yMax, z),\n Point3d.create(xMin, yMin, z),\n ]);\n else {\n const vectorU = Vector3d.create(radius, 0, 0);\n const vectorV = Vector3d.create(0, radius, 0);\n const x0A = xMin + radius;\n const y0A = yMin + radius;\n const x1A = xMax - radius;\n const y1A = yMax - radius;\n const centers = [\n Point3d.create(x1A, y1A, z),\n Point3d.create(x0A, y1A, z),\n Point3d.create(x0A, y0A, z),\n Point3d.create(x1A, y0A, z),\n ];\n const loop = Loop.create();\n for (let i = 0; i < 4; i++) {\n const center = centers[i];\n const nextCenter = centers[(i + 1) % 4];\n const edgeVector = Vector3d.createStartEnd(center, nextCenter);\n const arc = Arc3d.create(center, vectorU, vectorV, AngleSweep.createStartEndDegrees(0, 90));\n loop.tryAddChild(arc);\n const arcEnd = arc.endPoint();\n if (!edgeVector.isAlmostZero)\n loop.tryAddChild(LineSegment3d.create(arcEnd, arcEnd.plus(edgeVector)));\n vectorU.rotate90CCWXY(vectorU);\n vectorV.rotate90CCWXY(vectorV);\n }\n return loop;\n }\n }\n /**\n * If `arcB` is a continuation of `arcA`, extend `arcA` (in place) to include the range of `arcB`\n * * This only succeeds if the two arcs are part of identical complete arcs and end of `arcA` matches the beginning of `arcB`.\n * @param arcA first arc, modified in place.\n * @param arcB second arc, unmodified.\n * @param allowReversed whether to consolidate even when second arc is reversed (default is `false`).\n * @param tolerance optional coordinate tolerance for point equality (default is `Geometry.smallMetricDistance`).\n * @returns whether `arcA` was modified.\n */\n public static appendToArcInPlace(arcA: Arc3d, arcB: Arc3d, allowReverse: boolean = false, tolerance: number = Geometry.smallMetricDistance): boolean {\n if (arcA.center.isAlmostEqual(arcB.center, tolerance)) {\n const sweepSign = Geometry.split3WaySign(arcA.sweep.sweepRadians * arcB.sweep.sweepRadians, -1, 0, 1);\n // evaluate derivatives wrt radians (not fraction!), but adjust direction for sweep signs\n const endA = arcA.angleToPointAndDerivative(arcA.sweep.fractionToAngle(1.0));\n if (arcA.sweep.sweepRadians < 0)\n endA.direction.scaleInPlace(-1.0);\n const startB = arcB.angleToPointAndDerivative(arcB.sweep.fractionToAngle(0.0));\n if (arcB.sweep.sweepRadians < 0)\n startB.direction.scaleInPlace(-1.0);\n if (endA.isAlmostEqual(startB, tolerance)) {\n arcA.sweep.setStartEndRadians(\n arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians + sweepSign * arcB.sweep.sweepRadians,\n );\n return true;\n }\n // Also ok if negated tangent\n if (allowReverse) {\n startB.direction.scaleInPlace(-1.0);\n if (endA.isAlmostEqual(startB, tolerance)) {\n arcA.sweep.setStartEndRadians(\n arcA.sweep.startRadians, arcA.sweep.startRadians + arcA.sweep.sweepRadians - sweepSign * arcB.sweep.sweepRadians,\n );\n return true;\n }\n }\n }\n return false;\n }\n /**\n * Return a `Path` containing arcs are on the surface of an ellipsoid and pass through a sequence of points.\n * * Each arc passes through the two given endpoints and in the plane containing the true surface normal at\n * given `fractionForIntermediateNormal`\n * @param ellipsoid\n * @param pathPoints\n * @param fractionForIntermediateNormal fractional position for surface normal used to create the section plane.\n */\n public static assembleArcChainOnEllipsoid(\n ellipsoid: Ellipsoid, pathPoints: GeodesicPathPoint[], fractionForIntermediateNormal: number = 0.5,\n ): Path {\n const arcPath = Path.create();\n for (let i = 0; i + 1 < pathPoints.length; i++) {\n const arc = ellipsoid.sectionArcWithIntermediateNormal(\n pathPoints[i].toAngles(),\n fractionForIntermediateNormal,\n pathPoints[i + 1].toAngles());\n arcPath.tryAddChild(arc);\n }\n return arcPath;\n }\n private static appendGeometryQueryArray(candidate: GeometryQuery | GeometryQuery[] | undefined, result: GeometryQuery[]) {\n if (candidate instanceof GeometryQuery)\n result.push(candidate);\n else if (Array.isArray(candidate)) {\n for (const p of candidate)\n this.appendGeometryQueryArray(p, result);\n }\n }\n /**\n * Create solid primitives for pipe segments (e.g. Cone or TorusPipe) around line and arc primitives.\n * @param centerline centerline geometry.\n * @param pipeRadius radius of pipe.\n */\n public static createPipeSegments(\n centerline: CurvePrimitive | CurveChain, pipeRadius: number,\n ): GeometryQuery | GeometryQuery[] | undefined {\n if (centerline instanceof LineSegment3d) {\n return Cone.createAxisPoints(centerline.startPoint(), centerline.endPoint(), pipeRadius, pipeRadius, false);\n } else if (centerline instanceof Arc3d) {\n return TorusPipe.createAlongArc(centerline, pipeRadius, false);\n } else if (centerline instanceof CurvePrimitive) {\n const builder = PolyfaceBuilder.create();\n builder.addMiteredPipes(centerline, pipeRadius);\n return builder.claimPolyface();\n } else if (centerline instanceof CurveChain) {\n const result: GeometryQuery[] = [];\n for (const p of centerline.children) {\n const pipe = this.createPipeSegments(p, pipeRadius);\n this.appendGeometryQueryArray(pipe, result);\n }\n return result;\n }\n return undefined;\n }\n /** Get start point and tangent for variant curve data. */\n private static startPointAndTangent(curve: IndexedXYZCollection | Point3d[] | CurvePrimitive): Ray3d | undefined {\n if (curve instanceof CurvePrimitive)\n return curve.fractionToPointAndDerivative(0.0);\n if (curve.length < 2)\n return undefined;\n if (Array.isArray(curve))\n curve = new Point3dArrayCarrier(curve);\n const ray = Ray3d.createZero();\n curve.getPoint3dAtUncheckedPointIndex(0, ray.origin);\n curve.vectorIndexIndex(0, 1, ray.direction);\n return ray;\n };\n /** Create an [[Arc3d]] from `sectionData` that has its center at the start point of the centerline. */\n public static createArcFromSectionData(\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive, sectionData: number | XAndY | Arc3d,\n ): Arc3d | undefined {\n const ray = CurveFactory.startPointAndTangent(centerline);\n if (!ray)\n return undefined;\n let arc: Arc3d;\n if (sectionData instanceof Arc3d) {\n arc = sectionData.clone();\n arc.center = ray.origin;\n } else {\n const vector0 = Vector3d.create();\n const vector90 = Vector3d.create();\n const length0 = (typeof sectionData === \"number\") ? sectionData : sectionData.x;\n const length90 = (typeof sectionData === \"number\") ? sectionData : sectionData.y;\n const baseFrame = Matrix3d.createRigidHeadsUp(ray.direction, AxisOrder.ZXY);\n baseFrame.columnX(vector0).scaleInPlace(length0);\n baseFrame.columnY(vector90).scaleInPlace(length90);\n arc = Arc3d.create(ray.origin, vector0, vector90);\n }\n if (arc.binormalVector().dotProduct(ray.direction) < 0.0)\n arc.reverseInPlace();\n return arc;\n }\n /**\n * Create section arcs for mitered pipe.\n * * At the end of each pipe segment, the pipe is mitered by the plane that bisects the angle between successive\n * centerline segments.\n * * The section arcs are constructed so that lines between corresponding fractional positions on the arcs are\n * axial lines on the pipes.\n * * This means that the initial arc's vector0 and vector90 lengths and angular separation are _not_ preserved in\n * the section arcs.\n * * Circular or elliptical pipe cross sections can be specified by supplying either a radius, a pair of semi-axis\n * lengths, or an Arc3d:\n * * For semi-axis length input, x and y correspond to ellipse local axes perpendicular to each other and to the\n * start tangent.\n * * For Arc3d input, the center is translated to the centerline start point. For best results, ensure this arc\n * is perpendicular to the centerline start tangent.\n * * This function internally calls [[createMiteredSweepSections]] with default options.\n * @param centerline centerline of pipe. For best results, ensure no successive duplicate points with e.g.,\n * [[GrowableXYZArray.createCompressed]].\n * @param sectionData circle radius, ellipse semi-axis lengths, or full Arc3d (if not full, function makes it full).\n * @returns array of sections or empty array if section creation failed.\n */\n public static createMiteredPipeSections(centerline: IndexedXYZCollection, sectionData: number | XAndY | Arc3d): Arc3d[] {\n const arc = CurveFactory.createArcFromSectionData(centerline, sectionData);\n if (!arc)\n return [];\n const miteredSweeps = CurveFactory.createMiteredSweepSections(centerline, arc);\n if (miteredSweeps)\n return miteredSweeps.sections as Arc3d[];\n return [];\n }\n\n /** For a smooth curve, stroke and return unnormalized start/end tangents. */\n private static strokeSmoothCurve(\n curve: IndexedXYZCollection | Point3d[] | CurvePrimitive | CurveChain,\n options?: StrokeOptions,\n ): SmoothCurveData | undefined {\n let startTangent, endTangent: Vector3d | undefined;\n if (curve instanceof CurvePrimitive) {\n startTangent = curve.fractionToPointAndDerivative(0.0).direction;\n endTangent = curve.fractionToPointAndDerivative(1.0).direction;\n const strokes = LineString3d.create();\n curve.emitStrokes(strokes, options);\n curve = strokes.packedPoints;\n } else if (curve instanceof CurveChain) {\n startTangent = curve.startPointAndDerivative()?.direction;\n endTangent = curve.endPointAndDerivative()?.direction;\n const strokes = curve.getPackedStrokes(options);\n if (!strokes)\n return undefined;\n curve = strokes;\n } else if (Array.isArray(curve))\n curve = new Point3dArrayCarrier(curve);\n return { strokes: curve, startTangent, endTangent };\n }\n\n /**\n * Align two bisector plane normals to given smooth rail tangents or optional overrides.\n * * Optionally average the normals for physically closed rail.\n */\n private static alignFirstAndLastBisectorPlanes(\n firstPlane: Plane3dByOriginAndUnitNormal,\n lastPlane: Plane3dByOriginAndUnitNormal,\n smoothRailData?: SmoothCurveData,\n options?: MiteredSweepOptions,\n ) {\n const normal0 = options?.startTangent ?? (smoothRailData?.startTangent ?? firstPlane.getNormalRef());\n const normal1 = options?.endTangent ?? (smoothRailData?.endTangent ?? lastPlane.getNormalRef());\n if (options?.wrapIfPhysicallyClosed && firstPlane.getOriginRef().isAlmostEqual(lastPlane.getOriginRef())) {\n const avgNormal = normal0.plus(normal1);\n if (avgNormal.tryNormalizeInPlace()) { // ignore cusp at seam\n firstPlane.getNormalRef().setFrom(avgNormal);\n lastPlane.getNormalRef().setFrom(avgNormal);\n return;\n }\n }\n if (normal0.tryNormalizeInPlace())\n firstPlane.getNormalRef().setFrom(normal0);\n if (normal1.tryNormalizeInPlace())\n lastPlane.getNormalRef().setFrom(normal1);\n }\n\n /** Reverse a closed curve or region if necessary so that its orientation is CCW with respect to the plane normal. */\n private static alignClosedCurveToPlane(curve: AnyCurve, planeNormal: Vector3d) {\n let closedCurve: AnyRegion | undefined;\n if (curve instanceof CurvePrimitive) {\n if (curve.startPoint().isAlmostEqual(curve.endPoint()))\n closedCurve = Loop.create(curve);\n } else if (curve.isAnyRegion())\n closedCurve = curve;\n if (closedCurve) {\n // The alignment condition is equivalent to positive projected curve area computed wrt to the plane normal.\n const toLocal = Matrix3d.createRigidHeadsUp(planeNormal).transpose();\n const projection = closedCurve.cloneTransformed(Transform.createOriginAndMatrix(undefined, toLocal));\n if (projection) { // now we can ignore z-coords\n const areaXY = RegionOps.computeXYArea(projection as AnyRegion);\n if (areaXY && areaXY < 0)\n curve.reverseInPlace();\n }\n }\n }\n\n /**\n * Projection to target plane, constructing sweep direction from two given planes.\n * * If successful, push the target plane and swept section to the output arrays and return the swept section.\n * * If unsuccessful, leave the output arrays alone and return the input section.\n */\n private static doSweepToPlane(\n output: SectionSequenceWithPlanes,\n edgePlane0: Plane3dByOriginAndUnitNormal,\n edgePlane1: Plane3dByOriginAndUnitNormal,\n targetPlane: Plane3dByOriginAndUnitNormal,\n section: AnyCurve,\n ): AnyCurve {\n const sweepVector = Vector3d.createStartEnd(edgePlane0.getOriginRef(), edgePlane1.getOriginRef());\n const transform = Transform.createFlattenAlongVectorToPlane(\n sweepVector, targetPlane.getOriginRef(), targetPlane.getNormalRef(),\n );\n if (transform === undefined)\n return section;\n const transformedSection = section.cloneTransformed(transform);\n if (transformedSection === undefined)\n return section;\n output.planes.push(targetPlane);\n output.sections.push(transformedSection);\n return transformedSection;\n }\n\n /**\n * Sweep the `initialSection` along each segment of the (stroked) `centerline` until it hits the bisector plane at\n * the next vertex.\n * * For best results, the caller should place `initialSection` in a plane perpendicular to the `centerline`\n * start tangent.\n * * This plane is commonly (but not necessarily) through the centerline start point itself.\n * * To compute the sections, `initialSection` is projected in the direction of the centerline start tangent onto\n * the first bisector plane at the centerline start. The result of this projection will be likewise projected onto\n * the second plane, and so on in sequence.\n * * By default, the first/last bisector plane normals are set to the centerline start/end tangents. The caller can\n * override these with tangents supplied in `options`. If the centerline is physically closed and\n * `options.wrapIfPhysicallyClosed` is true, the first and last plane normals are averaged and equated.\n * * The centerline path does NOT have to be planar, however non-planarity will result in twisting of the sections\n * in the bisector planes.\n * @param centerline sweep path. Will be stroked if smooth.\n * @param initialSection profile curve to be swept. As noted above, this should be on a plane perpendicular to the\n * centerline start tangent.\n * @param options options for computation and output.\n * @return array of sections, formed from projecting `initialSection` successively onto the bisector planes.\n */\n public static createMiteredSweepSections(\n centerline: IndexedXYZCollection | Point3d[] | CurvePrimitive | CurveChain,\n initialSection: AnyCurve,\n options?: MiteredSweepOptions,\n ): SectionSequenceWithPlanes | undefined {\n if (!options)\n options = {};\n const rail = this.strokeSmoothCurve(centerline, options.strokeOptions);\n if (!rail)\n return undefined;\n const planes = PolylineOps.createBisectorPlanesForDistinctPoints(rail.strokes);\n if (!planes || planes.length < 2)\n return undefined;\n this.alignFirstAndLastBisectorPlanes(planes[0], planes[planes.length - 1], rail, options);\n\n // RuledSweep facet construction assumes the contours are oriented CCW with respect to the sweep direction so that\n // facet normals point outward. We only have to align the first contour; the rest will inherit its orientation.\n this.alignClosedCurveToPlane(initialSection, planes[0].getNormalRef());\n\n const sectionData: SectionSequenceWithPlanes = { sections: [], planes: [] };\n let currentSection = this.doSweepToPlane(sectionData, planes[0], planes[1], planes[0], initialSection);\n for (let i = 1; i < planes.length; i++)\n currentSection = this.doSweepToPlane(sectionData, planes[i - 1], planes[i], planes[i], currentSection);\n\n if (options.outputSelect) {\n const ruledSweep = RuledSweep.create(sectionData.sections, options.capped ?? false);\n if (ruledSweep) {\n sectionData.ruledSweep = ruledSweep;\n if (MiteredSweepOutputSelect.AlsoMesh === options.outputSelect) {\n const builder = PolyfaceBuilder.create(options.strokeOptions);\n builder.addRuledSweep(ruledSweep);\n sectionData.mesh = builder.claimPolyface();\n }\n }\n }\n return sectionData;\n }\n /**\n * Create a circular arc from start point, tangent at start, radius, optional plane normal, arc sweep.\n * * The vector from start point to center is in the direction of upVector crossed with tangentA.\n * @param start start point.\n * @param tangentAtStart vector in tangent direction at the start.\n * @param radius signed radius.\n * @param upVector optional out-of-plane vector. Defaults to positive Z.\n * @param sweep angular range. If single `Angle` is given, start angle is at 0 degrees (the start point).\n */\n public static createArcPointTangentRadius(\n start: Point3d, tangentAtStart: Vector3d, radius: number, upVector?: Vector3d, sweep?: Angle | AngleSweep,\n ): Arc3d | undefined {\n return Arc3d.createCircularStartTangentRadius(start, tangentAtStart, radius, upVector, sweep);\n }\n /**\n * Compute 2 spirals (all in XY) for a symmetric line-to-line transition.\n * * First spiral begins at given start point.\n * * first tangent aims at shoulder.\n * * outbound spiral joins line from shoulder to target.\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param startPoint inbound start point.\n * @param shoulder point target point for (both) spiral-to-line tangencies.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralSpiralLine(\n spiralType: IntegratedSpiralTypeName,\n startPoint: Point3d,\n shoulderPoint: Point3d,\n targetPoint: Point3d,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(startPoint, shoulderPoint);\n const vectorBC0 = Vector3d.createStartEnd(shoulderPoint, targetPoint);\n const referenceLength = vectorAB.magnitude();\n const radiansAB = Math.atan2(vectorAB.y, vectorAB.x);\n const lineTurnRadians = vectorAB.angleToXY(vectorBC0);\n const spiralTurnRadians = 0.5 * lineTurnRadians.radians;\n const radiansBC = radiansAB + lineTurnRadians.radians;\n const axesA = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansAB));\n const frameA = Transform.createRefs(startPoint.clone(), axesA);\n // We know how much it has to turn, and but not the length or end radius.\n // make a spiral of referenceLength and scale it back to the junction line\n const spiralARefLength = IntegratedSpiral3d.createFrom4OutOf5(spiralType, 0.0, undefined,\n Angle.createRadians(0), Angle.createRadians(spiralTurnRadians), referenceLength, undefined, frameA);\n if (spiralARefLength) {\n const midPlanePerpendicularRadians = radiansAB + spiralTurnRadians;\n const midPlanePerpendicularVector = Vector3d.createPolar(1.0, Angle.createRadians(midPlanePerpendicularRadians));\n const altitudeB = midPlanePerpendicularVector.dotProductStartEnd(startPoint, shoulderPoint);\n const altitudeSpiralEnd = midPlanePerpendicularVector.dotProductStartEnd(startPoint, spiralARefLength.endPoint());\n const scaleFactor = altitudeB / altitudeSpiralEnd;\n const spiralA = IntegratedSpiral3d.createFrom4OutOf5(spiralType, 0.0, undefined,\n Angle.createRadians(0), Angle.createRadians(spiralTurnRadians), referenceLength * scaleFactor, undefined, frameA)!;\n const distanceAB = vectorAB.magnitude();\n const vectorBC = Vector3d.createStartEnd(shoulderPoint, targetPoint);\n vectorBC.scaleToLength(distanceAB, vectorBC);\n const pointC = shoulderPoint.plus(vectorBC);\n const axesC = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansBC + Math.PI));\n const frameC = Transform.createRefs(pointC, axesC);\n const spiralC = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, -spiralA.radius01.x1, Angle.zero(), undefined, spiralA.curveLength(), Segment1d.create(1, 0), frameC)!;\n return [spiralA, spiralC];\n }\n return undefined;\n }\n /**\n * Compute 2 spirals (all in XY) for a symmetric line-to-line transition.\n * * Spiral length is given.\n * * tangency points float on both lines.\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param pointA inbound start point.\n * @param shoulder point target point for (both) spiral-to-line tangencies.\n * @param spiralLength for each part of the spiral pair.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralSpiralLineWithSpiralLength(\n spiralType: IntegratedSpiralTypeName,\n pointA: Point3d,\n pointB: Point3d,\n pointC: Point3d,\n spiralLength: number,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(pointA, pointB);\n const vectorBC = Vector3d.createStartEnd(pointB, pointC);\n const radiansAB = Math.atan2(vectorAB.y, vectorAB.x);\n const lineTurnAngle = vectorAB.angleToXY(vectorBC);\n const spiralTurnRadians = 0.5 * lineTurnAngle.radians;\n const bisectorRadians = 0.5 * (Math.PI - lineTurnAngle.radians);\n const radiansCB = Math.atan2(-vectorBC.y, -vectorBC.x);\n const spiralAB0 = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(spiralTurnRadians),\n spiralLength, undefined, Transform.createIdentity(),\n );\n if (spiralAB0) {\n const localEndPoint = spiralAB0.fractionToPoint(1);\n const distanceAB = pointA.distance(pointB);\n const distanceCB = pointC.distance(pointB);\n // The spiral eventually has to end on the bisector, at localEndPoint.y height from the inbound line\n // distance from shoulder to projection of that point to point E on the inbound line is\n const distanceBE = localEndPoint.y / Math.tan(bisectorRadians);\n const xFractionAB = Geometry.conditionalDivideFraction(distanceAB - distanceBE - localEndPoint.x, distanceAB);\n const xFractionCB = Geometry.conditionalDivideFraction(distanceCB - distanceBE - localEndPoint.x, distanceCB);\n if (xFractionAB !== undefined && xFractionCB !== undefined) {\n const axesA = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansAB));\n const frameAOrigin = pointA.interpolate(xFractionAB, pointB);\n const frameA = Transform.createRefs(frameAOrigin, axesA);\n const spiralAB = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(spiralTurnRadians),\n spiralLength, undefined, frameA,\n )!;\n const axesB = Matrix3d.createRotationAroundAxisIndex(AxisIndex.Z, Angle.createRadians(radiansCB));\n const frameBOrigin = pointC.interpolate(xFractionCB, pointB);\n const frameB = Transform.createRefs(frameBOrigin, axesB);\n const spiralBC = IntegratedSpiral3d.createFrom4OutOf5(\n spiralType, 0, undefined,\n Angle.zero(), Angle.createRadians(-spiralTurnRadians),\n spiralLength, undefined, frameB,\n )!;\n return [spiralAB, spiralBC];\n }\n }\n return undefined;\n }\n /**\n * Compute 2 spirals and an arc (all in XY) for a symmetric line-to-line transition.\n * Spiral lengths and arc radius are given (e.g., from design speed standards).\n * @param spiralType name of spiral type. THIS MUST BE AN \"Integrated\" SPIRAL TYPE.\n * @param pointA inbound start point.\n * @param pointB shoulder (target) point for (both) spiral-to-line tangencies.\n * @param lengthA inbound spiral length.\n * @param lengthB outbound spiral length.\n * @return array with the computed spirals, or undefined if failure.\n */\n public static createLineSpiralArcSpiralLine(\n spiralType: IntegratedSpiralTypeName,\n pointA: Point3d,\n pointB: Point3d,\n pointC: Point3d,\n lengthA: number,\n lengthB: number,\n arcRadius: number,\n ): GeometryQuery[] | undefined {\n const vectorAB = Vector3d.createStartEnd(pointA, pointB); vectorAB.z = 0;\n const vectorCB = Vector3d.createStartEnd(pointC, pointB); vectorCB.z = 0;\n const unitAB = vectorAB.normalize();\n const unitCB = vectorCB.normalize();\n if (unitAB === undefined || unitCB === undefined)\n return undefined;\n const unitPerpAB = unitAB.unitPerpendicularXY();\n const unitPerpCB = unitCB.unitPerpendicularXY();\n const thetaABC = vectorAB.angleToXY(vectorCB);\n const sideA = Geometry.split3WaySign(thetaABC.radians, 1, -1, -1);\n const sideB = - sideA;\n const radiusA = sideA * Math.abs(arcRadius);\n const radiusB = sideB * Math.abs(arcRadius);\n const spiralA = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, radiusA, Angle.zero(), undefined, lengthA, undefined, Transform.createIdentity())!;\n const spiralB = IntegratedSpiral3d.createFrom4OutOf5(spiralType,\n 0, radiusB, Angle.zero(), undefined, lengthB, undefined, Transform.createIdentity())!;\n const spiralEndA = spiralA.fractionToPointAndUnitTangent(1.0);\n const spiralEndB = spiralB.fractionToPointAndUnitTangent(1.0);\n // From the end of spiral, step away to arc center (and this is in local coordinates of each spiral)\n const sA = spiralEndA.origin.x - radiusA * spiralEndA.direction.y;\n const tA = spiralEndA.origin.y + radiusA * spiralEndA.direction.x;\n const sB = spiralEndB.origin.x - radiusB * spiralEndB.direction.y;\n const tB = spiralEndB.origin.y + radiusB * spiralEndB.direction.x;\n // Those local coordinates are rotated to unitAB and unitBC ...\n const vectorA = Vector3d.createAdd2Scaled(unitAB, sA, unitPerpAB, tA);\n const vectorB = Vector3d.createAdd2Scaled(unitCB, sB, unitPerpCB, tB);\n const uv = Vector2d.create();\n if (SmallSystem.linearSystem2d(\n unitAB.x, -unitCB.x,\n unitAB.y, -unitCB.y,\n vectorB.x - vectorA.x, vectorB.y - vectorA.y, uv)) {\n const tangencyAB = pointB.plusScaled(unitAB, uv.x);\n const tangencyCB = pointB.plusScaled(unitCB, uv.y);\n const frameA = Transform.createOriginAndMatrixColumns(tangencyAB, unitAB, unitPerpAB, Vector3d.unitZ());\n const frameB = Transform.createOriginAndMatrixColumns(tangencyCB, unitCB, unitPerpCB, Vector3d.unitZ());\n spiralA.tryTransformInPlace(frameA);\n spiralB.tryTransformInPlace(frameB);\n const rayA1 = spiralA.fractionToPointAndUnitTangent(1.0);\n const rayB0 = spiralB.fractionToPointAndUnitTangent(1.0);\n rayB0.direction.scaleInPlace(-1.0);\n const sweep = rayA1.direction.angleToXY(rayB0.direction);\n if (radiusA < 0)\n sweep.setRadians(- sweep.radians);\n const arc = CurveFactory.createArcPointTangentRadius(rayA1.origin, rayA1.direction, radiusA, undefined, sweep)!;\n return [spiralA, arc, spiralB];\n }\n return undefined;\n }\n /** Return the intersection point of 3 planes. */\n public static planePlaneIntersectionRay(\n planeA: PlaneAltitudeEvaluator, planeB: PlaneAltitudeEvaluator): Ray3d | undefined {\n const altitudeA = planeA.altitudeXYZ(0, 0, 0);\n const altitudeB = planeB.altitudeXYZ(0, 0, 0);\n const normalAx = planeA.normalX();\n const normalAy = planeA.normalY();\n const normalAz = planeA.normalZ();\n const normalBx = planeB.normalX();\n const normalBy = planeB.normalY();\n const normalBz = planeB.normalZ();\n const normalCx = Geometry.crossProductXYXY(normalAy, normalAz, normalBy, normalBz);\n const normalCy = Geometry.crossProductXYXY(normalAz, normalAx, normalBz, normalBx);\n const normalCz = Geometry.crossProductXYXY(normalAx, normalAy, normalBx, normalBy);\n const rayOrigin = SmallSystem.linearSystem3d(\n normalAx, normalAy, normalAz,\n normalBx, normalBy, normalBz,\n normalCx, normalCy, normalCz,\n -altitudeA, -altitudeB, 0.0);\n if (rayOrigin !== undefined) {\n return Ray3d.createXYZUVW(rayOrigin.x, rayOrigin.y, rayOrigin.z, normalCx, normalCy, normalCz);\n }\n return undefined;\n }\n}\n"]}
|
|
@@ -72,7 +72,9 @@ export declare class CurveLocationDetail {
|
|
|
72
72
|
constructor();
|
|
73
73
|
/** Set the (optional) intervalRole field. */
|
|
74
74
|
setIntervalRole(value: CurveIntervalRole): void;
|
|
75
|
-
/** Set the
|
|
75
|
+
/** Set the `fraction` and `point`, using direct assignment (capture!) to `point`. */
|
|
76
|
+
captureFractionPoint(fraction: number, point: Point3d): void;
|
|
77
|
+
/** Set the (optional) `fraction1` and `point1`, using direct assignment (capture!) to `point1`. */
|
|
76
78
|
captureFraction1Point1(fraction1: number, point1: Point3d): void;
|
|
77
79
|
/** Test if this pair has fraction1 defined. */
|
|
78
80
|
get hasFraction1(): boolean;
|