@itwin/core-geometry 4.9.0-dev.12 → 4.9.0-dev.14

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.
Files changed (202) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Geometry.d.ts +57 -46
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +73 -53
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/curve/Arc3d.d.ts +128 -34
  7. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  8. package/lib/cjs/curve/Arc3d.js +174 -20
  9. package/lib/cjs/curve/Arc3d.js.map +1 -1
  10. package/lib/cjs/curve/CurveCollection.d.ts +2 -1
  11. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveCollection.js +2 -1
  13. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  14. package/lib/cjs/curve/CurveLocationDetail.d.ts +19 -1
  15. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveLocationDetail.js +39 -0
  17. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  18. package/lib/cjs/curve/LineString3d.js +1 -1
  19. package/lib/cjs/curve/LineString3d.js.map +1 -1
  20. package/lib/cjs/curve/OffsetOptions.d.ts +1 -1
  21. package/lib/cjs/curve/OffsetOptions.js +1 -1
  22. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  23. package/lib/cjs/curve/RegionOps.d.ts +2 -1
  24. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  25. package/lib/cjs/curve/RegionOps.js +2 -1
  26. package/lib/cjs/curve/RegionOps.js.map +1 -1
  27. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  28. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  29. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  30. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  31. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  32. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  33. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +1000 -0
  34. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  35. package/lib/cjs/geometry3d/Angle.d.ts +18 -5
  36. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  37. package/lib/cjs/geometry3d/Angle.js +23 -7
  38. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  39. package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -1
  40. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  41. package/lib/cjs/geometry3d/AngleSweep.js +47 -12
  42. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  43. package/lib/cjs/geometry3d/Matrix3d.d.ts +6 -4
  44. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  45. package/lib/cjs/geometry3d/Matrix3d.js +6 -4
  46. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  47. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +2 -3
  48. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  49. package/lib/cjs/geometry3d/Point3dVector3d.js +2 -3
  50. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  51. package/lib/cjs/geometry3d/PointHelpers.d.ts +6 -5
  52. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  53. package/lib/cjs/geometry3d/PointHelpers.js +11 -10
  54. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  55. package/lib/cjs/geometry3d/Range.d.ts +6 -1
  56. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  57. package/lib/cjs/geometry3d/Range.js +9 -3
  58. package/lib/cjs/geometry3d/Range.js.map +1 -1
  59. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  60. package/lib/cjs/geometry3d/Transform.js +1 -1
  61. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  62. package/lib/cjs/numerics/Newton.d.ts +3 -3
  63. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  64. package/lib/cjs/numerics/Newton.js +14 -16
  65. package/lib/cjs/numerics/Newton.js.map +1 -1
  66. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  67. package/lib/cjs/numerics/Polynomials.js +2 -2
  68. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  69. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +7 -4
  70. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  71. package/lib/cjs/polyface/PolyfaceBuilder.js +8 -4
  72. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  73. package/lib/cjs/polyface/PolyfaceQuery.d.ts +3 -3
  74. package/lib/cjs/polyface/PolyfaceQuery.js +3 -3
  75. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  76. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  77. package/lib/cjs/serialization/BGFBWriter.js +2 -2
  78. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  79. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  80. package/lib/cjs/topology/Graph.d.ts +1 -1
  81. package/lib/cjs/topology/Graph.js +2 -2
  82. package/lib/cjs/topology/Graph.js.map +1 -1
  83. package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  84. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +1 -1
  85. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  86. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  87. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  88. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +168 -127
  89. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  90. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +35 -35
  91. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  92. package/lib/cjs/topology/HalfEdgePositionDetail.js +63 -41
  93. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  94. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +64 -12
  95. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  96. package/lib/cjs/topology/InsertAndRetriangulateContext.js +174 -75
  97. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  98. package/lib/cjs/topology/Triangulation.d.ts +16 -10
  99. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  100. package/lib/cjs/topology/Triangulation.js +23 -30
  101. package/lib/cjs/topology/Triangulation.js.map +1 -1
  102. package/lib/esm/Geometry.d.ts +57 -46
  103. package/lib/esm/Geometry.d.ts.map +1 -1
  104. package/lib/esm/Geometry.js +73 -53
  105. package/lib/esm/Geometry.js.map +1 -1
  106. package/lib/esm/curve/Arc3d.d.ts +128 -34
  107. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  108. package/lib/esm/curve/Arc3d.js +172 -19
  109. package/lib/esm/curve/Arc3d.js.map +1 -1
  110. package/lib/esm/curve/CurveCollection.d.ts +2 -1
  111. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  112. package/lib/esm/curve/CurveCollection.js +2 -1
  113. package/lib/esm/curve/CurveCollection.js.map +1 -1
  114. package/lib/esm/curve/CurveLocationDetail.d.ts +19 -1
  115. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  116. package/lib/esm/curve/CurveLocationDetail.js +39 -0
  117. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  118. package/lib/esm/curve/LineString3d.js +1 -1
  119. package/lib/esm/curve/LineString3d.js.map +1 -1
  120. package/lib/esm/curve/OffsetOptions.d.ts +1 -1
  121. package/lib/esm/curve/OffsetOptions.js +1 -1
  122. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  123. package/lib/esm/curve/RegionOps.d.ts +2 -1
  124. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  125. package/lib/esm/curve/RegionOps.js +2 -1
  126. package/lib/esm/curve/RegionOps.js.map +1 -1
  127. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  128. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  129. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  130. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  131. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  132. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  133. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +995 -0
  134. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  135. package/lib/esm/geometry3d/Angle.d.ts +18 -5
  136. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  137. package/lib/esm/geometry3d/Angle.js +23 -7
  138. package/lib/esm/geometry3d/Angle.js.map +1 -1
  139. package/lib/esm/geometry3d/AngleSweep.d.ts +14 -1
  140. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  141. package/lib/esm/geometry3d/AngleSweep.js +47 -12
  142. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  143. package/lib/esm/geometry3d/Matrix3d.d.ts +6 -4
  144. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  145. package/lib/esm/geometry3d/Matrix3d.js +6 -4
  146. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  147. package/lib/esm/geometry3d/Point3dVector3d.d.ts +2 -3
  148. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  149. package/lib/esm/geometry3d/Point3dVector3d.js +2 -3
  150. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  151. package/lib/esm/geometry3d/PointHelpers.d.ts +6 -5
  152. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  153. package/lib/esm/geometry3d/PointHelpers.js +11 -10
  154. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  155. package/lib/esm/geometry3d/Range.d.ts +6 -1
  156. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  157. package/lib/esm/geometry3d/Range.js +9 -3
  158. package/lib/esm/geometry3d/Range.js.map +1 -1
  159. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  160. package/lib/esm/geometry3d/Transform.js +1 -1
  161. package/lib/esm/geometry3d/Transform.js.map +1 -1
  162. package/lib/esm/numerics/Newton.d.ts +3 -3
  163. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  164. package/lib/esm/numerics/Newton.js +14 -16
  165. package/lib/esm/numerics/Newton.js.map +1 -1
  166. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  167. package/lib/esm/numerics/Polynomials.js +2 -2
  168. package/lib/esm/numerics/Polynomials.js.map +1 -1
  169. package/lib/esm/polyface/PolyfaceBuilder.d.ts +7 -4
  170. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  171. package/lib/esm/polyface/PolyfaceBuilder.js +8 -4
  172. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  173. package/lib/esm/polyface/PolyfaceQuery.d.ts +3 -3
  174. package/lib/esm/polyface/PolyfaceQuery.js +3 -3
  175. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  176. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  177. package/lib/esm/serialization/BGFBWriter.js +2 -2
  178. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  179. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  180. package/lib/esm/topology/Graph.d.ts +1 -1
  181. package/lib/esm/topology/Graph.js +2 -2
  182. package/lib/esm/topology/Graph.js.map +1 -1
  183. package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  184. package/lib/esm/topology/HalfEdgeNodeXYZUV.js +1 -1
  185. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  186. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  187. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  188. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +168 -127
  189. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  190. package/lib/esm/topology/HalfEdgePositionDetail.d.ts +35 -35
  191. package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  192. package/lib/esm/topology/HalfEdgePositionDetail.js +63 -41
  193. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  194. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +64 -12
  195. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  196. package/lib/esm/topology/InsertAndRetriangulateContext.js +173 -74
  197. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  198. package/lib/esm/topology/Triangulation.d.ts +16 -10
  199. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  200. package/lib/esm/topology/Triangulation.js +24 -31
  201. package/lib/esm/topology/Triangulation.js.map +1 -1
  202. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"OffsetOptions.js","sourceRoot":"","sources":["../../../src/curve/OffsetOptions.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 { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * Control parameters for joint construction, used in offset construction methods such as [[RegionOps.constructPolygonWireXYOffset]] and [[Region.Ops.constructCurveXYOffset]].\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 with\r\n * sharp corners at each joint by setting `maxChamferTurnDegrees < minArcDegrees` 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 /** 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, used in offset construction methods such as [[CurvePrimitive.constructOffsetXY]], [[RegionOps.constructPolygonWireXYOffset]] and [[Region.Ops.constructCurveXYOffset]].\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"]}
