@itwin/core-geometry 4.1.0-dev.3 → 4.1.0-dev.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -1
- package/lib/cjs/curve/Arc3d.d.ts +71 -86
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +110 -96
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +61 -41
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +69 -46
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +73 -46
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +100 -64
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +45 -46
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +39 -41
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +138 -92
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +115 -75
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.d.ts +26 -20
- package/lib/cjs/curve/GeometryQuery.d.ts.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js +11 -9
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.d.ts +38 -27
- package/lib/cjs/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js +77 -39
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +70 -51
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +120 -71
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.d.ts +7 -5
- package/lib/cjs/curve/Loop.d.ts.map +1 -1
- package/lib/cjs/curve/Loop.js +18 -6
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.d.ts +7 -7
- package/lib/cjs/curve/ParityRegion.d.ts.map +1 -1
- package/lib/cjs/curve/ParityRegion.js +19 -11
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +6 -6
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +15 -9
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.d.ts +4 -6
- package/lib/cjs/curve/ProxyCurve.d.ts.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js +7 -7
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.d.ts +14 -13
- package/lib/cjs/curve/Query/StrokeCountMap.d.ts.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js +9 -8
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +69 -47
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +70 -47
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.d.ts +29 -21
- package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js +50 -24
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.d.ts +6 -5
- package/lib/cjs/curve/UnionRegion.d.ts.map +1 -1
- package/lib/cjs/curve/UnionRegion.js +17 -8
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.d.ts +2 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js +6 -2
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.d.ts +14 -8
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js +14 -8
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts +56 -34
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +152 -87
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js +4 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +2 -2
- package/lib/cjs/geometry3d/Matrix3d.js +2 -2
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts +36 -32
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +35 -32
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +133 -93
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +296 -144
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +71 -86
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +110 -96
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +61 -41
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +69 -46
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +73 -46
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +100 -64
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +45 -46
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +39 -41
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +138 -92
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +115 -75
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.d.ts +26 -20
- package/lib/esm/curve/GeometryQuery.d.ts.map +1 -1
- package/lib/esm/curve/GeometryQuery.js +11 -9
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.d.ts +38 -27
- package/lib/esm/curve/LineSegment3d.d.ts.map +1 -1
- package/lib/esm/curve/LineSegment3d.js +77 -39
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +70 -51
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +120 -71
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.d.ts +7 -5
- package/lib/esm/curve/Loop.d.ts.map +1 -1
- package/lib/esm/curve/Loop.js +18 -6
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/ParityRegion.d.ts +7 -7
- package/lib/esm/curve/ParityRegion.d.ts.map +1 -1
- package/lib/esm/curve/ParityRegion.js +19 -11
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +6 -6
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +15 -9
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.d.ts +4 -6
- package/lib/esm/curve/ProxyCurve.d.ts.map +1 -1
- package/lib/esm/curve/ProxyCurve.js +7 -7
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.d.ts +14 -13
- package/lib/esm/curve/Query/StrokeCountMap.d.ts.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js +9 -8
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +69 -47
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +70 -47
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.d.ts +29 -21
- package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
- package/lib/esm/curve/StrokeOptions.js +50 -24
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.d.ts +6 -5
- package/lib/esm/curve/UnionRegion.d.ts.map +1 -1
- package/lib/esm/curve/UnionRegion.js +17 -8
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.d.ts +2 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js +6 -2
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.d.ts +14 -8
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js +14 -8
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts +56 -34
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +152 -87
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js +4 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +2 -2
- package/lib/esm/geometry3d/Matrix3d.js +2 -2
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts +36 -32
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.d.ts.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +35 -32
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +133 -93
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +296 -144
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Classification of contortions at a joint.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0,\r\n Cap = 1,\r\n Extend = 2,\r\n Trim = -1,\r\n JustGeometry = 3,\r\n Gap = 4,\r\n}\r\n\r\n/**\r\n * * Control parameters for joint construction.\r\n * * Decision order is:\r\n * * if turn angle is greater than minArcDegrees, make an arc.\r\n * * if turn angle is less than or equal maxChamferTurnDegrees, extend curves along tangent to single intersection point.\r\n * * if turn angle is greater than maxChamferTurnDegrees, construct multiple lines that are tangent to the turn circle \"from the outside\",\r\n * with each equal turn less than maxChamferTurnDegrees.\r\n * * otherwise make single edge.\r\n * @public\r\n */\r\nexport class JointOptions {\r\n /** smallest arc to construct.\r\n * * If this control angle is large, arcs are never created.\r\n */\r\n public minArcDegrees = 180.0;\r\n public maxChamferTurnDegrees = 90;\r\n /** Offset distance, positive to left of base curve. */\r\n public leftOffsetDistance: number = 0;\r\n /** Whether to offset elliptical arcs as elliptical arcs (true) or as B-spline curves (false, default). */\r\n public preserveEllipticalArcs = false;\r\n\r\n /** Construct JointOptions.\r\n * * leftOffsetDistance is required\r\n * * minArcDegrees and maxChamferDegrees are optional.\r\n */\r\n constructor(leftOffsetDistance: number, minArcDegrees = 180, maxChamferDegrees = 90, preserveEllipticalArcs = false) {\r\n this.leftOffsetDistance = leftOffsetDistance;\r\n this.minArcDegrees = minArcDegrees;\r\n this.maxChamferTurnDegrees = maxChamferDegrees;\r\n this.preserveEllipticalArcs = preserveEllipticalArcs;\r\n }\r\n\r\n /** Return a deep clone. */\r\n public clone(): JointOptions {\r\n return new JointOptions(this.leftOffsetDistance, this.minArcDegrees, this.maxChamferTurnDegrees, this.preserveEllipticalArcs);\r\n }\r\n\r\n /** Copy values of input options */\r\n public setFrom(other: JointOptions) {\r\n this.leftOffsetDistance = other.leftOffsetDistance;\r\n this.minArcDegrees = other.minArcDegrees;\r\n this.maxChamferTurnDegrees = other.maxChamferTurnDegrees;\r\n this.preserveEllipticalArcs = other.preserveEllipticalArcs;\r\n }\r\n\r\n /**\r\n * Parse a number or JointOptions up to JointOptions:\r\n * * If leftOffsetDistanceOptions is a number, create a JointOptions with other options set to default values.\r\n * * If leftOffsetDistanceOrOptions is a JointOptions, return it unchanged.\r\n * @param leftOffsetDistanceOrOptions\r\n */\r\n public static create(leftOffsetDistanceOrOptions: number | JointOptions): JointOptions {\r\n if (leftOffsetDistanceOrOptions instanceof JointOptions)\r\n return leftOffsetDistanceOrOptions;\r\n // if (Number.isFinite(leftOffsetDistanceOrOptions))\r\n return new JointOptions(leftOffsetDistanceOrOptions);\r\n }\r\n /** return true if the options indicate this amount of turn should be handled with an arc. */\r\n public needArc(theta: Angle): boolean {\r\n return Math.abs(theta.degrees) >= this.minArcDegrees;\r\n }\r\n /** Test if turn by theta should be output as single point. */\r\n public numChamferPoints(theta: Angle): number {\r\n const degrees = Math.abs(theta.degrees);\r\n const stepDegrees = Geometry.clamp(this.maxChamferTurnDegrees, 10, 120);\r\n if (degrees <= stepDegrees)\r\n return 1;\r\n return Math.ceil(degrees / stepDegrees);\r\n }\r\n}\r\n\r\n/**\r\n * Options for offsetting a curve.\r\n * @public\r\n */\r\nexport class OffsetOptions {\r\n /** Options for offsetting and joining CurvePrimitives */\r\n public jointOptions: JointOptions;\r\n /** Options for generating a B-spline curve offset */\r\n public strokeOptions: StrokeOptions;\r\n\r\n /** Options that are provided are captured. */\r\n constructor(offsetDistanceOrOptions: number | JointOptions, strokeOptions?: StrokeOptions) {\r\n this.jointOptions = JointOptions.create(offsetDistanceOrOptions);\r\n this.strokeOptions = (strokeOptions !== undefined) ? strokeOptions : StrokeOptions.createForCurves();\r\n }\r\n\r\n public get minArcDegrees(): number { return this.jointOptions.minArcDegrees; }\r\n public set minArcDegrees(value: number) { this.jointOptions.minArcDegrees = value; }\r\n public get maxChamferTurnDegrees(): number { return this.jointOptions.maxChamferTurnDegrees; }\r\n public set maxChamferTurnDegrees(value: number) { this.jointOptions.maxChamferTurnDegrees = value; }\r\n public get leftOffsetDistance(): number { return this.jointOptions.leftOffsetDistance; }\r\n public set leftOffsetDistance(value: number) { this.jointOptions.leftOffsetDistance = value; }\r\n public get preserveEllipticalArcs(): boolean { return this.jointOptions.preserveEllipticalArcs; }\r\n public set preserveEllipticalArcs(value: boolean) { this.jointOptions.preserveEllipticalArcs = value; }\r\n\r\n /** Convert variant input into OffsetOptions.\r\n * * If a JointOptions is provided, it is captured.\r\n * * If an OffsetOptions is provided, a reference to it is returned. */\r\n public static create(offsetDistanceOrOptions: number | JointOptions | OffsetOptions): OffsetOptions {\r\n if (offsetDistanceOrOptions instanceof OffsetOptions)\r\n return offsetDistanceOrOptions;\r\n return new OffsetOptions(offsetDistanceOrOptions);\r\n }\r\n\r\n /** Convert variant input into offset distance */\r\n public static getOffsetDistance(offsetDistanceOrOptions: number | JointOptions | OffsetOptions): number {\r\n if (typeof offsetDistanceOrOptions === \"number\")\r\n return offsetDistanceOrOptions;\r\n return offsetDistanceOrOptions.leftOffsetDistance;\r\n }\r\n\r\n /** Return a deep clone. */\r\n public clone(): OffsetOptions {\r\n return new OffsetOptions(this.jointOptions.clone(), this.strokeOptions.clone());\r\n }\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed */\r\n public flexure: JointMode;\r\n /** curve before the joint */\r\n public curve0?: CurvePrimitive;\r\n /** fractional position on curve0 (may be a trim or extension) */\r\n public fraction0?: number;\r\n /** curve after the joint (may be a trim or extension) */\r\n public curve1?: CurvePrimitive;\r\n /** fractional position on curve1 */\r\n public fraction1?: number;\r\n /** curve to be added within the joint */\r\n public jointCurve?: CurvePrimitive;\r\n /** common point on the original curves */\r\n public swingPoint?: Point3d;\r\n /** pointer to next joint */\r\n public nextJoint?: Joint;\r\n /** pointer to previous joint */\r\n public previousJoint?: Joint;\r\n // capture references to all data . . .\r\n public constructor(curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /** try to construct an arc transition from ray0 to ray1 with given center. */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(start, (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB);\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n }, maxTest);\r\n }\r\n\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(start, (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB);\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n }, maxTest);\r\n }\r\n\r\n /** Execute `joint.annotateJointMode()` at all joints on the chain. */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n\r\n /**\r\n * Visit joints on a chain.\r\n * * terminate on `false` return from `callback`\r\n * @param start first (and, for cyclic chain, final) Joint\r\n * @param callback function to call with each Joint as a single parameter.\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5)\r\n return true;\r\n if (!callback(joint)) return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1);\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef());\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta);\r\n if (numChamferPoints <= 1) {\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) {\r\n // A nontrivial linestring ...\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // desperation appears ...\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n\r\n // Select the index at which summed fraction difference is smallest.\r\n private selectIntersectionIndexByFraction(fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[]): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA) + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * Examine the adjacent geometry\r\n * * set JointMode: one of Cap Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions) {\r\n if (this.curve0 && !this.curve1) {\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve1 && !this.curve0) {\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && this.curve1) {\r\n // check for direct intersection -- occurs on offset of colinear base segments, and closed primitives\r\n if (this.curve0.endPoint().isAlmostEqual(this.curve1.startPoint())) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0); // And we know that is full length ray !\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0); // ditto\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1);\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) {\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) {\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) {\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves ...\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) {\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else {\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(start: Joint, options: JointOptions, maxTest: number): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0)\r\n || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n/**\r\n * Context for building a wire offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() {\r\n }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(basePointA: Point3d, basePointB: Point3d, distance: number): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB));\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Construct curves that are offset from a polygon.\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will not detect self intersection with far-away edges.\r\n * @param points\r\n * @param wrap\r\n * @param offsetDistance\r\n */\r\n public constructPolygonWireXYOffset(points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions): CurveCollection | undefined {\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[0], points[1], options.leftOffsetDistance);\r\n let joint0 = new Joint(undefined, fragment0, points[0]);\r\n let newJoint;\r\n let previousJoint = joint0;\r\n for (let i = 1; i + 1 < numPoints; i++) {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n if (wrap)\r\n Joint.link(previousJoint, joint0);\r\n else {\r\n newJoint = new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, newJoint);\r\n }\r\n Joint.annotateChain(joint0, options, numPoints);\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n\r\n // Joint.collectPrimitivesFromChain(joint0, result, numPoints);\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints);\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() {\r\n }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * * return cp\r\n * @param cp primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n */\r\n public static applyBasePoints(cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single primitive.\r\n * * each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param g primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of g), or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(g: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = g.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = g.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, g.startPoint(), g.endPoint());\r\n }\r\n\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will not detect self intersection among widely separated edges.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * When the offset needs to do an \"outside\" turn, the first applicable construction is applied:\r\n * * If the turn is larger than `options.minArcDegrees`, a circular arc is constructed.\r\n * * If the turn is less than or equal to `options.maxChamferTurnDegrees`, extend curves along tangent to single intersection point.\r\n * * If the turn is larger than `options.maxChamferDegrees`, the turn is constructed as a sequence of straight lines that are:\r\n * * outside the arc\r\n * * have uniform turn angle less than `options.maxChamferDegrees`\r\n * * each line segment (except first and last) touches the arc at its midpoint.\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions): CurveCollection | undefined {\r\n const wrap = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n // setup pass: get simple offsets of each primitive\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad .. maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive)\r\n simpleOffsets.push(c1);\r\n else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PolygonOffsetContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/PolygonOffsetContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAA2B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;GAGG;AACH,IAAK,SAOJ;AAPD,WAAK,SAAS;IACZ,+CAAW,CAAA;IACX,uCAAO,CAAA;IACP,6CAAU,CAAA;IACV,0CAAS,CAAA;IACT,yDAAgB,CAAA;IAChB,uCAAO,CAAA;AACT,CAAC,EAPI,SAAS,KAAT,SAAS,QAOb;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,YAAY;IAsBvB;;;;OAIG;IACH,YACE,kBAA0B,EAAE,aAAa,GAAG,GAAG,EAAE,iBAAiB,GAAG,EAAE,EACvE,sBAAsB,GAAG,KAAK,EAAE,oBAAoB,GAAG,KAAK;QA5B9D;;;WAGG;QACI,kBAAa,GAAG,KAAK,CAAC;QAC7B,iHAAiH;QAC1G,0BAAqB,GAAG,EAAE,CAAC;QAClC;;;;;;;;WAQG;QACI,yBAAoB,GAAG,KAAK,CAAC;QACpC,uDAAuD;QAChD,uBAAkB,GAAW,CAAC,CAAC;QACtC,0GAA0G;QACnG,2BAAsB,GAAG,KAAK,CAAC;QAUpC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;QAC/C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;QACrD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IACD,2BAA2B;IACpB,KAAK;QACV,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,qBAAqB,EACvE,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,oBAAoB,CACvD,CAAC;IACJ,CAAC;IACD,mCAAmC;IAC5B,OAAO,CAAC,KAAmB;QAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACzD,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;QAC3D,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,oBAAoB,CAAC;IACzD,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAC,2BAAkD;QACrE,IAAI,2BAA2B,YAAY,YAAY;YACrD,OAAO,2BAA2B,CAAC;QACrC,OAAO,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC;IACD;kGAC8F;IACvF,OAAO,CAAC,KAAY;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;IACvD,CAAC;IACD,2EAA2E;IACpE,gBAAgB,CAAC,KAAY;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,mBAAmB,GAAG,EAAE,CAAC;QAC/B,IAAI,mBAAmB,GAAG,GAAG,CAAC;QAC9B,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC;SAClD;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;QACzG,IAAI,OAAO,IAAI,WAAW;YACxB,OAAO,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAC1C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAKxB,8CAA8C;IAC9C,YAAY,uBAA8C,EAAE,aAA6B;QACvF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;IACvG,CAAC;IACD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IACzC,CAAC;IACD,IAAW,aAAa,CAAC,KAAa;QACpC,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,KAAK,CAAC;IAC1C,CAAC;IACD,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;IACjD,CAAC;IACD,IAAW,qBAAqB,CAAC,KAAa;QAC5C,IAAI,CAAC,YAAY,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;IAChD,CAAC;IACD,IAAW,oBAAoB,CAAC,KAAc;QAC5C,IAAI,CAAC,YAAY,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACjD,CAAC;IACD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAC9C,CAAC;IACD,IAAW,kBAAkB,CAAC,KAAa;QACzC,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAC/C,CAAC;IACD,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;IAClD,CAAC;IACD,IAAW,sBAAsB,CAAC,KAAc;QAC9C,IAAI,CAAC,YAAY,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACnD,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,uBAA8D;QACjF,IAAI,uBAAuB,YAAY,aAAa;YAClD,OAAO,uBAAuB,CAAC;QACjC,OAAO,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC;IACD,iDAAiD;IAC1C,MAAM,CAAC,iBAAiB,CAAC,uBAA8D;QAC5F,IAAI,OAAO,uBAAuB,KAAK,QAAQ;YAC7C,OAAO,uBAAuB,CAAC;QACjC,OAAO,uBAAuB,CAAC,kBAAkB,CAAC;IACpD,CAAC;IACD,2BAA2B;IACpB,KAAK;QACV,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,KAAK;IAmBT,uCAAuC;IACvC,YACE,MAAkC,EAAE,MAAkC,EAAE,UAA+B;QAEvG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IACnC,CAAC;IACD;;OAEG;IACI,MAAM,CAAC,YAAY,CAAC,IAAW,EAAE,MAA2B,EAAE,IAAW;QAC9E,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;YACjH,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SACtG;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,0FAA0F;IACnF,cAAc;QACnB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5G,CAAC;IACD,6EAA6E;IACtE,MAAM,CAAC,IAAI,CAAC,MAAa,EAAE,MAAyB;QACzD,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC1B,IAAI,MAAM;YACR,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM;YAC3C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;aAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM;YAChD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,CAAC;IACD;;;OAGG;IACI,kBAAkB,CAAC,YAAoB;QAC5C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS;YAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAClC,OAAO,YAAY,CAAC;IACtB,CAAC;IACO,MAAM,CAAC,UAAU,CAAC,WAAyB,EAAE,KAAsB;QACzE,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;SAChC;IACH,CAAC;IACO,MAAM,CAAC,QAAQ,CAAC,WAAyB,EAAE,KAAc;QAC/D,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;gBAC9B,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxC;IACH,CAAC;IACD,6GAA6G;IACtG,MAAM,CAAC,uBAAuB,CAAC,KAAY,EAAE,WAAyB,EAAE,UAAkB,GAAG;QAClG,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,+BAA+B;QAC1D,KAAK,CAAC,kBAAkB,CACtB,KAAK,EACL,CAAC,KAAY,EAAE,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;gBACjD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;oBAC1B,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;qBAC3B,IAAI,EAAE,GAAG,EAAE;oBACd,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,wCAAwC;gBAC3F,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;wBACrB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;qBACjD;iBACF;gBACD,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aACtC;YACD,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC;QAC5B,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IACO,MAAM,CAAC,gBAAgB,CAAC,WAA6B,EAAE,SAA0B;QACvF,IAAI,SAAS,EAAE;YACb,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;oBACjC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;iBACxD;aACF;YACD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC7B;IACH,CAAC;IACO,MAAM,CAAC,uBAAuB,CAAC,KAAY;QACjD,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;QAC5B,IAAI,EAAE,YAAY,YAAY,EAAE;YAC9B,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC;oBACxC,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;aACzD;YACD,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC;oBACxC,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;aAClF;SACF;IACH,CAAC;IACD,yGAAyG;IAClG,MAAM,CAAC,sBAAsB,CAAC,KAAwB,EAAE,WAA6B,EAAE,UAAkB,GAAG;QACjH,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO;QACT,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,+BAA+B;QAC1D,KAAK,CAAC,kBAAkB,CACtB,KAAK,EACL,CAAC,KAAY,EAAE,EAAE;YACf,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAErD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;gBACjD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;oBAC1B,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;qBAC3B,IAAI,EAAE,GAAG,EAAE;oBACd,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,wCAAwC;gBAC3F,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aAC5C;YACD,OAAO,MAAM,EAAE,GAAG,OAAO,CAAC;QAC5B,CAAC,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IACD,2GAA2G;IACpG,MAAM,CAAC,aAAa,CAAC,KAAwB,EAAE,OAAqB,EAAE,UAAkB,GAAG;QAChG,IAAI,KAAK;YACP,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAY,EAAE,EAAE,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,CAAC,KAAY,EAAE,QAAmC,EAAE,UAAkB,GAAG;QACvG,IAAI,KAAK,GAAsB,KAAK,CAAC;QACrC,IAAI,KAAK,EAAE;YACT,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,OAAO,KAAK,KAAK,SAAS,EAAE;gBAC1B,IAAI,OAAO,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,+BAA+B;oBAC3D,OAAO,IAAI,CAAC;gBACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAClB,OAAO,KAAK,CAAC;gBACf,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;gBACxB,IAAI,KAAK,KAAK,KAAK;oBACjB,MAAM;aACT;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,oDAAoD;IAC5C,iBAAiB,CAAC,OAAqB;QAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,kCAAkC;YACpG,IAAI,YAAY,CAAC,YAAY,KAAK,sBAAsB,CAAC,YAAY,EAAE;gBACrE,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,EAAE;oBAChF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;oBACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;oBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,gCAAgC;oBACxG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,IAAI,CAAC,MAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;wBAC9E,IAAI,GAAG,EAAE;4BACP,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;4BACtB,OAAO;yBACR;qBACF;oBACD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C;oBACvG,IAAI,gBAAgB,IAAI,CAAC,EAAE,EAAE,sBAAsB;wBACjD,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC5F,OAAO;qBACR;oBACD,IAAI,gBAAgB,GAAG,CAAC,EAAE,EAAE,wCAAwC;wBAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC/B,MAAM,WAAW,GAAG,GAAG,GAAG,gBAAgB,CAAC;wBAC3C,MAAM,eAAe,GAAG,QAAQ,GAAG,WAAW,CAAC;wBAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,IAAI,CAAC,MAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;wBAC9E,IAAI,GAAG,KAAK,SAAS,EAAE;4BACrB,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BACrD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;4BACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;4BAC7B,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,yCAAyC;4BAE3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;gCACzC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;gCAC9C,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;6BACxF;4BACD,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,0CAA0C;4BAC5E,OAAO;yBACR;qBACF;iBACF;aACF;YACD,sFAAsF;YACtF,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3G,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;IACH,CAAC;IACD,uEAAuE;IAC/D,iCAAiC,CACvC,SAAiB,EAAE,SAAiB,EAAE,aAAwC;QAE9E,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;kBAC7D,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,IAAI,EAAE;gBACZ,IAAI,GAAG,CAAC,CAAC;gBACT,KAAK,GAAG,CAAC,CAAC;aACX;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;OAOG;IACI,iBAAiB,CAAC,OAAqB;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,kCAAkC;YACnE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gCAAgC;YACxE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SACtB;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,oCAAoC;YAC3E,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,kCAAkC;gBACtG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;aAC/B;iBAAM,IAAI,IAAI,CAAC,MAAM,YAAY,aAAa,IAAI,IAAI,CAAC,MAAM,YAAY,aAAa,EAAE,EAAE,gBAAgB;gBACzG,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,kCAAkC;gBACpG,IAAI,YAAY,CAAC,YAAY,KAAK,sBAAsB,CAAC,YAAY,EAAE;oBACrE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC/C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC/C,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,iBAAiB;wBACrE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBACjC;yBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,eAAe;wBACxE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;qBAC/B;yBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,8CAA8C;wBACvG,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;wBAC7B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC3G,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;wBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;qBACtB;iBACF;aACF;iBAAM,EAAE,yBAAyB;gBAChC,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7F,MAAM,iBAAiB,GAAG,IAAI,CAAC,iCAAiC,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC1F,IAAI,iBAAiB,IAAI,CAAC,EAAE,EAAE,eAAe;oBAC3C,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;oBAC9B,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACnE,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;iBACpE;qBAAM,EAAE,iBAAiB;oBACxB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;iBACjC;aACF;SACF;IACH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,0BAA0B,CACtC,KAAY,EAAE,OAAqB,EAAE,OAAe;QAEpD;;;UAGE;QACF,IAAI,MAAM,GAAsB,KAAK,CAAC;QACtC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,EAAE;YACV,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG,OAAO,EAAE;gBAClD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAChC,IAAI,MAAM;uBACL,MAAM;uBACN,MAAM,CAAC,aAAa;uBACpB,MAAM,CAAC,SAAS;uBAChB,MAAM,CAAC,SAAS,KAAK,SAAS;uBAC9B,MAAM,CAAC,SAAS,KAAK,SAAS,EACjC;oBACA,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;oBACtC,wEAAwE;oBACxE;;;;;;;sBAOE;oBACF,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;oBACxC,MAAM,UAAU,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxG,IAAI,UAAU,IAAI,UAAU,EAAE;wBAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;wBAChC,MAAM,QAAQ,GAAU,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBAC3E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;wBACvC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACpC,QAAQ,CAAC,aAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACnD,IAAI,QAAQ,CAAC,SAAS;4BACpB,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAChD;;;;;0BAKE;qBACH;yBAAM,IAAI,UAAU,EAAE;wBACrB,MAAM,QAAQ,GAAU,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBAC3E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;wBACvC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACpC,QAAQ,CAAC,aAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBACnD,QAAQ,CAAC,SAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAC/C;;;;;wBAKA;wBACA,UAAU,EAAE,CAAC;wBACb,IAAI,MAAM,KAAK,KAAK;4BAClB,KAAK,GAAG,QAAQ,CAAC;wBACnB,MAAM,GAAG,QAAQ,CAAC;wBAClB,IAAI,UAAU,IAAI,SAAS,EAAE;4BAC3B;;;8BAGE;4BACF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;yBACzD;qBACF;iBACF;gBACD,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC1B,IAAI,MAAM,KAAK,KAAK;oBAClB,MAAM;aACT;SACF;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;IAC1D,CAAC;CACF;AAED;;;GAGG;AACH,MAAa,wBAAwB;IACnC,2BAA2B;IAC3B,gBAAuB,CAAC;IAKxB,6CAA6C;IACrC,MAAM,CAAC,mBAAmB,CAChC,UAAmB,EAAE,UAAmB,EAAE,QAAgB;QAE1D,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE;YACtC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAClC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAC9D,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC/D,CAAC;YACF,2BAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7F,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;OAUG;IACI,4BAA4B,CACjC,MAAiB,EAAE,IAAa,EAAE,2BAAkD;QAEpF;;;WAGG;QACH,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;YAC/D,IAAI,GAAG,KAAK,CAAC;SACd;QACD,mDAAmD;QACnD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,IAAI,SAAS,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC/G,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC;QACb,IAAI,aAAa,GAAG,MAAM,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,SAAS,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACrH,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACpC,aAAa,GAAG,QAAQ,CAAC;YACzB,SAAS,GAAG,SAAS,CAAC;SACvB;QACD,IAAI,IAAI;YACN,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;aAC/B;YACH,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;SACrC;QACD,uHAAuH;QACvH,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAChD,0FAA0F;QAC1F,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC3E,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;YACxB,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC;gBAC7B,MAAM;YACR;;;;;cAKE;SACH;QACD,+DAA+D;QAC/D,oHAAoH;QACpH,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,EAAG,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAG,CAAC;gBACvE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBAE1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC7B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;;AAxFc,mCAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC/B,kCAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC9B,iCAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAC5B,iCAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SANhC,wBAAwB;AA8FrC;;;GAGG;AACH,MAAM,OAAO,2BAA2B;IACtC,2BAA2B;IAC3B,gBAAuB,CAAC;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,eAAe,CAC3B,EAA8B,EAAE,UAA+B,EAAE,QAA6B;QAE9F,IAAI,EAAE,KAAK,SAAS,EAAE;YACpB,IAAI,UAAU,KAAK,SAAS;gBACzB,EAAU,CAAC,cAAc,GAAG,UAAU,CAAC;YAC1C,IAAI,QAAQ,KAAK,SAAS;gBACvB,EAAU,CAAC,YAAY,GAAG,QAAQ,CAAC;SACvC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,6BAA6B,CACzC,CAAiB,EAAE,uBAA+C;QAElE,MAAM,MAAM,GAAG,CAAC,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QAC5D,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,SAAS,CAAC;QACnB,uDAAuD;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,MAAM,SAAS,GAAG,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClE,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBACpC,OAAO,SAAS,CAAC,CAAC,mCAAmC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC;SACf;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,sBAAsB,CAClC,MAAmB,EAAE,uBAA8D;QAEnF,MAAM,IAAI,GAAY,MAAM,YAAY,IAAI,CAAC;QAC7C,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,uGAAuG;QACvG,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE;YAC/B,MAAM,EAAE,GAAG,2BAA2B,CAAC,6BAA6B,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YACvF,IAAI,EAAE,KAAK,SAAS,EAAE;gBACpB,8BAA8B;aAC/B;iBAAM,IAAI,EAAE,YAAY,cAAc,EAAE;gBACvC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE;oBACnB,IAAI,EAAE,YAAY,cAAc;wBAC9B,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC1B;aACF;SACF;QACD,qFAAqF;QACrF,IAAI,SAAS,CAAC;QACd,IAAI,QAAQ,CAAC;QACb,IAAI,aAAa,CAAC;QAClB,IAAI,MAAM,CAAC;QACX,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;YACrC,IAAI,SAAS,EAAE;gBACb,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3E,IAAI,QAAQ,KAAK,SAAS;oBACxB,IAAI,MAAM,KAAK,SAAS;wBACtB,MAAM,GAAG,QAAQ,CAAC;gBACtB,IAAI,aAAa;oBACf,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBACtC,aAAa,GAAG,QAAQ,CAAC;gBACzB,SAAS,GAAG,SAAS,CAAC;aACvB;SACF;QACD,IAAI,MAAM,IAAI,aAAa,IAAI,MAAM,YAAY,IAAI;YACnD,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACpC,uHAAuH;QACvH,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;QACvC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACnE,oGAAoG;QACpG,MAAM,YAAY,GAAqB,EAAE,CAAC;QAC1C,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,SAAS,CAAC,2BAA2B,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Arc3d } from \"../Arc3d\";\r\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurveCurve } from \"../CurveCurve\";\r\nimport { CurveCurveApproachType, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { LineSegment3d } from \"../LineSegment3d\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { RegionOps } from \"../RegionOps\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\n\r\n/**\r\n * Classification of how the joint is constructed.\r\n * @internal\r\n */\r\nenum JointMode {\r\n Unknown = 0, /** used when joint mode is unknown. */\r\n Cap = 1, /** used to annotate a \"Joint\" at the start/end of a curve without wrap (so there's no \"other\" curve). */\r\n Extend = 2, /** used when offset curves do not intersect and needs expanding to connect. */\r\n Trim = -1, /** used when offset curves intersect and still goes beyond the intersection so need trimming. */\r\n JustGeometry = 3, /** unused */\r\n Gap = 4, /** used when joint construction fails, resulting in a gap in the offset filled by a line segment. */\r\n}\r\n\r\n/**\r\n * Control parameters for joint construction.\r\n * * Define a \"joint\" as the common point between adjacent segments of the input curve.\r\n * * Define the \"turn angle\" at a joint to be the angle in [0,pi] between the first derivatives (tangents) of\r\n * the segments at the joint.\r\n * * When creating offsets, if an offset needs to do an \"outside\" turn, the first applicable construction is applied:\r\n * * If the turn angle is larger than `options.minArcDegrees`, a circular arc is constructed to offset the joint.\r\n * * If the turn angle is less than or equal to `options.maxChamferTurnDegrees`, extend curves along tangent to\r\n * single intersection point (to create a sharp corner).\r\n * * If the turn angle is larger than `options.maxChamferDegrees`, the joint is offset with a line string whose edges:\r\n * * lie outside the arc that would have been created by the first construction\r\n * * have uniform turn angle less than `options.maxChamferDegrees`\r\n * * touch the arc at their midpoint (except first and last edge).\r\n * @public\r\n */\r\nexport class JointOptions {\r\n /**\r\n * Smallest arc to construct.\r\n * * If this control angle is 180 degrees or more, arcs are never created.\r\n */\r\n public minArcDegrees = 180.0;\r\n /** Largest turn angle at which to construct a sharp corner, or largest turn angle in a multi-segment chamfer. */\r\n public maxChamferTurnDegrees = 90;\r\n /**\r\n * Whether to remove the internal turn angle upper bound for sharp corner construction.\r\n * * By default, a sharp corner is not created at a joint when the turn angle is too large, so as to avoid offsets whose\r\n * ranges blow up. Internally, this is implemented by applying an upper bound of 120 degrees to `maxChamferTurnDegrees`.\r\n * * When `allowSharpestCorners` is true, this internal upper bound is removed, allowing sharp corners for turn angles\r\n * up to `maxChamferTurnDegrees`.\r\n * * Thus, if you know your input turn angles are no greater than `maxChamferTurnDegrees`, you can create an offset\r\n * with sharp corners at each joint by setting `minArcDegrees` to 180 and `allowSharpestCorners` to true.\r\n */\r\n public allowSharpestCorners = false;\r\n /** Offset distance, positive to left of base curve. */\r\n public leftOffsetDistance: number = 0;\r\n /** Whether to offset elliptical arcs as elliptical arcs (true) or as B-spline curves (false, default). */\r\n public preserveEllipticalArcs = false;\r\n /**\r\n * Construct JointOptions.\r\n * * leftOffsetDistance is required\r\n * * minArcDegrees and maxChamferDegrees are optional.\r\n */\r\n constructor(\r\n leftOffsetDistance: number, minArcDegrees = 180, maxChamferDegrees = 90,\r\n preserveEllipticalArcs = false, allowSharpestCorners = false\r\n ) {\r\n this.leftOffsetDistance = leftOffsetDistance;\r\n this.minArcDegrees = minArcDegrees;\r\n this.maxChamferTurnDegrees = maxChamferDegrees;\r\n this.preserveEllipticalArcs = preserveEllipticalArcs;\r\n this.allowSharpestCorners = allowSharpestCorners;\r\n }\r\n /** Return a deep clone. */\r\n public clone(): JointOptions {\r\n return new JointOptions(\r\n this.leftOffsetDistance, this.minArcDegrees, this.maxChamferTurnDegrees,\r\n this.preserveEllipticalArcs, this.allowSharpestCorners\r\n );\r\n }\r\n /** Copy values of input options */\r\n public setFrom(other: JointOptions) {\r\n this.leftOffsetDistance = other.leftOffsetDistance;\r\n this.minArcDegrees = other.minArcDegrees;\r\n this.maxChamferTurnDegrees = other.maxChamferTurnDegrees;\r\n this.preserveEllipticalArcs = other.preserveEllipticalArcs;\r\n this.allowSharpestCorners = other.allowSharpestCorners;\r\n }\r\n /**\r\n * Parse a number or JointOptions up to JointOptions:\r\n * * If leftOffsetDistanceOptions is a number, create a JointOptions with other options set to default values.\r\n * * If leftOffsetDistanceOrOptions is a JointOptions, return it unchanged.\r\n * @param leftOffsetDistanceOrOptions\r\n */\r\n public static create(leftOffsetDistanceOrOptions: number | JointOptions): JointOptions {\r\n if (leftOffsetDistanceOrOptions instanceof JointOptions)\r\n return leftOffsetDistanceOrOptions;\r\n return new JointOptions(leftOffsetDistanceOrOptions);\r\n }\r\n /**\r\n /** Return true if the options indicate this amount of turn should be handled with an arc. */\r\n public needArc(theta: Angle): boolean {\r\n return Math.abs(theta.degrees) >= this.minArcDegrees;\r\n }\r\n /** Return the number of corners needed to chamfer the given turn angle. */\r\n public numChamferPoints(theta: Angle): number {\r\n const degrees = Math.abs(theta.degrees);\r\n const minStepDegreesClamp = 10;\r\n let maxStepDegreesClamp = 120;\r\n if (this.allowSharpestCorners) {\r\n maxStepDegreesClamp = this.maxChamferTurnDegrees;\r\n }\r\n const stepDegrees = Geometry.clamp(this.maxChamferTurnDegrees, minStepDegreesClamp, maxStepDegreesClamp);\r\n if (degrees <= stepDegrees)\r\n return 1;\r\n return Math.ceil(degrees / stepDegrees);\r\n }\r\n}\r\n\r\n/**\r\n * Options for offsetting a curve.\r\n * @public\r\n */\r\nexport class OffsetOptions {\r\n /** Options for offsetting and joining CurvePrimitives */\r\n public jointOptions: JointOptions;\r\n /** Options for generating a B-spline curve offset */\r\n public strokeOptions: StrokeOptions;\r\n /** Options that are provided are captured. */\r\n constructor(offsetDistanceOrOptions: number | JointOptions, strokeOptions?: StrokeOptions) {\r\n this.jointOptions = JointOptions.create(offsetDistanceOrOptions);\r\n this.strokeOptions = (strokeOptions !== undefined) ? strokeOptions : StrokeOptions.createForCurves();\r\n }\r\n public get minArcDegrees(): number {\r\n return this.jointOptions.minArcDegrees;\r\n }\r\n public set minArcDegrees(value: number) {\r\n this.jointOptions.minArcDegrees = value;\r\n }\r\n public get maxChamferTurnDegrees(): number {\r\n return this.jointOptions.maxChamferTurnDegrees;\r\n }\r\n public set maxChamferTurnDegrees(value: number) {\r\n this.jointOptions.maxChamferTurnDegrees = value;\r\n }\r\n public get allowSharpestCorners(): boolean {\r\n return this.jointOptions.allowSharpestCorners;\r\n }\r\n public set allowSharpestCorners(value: boolean) {\r\n this.jointOptions.allowSharpestCorners = value;\r\n }\r\n public get leftOffsetDistance(): number {\r\n return this.jointOptions.leftOffsetDistance;\r\n }\r\n public set leftOffsetDistance(value: number) {\r\n this.jointOptions.leftOffsetDistance = value;\r\n }\r\n public get preserveEllipticalArcs(): boolean {\r\n return this.jointOptions.preserveEllipticalArcs;\r\n }\r\n public set preserveEllipticalArcs(value: boolean) {\r\n this.jointOptions.preserveEllipticalArcs = value;\r\n }\r\n /**\r\n * Convert variant input into OffsetOptions.\r\n * * If a JointOptions is provided, it is captured.\r\n * * If an OffsetOptions is provided, a reference to it is returned.\r\n */\r\n public static create(offsetDistanceOrOptions: number | JointOptions | OffsetOptions): OffsetOptions {\r\n if (offsetDistanceOrOptions instanceof OffsetOptions)\r\n return offsetDistanceOrOptions;\r\n return new OffsetOptions(offsetDistanceOrOptions);\r\n }\r\n /** Convert variant input into offset distance */\r\n public static getOffsetDistance(offsetDistanceOrOptions: number | JointOptions | OffsetOptions): number {\r\n if (typeof offsetDistanceOrOptions === \"number\")\r\n return offsetDistanceOrOptions;\r\n return offsetDistanceOrOptions.leftOffsetDistance;\r\n }\r\n /** Return a deep clone. */\r\n public clone(): OffsetOptions {\r\n return new OffsetOptions(this.jointOptions.clone(), this.strokeOptions.clone());\r\n }\r\n}\r\n\r\n/**\r\n * Description of geometry around a joint.\r\n * @internal\r\n */\r\nclass Joint {\r\n /** Enumeration of how the joint is constructed */\r\n public flexure: JointMode;\r\n /** Curve before the joint */\r\n public curve0?: CurvePrimitive;\r\n /** Fractional position on curve0 (may be a trim or extension) */\r\n public fraction0?: number;\r\n /** Curve after the joint (may be a trim or extension) */\r\n public curve1?: CurvePrimitive;\r\n /** Fractional position on curve1 */\r\n public fraction1?: number;\r\n /** Curve to be added within the joint */\r\n public jointCurve?: CurvePrimitive;\r\n /** Common point on the original curves */\r\n public swingPoint?: Point3d;\r\n /** Pointer to next joint */\r\n public nextJoint?: Joint;\r\n /** Pointer to previous joint */\r\n public previousJoint?: Joint;\r\n // capture references to all data . . .\r\n public constructor(\r\n curve0: CurvePrimitive | undefined, curve1: CurvePrimitive | undefined, swingPoint: Point3d | undefined\r\n ) {\r\n this.curve0 = curve0;\r\n this.curve1 = curve1;\r\n this.swingPoint = swingPoint;\r\n this.flexure = JointMode.Unknown;\r\n }\r\n /**\r\n * Try to construct an arc transition from ray0 to ray1 with given center.\r\n */\r\n public static constructArc(ray0: Ray3d, center: Point3d | undefined, ray1: Ray3d): Arc3d | undefined {\r\n if (center !== undefined && Geometry.isSameCoordinate(ray0.origin.distance(center), ray1.origin.distance(center))) {\r\n const angle = ray0.direction.angleToXY(ray1.direction);\r\n const vector0 = Vector3d.createStartEnd(center, ray0.origin);\r\n const vector90 = vector0.rotate90CCWXY();\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, angle.radians));\r\n }\r\n return undefined;\r\n }\r\n /** Extract a json object of {curve0:data, fraction0:data, curve1:data, fraction1:data} */\r\n public shallowExtract(): any {\r\n return { curve0: this.curve0, curve1: this.curve1, fraction0: this.fraction0, fraction1: this.fraction1 };\r\n }\r\n /** Establish the nextJoint and previousJoint links from joint0 to joint1. */\r\n public static link(joint0: Joint, joint1: Joint | undefined) {\r\n joint0.nextJoint = joint1;\r\n if (joint1)\r\n joint1.previousJoint = joint0;\r\n if (joint0.curve1 && joint1 && !joint1.curve0)\r\n joint1.curve0 = joint0.curve1;\r\n else if (!joint0.curve1 && joint1 && joint1.curve0)\r\n joint0.curve1 = joint1.curve0;\r\n }\r\n /**\r\n * * If nextJoint and nextJoint.fraction0 are defined, return them.\r\n * * Otherwise return defaultValue\r\n */\r\n public nextJointFraction0(defaultValue: number): number {\r\n if (this.nextJoint && this.nextJoint.fraction0 !== undefined)\r\n return this.nextJoint.fraction0;\r\n return defaultValue;\r\n }\r\n private static addStrokes(destination: LineString3d, curve?: CurvePrimitive) {\r\n if (curve) {\r\n curve.emitStrokes(destination);\r\n }\r\n }\r\n private static addPoint(destination: LineString3d, point: Point3d) {\r\n if (destination.packedPoints.length > 0) {\r\n const pointA = destination.endPoint();\r\n if (!pointA.isAlmostEqual(point))\r\n destination.packedPoints.push(point);\r\n }\r\n }\r\n /** Append stroke points along the offset curve defined by the Joint chain to the destination line string. */\r\n public static collectStrokesFromChain(start: Joint, destination: LineString3d, maxTest: number = 100) {\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.addStrokes(destination, joint.jointCurve);\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n if (curve1) {\r\n if (!joint.jointCurve) {\r\n this.addPoint(destination, curve1.startPoint());\r\n }\r\n }\r\n this.addStrokes(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest\r\n );\r\n }\r\n private static collectPrimitive(destination: CurvePrimitive[], primitive?: CurvePrimitive) {\r\n if (primitive) {\r\n if (destination.length > 0) {\r\n const pointA = destination[destination.length - 1].endPoint();\r\n const pointB = primitive.startPoint();\r\n if (!pointA.isAlmostEqual(pointB)) {\r\n destination.push(LineSegment3d.create(pointA, pointB));\r\n }\r\n }\r\n destination.push(primitive);\r\n }\r\n }\r\n private static adjustJointToPrimitives(joint: Joint) {\r\n const ls = joint.jointCurve;\r\n if (ls instanceof LineString3d) {\r\n if (joint.curve0) {\r\n const curvePoint = joint.curve0.endPoint();\r\n const jointPoint0 = ls.startPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint0))\r\n ls.packedPoints.setAtCheckedPointIndex(0, curvePoint);\r\n }\r\n if (joint.curve1) {\r\n const curvePoint = joint.curve1.startPoint();\r\n const jointPoint1 = ls.endPoint();\r\n if (!curvePoint.isAlmostEqual(jointPoint1))\r\n ls.packedPoints.setAtCheckedPointIndex(ls.packedPoints.length - 1, curvePoint);\r\n }\r\n }\r\n }\r\n /** Append CurvePrimitives along the offset curve defined by the Joint chain to the destination array. */\r\n public static collectCurvesFromChain(start: Joint | undefined, destination: CurvePrimitive[], maxTest: number = 100) {\r\n if (start === undefined)\r\n return;\r\n let numOut = -2 * maxTest; // allow extra things to happen\r\n Joint.visitJointsOnChain(\r\n start,\r\n (joint: Joint) => {\r\n this.adjustJointToPrimitives(joint);\r\n this.collectPrimitive(destination, joint.jointCurve);\r\n\r\n if (joint.curve1 && joint.fraction1 !== undefined) {\r\n const fA = joint.fraction1;\r\n const fB = joint.nextJointFraction0(1.0);\r\n let curve1;\r\n if (fA === 0.0 && fB === 1.0)\r\n curve1 = joint.curve1.clone();\r\n else if (fA < fB)\r\n curve1 = joint.curve1.clonePartialCurve(fA, fB); // trimming is done by clonePartialCurve\r\n this.collectPrimitive(destination, curve1);\r\n }\r\n return numOut++ < maxTest;\r\n },\r\n maxTest\r\n );\r\n }\r\n /** Execute `joint.annotateJointMode()` at all joints on the chain to set some of the joints attributes. */\r\n public static annotateChain(start: Joint | undefined, options: JointOptions, maxTest: number = 100) {\r\n if (start)\r\n Joint.visitJointsOnChain(start, (joint: Joint) => { joint.annotateJointMode(options); return true; }, maxTest);\r\n }\r\n /**\r\n * Visit joints on a chain.\r\n * * terminate on `false` return from `callback`\r\n * @param start first (and, for cyclic chain, final) joint\r\n * @param callback function to call with each Joint as a single parameter.\r\n */\r\n public static visitJointsOnChain(start: Joint, callback: (joint: Joint) => boolean, maxTest: number = 100): boolean {\r\n let joint: Joint | undefined = start;\r\n if (joint) {\r\n let numTest = 0;\r\n while (joint !== undefined) {\r\n if (numTest++ >= maxTest + 5) // allow extra things to happen\r\n return true;\r\n if (!callback(joint))\r\n return false;\r\n joint = joint.nextJoint;\r\n if (joint === start)\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n /** NOTE: no assumption on type of curve0, curve1 */\r\n private annotateExtension(options: JointOptions) {\r\n if (this.curve0 && this.curve1) {\r\n const ray0 = this.curve0.fractionToPointAndDerivative(1.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n if (intersection.detailA.fraction >= 0.0 && intersection.detailB.fraction <= 0.0) {\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Extend;\r\n const theta = ray0.getDirectionRef().angleToXY(ray1.getDirectionRef()); // angle between the 2 ray lines\r\n if (options.needArc(theta)) {\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc) {\r\n this.jointCurve = arc;\r\n return;\r\n }\r\n }\r\n const numChamferPoints = options.numChamferPoints(theta); // how many interior points in the linestring\r\n if (numChamferPoints <= 1) { // create sharp corner\r\n this.jointCurve = LineString3d.create(ray0.origin, intersection.detailA.point, ray1.origin);\r\n return;\r\n }\r\n if (numChamferPoints > 1) { // create chamfer corner (a line string)\r\n const radians0 = theta.radians;\r\n const numHalfStep = 2.0 * numChamferPoints;\r\n const halfStepRadians = radians0 / numHalfStep;\r\n const arc = Joint.constructArc(ray0, (this.curve0 as any).baseCurveEnd, ray1);\r\n if (arc !== undefined) {\r\n const radialFraction = 1 / Math.cos(halfStepRadians);\r\n const jointCurve = LineString3d.create();\r\n this.jointCurve = jointCurve;\r\n jointCurve.addPoint(ray0.origin); // possibly extend segment or line string\r\n\r\n for (let i = 0; i < numChamferPoints; i++) {\r\n const arcFraction = (1 + 2 * i) / numHalfStep;\r\n jointCurve.addPoint(arc.fractionAndRadialFractionToPoint(arcFraction, radialFraction));\r\n }\r\n jointCurve.addPoint(ray1.origin); // possibly extend segment or line string.\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n // if there is no intersection between the 2 ray lines, fill the gap by a line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n /** Select the index at which summed fraction difference is smallest */\r\n private selectIntersectionIndexByFraction(\r\n fractionA: number, fractionB: number, intersections: CurveLocationDetailPair[]\r\n ): number {\r\n let index = -1;\r\n let aMin = Number.MAX_VALUE;\r\n for (let i = 0; i < intersections.length; i++) {\r\n const a = Math.abs(intersections[i].detailA.fraction - fractionA)\r\n + Math.abs(intersections[i].detailB.fraction - fractionB);\r\n if (a < aMin) {\r\n aMin = a;\r\n index = i;\r\n }\r\n }\r\n return index;\r\n }\r\n /**\r\n * Examine the adjacent geometry to set some of joint attributes:\r\n * * set JointMode: one of Cap, Extend, or Trim\r\n * * set fraction0 and fraction1 of intersection of curve0 and curve1\r\n * * set joint curve\r\n * * this REFERENCES curve0, curve1, fraction0, fraction1\r\n * * this does not reference nextJoint and previousJoint\r\n */\r\n public annotateJointMode(options: JointOptions): void {\r\n if (!this.curve0 && this.curve1) { // joint at the start of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction1 = 0.0;\r\n } else if (this.curve0 && !this.curve1) { // joint at the end of the chain\r\n this.flexure = JointMode.Cap;\r\n this.fraction0 = 1.0;\r\n } else if (this.curve0 && this.curve1) { // joints at the middle of the chain\r\n if (this.curve0.endPoint().isAlmostEqual(this.curve1.startPoint())) { // joint between colinear segments\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n this.flexure = JointMode.Trim;\r\n } else if (this.curve0 instanceof LineSegment3d && this.curve1 instanceof LineSegment3d) { // pair of lines\r\n const ray0 = this.curve0.fractionToPointAndDerivative(0.0);\r\n const ray1 = this.curve1.fractionToPointAndDerivative(0.0);\r\n const intersection = Ray3d.closestApproachRay3dRay3d(ray0, ray1); // intersection of the 2 ray lines\r\n if (intersection.approachType === CurveCurveApproachType.Intersection) {\r\n this.fraction0 = intersection.detailA.fraction;\r\n this.fraction1 = intersection.detailB.fraction;\r\n if (this.fraction0 >= 1.0 && this.fraction1 <= 0.0) { // need to extend\r\n this.annotateExtension(options);\r\n } else if (this.fraction0 < 1.0 && this.fraction1 > 0.0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n } else if (this.fraction0 > 1.0 && this.fraction1 > 1.0) { // need to fill gap with a single line segment\r\n this.flexure = JointMode.Gap;\r\n this.jointCurve = LineSegment3d.create(this.curve0.fractionToPoint(1.0), this.curve1.fractionToPoint(0.0));\r\n this.fraction0 = 1.0;\r\n this.fraction1 = 0.0;\r\n }\r\n }\r\n } else { // generic pair of curves\r\n const intersections = CurveCurve.intersectionXYPairs(this.curve0, false, this.curve1, false);\r\n const intersectionIndex = this.selectIntersectionIndexByFraction(1.0, 0.0, intersections);\r\n if (intersectionIndex >= 0) { // need to trim\r\n this.flexure = JointMode.Trim;\r\n this.fraction0 = intersections[intersectionIndex].detailA.fraction;\r\n this.fraction1 = intersections[intersectionIndex].detailB.fraction;\r\n } else { // need to extend\r\n this.annotateExtension(options);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * * Examine the primitive trim fractions between each pair of joints.\r\n * * If trim fractions indicate the primitive must disappear, replace the joint pair by a new joint pointing at\r\n * surrounding primitives\r\n * @param start\r\n */\r\n public static removeDegeneratePrimitives(\r\n start: Joint, options: JointOptions, maxTest: number\r\n ): { newStart: Joint, numJointRemoved: number } {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\"\\nENTER removeDegenerates\");\r\n */\r\n let jointA: Joint | undefined = start;\r\n let numRemoved = 0;\r\n const maxRemove = 1;\r\n let numTest = 0;\r\n if (jointA) {\r\n while (jointA !== undefined && numTest++ < maxTest) {\r\n const jointB = jointA.nextJoint;\r\n if (jointA\r\n && jointB\r\n && jointA.previousJoint\r\n && jointB.nextJoint\r\n && jointA.fraction1 !== undefined\r\n && jointB.fraction0 !== undefined\r\n ) {\r\n const f0 = jointA.fraction1;\r\n const f1 = jointB.fraction0;\r\n const g0 = jointB.fraction1;\r\n const g1 = jointB.nextJoint.fraction0;\r\n // f0 and f1 are fractions on the single primitive between these joints.\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\"joint candidate\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointA.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(prettyPrint(jointB.shallowExtract()));\r\n GeometryCoreTestIO.consoleLog(\"FRACTIONS \", { fA1: f0, fB0: f1 });\r\n }\r\n */\r\n const eliminateF = f0 >= f1 || f0 > 1.0;\r\n const eliminateG = (g0 !== undefined && g0 > 1.0) || (g0 !== undefined && g1 !== undefined && g0 >= g1);\r\n if (eliminateF && eliminateG) {\r\n const jointC = jointB.nextJoint;\r\n const newJoint: Joint = new Joint(jointA.curve0, jointC.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointC.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n if (newJoint.nextJoint)\r\n newJoint.nextJoint.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW DOUBLE CUT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n } else if (eliminateF) {\r\n const newJoint: Joint = new Joint(jointA.curve0, jointB.curve1, undefined);\r\n Joint.link(jointA.previousJoint, newJoint);\r\n Joint.link(newJoint, jointB.nextJoint);\r\n newJoint.annotateJointMode(options);\r\n newJoint.previousJoint!.annotateJointMode(options);\r\n newJoint.nextJoint!.annotateJointMode(options);\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" NEW JOINT\");\r\n GeometryCoreTestIO.consoleLog(prettyPrint(newJoint.shallowExtract()));\r\n }\r\n */\r\n numRemoved++;\r\n if (jointA === start)\r\n start = newJoint;\r\n jointA = newJoint;\r\n if (numRemoved >= maxRemove) {\r\n /*\r\n if (Checker.noisy.PolygonOffset)\r\n GeometryCoreTestIO.consoleLog(\" EXIT removeDegenerates at maxRemove\\n\");\r\n */\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n }\r\n }\r\n jointA = jointA.nextJoint;\r\n if (jointA === start)\r\n break;\r\n }\r\n }\r\n return { newStart: start, numJointRemoved: numRemoved };\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire offset.\r\n * @internal\r\n */\r\nexport class PolygonWireOffsetContext {\r\n /** Construct a context. */\r\n public constructor() { }\r\n private static _unitAlong = Vector3d.create();\r\n private static _unitPerp = Vector3d.create();\r\n private static _offsetA = Point3d.create();\r\n private static _offsetB = Point3d.create();\r\n // Construct a single offset from base points\r\n private static createOffsetSegment(\r\n basePointA: Point3d, basePointB: Point3d, distance: number\r\n ): CurvePrimitive | undefined {\r\n Vector3d.createStartEnd(basePointA, basePointB, this._unitAlong);\r\n if (this._unitAlong.normalizeInPlace()) {\r\n this._unitAlong.rotate90CCWXY(this._unitPerp);\r\n const segment = LineSegment3d.create(\r\n basePointA.plusScaled(this._unitPerp, distance, this._offsetA),\r\n basePointB.plusScaled(this._unitPerp, distance, this._offsetB)\r\n );\r\n CurveChainWireOffsetContext.applyBasePoints(segment, basePointA.clone(), basePointB.clone());\r\n return segment;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a wire (not area) that is offset from given polyline or polygon (which must be in xy-plane or in\r\n * a plane parallel to xy-plane).\r\n * * This is a simple wire offset (in the form of a line string), not an area.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param points a single loop or path\r\n * @param wrap true to offset the wraparound joint. Assumes first = last point.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, leftOffsetDistanceOrOptions: number | JointOptions\r\n ): CurveChain | undefined {\r\n /**\r\n * if \"wrap = true\", then first and last point in the points array must be close; otherwise\r\n * generated offset will be invalid.\r\n */\r\n if (wrap && !points[0].isAlmostEqual(points[points.length - 1])) {\r\n wrap = false;\r\n }\r\n /** create raw offsets as a linked list (joint0) */\r\n const options = JointOptions.create(leftOffsetDistanceOrOptions);\r\n const numPoints = points.length;\r\n let fragment0 = PolygonWireOffsetContext.createOffsetSegment(points[0], points[1], options.leftOffsetDistance);\r\n let joint0 = new Joint(undefined, fragment0, points[0]);\r\n let newJoint;\r\n let previousJoint = joint0;\r\n for (let i = 1; i + 1 < numPoints; i++) {\r\n const fragment1 = PolygonWireOffsetContext.createOffsetSegment(points[i], points[i + 1], options.leftOffsetDistance);\r\n newJoint = new Joint(fragment0, fragment1, points[i]);\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n if (wrap)\r\n Joint.link(previousJoint, joint0);\r\n else {\r\n newJoint = new Joint(fragment0, undefined, points[numPoints - 1]);\r\n Joint.link(previousJoint, newJoint);\r\n }\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n Joint.annotateChain(joint0, options, numPoints);\r\n /** make limited passes through the Joint chain until no self-intersections are removed */\r\n for (let pass = 0; pass++ < 5;) {\r\n const state = Joint.removeDegeneratePrimitives(joint0, options, numPoints);\r\n joint0 = state.newStart;\r\n if (state.numJointRemoved === 0)\r\n break;\r\n /*\r\n if (Checker.noisy.PolygonOffset) {\r\n GeometryCoreTestIO.consoleLog(\" POST REMOVE DEGENERATES \" + state.numJointRemoved);\r\n Joint.visitJointsOnChain(joint0, (joint: Joint) => { GeometryCoreTestIO.consoleLog(prettyPrint(joint.shallowExtract())); return true; });\r\n }\r\n */\r\n }\r\n // Joint.collectPrimitivesFromChain(joint0, result, numPoints);\r\n /** turn the Joint linked list into a CurveCollection (Loop or Path). trimming is done in collectStrokesFromChain */\r\n const chain = LineString3d.create();\r\n Joint.collectStrokesFromChain(joint0, chain, numPoints);\r\n const n = chain.packedPoints.length;\r\n if (n > 1) {\r\n if (chain.packedPoints.front()!.isAlmostEqual(chain.packedPoints.back()!))\r\n return Loop.create(chain);\r\n else\r\n return Path.create(chain);\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Context for building a wire offset from a Path or Loop of CurvePrimitives\r\n * @internal\r\n */\r\nexport class CurveChainWireOffsetContext {\r\n /** construct a context. */\r\n public constructor() { }\r\n /**\r\n * Annotate a CurvePrimitive with properties `baseCurveStart` and `baseCurveEnd`.\r\n * @param cp curve primitive to annotate\r\n * @param startPoint optional start point\r\n * @param endPoint optional end point\r\n * @return the input CurvePrimitive with annotations\r\n */\r\n public static applyBasePoints(\r\n cp: CurvePrimitive | undefined, startPoint: Point3d | undefined, endPoint: Point3d | undefined\r\n ): CurvePrimitive | undefined {\r\n if (cp !== undefined) {\r\n if (startPoint !== undefined)\r\n (cp as any).baseCurveStart = startPoint;\r\n if (endPoint !== undefined)\r\n (cp as any).baseCurveEnd = endPoint;\r\n }\r\n return cp;\r\n }\r\n /**\r\n * Create the offset of a single primitive as viewed in the xy-plane (ignoring z).\r\n * * each primitive may be labeled (as an `any` object) with start or end point of base curve:\r\n * * `(primitive as any).baseCurveStart: Point3d`\r\n * * `(primitive as any).baseCurveEnd: Point3d`\r\n * @param g primitive to offset\r\n * @param offsetDistanceOrOptions offset distance (positive to left of g), or options object\r\n */\r\n public static createSingleOffsetPrimitiveXY(\r\n g: CurvePrimitive, offsetDistanceOrOptions: number | OffsetOptions\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const offset = g.constructOffsetXY(offsetDistanceOrOptions);\r\n if (offset === undefined)\r\n return undefined;\r\n // decorate each offset with its base curve's endpoints\r\n if (Array.isArray(offset)) {\r\n const basePrims = g.collectCurvePrimitives(undefined, true, true);\r\n if (basePrims.length !== offset.length)\r\n return undefined; // unexpected aggregate curve type!\r\n for (let i = 0; i < basePrims.length; ++i)\r\n this.applyBasePoints(offset[i], basePrims[i].startPoint(), basePrims[i].endPoint());\r\n return offset;\r\n }\r\n return this.applyBasePoints(offset, g.startPoint(), g.endPoint());\r\n }\r\n /**\r\n * Construct curves that are offset from a Path or Loop as viewed in xy-plane (ignoring z).\r\n * * The construction will remove \"some\" local effects of features smaller than the offset distance, but will\r\n * not detect self intersection among widely separated edges.\r\n * * If offsetDistance is given as a number, default OffsetOptions are applied.\r\n * * See [[JointOptions]] class doc for offset construction rules.\r\n * @param curves base curves.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or options object.\r\n */\r\n public static constructCurveXYOffset(\r\n curves: Path | Loop, offsetDistanceOrOptions: number | JointOptions | OffsetOptions\r\n ): CurveCollection | undefined {\r\n const wrap: boolean = curves instanceof Loop;\r\n const offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n const simpleOffsets: CurvePrimitive[] = [];\r\n /** traverse primitives (children of curves) and create simple offsets of each primitive as an array */\r\n for (const c of curves.children) {\r\n const c1 = CurveChainWireOffsetContext.createSingleOffsetPrimitiveXY(c, offsetOptions);\r\n if (c1 === undefined) {\r\n // bad .. maybe arc to inside?\r\n } else if (c1 instanceof CurvePrimitive) {\r\n simpleOffsets.push(c1);\r\n } else if (Array.isArray(c1)) {\r\n for (const c2 of c1) {\r\n if (c2 instanceof CurvePrimitive)\r\n simpleOffsets.push(c2);\r\n }\r\n }\r\n }\r\n /** create joints between array elements to make offsets as a linked list (joint0) */\r\n let fragment0;\r\n let newJoint;\r\n let previousJoint;\r\n let joint0;\r\n for (const fragment1 of simpleOffsets) {\r\n if (fragment1) {\r\n newJoint = new Joint(fragment0, fragment1, fragment1.fractionToPoint(0.0));\r\n if (newJoint !== undefined)\r\n if (joint0 === undefined)\r\n joint0 = newJoint;\r\n if (previousJoint)\r\n Joint.link(previousJoint, newJoint);\r\n previousJoint = newJoint;\r\n fragment0 = fragment1;\r\n }\r\n }\r\n if (joint0 && previousJoint && curves instanceof Loop)\r\n Joint.link(previousJoint, joint0);\r\n /** annotateChain sets some of the joints attributes (including how to extend curves or fill the gap between curves) */\r\n const numOffset = simpleOffsets.length;\r\n Joint.annotateChain(joint0, offsetOptions.jointOptions, numOffset);\r\n /** turn the Joint linked list into a CurveCollection. trimming is done in collectCurvesFromChain */\r\n const outputCurves: CurvePrimitive[] = [];\r\n Joint.collectCurvesFromChain(joint0, outputCurves, numOffset);\r\n return RegionOps.createLoopPathOrBagOfCurves(outputCurves, wrap, true);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SumLengthsContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/SumLengthsContext.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,uBAAuB;IAC5D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO;
|
|
1
|
+
{"version":3,"file":"SumLengthsContext.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/SumLengthsContext.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,uBAAuB;IAC5D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO;WAIO,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;IAKzC,sBAAsB,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;CAGrG"}
|
|
@@ -8,7 +8,10 @@ import { RecursiveCurveProcessor } from "../CurveProcessor";
|
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
10
|
export class SumLengthsContext extends RecursiveCurveProcessor {
|
|
11
|
-
constructor() {
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this._sum = 0.0;
|
|
14
|
+
}
|
|
12
15
|
static sumLengths(target) {
|
|
13
16
|
const context = new SumLengthsContext();
|
|
14
17
|
target.announceToCurveProcessor(context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SumLengthsContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/SumLengthsContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,uBAAuB;IAE5D,
|
|
1
|
+
{"version":3,"file":"SumLengthsContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/SumLengthsContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,uBAAuB;IAE5D;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IACM,MAAM,CAAC,UAAU,CAAC,MAAuB;QAC9C,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IACe,sBAAsB,CAAC,cAA8B,EAAE,cAAsB;QAC3F,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\nimport { CurveCollection } from \"../CurveCollection\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { RecursiveCurveProcessor } from \"../CurveProcessor\";\r\n\r\n/**\r\n * Algorithmic class: Sum lengths of curves\r\n * @internal\r\n */\r\nexport class SumLengthsContext extends RecursiveCurveProcessor {\r\n private _sum: number;\r\n private constructor() {\r\n super();\r\n this._sum = 0.0;\r\n }\r\n public static sumLengths(target: CurveCollection): number {\r\n const context = new SumLengthsContext();\r\n target.announceToCurveProcessor(context);\r\n return context._sum;\r\n }\r\n public override announceCurvePrimitive(curvePrimitive: CurvePrimitive, _indexInParent: number): void {\r\n this._sum += curvePrimitive.curveLength();\r\n }\r\n}\r\n"]}
|
|
@@ -327,8 +327,8 @@ export declare class Matrix3d implements BeJSONFunctions {
|
|
|
327
327
|
static createPerpendicularVectorFavorPlaneContainingZ(vectorA: Vector3d, result?: Vector3d): Vector3d;
|
|
328
328
|
/**
|
|
329
329
|
* Create a matrix from column vectors, shuffled into place per axisOrder
|
|
330
|
-
* For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]
|
|
331
|
-
* Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because
|
|
330
|
+
* * For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]
|
|
331
|
+
* * Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because
|
|
332
332
|
* Y is at index 0 so vectorU goes to the column Y (column 2), Z is at index 1 so vectorV goes
|
|
333
333
|
* to the column Z (column 3), and X is at index 2 so vectorW goes to the column X (column 1)
|
|
334
334
|
*/
|
|
@@ -613,8 +613,8 @@ class Matrix3d {
|
|
|
613
613
|
}
|
|
614
614
|
/**
|
|
615
615
|
* Create a matrix from column vectors, shuffled into place per axisOrder
|
|
616
|
-
* For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]
|
|
617
|
-
* Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because
|
|
616
|
+
* * For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]
|
|
617
|
+
* * Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because
|
|
618
618
|
* Y is at index 0 so vectorU goes to the column Y (column 2), Z is at index 1 so vectorV goes
|
|
619
619
|
* to the column Z (column 3), and X is at index 2 so vectorW goes to the column X (column 1)
|
|
620
620
|
*/
|