@itwin/core-geometry 3.5.0-dev.35 → 3.5.0-dev.41

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 (173) hide show
  1. package/lib/cjs/Geometry.d.ts +13 -0
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/BSplineCurve.d.ts +1 -1
  5. package/lib/cjs/bspline/BSplineCurve.js +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/KnotVector.d.ts.map +1 -1
  8. package/lib/cjs/bspline/KnotVector.js +3 -0
  9. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  10. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +7 -5
  11. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +37 -29
  13. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  14. package/lib/cjs/curve/CurveCollection.d.ts +4 -2
  15. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveCollection.js +14 -2
  17. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  18. package/lib/cjs/curve/CurvePrimitive.d.ts +13 -17
  19. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  20. package/lib/cjs/curve/CurvePrimitive.js +51 -340
  21. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  22. package/lib/cjs/curve/LineString3d.d.ts +11 -1
  23. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  24. package/lib/cjs/curve/LineString3d.js +30 -23
  25. package/lib/cjs/curve/LineString3d.js.map +1 -1
  26. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +55 -0
  27. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -0
  28. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +143 -0
  29. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -0
  30. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts +43 -0
  31. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -0
  32. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +146 -0
  33. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -0
  34. package/lib/cjs/curve/internalContexts/CurveLengthContext.d.ts +33 -0
  35. package/lib/cjs/curve/internalContexts/CurveLengthContext.d.ts.map +1 -0
  36. package/lib/cjs/curve/internalContexts/CurveLengthContext.js +91 -0
  37. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -0
  38. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +21 -0
  39. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -0
  40. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +34 -0
  41. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -0
  42. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
  43. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  44. package/lib/cjs/curve/spiral/DirectSpiral3d.js +15 -8
  45. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  46. package/lib/cjs/geometry3d/Angle.d.ts +20 -10
  47. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  48. package/lib/cjs/geometry3d/Angle.js +30 -15
  49. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  50. package/lib/cjs/geometry3d/Matrix3d.d.ts +25 -8
  51. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  52. package/lib/cjs/geometry3d/Matrix3d.js +67 -15
  53. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  54. package/lib/cjs/geometry3d/Point2dVector2d.d.ts +23 -8
  55. package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
  56. package/lib/cjs/geometry3d/Point2dVector2d.js +40 -13
  57. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  58. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +90 -55
  59. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  60. package/lib/cjs/geometry3d/Point3dVector3d.js +254 -123
  61. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  62. package/lib/cjs/geometry3d/Range.d.ts +0 -1
  63. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  64. package/lib/cjs/geometry3d/Range.js +0 -1
  65. package/lib/cjs/geometry3d/Range.js.map +1 -1
  66. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  67. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  68. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  69. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  70. package/lib/cjs/serialization/IModelJsonSchema.d.ts +1 -1
  71. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  72. package/lib/cjs/serialization/IModelJsonSchema.js +4 -3
  73. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  74. package/lib/cjs/solid/Sphere.d.ts +1 -1
  75. package/lib/cjs/solid/Sphere.js +3 -3
  76. package/lib/cjs/solid/Sphere.js.map +1 -1
  77. package/lib/cjs/solid/TorusPipe.d.ts +17 -13
  78. package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
  79. package/lib/cjs/solid/TorusPipe.js +67 -38
  80. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  81. package/lib/cjs/topology/Graph.d.ts +1 -1
  82. package/lib/cjs/topology/Graph.js +1 -1
  83. package/lib/cjs/topology/Graph.js.map +1 -1
  84. package/lib/cjs/topology/Triangulation.d.ts +1 -1
  85. package/lib/cjs/topology/Triangulation.js +1 -1
  86. package/lib/cjs/topology/Triangulation.js.map +1 -1
  87. package/lib/esm/Geometry.d.ts +13 -0
  88. package/lib/esm/Geometry.d.ts.map +1 -1
  89. package/lib/esm/Geometry.js.map +1 -1
  90. package/lib/esm/bspline/BSplineCurve.d.ts +1 -1
  91. package/lib/esm/bspline/BSplineCurve.js +1 -1
  92. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  93. package/lib/esm/bspline/KnotVector.d.ts.map +1 -1
  94. package/lib/esm/bspline/KnotVector.js +3 -0
  95. package/lib/esm/bspline/KnotVector.js.map +1 -1
  96. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +7 -5
  97. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  98. package/lib/esm/curve/CurveChainWithDistanceIndex.js +37 -29
  99. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  100. package/lib/esm/curve/CurveCollection.d.ts +4 -2
  101. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  102. package/lib/esm/curve/CurveCollection.js +14 -2
  103. package/lib/esm/curve/CurveCollection.js.map +1 -1
  104. package/lib/esm/curve/CurvePrimitive.d.ts +13 -17
  105. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  106. package/lib/esm/curve/CurvePrimitive.js +46 -335
  107. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  108. package/lib/esm/curve/LineString3d.d.ts +11 -1
  109. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  110. package/lib/esm/curve/LineString3d.js +30 -23
  111. package/lib/esm/curve/LineString3d.js.map +1 -1
  112. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts +55 -0
  113. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.d.ts.map +1 -0
  114. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +139 -0
  115. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -0
  116. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts +43 -0
  117. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -0
  118. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +142 -0
  119. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -0
  120. package/lib/esm/curve/internalContexts/CurveLengthContext.d.ts +33 -0
  121. package/lib/esm/curve/internalContexts/CurveLengthContext.d.ts.map +1 -0
  122. package/lib/esm/curve/internalContexts/CurveLengthContext.js +87 -0
  123. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -0
  124. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts +21 -0
  125. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.d.ts.map +1 -0
  126. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +30 -0
  127. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -0
  128. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
  129. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  130. package/lib/esm/curve/spiral/DirectSpiral3d.js +15 -8
  131. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  132. package/lib/esm/geometry3d/Angle.d.ts +20 -10
  133. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  134. package/lib/esm/geometry3d/Angle.js +30 -15
  135. package/lib/esm/geometry3d/Angle.js.map +1 -1
  136. package/lib/esm/geometry3d/Matrix3d.d.ts +25 -8
  137. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  138. package/lib/esm/geometry3d/Matrix3d.js +67 -15
  139. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  140. package/lib/esm/geometry3d/Point2dVector2d.d.ts +23 -8
  141. package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
  142. package/lib/esm/geometry3d/Point2dVector2d.js +40 -13
  143. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  144. package/lib/esm/geometry3d/Point3dVector3d.d.ts +90 -55
  145. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  146. package/lib/esm/geometry3d/Point3dVector3d.js +254 -123
  147. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  148. package/lib/esm/geometry3d/Range.d.ts +0 -1
  149. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  150. package/lib/esm/geometry3d/Range.js +0 -1
  151. package/lib/esm/geometry3d/Range.js.map +1 -1
  152. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  153. package/lib/esm/geometry3d/Transform.js.map +1 -1
  154. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  155. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  156. package/lib/esm/serialization/IModelJsonSchema.d.ts +1 -1
  157. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  158. package/lib/esm/serialization/IModelJsonSchema.js +4 -3
  159. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  160. package/lib/esm/solid/Sphere.d.ts +1 -1
  161. package/lib/esm/solid/Sphere.js +3 -3
  162. package/lib/esm/solid/Sphere.js.map +1 -1
  163. package/lib/esm/solid/TorusPipe.d.ts +17 -13
  164. package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
  165. package/lib/esm/solid/TorusPipe.js +67 -38
  166. package/lib/esm/solid/TorusPipe.js.map +1 -1
  167. package/lib/esm/topology/Graph.d.ts +1 -1
  168. package/lib/esm/topology/Graph.js +1 -1
  169. package/lib/esm/topology/Graph.js.map +1 -1
  170. package/lib/esm/topology/Triangulation.d.ts +1 -1
  171. package/lib/esm/topology/Triangulation.js +1 -1
  172. package/lib/esm/topology/Triangulation.js.map +1 -1
  173. package/package.json +4 -4
@@ -7,15 +7,16 @@
7
7
  */
8
8
  import { Geometry } from "../../Geometry";
9
9
  import { Segment1d } from "../../geometry3d/Segment1d";
10
+ import { CurveLengthContext } from "../internalContexts/CurveLengthContext";
10
11
  import { LineString3d } from "../LineString3d";
11
12
  import { StrokeOptions } from "../StrokeOptions";
