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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Geometry.d.ts +57 -46
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +73 -53
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/curve/Arc3d.d.ts +128 -34
  7. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  8. package/lib/cjs/curve/Arc3d.js +174 -20
  9. package/lib/cjs/curve/Arc3d.js.map +1 -1
  10. package/lib/cjs/curve/CurveCollection.d.ts +2 -1
  11. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveCollection.js +2 -1
  13. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  14. package/lib/cjs/curve/CurveLocationDetail.d.ts +19 -1
  15. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveLocationDetail.js +39 -0
  17. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  18. package/lib/cjs/curve/LineString3d.js +1 -1
  19. package/lib/cjs/curve/LineString3d.js.map +1 -1
  20. package/lib/cjs/curve/OffsetOptions.d.ts +1 -1
  21. package/lib/cjs/curve/OffsetOptions.js +1 -1
  22. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  23. package/lib/cjs/curve/RegionOps.d.ts +2 -1
  24. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  25. package/lib/cjs/curve/RegionOps.js +2 -1
  26. package/lib/cjs/curve/RegionOps.js.map +1 -1
  27. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  28. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  29. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  30. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  31. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  32. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  33. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +1000 -0
  34. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  35. package/lib/cjs/geometry3d/Angle.d.ts +18 -5
  36. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  37. package/lib/cjs/geometry3d/Angle.js +23 -7
  38. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  39. package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -1
  40. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  41. package/lib/cjs/geometry3d/AngleSweep.js +47 -12
  42. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  43. package/lib/cjs/geometry3d/Matrix3d.d.ts +6 -4
  44. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  45. package/lib/cjs/geometry3d/Matrix3d.js +6 -4
  46. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  47. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +2 -3
  48. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  49. package/lib/cjs/geometry3d/Point3dVector3d.js +2 -3
  50. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  51. package/lib/cjs/geometry3d/PointHelpers.d.ts +6 -5
  52. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  53. package/lib/cjs/geometry3d/PointHelpers.js +11 -10
  54. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  55. package/lib/cjs/geometry3d/Range.d.ts +6 -1
  56. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  57. package/lib/cjs/geometry3d/Range.js +9 -3
  58. package/lib/cjs/geometry3d/Range.js.map +1 -1
  59. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  60. package/lib/cjs/geometry3d/Transform.js +1 -1
  61. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  62. package/lib/cjs/numerics/Newton.d.ts +3 -3
  63. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  64. package/lib/cjs/numerics/Newton.js +14 -16
  65. package/lib/cjs/numerics/Newton.js.map +1 -1
  66. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  67. package/lib/cjs/numerics/Polynomials.js +2 -2
  68. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  69. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +7 -4
  70. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  71. package/lib/cjs/polyface/PolyfaceBuilder.js +8 -4
  72. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  73. package/lib/cjs/polyface/PolyfaceQuery.d.ts +3 -3
  74. package/lib/cjs/polyface/PolyfaceQuery.js +3 -3
  75. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  76. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  77. package/lib/cjs/serialization/BGFBWriter.js +2 -2
  78. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  79. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  80. package/lib/cjs/topology/Graph.d.ts +1 -1
  81. package/lib/cjs/topology/Graph.js +2 -2
  82. package/lib/cjs/topology/Graph.js.map +1 -1
  83. package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  84. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +1 -1
  85. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  86. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  87. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  88. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +168 -127
  89. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  90. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +35 -35
  91. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  92. package/lib/cjs/topology/HalfEdgePositionDetail.js +63 -41
  93. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  94. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +64 -12
  95. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  96. package/lib/cjs/topology/InsertAndRetriangulateContext.js +174 -75
  97. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  98. package/lib/cjs/topology/Triangulation.d.ts +16 -10
  99. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  100. package/lib/cjs/topology/Triangulation.js +23 -30
  101. package/lib/cjs/topology/Triangulation.js.map +1 -1
  102. package/lib/esm/Geometry.d.ts +57 -46
  103. package/lib/esm/Geometry.d.ts.map +1 -1
  104. package/lib/esm/Geometry.js +73 -53
  105. package/lib/esm/Geometry.js.map +1 -1
  106. package/lib/esm/curve/Arc3d.d.ts +128 -34
  107. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  108. package/lib/esm/curve/Arc3d.js +172 -19
  109. package/lib/esm/curve/Arc3d.js.map +1 -1
  110. package/lib/esm/curve/CurveCollection.d.ts +2 -1
  111. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  112. package/lib/esm/curve/CurveCollection.js +2 -1
  113. package/lib/esm/curve/CurveCollection.js.map +1 -1
  114. package/lib/esm/curve/CurveLocationDetail.d.ts +19 -1
  115. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  116. package/lib/esm/curve/CurveLocationDetail.js +39 -0
  117. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  118. package/lib/esm/curve/LineString3d.js +1 -1
  119. package/lib/esm/curve/LineString3d.js.map +1 -1
  120. package/lib/esm/curve/OffsetOptions.d.ts +1 -1
  121. package/lib/esm/curve/OffsetOptions.js +1 -1
  122. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  123. package/lib/esm/curve/RegionOps.d.ts +2 -1
  124. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  125. package/lib/esm/curve/RegionOps.js +2 -1
  126. package/lib/esm/curve/RegionOps.js.map +1 -1
  127. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  128. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  129. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  130. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  131. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  132. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  133. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +995 -0
  134. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  135. package/lib/esm/geometry3d/Angle.d.ts +18 -5
  136. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  137. package/lib/esm/geometry3d/Angle.js +23 -7
  138. package/lib/esm/geometry3d/Angle.js.map +1 -1
  139. package/lib/esm/geometry3d/AngleSweep.d.ts +14 -1
  140. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  141. package/lib/esm/geometry3d/AngleSweep.js +47 -12
  142. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  143. package/lib/esm/geometry3d/Matrix3d.d.ts +6 -4
  144. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  145. package/lib/esm/geometry3d/Matrix3d.js +6 -4
  146. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  147. package/lib/esm/geometry3d/Point3dVector3d.d.ts +2 -3
  148. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  149. package/lib/esm/geometry3d/Point3dVector3d.js +2 -3
  150. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  151. package/lib/esm/geometry3d/PointHelpers.d.ts +6 -5
  152. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  153. package/lib/esm/geometry3d/PointHelpers.js +11 -10
  154. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  155. package/lib/esm/geometry3d/Range.d.ts +6 -1
  156. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  157. package/lib/esm/geometry3d/Range.js +9 -3
  158. package/lib/esm/geometry3d/Range.js.map +1 -1
  159. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  160. package/lib/esm/geometry3d/Transform.js +1 -1
  161. package/lib/esm/geometry3d/Transform.js.map +1 -1
  162. package/lib/esm/numerics/Newton.d.ts +3 -3
  163. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  164. package/lib/esm/numerics/Newton.js +14 -16
  165. package/lib/esm/numerics/Newton.js.map +1 -1
  166. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  167. package/lib/esm/numerics/Polynomials.js +2 -2
  168. package/lib/esm/numerics/Polynomials.js.map +1 -1
  169. package/lib/esm/polyface/PolyfaceBuilder.d.ts +7 -4
  170. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  171. package/lib/esm/polyface/PolyfaceBuilder.js +8 -4
  172. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  173. package/lib/esm/polyface/PolyfaceQuery.d.ts +3 -3
  174. package/lib/esm/polyface/PolyfaceQuery.js +3 -3
  175. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  176. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  177. package/lib/esm/serialization/BGFBWriter.js +2 -2
  178. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  179. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  180. package/lib/esm/topology/Graph.d.ts +1 -1
  181. package/lib/esm/topology/Graph.js +2 -2
  182. package/lib/esm/topology/Graph.js.map +1 -1
  183. package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  184. package/lib/esm/topology/HalfEdgeNodeXYZUV.js +1 -1
  185. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  186. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  187. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  188. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +168 -127
  189. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  190. package/lib/esm/topology/HalfEdgePositionDetail.d.ts +35 -35
  191. package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  192. package/lib/esm/topology/HalfEdgePositionDetail.js +63 -41
  193. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  194. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +64 -12
  195. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  196. package/lib/esm/topology/InsertAndRetriangulateContext.js +173 -74
  197. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  198. package/lib/esm/topology/Triangulation.d.ts +16 -10
  199. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  200. package/lib/esm/topology/Triangulation.js +24 -31
  201. package/lib/esm/topology/Triangulation.js.map +1 -1
  202. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EllipticalArcApproximationContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/EllipticalArcApproximationContext.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\nimport { assert, OrderedComparator, OrderedSet, SortedArray } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range1d } from \"../../geometry3d/Range\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { Arc3d, EllipticalArcApproximationOptions, EllipticalArcSampleMethod } from \"../Arc3d\";\r\nimport { CurveChain } from \"../CurveCollection\";\r\nimport { CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { CurveCurveCloseApproachXY } from \"./CurveCurveCloseApproachXY\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\n/**\r\n * Comparison callback to sort fractions in increasing order with suitable tolerance for equality.\r\n * @internal\r\n */\r\nfunction compareFractionsIncreasing(f0: number, f1: number): number {\r\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\r\n return 0;\r\n return f0 < f1 ? -1 : 1;\r\n};\r\n/**\r\n * Comparison callback to sort fractions in decreasing order with suitable tolerance for equality.\r\n * @internal\r\n */\r\nfunction compareFractionsDecreasing(f0: number, f1: number): number {\r\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\r\n return 0;\r\n return f0 < f1 ? 1 : -1;\r\n};\r\n\r\n/**\r\n * Structured data carrier used by the elliptical arc sampler.\r\n * @internal\r\n*/\r\nexport class QuadrantFractions {\r\n private _quadrant: 1 | 2 | 3 | 4;\r\n private _fractions: number[];\r\n private _interpolateStartTangent: boolean;\r\n private _interpolateEndTangent: boolean;\r\n private _averageAdded: boolean;\r\n private constructor(\r\n quadrant: 1 | 2 | 3 | 4, fractions: number[], interpolateStartTangent: boolean, interpolateEndTangent: boolean,\r\n ) {\r\n this._quadrant = quadrant;\r\n this._fractions = fractions;\r\n this._interpolateStartTangent = interpolateStartTangent;\r\n this._interpolateEndTangent = interpolateEndTangent;\r\n this._averageAdded = false;\r\n }\r\n /** Constructor, captures the array. */\r\n public static create(\r\n quadrant: 1 | 2 | 3 | 4,\r\n fractions: number[] = [],\r\n interpolateStartTangent: boolean = true,\r\n interpolateEndTangent: boolean = true,\r\n ): QuadrantFractions {\r\n return new QuadrantFractions(quadrant, fractions, interpolateStartTangent, interpolateEndTangent);\r\n }\r\n /**\r\n * Quadrant of the full ellipse containing the samples.\r\n * * Quadrants are labeled proceeding in counterclockwise angular sweeps of length pi/2 starting at vector0.\r\n * * For example, Quadrant 1 starts at vector0 and ends at vector90, and Quadrant 4 ends at vector0.\r\n * * For purposes of angle classification, quadrants are half-open intervals, closed at their start angle,\r\n * as determined by the ellipse's sweep direction.\r\n */\r\n public get quadrant(): 1 | 2 | 3 | 4 {\r\n return this._quadrant;\r\n }\r\n /** Sample locations in this quadrant of the elliptical arc, as fractions of its sweep. */\r\n public get fractions(): number[] {\r\n return this._fractions;\r\n }\r\n public set fractions(f: number[]) {\r\n this._fractions = f;\r\n }\r\n /**\r\n * Whether to interpolate the elliptical arc tangent at the first fraction.\r\n * * If true (default), the first approximating arc is computed from the first two fractions and approximates the\r\n * elliptical arc between the first and second fractions, interpolating both point and tangent at the first fraction,\r\n * and point at the second fraction.\r\n * * If false, the first approximating arc is computed from the first three fractions and approximates the\r\n * elliptical arc between the second and third fractions, where it interpolates position only.\r\n */\r\n public get interpolateStartTangent(): boolean {\r\n return this._interpolateStartTangent;\r\n }\r\n public set interpolateStartTangent(interpolate: boolean) {\r\n this._interpolateStartTangent = interpolate;\r\n }\r\n /**\r\n * Whether to interpolate the elliptical arc tangent at the last fraction.\r\n * * If true (default), the last approximating arc is computed from the last two fractions and approximates the\r\n * elliptical arc between the penultimate and last fractions, interpolating point at the penultimate fraction, and\r\n * both point and tangent at the last fraction.\r\n * * If false, the last approximating arc is computed from the last three fractions and approximates the\r\n * elliptical arc between the penultimate and last fractions, where it interpolates position only.\r\n */\r\n public get interpolateEndTangent(): boolean {\r\n return this._interpolateEndTangent;\r\n }\r\n public set interpolateEndTangent(interpolate: boolean) {\r\n this._interpolateEndTangent = interpolate;\r\n }\r\n /**\r\n * Whether the average of the first and last fractions was added to satisfy a minimum fractions array length of three.\r\n * * There are always at least two fractions per quadrant, but three are needed to interpolate both end tangents\r\n * with circular arcs.\r\n * * This flag is set if a given sample method/arc yielded only two fractions, so their average was inserted in the\r\n * fractions array to meet this minimum three-sample requirement.\r\n */\r\n public get averageAdded(): boolean {\r\n return this._fractions.length === 3 ? this._averageAdded : false;\r\n }\r\n public set averageAdded(added: boolean) {\r\n this._averageAdded = added;\r\n }\r\n /**\r\n * Compute quadrant data for the given angles.\r\n * @param radians0 first radian angle\r\n * @param radians1 second radian angle\r\n * @return quadrant number and start/end radian angles for the quadrant that contains both input angles, or\r\n * undefined if no such quadrant.\r\n * * The returned sweep is always counterclockwise: angle0 < angle1.\r\n */\r\n public static getQuadrantRadians(\r\n radians0: number, radians1: number,\r\n ): { quadrant: 1 | 2 | 3 | 4, angle0: number, angle1: number } | undefined {\r\n if (AngleSweep.isRadiansInStartEnd(radians0, 0, Angle.piOver2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, 0, Angle.piOver2Radians))\r\n return { quadrant: 1, angle0: 0, angle1: Angle.piOver2Radians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piOver2Radians, Angle.piRadians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piOver2Radians, Angle.piRadians))\r\n return { quadrant: 2, angle0: Angle.piOver2Radians, angle1: Angle.piRadians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piRadians, Angle.pi3Over2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piRadians, Angle.pi3Over2Radians))\r\n return { quadrant: 3, angle0: Angle.piRadians, angle1: Angle.pi3Over2Radians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.pi3Over2Radians, Angle.pi2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.pi3Over2Radians, Angle.pi2Radians))\r\n return { quadrant: 4, angle0: Angle.pi3Over2Radians, angle1: Angle.pi2Radians };\r\n return undefined;\r\n }\r\n /** Compute the fractional range of Quadrant 1 for the given sweep. */\r\n public static getQ1FractionalRange(sweep: AngleSweep): Range1d {\r\n const angle0 = 0;\r\n const angle90 = 0.5 * Math.PI;\r\n let f0 = sweep.radiansToSignedPeriodicFraction(angle0);\r\n let f1 = sweep.radiansToSignedPeriodicFraction(angle90);\r\n if (!sweep.isCCW)\r\n [f0, f1] = [f1, f0];\r\n if (f1 < f0)\r\n f1 += 1;\r\n return Range1d.createXX(f0, f1);\r\n }\r\n /** Reverse the fractions array and flags. */\r\n public reverse(): void {\r\n this._fractions.reverse();\r\n [this._interpolateStartTangent, this._interpolateEndTangent] = [this._interpolateEndTangent, this._interpolateStartTangent];\r\n }\r\n};\r\n\r\n/**\r\n * Base class specifying callbacks for processing samples of an elliptical arc.\r\n * @internal\r\n */\r\nclass QuadrantFractionsProcessor {\r\n /**\r\n * Announce the beginning of processing for quadrant `q`.\r\n * @param _reversed whether `q.reverse()` was invoked before this call for symmetry reasons. If so, arcs will be\r\n * announced in the opposite order and with the opposite orientation.\r\n * @return whether to process `q`\r\n */\r\n public announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean { return true; }\r\n /**\r\n * Retrieve the fraction preceding the input fraction in process order.\r\n * * This optional callback facilitates processors like [[AdaptiveSubdivisionQ1ErrorProcessor]] whose implementation\r\n * of [[announceArc]] depends upon the result of the previous invocation of [[announceArc]].\r\n * @param f0 fraction to look up\r\n * @return fraction preceding f0 in process order, or undefined if no such fraction\r\n */\r\n public getPreviousFraction?(f0: number): number | undefined;\r\n /**\r\n * Announce a circular arc approximating the elliptical arc E between the given fractions.\r\n * * The given fractions are different. If `announceQuadrantBegin` was invoked with `reversed === false` then\r\n * `fPrev < f0 < f1`; otherwise, `fPrev > f0 > f1`.\r\n * @param _arc circular arc that interpolates E at f0 and f1. Processor can capture `arc`; it is unused afterwards.\r\n * @param _fPrev fractional parameter of E used to define the 3-point parent circle through the points at `fPrev`,\r\n * `f0`, and `f1` from which `arc` was constructed. If undefined, `arc` was generated from the circle defined by\r\n * the points at `f0` and `f1` and one of their tangents.\r\n * @param _f0 fractional parameter of E at which point `arc` starts\r\n * @param _f1 fractional parameter of E at which point `arc` ends\r\n */\r\n public announceArc(_arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void { }\r\n /**\r\n * Announce the end of processing for quadrant `q`.\r\n * @param _reversed whether `q.reverse()` was invoked before processing (see [[announceQuadrantBegin]]). If so,\r\n * after this call `q.reverse()` is invoked again.\r\n */\r\n public announceQuadrantEnd(_q: QuadrantFractions, _reversed: boolean): void { }\r\n};\r\n\r\n/**\r\n * Processor for computing the error of a sample-based arc chain approximation.\r\n * @internal\r\n */\r\nclass ArcChainErrorProcessor extends QuadrantFractionsProcessor {\r\n private _ellipticalArc: Arc3d;\r\n private _maxPerpendicular: CurveLocationDetailPair | undefined;\r\n protected constructor(ellipticalArc: Arc3d) {\r\n super();\r\n this._ellipticalArc = ellipticalArc;\r\n this._maxPerpendicular = undefined;\r\n }\r\n public static create(ellipticalArc: Arc3d): ArcChainErrorProcessor {\r\n return new ArcChainErrorProcessor(ellipticalArc);\r\n }\r\n public get ellipticalArc(): Arc3d {\r\n return this._ellipticalArc;\r\n }\r\n /**\r\n * Compute the maximum xy-distance between an elliptical arc and its approximation.\r\n * * Inputs should be in horizontal plane(s), as z-coordinates are ignored.\r\n * @param circularArc circular arc approximant. Assumed to start and end on the elliptical arc.\r\n * @param ellipticalArc elliptical arc being approximated.\r\n * For best results, `f0` and `f1` should correspond to the start/end of `circularArc`\r\n * @param f0 optional `ellipticalArc` start fraction to restrict its sweep\r\n * @param f1 optional `ellipticalArc` end fraction to restrict its sweep\r\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\r\n * For each of `detailA` (refers to `circularArc`) and `detailB` (refers to unrestricted `ellipticalArc`):\r\n * * `point` is the end of the perpendicular on each curve\r\n * * `fraction` is the curve parameter of the point\r\n * * `a` is the distance between the points\r\n */\r\n public static computePrimitiveErrorXY(circularArc: Arc3d, ellipticalArc: Arc3d, f0?: number, f1?: number): CurveLocationDetailPair | undefined {\r\n const handler = new CurveCurveCloseApproachXY();\r\n handler.maxDistanceToAccept = circularArc.quickLength() / 2;\r\n const trimEllipse = undefined !== f0 && undefined !== f1;\r\n const trimmedEllipticalArc = trimEllipse ? ellipticalArc.clonePartialCurve(f0, f1) : ellipticalArc;\r\n // We expect only one perpendicular, not near an endpoint.\r\n handler.allPerpendicularsArcArcBounded(circularArc, trimmedEllipticalArc);\r\n let maxPerp: CurveLocationDetailPair | undefined;\r\n for (const perp of handler.grabPairedResults()) {\r\n if (Geometry.isAlmostEqualEitherNumber(perp.detailA.fraction, 0, 1, Geometry.smallFraction))\r\n continue; // rule out perpendiculars on circular arc ends\r\n if (Geometry.isAlmostEqualEitherNumber(perp.detailB.fraction, 0, 1, Geometry.smallFraction))\r\n continue; // rule out perpendiculars on elliptical arc ends\r\n const error = perp.detailA.point.distanceXY(perp.detailB.point);\r\n if (!maxPerp || maxPerp.detailA.a < error) {\r\n if (trimEllipse) { // reset ellipticalArc fraction to unrestricted range\r\n perp.detailB.fraction = Geometry.interpolate(f0, perp.detailB.fraction, f1);\r\n perp.detailB.setCurve(ellipticalArc);\r\n }\r\n perp.detailA.a = perp.detailB.a = error;\r\n maxPerp = perp;\r\n }\r\n }\r\n return maxPerp;\r\n }\r\n\r\n public get maxPerpendicular(): CurveLocationDetailPair | undefined {\r\n return this._maxPerpendicular;\r\n }\r\n public set maxPerpendicular(newMaxPerp: CurveLocationDetailPair) {\r\n this._maxPerpendicular = newMaxPerp;\r\n }\r\n /**\r\n * Update the chain approximation error for a given chain child that approximates the elliptical arc between the\r\n * given fractions.\r\n * * Fractional sweep [f0, f1] of the elliptical arc is the smaller of the cyclic sweeps.\r\n */\r\n public updateMaxPerpendicular(childApproximation: Arc3d, f0: number, f1: number): void {\r\n const childPerp = ArcChainErrorProcessor.computePrimitiveErrorXY(childApproximation, this.ellipticalArc, f0, f1);\r\n if (childPerp && (!this.maxPerpendicular || this.maxPerpendicular.detailA.a < childPerp.detailA.a))\r\n this.maxPerpendicular = childPerp;\r\n };\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\r\n this.updateMaxPerpendicular(arc, f0, f1);\r\n }\r\n}\r\n\r\n/**\r\n * Processor for refining a single Q1 ordered interval [f0,f1] by perturbing an interior fraction f.\r\n * * This processor expects to repeatedly process a QuadrantFractions `q` wth `q.quadrant` = 1 and fractions array\r\n * [fPrev, f0, f, f1], where fPrev is from the previously processed (possibly refined) adjacent interval; however, if\r\n * `q.interpolateStartTangent === true`, then no fPrev is necessary and [f0, f, f1] is expected.\r\n * * This is enough info to compute the two circular arcs spanning [f0,f] and [f,f1] and compare their approximation\r\n * errors.\r\n * * The basic idea is to perturb f so that the difference in the two arcs' errors is minimized.\r\n * * This processor keeps track of a bracket containing f so that when the caller repeatedly processes `q` via\r\n * [[EllipticalArcApproximationContext.processQuadrantFractions]], a bisection algorithm plays out, informed by the\r\n * heuristic that moving f toward one end of its bracket decreases the error of the approximating arc on that side of f.\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionQ1IntervalErrorProcessor extends QuadrantFractionsProcessor {\r\n private _fullEllipseXY: Arc3d;\r\n private _f: number;\r\n private _bracket0: number;\r\n private _bracket1: number;\r\n private _error0: number;\r\n private _error1: number;\r\n private constructor(fullEllipseXY: Arc3d, f0: number, f: number, f1: number) {\r\n super();\r\n this._fullEllipseXY = fullEllipseXY;\r\n this._bracket0 = f0;\r\n this._f = f;\r\n this._bracket1 = f1;\r\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\r\n }\r\n public static create(fullEllipseXY: Arc3d, f0: number, f: number, f1: number): AdaptiveSubdivisionQ1IntervalErrorProcessor {\r\n return new AdaptiveSubdivisionQ1IntervalErrorProcessor(fullEllipseXY, f0, f, f1);\r\n }\r\n /**\r\n * The arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n public get f(): number {\r\n return this._f;\r\n }\r\n public get isConverged(): boolean {\r\n if (Geometry.isSmallMetricDistance(this._error0 - this._error1))\r\n return true;\r\n if (Geometry.isSmallRelative(this._bracket0 - this._bracket1))\r\n return true;\r\n return false;\r\n }\r\n /** Remember the initial value of the fraction f to be perturbed. */\r\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\r\n assert(q.quadrant === 1);\r\n assert(!reversed); // ASSUME bracket and q.fractions have same ordering\r\n // the first fraction might be an extra point for computing the first 3-pt arc.\r\n assert(q.fractions.length === 4 || (q.fractions.length === 3 && q.interpolateStartTangent));\r\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\r\n return true;\r\n }\r\n /** Compute approximation error over the interval adjacent to f. */\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\r\n if (Geometry.isAlmostEqualEitherNumber(this.f, f0, f1, 0)) {\r\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\r\n if (perp) {\r\n if (this.f === f1)\r\n this._error0 = perp.detailA.a; // first arc error\r\n else // f === f0\r\n this._error1 = perp.detailA.a; // second arc error\r\n }\r\n }\r\n }\r\n /** Update `q.fractions` with a perturbed value of f that is expected to decrease error delta. */\r\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\r\n if (Geometry.isLargeCoordinateResult(this._error0) || Geometry.isLargeCoordinateResult(this._error1))\r\n return;\r\n if (this.isConverged)\r\n return;\r\n // set up for next call to processQuadrantFractions\r\n const n = q.fractions.length;\r\n if (this._error0 < this._error1)\r\n this._bracket0 = this._f; // HEURISTIC: move f toward f1 to decrease e1\r\n else\r\n this._bracket1 = this._f; // HEURISTIC: move f toward f0 to decrease e0\r\n this._f = q.fractions[n - 2] = Geometry.interpolate(this._bracket0, 0.5, this._bracket1);\r\n }\r\n}\r\n/**\r\n * Processor for computing samples in Q1 for a subdivision-based arc chain approximation.\r\n * * The basic idea is to build a refinement of `q.fractions` for a QuadrantFractions q with q.quadrant = 1.\r\n * * Start off the refinement with a copy of `q.fractions`.\r\n * * When an announced arc exceeds a given maximum approximation error, compute a fraction f in the span\r\n * such that the error of arcs on either side of f would be almost equal, then add f to the refinement.\r\n * * If the announced arc does not exceed the maxError, its associated fraction span remains unchanged---no\r\n * additional samples are needed to decrease approximation error.\r\n * * After `q` processing completes, `q.fractions` is updated in place with the computed refinement.\r\n * * The caller typically re-processes `q` until `isRefined` returns false, at which point construction of an\r\n * approximation that is guaranteed not to exceed the desired error can commence.\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionQ1ErrorProcessor extends QuadrantFractionsProcessor {\r\n private _fullEllipseXY: Arc3d;\r\n private _fractionRangeQ1: Range1d;\r\n private _refinement?: SortedArray<number>;\r\n private _maxError: number;\r\n private _originalRefinementCount: number;\r\n private static _maxIters = 50;\r\n private constructor(fullEllipseXY: Arc3d, maxError: number) {\r\n super();\r\n this._fullEllipseXY = fullEllipseXY;\r\n this._fractionRangeQ1 = QuadrantFractions.getQ1FractionalRange(fullEllipseXY.sweep);\r\n this._maxError = maxError > 0 ? maxError : EllipticalArcApproximationOptions.defaultMaxError;\r\n this._originalRefinementCount = 0;\r\n }\r\n public static create(fullEllipseXY: Arc3d, maxError: number): AdaptiveSubdivisionQ1ErrorProcessor {\r\n return new AdaptiveSubdivisionQ1ErrorProcessor(fullEllipseXY, maxError);\r\n }\r\n /**\r\n * The arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n /** Whether the processor refined the current `QuadrantFractions` fractions array to decrease approximation error. */\r\n public get isRefined(): boolean {\r\n if (undefined === this._refinement || 0 === this._refinement.length)\r\n return false;\r\n return this._originalRefinementCount < this._refinement.length;\r\n }\r\n /** Initialize the refinement from the quadrant fractions array. */\r\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\r\n assert(q.quadrant === 1);\r\n this._refinement = new SortedArray<number>(reversed ? compareFractionsDecreasing : compareFractionsIncreasing, false);\r\n for (const f of q.fractions) {\r\n if (this._fractionRangeQ1.containsX(f))\r\n this._refinement.insert(f);\r\n }\r\n return 2 <= (this._originalRefinementCount = this._refinement.length);\r\n }\r\n /**\r\n * Return the adjacent fraction from the previously refined interval.\r\n * * This is used to refine the interval of an inner arc, which depends on the most recent refinement of the\r\n * previous interval.\r\n */\r\n public override getPreviousFraction(f0: number): number | undefined {\r\n if (undefined === this._refinement)\r\n return undefined;\r\n const iPrev = this._refinement.indexOf(f0);\r\n return (iPrev >= 1) ? this._refinement.get(iPrev - 1) : undefined;\r\n }\r\n /** If this arc needs to be refined, add a refinement point. */\r\n public override announceArc(arc: Arc3d, fPrev: number | undefined, f0: number, f1: number): void {\r\n if (undefined === this._refinement)\r\n return;\r\n if (this._originalRefinementCount > 2) { // no early out for a single interval; it gets refined below\r\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\r\n if (!perp || perp.detailA.a <= this._maxError)\r\n return;\r\n }\r\n // throughout this function, f0 and f1 may be in either order\r\n const f = Geometry.interpolate(f0, 0.5, f1);\r\n const interpolateStartTangent = Geometry.isAlmostEqualEitherNumber(f0, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\r\n const interpolateEndTangent = Geometry.isAlmostEqualEitherNumber(f1, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\r\n if (!interpolateStartTangent && undefined === fPrev)\r\n fPrev = this.getPreviousFraction(f0); // createLastArc caller doesn't supply fPrev\r\n const fractions = (undefined === fPrev) ? [f0, f, f1] : [fPrev, f0, f, f1];\r\n const q1 = [QuadrantFractions.create(1, fractions, interpolateStartTangent, interpolateEndTangent)];\r\n const processor = AdaptiveSubdivisionQ1IntervalErrorProcessor.create(this.fullEllipseXY, f0, f, f1);\r\n let iter = 0;\r\n do { // bisect to refine f (starting at avg) to balance the approx error of the arcs on either side\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\r\n } while (iter++ < AdaptiveSubdivisionQ1ErrorProcessor._maxIters && !processor.isConverged);\r\n this._refinement.insert(processor.f);\r\n }\r\n /** Update the quadrant fractions array with the current refinement. */\r\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\r\n if (this._refinement)\r\n q.fractions = [...this._refinement];\r\n }\r\n /**\r\n * Compute radian angles for the fractions in the current refinement that are strictly inside Q1.\r\n * @param result optional preallocated array to clear and populate\r\n * @return angles suitable for output from [[EllipticalArcSampler.computeRadiansStrictlyInsideQuadrant1]].\r\n */\r\n public getRefinedInteriorQ1Angles(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n else\r\n result.length = 0;\r\n if (this._refinement) {\r\n for (const f of this._refinement) {\r\n if (this._fractionRangeQ1.containsXOpen(f))\r\n result.push(this.fullEllipseXY.sweep.fractionToRadians(f));\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Interface implemented by sampler classes.\r\n * * Implementation constructors are assumed to supply the sampler with the elliptical arc to be approximated,\r\n * as well as relevant options for computing the samples.\r\n * * The elliptical arc to be approximated is assumed to have perpendicular axes so that we can take advantage of\r\n * ellipse symmetry: we only need to compute samples in the ellipse's first quadrant.\r\n * @internal\r\n */\r\ninterface EllipticalArcSampler {\r\n /**\r\n * Return samples interior to the first quadrant of the (full) ellipse.\r\n * * Samples are returned as an unordered array of radian angles in the open interval (0, pi/2).\r\n * @param result optional preallocated array to populate and return\r\n * @return array of radian angles\r\n */\r\n computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[];\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.UniformParameter`\r\n * @internal\r\n */\r\nclass UniformParameterSampler implements EllipticalArcSampler {\r\n private _context: EllipticalArcApproximationContext;\r\n private _options: EllipticalArcApproximationOptions;\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n }\r\n public static create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): UniformParameterSampler {\r\n return new UniformParameterSampler(context, options);\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n if (this._context.isValidEllipticalArc) {\r\n const aDelta = Angle.piOver2Radians / (this._options.numSamplesInQuadrant - 1);\r\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i)\r\n result.push(i * aDelta);\r\n }\r\n return result;\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.NonUniformCurvature`\r\n * @internal\r\n */\r\nclass NonUniformCurvatureSampler implements EllipticalArcSampler {\r\n protected _context: EllipticalArcApproximationContext;\r\n protected _options: EllipticalArcApproximationOptions;\r\n private _xMag2: number;\r\n private _yMag2: number;\r\n private _curvatureRange: Range1d;\r\n protected constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n this._xMag2 = c.ellipticalArc.matrixRef.columnXMagnitudeSquared();\r\n this._yMag2 = c.ellipticalArc.matrixRef.columnYMagnitudeSquared();\r\n // extreme curvatures occur at the ellipse's axis points because its axes are perpendicular\r\n this._curvatureRange = Range1d.createXX(Math.sqrt(this._xMag2) / this._yMag2, Math.sqrt(this._yMag2) / this._xMag2);\r\n }\r\n public static create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): NonUniformCurvatureSampler {\r\n return new NonUniformCurvatureSampler(context, options);\r\n }\r\n /**\r\n * Compute the angle corresponding to the point in the ellipse's first quadrant with the given curvature.\r\n * * The elliptical arc is assumed to be non-circular and have perpendicular axes of positive length; its sweep is ignored.\r\n * * This is a scaled inverse of [[Arc3d.fractionToCurvature]] restricted to fractions in [0, 1/4].\r\n * @return radian angle in [0, pi/2] or undefined if the ellipse is invalid, or does not attain the given curvature.\r\n */\r\n private curvatureToRadians(curvature: number): number | undefined {\r\n /*\r\n Let the elliptical arc be parameterized with axes u,v of different length and u.v = 0:\r\n f(t) = c + u cos(t) + v sin(t),\r\n f'(t) = -u sin(t) + v cos(t),\r\n f\"(t) = -u cos(t) - v sin(t)\r\n We seek a formula for t(K), the inverse of the standard curvature formula\r\n K(t) := ||f'(t) x f\"(t)|| / ||f'(t)||^3\r\n for a parametric function f(t):R->R^3. We'll restrict K to Q1 (i.e., t in [0, pi/2]), where K is monotonic.\r\n By linearity of the cross product and the above formulas, the numerator of K(t) reduces to ||u x v||, and so:\r\n cbrt(||u x v||/K) = ||f'(t)|| = sqrt(f'(t).f'(t))\r\n Leveraging u,v perpendicularity we can define:\r\n lambda(K) := (||u x v||/K)^(2/3) = (||u|| ||v|| / K)^(2/3) = cbrt(u.u v.v / K^2)\r\n Then substituting and using perpendicularity again:\r\n lambda(K) = f'(t).f'(t)\r\n = sin^2(t)u.u + cos^2(t)v.v - 2sin(t)cos(t)u.v\r\n = u.u + cos^2(t)(v.v - u.u)\r\n Taking the positive root because cos(t)>=0 in Q1, and relying on u,v having different lengths:\r\n cos(t) = sqrt((lambda(K) - u.u)/(v.v - u.u))\r\n Solving for t yields the formula for t(K).\r\n */\r\n if (!this._curvatureRange.containsX(curvature))\r\n return undefined; // ellipse does not attain this curvature\r\n const lambda = Math.cbrt((this._xMag2 * this._yMag2) / (curvature * curvature));\r\n const cosTheta = Math.sqrt(Math.abs((lambda - this._xMag2) / (this._yMag2 - this._xMag2)));\r\n return Math.acos(cosTheta);\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n if (this._context.isValidEllipticalArc) {\r\n const tDelta = 1.0 / (this._options.numSamplesInQuadrant - 1);\r\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i) {\r\n const j = this._options.remapFunction(i * tDelta);\r\n const curvature = (1 - j) * this._curvatureRange.low + j * this._curvatureRange.high;\r\n const angle = this.curvatureToRadians(curvature);\r\n if (undefined !== angle)\r\n result.push(angle);\r\n }\r\n }\r\n return result;\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.UniformCurvature`.\r\n * * Basically this is just `NonUniformCurvature` method with uniformity preserved via identity remap function.\r\n * @internal\r\n */\r\nclass UniformCurvatureSampler extends NonUniformCurvatureSampler implements EllipticalArcSampler {\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n super(c, o.clone());\r\n this._options.remapFunction = (x: number) => x; // identity map\r\n }\r\n public static override create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): UniformCurvatureSampler {\r\n return new UniformCurvatureSampler(context, options);\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.AdaptiveSubdivision`\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionSampler implements EllipticalArcSampler {\r\n private _context: EllipticalArcApproximationContext;\r\n private _options: EllipticalArcApproximationOptions;\r\n private _fullEllipseXY: Arc3d;\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n this._fullEllipseXY = c.cloneLocalArc(true) ?? Arc3d.createUnitCircle();\r\n }\r\n public static create(context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions): AdaptiveSubdivisionSampler {\r\n return new AdaptiveSubdivisionSampler(context, options);\r\n }\r\n /**\r\n * Return a copy of the arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!this._context.isValidEllipticalArc)\r\n return [];\r\n const rangeQ1 = QuadrantFractions.getQ1FractionalRange(this.fullEllipseXY.sweep);\r\n const q1 = [QuadrantFractions.create(1, [rangeQ1.low, rangeQ1.high], true, true)];\r\n const processor = AdaptiveSubdivisionQ1ErrorProcessor.create(this.fullEllipseXY, this._options.maxError);\r\n do {\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\r\n } while (processor.isRefined);\r\n return processor.getRefinedInteriorQ1Angles(result);\r\n }\r\n};\r\n\r\n/**\r\n * Processor for constructing a sample-based circular arc chain approximation.\r\n * @internal\r\n */\r\nclass ArcChainConstructionProcessor extends QuadrantFractionsProcessor {\r\n private _chain: CurveChain;\r\n private _quadrantChain?: CurveChain;\r\n private constructor(ellipticalArc: Arc3d, forcePath: boolean) {\r\n super();\r\n this._chain = (ellipticalArc.sweep.isFullCircle && !forcePath) ? Loop.create() : Path.create();\r\n }\r\n public static create(ellipticalArc: Arc3d, forcePath: boolean = false): ArcChainConstructionProcessor {\r\n return new ArcChainConstructionProcessor(ellipticalArc, forcePath);\r\n }\r\n public get chain(): CurveChain | undefined {\r\n return this._chain.children.length > 0 ? this._chain : undefined;\r\n }\r\n public override announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean {\r\n this._quadrantChain = undefined;\r\n return true;\r\n }\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void {\r\n if (!this._quadrantChain)\r\n this._quadrantChain = Path.create(); // the arc chain in a quadrant is always open\r\n this._quadrantChain.tryAddChild(arc); // captured!\r\n }\r\n public override announceQuadrantEnd(_q: QuadrantFractions, reversed: boolean): void {\r\n if (this._quadrantChain) {\r\n if (reversed)\r\n this._quadrantChain.reverseChildrenInPlace();\r\n for (const child of this._quadrantChain.children)\r\n this._chain.tryAddChild(child); // captured!\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Context for sampling a non-circular Arc3d and for constructing an approximation to it based on interpolation\r\n * of the samples.\r\n * * [[EllipticalArcApproximationContext.constructCircularArcChainApproximation]] constructs a `CurveChain`\r\n * approximation consisting of circular arcs.\r\n * * Various sample methods are supported, cf. [[EllipticalArcApproximationOptions]].\r\n * @internal\r\n */\r\nexport class EllipticalArcApproximationContext {\r\n private _ellipticalArc: Arc3d;\r\n private _localToWorld: Transform;\r\n private _isValidEllipticalArc: boolean;\r\n private static workPt0 = Point3d.createZero();\r\n private static workPt1 = Point3d.createZero();\r\n private static workPt2 = Point3d.createZero();\r\n private static workRay = Ray3d.createZero();\r\n\r\n /** Constructor, captures input */\r\n private constructor(ellipticalArc: Arc3d) {\r\n this._isValidEllipticalArc = false;\r\n const data = ellipticalArc.toScaledMatrix3d();\r\n this._ellipticalArc = Arc3d.createScaledXYColumns(data.center, data.axes, data.r0, data.r90, data.sweep);\r\n this._localToWorld = Transform.createRefs(data.center, data.axes);\r\n if (this._localToWorld.matrix.isSingular())\r\n return;\r\n if (this._ellipticalArc.sweep.isEmpty)\r\n return; // ellipse must have a nonzero sweep\r\n const xMag2 = ellipticalArc.matrixRef.columnXMagnitudeSquared();\r\n const yMag2 = ellipticalArc.matrixRef.columnYMagnitudeSquared();\r\n if (Geometry.isSmallMetricDistanceSquared(xMag2) || Geometry.isSmallMetricDistanceSquared(yMag2))\r\n return; // ellipse must have positive radii\r\n if (Geometry.isSameCoordinateSquared(xMag2, yMag2))\r\n return; // ellipse must not be circular\r\n this._isValidEllipticalArc = true;\r\n }\r\n /** Constructor, clones input. */\r\n public static create(ellipticalArc: Arc3d) {\r\n return new EllipticalArcApproximationContext(ellipticalArc);\r\n }\r\n /**\r\n * The arc to be sampled.\r\n * * Its axes are forced to be perpendicular.\r\n * * It is stored in world coordinates.\r\n */\r\n public get ellipticalArc(): Arc3d {\r\n return this._ellipticalArc;\r\n }\r\n /**\r\n * The rigid transformation that maps `ellipticalArc` from local coordinates to world coordinates.\r\n * * In local coordinates, the arc center lies at the origin and its (perpendicular) axes of symmetry lie along\r\n * the positive x- and y-axes.\r\n */\r\n public get localToWorld(): Transform {\r\n return this._localToWorld;\r\n }\r\n /**\r\n * Whether the elliptical arc is amenable to sampling.\r\n * * The arc is valid if it is non-circular, has nonzero sweep, and has positive radii (nonsingular matrix).\r\n */\r\n public get isValidEllipticalArc(): boolean {\r\n return this._isValidEllipticalArc;\r\n }\r\n /**\r\n * Create a clone of the context's arc in local coordinates.\r\n * @param fullSweep Optionally set full sweep on the returned local arc. Start angle is preserved.\r\n * @returns local arc, or undefined if the arc is invalid\r\n */\r\n public cloneLocalArc(fullSweep?: boolean): Arc3d | undefined {\r\n if (!this.isValidEllipticalArc)\r\n return undefined;\r\n const worldToLocal = this.localToWorld.inverse();\r\n if (!worldToLocal)\r\n return undefined;\r\n const arcXY = this.ellipticalArc.cloneTransformed(worldToLocal);\r\n if (fullSweep) {\r\n let sweep = 2 * Math.PI;\r\n if (!arcXY.sweep.isCCW)\r\n sweep = -sweep;\r\n arcXY.sweep.setStartEndRadians(arcXY.sweep.startRadians, arcXY.sweep.startRadians + sweep);\r\n }\r\n return arcXY;\r\n }\r\n /**\r\n * Process structured sample data for the given elliptical arc.\r\n * * Circular arcs are announced to the processor for each sample interval in each quadrant.\r\n * * Each quadrant is processed separately to allow the elliptical arc's axis points and tangents to be interpolated.\r\n * * A 2-point plus tangent construction is used to create the first and last circular arc in each quadrant.\r\n * * Symmetry of the announced circular arcs matching that of a multi-quadrant spanning elliptical arc is ensured by\r\n * processing the samples consistently, starting along the elliptical arc's major axis in each quadrant.\r\n * @param ellipticalArc source arc to approximate\r\n * @param quadrants structured samples, may be temporarily reversed for symmetry\r\n * @param processor callbacks for handling the constructed arcs\r\n * @internal\r\n */\r\n public static processQuadrantFractions(\r\n ellipticalArc: Arc3d, quadrants: QuadrantFractions[], processor: QuadrantFractionsProcessor,\r\n ): void {\r\n const pt0 = this.workPt0;\r\n const pt1 = this.workPt1;\r\n const pt2 = this.workPt2;\r\n const ray = this.workRay;\r\n const arcBetween2Samples = (arcStart: Ray3d, arcEnd: Point3d, reverse: boolean): Arc3d | undefined => {\r\n // assume non-colinear inputs\r\n const myArc = Arc3d.createCircularStartTangentEnd(arcStart.origin, arcStart.direction, arcEnd);\r\n if (!(myArc instanceof Arc3d))\r\n return undefined;\r\n if (reverse)\r\n myArc.reverseInPlace();\r\n return myArc;\r\n };\r\n const arcBetweenLast2Of3Samples = (p0: Point3d, arcStart: Point3d, arcEnd: Point3d): Arc3d | undefined => {\r\n // assume non-colinear inputs; initial arc starts at p0, ends at arcEnd\r\n const arc = Arc3d.createCircularStartMiddleEnd(p0, arcStart, arcEnd);\r\n if (!(arc instanceof Arc3d))\r\n return undefined; // colinear?\r\n const startAngle = arc.vector0.signedAngleTo(Vector3d.createStartEnd(arc.center, arcStart), arc.matrixRef.columnZ());\r\n arc.sweep.setStartEndRadians(startAngle.radians, arc.sweep.endRadians);\r\n return arc; // returned arc starts at arcStart, ends at arcEnd\r\n };\r\n const createFirstArc = (f0: number, f1: number, reverse: boolean): void => {\r\n // This arc starts at the first sample f0 and ends at f1.\r\n ellipticalArc.fractionToPointAndDerivative(f0, ray);\r\n ellipticalArc.fractionToPoint(f1, pt1);\r\n if (reverse)\r\n ray.direction.scaleInPlace(-1);\r\n const arc = arcBetween2Samples(ray, pt1, false);\r\n if (arc)\r\n processor.announceArc(arc, undefined, f0, f1);\r\n };\r\n const createInnerArc = (f0: number, f1: number, f2: number) => {\r\n let fPrev = f0;\r\n if (processor.getPreviousFraction)\r\n fPrev = processor.getPreviousFraction(f1) ?? f0;\r\n ellipticalArc.fractionToPoint(fPrev, pt0);\r\n ellipticalArc.fractionToPoint(f1, pt1);\r\n ellipticalArc.fractionToPoint(f2, pt2);\r\n const arc = arcBetweenLast2Of3Samples(pt0, pt1, pt2);\r\n if (arc)\r\n processor.announceArc(arc, fPrev, f1, f2);\r\n };\r\n const createLastArc = (f0: number, f1: number, reverse: boolean): void => {\r\n // This arc starts at f0 and ends at the last sample f1. It is the only arc to use f1.\r\n ellipticalArc.fractionToPoint(f0, pt0);\r\n ellipticalArc.fractionToPointAndDerivative(f1, ray);\r\n if (!reverse)\r\n ray.direction.scaleInPlace(-1);\r\n const arc = arcBetween2Samples(ray, pt0, true);\r\n if (arc)\r\n processor.announceArc(arc, undefined, f0, f1);\r\n };\r\n const reverseFractionsForSymmetry = (q: QuadrantFractions): boolean => {\r\n // If q interpolates an axis, we process q.fractions in a consistent direction (increasing or decreasing) so that the\r\n // approximating arc chain exhibits fourfold axial symmetry. We do this by ensuring q.fractions starts along the\r\n // major axis (or ends along the minor axis). This choice is arbitrary, but consistently made across all quadrants.\r\n if (!q.interpolateStartTangent && !q.interpolateEndTangent)\r\n return false;\r\n const n = q.fractions.length;\r\n if (n < 2)\r\n return false;\r\n const xAxisIsMajor = ellipticalArc.vector0.magnitudeSquared() > ellipticalArc.vector90.magnitudeSquared();\r\n const processCCWQuadrantInReverse = xAxisIsMajor ? (q.quadrant === 2 || q.quadrant === 4) : (q.quadrant === 1 || q.quadrant === 3);\r\n const isAlreadyReversed = q.fractions[0] > q.fractions[n - 1];\r\n const doReverse = !isAlreadyReversed && (processCCWQuadrantInReverse === ellipticalArc.sweep.isCCW);\r\n if (doReverse)\r\n q.reverse(); // for symmetry we sometimes process decreasing fractions. This creates slightly different arcs.\r\n return doReverse;\r\n };\r\n\r\n for (const q of quadrants) {\r\n const n = q.fractions.length;\r\n if (n < 2)\r\n continue;\r\n const reversed = reverseFractionsForSymmetry(q);\r\n if (!processor.announceQuadrantBegin(q, reversed))\r\n continue;\r\n if (q.interpolateStartTangent)\r\n createFirstArc(q.fractions[0], q.fractions[1], reversed);\r\n // the first inner arc approximates the ellipse over [f[1],f[2]]; the last inner arc, over [f[n-3],f[n-2]]\r\n for (let i = 0; i + 2 < n - 1; ++i)\r\n createInnerArc(q.fractions[i], q.fractions[i + 1], q.fractions[i + 2]);\r\n if (n > 2) { // the final arc approximates [f[n-2],f[n-1]]\r\n if (q.interpolateEndTangent)\r\n createLastArc(q.fractions[n - 2], q.fractions[n - 1], reversed);\r\n else\r\n createInnerArc(q.fractions[n - 3], q.fractions[n - 2], q.fractions[n - 1]);\r\n }\r\n processor.announceQuadrantEnd(q, reversed);\r\n if (reversed)\r\n q.reverse(); // undo the reverse above\r\n }\r\n }\r\n /**\r\n * Compute the maximum error of the circular arc chain approximation determined by the given samples.\r\n * * This is measured by the longest perpendicular between the elliptical arc and its approximation.\r\n * @param samples structured sample data from the instance's elliptical arc.\r\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\r\n * For each of `detailA` and `detailB`:\r\n * * `point` is the end of the perpendicular on each curve\r\n * * `fraction` is the curve parameter of the point\r\n * * `a` is the distance between the points.\r\n * @internal\r\n */\r\n public computeApproximationError(samples: QuadrantFractions[]): CurveLocationDetailPair | undefined {\r\n const arcXY = this.cloneLocalArc();\r\n if (!arcXY)\r\n return undefined;\r\n const processor = ArcChainErrorProcessor.create(arcXY);\r\n EllipticalArcApproximationContext.processQuadrantFractions(arcXY, samples, processor);\r\n const maxError = processor.maxPerpendicular;\r\n return (maxError && maxError.tryTransformInPlace(this.localToWorld)) ? maxError : undefined;\r\n }\r\n /**\r\n * Compute samples for the elliptical arc as fraction parameters.\r\n * * This method houses the sampling framework for all sampling methods, which are customized via implementations\r\n * of the [[EllipticalArcSampler]] interface.\r\n * * Note that the returned samples are fractions in the parameterization of the context's arc (whose axes have been\r\n * forced to be perpendicular), not the input arc passed into the context's constructor.\r\n * @param options options that determine how the elliptical arc is sampled.\r\n * @param structuredOutput flag indicating output format as follows:\r\n * * If false (default), return all fractions in one sorted (increasing), deduplicated array (a full ellipse includes\r\n * both 0 and 1).\r\n * * If true, fractions are assembled by quadrants:\r\n * * Each [[QuadrantFractions]] object holds at least three sorted (increasing), deduplicated fractions in a\r\n * specified quadrant of the arc.\r\n * * If only two fractions would be computed for a given `QuadrantFractions`, their midpoint is inserted to enable\r\n * tangent interpolation at both ends. Such a quadrant `q` is marked with `q.averageAdded = true`.\r\n * * The `QuadrantFractions` objects themselves are sorted by increasing order of the fractions they contain.\r\n * * If the arc sweep spans adjacent quadrants, the fraction bordering the quadrants appears in both `QuadrantFractions`.\r\n * * If the arc starts and ends in the same quadrant, two `QuadrantFractions` objects can be returned.\r\n * * This means there are between 1 and 5 objects in the `QuadrantFractions` array.\r\n * @internal\r\n */\r\n public computeSampleFractions(\r\n options: EllipticalArcApproximationOptions, structuredOutput: boolean = false,\r\n ): QuadrantFractions[] | number[] {\r\n if (!this.isValidEllipticalArc)\r\n return [];\r\n const compareRadiansIncreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\r\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\r\n return 0;\r\n return a0 < a1 ? -1 : 1;\r\n };\r\n const compareRadiansDecreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\r\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\r\n return 0;\r\n return a0 < a1 ? 1 : -1;\r\n };\r\n const compareQuadrantFractions: OrderedComparator<QuadrantFractions> = (\r\n q0: QuadrantFractions, q1: QuadrantFractions,\r\n ): number => {\r\n // ASSUME QuadrantFractions.fractions arrays are sorted (increasing) and have only trivial overlap\r\n if (compareFractionsIncreasing(q0.fractions[q0.fractions.length - 1], q1.fractions[0]) <= 0)\r\n return -1;\r\n if (compareFractionsIncreasing(q1.fractions[q1.fractions.length - 1], q0.fractions[0]) <= 0)\r\n return 1;\r\n return 0;\r\n };\r\n const shiftRadiansToSweep = (angle: number, sweep: AngleSweep): { angle: number, inSweep: boolean } => {\r\n const inSweep = sweep.isRadiansInSweep(angle, true);\r\n if (inSweep) {\r\n const fraction = sweep.radiansToSignedPeriodicFraction(angle);\r\n if (Geometry.isIn01(fraction))\r\n angle = sweep.fractionToRadians(fraction);\r\n }\r\n return { angle, inSweep };\r\n };\r\n const convertAndAddRadiansToFractionInRange = (\r\n dest: OrderedSet<number>, radians: number, sweep: AngleSweep, f0?: number, f1?: number,\r\n ): number | undefined => {\r\n if (undefined === f0)\r\n f0 = 0;\r\n if (undefined === f1)\r\n f1 = 1;\r\n if (f0 > f1)\r\n return convertAndAddRadiansToFractionInRange(dest, radians, sweep, f1, f0);\r\n const fraction = sweep.radiansToSignedPeriodicFraction(radians);\r\n if (fraction < (f0 - Geometry.smallFraction) || (f1 + Geometry.smallFraction) < fraction)\r\n return undefined; // angle is outside sweep\r\n Geometry.restrictToInterval(fraction, 0, 1);\r\n dest.add(fraction);\r\n return fraction;\r\n };\r\n const convertQ1RadiansInSweepToQuadrantFractions = (\r\n anglesInQ1: number[], angle0: number, angle1: number, sweep: AngleSweep,\r\n ): QuadrantFractions | undefined => {\r\n if (angle0 > angle1)\r\n return convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, angle1, angle0, sweep);\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(angle0, angle1))\r\n return undefined; // empty sweep\r\n const qData = QuadrantFractions.getQuadrantRadians(angle0, angle1);\r\n if (undefined === qData)\r\n return undefined; // no containing quadrant\r\n const qFractions = new OrderedSet<number>(compareFractionsIncreasing);\r\n const f0 = convertAndAddRadiansToFractionInRange(qFractions, angle0, sweep);\r\n const f1 = convertAndAddRadiansToFractionInRange(qFractions, angle1, sweep);\r\n if (undefined === f0 || undefined === f1)\r\n return undefined;\r\n for (const a0 of anglesInQ1) {\r\n let angle = a0;\r\n if (2 === qData.quadrant)\r\n angle = Angle.piRadians - angle;\r\n else if (3 === qData.quadrant)\r\n angle = Angle.piRadians + angle;\r\n else if (4 === qData.quadrant)\r\n angle = Angle.pi2Radians - angle;\r\n convertAndAddRadiansToFractionInRange(qFractions, angle, sweep, f0, f1);\r\n }\r\n const qf = QuadrantFractions.create(qData.quadrant, [...qFractions]);\r\n const n = qf.fractions.length;\r\n if (2 === n) { // e.g. elliptical arc is so small it contains no interior samples in this quadrant\r\n qf.fractions.splice(1, 0, Geometry.interpolate(qf.fractions[0], 0.5, qf.fractions[1]));\r\n qf.averageAdded = true;\r\n }\r\n return qf;\r\n };\r\n const computeStructuredOutput = (anglesInQ1: number[], arcSweep: AngleSweep): QuadrantFractions[] => {\r\n const qEndAngles = new OrderedSet<number>(arcSweep.isCCW ? compareRadiansIncreasing : compareRadiansDecreasing);\r\n qEndAngles.add(arcSweep.endRadians);\r\n for (const qAngle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians, Angle.pi2Radians]) {\r\n const shifted = shiftRadiansToSweep(qAngle, arcSweep);\r\n if (shifted.inSweep)\r\n qEndAngles.add(shifted.angle);\r\n }\r\n const quadrants = new OrderedSet<QuadrantFractions>(compareQuadrantFractions);\r\n let a0 = arcSweep.startRadians;\r\n for (const a1 of qEndAngles) {\r\n const quadrant = convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, a0, a1, arcSweep);\r\n if (quadrant)\r\n quadrants.add(quadrant);\r\n a0 = a1;\r\n }\r\n return [...quadrants];\r\n };\r\n const computeFlatOutput = (anglesInQ1: number[], arcSweep: AngleSweep): number[] => {\r\n // first add the quadrant fractions so the set prefers them over nearby interior fractions\r\n const fractions = new OrderedSet<number>(compareFractionsIncreasing);\r\n fractions.add(0);\r\n fractions.add(1);\r\n for (const angle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians])\r\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\r\n // add interior Q1 fractions, reflect to the other quadrants, filter by sweep and extant entry\r\n for (const angle0 of anglesInQ1) {\r\n for (const angle of [angle0, Angle.piRadians - angle0, Angle.piRadians + angle0, Angle.pi2Radians - angle0])\r\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\r\n }\r\n return [...fractions];\r\n };\r\n // sample the (full) ellipse as angles in strict interior of Quadrant 1\r\n const radiansQ1: number[] = []; // unordered\r\n switch (options.sampleMethod) {\r\n case EllipticalArcSampleMethod.UniformParameter: {\r\n UniformParameterSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.UniformCurvature: {\r\n UniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.NonUniformCurvature: {\r\n NonUniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.AdaptiveSubdivision: {\r\n AdaptiveSubdivisionSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n return structuredOutput ?\r\n computeStructuredOutput(radiansQ1, this.ellipticalArc.sweep) :\r\n computeFlatOutput(radiansQ1, this.ellipticalArc.sweep);\r\n }\r\n /** Construct a circular arc chain approximation to the elliptical arc. */\r\n public constructCircularArcChainApproximation(options?: EllipticalArcApproximationOptions): CurveChain | undefined {\r\n if (!this.isValidEllipticalArc)\r\n return undefined;\r\n if (!options)\r\n options = EllipticalArcApproximationOptions.create();\r\n const processor = ArcChainConstructionProcessor.create(this.ellipticalArc, options.forcePath);\r\n const samples = this.computeSampleFractions(options, true) as QuadrantFractions[];\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.ellipticalArc, samples, processor);\r\n return processor.chain;\r\n }\r\n}\r\n"]}
