@itwin/core-geometry 3.4.0-dev.8 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +59 -1
  2. package/lib/cjs/clipping/ClipPrimitive.d.ts +3 -3
  3. package/lib/cjs/clipping/ClipPrimitive.js +3 -3
  4. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  5. package/lib/cjs/clipping/ClipUtils.d.ts +1 -1
  6. package/lib/cjs/clipping/ClipUtils.js +1 -1
  7. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  8. package/lib/cjs/clipping/ClipVector.d.ts +1 -1
  9. package/lib/cjs/clipping/ClipVector.js +1 -1
  10. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  11. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +16 -1
  12. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  13. package/lib/cjs/clipping/ConvexClipPlaneSet.js +43 -1
  14. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  15. package/lib/cjs/core-geometry.d.ts +1 -0
  16. package/lib/cjs/core-geometry.d.ts.map +1 -1
  17. package/lib/cjs/core-geometry.js +1 -0
  18. package/lib/cjs/core-geometry.js.map +1 -1
  19. package/lib/cjs/curve/LineString3d.d.ts +3 -0
  20. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  21. package/lib/cjs/curve/LineString3d.js +24 -0
  22. package/lib/cjs/curve/LineString3d.js.map +1 -1
  23. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  24. package/lib/cjs/curve/Query/PlanarSubdivision.js +16 -4
  25. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  26. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -1
  27. package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  28. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +26 -1
  29. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  30. package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -1
  31. package/lib/cjs/geometry3d/AngleSweep.js +1 -1
  32. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  33. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +3 -1
  34. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  35. package/lib/cjs/geometry3d/Point3dVector3d.js +3 -1
  36. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  37. package/lib/cjs/geometry3d/PointHelpers.d.ts +8 -1
  38. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  39. package/lib/cjs/geometry3d/PointHelpers.js +37 -3
  40. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  41. package/lib/cjs/geometry3d/PolygonOps.d.ts +11 -3
  42. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  43. package/lib/cjs/geometry3d/PolygonOps.js +44 -6
  44. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  45. package/lib/cjs/geometry3d/PolylineOps.d.ts +5 -0
  46. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  47. package/lib/cjs/geometry3d/PolylineOps.js +20 -0
  48. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  49. package/lib/cjs/numerics/ClusterableArray.d.ts +4 -4
  50. package/lib/cjs/numerics/ClusterableArray.js +5 -5
  51. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  52. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +3 -3
  53. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  54. package/lib/cjs/polyface/PolyfaceBuilder.js +8 -6
  55. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  56. package/lib/cjs/polyface/PolyfaceQuery.d.ts +69 -11
  57. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  58. package/lib/cjs/polyface/PolyfaceQuery.js +163 -15
  59. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  60. package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
  61. package/lib/cjs/serialization/BGFBWriter.js +1 -0
  62. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  63. package/lib/cjs/serialization/GeometrySamples.d.ts +11 -0
  64. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  65. package/lib/cjs/serialization/GeometrySamples.js +51 -0
  66. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  67. package/lib/cjs/serialization/IModelJsonSchema.d.ts +23 -15
  68. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  69. package/lib/cjs/serialization/IModelJsonSchema.js +17 -8
  70. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  71. package/lib/cjs/solid/Box.d.ts +4 -4
  72. package/lib/cjs/solid/Box.d.ts.map +1 -1
  73. package/lib/cjs/solid/Box.js +7 -7
  74. package/lib/cjs/solid/Box.js.map +1 -1
  75. package/lib/cjs/topology/Graph.d.ts +3 -3
  76. package/lib/cjs/topology/Graph.d.ts.map +1 -1
  77. package/lib/cjs/topology/Graph.js +2 -2
  78. package/lib/cjs/topology/Graph.js.map +1 -1
  79. package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +2 -2
  80. package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -2
  81. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  82. package/lib/cjs/topology/Merging.d.ts +5 -1
  83. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  84. package/lib/cjs/topology/Merging.js +27 -15
  85. package/lib/cjs/topology/Merging.js.map +1 -1
  86. package/lib/cjs/topology/SpaceTriangulation.d.ts +47 -0
  87. package/lib/cjs/topology/SpaceTriangulation.d.ts.map +1 -0
  88. package/lib/cjs/topology/SpaceTriangulation.js +135 -0
  89. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -0
  90. package/lib/esm/clipping/ClipPrimitive.d.ts +3 -3
  91. package/lib/esm/clipping/ClipPrimitive.js +3 -3
  92. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  93. package/lib/esm/clipping/ClipUtils.d.ts +1 -1
  94. package/lib/esm/clipping/ClipUtils.js +1 -1
  95. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  96. package/lib/esm/clipping/ClipVector.d.ts +1 -1
  97. package/lib/esm/clipping/ClipVector.js +1 -1
  98. package/lib/esm/clipping/ClipVector.js.map +1 -1
  99. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +16 -1
  100. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  101. package/lib/esm/clipping/ConvexClipPlaneSet.js +43 -1
  102. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  103. package/lib/esm/core-geometry.d.ts +1 -0
  104. package/lib/esm/core-geometry.d.ts.map +1 -1
  105. package/lib/esm/core-geometry.js +1 -0
  106. package/lib/esm/core-geometry.js.map +1 -1
  107. package/lib/esm/curve/LineString3d.d.ts +3 -0
  108. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  109. package/lib/esm/curve/LineString3d.js +24 -0
  110. package/lib/esm/curve/LineString3d.js.map +1 -1
  111. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  112. package/lib/esm/curve/Query/PlanarSubdivision.js +16 -4
  113. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  114. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -1
  115. package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
  116. package/lib/esm/curve/internalContexts/MultiChainCollector.js +26 -1
  117. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  118. package/lib/esm/geometry3d/AngleSweep.d.ts +1 -1
  119. package/lib/esm/geometry3d/AngleSweep.js +1 -1
  120. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  121. package/lib/esm/geometry3d/Point3dVector3d.d.ts +3 -1
  122. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  123. package/lib/esm/geometry3d/Point3dVector3d.js +3 -1
  124. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  125. package/lib/esm/geometry3d/PointHelpers.d.ts +8 -1
  126. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  127. package/lib/esm/geometry3d/PointHelpers.js +37 -3
  128. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  129. package/lib/esm/geometry3d/PolygonOps.d.ts +11 -3
  130. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  131. package/lib/esm/geometry3d/PolygonOps.js +44 -6
  132. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  133. package/lib/esm/geometry3d/PolylineOps.d.ts +5 -0
  134. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  135. package/lib/esm/geometry3d/PolylineOps.js +20 -0
  136. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  137. package/lib/esm/numerics/ClusterableArray.d.ts +4 -4
  138. package/lib/esm/numerics/ClusterableArray.js +5 -5
  139. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  140. package/lib/esm/polyface/PolyfaceBuilder.d.ts +3 -3
  141. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  142. package/lib/esm/polyface/PolyfaceBuilder.js +8 -6
  143. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  144. package/lib/esm/polyface/PolyfaceQuery.d.ts +69 -11
  145. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  146. package/lib/esm/polyface/PolyfaceQuery.js +164 -16
  147. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  148. package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
  149. package/lib/esm/serialization/BGFBWriter.js +1 -0
  150. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  151. package/lib/esm/serialization/GeometrySamples.d.ts +11 -0
  152. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  153. package/lib/esm/serialization/GeometrySamples.js +51 -0
  154. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  155. package/lib/esm/serialization/IModelJsonSchema.d.ts +23 -15
  156. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  157. package/lib/esm/serialization/IModelJsonSchema.js +17 -8
  158. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  159. package/lib/esm/solid/Box.d.ts +4 -4
  160. package/lib/esm/solid/Box.d.ts.map +1 -1
  161. package/lib/esm/solid/Box.js +7 -7
  162. package/lib/esm/solid/Box.js.map +1 -1
  163. package/lib/esm/topology/Graph.d.ts +3 -3
  164. package/lib/esm/topology/Graph.d.ts.map +1 -1
  165. package/lib/esm/topology/Graph.js +2 -2
  166. package/lib/esm/topology/Graph.js.map +1 -1
  167. package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +2 -2
  168. package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -2
  169. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  170. package/lib/esm/topology/Merging.d.ts +5 -1
  171. package/lib/esm/topology/Merging.d.ts.map +1 -1
  172. package/lib/esm/topology/Merging.js +27 -15
  173. package/lib/esm/topology/Merging.js.map +1 -1
  174. package/lib/esm/topology/SpaceTriangulation.d.ts +47 -0
  175. package/lib/esm/topology/SpaceTriangulation.d.ts.map +1 -0
  176. package/lib/esm/topology/SpaceTriangulation.js +131 -0
  177. package/lib/esm/topology/SpaceTriangulation.js.map +1 -0
  178. package/package.json +8 -6
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nclass MapCurvePrimitiveToCurveLocatioNDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive for this calculation.\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n}\r\n/*\r\n function getDetailString(detail: CurveLocationDetail | undefined): string {\r\n if (!detail)\r\n return \"{}\";\r\n else return tagString(\"primitive\", this.primitiveToIndex.get(detail.curve!)) + tagString(\"f0\", detail.fraction) + tagString(\"f1\", detail.fraction1);\r\n }\r\n}\r\nfunction tagString(name: string, value: number | undefined): string {\r\n if (value !== undefined)\r\n return \"(\" + name + \" \" + value + \")\";\r\n return \"\";\r\n}\r\n*/\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n public static assembleHalfEdgeGraph(_primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[]): HalfEdgeGraph {\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocatioNDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.\r\n for (const p of _primitives)\r\n detailByPrimitive.assignPrimitiveIndex(p);\r\n for (const pair of allPairs) {\r\n detailByPrimitive.insertPair(pair);\r\n }\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n const details = entry[1];\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p);\r\n const fractionB = getFractionOnCurve(pairB, p);\r\n if (fractionA === undefined || fractionB === undefined)\r\n return -1000.0;\r\n return fractionA - fractionB;\r\n });\r\n let detail0 = getDetailOnCurve(details[0], p)!;\r\n this.addHalfEdge(graph, p, p.startPoint (), 0.0, detail0.point, detail0.fraction);\r\n for (let i = 1; i < details.length; i++) {\r\n // create (both sides of) a graph edge . . .\r\n const detail1 = getDetailOnCurve(details[i], p)!;\r\n this.addHalfEdge(graph, p, detail0.point, detail0.fraction, detail1.point, detail1.fraction);\r\n detail0 = detail1;\r\n }\r\n this.addHalfEdge(graph, p, detail0.point, detail0.fraction, p.endPoint(), 1.0);\r\n }\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\r\n return graph;\r\n }\r\n/**\r\n * Create a pair of mated half edges referencing an interval of a primitive\r\n * * no action if start and end points are identical.\r\n * @param graph containing graph.\r\n * @param p the curve\r\n * @param fraction0 starting fraction\r\n * @param point0 start point\r\n * @param fraction1 end fraction\r\n * @param point1 end point\r\n */\r\n private static addHalfEdge(graph: HalfEdgeGraph, p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number) {\r\n if (!point0.isAlmostEqual (point1)){\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = sortAngle(detail01.curve!, detail01.fraction, false);\r\n mate.sortAngle = sortAngle(detail01.curve!, detail01.fraction1!, true);\r\n }\r\n }\r\n// based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.\r\n // return the area (forced to zero if within tolerance)\r\n public static collectSignedLoop(loop: Loop, signedAreas: SignedLoops, zeroAreaTolerance: number = 1.0e-10): number{\r\n let area = RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n signedAreas.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n signedAreas.negativeAreaLoops.push(loop);\r\n else\r\n signedAreas.slivers.push(loop);\r\n return area;\r\n }\r\n public static createLoopInFace(faceSeed: HalfEdge,\r\n announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void): Loop {\r\n let he = faceSeed;\r\n const loop = Loop.create();\r\n do {\r\n const detail = he.edgeTag as CurveLocationDetail;\r\n if (detail) {\r\n let curve;\r\n if (he.sortData! > 0)\r\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\r\n else\r\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\r\n if (curve) {\r\n if (announce !== undefined)\r\n announce(he, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n }\r\n he = he.faceSuccessor;\r\n } while (he !== faceSeed);\r\n return loop;\r\n }\r\n// return true if there are only two edges.\r\n // In a line-only graph, this is a null-area face.\r\n private static isNullFace(he: HalfEdge): boolean {\r\n return he.faceSuccessor.faceSuccessor === he;\r\n }\r\n // Look across edge mates (possibly several) for a nonnull mate face.\r\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace (e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)){\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n if (this.isNullFace(he)) {\r\n // Ignore all edges of null faces.\r\n } else {\r\n const mate = this.nonNullEdgeMate(graph, he);\r\n if (mate !== undefined){\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n }\r\n });\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\n\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n"]}
1
+ {"version":3,"file":"PlanarSubdivision.js","sourceRoot":"","sources":["../../../../src/curve/Query/PlanarSubdivision.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\nimport { Geometry } from \"../../Geometry\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { HalfEdge, HalfEdgeGraph } from \"../../topology/Graph\";\r\nimport { HalfEdgeGraphSearch } from \"../../topology/HalfEdgeGraphSearch\";\r\nimport { HalfEdgeGraphMerge } from \"../../topology/Merging\";\r\nimport { CurveLocationDetail, CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { Loop, LoopCurveLoopCurve, SignedLoops } from \"../Loop\";\r\nimport { RegionOps } from \"../RegionOps\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\nclass MapCurvePrimitiveToCurveLocatioNDetailPairArray {\r\n public primitiveToPair = new Map<CurvePrimitive, CurveLocationDetailPair[]>();\r\n // index assigned to this primitive for this calculation.\r\n public primitiveToIndex = new Map<CurvePrimitive, number>();\r\n private _numIndexedPrimitives: number = 0;\r\n public assignPrimitiveIndex(primitive: CurvePrimitive | undefined) {\r\n if (primitive !== undefined) {\r\n const index = this.primitiveToIndex.get(primitive);\r\n if (index === undefined) {\r\n this.primitiveToIndex.set(primitive, this._numIndexedPrimitives++);\r\n }\r\n }\r\n }\r\n public insertPrimitiveToPair(primitive: CurvePrimitive | undefined, pair: CurveLocationDetailPair) {\r\n if (primitive) {\r\n const priorPairs = this.primitiveToPair.get(primitive);\r\n this.assignPrimitiveIndex(primitive);\r\n if (!priorPairs) {\r\n this.primitiveToPair.set(primitive, [pair]);\r\n } else {\r\n priorPairs.push(pair);\r\n }\r\n }\r\n }\r\n public insertPair(pair: CurveLocationDetailPair) {\r\n const primitiveA = pair.detailA.curve;\r\n if (primitiveA)\r\n this.insertPrimitiveToPair(primitiveA, pair);\r\n const primitiveB = pair.detailB.curve;\r\n if (primitiveB)\r\n this.insertPrimitiveToPair(primitiveB, pair);\r\n }\r\n}\r\n/*\r\n function getDetailString(detail: CurveLocationDetail | undefined): string {\r\n if (!detail)\r\n return \"{}\";\r\n else return tagString(\"primitive\", this.primitiveToIndex.get(detail.curve!)) + tagString(\"f0\", detail.fraction) + tagString(\"f1\", detail.fraction1);\r\n }\r\n}\r\nfunction tagString(name: string, value: number | undefined): string {\r\n if (value !== undefined)\r\n return \"(\" + name + \" \" + value + \")\";\r\n return \"\";\r\n}\r\n*/\r\n/**\r\n * @internal\r\n */\r\nexport class PlanarSubdivision {\r\n public static assembleHalfEdgeGraph(_primitives: CurvePrimitive[], allPairs: CurveLocationDetailPair[]): HalfEdgeGraph {\r\n const detailByPrimitive = new MapCurvePrimitiveToCurveLocatioNDetailPairArray(); // map from key CurvePrimitive to CurveLocationDetailPair.\r\n for (const p of _primitives)\r\n detailByPrimitive.assignPrimitiveIndex(p);\r\n for (const pair of allPairs) {\r\n detailByPrimitive.insertPair(pair);\r\n }\r\n const graph = new HalfEdgeGraph();\r\n for (const entry of detailByPrimitive.primitiveToPair.entries()) {\r\n const p = entry[0];\r\n const details = entry[1];\r\n details.sort((pairA: CurveLocationDetailPair, pairB: CurveLocationDetailPair) => {\r\n const fractionA = getFractionOnCurve(pairA, p);\r\n const fractionB = getFractionOnCurve(pairB, p);\r\n if (fractionA === undefined || fractionB === undefined)\r\n return -1000.0;\r\n return fractionA - fractionB;\r\n });\r\n let detail0 = getDetailOnCurve(details[0], p)!;\r\n this.addHalfEdge(graph, p, p.startPoint (), 0.0, detail0.point, detail0.fraction);\r\n for (let i = 1; i < details.length; i++) {\r\n // create (both sides of) a graph edge . . .\r\n const detail1 = getDetailOnCurve(details[i], p)!;\r\n this.addHalfEdge(graph, p, detail0.point, detail0.fraction, detail1.point, detail1.fraction);\r\n detail0 = detail1;\r\n }\r\n this.addHalfEdge(graph, p, detail0.point, detail0.fraction, p.endPoint(), 1.0);\r\n }\r\n HalfEdgeGraphMerge.clusterAndMergeXYTheta(graph, (he: HalfEdge) => he.sortAngle!);\r\n return graph;\r\n }\r\n/**\r\n * Create a pair of mated half edges referencing an interval of a primitive\r\n * * no action if start and end points are identical.\r\n * @param graph containing graph.\r\n * @param p the curve\r\n * @param fraction0 starting fraction\r\n * @param point0 start point\r\n * @param fraction1 end fraction\r\n * @param point1 end point\r\n */\r\n private static addHalfEdge(graph: HalfEdgeGraph, p: CurvePrimitive, point0: Point3d, fraction0: number, point1: Point3d, fraction1: number) {\r\n if (!point0.isAlmostEqual (point1)){\r\n const halfEdge = graph.createEdgeXYAndZ(point0, 0, point1, 0);\r\n const detail01 = CurveLocationDetail.createCurveEvaluatedFractionFraction(p, fraction0, fraction1);\r\n const mate = halfEdge.edgeMate;\r\n halfEdge.edgeTag = detail01;\r\n halfEdge.sortData = 1.0;\r\n mate.edgeTag = detail01;\r\n mate.sortData = -1.0;\r\n halfEdge.sortAngle = sortAngle(detail01.curve!, detail01.fraction, false);\r\n mate.sortAngle = sortAngle(detail01.curve!, detail01.fraction1!, true);\r\n }\r\n }\r\n// based on computed (and toleranced) area, push the loop (pointer) onto the appropriate array of positive, negative, or sliver loops.\r\n // return the area (forced to zero if within tolerance)\r\n public static collectSignedLoop(loop: Loop, signedAreas: SignedLoops, zeroAreaTolerance: number = 1.0e-10): number{\r\n let area = RegionOps.computeXYArea(loop);\r\n if (area === undefined)\r\n area = 0;\r\n if (Math.abs(area) < zeroAreaTolerance)\r\n area = 0.0;\r\n (loop as any).computedAreaInPlanarSubdivision = area;\r\n if (area > 0)\r\n signedAreas.positiveAreaLoops.push(loop);\r\n else if (area < 0)\r\n signedAreas.negativeAreaLoops.push(loop);\r\n else\r\n signedAreas.slivers.push(loop);\r\n return area;\r\n }\r\n public static createLoopInFace(faceSeed: HalfEdge,\r\n announce?: (he: HalfEdge, curve: CurvePrimitive, loop: Loop) => void): Loop {\r\n let he = faceSeed;\r\n const loop = Loop.create();\r\n do {\r\n const detail = he.edgeTag as CurveLocationDetail;\r\n if (detail) {\r\n let curve;\r\n if (he.sortData! > 0)\r\n curve = detail.curve!.clonePartialCurve(detail.fraction, detail.fraction1!);\r\n else\r\n curve = detail.curve!.clonePartialCurve(detail.fraction1!, detail.fraction);\r\n if (curve) {\r\n if (announce !== undefined)\r\n announce(he, curve, loop);\r\n loop.tryAddChild(curve);\r\n }\r\n }\r\n he = he.faceSuccessor;\r\n } while (he !== faceSeed);\r\n return loop;\r\n }\r\n // Return true if there are only two edges in the face loop, and their start curvatures are the same.\r\n private static isNullFace(he: HalfEdge): boolean {\r\n const faceHasTwoEdges = (he.faceSuccessor.faceSuccessor === he);\r\n let faceIsBanana = false;\r\n if (faceHasTwoEdges) {\r\n const c0 = HalfEdgeGraphMerge.curvatureSortKey(he);\r\n const c1 = HalfEdgeGraphMerge.curvatureSortKey(he.faceSuccessor.edgeMate);\r\n if (!Geometry.isSameCoordinate(c0, c1)) // default tol!\r\n faceIsBanana = true; // heuristic: we could also check end curvatures, and/or higher derivatives...\r\n }\r\n return faceHasTwoEdges && !faceIsBanana;\r\n }\r\n // Look across edge mates (possibly several) for a nonnull mate face.\r\n private static nonNullEdgeMate(_graph: HalfEdgeGraph, e: HalfEdge): HalfEdge | undefined {\r\n if (this.isNullFace (e))\r\n return undefined;\r\n let e1 = e.edgeMate;\r\n while (this.isNullFace(e1)){\r\n e1 = e1.faceSuccessor.edgeMate;\r\n if (e1 === e)\r\n return undefined;\r\n }\r\n return e1;\r\n }\r\n public static collectSignedLoopSetsInHalfEdgeGraph(graph: HalfEdgeGraph, zeroAreaTolerance: number = 1.0e-10): SignedLoops[] {\r\n const q = HalfEdgeGraphSearch.collectConnectedComponentsWithExteriorParityMasks(graph, undefined);\r\n const result: SignedLoops[] = [];\r\n const edgeMap = new Map<HalfEdge, LoopCurveLoopCurve>();\r\n for (const faceSeeds of q) {\r\n const componentAreas: SignedLoops = { positiveAreaLoops: [], negativeAreaLoops: [], slivers: [] };\r\n const edges: LoopCurveLoopCurve[] = [];\r\n for (const faceSeed of faceSeeds) {\r\n const loop = this.createLoopInFace(faceSeed, (he: HalfEdge, curveC: CurvePrimitive, loopC: Loop) => {\r\n if (this.isNullFace(he)) {\r\n // Ignore all edges of null faces.\r\n } else {\r\n const mate = this.nonNullEdgeMate(graph, he);\r\n if (mate !== undefined){\r\n const e = edgeMap.get(mate);\r\n if (e === undefined) {\r\n // Record this as loopA,edgeA of a shared edge to be completed later from the other side of the edge\r\n const e1 = new LoopCurveLoopCurve(loopC, curveC, undefined, undefined);\r\n edgeMap.set(he, e1);\r\n } else if (e instanceof LoopCurveLoopCurve) {\r\n e.setB(loopC, curveC);\r\n edges.push(e);\r\n edgeMap.delete(mate);\r\n }\r\n }\r\n }\r\n });\r\n this.collectSignedLoop(loop, componentAreas, zeroAreaTolerance);\r\n }\r\n componentAreas.edges = edges;\r\n result.push(componentAreas);\r\n edgeMap.clear();\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nfunction sortAngle(curve: CurvePrimitive, fraction: number, reverse: boolean): number {\r\n const ray = curve.fractionToPointAndDerivative(fraction);\r\n const s = reverse ? -1.0 : 1.0;\r\n return Math.atan2(s * ray.direction.y, s * ray.direction.x);\r\n}\r\n\r\nfunction getFractionOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): number | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA.fraction;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB.fraction;\r\n return undefined;\r\n}\r\nfunction getDetailOnCurve(pair: CurveLocationDetailPair, curve: CurvePrimitive): CurveLocationDetail | undefined {\r\n if (pair.detailA.curve === curve)\r\n return pair.detailA;\r\n if (pair.detailB.curve === curve)\r\n return pair.detailB;\r\n return undefined;\r\n}\r\n"]}
@@ -2,6 +2,7 @@ import { AnyCurve } from "../../curve/CurveChain";
2
2
  import { BagOfCurves } from "../../curve/CurveCollection";
3
3
  import { CurvePrimitive } from "../../curve/CurvePrimitive";
4
4
  import { GeometryQuery } from "../../curve/GeometryQuery";
5
+ import { LineString3d } from "../../curve/LineString3d";
5
6
  import { Loop } from "../../curve/Loop";
6
7
  import { Path } from "../../curve/Path";
7
8
  import { ChainTypes } from "../../curve/RegionOps";
@@ -78,8 +79,11 @@ export declare class MultiChainCollector {
78
79
  * * When a path is created the curves array is CAPTURED.
79
80
  */
80
81
  private promoteArrayToCurves;
82
+ private chainToLineString3d;
81
83
  /** Return the collected results, structured as the simplest possible type. */
82
84
  grabResult(makeLoopIfClosed?: boolean): CurvePrimitive | Path | BagOfCurves | Loop | undefined;
85
+ /** Return chains as individual calls to announceChain. */
86
+ announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void): void;
83
87
  }