13
+ import { AustralianRailCorpXYEvaluator } from "./AustralianRailCorpXYEvaluator";
12
14
  import { ClothoidSeriesRLEvaluator } from "./ClothoidSeries";
13
15
  import { CzechSpiralEvaluator, ItalianSpiralEvaluator } from "./CzechSpiralEvaluator";
14
16
  import { DirectHalfCosineSpiralEvaluator } from "./DirectHalfCosineSpiralEvaluator";
15
- import { AustralianRailCorpXYEvaluator } from "./AustralianRailCorpXYEvaluator";
16
- import { TransitionSpiral3d } from "./TransitionSpiral3d";
17
17
  import { MXCubicAlongArcEvaluator } from "./MXCubicAlongArcSpiralEvaluator";
18
18
  import { PolishCubicEvaluator } from "./PolishCubicSpiralEvaluator";
19
+ import { TransitionSpiral3d } from "./TransitionSpiral3d";
19
20
  /**
20
21
  * DirectSpiral3d acts like a TransitionSpiral3d for serialization purposes, but implements spiral types that have "direct" xy calculations without the integrations required
21
22
  * for IntegratedSpiral3d.
@@ -366,13 +367,19 @@ export class DirectSpiral3d extends TransitionSpiral3d {
366
367
  const n = this.computeStrokeCountForOptions(options);
367
368
  const activeStrokes = this.activeStrokes;
368
369
  dest.startParentCurvePrimitive(this);
369
- if (n <= activeStrokes.numPoints()) {
370
- // this.activeStrokes.emitStrokableParts(dest, options);
371
- dest.announceIntervalForUniformStepStrokes(this, 2 * activeStrokes.numPoints(), 0.0, 1.0);
372
- }
373
- else {
374
- dest.announceIntervalForUniformStepStrokes(this, n, 0.0, 1.0);
370
+ // hack: specify the extended range so we can compute length of an extended spiral
371
+ let globalFraction0 = 0.0;
372
+ let globalFraction1 = 1.0;
373
+ if (dest instanceof CurveLengthContext) {
374
+ if (dest.getFraction0 < 0.0)
375
+ globalFraction0 = dest.getFraction0;
376
+ if (dest.getFraction1 > 1.0)
377
+ globalFraction1 = dest.getFraction1;
375
378
  }
379
+ if (n <= activeStrokes.numPoints())
380
+ dest.announceIntervalForUniformStepStrokes(this, 2 * activeStrokes.numPoints(), globalFraction0, globalFraction1);
381
+ else
382
+ dest.announceIntervalForUniformStepStrokes(this, n, globalFraction0, globalFraction1);
376
383
  dest.endParentCurvePrimitive(this);
377
384
  }
378
385
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DirectSpiral3d.js","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectSpiral3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\nimport { TransitionConditionalProperties } from \"./TransitionConditionalProperties\";\r\nimport { ClothoidSeriesRLEvaluator } from \"./ClothoidSeries\";\r\nimport { CzechSpiralEvaluator, ItalianSpiralEvaluator } from \"./CzechSpiralEvaluator\";\r\nimport { DirectHalfCosineSpiralEvaluator } from \"./DirectHalfCosineSpiralEvaluator\";\r\nimport { AustralianRailCorpXYEvaluator } from \"./AustralianRailCorpXYEvaluator\";\r\nimport { XYCurveEvaluator } from \"./XYCurveEvaluator\";\r\nimport { TransitionSpiral3d } from \"./TransitionSpiral3d\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { MXCubicAlongArcEvaluator } from \"./MXCubicAlongArcSpiralEvaluator\";\r\nimport { PolishCubicEvaluator } from \"./PolishCubicSpiralEvaluator\";\r\n/**\r\n* DirectSpiral3d acts like a TransitionSpiral3d for serialization purposes, but implements spiral types that have \"direct\" xy calculations without the integrations required\r\n* for IntegratedSpiral3d.\r\n* * Each DirectSpiral3d carries an XYCurveEvaluator to give it specialized behavior.\r\n* * Direct spirals that flow through serialization to native imodel02 are create with these static methods:\r\n* * createArema\r\n* * createJapaneseCubic\r\n* * createAustralianRail\r\n* * createDirectHalfCosine\r\n* * createChineseCubic\r\n* * createCzechCubic\r\n* * createPolishCubic\r\n* * createItalian\r\n* * createWesternAustralian\r\n* @public\r\n*/\r\nexport class DirectSpiral3d extends TransitionSpiral3d {\r\n\r\n /** String name for schema properties */\r\n\r\n public readonly curvePrimitiveType = \"transitionSpiral\";\r\n\r\n /** stroked approximation of entire spiral. This is AFTER the localToWorld transform ... */\r\n private _globalStrokes: LineString3d;\r\n /** stroked approximation of active spiral. This is AFTER the localToWorld transfomr ...\r\n * * Same count as global -- possibly overly fine, but it gives some consistency between same clothoid constructed as partial versus complete.\r\n * * If no trimming, this points to the same place as the _globalStrokes !!! Don't double transform!!!\r\n */\r\n private _activeStrokes?: LineString3d;\r\n /** Return the internal stroked form of the (possibly partial) spiral */\r\n public get activeStrokes(): LineString3d { return this._activeStrokes !== undefined ? this._activeStrokes : this._globalStrokes; }\r\n\r\n private _nominalL1: number;\r\n private _nominalR1: number;\r\n private _evaluator: XYCurveEvaluator;\r\n\r\n /** Return the nominal end radius. */\r\n public get nominalR1(): number { return this._nominalR1; }\r\n /** Return the nominal distance from inflection to endpoint. */\r\n public get nominalL1(): number { return this._nominalL1; }\r\n /** Return the nominal end curvature */\r\n public get nominalCurvature1(): number { return TransitionSpiral3d.radiusToCurvature(this._nominalR1); }\r\n /** Return the low level evaluator\r\n * @internal\r\n */\r\n public get evaluator(): XYCurveEvaluator { return this._evaluator; }\r\n\r\n // constructor demands radius1 and distance1 for nominal construction.\r\n // caller is responsible for managing intervals of partial spiral\r\n constructor(\r\n localToWorld: Transform,\r\n spiralType: string | undefined,\r\n originalProperties: TransitionConditionalProperties | undefined,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeFractionInterval: Segment1d | undefined,\r\n evaluator: XYCurveEvaluator) {\r\n super(spiralType, localToWorld, activeFractionInterval, originalProperties);\r\n this._nominalL1 = nominalL1;\r\n this._nominalR1 = nominalR1;\r\n this._evaluator = evaluator;\r\n this._globalStrokes = LineString3d.create();\r\n this._activeStrokes = LineString3d.create();\r\n // initialize for compiler -- but this will be recomputed in refreshComputeProperties ...\r\n this.refreshComputedProperties();\r\n }\r\n /**\r\n * Compute stroke data in an interval.\r\n * @param strokes strokes to clear and refill.\r\n * @param fraction0 start fraction\r\n * @param fraction1 end fraction\r\n */\r\n private computeStrokes(strokes: LineString3d, fractionA: number, fractionB: number, numInterval: number, applyLocalToWorld: boolean = true) {\r\n if (numInterval < 1)\r\n numInterval = 1;\r\n strokes.clear();\r\n strokes.ensureEmptyUVParams();\r\n strokes.ensureEmptyFractions();\r\n const distances = strokes.packedUVParams!;\r\n const nominalIntervalLength = Math.abs(fractionB - fractionA) * this._nominalL1;\r\n for (let i = 0; i <= numInterval; i++) {\r\n const fraction = Geometry.interpolate(fractionA, i / numInterval, fractionB);\r\n const nominalDistanceAlong = fraction * nominalIntervalLength;\r\n strokes.packedPoints.pushXYZ(this._evaluator.fractionToX(fraction),\r\n this._evaluator.fractionToY(fraction), 0);\r\n distances.pushXY(fraction, nominalDistanceAlong); // the second distance will be updated below\r\n }\r\n if (applyLocalToWorld)\r\n strokes.tryTransformInPlace (this._localToWorld);\r\n let fraction0 = distances.getXAtUncheckedPointIndex(0);\r\n let trueDistance0 = distances.getYAtUncheckedPointIndex(0); // whatever was assigned as start distance is fine\r\n let trueDistance1, fraction1;\r\n for (let i = 1; i <= numInterval; i++) {\r\n fraction1 = distances.getXAtUncheckedPointIndex(i);\r\n trueDistance1 = trueDistance0 + this._evaluator.integrateDistanceBetweenFractions(fraction0, fraction1);\r\n distances.setXYAtCheckedPointIndex(i, fraction1, trueDistance1);\r\n fraction0 = fraction1;\r\n trueDistance0 = trueDistance1;\r\n }\r\n\r\n }\r\n /** Recompute strokes */\r\n public override refreshComputedProperties() {\r\n const sweepRadians = this.nominalL1 / (2.0 * this.nominalR1);\r\n const radiansStep = 0.02;\r\n const numInterval = StrokeOptions.applyAngleTol(undefined, 4, sweepRadians, radiansStep);\r\n this.computeStrokes(this._globalStrokes, 0, 1, numInterval);\r\n const numActiveInterval = Math.ceil(this._activeFractionInterval.absoluteDelta() * numInterval);\r\n this._activeStrokes = LineString3d.create();\r\n this.computeStrokes(this._activeStrokes, this._activeFractionInterval.x0, this._activeFractionInterval.x1,\r\n numActiveInterval);\r\n }\r\n /**\r\n * Create a spiral object which uses numXTerm terms from the clothoid X series and numYTerm from the clothoid Y series.\r\n * @param numXTerm number of terms to use from X series\r\n * @param numYTerm number of terms to use from Y series\r\n * @param localToWorld placement frame. Inflection point is at origin, initial direction is along x axis.\r\n * @param nominalL1 design distance from inflection to end point.\r\n * @param nominalR1 design radius at end point.\r\n * @param activeInterval active interval (as fractions of nominalL1 !!!)\r\n */\r\n public static createTruncatedClothoid(\r\n spiralType: string,\r\n localToWorld: Transform,\r\n numXTerm: number, numYTerm: number,\r\n originalProperties: TransitionConditionalProperties | undefined,\r\n nominalL1: number, nominalR1: number,\r\n activeInterval: Segment1d | undefined): DirectSpiral3d | undefined {\r\n if (numXTerm < 1)\r\n numXTerm = 1;\r\n if (numYTerm < 1)\r\n numYTerm = 1;\r\n const evaluator = new ClothoidSeriesRLEvaluator(nominalL1, 1.0 / (2.0 * nominalL1 * nominalR1), numXTerm, numYTerm);\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n spiralType,\r\n originalProperties,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n /**\r\n * Create an Japanese spiral clothoid approximation\r\n * * X is 1 terms of the clothoid series as a function of nominal distance along.\r\n * * Y is 1 terms f the clothoid series as a function of nominal distance along.\r\n * * Remark: This is identical to the ChineseCubic\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createJapaneseCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"JapaneseCubic\", localToWorld, 1, 1, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create a czech cubic.\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * @param localToWorld\r\n * @param nominalLx nominal length along x axis\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createCzechCubic(\r\n localToWorld: Transform,\r\n nominalLx: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = CzechSpiralEvaluator.create(nominalLx, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"Czech\",\r\n undefined,\r\n nominalLx, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n /**\r\n * Create an italian spiral\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * * L in gamma and m is the\r\n * @param localToWorld\r\n * @param nominalL1 nominal length along the spiral\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createItalian(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = ItalianSpiralEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"Italian\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create an MX Cubic whose nominal length is close to along the curve.\r\n * This is y= m*x^3 with\r\n * * m is 1/ (6RL1)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * L1 is an along-the-x-axis distance that is slightly LESS THAN the nominal length\r\n * * x is axis position that is slightly LESS than nominal distance along\r\n * * L1, x use the approximation `x = s * ( 1 - s^4/ (40 R R L L))\r\n * @param localToWorld\r\n * @param nominalL1\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createMXCubicAlongArc(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = MXCubicAlongArcEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"MXCubicAlongArc\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create a polish cubic\r\n * This is y= m*x^3 with\r\n * * m is 1/ (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * L is nominal length\r\n * * R is nominal end radius.\r\n * * x ranges up to the x axis distance for which the polish distance series produces f(x)=L\r\n * * The support class PolishCubicEvaluator has static methods for the distance series and its inversion.\r\n */\r\n public static createPolishCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = PolishCubicEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"PolishCubic\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create an AustralianRailCorp spiral\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * @param localToWorld\r\n * @param nominalL1\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createAustralianRail(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = AustralianRailCorpXYEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"AustralianRailCorp\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n public static createDirectHalfCosine(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return new this(localToWorld, \"HalfCosine\", undefined, nominalL1, nominalR1, activeInterval,\r\n new DirectHalfCosineSpiralEvaluator(nominalL1, nominalR1));\r\n }\r\n /**\r\n * Create an Arema spiral clothoid approximation\r\n * * X is 2 terms of the clothoid series as a function of nominal distance along\r\n * * Y is 2 terms f the clothoid series as a function of nominal distance along\r\n * * Remark: This is identical to the ChineseCubic\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createArema(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"Arema\", localToWorld, 2, 2, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n\r\n /**\r\n * Create a Chinese clothoid approximation\r\n * * X is 2 terms of the clothoid series as a function of nominal distance along\r\n * * Y is 2 terms f the clothoid series as a function of nominal distance along\r\n * * Remark: This is identical to the Arema spiral\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createChineseCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"ChineseCubic\", localToWorld, 2, 2, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create a Western Australian direct spiral.\r\n * * X is 2 terms of the clothoid series as a function of distance along\r\n * * Y is 1 term (cubic in nominal distance along)\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createWesternAustralian(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"WesternAustralian\", localToWorld, 2, 1, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create (if possible) a DirectSpiral3d, applying various strict conditions appropriate to the spiral type.\r\n * The parameter list includes extraneous values in order to directly match IntegratedSpiral3d.create, which has greater flexibility about\r\n * mixtures of values.\r\n * * IMPORTANT RESTRICTIONS\r\n * * Direct spirals must have the inflection at the origin of their coordinate system, aligned with the x axis.\r\n * * hence bearing0 = 0\r\n * * hence radius0 = 0\r\n * * bearing1 is ignored\r\n * * radius1 must be given.\r\n * * arcLength must be given,\r\n * @param spiralType one of the types in `DirectSpiralTypeNames`\r\n * @param radius0 radius (or 0 for tangent to line) at start. Must be ZERO or UNDEFINED\r\n * @param radius1 radius (or 0 for tangent to line) at end.\r\n * @param bearing0 bearing, measured CCW from x axis at start. Must be ZERO or UNDEFINED\r\n * @param bearing1 bearing, measured CCW from x axis at end. IGNORED.\r\n * @param fractionInterval optional fractional interval for an \"active\" portion of the curve. if omitted, the full [0,1] is used.\r\n * @param localToWorld placement transform\r\n */\r\n public static createFromLengthAndRadius(\r\n spiralType: string,\r\n radius0: number | undefined,\r\n radius1: number | undefined,\r\n bearing0: Angle | undefined,\r\n _bearing1: Angle | undefined,\r\n arcLength: number | undefined,\r\n activeInterval: undefined | Segment1d,\r\n localToWorld: Transform): TransitionSpiral3d | undefined {\r\n if (bearing0 !== undefined && !bearing0.isAlmostZero)\r\n return undefined;\r\n if (radius0 !== undefined && !Geometry.isSmallMetricDistance(radius0))\r\n return undefined;\r\n if (radius1 === undefined || Geometry.isSmallMetricDistance(radius1))\r\n return undefined;\r\n if (arcLength === undefined)\r\n return undefined;\r\n if (Geometry.equalStringNoCase(spiralType, \"Arema\"))\r\n return this.createArema(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"ChineseCubic\"))\r\n return this.createChineseCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"JapaneseCubic\"))\r\n return this.createJapaneseCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"HalfCosine\"))\r\n return this.createDirectHalfCosine(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"Czech\"))\r\n return this.createCzechCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"Italian\"))\r\n return this.createItalian(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"AustralianRailCorp\"))\r\n return this.createAustralianRail(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"MXCubicAlongArc\"))\r\n return this.createMXCubicAlongArc(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"WesternAustralian\"))\r\n return this.createWesternAustralian(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"PolishCubic\"))\r\n return this.createPolishCubic(localToWorld, arcLength, radius1, activeInterval);\r\n return undefined;\r\n }\r\n /** Deep clone of this spiral */\r\n public override clone(): DirectSpiral3d {\r\n return new DirectSpiral3d(\r\n this.localToWorld.clone(),\r\n this._spiralType,\r\n this.designProperties?.clone(),\r\n this._nominalL1,\r\n this._nominalR1,\r\n this._activeFractionInterval?.clone(),\r\n this._evaluator.clone());\r\n }\r\n\r\n /** apply `transform` to this spiral's local to world transform. */\r\n public tryTransformInPlace(transformA: Transform): boolean {\r\n const rigidData = this.applyRigidPartOfTransform(transformA);\r\n if (rigidData !== undefined) {\r\n this._nominalL1 *= rigidData.scale;\r\n this._nominalR1 *= rigidData.scale;\r\n this.evaluator.scaleInPlace(rigidData.scale);\r\n }\r\n this.refreshComputedProperties();\r\n return true;\r\n }\r\n\r\n /** Return the spiral start point. */\r\n public override startPoint(): Point3d { return this.activeStrokes.startPoint(); }\r\n /** return the spiral end point. */\r\n public override endPoint(): Point3d { return this.activeStrokes.endPoint(); }\r\n /** test if the local to world transform places the spiral xy plane into `plane` */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return plane.isPointInPlane(this.localToWorld.origin as Point3d)\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnX(plane.getNormalRef()))\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnY(plane.getNormalRef()));\r\n }\r\n /** Return quick length of the spiral.\r\n * The tangent vector of a true clothoid is length 1 everywhere, so simple proportion of nominalL1 is a good approximation.\r\n */\r\n public quickLength() {\r\n const distanceData = this._globalStrokes.packedUVParams!;\r\n const n = distanceData.length;\r\n return distanceData.getYAtUncheckedPointIndex(n - 1);\r\n }\r\n /** Return length of the spiral.\r\n * * True length is stored at back of uvParams . . .\r\n */\r\n // use the generic integrator ... public override curveLength() { return this.quickLength(); }\r\n /** Test if `other` is an instance of `TransitionSpiral3d` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof DirectSpiral3d; }\r\n /** Add strokes from this spiral to `dest`.\r\n * * Linestrings will usually stroke as just their points.\r\n * * If maxEdgeLength is given, this will sub-stroke within the linestring -- not what we want.\r\n */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void { this.activeStrokes.emitStrokes(dest, options); }\r\n /** emit stroke fragments to `dest` handler. */\r\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\r\n const n = this.computeStrokeCountForOptions(options);\r\n const activeStrokes = this.activeStrokes;\r\n dest.startParentCurvePrimitive(this);\r\n if (n <= activeStrokes.numPoints()) {\r\n // this.activeStrokes.emitStrokableParts(dest, options);\r\n dest.announceIntervalForUniformStepStrokes(this, 2 * activeStrokes.numPoints(), 0.0, 1.0);\r\n } else {\r\n dest.announceIntervalForUniformStepStrokes(this, n, 0.0, 1.0);\r\n }\r\n dest.endParentCurvePrimitive(this);\r\n }\r\n\r\n /**\r\n * return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke;\r\n const nominalRadians = this._nominalL1 / (2.0 * this._nominalR1);\r\n if (options) {\r\n const rMin = Math.abs(this._nominalR1);\r\n numStroke = options.applyTolerancesToArc(rMin, nominalRadians);\r\n numStroke = options.applyMaxEdgeLength(numStroke, this.quickLength());\r\n numStroke = options.applyMinStrokesPerPrimitive(numStroke);\r\n } else {\r\n numStroke = StrokeOptions.applyAngleTol(undefined, 4, nominalRadians, 0.02);\r\n }\r\n numStroke = Math.ceil(this._activeFractionInterval.absoluteDelta() * numStroke);\r\n return numStroke;\r\n }\r\n\r\n /** Reverse the active interval and active strokes.\r\n * * Primary defining data remains unchanged !!!\r\n */\r\n\r\n public reverseInPlace(): void {\r\n this._activeFractionInterval.reverseInPlace();\r\n if (this._activeStrokes === undefined)\r\n this._activeStrokes = this._globalStrokes.clone();\r\n this._activeStrokes.reverseInPlace();\r\n }\r\n /** Evaluate curve point with respect to fraction. */\r\n public fractionToPoint(activeFraction: number, result?: Point3d): Point3d {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPoint(globalFraction, result);\r\n this.localToWorld.multiplyPoint3d(result, result);\r\n return result;\r\n }\r\n /** Evaluate curve point and derivative with respect to fraction. */\r\n public fractionToPointAndDerivative(activeFraction: number, result?: Ray3d): Ray3d {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPointAndDerivative(globalFraction, result);\r\n result.direction.scaleInPlace(this._activeFractionInterval.signedDelta());\r\n result.transformInPlace(this.localToWorld);\r\n return result;\r\n }\r\n\r\n /** Return a plane with\r\n *\r\n * * origin at fractional position along the curve\r\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to the fraction.\r\n * * vectorV is the second derivative, i.e.derivative of vectorU.\r\n */\r\n\r\n public fractionToPointAnd2Derivatives(activeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPointAnd2Derivatives(globalFraction, result);\r\n const a = this._activeFractionInterval.signedDelta();\r\n result.vectorU.scaleInPlace(a);\r\n result.vectorV.scaleInPlace(a * a);\r\n result.transformInPlace(this.localToWorld);\r\n return result;\r\n }\r\n /** Second step of double dispatch: call `handler.handleTransitionSpiral(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleTransitionSpiral(this);\r\n }\r\n /** compare various coordinate quantities */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof DirectSpiral3d) {\r\n return Geometry.isSameCoordinate(this._nominalL1, other._nominalL1)\r\n && Geometry.isSameCoordinate(this._nominalR1, other._nominalR1)\r\n && this.localToWorld.isAlmostEqual(other.localToWorld)\r\n && this._activeFractionInterval.isAlmostEqual(other._activeFractionInterval)\r\n && this._evaluator.isAlmostEqual(other._evaluator);\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DirectSpiral3d.js","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectSpiral3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { CurveLengthContext } from \"../internalContexts/CurveLengthContext\";\r\nimport { LineString3d } from \"../LineString3d\";\r\nimport { StrokeOptions } from \"../StrokeOptions\";\r\nimport { AustralianRailCorpXYEvaluator } from \"./AustralianRailCorpXYEvaluator\";\r\nimport { ClothoidSeriesRLEvaluator } from \"./ClothoidSeries\";\r\nimport { CzechSpiralEvaluator, ItalianSpiralEvaluator } from \"./CzechSpiralEvaluator\";\r\nimport { DirectHalfCosineSpiralEvaluator } from \"./DirectHalfCosineSpiralEvaluator\";\r\nimport { MXCubicAlongArcEvaluator } from \"./MXCubicAlongArcSpiralEvaluator\";\r\nimport { PolishCubicEvaluator } from \"./PolishCubicSpiralEvaluator\";\r\nimport { TransitionConditionalProperties } from \"./TransitionConditionalProperties\";\r\nimport { TransitionSpiral3d } from \"./TransitionSpiral3d\";\r\nimport { XYCurveEvaluator } from \"./XYCurveEvaluator\";\r\n\r\n/**\r\n* DirectSpiral3d acts like a TransitionSpiral3d for serialization purposes, but implements spiral types that have \"direct\" xy calculations without the integrations required\r\n* for IntegratedSpiral3d.\r\n* * Each DirectSpiral3d carries an XYCurveEvaluator to give it specialized behavior.\r\n* * Direct spirals that flow through serialization to native imodel02 are create with these static methods:\r\n* * createArema\r\n* * createJapaneseCubic\r\n* * createAustralianRail\r\n* * createDirectHalfCosine\r\n* * createChineseCubic\r\n* * createCzechCubic\r\n* * createPolishCubic\r\n* * createItalian\r\n* * createWesternAustralian\r\n* @public\r\n*/\r\nexport class DirectSpiral3d extends TransitionSpiral3d {\r\n\r\n /** String name for schema properties */\r\n\r\n public readonly curvePrimitiveType = \"transitionSpiral\";\r\n\r\n /** stroked approximation of entire spiral. This is AFTER the localToWorld transform ... */\r\n private _globalStrokes: LineString3d;\r\n /** stroked approximation of active spiral. This is AFTER the localToWorld transfomr ...\r\n * * Same count as global -- possibly overly fine, but it gives some consistency between same clothoid constructed as partial versus complete.\r\n * * If no trimming, this points to the same place as the _globalStrokes !!! Don't double transform!!!\r\n */\r\n private _activeStrokes?: LineString3d;\r\n /** Return the internal stroked form of the (possibly partial) spiral */\r\n public get activeStrokes(): LineString3d { return this._activeStrokes !== undefined ? this._activeStrokes : this._globalStrokes; }\r\n\r\n private _nominalL1: number;\r\n private _nominalR1: number;\r\n private _evaluator: XYCurveEvaluator;\r\n\r\n /** Return the nominal end radius. */\r\n public get nominalR1(): number { return this._nominalR1; }\r\n /** Return the nominal distance from inflection to endpoint. */\r\n public get nominalL1(): number { return this._nominalL1; }\r\n /** Return the nominal end curvature */\r\n public get nominalCurvature1(): number { return TransitionSpiral3d.radiusToCurvature(this._nominalR1); }\r\n /** Return the low level evaluator\r\n * @internal\r\n */\r\n public get evaluator(): XYCurveEvaluator { return this._evaluator; }\r\n\r\n // constructor demands radius1 and distance1 for nominal construction.\r\n // caller is responsible for managing intervals of partial spiral\r\n constructor(\r\n localToWorld: Transform,\r\n spiralType: string | undefined,\r\n originalProperties: TransitionConditionalProperties | undefined,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeFractionInterval: Segment1d | undefined,\r\n evaluator: XYCurveEvaluator) {\r\n super(spiralType, localToWorld, activeFractionInterval, originalProperties);\r\n this._nominalL1 = nominalL1;\r\n this._nominalR1 = nominalR1;\r\n this._evaluator = evaluator;\r\n this._globalStrokes = LineString3d.create();\r\n this._activeStrokes = LineString3d.create();\r\n // initialize for compiler -- but this will be recomputed in refreshComputeProperties ...\r\n this.refreshComputedProperties();\r\n }\r\n /**\r\n * Compute stroke data in an interval.\r\n * @param strokes strokes to clear and refill.\r\n * @param fraction0 start fraction\r\n * @param fraction1 end fraction\r\n */\r\n private computeStrokes(strokes: LineString3d, fractionA: number, fractionB: number, numInterval: number, applyLocalToWorld: boolean = true) {\r\n if (numInterval < 1)\r\n numInterval = 1;\r\n strokes.clear();\r\n strokes.ensureEmptyUVParams();\r\n strokes.ensureEmptyFractions();\r\n const distances = strokes.packedUVParams!;\r\n const nominalIntervalLength = Math.abs(fractionB - fractionA) * this._nominalL1;\r\n for (let i = 0; i <= numInterval; i++) {\r\n const fraction = Geometry.interpolate(fractionA, i / numInterval, fractionB);\r\n const nominalDistanceAlong = fraction * nominalIntervalLength;\r\n strokes.packedPoints.pushXYZ(this._evaluator.fractionToX(fraction),\r\n this._evaluator.fractionToY(fraction), 0);\r\n distances.pushXY(fraction, nominalDistanceAlong); // the second distance will be updated below\r\n }\r\n if (applyLocalToWorld)\r\n strokes.tryTransformInPlace (this._localToWorld);\r\n let fraction0 = distances.getXAtUncheckedPointIndex(0);\r\n let trueDistance0 = distances.getYAtUncheckedPointIndex(0); // whatever was assigned as start distance is fine\r\n let trueDistance1, fraction1;\r\n for (let i = 1; i <= numInterval; i++) {\r\n fraction1 = distances.getXAtUncheckedPointIndex(i);\r\n trueDistance1 = trueDistance0 + this._evaluator.integrateDistanceBetweenFractions(fraction0, fraction1);\r\n distances.setXYAtCheckedPointIndex(i, fraction1, trueDistance1);\r\n fraction0 = fraction1;\r\n trueDistance0 = trueDistance1;\r\n }\r\n\r\n }\r\n /** Recompute strokes */\r\n public override refreshComputedProperties() {\r\n const sweepRadians = this.nominalL1 / (2.0 * this.nominalR1);\r\n const radiansStep = 0.02;\r\n const numInterval = StrokeOptions.applyAngleTol(undefined, 4, sweepRadians, radiansStep);\r\n this.computeStrokes(this._globalStrokes, 0, 1, numInterval);\r\n const numActiveInterval = Math.ceil(this._activeFractionInterval.absoluteDelta() * numInterval);\r\n this._activeStrokes = LineString3d.create();\r\n this.computeStrokes(this._activeStrokes, this._activeFractionInterval.x0, this._activeFractionInterval.x1,\r\n numActiveInterval);\r\n }\r\n /**\r\n * Create a spiral object which uses numXTerm terms from the clothoid X series and numYTerm from the clothoid Y series.\r\n * @param numXTerm number of terms to use from X series\r\n * @param numYTerm number of terms to use from Y series\r\n * @param localToWorld placement frame. Inflection point is at origin, initial direction is along x axis.\r\n * @param nominalL1 design distance from inflection to end point.\r\n * @param nominalR1 design radius at end point.\r\n * @param activeInterval active interval (as fractions of nominalL1 !!!)\r\n */\r\n public static createTruncatedClothoid(\r\n spiralType: string,\r\n localToWorld: Transform,\r\n numXTerm: number, numYTerm: number,\r\n originalProperties: TransitionConditionalProperties | undefined,\r\n nominalL1: number, nominalR1: number,\r\n activeInterval: Segment1d | undefined): DirectSpiral3d | undefined {\r\n if (numXTerm < 1)\r\n numXTerm = 1;\r\n if (numYTerm < 1)\r\n numYTerm = 1;\r\n const evaluator = new ClothoidSeriesRLEvaluator(nominalL1, 1.0 / (2.0 * nominalL1 * nominalR1), numXTerm, numYTerm);\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n spiralType,\r\n originalProperties,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n /**\r\n * Create an Japanese spiral clothoid approximation\r\n * * X is 1 terms of the clothoid series as a function of nominal distance along.\r\n * * Y is 1 terms f the clothoid series as a function of nominal distance along.\r\n * * Remark: This is identical to the ChineseCubic\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createJapaneseCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"JapaneseCubic\", localToWorld, 1, 1, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create a czech cubic.\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * @param localToWorld\r\n * @param nominalLx nominal length along x axis\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createCzechCubic(\r\n localToWorld: Transform,\r\n nominalLx: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = CzechSpiralEvaluator.create(nominalLx, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"Czech\",\r\n undefined,\r\n nominalLx, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n /**\r\n * Create an italian spiral\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * * L in gamma and m is the\r\n * @param localToWorld\r\n * @param nominalL1 nominal length along the spiral\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createItalian(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = ItalianSpiralEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"Italian\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create an MX Cubic whose nominal length is close to along the curve.\r\n * This is y= m*x^3 with\r\n * * m is 1/ (6RL1)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * L1 is an along-the-x-axis distance that is slightly LESS THAN the nominal length\r\n * * x is axis position that is slightly LESS than nominal distance along\r\n * * L1, x use the approximation `x = s * ( 1 - s^4/ (40 R R L L))\r\n * @param localToWorld\r\n * @param nominalL1\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createMXCubicAlongArc(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = MXCubicAlongArcEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"MXCubicAlongArc\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create a polish cubic\r\n * This is y= m*x^3 with\r\n * * m is 1/ (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * L is nominal length\r\n * * R is nominal end radius.\r\n * * x ranges up to the x axis distance for which the polish distance series produces f(x)=L\r\n * * The support class PolishCubicEvaluator has static methods for the distance series and its inversion.\r\n */\r\n public static createPolishCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = PolishCubicEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"PolishCubic\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n /**\r\n * Create an AustralianRailCorp spiral\r\n * This is y= m*x^3 with\r\n * * x any point on the x axis\r\n * * `fraction` along the spiral goes to `x = fraction * L`\r\n * * m is gamma / (6RL)\r\n * * 1/(6RL) is the leading term of the sine series.\r\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y up a little bit to simulate the lost series terms.\r\n * @param localToWorld\r\n * @param nominalL1\r\n * @param nominalR1\r\n * @param activeInterval\r\n */\r\n public static createAustralianRail(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n const evaluator = AustralianRailCorpXYEvaluator.create(nominalL1, nominalR1);\r\n if (evaluator === undefined)\r\n return undefined;\r\n return new DirectSpiral3d(\r\n localToWorld.clone(),\r\n \"AustralianRailCorp\",\r\n undefined,\r\n nominalL1, nominalR1,\r\n activeInterval ? activeInterval.clone() : Segment1d.create(0, 1), evaluator);\r\n }\r\n\r\n public static createDirectHalfCosine(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return new this(localToWorld, \"HalfCosine\", undefined, nominalL1, nominalR1, activeInterval,\r\n new DirectHalfCosineSpiralEvaluator(nominalL1, nominalR1));\r\n }\r\n /**\r\n * Create an Arema spiral clothoid approximation\r\n * * X is 2 terms of the clothoid series as a function of nominal distance along\r\n * * Y is 2 terms f the clothoid series as a function of nominal distance along\r\n * * Remark: This is identical to the ChineseCubic\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createArema(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"Arema\", localToWorld, 2, 2, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n\r\n /**\r\n * Create a Chinese clothoid approximation\r\n * * X is 2 terms of the clothoid series as a function of nominal distance along\r\n * * Y is 2 terms f the clothoid series as a function of nominal distance along\r\n * * Remark: This is identical to the Arema spiral\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createChineseCubic(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"ChineseCubic\", localToWorld, 2, 2, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create a Western Australian direct spiral.\r\n * * X is 2 terms of the clothoid series as a function of distance along\r\n * * Y is 1 term (cubic in nominal distance along)\r\n * @param localToWorld axes with inflection at origin, tangent along x axis\r\n * @param nominalL1 nominal length as used in series LR terms.\r\n * @param nominalR1 nominal final radius as used in series LR terms\r\n * @param activeInterval fractional interval with (0, nominalL1) range for nominal distance along\r\n */\r\n public static createWesternAustralian(\r\n localToWorld: Transform,\r\n nominalL1: number,\r\n nominalR1: number,\r\n activeInterval?: Segment1d): DirectSpiral3d | undefined {\r\n return this.createTruncatedClothoid(\"WesternAustralian\", localToWorld, 2, 1, undefined, nominalL1, nominalR1, activeInterval);\r\n }\r\n /**\r\n * Create (if possible) a DirectSpiral3d, applying various strict conditions appropriate to the spiral type.\r\n * The parameter list includes extraneous values in order to directly match IntegratedSpiral3d.create, which has greater flexibility about\r\n * mixtures of values.\r\n * * IMPORTANT RESTRICTIONS\r\n * * Direct spirals must have the inflection at the origin of their coordinate system, aligned with the x axis.\r\n * * hence bearing0 = 0\r\n * * hence radius0 = 0\r\n * * bearing1 is ignored\r\n * * radius1 must be given.\r\n * * arcLength must be given,\r\n * @param spiralType one of the types in `DirectSpiralTypeNames`\r\n * @param radius0 radius (or 0 for tangent to line) at start. Must be ZERO or UNDEFINED\r\n * @param radius1 radius (or 0 for tangent to line) at end.\r\n * @param bearing0 bearing, measured CCW from x axis at start. Must be ZERO or UNDEFINED\r\n * @param bearing1 bearing, measured CCW from x axis at end. IGNORED.\r\n * @param fractionInterval optional fractional interval for an \"active\" portion of the curve. if omitted, the full [0,1] is used.\r\n * @param localToWorld placement transform\r\n */\r\n public static createFromLengthAndRadius(\r\n spiralType: string,\r\n radius0: number | undefined,\r\n radius1: number | undefined,\r\n bearing0: Angle | undefined,\r\n _bearing1: Angle | undefined,\r\n arcLength: number | undefined,\r\n activeInterval: undefined | Segment1d,\r\n localToWorld: Transform): TransitionSpiral3d | undefined {\r\n if (bearing0 !== undefined && !bearing0.isAlmostZero)\r\n return undefined;\r\n if (radius0 !== undefined && !Geometry.isSmallMetricDistance(radius0))\r\n return undefined;\r\n if (radius1 === undefined || Geometry.isSmallMetricDistance(radius1))\r\n return undefined;\r\n if (arcLength === undefined)\r\n return undefined;\r\n if (Geometry.equalStringNoCase(spiralType, \"Arema\"))\r\n return this.createArema(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"ChineseCubic\"))\r\n return this.createChineseCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"JapaneseCubic\"))\r\n return this.createJapaneseCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"HalfCosine\"))\r\n return this.createDirectHalfCosine(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"Czech\"))\r\n return this.createCzechCubic(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"Italian\"))\r\n return this.createItalian(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"AustralianRailCorp\"))\r\n return this.createAustralianRail(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"MXCubicAlongArc\"))\r\n return this.createMXCubicAlongArc(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"WesternAustralian\"))\r\n return this.createWesternAustralian(localToWorld, arcLength, radius1, activeInterval);\r\n if (Geometry.equalStringNoCase(spiralType, \"PolishCubic\"))\r\n return this.createPolishCubic(localToWorld, arcLength, radius1, activeInterval);\r\n return undefined;\r\n }\r\n /** Deep clone of this spiral */\r\n public override clone(): DirectSpiral3d {\r\n return new DirectSpiral3d(\r\n this.localToWorld.clone(),\r\n this._spiralType,\r\n this.designProperties?.clone(),\r\n this._nominalL1,\r\n this._nominalR1,\r\n this._activeFractionInterval?.clone(),\r\n this._evaluator.clone());\r\n }\r\n\r\n /** apply `transform` to this spiral's local to world transform. */\r\n public tryTransformInPlace(transformA: Transform): boolean {\r\n const rigidData = this.applyRigidPartOfTransform(transformA);\r\n if (rigidData !== undefined) {\r\n this._nominalL1 *= rigidData.scale;\r\n this._nominalR1 *= rigidData.scale;\r\n this.evaluator.scaleInPlace(rigidData.scale);\r\n }\r\n this.refreshComputedProperties();\r\n return true;\r\n }\r\n\r\n /** Return the spiral start point. */\r\n public override startPoint(): Point3d { return this.activeStrokes.startPoint(); }\r\n /** return the spiral end point. */\r\n public override endPoint(): Point3d { return this.activeStrokes.endPoint(); }\r\n /** test if the local to world transform places the spiral xy plane into `plane` */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return plane.isPointInPlane(this.localToWorld.origin as Point3d)\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnX(plane.getNormalRef()))\r\n && Geometry.isSameCoordinate(0.0, this.localToWorld.matrix.dotColumnY(plane.getNormalRef()));\r\n }\r\n /** Return quick length of the spiral.\r\n * The tangent vector of a true clothoid is length 1 everywhere, so simple proportion of nominalL1 is a good approximation.\r\n */\r\n public quickLength() {\r\n const distanceData = this._globalStrokes.packedUVParams!;\r\n const n = distanceData.length;\r\n return distanceData.getYAtUncheckedPointIndex(n - 1);\r\n }\r\n /** Return length of the spiral.\r\n * * True length is stored at back of uvParams . . .\r\n */\r\n // use the generic integrator ... public override curveLength() { return this.quickLength(); }\r\n /** Test if `other` is an instance of `TransitionSpiral3d` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof DirectSpiral3d; }\r\n /** Add strokes from this spiral to `dest`.\r\n * * Linestrings will usually stroke as just their points.\r\n * * If maxEdgeLength is given, this will sub-stroke within the linestring -- not what we want.\r\n */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void { this.activeStrokes.emitStrokes(dest, options); }\r\n /** emit stroke fragments to `dest` handler. */\r\n public emitStrokableParts(dest: IStrokeHandler, options?: StrokeOptions): void {\r\n const n = this.computeStrokeCountForOptions(options);\r\n const activeStrokes = this.activeStrokes;\r\n dest.startParentCurvePrimitive(this);\r\n\r\n // hack: specify the extended range so we can compute length of an extended spiral\r\n let globalFraction0 = 0.0;\r\n let globalFraction1 = 1.0;\r\n if (dest instanceof CurveLengthContext) {\r\n if (dest.getFraction0 < 0.0)\r\n globalFraction0 = dest.getFraction0;\r\n if (dest.getFraction1 > 1.0)\r\n globalFraction1 = dest.getFraction1;\r\n }\r\n\r\n if (n <= activeStrokes.numPoints())\r\n dest.announceIntervalForUniformStepStrokes(this, 2 * activeStrokes.numPoints(), globalFraction0, globalFraction1);\r\n else\r\n dest.announceIntervalForUniformStepStrokes(this, n, globalFraction0, globalFraction1);\r\n\r\n dest.endParentCurvePrimitive(this);\r\n }\r\n\r\n /**\r\n * return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke;\r\n const nominalRadians = this._nominalL1 / (2.0 * this._nominalR1);\r\n if (options) {\r\n const rMin = Math.abs(this._nominalR1);\r\n numStroke = options.applyTolerancesToArc(rMin, nominalRadians);\r\n numStroke = options.applyMaxEdgeLength(numStroke, this.quickLength());\r\n numStroke = options.applyMinStrokesPerPrimitive(numStroke);\r\n } else {\r\n numStroke = StrokeOptions.applyAngleTol(undefined, 4, nominalRadians, 0.02);\r\n }\r\n numStroke = Math.ceil(this._activeFractionInterval.absoluteDelta() * numStroke);\r\n return numStroke;\r\n }\r\n\r\n /** Reverse the active interval and active strokes.\r\n * * Primary defining data remains unchanged !!!\r\n */\r\n\r\n public reverseInPlace(): void {\r\n this._activeFractionInterval.reverseInPlace();\r\n if (this._activeStrokes === undefined)\r\n this._activeStrokes = this._globalStrokes.clone();\r\n this._activeStrokes.reverseInPlace();\r\n }\r\n /** Evaluate curve point with respect to fraction. */\r\n public fractionToPoint(activeFraction: number, result?: Point3d): Point3d {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPoint(globalFraction, result);\r\n this.localToWorld.multiplyPoint3d(result, result);\r\n return result;\r\n }\r\n /** Evaluate curve point and derivative with respect to fraction. */\r\n public fractionToPointAndDerivative(activeFraction: number, result?: Ray3d): Ray3d {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPointAndDerivative(globalFraction, result);\r\n result.direction.scaleInPlace(this._activeFractionInterval.signedDelta());\r\n result.transformInPlace(this.localToWorld);\r\n return result;\r\n }\r\n\r\n /** Return a plane with\r\n *\r\n * * origin at fractional position along the curve\r\n * * vectorU is the first derivative, i.e. tangent vector with length equal to the rate of change with respect to the fraction.\r\n * * vectorV is the second derivative, i.e.derivative of vectorU.\r\n */\r\n\r\n public fractionToPointAnd2Derivatives(activeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined {\r\n const globalFraction = this._activeFractionInterval.fractionToPoint(activeFraction);\r\n result = this._evaluator.fractionToPointAnd2Derivatives(globalFraction, result);\r\n const a = this._activeFractionInterval.signedDelta();\r\n result.vectorU.scaleInPlace(a);\r\n result.vectorV.scaleInPlace(a * a);\r\n result.transformInPlace(this.localToWorld);\r\n return result;\r\n }\r\n /** Second step of double dispatch: call `handler.handleTransitionSpiral(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleTransitionSpiral(this);\r\n }\r\n /** compare various coordinate quantities */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof DirectSpiral3d) {\r\n return Geometry.isSameCoordinate(this._nominalL1, other._nominalL1)\r\n && Geometry.isSameCoordinate(this._nominalR1, other._nominalR1)\r\n && this.localToWorld.isAlmostEqual(other.localToWorld)\r\n && this._activeFractionInterval.isAlmostEqual(other._activeFractionInterval)\r\n && this._evaluator.isAlmostEqual(other._evaluator);\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
@@ -152,25 +152,35 @@ export declare class Angle implements BeJSONFunctions {
152
152
  * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)
153
153
  * @param radiansA first radians value
154
154
  * @param radiansB second radians value
155
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
155
156
  */
156
- static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number): boolean;
157
+ static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number, radianTol?: number): boolean;
157
158
  /**
158
- * Test if this angle and other are equivalent, allowing shift by full circle (i.e. by a multiple of 360 degrees)
159
+ * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).
160
+ * @param other the other angle
161
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
159
162
  */