1
+ {"version":3,"file":"OffsetOptions.js","sourceRoot":"","sources":["../../../src/curve/OffsetOptions.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 { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * Control parameters for joint construction, used in offset construction methods such as [[RegionOps.constructPolygonWireXYOffset]] and [[RegionOps.constructCurveXYOffset]].\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 with\r\n * sharp corners at each joint by setting `maxChamferTurnDegrees < minArcDegrees` 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 /** 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, used in offset construction methods such as [[CurvePrimitive.constructOffsetXY]], [[RegionOps.constructPolygonWireXYOffset]] and [[Region.Ops.constructCurveXYOffset]].\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"]}
@@ -295,7 +295,8 @@ export declare class RegionOps {
295
295
  */
296
296
  static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion;
297
297
  /**
298
- * Find all areas bounded by the unstructured, possibly intersecting curves.
298
+ * Find all xy-areas bounded by the unstructured, possibly intersecting curves.
299
+ * * For best results, input curves should be parallel to the xy-plane, as z-coordinates are ignored.
299
300
  * * A common use case of this method is to assemble the bounding "exterior" loop (or loops) containing the
300
301
  * input curves.
301
302
  * * This method does not add bridge edges to connect outer loops to inner loops. Each disconnected loop,
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RegionOps.d.ts","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAC0B,oBAAoB,EAAyB,0BAA0B,EACvG,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI1E,OAAO,EAAe,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM7D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;AAEvH;;;GAGG;AACH,oBAAY,kBAAkB;IAC5B,KAAK,IAAI;IACT,MAAM,IAAI;IACV,YAAY,IAAI;IAChB,OAAO,IAAI;IACX,OAAO,IAAI;CACZ;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB;;;;;OAKG;WACW,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS;IAS3E;;;;MAIE;WACY,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,GAAE,MAAqC,GAAG,MAAM;IAKtH;;;;OAIG;WACW,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAQhE;;;;;OAKG;WACW,wBAAwB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS;IAO9E;;;OAGG;WACW,eAAe,CAC3B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,0BAA0B,EAChC,oBAAoB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,GACnE,IAAI;IAqCP;;;;OAIG;WACW,0BAA0B,CACtC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GACvF,QAAQ,EAAE,GAAG,SAAS;IAYzB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAUpC;;;;;;;;OAQG;WACW,qCAAqC,CACjD,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,EAAE,WAAW,GAAE,OAAe,GACnG,QAAQ,GAAG,SAAS;IASvB;;;;;;;;OAQG;WACW,iCAAiC,CAC7C,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,EAAE,WAAW,GAAE,OAAe,GACnG,QAAQ,GAAG,SAAS;IASvB;;;;;;;;OAQG;WACW,sCAAsC,CAClD,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,EAAE,WAAW,GAAE,OAAe,GACnG,QAAQ,GAAG,SAAS;IASvB;;;;;;;;;;OAUG;WACW,eAAe,CAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,SAAS,EAC3C,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,SAAS,EAC3C,SAAS,EAAE,kBAAkB,EAC7B,cAAc,GAAE,MAAqC,GACpD,SAAS,GAAG,SAAS;IA0BxB;;;;;;;;;;;OAWG;WACW,0BAA0B,CACtC,MAAM,EAAE,0BAA0B,EAAE,EACpC,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,0BAA0B,EAAE,EACpC,WAAW,GAAE,OAAe,GAC3B,QAAQ,GAAG,SAAS;IASvB;;;;;;;;;;OAUG;WACW,uBAAuB,CACnC,MAAM,EAAE,0BAA0B,EAAE,EACpC,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,0BAA0B,EAAE,GACnC,SAAS,GAAG,SAAS;IAwBxB;;;;;;;;;;;OAWG;WACW,4BAA4B,CACxC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,GAAG,YAAY,GAC/E,UAAU,GAAG,SAAS;IAIzB;;;;;;;OAOG;WACW,sBAAsB,CAClC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,uBAAuB,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAClF,eAAe,GAAG,SAAS;IAI9B;;;;;;OAMG;WACW,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAGvF;;;;;;;;;OASG;WACW,2BAA2B,CACvC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,OAAc,EAAE,6BAA6B,GAAE,OAAe,GAC7F,eAAe,GAAG,SAAS;IAuB9B,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAA0B;IAClE;;;OAGG;WACW,qBAAqB,CAAC,CAAC,CAAC,EAAE,uBAAuB;IAG/D;;;;;;;;OAQG;WACW,uBAAuB,CACnC,WAAW,EAAE,QAAQ,GAAG,SAAS,EAAE,YAAY,EAAE,eAAe,GAC/D,QAAQ,GAAG,SAAS;IAGvB;;;;;OAKG;WACW,yBAAyB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS;IAahH;;;;;;;;OAQG;WACW,8BAA8B,CAC1C,SAAS,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAClE;QAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QAAC,cAAc,EAAE,QAAQ,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,CAAA;KAAE;IAG/E;;;;;OAKG;WACW,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,YAAY,GAAE,MAAqC,GAAG,QAAQ,GAAG,SAAS;IAG7H;;;;;OAKG;WACW,2BAA2B,CACvC,WAAW,EAAE,QAAQ,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GACnD;QAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;QAAC,eAAe,EAAE,QAAQ,EAAE,CAAA;KAAE;IAqBrF;;;;;;;;;;;;;;OAcG;WACW,sBAAsB,CAClC,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,oBAAoB,EAAE,mBAAmB,GAAE,OAAc,GACrF,SAAS,GAAG,SAAS;IA+CxB;;;;;;;;;;;OAWG;WACW,6BAA6B,CACzC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,yCAAyC,GAC3E,IAAI;IAIP;;;;;;;;;;;OAWG;WACW,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,oBAAoB,CAAC,GAAG,SAAS;IAY3F;;;;;;;;;;;;;;;;;;;OAmBG;WACW,yBAAyB,CACrC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,SAAS,GAAE,MAAqC,GACxF,WAAW,EAAE;IAQhB;;;;;;;;;;OAUG;WACW,sBAAsB,CAClC,UAAU,EAAE,QAAQ,GAAG,QAAQ,EAAE,EACjC,cAAc,CAAC,EAAE,cAAc,EAAE,EACjC,0BAA0B,GAAE,OAAe,EAC3C,kBAAkB,GAAE,OAAe,GAClC,cAAc,EAAE;IAanB;;;;;OAKG;WACW,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAe/E;;;;OAIG;WACW,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,OAAO;IAkB3E;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,iCAAiC;IAqChD,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAepC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAIzC;;;;;;;;;;;OAWG;WACW,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS;IAyBpG;;;;;MAKE;WACY,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,EAAE,QAAQ,GAAE,OAAc,GAAG,gBAAgB,EAAE,GAAG,SAAS;CActI;AAaD;;;GAGG;AACH,qBAAa,yCAAyC;IACpD,8GAA8G;IACvG,yBAAyB,EAAE,OAAO,CAAQ;IACjD,0CAA0C;IACnC,yBAAyB,EAAE,OAAO,CAAQ;IACjD,gDAAgD;IACzC,uBAAuB,SAAgC;IAC9D,uDAAuD;IAChD,sBAAsB,SAAgC;CAC9D"}
@@ -579,7 +579,8 @@ export class RegionOps {
579
579
  return SortablePolygon.sortAsAnyRegion(loopAndArea);
580
580
  }
581
581
  /**
582
- * Find all areas bounded by the unstructured, possibly intersecting curves.
582
+ * Find all xy-areas bounded by the unstructured, possibly intersecting curves.
583
+ * * For best results, input curves should be parallel to the xy-plane, as z-coordinates are ignored.
583
584
  * * A common use case of this method is to assemble the bounding "exterior" loop (or loops) containing the
584
585
  * input curves.
585
586
  * * This method does not add bridge edges to connect outer loops to inner loops. Each disconnected loop,
@@ -1 +1 @@
1
- {"version":3,"file":"RegionOps.js","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,6BAA6B,EAAE,oBAAoB,GACpD,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+CAA+C,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAA2B,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAe,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,yCAAyC,EAAE,MAAM,8CAA8C,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAErH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C;;;GAGG;AACH,MAAM,CAAN,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,6DAAS,CAAA;IACT,+DAAU,CAAA;IACV,2EAAgB,CAAA;IAChB,iEAAW,CAAA;IACX,iEAAW,CAAA;AACb,CAAC,EANW,kBAAkB,KAAlB,kBAAkB,QAM7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAS;IACpB;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,IAAe;QAChD,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,kCAAkC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;MAIE;IACK,MAAM,CAAC,sBAAsB,CAAC,KAAc,EAAE,oBAA4B,QAAQ,CAAC,mBAAmB;QAC3G,+GAA+G;QAC/G,MAAM,WAAW,GAAG,GAAG,GAAG,iBAAiB,CAAC;QAC5C,OAAO,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;IACzE,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,IAAe;QACzC,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,wBAAwB,CAAC,IAAc;QACnD,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,MAAM,CAAC,kCAAkC,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAC3B,KAAoB,EACpB,IAAgC,EAChC,oBAAoE;QAEpE,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,MAAM;gBACR,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,IAAI,YAAY,YAAY,EAAE,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,MAAM;oBACR,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,YAAY,oBAAoB,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/E,IAAI,QAAQ,KAAK,SAAS;gBACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAA6B,CAAC,CAAC;oBACxG,IAAI,QAAQ,KAAK,SAAS;wBACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAE1C,CAAC;qBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,oBAAoB,EAAE,CAAC;oBACnD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,YAAY,CAAC,mCAAmC,CAAC,KAAK,EAAE,IAA4B,CAAC,CAAC;wBACvG,IAAI,QAAQ,KAAK,SAAS;4BACxB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;wBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;4BACtB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAmC,EAAE,oBAAoB,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,0BAA0B,CACtC,KAAoB,EAAE,IAAgC,EAAE,IAAkB,EAAE,OAAY;QAExF,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAqB,EAAE,IAAc,EAAE,EAAE;YAC1E,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACK,MAAM,CAAC,qBAAqB,CAAC,KAAgC,EAAE,WAAoB;QACzF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;gBACpD,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,qCAAqC,CACjD,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QAEpG,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CACtD,MAAM,EACN,MAAM,EACN,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAC5C,IAAI,CAAC,wBAAwB,CAC9B,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,iCAAiC,CAC7C,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QAEpG,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CACtD,MAAM,EACN,MAAM,EACN,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAC5C,IAAI,CAAC,wBAAwB,CAC9B,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,sCAAsC,CAClD,MAAkC,EAAE,MAAkC,EAAE,cAAuB,KAAK;QAEpG,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CACtD,MAAM,EACN,MAAM,EACN,CAAC,GAAY,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAC7C,IAAI,CAAC,wBAAwB,CAC9B,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,eAAe,CAC3B,MAA2C,EAC3C,MAA2C,EAC3C,SAA6B,EAC7B,iBAAyB,QAAQ,CAAC,mBAAmB;QAErD,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9F,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,6BAA6B,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACnE,OAAO,CAAC,sBAAsB,CAC5B,SAAS,EACT,CAAC,MAAqB,EAAE,IAAc,EAAE,QAAoB,EAAE,IAAY,EAAE,EAAE;YAC5E,kFAAkF;YAClF,IAAI,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC;gBACjC,OAAO;YACT,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO;gBAC1B,OAAO;YACT,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,IAAI;oBACN,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,0BAA0B,CACtC,MAAoC,EACpC,SAA6B,EAC7B,MAAoC,EACpC,cAAuB,KAAK;QAE5B,MAAM,KAAK,GAAG,yBAAyB,CAAC,qCAAqC,CAC3E,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAC/B,SAAS,EACT,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAC/B,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,uBAAuB,CACnC,MAAoC,EACpC,SAA6B,EAC7B,MAAoC;QAEpC,MAAM,KAAK,GAAG,yBAAyB,CAAC,qCAAqC,CAC3E,MAAM,EACN,iBAAiB,CAAC,KAAK,EACvB,SAAS,EACT,MAAM,EACN,iBAAiB,CAAC,KAAK,EACvB,IAAI,CACL,CAAC;QACF,IAAI,CAAC,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,MAAM,SAAS,GAAG,mBAAmB,CAAC,mCAAmC,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,SAAS;gBAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,SAAS,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,4BAA4B,CACxC,MAAiB,EAAE,IAAa,EAAE,uBAA8C;QAEhF,MAAM,OAAO,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACrF,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,sBAAsB,CAClC,MAAmB,EAAE,uBAA8D;QAEnF,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,OAAO,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAChE,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,wBAAwB,CAAC,MAAiB,EAAE,CAAS,EAAE,CAAS;QAC5E,OAAO,mBAAmB,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IACD;;;;;;;;;OASG;IACI,MAAM,CAAC,2BAA2B,CACvC,MAAwB,EAAE,OAAgB,IAAI,EAAE,gCAAyC,KAAK;QAE9F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI;YACN,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC5B,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC7F,IAAI,UAAqC,CAAC;QAC1C,IAAI,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM;YACpB,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,MAAM,IAAI,6BAA6B;YACzC,SAAS,CAAC,6BAA6B,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,qBAAqB,CAAC,CAA2B;QAC7D,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;IACpC,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,uBAAuB,CACnC,WAAiC,EAAE,YAA6B;QAEhE,OAAO,iBAAiB,CAAC,uBAAuB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9E,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,yBAAyB,CAAC,MAA4B,EAAE,UAAmB;QACvF,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,SAAS,CAAC;QACnB,IAAI,MAAM,YAAY,cAAc;YAClC,OAAO,MAAM,CAAC;QAChB,+BAA+B;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,cAAc,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,cAAc,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,8BAA8B,CAC1C,SAAqB,EAAE,cAAsB,EAAE,YAAoB;QAEnE,OAAO,QAAQ,CAAC,gCAAgC,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5F,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,SAAqB,EAAE,eAAuB,QAAQ,CAAC,mBAAmB;QACpG,OAAO,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,2BAA2B,CACvC,WAAiC,EAAE,MAAiB;QAEpD,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC1E,MAAM,0BAA0B,GAAG,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1F,MAAM,UAAU,GAAG,SAAS,CAAC,yBAAyB,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;QACzF,IAAI,UAAU,YAAY,eAAe,EAAE,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM,YAAY,GAAG,eAAe,CAAC,4CAA4C,CAAC,KAAK,CAAC,CAAC;gBACzF,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,OAAO,GAAG,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBACvG,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,YAAY,cAAc,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,eAAe,CAAC,4CAA4C,CAAC,UAAU,CAAC,CAAC;YAC9F,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvG,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;;;;;;OAcG;IACI,MAAM,CAAC,sBAAsB,CAClC,IAAiD,EAAE,sBAA+B,IAAI;QAEtF,IAAI,IAAI,YAAY,YAAY,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,YAAY,oBAAoB,EAAE,CAAC;YAChD,IAAI,SAAS,CAAC;YACd,IAAI,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;oBACjE,OAAO,SAAS,CAAC;gBACnB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,SAAS,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,0BAA0B,CAAC,gCAAgC,CAAC,SAAS,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACrG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC;YACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,YAAY,CAAC,gBAAgB,EAAE;mBAC9B,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;mBAChC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,OAAO,SAAS,CAAC,4BAA4B,CAC3C,SAAS,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzF,CAAC;aAAM,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC;YAC1G,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC;YAC1G,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;QACzF,CAAC;aAAM,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC;gBACxC,4CAA4C;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,6BAA6B,CACzC,MAAuB,EAAE,OAAmD;QAE5E,MAAM,OAAO,GAAG,IAAI,yCAAyC,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,uBAAuB,CAAC,KAAyC;QAC7E,MAAM,WAAW,GAAsB,EAAE,CAAC;QAC1C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,SAAS,YAAY,IAAI;gBAC3B,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;iBAC9C,IAAI,SAAS,YAAY,oBAAoB,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC3C,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,eAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IACD;;;;;;;;;;;;;;;;;;OAkBG;IACI,MAAM,CAAC,yBAAyB,CACrC,gBAAuC,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAEzF,MAAM,UAAU,GAAG,SAAS,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,UAAU,CAAC,iCAAiC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC5F,OAAO,iBAAiB,CAAC,oCAAoC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IACD;;;;;;;;;;OAUG;IACI,MAAM,CAAC,sBAAsB,CAClC,UAAiC,EACjC,cAAiC,EACjC,6BAAsC,KAAK,EAC3C,qBAA8B,KAAK;QAEnC,MAAM,OAAO,GAAqB,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACrF,IAAI,UAAU,YAAY,cAAc,EAAE,CAAC;YACzC,UAAU,CAAC,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,UAAU,YAAY,eAAe,EAAE,CAAC;YACjD,UAAU,CAAC,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,UAA4B;QAC1D,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,CAAC,KAAK,SAAS;wBACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAAC,IAAS,EAAE,YAAwB;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,IAAI,YAAY,aAAa;YAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aACnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,YAAY,aAAa;oBAC5B,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;qBAChC,IAAI,CAAC,YAAY,OAAO;oBAC3B,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;qBAChC,IAAI,CAAC,YAAY,gBAAgB;oBACpC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;qBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBACvB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;OAIG;IACK,MAAM,CAAC,iCAAiC,CAAC,QAAoC;QACnF,IAAI,KAAgC,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBACvB,OAAO,SAAS,CAAC;YACnB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChD,KAAK,GAAG,YAAY,CAAC,qCAAqC,CAAC,QAA2C,CAAC,CAAC;YAC1G,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,gBAAiD,CAAC;gBACtD,IAAI,UAAU,YAAY,6BAA6B,EAAE,CAAC;oBACxD,gBAAgB,GAAG,QAA2C,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,EAAE,CAAC;oBACtB,KAAK,MAAM,OAAO,IAAI,QAAmC;wBACvD,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM,cAAc,GAAG,UAAU,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;gBAC5E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,yCAAyC;oBAC1E,IAAI,KAAK,GAAG,YAAY,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBAC1E,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,YAAY,CAAC,qCAAqC,CAAC,UAAU,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,YAAY,CAAC,qCAAqC,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,gGAAgG;YAChG,IAAI,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzF,IAAI,YAAY,CAAC,+BAA+B,CAAC,KAAK,CAAC;oBACrD,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,oCAAoC;IAC5B,MAAM,CAAC,qBAAqB,CAAC,SAA8B,EAAE,OAAuB;QAC1F,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACzD,yCAAyC;QACzC,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,IAAI,gBAAgB,YAAY,IAAI,EAAE,CAAC;YACrC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,YAAY;gBAC9F,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB;QAC9E,CAAC;aAAM,IAAI,gBAAgB,YAAY,YAAY,EAAE,CAAC;YACpD,KAAK,MAAM,WAAW,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBACpD,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,YAAY;oBACpF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB;YACzE,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD;;;;;OAKG;IACK,MAAM,CAAC,0BAA0B,CAAC,SAA8B,EAAE,OAAuB;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,aAAa,CAAC,MAAiB,EAAE,OAAuB;QACpE,IAAI,KAAgC,CAAC;QACrC,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,SAAS,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxE,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,KAAK,GAAG,UAAU,CAAC;oBACrB,CAAC;yBAAM,CAAC;wBACN,gHAAgH;wBAChH,+GAA+G;wBAC/G,gEAAgE;wBAChE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,IAAI,OAAO,EAAE,oBAAoB;YAC/B,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD;;;;;MAKE;IACK,MAAM,CAAC,wBAAwB,CAAC,OAAmC,EAAE,WAAoB,IAAI;QAClG,MAAM,KAAK,GAAG,SAAS,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,IAAI,QAAQ;YACV,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAuB,EAAE,CAAC;QAC9C,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;gBACxC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChH,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AACD,gBAAgB;AAChB,SAAS,mBAAmB,CAC1B,KAAe,EAAE,MAAc,EAAE,aAAyB,EAAE,MAAkB,EAAE,aAAyB;IAEzG,IAAI,MAAM,GAAG,CAAC;QACZ,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvB,IAAI,MAAM,GAAG,CAAC;QACjB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;QAE1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,yCAAyC;IAAtD;QACE,8GAA8G;QACvG,8BAAyB,GAAY,IAAI,CAAC;QACjD,0CAA0C;QACnC,8BAAyB,GAAY,IAAI,CAAC;QACjD,gDAAgD;QACzC,4BAAuB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;QAC9D,uDAAuD;QAChD,2BAAsB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IAC/D,CAAC;CAAA","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\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport {\r\n IndexedReadWriteXYZCollection, IndexedXYZCollection, LineStringDataVariant, MultiLineStringDataVariant,\r\n} from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { PolylineCompressionContext } from \"../geometry3d/PolylineCompressionByEdgeOffset\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { SortablePolygon } from \"../geometry3d/SortablePolygon\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { IndexedPolyface, Polyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphOps } from \"../topology/Merging\";\r\nimport { Triangulator } from \"../topology/Triangulation\";\r\nimport { BagOfCurves, CurveChain, CurveCollection } from \"./CurveCollection\";\r\nimport { CurveCurve } from \"./CurveCurve\";\r\nimport { CurveOps } from \"./CurveOps\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { AnyChain, AnyCurve, AnyRegion } from \"./CurveTypes\";\r\nimport { CurveWireMomentsXYZ } from \"./CurveWireMomentsXYZ\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { ChainCollectorContext } from \"./internalContexts/ChainCollectorContext\";\r\nimport { PolygonWireOffsetContext } from \"./internalContexts/PolygonOffsetContext\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop, SignedLoops } from \"./Loop\";\r\nimport { JointOptions, OffsetOptions } from \"./OffsetOptions\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { Path } from \"./Path\";\r\nimport { ConsolidateAdjacentCurvePrimitivesContext } from \"./Query/ConsolidateAdjacentPrimitivesContext\";\r\nimport { CurveSplitContext } from \"./Query/CurveSplitContext\";\r\nimport { PointInOnOutContext } from \"./Query/InOutTests\";\r\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\r\nimport { RegionMomentsXY } from \"./RegionMomentsXY\";\r\nimport { RegionBooleanContext, RegionGroupOpType, RegionOpsFaceToFaceSearch } from \"./RegionOpsClassificationSweeps\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\n\r\n/**\r\n * * `properties` is a string with special characters indicating\r\n * * \"U\" -- contains unmerged stick data\r\n * * \"M\" -- merged\r\n * * \"R\" -- regularized\r\n * * \"X\" -- has exterior markup\r\n * @internal\r\n */\r\nexport type GraphCheckPointFunction = (name: string, graph: HalfEdgeGraph, properties: string, extraData?: any) => any;\r\n\r\n/**\r\n * Enumeration of the binary operation types for a booleans among regions\r\n * @public\r\n */\r\nexport enum RegionBinaryOpType {\r\n Union = 0,\r\n Parity = 1,\r\n Intersection = 2,\r\n AMinusB = 3,\r\n BMinusA = 4,\r\n}\r\n\r\n/**\r\n * Class `RegionOps` has static members for calculations on regions (areas).\r\n * * Regions are represented by these `CurveCollection` subclasses:\r\n * * `Loop` -- a single loop\r\n * * `ParityRegion` -- a collection of loops, interpreted by parity rules.\r\n * The common \"One outer loop and many Inner loops\" is a parity region.\r\n * * `UnionRegion` -- a collection of `Loop` and `ParityRegion` objects understood as a (probably disjoint) union.\r\n * * **NOTE:** Most of the methods in this class ignore z-coordinates, so callers should ensure that input geometry has\r\n * been rotated parallel to the xy-plane.\r\n * @public\r\n */\r\nexport class RegionOps {\r\n /**\r\n * Return moment sums for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYAreaMoments(root: AnyRegion): MomentData | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return an area tolerance for a given xy-range and optional distance tolerance.\r\n * @param range range of planar region to tolerance\r\n * @param distanceTolerance optional absolute distance tolerance\r\n */\r\n public static computeXYAreaTolerance(range: Range3d, distanceTolerance: number = Geometry.smallMetricDistance): number {\r\n // if A = bh and e is distance tolerance, then A' := (b+e/2)(h+e/2) = A + e/2(b+h+e/2), so A'-A = e/2(b+h+e/2).\r\n const halfDistTol = 0.5 * distanceTolerance;\r\n return halfDistTol * (range.xLength() + range.yLength() + halfDistTol);\r\n }\r\n /**\r\n * Return a (signed) xy area for a region.\r\n * * The area is negative if and only if the region is oriented clockwise with respect to the positive z-axis.\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYArea(root: AnyRegion): number | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n return result.quantitySum;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return MomentData with the sums of wire moments.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any CurveCollection or CurvePrimitive.\r\n */\r\n public static computeXYZWireMomentSums(root: AnyCurve): MomentData | undefined {\r\n const handler = new CurveWireMomentsXYZ();\r\n handler.visitLeaves(root);\r\n const result = handler.momentData;\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n /**\r\n * Create loops in the graph.\r\n * @internal\r\n */\r\n public static addLoopsToGraph(\r\n graph: HalfEdgeGraph,\r\n data: MultiLineStringDataVariant,\r\n announceIsolatedLoop: (graph: HalfEdgeGraph, seed: HalfEdge) => void,\r\n ): void {\r\n if (data instanceof Loop) {\r\n const points = data.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n } else if (data instanceof ParityRegion) {\r\n for (const child of data.children) {\r\n const points = child.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n }\r\n } else if (data instanceof IndexedXYZCollection) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n } else if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n if (Point3d.isAnyImmediatePointType(data[0])) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data as LineStringDataVariant);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n\r\n } else if (data[0] instanceof IndexedXYZCollection) {\r\n for (const loop of data) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loop as IndexedXYZCollection);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n }\r\n } else {\r\n for (const child of data) {\r\n if (Array.isArray(child))\r\n this.addLoopsToGraph(graph, child as MultiLineStringDataVariant, announceIsolatedLoop);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add multiple loops to a graph.\r\n * * Apply edgeTag and mask to each edge.\r\n * @internal\r\n */\r\n public static addLoopsWithEdgeTagToGraph(\r\n graph: HalfEdgeGraph, data: MultiLineStringDataVariant, mask: HalfEdgeMask, edgeTag: any,\r\n ): HalfEdge[] | undefined {\r\n const loopSeeds: HalfEdge[] = [];\r\n this.addLoopsToGraph(graph, data, (_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (seed) {\r\n loopSeeds.push(seed);\r\n seed.setMaskAndEdgeTagAroundFace(mask, edgeTag, true);\r\n }\r\n });\r\n if (loopSeeds.length > 0)\r\n return loopSeeds;\r\n return undefined;\r\n }\r\n /**\r\n * Given a graph just produced by booleans, convert to a polyface\r\n * * \"just produced\" implies exterior face markup.\r\n * @param graph\r\n * @param triangulate\r\n */\r\n private static finishGraphToPolyface(graph: HalfEdgeGraph | undefined, triangulate: boolean): Polyface | undefined {\r\n if (graph) {\r\n if (triangulate) {\r\n Triangulator.triangulateAllPositiveAreaFaces(graph);\r\n Triangulator.flipTriangles(graph);\r\n }\r\n return PolyfaceBuilder.graphToPolyface(graph);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return a polyface containing the area intersection of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaIntersectLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA && inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaUnionLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA || inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return a polyface containing the area difference of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaDifferenceLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA && !inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return areas defined by a boolean operation.\r\n * * If there are multiple regions in loopsA, they are treated as a union.\r\n * * If there are multiple regions in loopsB, they are treated as a union.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param mergeTolerance absolute distance tolerance for merging loops\r\n * @returns a region resulting from merging input loops and the boolean operation. May contain bridge edges added\r\n * to connect interior loops to exterior loops.\r\n */\r\n public static regionBooleanXY(\r\n loopsA: AnyRegion | AnyRegion[] | undefined,\r\n loopsB: AnyRegion | AnyRegion[] | undefined,\r\n operation: RegionBinaryOpType,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): AnyRegion | undefined {\r\n // Always return UnionRegion for now. But keep return type as AnyRegion:\r\n // in the future, we might return the *simplest* region type.\r\n const result = UnionRegion.create();\r\n const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);\r\n context.addMembers(loopsA, loopsB);\r\n context.annotateAndMergeCurvesInGraph(mergeTolerance);\r\n const range = context.groupA.range().union(context.groupB.range());\r\n const areaTol = this.computeXYAreaTolerance(range, mergeTolerance);\r\n context.runClassificationSweep(\r\n operation,\r\n (_graph: HalfEdgeGraph, face: HalfEdge, faceType: -1 | 0 | 1, area: number) => {\r\n // ignore danglers and null faces, but not 2-edge \"banana\" faces with nonzero area\r\n if (face.countEdgesAroundFace() < 2)\r\n return;\r\n if (Math.abs(area) < areaTol)\r\n return;\r\n if (faceType === 1) {\r\n const loop = PlanarSubdivision.createLoopInFace(face);\r\n if (loop)\r\n result.tryAddChild(loop);\r\n }\r\n },\r\n );\r\n return result;\r\n }\r\n /**\r\n * Return a polyface whose facets are a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param inputA first set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param inputB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonBooleanXYToPolyface(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[],\r\n triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union,\r\n true,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return loops of linestrings around areas of a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param inputA first set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param inputB second set of loops\r\n */\r\n public static polygonBooleanXYToLoops(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[],\r\n ): AnyRegion | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA,\r\n RegionGroupOpType.Union,\r\n operation,\r\n inputB,\r\n RegionGroupOpType.Union,\r\n true,\r\n );\r\n if (!graph)\r\n return undefined;\r\n const loopEdges = HalfEdgeGraphSearch.collectExtendedBoundaryLoopsInGraph(graph, HalfEdgeMask.EXTERIOR);\r\n const allLoops: Loop[] = [];\r\n for (const graphLoop of loopEdges) {\r\n const points = new GrowableXYZArray();\r\n for (const edge of graphLoop)\r\n points.pushXYZ(edge.x, edge.y, edge.z);\r\n points.pushWrap(1);\r\n const loop = Loop.create();\r\n loop.tryAddChild(LineString3d.createCapture(points));\r\n allLoops.push(loop);\r\n }\r\n return RegionOps.sortOuterAndHoleLoopsXY(allLoops);\r\n }\r\n /**\r\n * Construct a wire that is offset from the given polyline or polygon.\r\n * * This is a simple wire offset, not an area offset.\r\n * * Since z-coordinates are ignored, for best results the input points should lie in (a plane parallel to)\r\n * the xy-plane.\r\n * * The construction algorithm attempts to eliminate some self-intersections within the offsets, but does not\r\n * guarantee a simple area offset.\r\n * @param points a single loop or path\r\n * @param wrap true to include wraparound\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public static constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, offsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n const context = new PolygonWireOffsetContext();\r\n return context.constructPolygonWireXYOffset(points, wrap, offsetDistanceOrOptions);\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 * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\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 offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n return CurveOps.constructCurveXYOffset(curves, offsetOptions);\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a region.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param curves input region\r\n * @param x x coordinate of point to test\r\n * @param y y coordinate of point to test\r\n */\r\n public static testPointInOnOutRegionXY(curves: AnyRegion, x: number, y: number): number {\r\n return PointInOnOutContext.testPointInOnOutRegionXY(curves, x, y);\r\n }\r\n /**\r\n * Create curve collection of subtype determined by gaps between the input curves.\r\n * * If (a) wrap is requested and (b) all curves connect head-to-tail (including wraparound), assemble as a `loop`.\r\n * * If all curves connect head-to-tail except for closure, return a `Path`.\r\n * * If there are internal gaps, return a `BagOfCurves`\r\n * * If input array has zero length, return undefined.\r\n * @param curves input curves\r\n * @param wrap whether to create a Loop (true) or Path (false) if maximum gap is minimal\r\n * @param consolidateAdjacentPrimitives whether to simplify the result by calling [[consolidateAdjacentPrimitives]]\r\n */\r\n public static createLoopPathOrBagOfCurves(\r\n curves: CurvePrimitive[], wrap: boolean = true, consolidateAdjacentPrimitives: boolean = false,\r\n ): CurveCollection | undefined {\r\n const n = curves.length;\r\n if (n === 0)\r\n return undefined;\r\n let maxGap = 0.0;\r\n let isPath = false;\r\n if (wrap)\r\n maxGap = Geometry.maxXY(maxGap, curves[0].startPoint().distance(curves[n - 1].endPoint()));\r\n for (let i = 0; i + 1 < n; i++)\r\n maxGap = Geometry.maxXY(maxGap, curves[i].endPoint().distance(curves[i + 1].startPoint()));\r\n let collection: Loop | Path | BagOfCurves;\r\n if (Geometry.isSmallMetricDistance(maxGap)) {\r\n collection = wrap ? Loop.create() : Path.create();\r\n isPath = true;\r\n } else {\r\n collection = BagOfCurves.create();\r\n }\r\n for (const c of curves)\r\n collection.tryAddChild(c);\r\n if (isPath && consolidateAdjacentPrimitives)\r\n RegionOps.consolidateAdjacentPrimitives(collection);\r\n return collection;\r\n }\r\n private static _graphCheckPointFunction?: GraphCheckPointFunction;\r\n /**\r\n * Announce Checkpoint function for use during booleans\r\n * @internal\r\n */\r\n public static setCheckPointFunction(f?: GraphCheckPointFunction) {\r\n this._graphCheckPointFunction = f;\r\n }\r\n /**\r\n * Find all intersections among curves in `curvesToCut` and `cutterCurves` and return fragments of `curvesToCut`.\r\n * * For a `Loop`, `ParityRegion`, or `UnionRegion` in `curvesToCut`:\r\n * * if it is never cut by any `cutter` curve, it will be left unchanged.\r\n * * if cut, the input is downgraded to a set of `Path` curves joining at the cut points.\r\n * * All cutting is \"as viewed in the xy plane\"\r\n * @param curvesToCut input curves to be fragmented at intersections with `cutterCurves`\r\n * @param cutterCurves input curves to intersect with `curvesToCut`\r\n */\r\n public static cloneCurvesWithXYSplits(\r\n curvesToCut: AnyCurve | undefined, cutterCurves: CurveCollection,\r\n ): AnyCurve | undefined {\r\n return CurveSplitContext.cloneCurvesWithXYSplits(curvesToCut, cutterCurves);\r\n }\r\n /**\r\n * Create paths assembled from many curves.\r\n * * Assemble paths from consecutive curves NOT separated by either gaps or the split markup set by\r\n * [[cloneCurvesWithXYSplits]].\r\n * * Return simplest form -- single primitive, single path, or bag of curves.\r\n */\r\n public static splitToPathsBetweenBreaks(source: AnyCurve | undefined, makeClones: boolean): AnyChain | undefined {\r\n if (source === undefined)\r\n return undefined;\r\n if (source instanceof CurvePrimitive)\r\n return source;\r\n // source is a collection . ..\r\n const primitives = source.collectCurvePrimitives();\r\n const chainCollector = new ChainCollectorContext(makeClones);\r\n for (const primitive of primitives) {\r\n chainCollector.announceCurvePrimitive(primitive);\r\n }\r\n return chainCollector.grabResult();\r\n }\r\n /**\r\n * Restructure curve fragments as Paths and Loops, and construct xy-offsets of the chains.\r\n * * If the inputs do not form Loop(s), the classification of offsets is suspect.\r\n * * For best offset results, the inputs should be parallel to the xy-plane.\r\n * @param fragments fragments to be chained and offset\r\n * @param offsetDistance offset distance, applied to both sides of each fragment to produce inside and outside xy-offset curves.\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when assembling fragments head-to-tail\r\n * @returns object with named chains, insideOffsets, outsideOffsets\r\n */\r\n public static collectInsideAndOutsideOffsets(\r\n fragments: AnyCurve[], offsetDistance: number, gapTolerance: number,\r\n ): { insideOffsets: AnyCurve[], outsideOffsets: AnyCurve[], chains?: AnyChain } {\r\n return CurveOps.collectInsideAndOutsideXYOffsets(fragments, offsetDistance, gapTolerance);\r\n }\r\n /**\r\n * Restructure curve fragments as Paths and Loops.\r\n * @param fragments fragments to be chained\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when assembling fragments head-to-tail\r\n * @returns chains, possibly wrapped in a [[BagOfCurves]].\r\n */\r\n public static collectChains(fragments: AnyCurve[], gapTolerance: number = Geometry.smallMetricDistance): AnyChain | undefined {\r\n return CurveOps.collectChains(fragments, gapTolerance);\r\n }\r\n /**\r\n * Find all intersections among curves in `curvesToCut` against the boundaries of `region` and return fragments\r\n * of `curvesToCut`.\r\n * * Break `curvesToCut` into parts inside, outside, and coincident.\r\n * @returns output object with all fragments split among `insideParts`, `outsideParts`, and `coincidentParts`\r\n */\r\n public static splitPathsByRegionInOnOutXY(\r\n curvesToCut: AnyCurve | undefined, region: AnyRegion,\r\n ): { insideParts: AnyCurve[], outsideParts: AnyCurve[], coincidentParts: AnyCurve[] } {\r\n const result = { insideParts: [], outsideParts: [], coincidentParts: [] };\r\n const pathWithIntersectionMarkup = RegionOps.cloneCurvesWithXYSplits(curvesToCut, region);\r\n const splitPaths = RegionOps.splitToPathsBetweenBreaks(pathWithIntersectionMarkup, true);\r\n if (splitPaths instanceof CurveCollection) {\r\n for (const child of splitPaths.children) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(child);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(child, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n } else if (splitPaths instanceof CurvePrimitive) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(splitPaths);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(splitPaths, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * If `data` is one of several forms of a rectangle, return its edge Transform.\r\n * * Points are considered a rectangle if, within the first 4 points:\r\n * * vectors from 0 to 1 and 0 to 3 are perpendicular and have a non-zero cross product\r\n * * vectors from 0 to 3 and 1 to 2 are the same\r\n * @param data points in one of several formats:\r\n * * LineString\r\n * * Loop containing rectangle content\r\n * * Path containing rectangle content\r\n * * Array of Point3d[]\r\n * * IndexedXYZCollection\r\n * @param requireClosurePoint whether to require a 5th point equal to the 1st point.\r\n * @returns Transform with origin at one corner, x and y columns extending along two adjacent sides, and unit\r\n * normal in z column. If not a rectangle, return undefined.\r\n */\r\n public static rectangleEdgeTransform(\r\n data: AnyCurve | Point3d[] | IndexedXYZCollection, requireClosurePoint: boolean = true,\r\n ): Transform | undefined {\r\n if (data instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.packedPoints);\r\n } else if (data instanceof IndexedXYZCollection) {\r\n let dataToUse;\r\n if (requireClosurePoint && data.length === 5) {\r\n if (!Geometry.isSmallMetricDistance(data.distanceIndexIndex(0, 4)!))\r\n return undefined;\r\n dataToUse = data;\r\n } else if (!requireClosurePoint && data.length === 4) {\r\n dataToUse = data;\r\n } else if (data.length < (requireClosurePoint ? 5 : 4)) {\r\n return undefined;\r\n } else {\r\n dataToUse = GrowableXYZArray.create(data);\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dataToUse, Geometry.smallMetricDistance);\r\n if (dataToUse.length < (requireClosurePoint ? 5 : 4))\r\n return undefined;\r\n }\r\n const vector01 = dataToUse.vectorIndexIndex(0, 1)!;\r\n const vector03 = dataToUse.vectorIndexIndex(0, 3)!;\r\n const vector12 = dataToUse.vectorIndexIndex(1, 2)!;\r\n const normalVector = vector01.crossProduct(vector03);\r\n if (normalVector.normalizeInPlace()\r\n && vector12.isAlmostEqual(vector03)\r\n && vector01.isPerpendicularTo(vector03)) {\r\n return Transform.createOriginAndMatrixColumns(\r\n dataToUse.getPoint3dAtUncheckedPointIndex(0), vector01, vector03, normalVector,\r\n );\r\n }\r\n } else if (Array.isArray(data)) {\r\n return this.rectangleEdgeTransform(new Point3dArrayCarrier(data), requireClosurePoint);\r\n } else if (data instanceof Loop && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, true);\r\n } else if (data instanceof Path && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, requireClosurePoint);\r\n } else if (data instanceof CurveChain) {\r\n if (!data.checkForNonLinearPrimitives()) {\r\n // const linestring = LineString3d.create();\r\n const strokes = data.getPackedStrokes();\r\n if (strokes) {\r\n return this.rectangleEdgeTransform(strokes);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Look for and simplify:\r\n * * Contiguous `LineSegment3d` and `LineString3d` objects.\r\n * * collect all points\r\n * * eliminate duplicated points\r\n * * eliminate points colinear with surrounding points\r\n * * contiguous concentric circular or elliptic arcs\r\n * * combine angular ranges\r\n * * This function can be used to compress adjacent LineSegment3ds into a LineString3d\r\n * @param curves Path or loop (or larger collection containing paths and loops) to be simplified\r\n * @param options options for tolerance and selective simplification.\r\n */\r\n public static consolidateAdjacentPrimitives(\r\n curves: CurveCollection, options?: ConsolidateAdjacentCurvePrimitivesOptions,\r\n ): void {\r\n const context = new ConsolidateAdjacentCurvePrimitivesContext(options);\r\n curves.dispatchToGeometryHandler(context);\r\n }\r\n /**\r\n * Reverse and reorder loops in the xy-plane for consistency and containment.\r\n * @param loops multiple loops in any order and orientation, z-coordinates ignored\r\n * @returns a region that captures the input pointers. This region is a:\r\n * * `Loop` if there is exactly one input loop. It is oriented counterclockwise.\r\n * * `ParityRegion` if input consists of exactly one outer loop with at least one hole loop.\r\n * Its first child is an outer loop oriented counterclockwise; all subsequent children are holes oriented\r\n * clockwise.\r\n * * `UnionRegion` if any other input configuration. Its children are individually ordered/oriented as in\r\n * the above cases.\r\n * @see [[PolygonOps.sortOuterAndHoleLoopsXY]]\r\n */\r\n public static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion {\r\n const loopAndArea: SortablePolygon[] = [];\r\n for (const candidate of loops) {\r\n if (candidate instanceof Loop)\r\n SortablePolygon.pushLoop(loopAndArea, candidate);\r\n else if (candidate instanceof IndexedXYZCollection) {\r\n const loop = Loop.createPolygon(candidate);\r\n SortablePolygon.pushLoop(loopAndArea, loop);\r\n }\r\n }\r\n return SortablePolygon.sortAsAnyRegion(loopAndArea);\r\n }\r\n /**\r\n * Find all areas bounded by the unstructured, possibly intersecting curves.\r\n * * A common use case of this method is to assemble the bounding \"exterior\" loop (or loops) containing the\r\n * input curves.\r\n * * This method does not add bridge edges to connect outer loops to inner loops. Each disconnected loop,\r\n * regardless of its containment, is returned as its own SignedLoops object. Pre-process with [[regionBooleanXY]]\r\n * to add bridge edges so that [[constructAllXYRegionLoops]] will return outer and inner loops in the same\r\n * SignedLoops object.\r\n * @param curvesAndRegions Any collection of curves. Each Loop/ParityRegion/UnionRegion contributes its curve\r\n * primitives.\r\n * @param tolerance optional distance tolerance for coincidence\r\n * @returns array of [[SignedLoops]], each entry of which describes the faces in a single connected component:\r\n * * `positiveAreaLoops` contains \"interior\" loops, _including holes in ParityRegion input_. These loops have\r\n * positive area and counterclockwise orientation.\r\n * * `negativeAreaLoops` contains (probably just one) \"exterior\" loop which is ordered clockwise.\r\n * * `slivers` contains sliver loops that have zero area, such as appear between coincident curves.\r\n * * `edges` contains a [[LoopCurveLoopCurve]] object for each component edge, collecting both loops adjacent\r\n * to the edge and a constituent curve in each.\r\n */\r\n public static constructAllXYRegionLoops(\r\n curvesAndRegions: AnyCurve | AnyCurve[], tolerance: number = Geometry.smallMetricDistance,\r\n ): SignedLoops[] {\r\n const primitives = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true, true);\r\n const range = this.curveArrayRange(primitives);\r\n const areaTol = this.computeXYAreaTolerance(range, tolerance);\r\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(primitives, tolerance);\r\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(primitives, intersections, tolerance);\r\n return PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);\r\n }\r\n /**\r\n * Collect all `CurvePrimitives` in loosely typed input.\r\n * * Always recurses into primitives within explicit collections (Path, Loop, ParityRegion, UnionRegion).\r\n * * Optionally recurses into hidden primitives if `smallestPossiblePrimitives` is true.\r\n * @param candidates input curves\r\n * @param collectorArray optional pre-defined output array. If defined, it is NOT cleared: primitives are appended.\r\n * @param smallestPossiblePrimitives if true, recurse into the children of a [[CurveChainWithDistanceIndex]]. If\r\n * false, push the [[CurveChainWithDistanceIndex]] instead.\r\n * @param explodeLinestrings if true, push a [[LineSegment3d]] for each segment of a [[LineString3d]]. If false,\r\n * push the [[LineString3d]] instead.\r\n */\r\n public static collectCurvePrimitives(\r\n candidates: AnyCurve | AnyCurve[],\r\n collectorArray?: CurvePrimitive[],\r\n smallestPossiblePrimitives: boolean = false,\r\n explodeLinestrings: boolean = false,\r\n ): CurvePrimitive[] {\r\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\r\n if (candidates instanceof CurvePrimitive) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (candidates instanceof CurveCollection) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (Array.isArray(candidates)) {\r\n for (const c of candidates) {\r\n this.collectCurvePrimitives(c, results, smallestPossiblePrimitives, explodeLinestrings);\r\n }\r\n }\r\n return results;\r\n }\r\n /**\r\n * Copy primitive pointers from candidates to result array, replacing each [[LineString3d]] by newly constructed\r\n * instances of [[LineSegment3d]].\r\n * @param candidates input curves\r\n * @return copied (captured) inputs except for the linestrings, which are exploded\r\n */\r\n public static expandLineStrings(candidates: CurvePrimitive[]): CurvePrimitive[] {\r\n const result: CurvePrimitive[] = [];\r\n for (const c of candidates) {\r\n if (c instanceof LineString3d) {\r\n for (let i = 0; i + 1 < c.packedPoints.length; i++) {\r\n const q = c.getIndexedSegment(i);\r\n if (q !== undefined)\r\n result.push(q);\r\n }\r\n } else {\r\n result.push(c);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return the overall range of given curves.\r\n * @param data candidate curves\r\n * @param worldToLocal transform to apply to data before computing its range\r\n */\r\n public static curveArrayRange(data: any, worldToLocal?: Transform): Range3d {\r\n const range = Range3d.create();\r\n if (data instanceof GeometryQuery)\r\n data.extendRange(range, worldToLocal);\r\n else if (Array.isArray(data)) {\r\n for (const c of data) {\r\n if (c instanceof GeometryQuery)\r\n c.extendRange(range, worldToLocal);\r\n else if (c instanceof Point3d)\r\n range.extendPoint(c, worldToLocal);\r\n else if (c instanceof GrowableXYZArray)\r\n range.extendRange(c.getRange(worldToLocal));\r\n else if (Array.isArray(c))\r\n range.extendRange(this.curveArrayRange(c, worldToLocal));\r\n }\r\n }\r\n return range;\r\n }\r\n /**\r\n * Triangulate a stroked Loop or ParityRegion and return the graph.\r\n * @param polygons polygons obtained by stroking a Loop or ParityRegion, z-coordinates ignored.\r\n * @returns triangulated graph\r\n */\r\n private static triangulateStrokedRegionComponent(polygons: MultiLineStringDataVariant): HalfEdgeGraph | undefined {\r\n let graph: HalfEdgeGraph | undefined;\r\n if (Array.isArray(polygons)) {\r\n if (polygons.length === 0)\r\n return undefined;\r\n const firstEntry = polygons[0];\r\n if (Point3d.isAnyImmediatePointType(firstEntry)) {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons as XYAndZ[] | XAndY[] | number[][]);\r\n } else if (polygons.length > 1) {\r\n let writablePolygons: IndexedReadWriteXYZCollection[];\r\n if (firstEntry instanceof IndexedReadWriteXYZCollection) {\r\n writablePolygons = polygons as IndexedReadWriteXYZCollection[];\r\n } else {\r\n writablePolygons = [];\r\n for (const polygon of polygons as LineStringDataVariant[])\r\n writablePolygons.push(GrowableXYZArray.create(polygon));\r\n }\r\n const sortedPolygons = PolygonOps.sortOuterAndHoleLoopsXY(writablePolygons);\r\n if (sortedPolygons.length === 1) { // below requires exactly one outer loop!\r\n if (graph = Triangulator.createTriangulatedGraphFromLoops(sortedPolygons[0]))\r\n Triangulator.flipTriangles(graph);\r\n }\r\n } else {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(firstEntry);\r\n }\r\n } else {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons);\r\n }\r\n if (!graph) {\r\n // Last resort: try full merge. Conveniently, multiple polygons are processed with parity logic.\r\n if (graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(polygons, [], (inA, _inB) => inA)) {\r\n if (Triangulator.triangulateAllPositiveAreaFaces(graph))\r\n Triangulator.flipTriangles(graph);\r\n }\r\n }\r\n return graph;\r\n }\r\n /** Stroke a Loop or ParityRegion */\r\n private static strokeRegionComponent(component: Loop | ParityRegion, options?: StrokeOptions): GrowableXYZArray[] {\r\n const strokedComponent = component.cloneStroked(options);\r\n // package the stroked region as polygons\r\n const polygons: GrowableXYZArray[] = [];\r\n if (strokedComponent instanceof Loop) {\r\n if (strokedComponent.children.length > 0 && strokedComponent.children[0] instanceof LineString3d)\r\n polygons.push(strokedComponent.children[0].packedPoints); // expect only 1\r\n } else if (strokedComponent instanceof ParityRegion) {\r\n for (const strokedLoop of strokedComponent.children) {\r\n if (strokedLoop.children.length > 0 && strokedLoop.children[0] instanceof LineString3d)\r\n polygons.push(strokedLoop.children[0].packedPoints); // expect only 1\r\n }\r\n }\r\n return polygons;\r\n }\r\n /**\r\n * Triangulate a Loop or ParityRegion and return the graph.\r\n * @param component region, z-coordinates ignored\r\n * @param options how to stroke loops\r\n * @returns triangulated graph\r\n */\r\n private static triangulateRegionComponent(component: Loop | ParityRegion, options?: StrokeOptions): HalfEdgeGraph | undefined {\r\n const polygons = this.strokeRegionComponent(component, options);\r\n return this.triangulateStrokedRegionComponent(polygons);\r\n }\r\n /**\r\n * Facet the region according to stroke options.\r\n * @param region a closed xy-planar region, possibly with holes.\r\n * * The z-coordinates of the region are ignored. Caller is responsible for rotating the region into plane local coordinates beforehand, and reversing the rotation afterwards.\r\n * * For best results, `UnionRegion` input should consist of non-overlapping children.\r\n * Caller can ensure this by passing in `region = RegionOps.regionBooleanXY(unionRegion, undefined, RegionBinaryOpType.Union)`.\r\n * * For best results, `ParityRegion` input should be correctly oriented (holes have opposite orientation to their containing loop).\r\n * Caller can ensure this for non-intersecting loops by passing in `region = RegionOps.sortOuterAndHoleLoopsXY(loops)`.\r\n * @param options primarily how to stroke the region boundary, but also how to facet the region interior.\r\n * * By default, a triangulation is returned, but if `options.maximizeConvexFacets === true`, edges between coplanar triangles are removed to return maximally convex facets.\r\n * @returns facets for the region, or undefined if facetting failed\r\n */\r\n public static facetRegionXY(region: AnyRegion, options?: StrokeOptions): IndexedPolyface | undefined {\r\n let graph: HalfEdgeGraph | undefined;\r\n if (region instanceof UnionRegion) {\r\n for (const child of region.children) {\r\n const childGraph = RegionOps.triangulateRegionComponent(child, options);\r\n if (childGraph) {\r\n if (!graph) {\r\n graph = childGraph;\r\n } else {\r\n // Graph concatenation without edge splits, clustering, and merge. We assume disjoint children so that at worst,\r\n // components will have unshared adjacent exterior edges that remain after expandConvexFaces. Note that calling\r\n // clusterAndMergeXYTheta here can create non-manifold topology!\r\n graph.allHalfEdges.push(...childGraph.allHalfEdges);\r\n }\r\n }\r\n }\r\n } else {\r\n graph = this.triangulateRegionComponent(region, options);\r\n }\r\n if (!graph)\r\n return undefined;\r\n if (options?.maximizeConvexFacets)\r\n HalfEdgeGraphOps.expandConvexFaces(graph);\r\n return PolyfaceBuilder.graphToPolyface(graph, options);\r\n }\r\n /**\r\n * Decompose a polygon with optional holes into an array of convex polygons.\r\n * @param polygon polygon and hole loops, e.g., as returned by [[CurveCollection.cloneStroked]] on a Loop or ParityRegion. All z-coordinates are ignored.\r\n * @param maximize whether to return maximally convex polygons. If false, triangles are returned.\r\n * @returns array of convex polygons, or undefined if triangulation failed\r\n */\r\n public static convexDecomposePolygonXY(polygon: MultiLineStringDataVariant, maximize: boolean = true): GrowableXYZArray[] | undefined {\r\n const graph = RegionOps.triangulateStrokedRegionComponent(polygon);\r\n if (!graph)\r\n return undefined;\r\n if (maximize)\r\n HalfEdgeGraphOps.expandConvexFaces(graph);\r\n const convexPolygons: GrowableXYZArray[] = [];\r\n graph.announceFaceLoops((_graph, seed) => {\r\n if (!seed.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n convexPolygons.push(GrowableXYZArray.create(seed.collectAroundFace((node) => { return node.getPoint3d(); })));\r\n return true;\r\n });\r\n return convexPolygons;\r\n }\r\n}\r\n/** @internal */\r\nfunction pushToInOnOutArrays(\r\n curve: AnyCurve, select: number, arrayNegative: AnyCurve[], array0: AnyCurve[], arrayPositive: AnyCurve[],\r\n): void {\r\n if (select > 0)\r\n arrayPositive.push(curve);\r\n else if (select < 0)\r\n arrayNegative.push(curve);\r\n else\r\n array0.push(curve);\r\n}\r\n\r\n/**\r\n * * Options to control method `RegionOps.consolidateAdjacentPrimitives`\r\n * @public\r\n */\r\nexport class ConsolidateAdjacentCurvePrimitivesOptions {\r\n /** True to consolidated linear geometry (e.g. separate LineSegment3d and LineString3d) into LineString3d */\r\n public consolidateLinearGeometry: boolean = true;\r\n /** True to consolidate contiguous arcs */\r\n public consolidateCompatibleArcs: boolean = true;\r\n /** Tolerance for collapsing identical points */\r\n public duplicatePointTolerance = Geometry.smallMetricDistance;\r\n /** Tolerance for removing interior colinear points. */\r\n public colinearPointTolerance = Geometry.smallMetricDistance;\r\n}\r\n"]}
1
+ {"version":3,"file":"RegionOps.js","sourceRoot":"","sources":["../../../src/curve/RegionOps.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport {\r\n IndexedReadWriteXYZCollection, IndexedXYZCollection, LineStringDataVariant, MultiLineStringDataVariant,\r\n} from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { PolylineCompressionContext } from \"../geometry3d/PolylineCompressionByEdgeOffset\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { SortablePolygon } from \"../geometry3d/SortablePolygon\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { MomentData } from \"../geometry4d/MomentData\";\r\nimport { IndexedPolyface, Polyface } from \"../polyface/Polyface\";\r\nimport { PolyfaceBuilder } from \"../polyface/PolyfaceBuilder\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphOps } from \"../topology/Merging\";\r\nimport { Triangulator } from \"../topology/Triangulation\";\r\nimport { BagOfCurves, CurveChain, CurveCollection } from \"./CurveCollection\";\r\nimport { CurveCurve } from \"./CurveCurve\";\r\nimport { CurveOps } from \"./CurveOps\";\r\nimport { CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { AnyChain, AnyCurve, AnyRegion } from \"./CurveTypes\";\r\nimport { CurveWireMomentsXYZ } from \"./CurveWireMomentsXYZ\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { ChainCollectorContext } from \"./internalContexts/ChainCollectorContext\";\r\nimport { PolygonWireOffsetContext } from \"./internalContexts/PolygonOffsetContext\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { Loop, SignedLoops } from \"./Loop\";\r\nimport { JointOptions, OffsetOptions } from \"./OffsetOptions\";\r\nimport { ParityRegion } from \"./ParityRegion\";\r\nimport { Path } from \"./Path\";\r\nimport { ConsolidateAdjacentCurvePrimitivesContext } from \"./Query/ConsolidateAdjacentPrimitivesContext\";\r\nimport { CurveSplitContext } from \"./Query/CurveSplitContext\";\r\nimport { PointInOnOutContext } from \"./Query/InOutTests\";\r\nimport { PlanarSubdivision } from \"./Query/PlanarSubdivision\";\r\nimport { RegionMomentsXY } from \"./RegionMomentsXY\";\r\nimport { RegionBooleanContext, RegionGroupOpType, RegionOpsFaceToFaceSearch } from \"./RegionOpsClassificationSweeps\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\nimport { UnionRegion } from \"./UnionRegion\";\r\n\r\n/**\r\n * * `properties` is a string with special characters indicating\r\n * * \"U\" -- contains unmerged stick data\r\n * * \"M\" -- merged\r\n * * \"R\" -- regularized\r\n * * \"X\" -- has exterior markup\r\n * @internal\r\n */\r\nexport type GraphCheckPointFunction = (name: string, graph: HalfEdgeGraph, properties: string, extraData?: any) => any;\r\n\r\n/**\r\n * Enumeration of the binary operation types for a booleans among regions\r\n * @public\r\n */\r\nexport enum RegionBinaryOpType {\r\n Union = 0,\r\n Parity = 1,\r\n Intersection = 2,\r\n AMinusB = 3,\r\n BMinusA = 4,\r\n}\r\n\r\n/**\r\n * Class `RegionOps` has static members for calculations on regions (areas).\r\n * * Regions are represented by these `CurveCollection` subclasses:\r\n * * `Loop` -- a single loop\r\n * * `ParityRegion` -- a collection of loops, interpreted by parity rules.\r\n * The common \"One outer loop and many Inner loops\" is a parity region.\r\n * * `UnionRegion` -- a collection of `Loop` and `ParityRegion` objects understood as a (probably disjoint) union.\r\n * * **NOTE:** Most of the methods in this class ignore z-coordinates, so callers should ensure that input geometry has\r\n * been rotated parallel to the xy-plane.\r\n * @public\r\n */\r\nexport class RegionOps {\r\n /**\r\n * Return moment sums for a loop, parity region, or union region.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYAreaMoments(root: AnyRegion): MomentData | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return an area tolerance for a given xy-range and optional distance tolerance.\r\n * @param range range of planar region to tolerance\r\n * @param distanceTolerance optional absolute distance tolerance\r\n */\r\n public static computeXYAreaTolerance(range: Range3d, distanceTolerance: number = Geometry.smallMetricDistance): number {\r\n // if A = bh and e is distance tolerance, then A' := (b+e/2)(h+e/2) = A + e/2(b+h+e/2), so A'-A = e/2(b+h+e/2).\r\n const halfDistTol = 0.5 * distanceTolerance;\r\n return halfDistTol * (range.xLength() + range.yLength() + halfDistTol);\r\n }\r\n /**\r\n * Return a (signed) xy area for a region.\r\n * * The area is negative if and only if the region is oriented clockwise with respect to the positive z-axis.\r\n * @param root any Loop, ParityRegion, or UnionRegion.\r\n */\r\n public static computeXYArea(root: AnyRegion): number | undefined {\r\n const handler = new RegionMomentsXY();\r\n const result = root.dispatchToGeometryHandler(handler);\r\n if (result instanceof MomentData) {\r\n return result.quantitySum;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return MomentData with the sums of wire moments.\r\n * * If `rawMomentData` is the MomentData returned by computeXYAreaMoments, convert to principal axes and moments with\r\n * call `principalMomentData = MomentData.inertiaProductsToPrincipalAxes (rawMomentData.origin, rawMomentData.sums);`\r\n * @param root any CurveCollection or CurvePrimitive.\r\n */\r\n public static computeXYZWireMomentSums(root: AnyCurve): MomentData | undefined {\r\n const handler = new CurveWireMomentsXYZ();\r\n handler.visitLeaves(root);\r\n const result = handler.momentData;\r\n result.shiftOriginAndSumsToCentroidOfSums();\r\n return result;\r\n }\r\n /**\r\n * Create loops in the graph.\r\n * @internal\r\n */\r\n public static addLoopsToGraph(\r\n graph: HalfEdgeGraph,\r\n data: MultiLineStringDataVariant,\r\n announceIsolatedLoop: (graph: HalfEdgeGraph, seed: HalfEdge) => void,\r\n ): void {\r\n if (data instanceof Loop) {\r\n const points = data.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n } else if (data instanceof ParityRegion) {\r\n for (const child of data.children) {\r\n const points = child.getPackedStrokes();\r\n if (points)\r\n this.addLoopsToGraph(graph, points, announceIsolatedLoop);\r\n }\r\n } else if (data instanceof IndexedXYZCollection) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n } else if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n if (Point3d.isAnyImmediatePointType(data[0])) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, data as LineStringDataVariant);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n\r\n } else if (data[0] instanceof IndexedXYZCollection) {\r\n for (const loop of data) {\r\n const loopSeed = Triangulator.directCreateFaceLoopFromCoordinates(graph, loop as IndexedXYZCollection);\r\n if (loopSeed !== undefined)\r\n announceIsolatedLoop(graph, loopSeed);\r\n }\r\n } else {\r\n for (const child of data) {\r\n if (Array.isArray(child))\r\n this.addLoopsToGraph(graph, child as MultiLineStringDataVariant, announceIsolatedLoop);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add multiple loops to a graph.\r\n * * Apply edgeTag and mask to each edge.\r\n * @internal\r\n */\r\n public static addLoopsWithEdgeTagToGraph(\r\n graph: HalfEdgeGraph, data: MultiLineStringDataVariant, mask: HalfEdgeMask, edgeTag: any,\r\n ): HalfEdge[] | undefined {\r\n const loopSeeds: HalfEdge[] = [];\r\n this.addLoopsToGraph(graph, data, (_graph: HalfEdgeGraph, seed: HalfEdge) => {\r\n if (seed) {\r\n loopSeeds.push(seed);\r\n seed.setMaskAndEdgeTagAroundFace(mask, edgeTag, true);\r\n }\r\n });\r\n if (loopSeeds.length > 0)\r\n return loopSeeds;\r\n return undefined;\r\n }\r\n /**\r\n * Given a graph just produced by booleans, convert to a polyface\r\n * * \"just produced\" implies exterior face markup.\r\n * @param graph\r\n * @param triangulate\r\n */\r\n private static finishGraphToPolyface(graph: HalfEdgeGraph | undefined, triangulate: boolean): Polyface | undefined {\r\n if (graph) {\r\n if (triangulate) {\r\n Triangulator.triangulateAllPositiveAreaFaces(graph);\r\n Triangulator.flipTriangles(graph);\r\n }\r\n return PolyfaceBuilder.graphToPolyface(graph);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return a polyface containing the area intersection of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaIntersectLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA && inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return a polyface containing the area union of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaUnionLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA || inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return a polyface containing the area difference of two XY regions.\r\n * * Within each region, in and out is determined by parity rules.\r\n * * Any face that is an odd number of crossings from the far outside is IN\r\n * * Any face that is an even number of crossings from the far outside is OUT\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonXYAreaDifferenceLoopsToPolyface(\r\n loopsA: MultiLineStringDataVariant, loopsB: MultiLineStringDataVariant, triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(\r\n loopsA,\r\n loopsB,\r\n (inA: boolean, inB: boolean) => (inA && !inB),\r\n this._graphCheckPointFunction,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return areas defined by a boolean operation.\r\n * * If there are multiple regions in loopsA, they are treated as a union.\r\n * * If there are multiple regions in loopsB, they are treated as a union.\r\n * @param loopsA first set of loops\r\n * @param loopsB second set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param mergeTolerance absolute distance tolerance for merging loops\r\n * @returns a region resulting from merging input loops and the boolean operation. May contain bridge edges added\r\n * to connect interior loops to exterior loops.\r\n */\r\n public static regionBooleanXY(\r\n loopsA: AnyRegion | AnyRegion[] | undefined,\r\n loopsB: AnyRegion | AnyRegion[] | undefined,\r\n operation: RegionBinaryOpType,\r\n mergeTolerance: number = Geometry.smallMetricDistance,\r\n ): AnyRegion | undefined {\r\n // Always return UnionRegion for now. But keep return type as AnyRegion:\r\n // in the future, we might return the *simplest* region type.\r\n const result = UnionRegion.create();\r\n const context = RegionBooleanContext.create(RegionGroupOpType.Union, RegionGroupOpType.Union);\r\n context.addMembers(loopsA, loopsB);\r\n context.annotateAndMergeCurvesInGraph(mergeTolerance);\r\n const range = context.groupA.range().union(context.groupB.range());\r\n const areaTol = this.computeXYAreaTolerance(range, mergeTolerance);\r\n context.runClassificationSweep(\r\n operation,\r\n (_graph: HalfEdgeGraph, face: HalfEdge, faceType: -1 | 0 | 1, area: number) => {\r\n // ignore danglers and null faces, but not 2-edge \"banana\" faces with nonzero area\r\n if (face.countEdgesAroundFace() < 2)\r\n return;\r\n if (Math.abs(area) < areaTol)\r\n return;\r\n if (faceType === 1) {\r\n const loop = PlanarSubdivision.createLoopInFace(face);\r\n if (loop)\r\n result.tryAddChild(loop);\r\n }\r\n },\r\n );\r\n return result;\r\n }\r\n /**\r\n * Return a polyface whose facets are a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param inputA first set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param inputB second set of loops\r\n * @param triangulate whether to triangulate the result\r\n */\r\n public static polygonBooleanXYToPolyface(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[],\r\n triangulate: boolean = false,\r\n ): Polyface | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA, RegionGroupOpType.Union,\r\n operation,\r\n inputB, RegionGroupOpType.Union,\r\n true,\r\n );\r\n return this.finishGraphToPolyface(graph, triangulate);\r\n }\r\n /**\r\n * Return loops of linestrings around areas of a boolean operation between the input regions.\r\n * * Each of the two inputs is an array of multiple loops or parity regions.\r\n * * Within each of these input arrays, the various entries (loop or set of loops) are interpreted as a union.\r\n * * In each \"array of loops and parity regions\", each entry inputA[i] or inputB[i] is one of:\r\n * * A simple loop, e.g. array of Point3d.\r\n * * Several simple loops, each of which is an array of Point3d.\r\n * @param inputA first set of loops\r\n * @param operation indicates Union, Intersection, Parity, AMinusB, or BMinusA\r\n * @param inputB second set of loops\r\n */\r\n public static polygonBooleanXYToLoops(\r\n inputA: MultiLineStringDataVariant[],\r\n operation: RegionBinaryOpType,\r\n inputB: MultiLineStringDataVariant[],\r\n ): AnyRegion | undefined {\r\n const graph = RegionOpsFaceToFaceSearch.doBinaryBooleanBetweenMultiLoopInputs(\r\n inputA,\r\n RegionGroupOpType.Union,\r\n operation,\r\n inputB,\r\n RegionGroupOpType.Union,\r\n true,\r\n );\r\n if (!graph)\r\n return undefined;\r\n const loopEdges = HalfEdgeGraphSearch.collectExtendedBoundaryLoopsInGraph(graph, HalfEdgeMask.EXTERIOR);\r\n const allLoops: Loop[] = [];\r\n for (const graphLoop of loopEdges) {\r\n const points = new GrowableXYZArray();\r\n for (const edge of graphLoop)\r\n points.pushXYZ(edge.x, edge.y, edge.z);\r\n points.pushWrap(1);\r\n const loop = Loop.create();\r\n loop.tryAddChild(LineString3d.createCapture(points));\r\n allLoops.push(loop);\r\n }\r\n return RegionOps.sortOuterAndHoleLoopsXY(allLoops);\r\n }\r\n /**\r\n * Construct a wire that is offset from the given polyline or polygon.\r\n * * This is a simple wire offset, not an area offset.\r\n * * Since z-coordinates are ignored, for best results the input points should lie in (a plane parallel to)\r\n * the xy-plane.\r\n * * The construction algorithm attempts to eliminate some self-intersections within the offsets, but does not\r\n * guarantee a simple area offset.\r\n * @param points a single loop or path\r\n * @param wrap true to include wraparound\r\n * @param offsetDistanceOrOptions offset distance (positive to left of curve, negative to right) or JointOptions\r\n * object.\r\n */\r\n public static constructPolygonWireXYOffset(\r\n points: Point3d[], wrap: boolean, offsetDistanceOrOptions: number | JointOptions,\r\n ): CurveChain | undefined {\r\n const context = new PolygonWireOffsetContext();\r\n return context.constructPolygonWireXYOffset(points, wrap, offsetDistanceOrOptions);\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 * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Offset\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 offsetOptions = OffsetOptions.create(offsetDistanceOrOptions);\r\n return CurveOps.constructCurveXYOffset(curves, offsetOptions);\r\n }\r\n /**\r\n * Test if point (x,y) is IN, OUT or ON a region.\r\n * @return (1) for in, (-1) for OUT, (0) for ON\r\n * @param curves input region\r\n * @param x x coordinate of point to test\r\n * @param y y coordinate of point to test\r\n */\r\n public static testPointInOnOutRegionXY(curves: AnyRegion, x: number, y: number): number {\r\n return PointInOnOutContext.testPointInOnOutRegionXY(curves, x, y);\r\n }\r\n /**\r\n * Create curve collection of subtype determined by gaps between the input curves.\r\n * * If (a) wrap is requested and (b) all curves connect head-to-tail (including wraparound), assemble as a `loop`.\r\n * * If all curves connect head-to-tail except for closure, return a `Path`.\r\n * * If there are internal gaps, return a `BagOfCurves`\r\n * * If input array has zero length, return undefined.\r\n * @param curves input curves\r\n * @param wrap whether to create a Loop (true) or Path (false) if maximum gap is minimal\r\n * @param consolidateAdjacentPrimitives whether to simplify the result by calling [[consolidateAdjacentPrimitives]]\r\n */\r\n public static createLoopPathOrBagOfCurves(\r\n curves: CurvePrimitive[], wrap: boolean = true, consolidateAdjacentPrimitives: boolean = false,\r\n ): CurveCollection | undefined {\r\n const n = curves.length;\r\n if (n === 0)\r\n return undefined;\r\n let maxGap = 0.0;\r\n let isPath = false;\r\n if (wrap)\r\n maxGap = Geometry.maxXY(maxGap, curves[0].startPoint().distance(curves[n - 1].endPoint()));\r\n for (let i = 0; i + 1 < n; i++)\r\n maxGap = Geometry.maxXY(maxGap, curves[i].endPoint().distance(curves[i + 1].startPoint()));\r\n let collection: Loop | Path | BagOfCurves;\r\n if (Geometry.isSmallMetricDistance(maxGap)) {\r\n collection = wrap ? Loop.create() : Path.create();\r\n isPath = true;\r\n } else {\r\n collection = BagOfCurves.create();\r\n }\r\n for (const c of curves)\r\n collection.tryAddChild(c);\r\n if (isPath && consolidateAdjacentPrimitives)\r\n RegionOps.consolidateAdjacentPrimitives(collection);\r\n return collection;\r\n }\r\n private static _graphCheckPointFunction?: GraphCheckPointFunction;\r\n /**\r\n * Announce Checkpoint function for use during booleans\r\n * @internal\r\n */\r\n public static setCheckPointFunction(f?: GraphCheckPointFunction) {\r\n this._graphCheckPointFunction = f;\r\n }\r\n /**\r\n * Find all intersections among curves in `curvesToCut` and `cutterCurves` and return fragments of `curvesToCut`.\r\n * * For a `Loop`, `ParityRegion`, or `UnionRegion` in `curvesToCut`:\r\n * * if it is never cut by any `cutter` curve, it will be left unchanged.\r\n * * if cut, the input is downgraded to a set of `Path` curves joining at the cut points.\r\n * * All cutting is \"as viewed in the xy plane\"\r\n * @param curvesToCut input curves to be fragmented at intersections with `cutterCurves`\r\n * @param cutterCurves input curves to intersect with `curvesToCut`\r\n */\r\n public static cloneCurvesWithXYSplits(\r\n curvesToCut: AnyCurve | undefined, cutterCurves: CurveCollection,\r\n ): AnyCurve | undefined {\r\n return CurveSplitContext.cloneCurvesWithXYSplits(curvesToCut, cutterCurves);\r\n }\r\n /**\r\n * Create paths assembled from many curves.\r\n * * Assemble paths from consecutive curves NOT separated by either gaps or the split markup set by\r\n * [[cloneCurvesWithXYSplits]].\r\n * * Return simplest form -- single primitive, single path, or bag of curves.\r\n */\r\n public static splitToPathsBetweenBreaks(source: AnyCurve | undefined, makeClones: boolean): AnyChain | undefined {\r\n if (source === undefined)\r\n return undefined;\r\n if (source instanceof CurvePrimitive)\r\n return source;\r\n // source is a collection . ..\r\n const primitives = source.collectCurvePrimitives();\r\n const chainCollector = new ChainCollectorContext(makeClones);\r\n for (const primitive of primitives) {\r\n chainCollector.announceCurvePrimitive(primitive);\r\n }\r\n return chainCollector.grabResult();\r\n }\r\n /**\r\n * Restructure curve fragments as Paths and Loops, and construct xy-offsets of the chains.\r\n * * If the inputs do not form Loop(s), the classification of offsets is suspect.\r\n * * For best offset results, the inputs should be parallel to the xy-plane.\r\n * @param fragments fragments to be chained and offset\r\n * @param offsetDistance offset distance, applied to both sides of each fragment to produce inside and outside xy-offset curves.\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when assembling fragments head-to-tail\r\n * @returns object with named chains, insideOffsets, outsideOffsets\r\n */\r\n public static collectInsideAndOutsideOffsets(\r\n fragments: AnyCurve[], offsetDistance: number, gapTolerance: number,\r\n ): { insideOffsets: AnyCurve[], outsideOffsets: AnyCurve[], chains?: AnyChain } {\r\n return CurveOps.collectInsideAndOutsideXYOffsets(fragments, offsetDistance, gapTolerance);\r\n }\r\n /**\r\n * Restructure curve fragments as Paths and Loops.\r\n * @param fragments fragments to be chained\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when assembling fragments head-to-tail\r\n * @returns chains, possibly wrapped in a [[BagOfCurves]].\r\n */\r\n public static collectChains(fragments: AnyCurve[], gapTolerance: number = Geometry.smallMetricDistance): AnyChain | undefined {\r\n return CurveOps.collectChains(fragments, gapTolerance);\r\n }\r\n /**\r\n * Find all intersections among curves in `curvesToCut` against the boundaries of `region` and return fragments\r\n * of `curvesToCut`.\r\n * * Break `curvesToCut` into parts inside, outside, and coincident.\r\n * @returns output object with all fragments split among `insideParts`, `outsideParts`, and `coincidentParts`\r\n */\r\n public static splitPathsByRegionInOnOutXY(\r\n curvesToCut: AnyCurve | undefined, region: AnyRegion,\r\n ): { insideParts: AnyCurve[], outsideParts: AnyCurve[], coincidentParts: AnyCurve[] } {\r\n const result = { insideParts: [], outsideParts: [], coincidentParts: [] };\r\n const pathWithIntersectionMarkup = RegionOps.cloneCurvesWithXYSplits(curvesToCut, region);\r\n const splitPaths = RegionOps.splitToPathsBetweenBreaks(pathWithIntersectionMarkup, true);\r\n if (splitPaths instanceof CurveCollection) {\r\n for (const child of splitPaths.children) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(child);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(child, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n } else if (splitPaths instanceof CurvePrimitive) {\r\n const pointOnChild = CurveCollection.createCurveLocationDetailOnAnyCurvePrimitive(splitPaths);\r\n if (pointOnChild) {\r\n const inOnOut = RegionOps.testPointInOnOutRegionXY(region, pointOnChild.point.x, pointOnChild.point.y);\r\n pushToInOnOutArrays(splitPaths, inOnOut, result.outsideParts, result.coincidentParts, result.insideParts);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * If `data` is one of several forms of a rectangle, return its edge Transform.\r\n * * Points are considered a rectangle if, within the first 4 points:\r\n * * vectors from 0 to 1 and 0 to 3 are perpendicular and have a non-zero cross product\r\n * * vectors from 0 to 3 and 1 to 2 are the same\r\n * @param data points in one of several formats:\r\n * * LineString\r\n * * Loop containing rectangle content\r\n * * Path containing rectangle content\r\n * * Array of Point3d[]\r\n * * IndexedXYZCollection\r\n * @param requireClosurePoint whether to require a 5th point equal to the 1st point.\r\n * @returns Transform with origin at one corner, x and y columns extending along two adjacent sides, and unit\r\n * normal in z column. If not a rectangle, return undefined.\r\n */\r\n public static rectangleEdgeTransform(\r\n data: AnyCurve | Point3d[] | IndexedXYZCollection, requireClosurePoint: boolean = true,\r\n ): Transform | undefined {\r\n if (data instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.packedPoints);\r\n } else if (data instanceof IndexedXYZCollection) {\r\n let dataToUse;\r\n if (requireClosurePoint && data.length === 5) {\r\n if (!Geometry.isSmallMetricDistance(data.distanceIndexIndex(0, 4)!))\r\n return undefined;\r\n dataToUse = data;\r\n } else if (!requireClosurePoint && data.length === 4) {\r\n dataToUse = data;\r\n } else if (data.length < (requireClosurePoint ? 5 : 4)) {\r\n return undefined;\r\n } else {\r\n dataToUse = GrowableXYZArray.create(data);\r\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dataToUse, Geometry.smallMetricDistance);\r\n if (dataToUse.length < (requireClosurePoint ? 5 : 4))\r\n return undefined;\r\n }\r\n const vector01 = dataToUse.vectorIndexIndex(0, 1)!;\r\n const vector03 = dataToUse.vectorIndexIndex(0, 3)!;\r\n const vector12 = dataToUse.vectorIndexIndex(1, 2)!;\r\n const normalVector = vector01.crossProduct(vector03);\r\n if (normalVector.normalizeInPlace()\r\n && vector12.isAlmostEqual(vector03)\r\n && vector01.isPerpendicularTo(vector03)) {\r\n return Transform.createOriginAndMatrixColumns(\r\n dataToUse.getPoint3dAtUncheckedPointIndex(0), vector01, vector03, normalVector,\r\n );\r\n }\r\n } else if (Array.isArray(data)) {\r\n return this.rectangleEdgeTransform(new Point3dArrayCarrier(data), requireClosurePoint);\r\n } else if (data instanceof Loop && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, true);\r\n } else if (data instanceof Path && data.children.length === 1 && data.children[0] instanceof LineString3d) {\r\n return this.rectangleEdgeTransform(data.children[0].packedPoints, requireClosurePoint);\r\n } else if (data instanceof CurveChain) {\r\n if (!data.checkForNonLinearPrimitives()) {\r\n // const linestring = LineString3d.create();\r\n const strokes = data.getPackedStrokes();\r\n if (strokes) {\r\n return this.rectangleEdgeTransform(strokes);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Look for and simplify:\r\n * * Contiguous `LineSegment3d` and `LineString3d` objects.\r\n * * collect all points\r\n * * eliminate duplicated points\r\n * * eliminate points colinear with surrounding points\r\n * * contiguous concentric circular or elliptic arcs\r\n * * combine angular ranges\r\n * * This function can be used to compress adjacent LineSegment3ds into a LineString3d\r\n * @param curves Path or loop (or larger collection containing paths and loops) to be simplified\r\n * @param options options for tolerance and selective simplification.\r\n */\r\n public static consolidateAdjacentPrimitives(\r\n curves: CurveCollection, options?: ConsolidateAdjacentCurvePrimitivesOptions,\r\n ): void {\r\n const context = new ConsolidateAdjacentCurvePrimitivesContext(options);\r\n curves.dispatchToGeometryHandler(context);\r\n }\r\n /**\r\n * Reverse and reorder loops in the xy-plane for consistency and containment.\r\n * @param loops multiple loops in any order and orientation, z-coordinates ignored\r\n * @returns a region that captures the input pointers. This region is a:\r\n * * `Loop` if there is exactly one input loop. It is oriented counterclockwise.\r\n * * `ParityRegion` if input consists of exactly one outer loop with at least one hole loop.\r\n * Its first child is an outer loop oriented counterclockwise; all subsequent children are holes oriented\r\n * clockwise.\r\n * * `UnionRegion` if any other input configuration. Its children are individually ordered/oriented as in\r\n * the above cases.\r\n * @see [[PolygonOps.sortOuterAndHoleLoopsXY]]\r\n */\r\n public static sortOuterAndHoleLoopsXY(loops: Array<Loop | IndexedXYZCollection>): AnyRegion {\r\n const loopAndArea: SortablePolygon[] = [];\r\n for (const candidate of loops) {\r\n if (candidate instanceof Loop)\r\n SortablePolygon.pushLoop(loopAndArea, candidate);\r\n else if (candidate instanceof IndexedXYZCollection) {\r\n const loop = Loop.createPolygon(candidate);\r\n SortablePolygon.pushLoop(loopAndArea, loop);\r\n }\r\n }\r\n return SortablePolygon.sortAsAnyRegion(loopAndArea);\r\n }\r\n /**\r\n * Find all xy-areas bounded by the unstructured, possibly intersecting curves.\r\n * * For best results, input curves should be parallel to the xy-plane, as z-coordinates are ignored.\r\n * * A common use case of this method is to assemble the bounding \"exterior\" loop (or loops) containing the\r\n * input curves.\r\n * * This method does not add bridge edges to connect outer loops to inner loops. Each disconnected loop,\r\n * regardless of its containment, is returned as its own SignedLoops object. Pre-process with [[regionBooleanXY]]\r\n * to add bridge edges so that [[constructAllXYRegionLoops]] will return outer and inner loops in the same\r\n * SignedLoops object.\r\n * @param curvesAndRegions Any collection of curves. Each Loop/ParityRegion/UnionRegion contributes its curve\r\n * primitives.\r\n * @param tolerance optional distance tolerance for coincidence\r\n * @returns array of [[SignedLoops]], each entry of which describes the faces in a single connected component:\r\n * * `positiveAreaLoops` contains \"interior\" loops, _including holes in ParityRegion input_. These loops have\r\n * positive area and counterclockwise orientation.\r\n * * `negativeAreaLoops` contains (probably just one) \"exterior\" loop which is ordered clockwise.\r\n * * `slivers` contains sliver loops that have zero area, such as appear between coincident curves.\r\n * * `edges` contains a [[LoopCurveLoopCurve]] object for each component edge, collecting both loops adjacent\r\n * to the edge and a constituent curve in each.\r\n */\r\n public static constructAllXYRegionLoops(\r\n curvesAndRegions: AnyCurve | AnyCurve[], tolerance: number = Geometry.smallMetricDistance,\r\n ): SignedLoops[] {\r\n const primitives = RegionOps.collectCurvePrimitives(curvesAndRegions, undefined, true, true);\r\n const range = this.curveArrayRange(primitives);\r\n const areaTol = this.computeXYAreaTolerance(range, tolerance);\r\n const intersections = CurveCurve.allIntersectionsAmongPrimitivesXY(primitives, tolerance);\r\n const graph = PlanarSubdivision.assembleHalfEdgeGraph(primitives, intersections, tolerance);\r\n return PlanarSubdivision.collectSignedLoopSetsInHalfEdgeGraph(graph, areaTol);\r\n }\r\n /**\r\n * Collect all `CurvePrimitives` in loosely typed input.\r\n * * Always recurses into primitives within explicit collections (Path, Loop, ParityRegion, UnionRegion).\r\n * * Optionally recurses into hidden primitives if `smallestPossiblePrimitives` is true.\r\n * @param candidates input curves\r\n * @param collectorArray optional pre-defined output array. If defined, it is NOT cleared: primitives are appended.\r\n * @param smallestPossiblePrimitives if true, recurse into the children of a [[CurveChainWithDistanceIndex]]. If\r\n * false, push the [[CurveChainWithDistanceIndex]] instead.\r\n * @param explodeLinestrings if true, push a [[LineSegment3d]] for each segment of a [[LineString3d]]. If false,\r\n * push the [[LineString3d]] instead.\r\n */\r\n public static collectCurvePrimitives(\r\n candidates: AnyCurve | AnyCurve[],\r\n collectorArray?: CurvePrimitive[],\r\n smallestPossiblePrimitives: boolean = false,\r\n explodeLinestrings: boolean = false,\r\n ): CurvePrimitive[] {\r\n const results: CurvePrimitive[] = collectorArray === undefined ? [] : collectorArray;\r\n if (candidates instanceof CurvePrimitive) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (candidates instanceof CurveCollection) {\r\n candidates.collectCurvePrimitives(results, smallestPossiblePrimitives, explodeLinestrings);\r\n } else if (Array.isArray(candidates)) {\r\n for (const c of candidates) {\r\n this.collectCurvePrimitives(c, results, smallestPossiblePrimitives, explodeLinestrings);\r\n }\r\n }\r\n return results;\r\n }\r\n /**\r\n * Copy primitive pointers from candidates to result array, replacing each [[LineString3d]] by newly constructed\r\n * instances of [[LineSegment3d]].\r\n * @param candidates input curves\r\n * @return copied (captured) inputs except for the linestrings, which are exploded\r\n */\r\n public static expandLineStrings(candidates: CurvePrimitive[]): CurvePrimitive[] {\r\n const result: CurvePrimitive[] = [];\r\n for (const c of candidates) {\r\n if (c instanceof LineString3d) {\r\n for (let i = 0; i + 1 < c.packedPoints.length; i++) {\r\n const q = c.getIndexedSegment(i);\r\n if (q !== undefined)\r\n result.push(q);\r\n }\r\n } else {\r\n result.push(c);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return the overall range of given curves.\r\n * @param data candidate curves\r\n * @param worldToLocal transform to apply to data before computing its range\r\n */\r\n public static curveArrayRange(data: any, worldToLocal?: Transform): Range3d {\r\n const range = Range3d.create();\r\n if (data instanceof GeometryQuery)\r\n data.extendRange(range, worldToLocal);\r\n else if (Array.isArray(data)) {\r\n for (const c of data) {\r\n if (c instanceof GeometryQuery)\r\n c.extendRange(range, worldToLocal);\r\n else if (c instanceof Point3d)\r\n range.extendPoint(c, worldToLocal);\r\n else if (c instanceof GrowableXYZArray)\r\n range.extendRange(c.getRange(worldToLocal));\r\n else if (Array.isArray(c))\r\n range.extendRange(this.curveArrayRange(c, worldToLocal));\r\n }\r\n }\r\n return range;\r\n }\r\n /**\r\n * Triangulate a stroked Loop or ParityRegion and return the graph.\r\n * @param polygons polygons obtained by stroking a Loop or ParityRegion, z-coordinates ignored.\r\n * @returns triangulated graph\r\n */\r\n private static triangulateStrokedRegionComponent(polygons: MultiLineStringDataVariant): HalfEdgeGraph | undefined {\r\n let graph: HalfEdgeGraph | undefined;\r\n if (Array.isArray(polygons)) {\r\n if (polygons.length === 0)\r\n return undefined;\r\n const firstEntry = polygons[0];\r\n if (Point3d.isAnyImmediatePointType(firstEntry)) {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons as XYAndZ[] | XAndY[] | number[][]);\r\n } else if (polygons.length > 1) {\r\n let writablePolygons: IndexedReadWriteXYZCollection[];\r\n if (firstEntry instanceof IndexedReadWriteXYZCollection) {\r\n writablePolygons = polygons as IndexedReadWriteXYZCollection[];\r\n } else {\r\n writablePolygons = [];\r\n for (const polygon of polygons as LineStringDataVariant[])\r\n writablePolygons.push(GrowableXYZArray.create(polygon));\r\n }\r\n const sortedPolygons = PolygonOps.sortOuterAndHoleLoopsXY(writablePolygons);\r\n if (sortedPolygons.length === 1) { // below requires exactly one outer loop!\r\n if (graph = Triangulator.createTriangulatedGraphFromLoops(sortedPolygons[0]))\r\n Triangulator.flipTriangles(graph);\r\n }\r\n } else {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(firstEntry);\r\n }\r\n } else {\r\n graph = Triangulator.createTriangulatedGraphFromSingleLoop(polygons);\r\n }\r\n if (!graph) {\r\n // Last resort: try full merge. Conveniently, multiple polygons are processed with parity logic.\r\n if (graph = RegionOpsFaceToFaceSearch.doPolygonBoolean(polygons, [], (inA, _inB) => inA)) {\r\n if (Triangulator.triangulateAllPositiveAreaFaces(graph))\r\n Triangulator.flipTriangles(graph);\r\n }\r\n }\r\n return graph;\r\n }\r\n /** Stroke a Loop or ParityRegion */\r\n private static strokeRegionComponent(component: Loop | ParityRegion, options?: StrokeOptions): GrowableXYZArray[] {\r\n const strokedComponent = component.cloneStroked(options);\r\n // package the stroked region as polygons\r\n const polygons: GrowableXYZArray[] = [];\r\n if (strokedComponent instanceof Loop) {\r\n if (strokedComponent.children.length > 0 && strokedComponent.children[0] instanceof LineString3d)\r\n polygons.push(strokedComponent.children[0].packedPoints); // expect only 1\r\n } else if (strokedComponent instanceof ParityRegion) {\r\n for (const strokedLoop of strokedComponent.children) {\r\n if (strokedLoop.children.length > 0 && strokedLoop.children[0] instanceof LineString3d)\r\n polygons.push(strokedLoop.children[0].packedPoints); // expect only 1\r\n }\r\n }\r\n return polygons;\r\n }\r\n /**\r\n * Triangulate a Loop or ParityRegion and return the graph.\r\n * @param component region, z-coordinates ignored\r\n * @param options how to stroke loops\r\n * @returns triangulated graph\r\n */\r\n private static triangulateRegionComponent(component: Loop | ParityRegion, options?: StrokeOptions): HalfEdgeGraph | undefined {\r\n const polygons = this.strokeRegionComponent(component, options);\r\n return this.triangulateStrokedRegionComponent(polygons);\r\n }\r\n /**\r\n * Facet the region according to stroke options.\r\n * @param region a closed xy-planar region, possibly with holes.\r\n * * The z-coordinates of the region are ignored. Caller is responsible for rotating the region into plane local coordinates beforehand, and reversing the rotation afterwards.\r\n * * For best results, `UnionRegion` input should consist of non-overlapping children.\r\n * Caller can ensure this by passing in `region = RegionOps.regionBooleanXY(unionRegion, undefined, RegionBinaryOpType.Union)`.\r\n * * For best results, `ParityRegion` input should be correctly oriented (holes have opposite orientation to their containing loop).\r\n * Caller can ensure this for non-intersecting loops by passing in `region = RegionOps.sortOuterAndHoleLoopsXY(loops)`.\r\n * @param options primarily how to stroke the region boundary, but also how to facet the region interior.\r\n * * By default, a triangulation is returned, but if `options.maximizeConvexFacets === true`, edges between coplanar triangles are removed to return maximally convex facets.\r\n * @returns facets for the region, or undefined if facetting failed\r\n */\r\n public static facetRegionXY(region: AnyRegion, options?: StrokeOptions): IndexedPolyface | undefined {\r\n let graph: HalfEdgeGraph | undefined;\r\n if (region instanceof UnionRegion) {\r\n for (const child of region.children) {\r\n const childGraph = RegionOps.triangulateRegionComponent(child, options);\r\n if (childGraph) {\r\n if (!graph) {\r\n graph = childGraph;\r\n } else {\r\n // Graph concatenation without edge splits, clustering, and merge. We assume disjoint children so that at worst,\r\n // components will have unshared adjacent exterior edges that remain after expandConvexFaces. Note that calling\r\n // clusterAndMergeXYTheta here can create non-manifold topology!\r\n graph.allHalfEdges.push(...childGraph.allHalfEdges);\r\n }\r\n }\r\n }\r\n } else {\r\n graph = this.triangulateRegionComponent(region, options);\r\n }\r\n if (!graph)\r\n return undefined;\r\n if (options?.maximizeConvexFacets)\r\n HalfEdgeGraphOps.expandConvexFaces(graph);\r\n return PolyfaceBuilder.graphToPolyface(graph, options);\r\n }\r\n /**\r\n * Decompose a polygon with optional holes into an array of convex polygons.\r\n * @param polygon polygon and hole loops, e.g., as returned by [[CurveCollection.cloneStroked]] on a Loop or ParityRegion. All z-coordinates are ignored.\r\n * @param maximize whether to return maximally convex polygons. If false, triangles are returned.\r\n * @returns array of convex polygons, or undefined if triangulation failed\r\n */\r\n public static convexDecomposePolygonXY(polygon: MultiLineStringDataVariant, maximize: boolean = true): GrowableXYZArray[] | undefined {\r\n const graph = RegionOps.triangulateStrokedRegionComponent(polygon);\r\n if (!graph)\r\n return undefined;\r\n if (maximize)\r\n HalfEdgeGraphOps.expandConvexFaces(graph);\r\n const convexPolygons: GrowableXYZArray[] = [];\r\n graph.announceFaceLoops((_graph, seed) => {\r\n if (!seed.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n convexPolygons.push(GrowableXYZArray.create(seed.collectAroundFace((node) => { return node.getPoint3d(); })));\r\n return true;\r\n });\r\n return convexPolygons;\r\n }\r\n}\r\n/** @internal */\r\nfunction pushToInOnOutArrays(\r\n curve: AnyCurve, select: number, arrayNegative: AnyCurve[], array0: AnyCurve[], arrayPositive: AnyCurve[],\r\n): void {\r\n if (select > 0)\r\n arrayPositive.push(curve);\r\n else if (select < 0)\r\n arrayNegative.push(curve);\r\n else\r\n array0.push(curve);\r\n}\r\n\r\n/**\r\n * * Options to control method `RegionOps.consolidateAdjacentPrimitives`\r\n * @public\r\n */\r\nexport class ConsolidateAdjacentCurvePrimitivesOptions {\r\n /** True to consolidated linear geometry (e.g. separate LineSegment3d and LineString3d) into LineString3d */\r\n public consolidateLinearGeometry: boolean = true;\r\n /** True to consolidate contiguous arcs */\r\n public consolidateCompatibleArcs: boolean = true;\r\n /** Tolerance for collapsing identical points */\r\n public duplicatePointTolerance = Geometry.smallMetricDistance;\r\n /** Tolerance for removing interior colinear points. */\r\n public colinearPointTolerance = Geometry.smallMetricDistance;\r\n}\r\n"]}
@@ -1,6 +1,7 @@
1
1
  import { BSplineCurve3d } from "../../bspline/BSplineCurve";
2
2
  import { BSplineCurve3dH } from "../../bspline/BSplineCurve3dH";
3
3
  import { RecurseToCurvesGeometryHandler } from "../../geometry3d/GeometryHandler";
4
+ import { Point3d } from "../../geometry3d/Point3dVector3d";
4
5
  import { Arc3d } from "../Arc3d";
5
6
  import { CurveChainWithDistanceIndex } from "../CurveChainWithDistanceIndex";
6
7
  import { CurveLocationDetail, CurveLocationDetailPair } from "../CurveLocationDetail";
@@ -24,8 +25,6 @@ import { LineString3d } from "../LineString3d";
24
25
  */
25
26
  export declare class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHandler {
26
27
  private _geometryB;
27
- private _circularArcB;
28
- private _circularRadiusB;
29
28
  private setGeometryB;
30
29
  /**
31
30
  * Maximum XY distance (z is ignored). Approach larger than this is not interesting.
@@ -48,7 +47,7 @@ export declare class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHa
48
47
  * Constructor.
49
48
  * @param geometryB second curve for intersection. Saved for reference by specific handler methods.
50
49
  */
51
- constructor(geometryB: AnyCurve | undefined);
50
+ constructor(geometryB?: AnyCurve);
52
51
  /** Set the (possibly undefined) max XY distance (z is ignored) to accept. */
53
52
  set maxDistanceToAccept(value: number | undefined);
54
53
  /** Access the (possibly undefined) max XY distance (z is ignored) to accept. */
@@ -163,6 +162,20 @@ export declare class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHa
163
162
  private computeSegmentSegment3D;
164
163
  /** Low level dispatch of segment with segment. */
165
164
  private dispatchSegmentSegment;
165
+ /**
166
+ * Compute the perpendiculars between a line segment and an arc, without extending either curve.
167
+ * * One or two perpendiculars will be found.
168
+ * * Each perpendicular segment starts or ends on the arc where the arc tangent is parallel to the line tangent.
169
+ * * Perpendiculars from an endpoint are not explicitly computed.
170
+ * @param cpA line segment or line string; if it is a line string, then the fractions must specify a segment
171
+ * @param pointA0 start point of the segment
172
+ * @param fractionA0 fraction of the start of the segment
173
+ * @param pointA1 end point of the segment
174
+ * @param fractionA1 fraction of the end of the segment
175
+ * @param arc the arc
176
+ * @param reversed swap the details in the recorded pair (default: false)
177
+ */
178
+ allPerpendicularsSegmentArcBounded(cpA: CurvePrimitive, pointA0: Point3d, fractionA0: number, pointA1: Point3d, fractionA1: number, arc: Arc3d, reversed?: boolean): void;
166
179
  /**
167
180
  * Low level dispatch of line segment with arc.
168
181
  * Find close approaches within maxDistance between a line segments (pointA0, pointA1) and an arc.
@@ -179,10 +192,13 @@ export declare class CurveCurveCloseApproachXY extends RecurseToCurvesGeometryHa
179
192
  * @param reversed whether to reverse the details in the pair (e.g., so that detailB refers to geometryB).
180
193
  */
181
194
  private dispatchSegmentArc;
182
- /** Solve Newton for 2 arcs and the given newtonEvaluator. */
183
- private solveArcArcNewton;
184
- /** Find and store perpendicular line between 2 arcs. */
185
- private findPerpLineXYArcArcNewton;
195
+ /**
196
+ * Compute segments perpendicular to two elliptical arcs, without extending either curve.
197
+ * * Perpendiculars from an endpoint are not explicitly computed.
198
+ * * Intersections are also found by this search: they are reported as zero-length segments.
199
+ * @param reversed swap the details in the recorded pair (default: false)
200
+ */
201
+ allPerpendicularsArcArcBounded(arc0: Arc3d, arc1: Arc3d, reversed?: boolean): void;
186
202
  /** Low level dispatch of arc with Arc3d. */
187
203
  private dispatchArcArc;
188
204
  /** Low level dispatch of arc with (beziers of) a bspline curve */
@@ -1 +1 @@
1
- {"version":3,"file":"CurveCurveCloseApproachXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CurveCurveCloseApproachXY.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/CurveCurveCloseApproachXY.ts"],"names":[],"mappings":"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"}