84
88
  export declare class OffsetHelpers {
85
89
  static sumLengths(data: any): number;
@@ -99,7 +103,6 @@ export declare class OffsetHelpers {
99
103
  };
100
104
  /**
101
105
  * * Restructure curve fragments as chains and offsets
102
- * * Return object with named chains, insideOffsets, outsideOffsets
103
106
  * * BEWARE that if the input is not a loop the classification of outputs is suspect.
104
107
  * @param fragments fragments to be chained
105
108
  * @param gapTolerance distance to be treated as "effectively zero" when joining head-to-tail.
@@ -1 +1 @@
1
- {"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAmB,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAa,MAAM,uBAAuB,CAAC;AAK9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGnD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAqB;IAEpC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IAEtC,sCAAsC;IACtC,OAAO,CAAC,uBAAuB,CAAS;IACxC,sCAAsC;IACtC,OAAO,CAAC,qBAAqB,CAAS;IACtC,uEAAuE;IACvE,OAAO,CAAC,mBAAmB,CAAqB;IAChD;;;OAGG;gBACgB,sBAAsB,SAA+B,EAAE,cAAc,GAAE,MAAM,GAAG,SAAwC;IAO3I,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B;;;;;OAKG;IACI,qBAAqB,CAAC,SAAS,EAAE,cAAc;IAOtD;;;;;OAKG;IACI,YAAY,CAAC,SAAS,EAAE,aAAa;IAU5C;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA4CjC;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,wBAAwB;IAuBhC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAiC5B,8EAA8E;IACvE,UAAU,CAAC,gBAAgB,GAAE,OAAe,GAAG,cAAc,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS;CAa7G;AAED,qBAAa,aAAa;WAEV,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;WAa7B,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO;WAa/C,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM;IA4BhJ;;;;;;OAMG;WACW,8BAA8B,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;QAAE,aAAa,EAAE,aAAa,EAAE,CAAC;QAAC,cAAc,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE;IAgB/M;;;;;;OAMG;WACW,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,GAAE,MAAqC,GAAG,UAAU;IAQjJ;;OAEG;WACW,kBAAkB,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;WAgB1E,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CA8BhG"}
1
+ {"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"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"}
@@ -236,6 +236,16 @@ class MultiChainCollector {
236
236
  return curves[0];
237
237
  return Path_1.Path.createArray(curves);
238
238
  }
239
+ chainToLineString3d(curves) {
240
+ if (curves.length === 0)
241
+ return undefined;
242
+ const linestring = LineString3d_1.LineString3d.create();
243
+ for (const curve of curves) {
244
+ curve.emitStrokes(linestring);
245
+ linestring.removeDuplicatePoints();
246
+ }
247
+ return linestring;
248
+ }
239
249
  /** Return the collected results, structured as the simplest possible type. */
240
250
  grabResult(makeLoopIfClosed = false) {
241
251
  const chains = this._chains;
@@ -250,6 +260,22 @@ class MultiChainCollector {
250
260
  }
251
261
  return bag;
252
262
  }
263
+ /** Return chains as individual calls to announceChain. */
264
+ announceChainsAsLineString3d(announceChain) {
265
+ const chains = this._chains;
266
+ if (chains.length === 1) {
267
+ const ls = this.chainToLineString3d(chains[0]);
268
+ if (ls)
269
+ announceChain(ls);
270
+ }
271
+ else if (chains.length > 1) {
272
+ for (const chain of chains) {
273
+ const ls = this.chainToLineString3d(chain);
274
+ if (ls)
275
+ announceChain(ls);
276
+ }
277
+ }
278
+ }
253
279
  }