160
- isAlmostEqualAllowPeriodShift(other: Angle): boolean;
163
+ isAlmostEqualAllowPeriodShift(other: Angle, radianTol?: number): boolean;
161
164
  /**
162
- * Test if two this angle and other are almost equal, NOT allowing shift by full circle multiples of 360 degrees.
165
+ * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
166
+ * @param radiansA first radians value
167
+ * @param radiansB second radians value
168
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
163
169
  */
164
- isAlmostEqualNoPeriodShift(other: Angle): boolean;
170
+ static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number, radianTol?: number): boolean;
165
171
  /**
166
- * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.
167
- * * (Same test as isAlmostEqualRadiansNoPeriodShift)
172
+ * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
173
+ * @param other the other angle
174
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
168
175
  */
169
- isAlmostEqual(other: Angle): boolean;
176
+ isAlmostEqualNoPeriodShift(other: Angle, radianTol?: number): boolean;
170
177
  /**
171
- * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.
178
+ * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
179
+ * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.
180
+ * @param other the other angle
181
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
172
182
  */
173
- static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number): boolean;
183
+ isAlmostEqual(other: Angle, radianTol?: number): boolean;
174
184
  /**
175
185
  * Test if dot product values indicate non-zero length perpendicular vectors.
176
186
  * @param dotUU dot product of vectorU with itself
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
@@ -243,38 +243,53 @@ export class Angle {
243
243
  * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)
244
244
  * @param radiansA first radians value
245
245
  * @param radiansB second radians value
246
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
246
247
  */