@@ -21,6 +21,8 @@ export declare class Angle implements BeJSONFunctions {
21
21
  static readonly piOver2Radians = 1.5707963267948966;
22
22
  /** maximal accuracy value of pi (180 degrees), in radians */
23
23
  static readonly piRadians = 3.141592653589793;
24
+ /** maximal accuracy value of 3*pi/2 (270 degrees), in radians */
25
+ static readonly pi3Over2Radians = 4.71238898038469;
24
26
  /** maximal accuracy value of 2*pi (360 degrees), in radians */
25
27
  static readonly pi2Radians = 6.283185307179586;
26
28
  /** scale factor for converting radians to degrees */
@@ -124,7 +126,7 @@ export declare class Angle implements BeJSONFunctions {
124
126
  sin(): number;
125
127
  /** Return the tangent of this Angle object's angle */
126
128
  tan(): number;
127
- /** Test if a radians (absolute) value is nearly 2PI or larger! */
129
+ /** Test if a radians (absolute) value is nearly 2PI or larger. */
128
130
  static isFullCircleRadians(radians: number): boolean;
129
131
  /** Test if the radians value is a half circle */
130
132
  static isHalfCircleRadians(radians: number): boolean;
@@ -132,13 +134,24 @@ export declare class Angle implements BeJSONFunctions {
132
134
  get isFullCircle(): boolean;
133
135
  /** Test if the angle is a half circle (in either direction) */
134
136
  get isHalfCircle(): boolean;
135
- /** Adjust a radians value so it is positive in 0..360 */
137
+ /**
138
+ * Adjust a degrees value so it is in [0, 360].
139
+ * * Positive multiples of 360 return 0; negative multiples return 360.
140
+ */
136
141
  static adjustDegrees0To360(degrees: number): number;
137
- /** Adjust a radians value so it is in -180..180 */
142
+ /** Adjust a degrees value so it is in [-180, 180]. */
138
143
  static adjustDegreesSigned180(degrees: number): number;
139
- /** Adjust a radians value so it is positive in 0..2Pi */
144
+ /**
145
+ * Adjust a radians value so it is in [0, 2pi].
146
+ * * Nonnegative multiples of 2pi return 0; negative multiples return 2pi.
147
+ */
140
148
  static adjustRadians0To2Pi(radians: number): number;
141
- /** Adjust a radians value so it is positive in -PI..PI */
149
+ /**
150
+ * Adjust a radians value so it is in [0, 2pi).
151
+ * * All multiples of 2pi (within `Geometry.smallAngleRadians`) return 0.
152
+ */
153
+ static adjustRadians0ToLessThan2Pi(radians: number): number;
154
+ /** Adjust a radians value so it is in [-pi, pi] */
142
155
  static adjustRadiansMinusPiPlusPi(radians: number): number;
143
156
  /** Return a (newly allocated) Angle object with value 0 radians */
144
157
  static zero(): Angle;
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;;;;GASG;AACH,qBAAa,KAAM,YAAW,eAAe;IAC3C,+DAA+D;IAC/D,gBAAuB,eAAe,uBAAuB;IAC7D,8DAA8D;IAC9D,gBAAuB,cAAc,sBAA0B;IAC/D,8DAA8D;IAC9D,gBAAuB,cAAc,sBAA2B;IAChE,6DAA6D;IAC7D,gBAAuB,SAAS,qBAA0B;IAC1D,+DAA+D;IAC/D,gBAAuB,UAAU,qBAA0B;IAC3D,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO;IAIP,gDAAgD;IACzC,KAAK,IAAI,KAAK;IAGrB,8CAA8C;IACvC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAG/B;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGnD;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGnD;;OAEG;WACW,gBAAgB,IAAI,KAAK;IAGvC;;;;;OAKG;WACW,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK;IAGtF;;;OAGG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAGxC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC,yCAAyC;WAC3B,SAAS,IAAI,KAAK;IAGhC;;;;;OAKG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK;IAGxE;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK;IAI3B;;;;;;;OAOG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM;IAgBhE;;;;;OAKG;WACW,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK;IAK5E,+DAA+D;IACxD,MAAM,IAAI,UAAU;IAG3B,yEAAyE;IAClE,aAAa,IAAI,UAAU;IAGlC,4CAA4C;IAC5C,IAAW,OAAO,IAAI,MAAM,CAE3B;IACD,4CAA4C;IAC5C,IAAW,OAAO,IAAI,MAAM,CAE3B;IACD;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAGvD;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAsBvD,qDAAqD;IAC9C,GAAG,IAAI,MAAM;IAGpB,mDAAmD;IAC5C,GAAG,IAAI,MAAM;IAGpB,sDAAsD;IAC/C,GAAG,IAAI,MAAM;IAGpB,kEAAkE;WACpD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,iDAAiD;WACnC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,yCAAyC;IACzC,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,+DAA+D;IAC/D,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAe1D,mDAAmD;WACrC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc7D,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc1D,0DAA0D;WAC5C,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAcjE,mEAAmE;WACrD,IAAI,IAAI,KAAK;IAG3B,yCAAyC;IACzC,IAAW,WAAW,IAAI,OAAO,CAEhC;IACD,uFAAuF;IACvF,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,wGAAwG;IACxG,IAAW,wBAAwB,IAAI,OAAO,CAE7C;IACD,gEAAgE;WAClD,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGjE,mEAAmE;WACrD,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGlE;;;;;OAKG;WACW,oCAAoC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EACnF,SAAS,GAAE,MAAmC,GAAG,OAAO;IAW1D;;;KAGC;IACM,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIxD;;;;OAIG;IACI,6BAA6B,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG3G;;;;;OAKG;WACW,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAChF,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG1D;;;;OAIG;IACI,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAGxG;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG3F;;;;;OAKG;WACW,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKzF;;;;;;;OAOG;WACW,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IA4BzF,8EAA8E;WAChE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAoC,GAAG,MAAM;IAYtG;;;;;;;;;;;;;;OAcG;WACW,gCAAgC,CAC5C,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GACrE,UAAU;IAOb;;;;;;;;;OASG;WACW,wBAAwB,CACpC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GACrE,MAAM;IAIT;;;;;;;;;;;;;;;;;OAiBG;WACW,gCAAgC,CAC5C,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAClC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAClC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACvD,gBAAgB,GAAE,OAAe,GAChC,MAAM;IAmBT;;;OAGG;IACI,uBAAuB,CAAC,QAAQ,EAAE,MAAM;CAQhD"}
1
+ {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
@@ -202,7 +202,7 @@ export class Angle {
202
202
  tan() {
203
203
  return Math.tan(this._radians);
204
204
  }
205
- /** Test if a radians (absolute) value is nearly 2PI or larger! */
205
+ /** Test if a radians (absolute) value is nearly 2PI or larger. */
206
206
  static isFullCircleRadians(radians) {
207
207
  return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;
208
208
  }
@@ -218,7 +218,10 @@ export class Angle {
218
218
  get isHalfCircle() {
219
219
  return Angle.isHalfCircleRadians(this._radians);
220
220
  }
221
- /** Adjust a radians value so it is positive in 0..360 */
221
+ /**
222
+ * Adjust a degrees value so it is in [0, 360].
223
+ * * Positive multiples of 360 return 0; negative multiples return 360.
224
+ */
222
225
  static adjustDegrees0To360(degrees) {
223
226
  if (degrees >= 0) {
224
227
  const period = 360.0;
@@ -229,13 +232,12 @@ export class Angle {
229
232
  }
230
233
  else if (degrees < 0) {
231
234
  // negative angle ...
232
- const radians = Angle.adjustDegrees0To360(-degrees);
233
- return 360.0 - radians;
235
+ return 360.0 - Angle.adjustDegrees0To360(-degrees);
234
236
  }
235
237
  // fall through for Nan (disaster) !!!
236
238
  return 0;
237
239
  }
238
- /** Adjust a radians value so it is in -180..180 */
240
+ /** Adjust a degrees value so it is in [-180, 180]. */
239
241
  static adjustDegreesSigned180(degrees) {
240
242
  if (Math.abs(degrees) <= 180.0)
241
243
  return degrees;
@@ -251,7 +253,10 @@ export class Angle {
251
253
  // fall through for NaN disaster.
252
254
  return 0;
253
255
  }
254
- /** Adjust a radians value so it is positive in 0..2Pi */
256
+ /**
257
+ * Adjust a radians value so it is in [0, 2pi].
258
+ * * Nonnegative multiples of 2pi return 0; negative multiples return 2pi.
259
+ */
255
260
  static adjustRadians0To2Pi(radians) {
256
261
  if (radians >= 0) {
257
262
  const period = Math.PI * 2.0;
@@ -267,7 +272,16 @@ export class Angle {
267
272
  // fall through for NaN disaster.
268
273
  return 0;
269
274
  }
270
- /** Adjust a radians value so it is positive in -PI..PI */
275
+ /**
276
+ * Adjust a radians value so it is in [0, 2pi).
277
+ * * All multiples of 2pi (within `Geometry.smallAngleRadians`) return 0.
278
+ */
279
+ static adjustRadians0ToLessThan2Pi(radians) {
280
+ if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, 0))
281
+ radians = 0;
282
+ return this.adjustRadians0To2Pi(radians);
283
+ }
284
+ /** Adjust a radians value so it is in [-pi, pi] */
271
285
  static adjustRadiansMinusPiPlusPi(radians) {
272
286
  if (Math.abs(radians) <= Math.PI)
273
287
  return radians;
@@ -525,6 +539,8 @@ Angle.piOver4Radians = 7.853981633974483e-001;
525
539
  Angle.piOver2Radians = 1.5707963267948966e+000;
526
540
  /** maximal accuracy value of pi (180 degrees), in radians */
527
541
  Angle.piRadians = 3.141592653589793e+000;
542
+ /** maximal accuracy value of 3*pi/2 (270 degrees), in radians */
543
+ Angle.pi3Over2Radians = 4.71238898038469e+000;
528
544
  /** maximal accuracy value of 2*pi (360 degrees), in radians */
529
545
  Angle.pi2Radians = 6.283185307179586e+000;
530
546
  /** scale factor for converting radians to degrees */
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.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 { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to\r\n * be clear about whether their angle is degrees or radians.\r\n * * After the Angle object is created, the callers should not know or care whether it is stored in\r\n * `degrees` or `radians` because both are available if requested by caller.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or\r\n * out are degrees or radians.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/12 (15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914946;\r\n /** maximal accuracy value of pi/4 (45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.853981633974483e-001;\r\n /** maximal accuracy value of pi/2 (90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.5707963267948966e+000;\r\n /** maximal accuracy value of pi (180 degrees), in radians */\r\n public static readonly piRadians = 3.141592653589793e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.283185307179586e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) {\r\n this._radians = radians;\r\n this._degrees = degrees;\r\n }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle {\r\n return new Angle(this._radians, this._degrees);\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> {\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number): Angle {\r\n return new Angle(Angle.degreesToRadians(degrees), degrees);\r\n }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Return a new `Angle` object with the default \"small\" angle measurement specified by [[Geometry.smallAngleRadians]].\r\n */\r\n public static createSmallAngle(): Angle {\r\n return new Angle(Geometry.smallAngleRadians);\r\n }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs (based on a fraction)\r\n * @param angle0 first angle in radians\r\n * @param fraction the interpolation fraction\r\n * @param angle1 second angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle): Angle {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number): Angle {\r\n return new Angle(this.radians * scale);\r\n }\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) {\r\n this._radians = radians;\r\n this._degrees = undefined;\r\n }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) {\r\n this._radians = Angle.degreesToRadians(degrees);\r\n this._degrees = degrees;\r\n }\r\n /** Create an angle for a full circle. */\r\n public static create360(): Angle {\r\n return new Angle(Math.PI * 2.0, 360.0);\r\n }\r\n /**\r\n * Create a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in\r\n * determining the (otherwise ambiguous) quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle {\r\n return new Angle(Math.atan2(numerator, denominator));\r\n }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) {\r\n this._radians = other._radians;\r\n this._degrees = other._degrees;\r\n }\r\n /**\r\n * Set an Angle from a JSON object\r\n * * A simple number is considered as degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps {\r\n return this.degrees;\r\n }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps {\r\n return { radians: this.radians };\r\n }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number {\r\n return this._radians;\r\n }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number {\r\n return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians);\r\n }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number): number {\r\n return degrees * Math.PI / 180;\r\n }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n /* the following if statements are for round-off reasons. The problem is that no IEEE number is\r\n * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have\r\n * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees\r\n * it will return exactly 90,180 etc.\r\n */\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /** Return the cosine of this Angle object's angle */\r\n public cos(): number {\r\n return Math.cos(this._radians);\r\n }\r\n /** Return the sine of this Angle object's angle */\r\n public sin(): number {\r\n return Math.sin(this._radians);\r\n }\r\n /** Return the tangent of this Angle object's angle */\r\n public tan(): number {\r\n return Math.tan(this._radians);\r\n }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger! */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a half circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is a full circle */\r\n public get isFullCircle(): boolean {\r\n return Angle.isFullCircleRadians(this._radians);\r\n }\r\n /** Test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean {\r\n return Angle.isHalfCircleRadians(this._radians);\r\n }\r\n /** Adjust a radians value so it is positive in 0..360 */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n const radians = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians;\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is in -180..180 */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in 0..2Pi */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return Math.PI * 2.0 - Angle.adjustRadians0To2Pi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in -PI..PI */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Return a (newly allocated) Angle object with value 0 radians */\r\n public static zero(): Angle {\r\n return new Angle(0);\r\n }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero(): boolean {\r\n return this.radians === 0;\r\n }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero(): boolean {\r\n return Math.abs(this.radians) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole(): boolean {\r\n return Angle.isHalfCircleRadians(this.radians * 2.0);\r\n }\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegrees0To360(degrees));\r\n }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees));\r\n }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= radianTol)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= radianTol)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= radianTol;\r\n }\r\n /**\r\n * Test if this angle has magnitude no greater than that of `other`.\r\n * @param other the other angle\r\n */\r\n public isMagnitudeLessThanOrEqual(other: Angle): boolean {\r\n return Math.abs(this.radians) <= Math.abs(other.radians);\r\n }\r\n\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Math.abs(radiansA - radiansB) < radianTol;\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqual(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return this.isAlmostEqualNoPeriodShift(other, radianTol);\r\n }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Compute the angle A given r*cos(2A) and r*sin(2A) for some nonnegative scalar r.\r\n * * This function assumes the input arguments are related to an angle between -PI and PI.\r\n * * This function returns an angle between -PI and PI.\r\n * @param rCos2A scaled cosine value of twice the angle A.\r\n * @param rSin2A scaled sine value of twice the angle A.\r\n * @return cos(A), sin(A) and A in radians\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 }; // angle = 0\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,\r\n * to allow scaled values -- e.g. the x and y components of any vector -- we normalize\r\n * right here. This adds an extra sqrt and two divisions, but improves\r\n * both the usefulness and robustness of the computation.\r\n */\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n if (cos2A >= 0.0) { // 2A is in NE and SE quadrants, A in same quadrant\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A)); // half angle formula. Use +root since cosA >= 0\r\n sinA = sin2A / (2.0 * cosA); // double angle formula\r\n } else {\r\n if (sin2A > 0.0) { // 2A in NW quadrant. A in NE quadrant\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use +root since sinA > 0\r\n } else { // 2A in SW quadrant. A in SE quadrant\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use -root since sinA <= 0\r\n }\r\n cosA = sin2A / (2.0 * sinA); // double angle formula\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = Geometry.smallFloatingPoint): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for the given vector dot products.\r\n * * These values arise e.g. in the computation performed in `Arc3d.toScaledMatrix3d`.\r\n * * Let vectors U and V define the ellipse x(t) = c + U cos(t) + V sin(t). We seek an angle t0\r\n * such that the radial vector W(t0) := x(t0) - c is perpendicular to the ellipse.\r\n * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)\r\n * implies tan(2t0) = sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the input dot products.\r\n * Math details can be found at docs/learning/geometry/Angle.md\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n * @param favorZero whether to allow a tight tolerance for returning t0 = 0 (default true).\r\n * When dotUV is near zero, U and V are nearly perpendicular, and the returned angle is near zero.\r\n * @return the angle t0 and its cosine and sine.\r\n */\r\n public static dotProductsToHalfAngleTrigValues(\r\n dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true,\r\n ): TrigValues {\r\n const cos2t0 = dotUU - dotVV;\r\n const sin2t0 = 2.0 * dotUV;\r\n if (favorZero && Math.abs(sin2t0) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(cos2t0, sin2t0);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components, and an up vector to resolve\r\n * angle to a full 2PI range.\r\n * * The returned angle is (-PI < radians <= PI) or (0 <= radians < 2 * PI)\r\n * * The angle is in the plane of the U and V vectors.\r\n * * The upVector determines a positive side of the plane but need not be strictly perpendicular to the plane.\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n * @param upVectorX x component of vector to positive side of plane.\r\n * @param upVectorY y component of vector to positive side of plane.\r\n * @param upVectorZ z component of vector to positive side of plane.\r\n * @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI). If false, return\r\n * signed (-PI < radians <= PI)\r\n */\r\n public static orientedRadiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number,\r\n vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n const wx = uy * vz - uz * vy;\r\n const wy = uz * vx - ux * vz;\r\n const wz = ux * vy - uy * vx;\r\n const upDotW = upVectorX * wx + upVectorY * wy + upVectorZ * wz;\r\n const crossMagnitude = Geometry.hypotenuseXYZ(wx, wy, wz);\r\n if (upDotW < 0.0) {\r\n if (adjustToPositive) {\r\n // The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as\r\n // addition to PI. This gives the smoothest numerical transition passing PI.\r\n return Math.PI + Math.atan2(crossMagnitude, -uDotV);\r\n } else {\r\n return -Math.atan2(crossMagnitude, uDotV);\r\n }\r\n } else {\r\n return Math.atan2(crossMagnitude, uDotV);\r\n }\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.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 { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to\r\n * be clear about whether their angle is degrees or radians.\r\n * * After the Angle object is created, the callers should not know or care whether it is stored in\r\n * `degrees` or `radians` because both are available if requested by caller.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or\r\n * out are degrees or radians.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/12 (15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914946;\r\n /** maximal accuracy value of pi/4 (45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.853981633974483e-001;\r\n /** maximal accuracy value of pi/2 (90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.5707963267948966e+000;\r\n /** maximal accuracy value of pi (180 degrees), in radians */\r\n public static readonly piRadians = 3.141592653589793e+000;\r\n /** maximal accuracy value of 3*pi/2 (270 degrees), in radians */\r\n public static readonly pi3Over2Radians = 4.71238898038469e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.283185307179586e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) {\r\n this._radians = radians;\r\n this._degrees = degrees;\r\n }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle {\r\n return new Angle(this._radians, this._degrees);\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> {\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number): Angle {\r\n return new Angle(Angle.degreesToRadians(degrees), degrees);\r\n }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Return a new `Angle` object with the default \"small\" angle measurement specified by [[Geometry.smallAngleRadians]].\r\n */\r\n public static createSmallAngle(): Angle {\r\n return new Angle(Geometry.smallAngleRadians);\r\n }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs (based on a fraction)\r\n * @param angle0 first angle in radians\r\n * @param fraction the interpolation fraction\r\n * @param angle1 second angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle): Angle {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number): Angle {\r\n return new Angle(this.radians * scale);\r\n }\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) {\r\n this._radians = radians;\r\n this._degrees = undefined;\r\n }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) {\r\n this._radians = Angle.degreesToRadians(degrees);\r\n this._degrees = degrees;\r\n }\r\n /** Create an angle for a full circle. */\r\n public static create360(): Angle {\r\n return new Angle(Math.PI * 2.0, 360.0);\r\n }\r\n /**\r\n * Create a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in\r\n * determining the (otherwise ambiguous) quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle {\r\n return new Angle(Math.atan2(numerator, denominator));\r\n }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) {\r\n this._radians = other._radians;\r\n this._degrees = other._degrees;\r\n }\r\n /**\r\n * Set an Angle from a JSON object\r\n * * A simple number is considered as degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps {\r\n return this.degrees;\r\n }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps {\r\n return { radians: this.radians };\r\n }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number {\r\n return this._radians;\r\n }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number {\r\n return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians);\r\n }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number): number {\r\n return degrees * Math.PI / 180;\r\n }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n /* the following if statements are for round-off reasons. The problem is that no IEEE number is\r\n * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have\r\n * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees\r\n * it will return exactly 90,180 etc.\r\n */\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /** Return the cosine of this Angle object's angle */\r\n public cos(): number {\r\n return Math.cos(this._radians);\r\n }\r\n /** Return the sine of this Angle object's angle */\r\n public sin(): number {\r\n return Math.sin(this._radians);\r\n }\r\n /** Return the tangent of this Angle object's angle */\r\n public tan(): number {\r\n return Math.tan(this._radians);\r\n }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger. */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a half circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is a full circle */\r\n public get isFullCircle(): boolean {\r\n return Angle.isFullCircleRadians(this._radians);\r\n }\r\n /** Test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean {\r\n return Angle.isHalfCircleRadians(this._radians);\r\n }\r\n /**\r\n * Adjust a degrees value so it is in [0, 360].\r\n * * Positive multiples of 360 return 0; negative multiples return 360.\r\n */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return 360.0 - Angle.adjustDegrees0To360(-degrees);\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a degrees value so it is in [-180, 180]. */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /**\r\n * Adjust a radians value so it is in [0, 2pi].\r\n * * Nonnegative multiples of 2pi return 0; negative multiples return 2pi.\r\n */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return Math.PI * 2.0 - Angle.adjustRadians0To2Pi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /**\r\n * Adjust a radians value so it is in [0, 2pi).\r\n * * All multiples of 2pi (within `Geometry.smallAngleRadians`) return 0.\r\n */\r\n public static adjustRadians0ToLessThan2Pi(radians: number): number {\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, 0))\r\n radians = 0;\r\n return this.adjustRadians0To2Pi(radians);\r\n }\r\n /** Adjust a radians value so it is in [-pi, pi] */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Return a (newly allocated) Angle object with value 0 radians */\r\n public static zero(): Angle {\r\n return new Angle(0);\r\n }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero(): boolean {\r\n return this.radians === 0;\r\n }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero(): boolean {\r\n return Math.abs(this.radians) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole(): boolean {\r\n return Angle.isHalfCircleRadians(this.radians * 2.0);\r\n }\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegrees0To360(degrees));\r\n }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees));\r\n }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= radianTol)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= radianTol)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= radianTol;\r\n }\r\n /**\r\n * Test if this angle has magnitude no greater than that of `other`.\r\n * @param other the other angle\r\n */\r\n public isMagnitudeLessThanOrEqual(other: Angle): boolean {\r\n return Math.abs(this.radians) <= Math.abs(other.radians);\r\n }\r\n\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Math.abs(radiansA - radiansB) < radianTol;\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqual(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return this.isAlmostEqualNoPeriodShift(other, radianTol);\r\n }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Compute the angle A given r*cos(2A) and r*sin(2A) for some nonnegative scalar r.\r\n * * This function assumes the input arguments are related to an angle between -PI and PI.\r\n * * This function returns an angle between -PI and PI.\r\n * @param rCos2A scaled cosine value of twice the angle A.\r\n * @param rSin2A scaled sine value of twice the angle A.\r\n * @return cos(A), sin(A) and A in radians\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 }; // angle = 0\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,\r\n * to allow scaled values -- e.g. the x and y components of any vector -- we normalize\r\n * right here. This adds an extra sqrt and two divisions, but improves\r\n * both the usefulness and robustness of the computation.\r\n */\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n if (cos2A >= 0.0) { // 2A is in NE and SE quadrants, A in same quadrant\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A)); // half angle formula. Use +root since cosA >= 0\r\n sinA = sin2A / (2.0 * cosA); // double angle formula\r\n } else {\r\n if (sin2A > 0.0) { // 2A in NW quadrant. A in NE quadrant\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use +root since sinA > 0\r\n } else { // 2A in SW quadrant. A in SE quadrant\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use -root since sinA <= 0\r\n }\r\n cosA = sin2A / (2.0 * sinA); // double angle formula\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = Geometry.smallFloatingPoint): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for the given vector dot products.\r\n * * These values arise e.g. in the computation performed in `Arc3d.toScaledMatrix3d`.\r\n * * Let vectors U and V define the ellipse x(t) = c + U cos(t) + V sin(t). We seek an angle t0\r\n * such that the radial vector W(t0) := x(t0) - c is perpendicular to the ellipse.\r\n * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)\r\n * implies tan(2t0) = sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the input dot products.\r\n * Math details can be found at docs/learning/geometry/Angle.md\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n * @param favorZero whether to allow a tight tolerance for returning t0 = 0 (default true).\r\n * When dotUV is near zero, U and V are nearly perpendicular, and the returned angle is near zero.\r\n * @return the angle t0 and its cosine and sine.\r\n */\r\n public static dotProductsToHalfAngleTrigValues(\r\n dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true,\r\n ): TrigValues {\r\n const cos2t0 = dotUU - dotVV;\r\n const sin2t0 = 2.0 * dotUV;\r\n if (favorZero && Math.abs(sin2t0) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(cos2t0, sin2t0);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components, and an up vector to resolve\r\n * angle to a full 2PI range.\r\n * * The returned angle is (-PI < radians <= PI) or (0 <= radians < 2 * PI)\r\n * * The angle is in the plane of the U and V vectors.\r\n * * The upVector determines a positive side of the plane but need not be strictly perpendicular to the plane.\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n * @param upVectorX x component of vector to positive side of plane.\r\n * @param upVectorY y component of vector to positive side of plane.\r\n * @param upVectorZ z component of vector to positive side of plane.\r\n * @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI). If false, return\r\n * signed (-PI < radians <= PI)\r\n */\r\n public static orientedRadiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number,\r\n vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n const wx = uy * vz - uz * vy;\r\n const wy = uz * vx - ux * vz;\r\n const wz = ux * vy - uy * vx;\r\n const upDotW = upVectorX * wx + upVectorY * wy + upVectorZ * wz;\r\n const crossMagnitude = Geometry.hypotenuseXYZ(wx, wy, wz);\r\n if (upDotW < 0.0) {\r\n if (adjustToPositive) {\r\n // The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as\r\n // addition to PI. This gives the smoothest numerical transition passing PI.\r\n return Math.PI + Math.atan2(crossMagnitude, -uDotV);\r\n } else {\r\n return -Math.atan2(crossMagnitude, uDotV);\r\n }\r\n } else {\r\n return Math.atan2(crossMagnitude, uDotV);\r\n }\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
@@ -35,6 +35,8 @@ export declare class AngleSweep implements BeJSONFunctions {
35
35
  get endRadians(): number;
36
36
  /** Read-property for signed start-to-end sweep in radians. */
37
37
  get sweepRadians(): number;
38
+ /** Whether the sweep angles are within smallAngle tolerance, without period shift. */
39
+ get isEmpty(): boolean;
38
40
  /** Return the (strongly typed) start angle */
39
41
  get startAngle(): Angle;
40
42
  /** Return the (strongly typed) end angle */
@@ -171,7 +173,18 @@ export declare class AngleSweep implements BeJSONFunctions {
171
173
  */
172
174
  radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array): void;
173
175
  /**
174
- * Return the fractionalized position of the given angle (as radian) computed with consideration of
176
+ * Return the fractionalized position of the given angle (as radians) computed with consideration of
177
+ * 2PI period and with consideration of angle sweep direction (CW or CCW).
178
+ * * the start angle is at fraction 0
179
+ * * the end angle is at fraction 1
180
+ * * interior angles are between 0 and 1
181
+ * * negative fraction for angles "before" the start angle
182
+ * * fraction larger than one for angles "after" the end angle
183
+ * * allows period shift
184
+ */
185
+ static radiansToSignedPeriodicFractionStartEnd(radians: number, radians0: number, radians1: number): number;
186
+ /**
187
+ * Return the fractionalized position of the given angle (as radians) computed with consideration of
175
188
  * 2PI period and with consideration of angle sweep direction (CW or CCW).
176
189
  * * the start angle is at fraction 0
177
190
  * * the end angle is at fraction 1
@@ -1 +1 @@
1
- {"version":3,"file":"AngleSweep.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AngleSweep.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAY,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,iEAAiE;IACjE,IAAW,YAAY,WAEtB;IACD,+DAA+D;IAC/D,IAAW,UAAU,WAEpB;IACD,8DAA8D;IAC9D,IAAW,YAAY,WAEtB;IACD,iEAAiE;IACjE,IAAW,YAAY,WAEtB;IACD,+DAA+D;IAC/D,IAAW,UAAU,WAEpB;IACD,8DAA8D;IAC9D,IAAW,YAAY,WAEtB;IACD,sFAAsF;IACtF,IAAW,OAAO,YAEjB;IACD,8CAA8C;IAC9C,IAAW,UAAU,UAEpB;IACD,4CAA4C;IAC5C,IAAW,QAAQ,UAElB;IACD;;;;;OAKG;WACW,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU;IAO3D;;;;;;;;;;OAUG;IACH,OAAO;IAIP;;;OAGG;IACI,kBAAkB,CAAC,YAAY,GAAE,MAAU,EAAE,UAAU,GAAE,MAAsB;IAQtF,uDAAuD;IAChD,kBAAkB,CAAC,YAAY,GAAE,MAAU,EAAE,UAAU,GAAE,MAAc;IAG9E;;;OAGG;WACW,qBAAqB,CAAC,YAAY,GAAE,MAAU,EAAE,UAAU,GAAE,MAAsB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAKlI,wEAAwE;IACjE,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAGrD,uEAAuE;WACzD,qBAAqB,CAAC,YAAY,GAAE,MAAU,EAAE,UAAU,GAAE,MAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAGxH,qEAAqE;WACvD,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAKjG,uEAAuE;WACzD,uBAAuB,CAAC,YAAY,GAAE,MAAU,EAAE,YAAY,GAAE,MAAgB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAKhI,mEAAmE;WACrD,uBAAuB,CAAC,YAAY,GAAE,MAAU,EAAE,YAAY,GAAE,MAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAG5H,6FAA6F;WAC/E,gBAAgB,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAGrG,sEAAsE;IAC/D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU;IAMnE,kCAAkC;IAC3B,OAAO,CAAC,KAAK,EAAE,UAAU;IAIhC,mEAAmE;WACrD,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU;IAI1D,yEAAyE;WAC3D,kBAAkB;IAGhC,gDAAgD;IACzC,cAAc;IAKrB;;;OAGG;IACI,eAAe,CAAC,gBAAgB,GAAE,OAAe,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU;IAO1F,wEAAwE;IACjE,kBAAkB;IAKzB,gEAAgE;IAChE,IAAW,KAAK,IAAI,OAAO,CAE1B;IACD,yCAAyC;IACzC,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,sEAAsE;IACtE,IAAW,mBAAmB,IAAI,OAAO,CAIxC;IACD,oCAAoC;IAC7B,KAAK,IAAI,UAAU;IAG1B,2DAA2D;IACpD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAKlD,+EAA+E;IACxE,eAAe,CAAC,QAAQ,EAAE,MAAM;IAGvC;;;OAGG;IACI,cAAc,IAAI,MAAM;IAG/B;;;;;;;;;;;OAWG;IACI,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IAGrD;;;;;;;;;OASG;WACW,yCAAyC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAY,GAAG,MAAM;IAwBpJ;;;;;;;;OAQG;IACI,iCAAiC,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAY,GAAG,MAAM;IAGjG;;;;;;;;OAQG;IACI,+BAA+B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IAG5D;;;;;;;;OAQG;IACI,uCAAuC,CAAC,IAAI,EAAE,oBAAoB;IAMzE;;;;;;;;;OASG;WACW,uCAAuC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAwBlH;;;;;;;;;OASG;IACI,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAG/D;;;;;;;;;OASG;IACI,6BAA6B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IAG1D,6FAA6F;WAC/E,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAE,OAAc,GAAG,OAAO;IASjI,4DAA4D;IACrD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAE,OAAc,GAAG,OAAO;IAGnF,6DAA6D;IACtD,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAG5C;;;;;;;;OAQG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG;IAc7B,+CAA+C;WACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,UAAU;IAK1D;;;OAGG;IACI,MAAM,IAAI,GAAG;IAGpB;;;OAGG;IACI,6BAA6B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAMhE;;;OAGG;IACI,0BAA0B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAI7D;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;CAGjD"}