254
280
  exports.MultiChainCollector = MultiChainCollector;
255
281
  // static methods to assist offset sequences ....
@@ -340,7 +366,6 @@ class OffsetHelpers {
340
366
  }
341
367
  /**
342
368
  * * Restructure curve fragments as chains and offsets
343
- * * Return object with named chains, insideOffsets, outsideOffsets
344
369
  * * BEWARE that if the input is not a loop the classification of outputs is suspect.
345
370
  * @param fragments fragments to be chained
346
371
  * @param gapTolerance distance to be treated as "effectively zero" when joining head-to-tail.
@@ -1 +1 @@
1
- {"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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\nimport { Arc3d } from \"../../curve/Arc3d\";\r\nimport { AnyCurve } from \"../../curve/CurveChain\";\r\nimport { BagOfCurves, CurveCollection } from \"../../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../../curve/CurvePrimitive\";\r\nimport { GeometryQuery } from \"../../curve/GeometryQuery\";\r\nimport { LineSegment3d } from \"../../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../../curve/LineString3d\";\r\nimport { Loop } from \"../../curve/Loop\";\r\nimport { Path } from \"../../curve/Path\";\r\nimport { ChainTypes, RegionOps } from \"../../curve/RegionOps\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { CurveCurve } from \"../../curve/CurveCurve\";\r\nimport { CurveChainWireOffsetContext } from \"./PolygonOffsetContext\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\r\n\r\n/**\r\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\r\n * * The caller makes a sequence of calls to announce individual primitives.\r\n * * This collector (unlike the simpler \"ChainCollector\") expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\r\n * * chainCollector.announceCurvePrimitive (curve, searchAllPaths).\r\n * * When all curves have been announced, the call to grab the paths option restructures the various active chains into Path and Loop objects.\r\n * * Usage pattern is\r\n * * initialization: `context = new ChainCollectorContext (makeClones: boolean)`\r\n * * many times\r\n * * ` context.captureCurve (anyCurve, searchAllPaths)`\r\n * * ` context.captureCurvePrimitive (primitive, searchAllPaths)`\r\n * * end: ` result = context.grabResults (formLoopsIfClosed)`\r\n * @internal\r\n */\r\nexport class MultiChainCollector {\r\n private _chains: CurvePrimitive[][];\r\n\r\n private static _staticPointA: Point3d;\r\n private static _staticPointB: Point3d;\r\n\r\n /** LOOSE tolerance for snap to end */\r\n private _endPointShiftTolerance: number;\r\n /** TIGHT tolerance for snap to end */\r\n private _endPointHitTolerance: number;\r\n /** tolerance for choosing Path or Loop. If undefined, ALWAYS PATH */\r\n private _planarityTolerance: number | undefined;\r\n /** Initialize with an empty array of chains.\r\n * @param endPointShiftTolerance tolerance for calling endpoints identical\r\n * @param planeTolerance tolerance for considering a loop to be planar. If undefined, only create Path. If defined, create Loop curves are if within tolerance of a plane.\r\n */\r\n public constructor(endPointShiftTolerance = Geometry.smallMetricDistance, planeTolerance: number | undefined = Geometry.smallMetricDistance) {\r\n this._chains = [];\r\n this._endPointShiftTolerance = endPointShiftTolerance;\r\n this._endPointHitTolerance = Geometry.smallMetricDistance;\r\n this._planarityTolerance = planeTolerance;\r\n }\r\n\r\n private _xyzWork0?: Point3d;\r\n /**\r\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\r\n * @param xyz\r\n * @param tolerance\r\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\r\n */\r\n private findAnyChainToConnect(xyz: Point3d, tolerance: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\r\n\r\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\r\n if (exceptChainIndex === chainIndexA)\r\n continue;\r\n const chain = this._chains[chainIndexA];\r\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: true };\r\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: false };\r\n }\r\n return undefined;\r\n }\r\n\r\n private _xyzWork1?: Point3d;\r\n /**\r\n * Insert a single curve primitive into the active chains.\r\n * * The primitive is captured (not cloned)\r\n * * The primitive may be reversed in place\r\n * @param candidate\r\n */\r\n public captureCurvePrimitive(candidate: CurvePrimitive) {\r\n if (this.attachPrimitiveToAnyChain(candidate, this._endPointHitTolerance)) return;\r\n if (this.attachPrimitiveToAnyChain(candidate, this._endPointShiftTolerance)) return;\r\n this._chains.push([candidate]);\r\n return;\r\n }\r\n\r\n /**\r\n * Insert any curve into the collection.\r\n * * This recurses into Path, Loop, BagOfCurves etc\r\n * * The all primitives are captured, and may be reversed in place.\r\n * @param candidate\r\n */\r\n public captureCurve(candidate: GeometryQuery) {\r\n if (candidate instanceof CurvePrimitive)\r\n this.captureCurvePrimitive(candidate);\r\n else if (candidate instanceof CurveCollection && candidate.children !== undefined) {\r\n for (const c of candidate.children) {\r\n this.captureCurve(c);\r\n }\r\n }\r\n }\r\n\r\n /** Announce a curve primitive\r\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\r\n * * Otherwise start a new chain.\r\n */\r\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, tolerance: number): boolean {\r\n if (candidate) {\r\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[index0], chain[index0 + 1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[0], chain[1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n } else {\r\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) { // START of new primitive ..\r\n if (connect.atEnd) {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[index0], chain[index0 + 1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[0], chain[1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * * Move each primitive from chainB to the end of chainA.\r\n * * clear chainB.\r\n * * move the final chain to chainB index.\r\n * * reduce the _chain.length by 1.\r\n */\r\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\r\n const chainA = this._chains[chainIndexA];\r\n const chainB = this._chains[chainIndexB];\r\n for (const p of chainB) {\r\n chainA.push(p);\r\n }\r\n // chainIndexB is unused.\r\n chainB.length = 0;\r\n const lastChainIndex = this._chains.length - 1;\r\n if (chainIndexB !== lastChainIndex) {\r\n this._chains[chainIndexB] = this._chains[lastChainIndex];\r\n this._chains.pop();\r\n } else {\r\n this._chains.pop();\r\n }\r\n }\r\n private reverseChain(chainIndex: number) {\r\n const chain = this._chains[chainIndex];\r\n chain.reverse();\r\n for (const p of chain)\r\n p.reverseInPlace();\r\n }\r\n // see if the head or tail of chainIndex matches any existing chain. If so, merge\r\n private searchAndMergeChainIndex(chainIndex: number, tolerance: number): void {\r\n // ASSUME valid index of non-empty chain\r\n const chain = this._chains[chainIndex];\r\n const lastIndexInChain = chain.length - 1;\r\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\r\n // this start with any other chain ..\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (!connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\r\n return;\r\n }\r\n // try end with any other chain\r\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\r\n return;\r\n }\r\n }\r\n /** turn an array of curve primitives into the simplest possible strongly typed curve structure.\r\n * * The input array is assumed to be connected appropriately to act as the curves of a Path.\r\n * * When a path is created the curves array is CAPTURED.\r\n */\r\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\r\n if (curves.length === 0)\r\n return undefined;\r\n if (makeLoopIfClosed) {\r\n const primitive0 = curves[0];\r\n const primitiveN = curves[curves.length - 1];\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n const distanceAToB = MultiChainCollector._staticPointA.distance(MultiChainCollector._staticPointB);\r\n if (distanceAToB < this._endPointShiftTolerance) {\r\n // adjust for closure (and get the corrected coordinates)\r\n OffsetHelpers.moveHeadOrTail(primitiveN, primitive0, this._endPointShiftTolerance);\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n }\r\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB)) {\r\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\r\n if (localToWorld) {\r\n const worldToLocal = localToWorld.inverse();\r\n if (worldToLocal) {\r\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\r\n if (this._planarityTolerance !== undefined && range.zLength() <= this._planarityTolerance) {\r\n return Loop.createArray(curves);\r\n }\r\n }\r\n }\r\n return Path.createArray(curves);\r\n }\r\n }\r\n if (curves.length === 1)\r\n return curves[0];\r\n return Path.createArray(curves);\r\n }\r\n /** Return the collected results, structured as the simplest possible type. */\r\n public grabResult(makeLoopIfClosed: boolean = false): CurvePrimitive | Path | BagOfCurves | Loop | undefined {\r\n const chains = this._chains;\r\n if (chains.length === 0)\r\n return undefined;\r\n if (chains.length === 1)\r\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\r\n const bag = BagOfCurves.create();\r\n for (const chain of chains) {\r\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\r\n bag.tryAddChild(q);\r\n }\r\n return bag;\r\n }\r\n}\r\n// static methods to assist offset sequences ....\r\nexport class OffsetHelpers {\r\n // recursively sum lengths, allowing CurvePrimitive, CurveCollection, or array of such at any level.\r\n public static sumLengths(data: any): number {\r\n let mySum = 0;\r\n if (data instanceof CurvePrimitive) {\r\n mySum += data.curveLength();\r\n } else if (data instanceof CurveCollection) {\r\n mySum += data.sumLengths();\r\n } else if (Array.isArray(data)) {\r\n for (const data1 of data)\r\n mySum += this.sumLengths(data1);\r\n }\r\n return mySum;\r\n }\r\n // recursively sum lengths, allowing CurvePrimitive, CurveCollection, or array of such at any level.\r\n public static extendRange(range: Range3d, data: any): Range3d {\r\n if (data instanceof GeometryQuery) {\r\n data.extendRange(range);\r\n } else if (Array.isArray(data)) {\r\n for (const data1 of data)\r\n this.extendRange(range, data1);\r\n }\r\n return range;\r\n }\r\n\r\n // construct (separately) the offsets of each entry of data (Path, Loop, BagOfCurve, or Array of those)\r\n // push all offset geometry into the result array\r\n // return summed length\r\n public static appendOffsets(data: AnyCurve | AnyCurve[] | undefined, offset: number, result: GeometryQuery[], skipOffsetOfLoop: boolean): number {\r\n let summedLengths = 0;\r\n if (data instanceof CurvePrimitive) {\r\n const resultA = CurveChainWireOffsetContext.constructCurveXYOffset(Path.create(data), offset);\r\n if (resultA) {\r\n summedLengths += this.sumLengths(resultA);\r\n result.push(resultA);\r\n }\r\n } else if (data instanceof Loop || data instanceof Path) {\r\n if (false && skipOffsetOfLoop && data instanceof Loop) {\r\n // skip !!\r\n } else {\r\n const resultA = CurveChainWireOffsetContext.constructCurveXYOffset(data, offset);\r\n if (resultA) {\r\n summedLengths += this.sumLengths(resultA);\r\n result.push(resultA);\r\n }\r\n }\r\n } else if (data instanceof BagOfCurves) {\r\n for (const q of data.children)\r\n summedLengths += this.appendOffsets(q, offset, result, true);\r\n } else if (Array.isArray(data)) {\r\n for (const q of data)\r\n summedLengths += this.appendOffsets(q, offset, result, true);\r\n }\r\n return summedLengths;\r\n }\r\n\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * Return object with named chains, insideOffsets, outsideOffsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectInsideAndOutsideOffsets(fragments: GeometryQuery[], offsetDistance: number, gapTolerance: number): { insideOffsets: GeometryQuery[], outsideOffsets: GeometryQuery[], chains: ChainTypes } {\r\n const collector = new MultiChainCollector(gapTolerance);\r\n for (const s of fragments) {\r\n collector.captureCurve(s);\r\n }\r\n const myChains = collector.grabResult(true);\r\n const myOffsetA: GeometryQuery[] = [];\r\n const myOffsetB: GeometryQuery[] = [];\r\n const offsetLengthA = OffsetHelpers.appendOffsets(myChains, offsetDistance, myOffsetA, false);\r\n const offsetLengthB = OffsetHelpers.appendOffsets(myChains, -offsetDistance, myOffsetB, true);\r\n if (offsetLengthA > offsetLengthB) {\r\n return { outsideOffsets: myOffsetA, insideOffsets: myOffsetB, chains: myChains };\r\n } else {\r\n return { insideOffsets: myOffsetA, outsideOffsets: myOffsetB, chains: myChains };\r\n }\r\n }\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * Return object with named chains, insideOffsets, outsideOffsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when joining head-to-tail.\r\n */\r\n public static collectChains(fragments: GeometryQuery[], gapTolerance: number, planarTolerance: number = Geometry.smallMetricDistance): ChainTypes {\r\n const collector = new MultiChainCollector(gapTolerance, planarTolerance);\r\n for (const s of fragments) {\r\n collector.captureCurve(s);\r\n }\r\n return collector.grabResult(true);\r\n }\r\n\r\n /** If allowed by the geometry type, move an endpoint.\r\n *\r\n */\r\n public static simpleEndPointMove(g: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\r\n if (g instanceof (LineSegment3d)) {\r\n if (atEnd) {\r\n g.point1Ref.setFrom(to);\r\n } else {\r\n g.point0Ref.setFrom(to);\r\n }\r\n return true;\r\n } else if (g instanceof LineString3d && g.numPoints() > 0) {\r\n const i = atEnd ? g.numPoints() - 1 : 0;\r\n g.packedPoints.setAtCheckedPointIndex(i, to);\r\n return true;\r\n }\r\n return false;\r\n }\r\n // Try to move move head (end) of g0 and tail (beginning) of g1 together.\r\n public static moveHeadOrTail(g0: CurvePrimitive, g1: CurvePrimitive, maxShift: number): boolean {\r\n const xyz0 = g0.endPoint();\r\n const xyz1 = g1.startPoint();\r\n const minShift = Geometry.smallMetricDistance * 0.001;\r\n const d01 = xyz0.distanceXY(xyz1);\r\n if (d01 < minShift)\r\n return true;\r\n if (this.simpleEndPointMove(g1, false, xyz0) || this.simpleEndPointMove(g0, true, xyz1))\r\n return true;\r\n // const detail1On0 = g0.closestPoint(xyz1);\r\n // const detail0On1 = g1.closestPoint(xyz0);\r\n const intersections = CurveCurve.intersectionXYPairs(g0, true, g1, true);\r\n const shiftFactor = 5.0;\r\n for (const pair of intersections) {\r\n const detail0 = pair.detailA;\r\n const detail1 = pair.detailB;\r\n const distance0 = detail0.point.distanceXY(xyz0);\r\n const distance1 = detail1.point.distanceXY(xyz1);\r\n if (distance0 < shiftFactor * maxShift && distance1 < shiftFactor * maxShift) {\r\n if (g0 instanceof Arc3d && g1 instanceof Arc3d) {\r\n const radians0End = g0.sweep.fractionToRadians(detail0.fraction);\r\n g0.sweep.setStartEndRadians(g0.sweep.startRadians, radians0End);\r\n const radians1Start = g1.sweep.fractionToRadians(detail1.fraction);\r\n g1.sweep.setStartEndRadians(radians1Start, g1.sweep.endRadians);\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.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\nimport { Arc3d } from \"../../curve/Arc3d\";\r\nimport { AnyCurve } from \"../../curve/CurveChain\";\r\nimport { BagOfCurves, CurveCollection } from \"../../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../../curve/CurvePrimitive\";\r\nimport { GeometryQuery } from \"../../curve/GeometryQuery\";\r\nimport { LineSegment3d } from \"../../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../../curve/LineString3d\";\r\nimport { Loop } from \"../../curve/Loop\";\r\nimport { Path } from \"../../curve/Path\";\r\nimport { ChainTypes, RegionOps } from \"../../curve/RegionOps\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { CurveCurve } from \"../../curve/CurveCurve\";\r\nimport { CurveChainWireOffsetContext } from \"./PolygonOffsetContext\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\r\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\r\n\r\n/**\r\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\r\n * * The caller makes a sequence of calls to announce individual primitives.\r\n * * This collector (unlike the simpler \"ChainCollector\") expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\r\n * * chainCollector.announceCurvePrimitive (curve, searchAllPaths).\r\n * * When all curves have been announced, the call to grab the paths option restructures the various active chains into Path and Loop objects.\r\n * * Usage pattern is\r\n * * initialization: `context = new ChainCollectorContext (makeClones: boolean)`\r\n * * many times\r\n * * ` context.captureCurve (anyCurve, searchAllPaths)`\r\n * * ` context.captureCurvePrimitive (primitive, searchAllPaths)`\r\n * * end: ` result = context.grabResults (formLoopsIfClosed)`\r\n * @internal\r\n */\r\nexport class MultiChainCollector {\r\n private _chains: CurvePrimitive[][];\r\n\r\n private static _staticPointA: Point3d;\r\n private static _staticPointB: Point3d;\r\n\r\n /** LOOSE tolerance for snap to end */\r\n private _endPointShiftTolerance: number;\r\n /** TIGHT tolerance for snap to end */\r\n private _endPointHitTolerance: number;\r\n /** tolerance for choosing Path or Loop. If undefined, ALWAYS PATH */\r\n private _planarityTolerance: number | undefined;\r\n /** Initialize with an empty array of chains.\r\n * @param endPointShiftTolerance tolerance for calling endpoints identical\r\n * @param planeTolerance tolerance for considering a loop to be planar. If undefined, only create Path. If defined, create Loop curves are if within tolerance of a plane.\r\n */\r\n public constructor(endPointShiftTolerance = Geometry.smallMetricDistance, planeTolerance: number | undefined = Geometry.smallMetricDistance) {\r\n this._chains = [];\r\n this._endPointShiftTolerance = endPointShiftTolerance;\r\n this._endPointHitTolerance = Geometry.smallMetricDistance;\r\n this._planarityTolerance = planeTolerance;\r\n }\r\n\r\n private _xyzWork0?: Point3d;\r\n /**\r\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\r\n * @param xyz\r\n * @param tolerance\r\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\r\n */\r\n private findAnyChainToConnect(xyz: Point3d, tolerance: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\r\n\r\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\r\n if (exceptChainIndex === chainIndexA)\r\n continue;\r\n const chain = this._chains[chainIndexA];\r\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: true };\r\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\r\n if (this._xyzWork1.isAlmostEqual(xyz, tolerance))\r\n return { chainIndex: chainIndexA, atEnd: false };\r\n }\r\n return undefined;\r\n }\r\n\r\n private _xyzWork1?: Point3d;\r\n /**\r\n * Insert a single curve primitive into the active chains.\r\n * * The primitive is captured (not cloned)\r\n * * The primitive may be reversed in place\r\n * @param candidate\r\n */\r\n public captureCurvePrimitive(candidate: CurvePrimitive) {\r\n if (this.attachPrimitiveToAnyChain(candidate, this._endPointHitTolerance)) return;\r\n if (this.attachPrimitiveToAnyChain(candidate, this._endPointShiftTolerance)) return;\r\n this._chains.push([candidate]);\r\n return;\r\n }\r\n\r\n /**\r\n * Insert any curve into the collection.\r\n * * This recurses into Path, Loop, BagOfCurves etc\r\n * * The all primitives are captured, and may be reversed in place.\r\n * @param candidate\r\n */\r\n public captureCurve(candidate: GeometryQuery) {\r\n if (candidate instanceof CurvePrimitive)\r\n this.captureCurvePrimitive(candidate);\r\n else if (candidate instanceof CurveCollection && candidate.children !== undefined) {\r\n for (const c of candidate.children) {\r\n this.captureCurve(c);\r\n }\r\n }\r\n }\r\n\r\n /** Announce a curve primitive\r\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\r\n * * Otherwise start a new chain.\r\n */\r\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, tolerance: number): boolean {\r\n if (candidate) {\r\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) {\r\n if (connect.atEnd) {\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[index0], chain[index0 + 1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[0], chain[1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n } else {\r\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance);\r\n if (connect) { // START of new primitive ..\r\n if (connect.atEnd) {\r\n candidate.reverseInPlace();\r\n const chain = this._chains[connect.chainIndex];\r\n const index0 = chain.length - 1;\r\n this._chains[connect.chainIndex].push(candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[index0], chain[index0 + 1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n } else {\r\n const chain = this._chains[connect.chainIndex];\r\n chain.splice(0, 0, candidate);\r\n OffsetHelpers.moveHeadOrTail(chain[0], chain[1], this._endPointShiftTolerance);\r\n this.searchAndMergeChainIndex(connect.chainIndex, tolerance);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * * Move each primitive from chainB to the end of chainA.\r\n * * clear chainB.\r\n * * move the final chain to chainB index.\r\n * * reduce the _chain.length by 1.\r\n */\r\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\r\n const chainA = this._chains[chainIndexA];\r\n const chainB = this._chains[chainIndexB];\r\n for (const p of chainB) {\r\n chainA.push(p);\r\n }\r\n // chainIndexB is unused.\r\n chainB.length = 0;\r\n const lastChainIndex = this._chains.length - 1;\r\n if (chainIndexB !== lastChainIndex) {\r\n this._chains[chainIndexB] = this._chains[lastChainIndex];\r\n this._chains.pop();\r\n } else {\r\n this._chains.pop();\r\n }\r\n }\r\n private reverseChain(chainIndex: number) {\r\n const chain = this._chains[chainIndex];\r\n chain.reverse();\r\n for (const p of chain)\r\n p.reverseInPlace();\r\n }\r\n // see if the head or tail of chainIndex matches any existing chain. If so, merge\r\n private searchAndMergeChainIndex(chainIndex: number, tolerance: number): void {\r\n // ASSUME valid index of non-empty chain\r\n const chain = this._chains[chainIndex];\r\n const lastIndexInChain = chain.length - 1;\r\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\r\n // this start with any other chain ..\r\n let connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (!connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\r\n return;\r\n }\r\n // try end with any other chain\r\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\r\n connect = this.findAnyChainToConnect(this._xyzWork0, tolerance, chainIndex);\r\n if (connect) {\r\n if (connect.atEnd)\r\n this.reverseChain(connect.chainIndex);\r\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\r\n return;\r\n }\r\n }\r\n /** turn an array of curve primitives into the simplest possible strongly typed curve structure.\r\n * * The input array is assumed to be connected appropriately to act as the curves of a Path.\r\n * * When a path is created the curves array is CAPTURED.\r\n */\r\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\r\n if (curves.length === 0)\r\n return undefined;\r\n if (makeLoopIfClosed) {\r\n const primitive0 = curves[0];\r\n const primitiveN = curves[curves.length - 1];\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n const distanceAToB = MultiChainCollector._staticPointA.distance(MultiChainCollector._staticPointB);\r\n if (distanceAToB < this._endPointShiftTolerance) {\r\n // adjust for closure (and get the corrected coordinates)\r\n OffsetHelpers.moveHeadOrTail(primitiveN, primitive0, this._endPointShiftTolerance);\r\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\r\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\r\n }\r\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB)) {\r\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\r\n if (localToWorld) {\r\n const worldToLocal = localToWorld.inverse();\r\n if (worldToLocal) {\r\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\r\n if (this._planarityTolerance !== undefined && range.zLength() <= this._planarityTolerance) {\r\n return Loop.createArray(curves);\r\n }\r\n }\r\n }\r\n return Path.createArray(curves);\r\n }\r\n }\r\n if (curves.length === 1)\r\n return curves[0];\r\n return Path.createArray(curves);\r\n }\r\n private chainToLineString3d(curves: CurvePrimitive[]): LineString3d | undefined{\r\n if (curves.length === 0)\r\n return undefined;\r\n const linestring = LineString3d.create ();\r\n for (const curve of curves){\r\n curve.emitStrokes (linestring);\r\n linestring.removeDuplicatePoints ();\r\n }\r\n return linestring;\r\n }\r\n\r\n /** Return the collected results, structured as the simplest possible type. */\r\n public grabResult(makeLoopIfClosed: boolean = false): CurvePrimitive | Path | BagOfCurves | Loop | undefined {\r\n const chains = this._chains;\r\n if (chains.length === 0)\r\n return undefined;\r\n if (chains.length === 1)\r\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\r\n const bag = BagOfCurves.create();\r\n for (const chain of chains) {\r\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\r\n bag.tryAddChild(q);\r\n }\r\n return bag;\r\n }\r\n/** Return chains as individual calls to announceChain. */\r\npublic announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void): void {\r\n const chains = this._chains;\r\n if (chains.length === 1){\r\n const ls = this.chainToLineString3d(chains[0]);\r\n if (ls)\r\n announceChain(ls);\r\n } else if (chains.length > 1){\r\n for (const chain of chains) {\r\n const ls = this.chainToLineString3d(chain);\r\n if (ls)\r\n announceChain(ls);\r\n }\r\n }\r\n }\r\n}\r\n// static methods to assist offset sequences ....\r\nexport class OffsetHelpers {\r\n // recursively sum lengths, allowing CurvePrimitive, CurveCollection, or array of such at any level.\r\n public static sumLengths(data: any): number {\r\n let mySum = 0;\r\n if (data instanceof CurvePrimitive) {\r\n mySum += data.curveLength();\r\n } else if (data instanceof CurveCollection) {\r\n mySum += data.sumLengths();\r\n } else if (Array.isArray(data)) {\r\n for (const data1 of data)\r\n mySum += this.sumLengths(data1);\r\n }\r\n return mySum;\r\n }\r\n // recursively sum lengths, allowing CurvePrimitive, CurveCollection, or array of such at any level.\r\n public static extendRange(range: Range3d, data: any): Range3d {\r\n if (data instanceof GeometryQuery) {\r\n data.extendRange(range);\r\n } else if (Array.isArray(data)) {\r\n for (const data1 of data)\r\n this.extendRange(range, data1);\r\n }\r\n return range;\r\n }\r\n\r\n // construct (separately) the offsets of each entry of data (Path, Loop, BagOfCurve, or Array of those)\r\n // push all offset geometry into the result array\r\n // return summed length\r\n public static appendOffsets(data: AnyCurve | AnyCurve[] | undefined, offset: number, result: GeometryQuery[], skipOffsetOfLoop: boolean): number {\r\n let summedLengths = 0;\r\n if (data instanceof CurvePrimitive) {\r\n const resultA = CurveChainWireOffsetContext.constructCurveXYOffset(Path.create(data), offset);\r\n if (resultA) {\r\n summedLengths += this.sumLengths(resultA);\r\n result.push(resultA);\r\n }\r\n } else if (data instanceof Loop || data instanceof Path) {\r\n if (false && skipOffsetOfLoop && data instanceof Loop) {\r\n // skip !!\r\n } else {\r\n const resultA = CurveChainWireOffsetContext.constructCurveXYOffset(data, offset);\r\n if (resultA) {\r\n summedLengths += this.sumLengths(resultA);\r\n result.push(resultA);\r\n }\r\n }\r\n } else if (data instanceof BagOfCurves) {\r\n for (const q of data.children)\r\n summedLengths += this.appendOffsets(q, offset, result, true);\r\n } else if (Array.isArray(data)) {\r\n for (const q of data)\r\n summedLengths += this.appendOffsets(q, offset, result, true);\r\n }\r\n return summedLengths;\r\n }\r\n\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * Return object with named chains, insideOffsets, outsideOffsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param offsetDistance offset distance.\r\n */\r\n public static collectInsideAndOutsideOffsets(fragments: GeometryQuery[], offsetDistance: number, gapTolerance: number): { insideOffsets: GeometryQuery[], outsideOffsets: GeometryQuery[], chains: ChainTypes } {\r\n const collector = new MultiChainCollector(gapTolerance);\r\n for (const s of fragments) {\r\n collector.captureCurve(s);\r\n }\r\n const myChains = collector.grabResult(true);\r\n const myOffsetA: GeometryQuery[] = [];\r\n const myOffsetB: GeometryQuery[] = [];\r\n const offsetLengthA = OffsetHelpers.appendOffsets(myChains, offsetDistance, myOffsetA, false);\r\n const offsetLengthB = OffsetHelpers.appendOffsets(myChains, -offsetDistance, myOffsetB, true);\r\n if (offsetLengthA > offsetLengthB) {\r\n return { outsideOffsets: myOffsetA, insideOffsets: myOffsetB, chains: myChains };\r\n } else {\r\n return { insideOffsets: myOffsetA, outsideOffsets: myOffsetB, chains: myChains };\r\n }\r\n }\r\n /**\r\n * * Restructure curve fragments as chains and offsets\r\n * * BEWARE that if the input is not a loop the classification of outputs is suspect.\r\n * @param fragments fragments to be chained\r\n * @param gapTolerance distance to be treated as \"effectively zero\" when joining head-to-tail.\r\n */\r\n public static collectChains(fragments: GeometryQuery[], gapTolerance: number, planarTolerance: number = Geometry.smallMetricDistance): ChainTypes {\r\n const collector = new MultiChainCollector(gapTolerance, planarTolerance);\r\n for (const s of fragments) {\r\n collector.captureCurve(s);\r\n }\r\n return collector.grabResult(true);\r\n }\r\n\r\n /** If allowed by the geometry type, move an endpoint.\r\n *\r\n */\r\n public static simpleEndPointMove(g: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\r\n if (g instanceof (LineSegment3d)) {\r\n if (atEnd) {\r\n g.point1Ref.setFrom(to);\r\n } else {\r\n g.point0Ref.setFrom(to);\r\n }\r\n return true;\r\n } else if (g instanceof LineString3d && g.numPoints() > 0) {\r\n const i = atEnd ? g.numPoints() - 1 : 0;\r\n g.packedPoints.setAtCheckedPointIndex(i, to);\r\n return true;\r\n }\r\n return false;\r\n }\r\n // Try to move move head (end) of g0 and tail (beginning) of g1 together.\r\n public static moveHeadOrTail(g0: CurvePrimitive, g1: CurvePrimitive, maxShift: number): boolean {\r\n const xyz0 = g0.endPoint();\r\n const xyz1 = g1.startPoint();\r\n const minShift = Geometry.smallMetricDistance * 0.001;\r\n const d01 = xyz0.distanceXY(xyz1);\r\n if (d01 < minShift)\r\n return true;\r\n if (this.simpleEndPointMove(g1, false, xyz0) || this.simpleEndPointMove(g0, true, xyz1))\r\n return true;\r\n // const detail1On0 = g0.closestPoint(xyz1);\r\n // const detail0On1 = g1.closestPoint(xyz0);\r\n const intersections = CurveCurve.intersectionXYPairs(g0, true, g1, true);\r\n const shiftFactor = 5.0;\r\n for (const pair of intersections) {\r\n const detail0 = pair.detailA;\r\n const detail1 = pair.detailB;\r\n const distance0 = detail0.point.distanceXY(xyz0);\r\n const distance1 = detail1.point.distanceXY(xyz1);\r\n if (distance0 < shiftFactor * maxShift && distance1 < shiftFactor * maxShift) {\r\n if (g0 instanceof Arc3d && g1 instanceof Arc3d) {\r\n const radians0End = g0.sweep.fractionToRadians(detail0.fraction);\r\n g0.sweep.setStartEndRadians(g0.sweep.startRadians, radians0End);\r\n const radians1Start = g1.sweep.fractionToRadians(detail1.fraction);\r\n g1.sweep.setStartEndRadians(radians1Start, g1.sweep.endRadians);\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
@@ -82,7 +82,7 @@ export declare class AngleSweep implements BeJSONFunctions {
82
82
  /** Reverse the start and end angle in place. */
83
83
  reverseInPlace(): void;
84
84
  /** return a sweep for the "other" part of the circe.
85
- * @param reverse true to retain the start and move backwards, false to more forwards.
85
+ * @param reverseDirection true to retain the start and move backwards, false to more forwards.
86
86
  */
87
87
  cloneComplement(reverseDirection?: boolean, result?: AngleSweep): AngleSweep;
88
88
  /** Restrict start and end angles into the range (-90,+90) in degrees. */
@@ -124,7 +124,7 @@ class AngleSweep {
124
124
  /** Reverse the start and end angle in place. */
125
125
  reverseInPlace() { const a = this._radians0; this._radians0 = this._radians1; this._radians1 = a; }
126
126
  /** return a sweep for the "other" part of the circe.
127
- * @param reverse true to retain the start and move backwards, false to more forwards.
127
+ * @param reverseDirection true to retain the start and move backwards, false to more forwards.
128
128
  */
129
129
  cloneComplement(reverseDirection = false, result) {
130
130
  const s = this.sweepRadians >= 0 ? 2.0 : -2.0;
@@ -1 +1 @@
1
- {"version":3,"file":"AngleSweep.js","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.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 CartesianGeometry\r\n */\r\n\r\nimport { AngleSweepProps, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { GrowableFloat64Array } from \"./GrowableFloat64Array\";\r\n\r\n/**\r\n * An `AngleSweep` is a pair of angles at start and end of an interval.\r\n *\r\n * * For stroking purposes, the \"included interval\" is all angles numerically reached by theta = start + f*(end-start), where f is between 0 and 1.\r\n * * This stroking formula is simple numbers -- 2PI shifts are not involved.\r\n * * 2PI shifts do become important in the reverse mapping of an angle to a fraction.\r\n * * If (start < end) the angle proceeds CCW around the unit circle.\r\n * * If (end < start) the angle proceeds CW around the unit circle.\r\n * * Angles beyond 360 are fine as endpoints.\r\n * * (350,370) covers the same unit angles as (-10,10).\r\n * * (370,350) covers the same unit angles as (10,-10).\r\n * @public\r\n */\r\nexport class AngleSweep implements BeJSONFunctions {\r\n private _radians0: number;\r\n private _radians1: number;\r\n /** Read-property for degrees at the start of this AngleSweep. */\r\n public get startDegrees() { return Angle.radiansToDegrees(this._radians0); }\r\n /** Read-property for degrees at the end of this AngleSweep. */\r\n public get endDegrees() { return Angle.radiansToDegrees(this._radians1); }\r\n /** Read-property for signed start-to-end sweep in degrees. */\r\n public get sweepDegrees() { return Angle.radiansToDegrees(this._radians1 - this._radians0); }\r\n /** Read-property for degrees at the start of this AngleSweep. */\r\n public get startRadians() { return this._radians0; }\r\n /** Read-property for degrees at the end of this AngleSweep. */\r\n public get endRadians() { return this._radians1; }\r\n /** Read-property for signed start-to-end sweep in radians. */\r\n public get sweepRadians() { return this._radians1 - this._radians0; }\r\n /** Return the (strongly typed) start angle */\r\n public get startAngle() { return Angle.createRadians(this._radians0); }\r\n /** Return the (strongly typed) end angle */\r\n public get endAngle() { return Angle.createRadians(this._radians1); }\r\n /** Create a sweep as one of\r\n * * A clone of a given sweep\r\n * * 0 to given angle\r\n * * full circle if no arg given (sweep 0 to 360 degrees)\r\n */\r\n public static create(data?: AngleSweep | Angle): AngleSweep {\r\n if (data instanceof AngleSweep)\r\n return data.clone();\r\n if (data instanceof Angle)\r\n return new AngleSweep(0, data.radians);\r\n return AngleSweep.create360();\r\n }\r\n /** (private) constructor with start and end angles in radians.\r\n * * Use explicitly named static methods to clarify intent and units of inputs:\r\n *\r\n * * createStartEndRadians (startRadians:number, endRadians:number)\r\n * * createStartEndDegrees (startDegrees:number, endDegrees:number)\r\n * * createStartEnd (startAngle:Angle, endAngle:Angle)\r\n * * createStartSweepRadians (startRadians:number, sweepRadians:number)\r\n * * createStartSweepDegrees (startDegrees:number, sweepDegrees:number)\r\n * * createStartSweep (startAngle:Angle, sweepAngle:Angle)\r\n */\r\n private constructor(startRadians: number = 0, endRadians: number = 0) { this._radians0 = startRadians; this._radians1 = endRadians; }\r\n /** create an AngleSweep from start and end angles given in radians. */\r\n public static createStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startRadians, endRadians);\r\n return result;\r\n }\r\n /** Return the angle obtained by subtracting radians from this angle. */\r\n public cloneMinusRadians(radians: number): AngleSweep { return new AngleSweep(this._radians0 - radians, this._radians1 - radians); }\r\n /** create an AngleSweep from start and end angles given in degrees. */\r\n public static createStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees), result);\r\n }\r\n /** create an angle sweep from strongly typed start and end angles */\r\n public static createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startAngle.radians, endAngle.radians);\r\n return result;\r\n }\r\n /** Create an angle sweep with limits given as (strongly typed) angles for start and sweep */\r\n public static createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartSweepRadians(startAngle.radians, sweepAngle.radians, result);\r\n }\r\n /** Return a sweep with limits interpolated between this and other. */\r\n public interpolate(fraction: number, other: AngleSweep): AngleSweep {\r\n return new AngleSweep(Geometry.interpolate(this._radians0, fraction, other._radians0), Geometry.interpolate(this._radians1, fraction, other._radians1));\r\n }\r\n /** create an AngleSweep from start and end angles given in radians. */\r\n public static createStartSweepRadians(startRadians: number = 0, sweepRadians: number = Math.PI, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startRadians, startRadians + sweepRadians);\r\n return result;\r\n }\r\n /** create an AngleSweep from start and sweep given in degrees. */\r\n public static createStartSweepDegrees(startDegrees: number = 0, sweepDegrees: number = 360, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(startDegrees + sweepDegrees), result);\r\n }\r\n /** directly set the start and end angles in radians */\r\n public setStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI) {\r\n const delta = endRadians - startRadians;\r\n if (Angle.isFullCircleRadians(delta)) {\r\n endRadians = startRadians + (delta > 0 ? 2.0 : -2.0) * Math.PI;\r\n }\r\n this._radians0 = startRadians;\r\n this._radians1 = endRadians;\r\n }\r\n /** directly set the start and end angles in degrees */\r\n public setStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360.0) {\r\n this.setStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees));\r\n }\r\n /** copy from other AngleSweep. */\r\n public setFrom(other: AngleSweep) { this._radians0 = other._radians0; this._radians1 = other._radians1; }\r\n /** create a full circle sweep (CCW). startRadians defaults to 0 */\r\n public static create360(startRadians?: number): AngleSweep {\r\n startRadians = startRadians ? startRadians : 0.0;\r\n return new AngleSweep(startRadians, startRadians + 2.0 * Math.PI);\r\n }\r\n /** create a sweep from the south pole to the north pole. */\r\n public static createFullLatitude() { return AngleSweep.createStartEndRadians(-0.5 * Math.PI, 0.5 * Math.PI); }\r\n /** Reverse the start and end angle in place. */\r\n public reverseInPlace() { const a = this._radians0; this._radians0 = this._radians1; this._radians1 = a; }\r\n /** return a sweep for the \"other\" part of the circe.\r\n * @param reverse true to retain the start and move backwards, false to more forwards.\r\n */\r\n public cloneComplement(reverseDirection: boolean = false, result?: AngleSweep): AngleSweep {\r\n const s = this.sweepRadians >= 0 ? 2.0 : -2.0;\r\n if (reverseDirection)\r\n return AngleSweep.createStartEndRadians(this.startRadians, this.endRadians - s * Math.PI, result);\r\n else\r\n return AngleSweep.createStartEndRadians(this.endRadians, this.startRadians + s * Math.PI, result);\r\n }\r\n /** Restrict start and end angles into the range (-90,+90) in degrees. */\r\n public capLatitudeInPlace() {\r\n const limit = 0.5 * Math.PI;\r\n this._radians0 = Geometry.clampToStartEnd(this._radians0, -limit, limit);\r\n this._radians1 = Geometry.clampToStartEnd(this._radians1, -limit, limit);\r\n }\r\n /** Ask if the sweep is counterclockwise, i.e. positive sweep */\r\n public get isCCW(): boolean { return this._radians1 >= this._radians0; }\r\n /** Ask if the sweep is a full circle. */\r\n public get isFullCircle(): boolean { return Angle.isFullCircleRadians(this.sweepRadians); }\r\n /** Ask if the sweep is a full sweep from south pole to north pole. */\r\n public get isFullLatitudeSweep(): boolean {\r\n const a = Math.PI * 0.5;\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, -a)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1, a);\r\n }\r\n /** return a clone of this sweep. */\r\n public clone(): AngleSweep { return new AngleSweep(this._radians0, this._radians1); }\r\n /** Convert fractional position in the sweep to radians. */\r\n public fractionToRadians(fraction: number) {\r\n return fraction < 0.5 ?\r\n this._radians0 + fraction * (this._radians1 - this._radians0)\r\n : this._radians1 + (fraction - 1.0) * (this._radians1 - this._radians0);\r\n }\r\n /** Convert fractional position in the sweep to strongly typed Angle object. */\r\n public fractionToAngle(fraction: number) {\r\n return Angle.createRadians(this.fractionToRadians(fraction));\r\n }\r\n /** return 2PI divided by the sweep radians (i.e. 360 degrees divided by sweep angle).\r\n * This is the number of fractional intervals required to cover a whole circle.\r\n */\r\n public fractionPeriod(): number {\r\n return Geometry.safeDivideFraction(Math.PI * 2.0, Math.abs(this._radians1 - this._radians0), 1.0);\r\n }\r\n /** return the fractionalized position of the angle,\r\n * computed without consideration of 2PI period.\r\n * That is, an angle that is numerically much beyond than the end angle\r\n * will produce a large fraction and an angle much beyond the start angle\r\n * will produce a large negative fraction.\r\n *\r\n */\r\n public angleToUnboundedFraction(theta: Angle): number {\r\n return Geometry.safeDivideFraction(theta.radians - this._radians0, this._radians1 - this._radians0, 1.0);\r\n }\r\n /** map an angle to a fractional coordinate which is:\r\n *\r\n * * the start angle is at fraction 0\r\n * * the end angle is at fraction 1\r\n * * interior angles are between 0 and 1\r\n * * all exterior angles are at fractions greater than 1\r\n * * the periodic jump is at full wraparound to the start angle\r\n */\r\n public angleToPositivePeriodicFraction(theta: Angle): number { return this.radiansToPositivePeriodicFraction(theta.radians); }\r\n /**\r\n * Convert each value in an array from radians to fraction.\r\n * @param data array that is input as radians, output as fractions\r\n */\r\n public radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array) {\r\n const n = data.length;\r\n for (let i = 0; i < n; i++) {\r\n data.reassign(i, this.radiansToPositivePeriodicFraction(data.atUncheckedIndex(i)));\r\n }\r\n }\r\n /**\r\n * Convert a radians value to a fraction that is always positive and can wrap. See `angleToPositivePeriodicFraction` for detailed description.\r\n * @param radians\r\n */\r\n public radiansToPositivePeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\r\n return AngleSweep.radiansToPositivePeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\r\n }\r\n /**\r\n * Convert a radians value to a fraction that is always positive and can wrap. See `angleToPositivePeriodicFraction` for detailed description.\r\n * @param radians\r\n */\r\n public static radiansToPositivePeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0))\r\n return 0.0;\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians1))\r\n return 1.0;\r\n const sweep = radians1 - radians0;\r\n const delta = radians - radians0;\r\n if (sweep > 0) {\r\n const delta1 = Angle.adjustRadians0To2Pi(delta);\r\n const fraction1 = Geometry.safeDivideFraction(delta1, sweep, zeroSweepDefault);\r\n return fraction1;\r\n }\r\n const delta2 = Angle.adjustRadians0To2Pi(-delta);\r\n const fraction2 = Geometry.safeDivideFraction(delta2, -sweep, zeroSweepDefault);\r\n return fraction2;\r\n }\r\n /** map an angle to a fractional coordinate which is:\r\n *\r\n * * the start angle is at fraction 0\r\n * * the end angle is at fraction 1\r\n * * interior angles are between 0 and 1\r\n * * small negative for angles just \"before\" the start angle\r\n * * more than one for angles just \"after\" the end angle\r\n * * the periodic jump is at the middle of the \"outside\" interval\r\n */\r\n public angleToSignedPeriodicFraction(theta: Angle): number {\r\n return this.radiansToSignedPeriodicFraction(theta.radians);\r\n }\r\n /**\r\n * Convert a radians value to a fraction, allowing wraparound. See `angleToSignedPeriodicFraction` for detailed description.\r\n */\r\n public radiansToSignedPeriodicFraction(radians: number): number {\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._radians0))\r\n return 0.0;\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._radians1))\r\n return 1.0;\r\n const sweep = this._radians1 - this._radians0;\r\n // measure from middle of interval ...\r\n const delta = radians - this._radians0 - 0.5 * sweep;\r\n if (sweep > 0) {\r\n const delta1 = Angle.adjustRadiansMinusPiPlusPi(delta);\r\n const fraction1 = 0.5 + Geometry.safeDivideFraction(delta1, sweep, 0.0);\r\n return fraction1;\r\n }\r\n const delta2 = Angle.adjustRadiansMinusPiPlusPi(-delta);\r\n const fraction = 0.5 + Geometry.safeDivideFraction(delta2, -sweep, 0.0);\r\n return fraction;\r\n }\r\n /** test if an angle is within the sweep */\r\n public isAngleInSweep(angle: Angle): boolean { return this.isRadiansInSweep(angle.radians); }\r\n /** test if radians are within sweep */\r\n public isRadiansInSweep(radians: number, allowPeriodShift: boolean = true): boolean {\r\n return AngleSweep.isRadiansInStartEnd(radians, this.startRadians, this.endRadians, allowPeriodShift);\r\n }\r\n /** test if radians are within sweep */\r\n public static isRadiansInStartEnd(radians: number, radians0: number, radians1: number, allowPeriodShift: boolean = true): boolean {\r\n // quick out for simple inside ...\r\n const delta0 = radians - radians0;\r\n const delta1 = radians - radians1;\r\n if (delta0 * delta1 <= 0.0)\r\n return true;\r\n\r\n if (radians0 === radians1)\r\n return allowPeriodShift ? Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0) : Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0);\r\n return allowPeriodShift ? this.radiansToPositivePeriodicFractionStartEnd(radians, radians0, radians1, 1000.0) <= 1.0 : false;\r\n }\r\n\r\n /** set this AngleSweep from various sources:\r\n *\r\n * * if json is undefined, a full-circle sweep is returned.\r\n * * If json is an AngleSweep object it is cloned\r\n * * If json is an array of 2 numbers, those numbers are start and end angles in degrees.\r\n * * If `json.degrees` is an array of 2 numbers, those numbers are start and end angles in degrees.\r\n * * If `json.radians` is an array of 2 numbers, those numbers are start and end angles in radians.\r\n */\r\n public setFromJSON(json?: any) {\r\n if (!json)\r\n this.setStartEndRadians(); // default full circle\r\n else if (json instanceof AngleSweep)\r\n this.setFrom(json);\r\n else if (Geometry.isNumberArray(json.degrees, 2))\r\n this.setStartEndDegrees(json.degrees[0], json.degrees[1]);\r\n else if (Geometry.isNumberArray(json.radians, 2))\r\n this.setStartEndRadians(json.radians[0], json.radians[1]);\r\n else if (Geometry.isNumberArray(json, 2))\r\n this.setStartEndDegrees(json[0], json[1]);\r\n }\r\n /** create an AngleSweep from a json object. */\r\n public static fromJSON(json?: AngleSweepProps) {\r\n const result = AngleSweep.create360();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /**\r\n * Convert an AngleSweep to a JSON object.\r\n * @return {*} {degrees: [startAngleInDegrees, endAngleInDegrees}\r\n */\r\n public toJSON(): any {\r\n // return { degrees: [this.startDegrees, this.endDegrees] };\r\n return [this.startDegrees, this.endDegrees];\r\n }\r\n /** test if start and end angles match, with explicit name to clarify that there is no test for 360-degree shifts. */\r\n public isAlmostEqualAllowPeriodShift(other: AngleSweep): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians0, other._radians0)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1 - this._radians0, other._radians1 - other._radians0);\r\n }\r\n /** test if start and end angles match, explicit name to clarify that 360-degree shifts are allowed. */\r\n public isAlmostEqualNoPeriodShift(other: AngleSweep): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, other._radians0)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1 - this._radians0, other._radians1 - other._radians0);\r\n }\r\n /** test if start and end angles match with radians tolerance.\r\n * * This is equivalent to isAlmostEqualNoPeriodShift.\r\n * * it is present for consistency with other classes\r\n * * It is recommended that all callers use one of he longer names to be clear of their intentions:\r\n * * * isAlmostEqualAllowPeriodShift\r\n * * * isAlmostEqualRadiansNoPeriodShift\r\n */\r\n public isAlmostEqual(other: AngleSweep): boolean { return this.isAlmostEqualNoPeriodShift(other); }\r\n}\r\n"]}
1
+ {"version":3,"file":"AngleSweep.js","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.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 CartesianGeometry\r\n */\r\n\r\nimport { AngleSweepProps, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { GrowableFloat64Array } from \"./GrowableFloat64Array\";\r\n\r\n/**\r\n * An `AngleSweep` is a pair of angles at start and end of an interval.\r\n *\r\n * * For stroking purposes, the \"included interval\" is all angles numerically reached by theta = start + f*(end-start), where f is between 0 and 1.\r\n * * This stroking formula is simple numbers -- 2PI shifts are not involved.\r\n * * 2PI shifts do become important in the reverse mapping of an angle to a fraction.\r\n * * If (start < end) the angle proceeds CCW around the unit circle.\r\n * * If (end < start) the angle proceeds CW around the unit circle.\r\n * * Angles beyond 360 are fine as endpoints.\r\n * * (350,370) covers the same unit angles as (-10,10).\r\n * * (370,350) covers the same unit angles as (10,-10).\r\n * @public\r\n */\r\nexport class AngleSweep implements BeJSONFunctions {\r\n private _radians0: number;\r\n private _radians1: number;\r\n /** Read-property for degrees at the start of this AngleSweep. */\r\n public get startDegrees() { return Angle.radiansToDegrees(this._radians0); }\r\n /** Read-property for degrees at the end of this AngleSweep. */\r\n public get endDegrees() { return Angle.radiansToDegrees(this._radians1); }\r\n /** Read-property for signed start-to-end sweep in degrees. */\r\n public get sweepDegrees() { return Angle.radiansToDegrees(this._radians1 - this._radians0); }\r\n /** Read-property for degrees at the start of this AngleSweep. */\r\n public get startRadians() { return this._radians0; }\r\n /** Read-property for degrees at the end of this AngleSweep. */\r\n public get endRadians() { return this._radians1; }\r\n /** Read-property for signed start-to-end sweep in radians. */\r\n public get sweepRadians() { return this._radians1 - this._radians0; }\r\n /** Return the (strongly typed) start angle */\r\n public get startAngle() { return Angle.createRadians(this._radians0); }\r\n /** Return the (strongly typed) end angle */\r\n public get endAngle() { return Angle.createRadians(this._radians1); }\r\n /** Create a sweep as one of\r\n * * A clone of a given sweep\r\n * * 0 to given angle\r\n * * full circle if no arg given (sweep 0 to 360 degrees)\r\n */\r\n public static create(data?: AngleSweep | Angle): AngleSweep {\r\n if (data instanceof AngleSweep)\r\n return data.clone();\r\n if (data instanceof Angle)\r\n return new AngleSweep(0, data.radians);\r\n return AngleSweep.create360();\r\n }\r\n /** (private) constructor with start and end angles in radians.\r\n * * Use explicitly named static methods to clarify intent and units of inputs:\r\n *\r\n * * createStartEndRadians (startRadians:number, endRadians:number)\r\n * * createStartEndDegrees (startDegrees:number, endDegrees:number)\r\n * * createStartEnd (startAngle:Angle, endAngle:Angle)\r\n * * createStartSweepRadians (startRadians:number, sweepRadians:number)\r\n * * createStartSweepDegrees (startDegrees:number, sweepDegrees:number)\r\n * * createStartSweep (startAngle:Angle, sweepAngle:Angle)\r\n */\r\n private constructor(startRadians: number = 0, endRadians: number = 0) { this._radians0 = startRadians; this._radians1 = endRadians; }\r\n /** create an AngleSweep from start and end angles given in radians. */\r\n public static createStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startRadians, endRadians);\r\n return result;\r\n }\r\n /** Return the angle obtained by subtracting radians from this angle. */\r\n public cloneMinusRadians(radians: number): AngleSweep { return new AngleSweep(this._radians0 - radians, this._radians1 - radians); }\r\n /** create an AngleSweep from start and end angles given in degrees. */\r\n public static createStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees), result);\r\n }\r\n /** create an angle sweep from strongly typed start and end angles */\r\n public static createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startAngle.radians, endAngle.radians);\r\n return result;\r\n }\r\n /** Create an angle sweep with limits given as (strongly typed) angles for start and sweep */\r\n public static createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartSweepRadians(startAngle.radians, sweepAngle.radians, result);\r\n }\r\n /** Return a sweep with limits interpolated between this and other. */\r\n public interpolate(fraction: number, other: AngleSweep): AngleSweep {\r\n return new AngleSweep(Geometry.interpolate(this._radians0, fraction, other._radians0), Geometry.interpolate(this._radians1, fraction, other._radians1));\r\n }\r\n /** create an AngleSweep from start and end angles given in radians. */\r\n public static createStartSweepRadians(startRadians: number = 0, sweepRadians: number = Math.PI, result?: AngleSweep): AngleSweep {\r\n result = result ? result : new AngleSweep();\r\n result.setStartEndRadians(startRadians, startRadians + sweepRadians);\r\n return result;\r\n }\r\n /** create an AngleSweep from start and sweep given in degrees. */\r\n public static createStartSweepDegrees(startDegrees: number = 0, sweepDegrees: number = 360, result?: AngleSweep): AngleSweep {\r\n return AngleSweep.createStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(startDegrees + sweepDegrees), result);\r\n }\r\n /** directly set the start and end angles in radians */\r\n public setStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI) {\r\n const delta = endRadians - startRadians;\r\n if (Angle.isFullCircleRadians(delta)) {\r\n endRadians = startRadians + (delta > 0 ? 2.0 : -2.0) * Math.PI;\r\n }\r\n this._radians0 = startRadians;\r\n this._radians1 = endRadians;\r\n }\r\n /** directly set the start and end angles in degrees */\r\n public setStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360.0) {\r\n this.setStartEndRadians(Angle.degreesToRadians(startDegrees), Angle.degreesToRadians(endDegrees));\r\n }\r\n /** copy from other AngleSweep. */\r\n public setFrom(other: AngleSweep) { this._radians0 = other._radians0; this._radians1 = other._radians1; }\r\n /** create a full circle sweep (CCW). startRadians defaults to 0 */\r\n public static create360(startRadians?: number): AngleSweep {\r\n startRadians = startRadians ? startRadians : 0.0;\r\n return new AngleSweep(startRadians, startRadians + 2.0 * Math.PI);\r\n }\r\n /** create a sweep from the south pole to the north pole. */\r\n public static createFullLatitude() { return AngleSweep.createStartEndRadians(-0.5 * Math.PI, 0.5 * Math.PI); }\r\n /** Reverse the start and end angle in place. */\r\n public reverseInPlace() { const a = this._radians0; this._radians0 = this._radians1; this._radians1 = a; }\r\n /** return a sweep for the \"other\" part of the circe.\r\n * @param reverseDirection true to retain the start and move backwards, false to more forwards.\r\n */\r\n public cloneComplement(reverseDirection: boolean = false, result?: AngleSweep): AngleSweep {\r\n const s = this.sweepRadians >= 0 ? 2.0 : -2.0;\r\n if (reverseDirection)\r\n return AngleSweep.createStartEndRadians(this.startRadians, this.endRadians - s * Math.PI, result);\r\n else\r\n return AngleSweep.createStartEndRadians(this.endRadians, this.startRadians + s * Math.PI, result);\r\n }\r\n /** Restrict start and end angles into the range (-90,+90) in degrees. */\r\n public capLatitudeInPlace() {\r\n const limit = 0.5 * Math.PI;\r\n this._radians0 = Geometry.clampToStartEnd(this._radians0, -limit, limit);\r\n this._radians1 = Geometry.clampToStartEnd(this._radians1, -limit, limit);\r\n }\r\n /** Ask if the sweep is counterclockwise, i.e. positive sweep */\r\n public get isCCW(): boolean { return this._radians1 >= this._radians0; }\r\n /** Ask if the sweep is a full circle. */\r\n public get isFullCircle(): boolean { return Angle.isFullCircleRadians(this.sweepRadians); }\r\n /** Ask if the sweep is a full sweep from south pole to north pole. */\r\n public get isFullLatitudeSweep(): boolean {\r\n const a = Math.PI * 0.5;\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, -a)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1, a);\r\n }\r\n /** return a clone of this sweep. */\r\n public clone(): AngleSweep { return new AngleSweep(this._radians0, this._radians1); }\r\n /** Convert fractional position in the sweep to radians. */\r\n public fractionToRadians(fraction: number) {\r\n return fraction < 0.5 ?\r\n this._radians0 + fraction * (this._radians1 - this._radians0)\r\n : this._radians1 + (fraction - 1.0) * (this._radians1 - this._radians0);\r\n }\r\n /** Convert fractional position in the sweep to strongly typed Angle object. */\r\n public fractionToAngle(fraction: number) {\r\n return Angle.createRadians(this.fractionToRadians(fraction));\r\n }\r\n /** return 2PI divided by the sweep radians (i.e. 360 degrees divided by sweep angle).\r\n * This is the number of fractional intervals required to cover a whole circle.\r\n */\r\n public fractionPeriod(): number {\r\n return Geometry.safeDivideFraction(Math.PI * 2.0, Math.abs(this._radians1 - this._radians0), 1.0);\r\n }\r\n /** return the fractionalized position of the angle,\r\n * computed without consideration of 2PI period.\r\n * That is, an angle that is numerically much beyond than the end angle\r\n * will produce a large fraction and an angle much beyond the start angle\r\n * will produce a large negative fraction.\r\n *\r\n */\r\n public angleToUnboundedFraction(theta: Angle): number {\r\n return Geometry.safeDivideFraction(theta.radians - this._radians0, this._radians1 - this._radians0, 1.0);\r\n }\r\n /** map an angle to a fractional coordinate which is:\r\n *\r\n * * the start angle is at fraction 0\r\n * * the end angle is at fraction 1\r\n * * interior angles are between 0 and 1\r\n * * all exterior angles are at fractions greater than 1\r\n * * the periodic jump is at full wraparound to the start angle\r\n */\r\n public angleToPositivePeriodicFraction(theta: Angle): number { return this.radiansToPositivePeriodicFraction(theta.radians); }\r\n /**\r\n * Convert each value in an array from radians to fraction.\r\n * @param data array that is input as radians, output as fractions\r\n */\r\n public radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array) {\r\n const n = data.length;\r\n for (let i = 0; i < n; i++) {\r\n data.reassign(i, this.radiansToPositivePeriodicFraction(data.atUncheckedIndex(i)));\r\n }\r\n }\r\n /**\r\n * Convert a radians value to a fraction that is always positive and can wrap. See `angleToPositivePeriodicFraction` for detailed description.\r\n * @param radians\r\n */\r\n public radiansToPositivePeriodicFraction(radians: number, zeroSweepDefault: number = 0.0): number {\r\n return AngleSweep.radiansToPositivePeriodicFractionStartEnd(radians, this._radians0, this._radians1, zeroSweepDefault);\r\n }\r\n /**\r\n * Convert a radians value to a fraction that is always positive and can wrap. See `angleToPositivePeriodicFraction` for detailed description.\r\n * @param radians\r\n */\r\n public static radiansToPositivePeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault: number = 0.0): number {\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0))\r\n return 0.0;\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians1))\r\n return 1.0;\r\n const sweep = radians1 - radians0;\r\n const delta = radians - radians0;\r\n if (sweep > 0) {\r\n const delta1 = Angle.adjustRadians0To2Pi(delta);\r\n const fraction1 = Geometry.safeDivideFraction(delta1, sweep, zeroSweepDefault);\r\n return fraction1;\r\n }\r\n const delta2 = Angle.adjustRadians0To2Pi(-delta);\r\n const fraction2 = Geometry.safeDivideFraction(delta2, -sweep, zeroSweepDefault);\r\n return fraction2;\r\n }\r\n /** map an angle to a fractional coordinate which is:\r\n *\r\n * * the start angle is at fraction 0\r\n * * the end angle is at fraction 1\r\n * * interior angles are between 0 and 1\r\n * * small negative for angles just \"before\" the start angle\r\n * * more than one for angles just \"after\" the end angle\r\n * * the periodic jump is at the middle of the \"outside\" interval\r\n */\r\n public angleToSignedPeriodicFraction(theta: Angle): number {\r\n return this.radiansToSignedPeriodicFraction(theta.radians);\r\n }\r\n /**\r\n * Convert a radians value to a fraction, allowing wraparound. See `angleToSignedPeriodicFraction` for detailed description.\r\n */\r\n public radiansToSignedPeriodicFraction(radians: number): number {\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._radians0))\r\n return 0.0;\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._radians1))\r\n return 1.0;\r\n const sweep = this._radians1 - this._radians0;\r\n // measure from middle of interval ...\r\n const delta = radians - this._radians0 - 0.5 * sweep;\r\n if (sweep > 0) {\r\n const delta1 = Angle.adjustRadiansMinusPiPlusPi(delta);\r\n const fraction1 = 0.5 + Geometry.safeDivideFraction(delta1, sweep, 0.0);\r\n return fraction1;\r\n }\r\n const delta2 = Angle.adjustRadiansMinusPiPlusPi(-delta);\r\n const fraction = 0.5 + Geometry.safeDivideFraction(delta2, -sweep, 0.0);\r\n return fraction;\r\n }\r\n /** test if an angle is within the sweep */\r\n public isAngleInSweep(angle: Angle): boolean { return this.isRadiansInSweep(angle.radians); }\r\n /** test if radians are within sweep */\r\n public isRadiansInSweep(radians: number, allowPeriodShift: boolean = true): boolean {\r\n return AngleSweep.isRadiansInStartEnd(radians, this.startRadians, this.endRadians, allowPeriodShift);\r\n }\r\n /** test if radians are within sweep */\r\n public static isRadiansInStartEnd(radians: number, radians0: number, radians1: number, allowPeriodShift: boolean = true): boolean {\r\n // quick out for simple inside ...\r\n const delta0 = radians - radians0;\r\n const delta1 = radians - radians1;\r\n if (delta0 * delta1 <= 0.0)\r\n return true;\r\n\r\n if (radians0 === radians1)\r\n return allowPeriodShift ? Angle.isAlmostEqualRadiansAllowPeriodShift(radians, radians0) : Angle.isAlmostEqualRadiansNoPeriodShift(radians, radians0);\r\n return allowPeriodShift ? this.radiansToPositivePeriodicFractionStartEnd(radians, radians0, radians1, 1000.0) <= 1.0 : false;\r\n }\r\n\r\n /** set this AngleSweep from various sources:\r\n *\r\n * * if json is undefined, a full-circle sweep is returned.\r\n * * If json is an AngleSweep object it is cloned\r\n * * If json is an array of 2 numbers, those numbers are start and end angles in degrees.\r\n * * If `json.degrees` is an array of 2 numbers, those numbers are start and end angles in degrees.\r\n * * If `json.radians` is an array of 2 numbers, those numbers are start and end angles in radians.\r\n */\r\n public setFromJSON(json?: any) {\r\n if (!json)\r\n this.setStartEndRadians(); // default full circle\r\n else if (json instanceof AngleSweep)\r\n this.setFrom(json);\r\n else if (Geometry.isNumberArray(json.degrees, 2))\r\n this.setStartEndDegrees(json.degrees[0], json.degrees[1]);\r\n else if (Geometry.isNumberArray(json.radians, 2))\r\n this.setStartEndRadians(json.radians[0], json.radians[1]);\r\n else if (Geometry.isNumberArray(json, 2))\r\n this.setStartEndDegrees(json[0], json[1]);\r\n }\r\n /** create an AngleSweep from a json object. */\r\n public static fromJSON(json?: AngleSweepProps) {\r\n const result = AngleSweep.create360();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /**\r\n * Convert an AngleSweep to a JSON object.\r\n * @return {*} {degrees: [startAngleInDegrees, endAngleInDegrees}\r\n */\r\n public toJSON(): any {\r\n // return { degrees: [this.startDegrees, this.endDegrees] };\r\n return [this.startDegrees, this.endDegrees];\r\n }\r\n /** test if start and end angles match, with explicit name to clarify that there is no test for 360-degree shifts. */\r\n public isAlmostEqualAllowPeriodShift(other: AngleSweep): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians0, other._radians0)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1 - this._radians0, other._radians1 - other._radians0);\r\n }\r\n /** test if start and end angles match, explicit name to clarify that 360-degree shifts are allowed. */\r\n public isAlmostEqualNoPeriodShift(other: AngleSweep): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians0, other._radians0)\r\n && Angle.isAlmostEqualRadiansNoPeriodShift(this._radians1 - this._radians0, other._radians1 - other._radians0);\r\n }\r\n /** test if start and end angles match with radians tolerance.\r\n * * This is equivalent to isAlmostEqualNoPeriodShift.\r\n * * it is present for consistency with other classes\r\n * * It is recommended that all callers use one of he longer names to be clear of their intentions:\r\n * * * isAlmostEqualAllowPeriodShift\r\n * * * isAlmostEqualRadiansNoPeriodShift\r\n */\r\n public isAlmostEqual(other: AngleSweep): boolean { return this.isAlmostEqualNoPeriodShift(other); }\r\n}\r\n"]}
@@ -122,8 +122,10 @@ export declare class XYZ implements XYAndZ {
122
122
  setAt(index: number, value: number): void;
123
123
  /** Return the index (0,1,2) of the x,y,z component with largest absolute value */
124
124
  indexOfMaxAbs(): number;
125
- /** Return true if the if x,y,z components are all nearly zero to tolerance Geometry.smallMetricDistance */
125
+ /** Return true if the x,y,z components are all nearly zero to tolerance Geometry.smallMetricDistance */
126
126
  get isAlmostZero(): boolean;
127
+ /** Return true if the x,y,z components are all exactly zero */
128
+ get isZero(): boolean;
127
129
  /** Return the largest absolute value of any component */
128
130
  maxAbs(): number;
129
131
  /** Return the sqrt of the sum of squared x,y,z parts */
@@ -1 +1 @@
1
- {"version":3,"file":"Point3dVector3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Point3dVector3d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Point3dVector3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Point3dVector3d.ts"],"names":[],"mappings":"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"}
@@ -240,10 +240,12 @@ class XYZ {
240
240
  }
241
241
  return index;
242
242
  }
243
- /** Return true if the if x,y,z components are all nearly zero to tolerance Geometry.smallMetricDistance */
243
+ /** Return true if the x,y,z components are all nearly zero to tolerance Geometry.smallMetricDistance */
244
244
  get isAlmostZero() {
245
245
  return Geometry_1.Geometry.isSmallMetricDistance(this.x) && Geometry_1.Geometry.isSmallMetricDistance(this.y) && Geometry_1.Geometry.isSmallMetricDistance(this.z);
246
246
  }
247
+ /** Return true if the x,y,z components are all exactly zero */
248
+ get isZero() { return this.x === 0.0 && this.y === 0.0 && this.z === 0.0; }
247
249
  /** Return the largest absolute value of any component */
248
250
  maxAbs() { return Math.max(Math.abs(this.x), Math.abs(this.y), Math.abs(this.z)); }
249
251
  /** Return the sqrt of the sum of squared x,y,z parts */