247
- static isAlmostEqualRadiansAllowPeriodShift(radiansA, radiansB) {
248
- // try to get simple conclusions with un-shifted radians ...
248
+ static isAlmostEqualRadiansAllowPeriodShift(radiansA, radiansB, radianTol = Geometry.smallAngleRadians) {
249
249
  const delta = Math.abs(radiansA - radiansB);
250
- if (delta <= Geometry.smallAngleRadians)
250
+ if (delta <= radianTol)
251
251
  return true;
252
252
  const period = Math.PI * 2.0;
253
- if (Math.abs(delta - period) <= Geometry.smallAngleRadians)
253
+ if (Math.abs(delta - period) <= radianTol)
254
254
  return true;
255
255
  const numPeriod = Math.round(delta / period);
256
256
  const delta1 = delta - numPeriod * period;
257
- return Math.abs(delta1) <= Geometry.smallAngleRadians;
257
+ return Math.abs(delta1) <= radianTol;
258
258
  }
259
259
  /**
260
- * Test if this angle and other are equivalent, allowing shift by full circle (i.e. by a multiple of 360 degrees)
260
+ * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).
261
+ * @param other the other angle
262
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
261
263
  */
262
- isAlmostEqualAllowPeriodShift(other) {
263
- return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians);
264
+ isAlmostEqualAllowPeriodShift(other, radianTol = Geometry.smallAngleRadians) {
265
+ return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians, radianTol);
264
266
  }
265
267
  /**
266
- * Test if two this angle and other are almost equal, NOT allowing shift by full circle multiples of 360 degrees.
268
+ * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
269
+ * @param radiansA first radians value
270
+ * @param radiansB second radians value
271
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
267
272
  */
268
- isAlmostEqualNoPeriodShift(other) { return Math.abs(this._radians - other._radians) < Geometry.smallAngleRadians; }
273
+ static isAlmostEqualRadiansNoPeriodShift(radiansA, radiansB, radianTol = Geometry.smallAngleRadians) {
274
+ return Math.abs(radiansA - radiansB) < radianTol;
275
+ }
269
276
  /**
270
- * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.
271
- * * (Same test as isAlmostEqualRadiansNoPeriodShift)
277
+ * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
278
+ * @param other the other angle
279
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
272
280
  */
273
- isAlmostEqual(other) { return this.isAlmostEqualNoPeriodShift(other); }
281
+ isAlmostEqualNoPeriodShift(other, radianTol = Geometry.smallAngleRadians) {
282
+ return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians, other._radians, radianTol);
283
+ }
274
284
  /**
275
- * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.
285
+ * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).
286
+ * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.
287
+ * @param other the other angle
288
+ * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians
276
289
  */
277
- static isAlmostEqualRadiansNoPeriodShift(radiansA, radiansB) { return Math.abs(radiansA - radiansB) < Geometry.smallAngleRadians; }
290
+ isAlmostEqual(other, radianTol = Geometry.smallAngleRadians) {
291
+ return this.isAlmostEqualNoPeriodShift(other, radianTol);
292
+ }
278
293
  /**
279
294
  * Test if dot product values indicate non-zero length perpendicular vectors.
280
295
  * @param dotUU dot product of vectorU with itself
@@ -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 be clear about whether their angle is degrees or radians.\r\n * * The numeric value is private, and callers should not know or care whether it is in degrees or radians.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or out are degrees or radians.\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/4 ( 45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.85398163397448280000e-001;\r\n /** maximal accuracy value of pi/2 ( 90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.57079632679489660000e+000;\r\n /** maximal accuracy value of pi ( 180 degrees), in radians */\r\n public static readonly piRadians = 3.14159265358979310000e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.28318530717958620000e+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 /** maximal accuracy value of pi/12 ( 15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914943653855361527329;\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) { this._radians = radians; this._degrees = degrees; }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle { return new Angle(this._radians, this._degrees); }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { 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) { return new Angle(Angle.degreesToRadians(degrees), degrees); }\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) { return new Angle(radians); }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs\r\n * @param radians angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: 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) { 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) { this._radians = radians; this._degrees = undefined; }\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) { this._radians = Angle.degreesToRadians(degrees); this._degrees = degrees; }\r\n /** Create an angle for a full circle. */\r\n public static create360() { return new Angle(Math.PI * 2.0, 360.0); }\r\n /**\r\n * @return a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in determining the (otherwise ambiguous)\r\n * 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 { return new Angle(Math.atan2(numerator, denominator)); }\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) { this._radians = other._radians; this._degrees = other._degrees; }\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 /**\r\n * set an Angle from a JSON object\r\n * * A simple number is 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 /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps { return this.degrees; }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps { return { radians: this.radians }; }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number { return this._radians; }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number { return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians); }\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) { return degrees * Math.PI / 180; }\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 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 /**\r\n * Return the cosine of this Angle object's angle.\r\n */\r\n public cos(): number { return Math.cos(this._radians); }\r\n /**\r\n * Return the sine of this Angle object's angle.\r\n */\r\n public sin(): number { return Math.sin(this._radians); }\r\n /**\r\n * Return the tangent of this Angle object's angle.\r\n */\r\n public tan(): number { return Math.tan(this._radians); }\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 complete 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 aa full circle */\r\n public get isFullCircle(): boolean { 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 { return Angle.isHalfCircleRadians(this._radians); }\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 radians1 = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians1;\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 const radians1 = Angle.adjustRadians0To2Pi(-radians);\r\n return Math.PI * 2.0 - radians1;\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() { return new Angle(0); }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero() { return this.radians === 0; }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero() { return Math.abs(this.radians) < Geometry.smallAngleRadians; }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole() { 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 { return Angle.createDegrees(Angle.adjustDegrees0To360(degrees)); }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees)); }\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 */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number): boolean {\r\n // try to get simple conclusions with un-shifted radians ...\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= Geometry.smallAngleRadians)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= Geometry.smallAngleRadians)\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) <= Geometry.smallAngleRadians;\r\n }\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e. by a multiple of 360 degrees)\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle multiples of 360 degrees.\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle): boolean { return Math.abs(this._radians - other._radians) < Geometry.smallAngleRadians; }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n * * (Same test as isAlmostEqualRadiansNoPeriodShift)\r\n */\r\n public isAlmostEqual(other: Angle): boolean { return this.isAlmostEqualNoPeriodShift(other); }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle multiples of `2 * PI`.\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number): boolean { return Math.abs(radiansA - radiansB) < Geometry.smallAngleRadians; }\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 * Return cosine, sine, and radians for the half angle of a cosine,sine pair.\r\n * @param rCos2A cosine value (scaled by radius) for initial angle.\r\n * @param rSin2A sine value (scaled by radius) for final angle.\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 };\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 2 divides to the whole process, but improves*/\r\n /* both the usefulness and robustness of the computation.*/\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) {\r\n /* Original angle in NE and SE quadrants. Half angle in same quadrant */\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A));\r\n sinA = sin2A / (2.0 * (cosA));\r\n } else {\r\n if (sin2A > 0.0) {\r\n /* Original angle in NW quadrant. Half angle in NE quadrant */\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A));\r\n } else {\r\n /* Original angle in SW quadrant. Half angle in SE quadrant*/\r\n /* cosA comes out positive because both sines are negative. */\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A));\r\n }\r\n cosA = sin2A / (2.0 * (sinA));\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 = 1.0e-15): 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 given dot products between 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 dotProductsToHalfAngleTrigValues(dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true): TrigValues {\r\n const rCos = dotUU - dotVV;\r\n const rSin = 2.0 * dotUV;\r\n if (favorZero && Math.abs(rSin) < 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(rCos, rSin);\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 *\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(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number): number {\r\n // const uu = ux * ux + uy * uy + uz * uz;\r\n const uDotV = ux * vx + uy * vy + uz * vz; // magU magV cos(theta)\r\n // const vv = vx * vx + vy * vy + vz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\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 be clear about whether their angle is degrees or radians.\r\n * * The numeric value is private, and callers should not know or care whether it is in degrees or radians.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or out are degrees or radians.\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/4 ( 45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.85398163397448280000e-001;\r\n /** maximal accuracy value of pi/2 ( 90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.57079632679489660000e+000;\r\n /** maximal accuracy value of pi ( 180 degrees), in radians */\r\n public static readonly piRadians = 3.14159265358979310000e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.28318530717958620000e+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 /** maximal accuracy value of pi/12 ( 15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914943653855361527329;\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) { this._radians = radians; this._degrees = degrees; }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle { return new Angle(this._radians, this._degrees); }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> { 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) { return new Angle(Angle.degreesToRadians(degrees), degrees); }\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) { return new Angle(radians); }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs\r\n * @param radians angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: 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) { 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) { this._radians = radians; this._degrees = undefined; }\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) { this._radians = Angle.degreesToRadians(degrees); this._degrees = degrees; }\r\n /** Create an angle for a full circle. */\r\n public static create360() { return new Angle(Math.PI * 2.0, 360.0); }\r\n /**\r\n * @return a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in determining the (otherwise ambiguous)\r\n * 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 { return new Angle(Math.atan2(numerator, denominator)); }\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) { this._radians = other._radians; this._degrees = other._degrees; }\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 /**\r\n * set an Angle from a JSON object\r\n * * A simple number is 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 /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps { return this.degrees; }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps { return { radians: this.radians }; }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number { return this._radians; }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number { return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians); }\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) { return degrees * Math.PI / 180; }\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 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 /**\r\n * Return the cosine of this Angle object's angle.\r\n */\r\n public cos(): number { return Math.cos(this._radians); }\r\n /**\r\n * Return the sine of this Angle object's angle.\r\n */\r\n public sin(): number { return Math.sin(this._radians); }\r\n /**\r\n * Return the tangent of this Angle object's angle.\r\n */\r\n public tan(): number { return Math.tan(this._radians); }\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 complete 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 aa full circle */\r\n public get isFullCircle(): boolean { 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 { return Angle.isHalfCircleRadians(this._radians); }\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 radians1 = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians1;\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 const radians1 = Angle.adjustRadians0To2Pi(-radians);\r\n return Math.PI * 2.0 - radians1;\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() { return new Angle(0); }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero() { return this.radians === 0; }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero() { return Math.abs(this.radians) < Geometry.smallAngleRadians; }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole() { 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 { return Angle.createDegrees(Angle.adjustDegrees0To360(degrees)); }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle { return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees)); }\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 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 * Return cosine, sine, and radians for the half angle of a cosine,sine pair.\r\n * @param rCos2A cosine value (scaled by radius) for initial angle.\r\n * @param rSin2A sine value (scaled by radius) for final angle.\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 };\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 2 divides to the whole process, but improves*/\r\n /* both the usefulness and robustness of the computation.*/\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) {\r\n /* Original angle in NE and SE quadrants. Half angle in same quadrant */\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A));\r\n sinA = sin2A / (2.0 * (cosA));\r\n } else {\r\n if (sin2A > 0.0) {\r\n /* Original angle in NW quadrant. Half angle in NE quadrant */\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A));\r\n } else {\r\n /* Original angle in SW quadrant. Half angle in SE quadrant*/\r\n /* cosA comes out positive because both sines are negative. */\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A));\r\n }\r\n cosA = sin2A / (2.0 * (sinA));\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 = 1.0e-15): 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 given dot products between 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 dotProductsToHalfAngleTrigValues(dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true): TrigValues {\r\n const rCos = dotUU - dotVV;\r\n const rSin = 2.0 * dotUV;\r\n if (favorZero && Math.abs(rSin) < 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(rCos, rSin);\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 *\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(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number): number {\r\n // const uu = ux * ux + uy * uy + uz * uz;\r\n const uDotV = ux * vx + uy * vy + uz * vz; // magU magV cos(theta)\r\n // const vv = vx * vx + vy * vy + vz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\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"]}