@itwin/core-geometry 5.0.0-dev.4 → 5.0.0-dev.40

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 (434) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/lib/cjs/Constant.js +17 -17
  3. package/lib/cjs/Constant.js.map +1 -1
  4. package/lib/cjs/Geometry.js +35 -35
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurveOps.js +18 -21
  8. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  9. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  10. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  11. package/lib/cjs/bspline/KnotVector.js +2 -2
  12. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  13. package/lib/cjs/clipping/AlternatingConvexClipTree.js +2 -2
  14. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  15. package/lib/cjs/clipping/ClipPlane.js +1 -1
  16. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  17. package/lib/cjs/clipping/ClipUtils.js +1 -1
  18. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  19. package/lib/cjs/clipping/ClipVector.js +1 -1
  20. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  21. package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -3
  22. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  23. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +1 -1
  24. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  25. package/lib/cjs/curve/Arc3d.d.ts +40 -8
  26. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  27. package/lib/cjs/curve/Arc3d.js +80 -22
  28. package/lib/cjs/curve/Arc3d.js.map +1 -1
  29. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +4 -4
  30. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  31. package/lib/cjs/curve/CurveCollection.d.ts +16 -2
  32. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  33. package/lib/cjs/curve/CurveCollection.js +33 -2
  34. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  35. package/lib/cjs/curve/CurveFactory.d.ts +87 -53
  36. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  37. package/lib/cjs/curve/CurveFactory.js +213 -135
  38. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  39. package/lib/cjs/curve/LineString3d.d.ts +12 -8
  40. package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
  41. package/lib/cjs/curve/LineString3d.js +34 -13
  42. package/lib/cjs/curve/LineString3d.js.map +1 -1
  43. package/lib/cjs/curve/Loop.d.ts +12 -6
  44. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  45. package/lib/cjs/curve/Loop.js +12 -6
  46. package/lib/cjs/curve/Loop.js.map +1 -1
  47. package/lib/cjs/curve/Query/CylindricalRange.d.ts +8 -6
  48. package/lib/cjs/curve/Query/CylindricalRange.d.ts.map +1 -1
  49. package/lib/cjs/curve/Query/CylindricalRange.js +13 -9
  50. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  51. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +1 -1
  52. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  53. package/lib/cjs/curve/StrokeOptions.d.ts +4 -4
  54. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  55. package/lib/cjs/curve/StrokeOptions.js +1 -1
  56. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  57. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +5 -5
  58. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  59. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +13 -13
  60. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  61. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +5 -5
  62. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  63. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -1
  64. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +29 -23
  65. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  66. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +4 -4
  67. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  68. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +2 -2
  69. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  70. package/lib/cjs/geometry3d/Angle.js +16 -16
  71. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  72. package/lib/cjs/geometry3d/AngleSweep.d.ts +1 -1
  73. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  74. package/lib/cjs/geometry3d/AngleSweep.js +1 -1
  75. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  76. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +14 -8
  77. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  78. package/lib/cjs/geometry3d/BarycentricTriangle.js +17 -8
  79. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  80. package/lib/cjs/geometry3d/FrameBuilder.js +4 -4
  81. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  82. package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts +2 -0
  83. package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  84. package/lib/cjs/geometry3d/GrowableFloat64Array.js +4 -0
  85. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  86. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +32 -10
  87. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  88. package/lib/cjs/geometry3d/GrowableXYZArray.js +54 -16
  89. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  90. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +13 -2
  91. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  92. package/lib/cjs/geometry3d/IndexedXYZCollection.js +24 -10
  93. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  94. package/lib/cjs/geometry3d/Matrix3d.d.ts +11 -8
  95. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  96. package/lib/cjs/geometry3d/Matrix3d.js +36 -34
  97. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  98. package/lib/cjs/geometry3d/OrderedRotationAngles.js +2 -2
  99. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  100. package/lib/cjs/geometry3d/Point3dArrayCarrier.js +1 -1
  101. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  102. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +6 -6
  103. package/lib/cjs/geometry3d/Point3dVector3d.js +6 -6
  104. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  105. package/lib/cjs/geometry3d/PointHelpers.js +5 -5
  106. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  107. package/lib/cjs/geometry3d/PolygonOps.d.ts +12 -6
  108. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  109. package/lib/cjs/geometry3d/PolygonOps.js +117 -70
  110. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  111. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
  112. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  113. package/lib/cjs/geometry3d/PolylineOps.d.ts +9 -5
  114. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  115. package/lib/cjs/geometry3d/PolylineOps.js +9 -5
  116. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  117. package/lib/cjs/geometry3d/Range.js +4 -4
  118. package/lib/cjs/geometry3d/Range.js.map +1 -1
  119. package/lib/cjs/geometry4d/MomentData.d.ts +72 -73
  120. package/lib/cjs/geometry4d/MomentData.d.ts.map +1 -1
  121. package/lib/cjs/geometry4d/MomentData.js +62 -64
  122. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  123. package/lib/cjs/numerics/ClusterableArray.js +13 -13
  124. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  125. package/lib/cjs/numerics/PascalCoefficients.js +1 -1
  126. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  127. package/lib/cjs/numerics/PolarData.js +1 -1
  128. package/lib/cjs/numerics/PolarData.js.map +1 -1
  129. package/lib/cjs/numerics/Polynomials.d.ts +5 -5
  130. package/lib/cjs/numerics/Polynomials.js +32 -32
  131. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  132. package/lib/cjs/numerics/Quadrature.js +20 -20
  133. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  134. package/lib/cjs/polyface/AuxData.d.ts +2 -2
  135. package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
  136. package/lib/cjs/polyface/AuxData.js +11 -3
  137. package/lib/cjs/polyface/AuxData.js.map +1 -1
  138. package/lib/cjs/polyface/BoxTopology.js +67 -67
  139. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  140. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +2 -2
  141. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  142. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +27 -20
  143. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  144. package/lib/cjs/polyface/IndexedEdgeMatcher.js +56 -30
  145. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  146. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +2 -1
  147. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  148. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +2 -1
  149. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  150. package/lib/cjs/polyface/Polyface.d.ts +3 -5
  151. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  152. package/lib/cjs/polyface/Polyface.js +6 -13
  153. package/lib/cjs/polyface/Polyface.js.map +1 -1
  154. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +14 -7
  155. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  156. package/lib/cjs/polyface/PolyfaceBuilder.js +59 -64
  157. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  158. package/lib/cjs/polyface/PolyfaceData.d.ts +13 -3
  159. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  160. package/lib/cjs/polyface/PolyfaceData.js +26 -9
  161. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  162. package/lib/cjs/polyface/PolyfaceQuery.d.ts +2 -2
  163. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  164. package/lib/cjs/polyface/PolyfaceQuery.js +11 -10
  165. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  166. package/lib/cjs/polyface/multiclip/RangeSearch.js +5 -5
  167. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  168. package/lib/cjs/serialization/BGFBReader.js +22 -22
  169. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  170. package/lib/cjs/serialization/GeometrySamples.d.ts +5 -5
  171. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  172. package/lib/cjs/serialization/GeometrySamples.js +112 -112
  173. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  174. package/lib/cjs/solid/Box.d.ts +9 -3
  175. package/lib/cjs/solid/Box.d.ts.map +1 -1
  176. package/lib/cjs/solid/Box.js +10 -5
  177. package/lib/cjs/solid/Box.js.map +1 -1
  178. package/lib/cjs/solid/Cone.d.ts +3 -2
  179. package/lib/cjs/solid/Cone.d.ts.map +1 -1
  180. package/lib/cjs/solid/Cone.js +3 -3
  181. package/lib/cjs/solid/Cone.js.map +1 -1
  182. package/lib/cjs/solid/LinearSweep.d.ts +9 -3
  183. package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
  184. package/lib/cjs/solid/LinearSweep.js +9 -4
  185. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  186. package/lib/cjs/solid/RotationalSweep.d.ts +15 -4
  187. package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
  188. package/lib/cjs/solid/RotationalSweep.js +20 -7
  189. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  190. package/lib/cjs/solid/RuledSweep.d.ts +35 -26
  191. package/lib/cjs/solid/RuledSweep.d.ts.map +1 -1
  192. package/lib/cjs/solid/RuledSweep.js +41 -28
  193. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  194. package/lib/cjs/solid/SolidPrimitive.d.ts +12 -11
  195. package/lib/cjs/solid/SolidPrimitive.d.ts.map +1 -1
  196. package/lib/cjs/solid/SolidPrimitive.js +8 -5
  197. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  198. package/lib/cjs/solid/Sphere.d.ts +17 -7
  199. package/lib/cjs/solid/Sphere.d.ts.map +1 -1
  200. package/lib/cjs/solid/Sphere.js +22 -16
  201. package/lib/cjs/solid/Sphere.js.map +1 -1
  202. package/lib/cjs/solid/SweepContour.d.ts +25 -16
  203. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  204. package/lib/cjs/solid/SweepContour.js +25 -16
  205. package/lib/cjs/solid/SweepContour.js.map +1 -1
  206. package/lib/cjs/solid/TorusPipe.d.ts +8 -2
  207. package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
  208. package/lib/cjs/solid/TorusPipe.js +9 -5
  209. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  210. package/lib/cjs/topology/ChainMerge.js +4 -4
  211. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  212. package/lib/cjs/topology/Graph.js +5 -5
  213. package/lib/cjs/topology/Graph.js.map +1 -1
  214. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +2 -2
  215. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  216. package/lib/cjs/topology/Triangulation.js +11 -11
  217. package/lib/cjs/topology/Triangulation.js.map +1 -1
  218. package/lib/esm/Constant.js +17 -17
  219. package/lib/esm/Constant.js.map +1 -1
  220. package/lib/esm/Geometry.js +35 -35
  221. package/lib/esm/Geometry.js.map +1 -1
  222. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  223. package/lib/esm/bspline/BSplineCurveOps.js +18 -21
  224. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  225. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  226. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  227. package/lib/esm/bspline/KnotVector.js +2 -2
  228. package/lib/esm/bspline/KnotVector.js.map +1 -1
  229. package/lib/esm/clipping/AlternatingConvexClipTree.js +2 -2
  230. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  231. package/lib/esm/clipping/ClipPlane.js +1 -1
  232. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  233. package/lib/esm/clipping/ClipUtils.js +1 -1
  234. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  235. package/lib/esm/clipping/ClipVector.js +1 -1
  236. package/lib/esm/clipping/ClipVector.js.map +1 -1
  237. package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -3
  238. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  239. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +1 -1
  240. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  241. package/lib/esm/curve/Arc3d.d.ts +40 -8
  242. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  243. package/lib/esm/curve/Arc3d.js +80 -22
  244. package/lib/esm/curve/Arc3d.js.map +1 -1
  245. package/lib/esm/curve/CurveChainWithDistanceIndex.js +4 -4
  246. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  247. package/lib/esm/curve/CurveCollection.d.ts +16 -2
  248. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  249. package/lib/esm/curve/CurveCollection.js +33 -2
  250. package/lib/esm/curve/CurveCollection.js.map +1 -1
  251. package/lib/esm/curve/CurveFactory.d.ts +87 -53
  252. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  253. package/lib/esm/curve/CurveFactory.js +213 -135
  254. package/lib/esm/curve/CurveFactory.js.map +1 -1
  255. package/lib/esm/curve/LineString3d.d.ts +12 -8
  256. package/lib/esm/curve/LineString3d.d.ts.map +1 -1
  257. package/lib/esm/curve/LineString3d.js +34 -13
  258. package/lib/esm/curve/LineString3d.js.map +1 -1
  259. package/lib/esm/curve/Loop.d.ts +12 -6
  260. package/lib/esm/curve/Loop.d.ts.map +1 -1
  261. package/lib/esm/curve/Loop.js +12 -6
  262. package/lib/esm/curve/Loop.js.map +1 -1
  263. package/lib/esm/curve/Query/CylindricalRange.d.ts +8 -6
  264. package/lib/esm/curve/Query/CylindricalRange.d.ts.map +1 -1
  265. package/lib/esm/curve/Query/CylindricalRange.js +13 -9
  266. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  267. package/lib/esm/curve/RegionOpsClassificationSweeps.js +1 -1
  268. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  269. package/lib/esm/curve/StrokeOptions.d.ts +4 -4
  270. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  271. package/lib/esm/curve/StrokeOptions.js +1 -1
  272. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  273. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +5 -5
  274. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  275. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +13 -13
  276. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  277. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +5 -5
  278. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  279. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -1
  280. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +29 -23
  281. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  282. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +4 -4
  283. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  284. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +2 -2
  285. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  286. package/lib/esm/geometry3d/Angle.js +16 -16
  287. package/lib/esm/geometry3d/Angle.js.map +1 -1
  288. package/lib/esm/geometry3d/AngleSweep.d.ts +1 -1
  289. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  290. package/lib/esm/geometry3d/AngleSweep.js +1 -1
  291. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  292. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +14 -8
  293. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  294. package/lib/esm/geometry3d/BarycentricTriangle.js +17 -8
  295. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  296. package/lib/esm/geometry3d/FrameBuilder.js +4 -4
  297. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  298. package/lib/esm/geometry3d/GrowableFloat64Array.d.ts +2 -0
  299. package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
  300. package/lib/esm/geometry3d/GrowableFloat64Array.js +4 -0
  301. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  302. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +32 -10
  303. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  304. package/lib/esm/geometry3d/GrowableXYZArray.js +54 -16
  305. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  306. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +13 -2
  307. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  308. package/lib/esm/geometry3d/IndexedXYZCollection.js +24 -10
  309. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  310. package/lib/esm/geometry3d/Matrix3d.d.ts +11 -8
  311. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  312. package/lib/esm/geometry3d/Matrix3d.js +36 -34
  313. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  314. package/lib/esm/geometry3d/OrderedRotationAngles.js +2 -2
  315. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  316. package/lib/esm/geometry3d/Point3dArrayCarrier.js +1 -1
  317. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  318. package/lib/esm/geometry3d/Point3dVector3d.d.ts +6 -6
  319. package/lib/esm/geometry3d/Point3dVector3d.js +6 -6
  320. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  321. package/lib/esm/geometry3d/PointHelpers.js +5 -5
  322. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  323. package/lib/esm/geometry3d/PolygonOps.d.ts +12 -6
  324. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  325. package/lib/esm/geometry3d/PolygonOps.js +117 -70
  326. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  327. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +3 -3
  328. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  329. package/lib/esm/geometry3d/PolylineOps.d.ts +9 -5
  330. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  331. package/lib/esm/geometry3d/PolylineOps.js +9 -5
  332. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  333. package/lib/esm/geometry3d/Range.js +4 -4
  334. package/lib/esm/geometry3d/Range.js.map +1 -1
  335. package/lib/esm/geometry4d/MomentData.d.ts +72 -73
  336. package/lib/esm/geometry4d/MomentData.d.ts.map +1 -1
  337. package/lib/esm/geometry4d/MomentData.js +62 -64
  338. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  339. package/lib/esm/numerics/ClusterableArray.js +13 -13
  340. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  341. package/lib/esm/numerics/PascalCoefficients.js +1 -1
  342. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  343. package/lib/esm/numerics/PolarData.js +1 -1
  344. package/lib/esm/numerics/PolarData.js.map +1 -1
  345. package/lib/esm/numerics/Polynomials.d.ts +5 -5
  346. package/lib/esm/numerics/Polynomials.js +32 -32
  347. package/lib/esm/numerics/Polynomials.js.map +1 -1
  348. package/lib/esm/numerics/Quadrature.js +20 -20
  349. package/lib/esm/numerics/Quadrature.js.map +1 -1
  350. package/lib/esm/polyface/AuxData.d.ts +2 -2
  351. package/lib/esm/polyface/AuxData.d.ts.map +1 -1
  352. package/lib/esm/polyface/AuxData.js +11 -3
  353. package/lib/esm/polyface/AuxData.js.map +1 -1
  354. package/lib/esm/polyface/BoxTopology.js +67 -67
  355. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  356. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +2 -2
  357. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  358. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +27 -20
  359. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  360. package/lib/esm/polyface/IndexedEdgeMatcher.js +56 -30
  361. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  362. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +2 -1
  363. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  364. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +2 -1
  365. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  366. package/lib/esm/polyface/Polyface.d.ts +3 -5
  367. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  368. package/lib/esm/polyface/Polyface.js +6 -13
  369. package/lib/esm/polyface/Polyface.js.map +1 -1
  370. package/lib/esm/polyface/PolyfaceBuilder.d.ts +14 -7
  371. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  372. package/lib/esm/polyface/PolyfaceBuilder.js +60 -65
  373. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  374. package/lib/esm/polyface/PolyfaceData.d.ts +13 -3
  375. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  376. package/lib/esm/polyface/PolyfaceData.js +26 -9
  377. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  378. package/lib/esm/polyface/PolyfaceQuery.d.ts +2 -2
  379. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  380. package/lib/esm/polyface/PolyfaceQuery.js +11 -10
  381. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  382. package/lib/esm/polyface/multiclip/RangeSearch.js +5 -5
  383. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  384. package/lib/esm/serialization/BGFBReader.js +22 -22
  385. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  386. package/lib/esm/serialization/GeometrySamples.d.ts +5 -5
  387. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  388. package/lib/esm/serialization/GeometrySamples.js +112 -112
  389. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  390. package/lib/esm/solid/Box.d.ts +9 -3
  391. package/lib/esm/solid/Box.d.ts.map +1 -1
  392. package/lib/esm/solid/Box.js +10 -5
  393. package/lib/esm/solid/Box.js.map +1 -1
  394. package/lib/esm/solid/Cone.d.ts +3 -2
  395. package/lib/esm/solid/Cone.d.ts.map +1 -1
  396. package/lib/esm/solid/Cone.js +3 -3
  397. package/lib/esm/solid/Cone.js.map +1 -1
  398. package/lib/esm/solid/LinearSweep.d.ts +9 -3
  399. package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
  400. package/lib/esm/solid/LinearSweep.js +9 -4
  401. package/lib/esm/solid/LinearSweep.js.map +1 -1
  402. package/lib/esm/solid/RotationalSweep.d.ts +15 -4
  403. package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
  404. package/lib/esm/solid/RotationalSweep.js +20 -7
  405. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  406. package/lib/esm/solid/RuledSweep.d.ts +35 -26
  407. package/lib/esm/solid/RuledSweep.d.ts.map +1 -1
  408. package/lib/esm/solid/RuledSweep.js +41 -28
  409. package/lib/esm/solid/RuledSweep.js.map +1 -1
  410. package/lib/esm/solid/SolidPrimitive.d.ts +12 -11
  411. package/lib/esm/solid/SolidPrimitive.d.ts.map +1 -1
  412. package/lib/esm/solid/SolidPrimitive.js +8 -5
  413. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  414. package/lib/esm/solid/Sphere.d.ts +17 -7
  415. package/lib/esm/solid/Sphere.d.ts.map +1 -1
  416. package/lib/esm/solid/Sphere.js +22 -16
  417. package/lib/esm/solid/Sphere.js.map +1 -1
  418. package/lib/esm/solid/SweepContour.d.ts +25 -16
  419. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  420. package/lib/esm/solid/SweepContour.js +25 -16
  421. package/lib/esm/solid/SweepContour.js.map +1 -1
  422. package/lib/esm/solid/TorusPipe.d.ts +8 -2
  423. package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
  424. package/lib/esm/solid/TorusPipe.js +9 -5
  425. package/lib/esm/solid/TorusPipe.js.map +1 -1
  426. package/lib/esm/topology/ChainMerge.js +4 -4
  427. package/lib/esm/topology/ChainMerge.js.map +1 -1
  428. package/lib/esm/topology/Graph.js +5 -5
  429. package/lib/esm/topology/Graph.js.map +1 -1
  430. package/lib/esm/topology/HalfEdgeGraphSpineContext.js +2 -2
  431. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  432. package/lib/esm/topology/Triangulation.js +11 -11
  433. package/lib/esm/topology/Triangulation.js.map +1 -1
  434. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"MomentData.js","sourceRoot":"","sources":["../../../src/geometry4d/MomentData.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\n// import { Point2d } from \"./Geometry2d\";\n/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Point3d, Vector3d, XYZ } from \"../geometry3d/Point3dVector3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\nimport { Matrix4d } from \"./Matrix4d\";\nimport { Point4d } from \"./Point4d\";\n\n/**\n * A MomentData structure exists in several levels:\n * * First level: as a carrier of sums of inertial products that determine moments.\n * * origin = local origin used as moments are summed.\n * * sums = array of summed moments.\n * * The [i,j] entry of the sums is a summed or integrated moment for product of axis i and j.\n * * axes 0,1,2 are x,y,z\n * * e.g. entry [0,1] is summed product xy\n * * axis 3 is \"w\", which is 1 in sums.\n * * e.g. entry 03 is summed x\n * * In this level,\n * * the `absoluteQuantity` member is undefined.\n * * the `localToWorldMap` and `radiiOfGyration` are created by have undefined contents.\n * * Second level: after a call to inertiaProductsToPrincipalAxes, the `localToWorldMap`, `absoluteQuantity` and `radiiOfGyration` are filled in.\n * @public\n */\nexport class MomentData {\n /** Origin used for sums. */\n public origin: Point3d;\n /** flag to request deferred origin setup. */\n public needOrigin: boolean;\n /** Moment sums.\n * * Set to zero at initialization and if requested later.\n * * Accumulated during data entry phase.\n */\n public sums: Matrix4d;\n /** the mapping between principal and world system.\n * * This set up with its inverse already constructed.\n */\n public localToWorldMap: Transform;\n /** Return the lower-right (3,3) entry in the sums.\n * * This is the quantity (i.e. length, area, or volume) summed\n */\n public get quantitySum(): number { return this.sums.atIJ(3, 3); }\n /** Return a scale factor to make these sums match the target orientation sign.\n * * 1.0 if `this.quantitySum` has the same sign as `targetSign`.\n * * -1.0 if `this.quantitySum` has the opposite sign from `targetSign`\n */\n public signFactor(targetSign: number): number {\n return targetSign * this.quantitySum > 0 ? 1.0 : -1.0;\n }\n\n /**\n * If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag.\n *\n */\n public setOriginIfNeeded(origin: Point3d) {\n if (this.needOrigin) {\n this.origin.setFromPoint3d(origin);\n this.needOrigin = false;\n }\n }\n /**\n * If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag.\n *\n */\n public setOriginFromGrowableXYZArrayIfNeeded(points: GrowableXYZArray) {\n if (this.needOrigin && points.length > 0) {\n points.getPoint3dAtCheckedPointIndex(0, this.origin);\n this.needOrigin = false;\n }\n }\n\n /**\n * If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag.\n *\n */\n public setOriginXYZIfNeeded(x: number, y: number, z: number) {\n if (this.needOrigin) {\n this.origin.set(x, y, z);\n this.needOrigin = false;\n }\n }\n\n /** radii of gyration (square roots of principal second moments)\n */\n public radiusOfGyration: Vector3d;\n /** principal quantity (e.g. length, area, or volume). This is undefined in raw moments, and becomes defined by\n *\n */\n public absoluteQuantity?: number;\n\n private constructor() {\n this.origin = Point3d.createZero();\n this.sums = Matrix4d.createZero();\n this.localToWorldMap = Transform.createIdentity();\n this.radiusOfGyration = Vector3d.create();\n this.needOrigin = false;\n this.absoluteQuantity = 0.1; // so optimizer sees its type\n this.absoluteQuantity = undefined;\n }\n /** Create moments with optional origin.\n * * origin and needOrigin are quirky.\n * * (undefined, true) sets up to use first incoming point as origin.\n * * (origin) sets up to use that durable origin, set needsOrigin flag false\n * * (origin, true) the \"true\" is meaningless\n * * (undefined, false) makes 000 the durable origin\n */\n public static create(origin?: Point3d | undefined, needOrigin: boolean = false): MomentData {\n const data = new MomentData();\n data.needOrigin = needOrigin;\n if (origin) {\n data.origin.setFromPoint3d(origin);\n data.needOrigin = false;\n }\n return data;\n }\n /**\n * Return the formal tensor of integrated values `[yy+zz,xy,xz][yx,xx+zz,yz][zx,xy,xx+yy]`\n * @param products matrix of (integrated) `[xx,xy,xz][yx,yy,yz][zx,xy,zz]`\n */\n public static momentTensorFromInertiaProducts(products: Matrix3d): Matrix3d {\n const rr = products.sumDiagonal();\n const result = Matrix3d.createScale(rr, rr, rr);\n result.addScaledInPlace(products, -1.0);\n return result;\n }\n /** Sort the columns of the matrix for increasing moments. */\n public static sortColumnsForIncreasingMoments(axes: Matrix3d, moments: Vector3d) {\n const points = [\n axes.indexedColumnWithWeight(0, moments.x),\n axes.indexedColumnWithWeight(1, moments.y),\n axes.indexedColumnWithWeight(2, moments.z),\n ].sort((dataA: Point4d, dataB: Point4d): number => {\n if (dataA.w < dataB.w) return -1;\n if (dataA.w > dataB.w) return 1;\n return 0;\n });\n axes.setColumnsPoint4dXYZ(points[0], points[1], points[2]);\n if (axes.determinant() < 0)\n axes.scaleColumnsInPlace(-1.0, -1.0, -1.0);\n // prefer x and z positive -- y falls wherever . ..\n if (axes.at(0, 0) < 0.0)\n axes.scaleColumnsInPlace(-1.0, -1.0, 1.0);\n if (axes.at(2, 2) < 0.0)\n axes.scaleColumnsInPlace(1.0, -1.0, -1.0);\n moments.set(points[0].w, points[1].w, points[2].w);\n }\n\n /**\n * Return the principal moment data for an array of points.\n * @param points array of points\n */\n public static pointsToPrincipalAxes(points: Point3d[]): MomentData | undefined {\n const moments = new MomentData();\n if (points.length === 0)\n return moments;\n moments.clearSums(points[0]);\n moments.accumulatePointMomentsFromOrigin(points);\n return this.inertiaProductsToPrincipalAxes(moments.origin, moments.sums);\n }\n /**\n * Compute principal axes from inertial products\n * * The radii of gyration are sorted smallest to largest\n * * Hence x axis is long direction\n * * Hence planar data generates large moment as Z\n * @param origin The origin used for the inertia products.\n * @param inertiaProducts The inertia products -- sums or integrals of [xx,xy,xz,xw; yx,yy, yz,yw; zx,zy,zz,zw; wx,wy,wz,w]\n */\n public static inertiaProductsToPrincipalAxes(origin: XYZ, inertiaProducts: Matrix4d): MomentData | undefined {\n const moments = new MomentData();\n moments.sums.setFrom(inertiaProducts);\n moments.origin.setFrom(origin);\n if (!moments.shiftOriginAndSumsToCentroidOfSums())\n return undefined;\n const products = moments.sums.matrixPart();\n const w = moments.sums.weight();\n if (w < 0.0)\n products.scaleColumnsInPlace(-1, -1, -1);\n const tensor = MomentData.momentTensorFromInertiaProducts(products);\n const moment2 = Vector3d.create();\n const axisVectors = Matrix3d.createZero();\n tensor.fastSymmetricEigenvalues(axisVectors, moment2);\n if (moment2.x < 0.0)\n return undefined;\n MomentData.sortColumnsForIncreasingMoments(axisVectors, moment2);\n if (w < 0.0)\n axisVectors.scaleColumnsInPlace(1, -1, -1);\n moments.localToWorldMap = Transform.createOriginAndMatrix(moments.origin, axisVectors);\n moments.radiusOfGyration.set(\n Math.sqrt(Math.abs(moment2.x)), Math.sqrt(Math.abs(moment2.y)), Math.sqrt(Math.abs(moment2.z)));\n moments.radiusOfGyration.scaleInPlace(1.0 / Math.sqrt(Math.abs(w)));\n moments.absoluteQuantity = Math.abs(w);\n return moments;\n }\n /**\n * Test for match among selected members as they exist after `inertiaProductsToPrincipalAxes`\n * * The members considered are\n * * origin of local to world map (i.e. centroid)\n * * radius of gyration\n * * axes of localToWorldMap.\n * * Axis direction tests allow these quirks:\n * * opposite orientation is considered matched.\n * * Full xyz symmetry: If x,y,z radii are matched, axes are not tested.\n * * Symmetry in xy plane: If x and y radii are matched, the x and y axes area allowed to spin freely. Only Z direction is tested.\n * * If either or both are undefined, returns false.\n * @param dataA first set of moments\n * @param dataB second set of moments\n */\n public static areEquivalentPrincipalAxes(dataA: MomentData | undefined, dataB: MomentData | undefined): boolean {\n if (dataA && dataB\n && Geometry.isSameCoordinate(dataA.quantitySum, dataB.quantitySum)) { // um.. need different tolerance for area, volume?)\n if (dataA.localToWorldMap.getOrigin().isAlmostEqual(dataB.localToWorldMap.getOrigin())\n && dataA.radiusOfGyration.isAlmostEqual(dataB.radiusOfGyration)) {\n if (Geometry.isSameCoordinate(dataA.radiusOfGyration.x, dataA.radiusOfGyration.y)) {\n // We have at least xy symmetry ....\n if (Geometry.isSameCoordinate(dataA.radiusOfGyration.x, dataA.radiusOfGyration.z))\n return true;\n // just xy.\n // allow opposite z directions.\n // If the z's are aligned, x an dy can spin freely.\n const zA = dataA.localToWorldMap.matrix.columnZ();\n const zB = dataB.localToWorldMap.matrix.columnZ();\n if (zA.isParallelTo(zB, true))\n return true;\n return false;\n }\n // no symmetry. Test all three axes.\n const vectorA = Vector3d.create();\n const vectorB = Vector3d.create();\n for (let i = 0; i < 3; i++) {\n dataA.localToWorldMap.matrix.getColumn(i, vectorA);\n dataB.localToWorldMap.matrix.getColumn(i, vectorB);\n if (!vectorA.isParallelTo(vectorB, true))\n return false;\n }\n return true;\n }\n }\n return false;\n }\n /** Clear the MomentData sums to zero, and establish a new origin. */\n public clearSums(origin?: Point3d) {\n this.sums.setZero();\n if (origin)\n this.origin.setFrom(origin);\n else\n this.origin.setZero();\n }\n /** Accumulate products-of-components for given points. */\n public accumulatePointMomentsFromOrigin(points: Point3d[]) {\n for (const p of points) {\n this.sums.addMomentsInPlace(\n p.x - this.origin.x,\n p.y - this.origin.y,\n p.z - this.origin.z,\n 1.0);\n }\n }\n /** revise the accumulated sums to be \"around the centroid\" */\n public shiftOriginAndSumsToCentroidOfSums(): boolean {\n const xyz = this.sums.columnW().realPoint();\n if (xyz) {\n this.shiftOriginAndSumsByXYZ(xyz.x, xyz.y, xyz.z);\n return true;\n }\n return false;\n }\n\n /** revise the accumulated sums\n * * add ax,ay,ax to the origin coordinates.\n * * apply the negative translation to the sums.\n */\n public shiftOriginAndSumsByXYZ(ax: number, ay: number, az: number) {\n this.origin.addXYZInPlace(ax, ay, az);\n this.sums.multiplyTranslationSandwichInPlace(-ax, -ay, -az);\n }\n /** revise the accumulated sums so they are based at a specified origin. */\n public shiftOriginAndSumsToNewOrigin(newOrigin: XYAndZ) {\n this.shiftOriginAndSumsByXYZ(newOrigin.x - this.origin.x, newOrigin.y - this.origin.y, newOrigin.z - this.origin.z);\n }\n private static _vectorA?: Point4d;\n private static _vectorB?: Point4d;\n private static _vectorC?: Point4d;\n\n /** compute moments of a triangle from the origin to the given line.\n * Accumulate them to this.sums.\n * * If `pointA` is undefined, use `this.origin` as pointA.\n * * If `this.needOrigin` is set, pointB is used\n */\n public accumulateTriangleMomentsXY(pointA: XAndY | undefined, pointB: XAndY, pointC: XAndY) {\n this.setOriginXYZIfNeeded(pointB.x, pointB.y, 0.0);\n const x0 = this.origin.x;\n const y0 = this.origin.y;\n const vectorA = MomentData._vectorA =\n pointA !== undefined ? Point4d.create(pointA.x - x0, pointA.y - y0, 0.0, 1.0, MomentData._vectorA)\n : Point4d.create(this.origin.x, this.origin.y, 0.0, 1.0, MomentData._vectorA);\n const vectorB = MomentData._vectorB = Point4d.create(pointB.x - x0, pointB.y - y0, 0.0, 1.0, MomentData._vectorB);\n const vectorC = MomentData._vectorC = Point4d.create(pointC.x - x0, pointC.y - y0, 0.0, 1.0, MomentData._vectorC);\n\n // accumulate Return product integrals I(0<=u<=1) I (0<=v<= u) (w*W + u *U + v * V)(w*W + u *U + v * V)^ du dv\n // where w = 1-u-v\n // W = column vector (point00.x, point00.y, point00.z, 1.0) etc.\n const detJ = Geometry.crossProductXYXY(vectorB.x - vectorA.x, vectorB.y - vectorA.y, vectorC.x - vectorA.x, vectorC.y - vectorA.y);\n if (detJ !== 0.0) {\n const r1_12 = detJ / 12.0;\n const r1_24 = detJ / 24.0;\n\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, r1_12);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorB, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorC, r1_24);\n\n this.sums.addScaledOuterProductInPlace(vectorB, vectorA, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorB, r1_12);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorC, r1_24);\n\n this.sums.addScaledOuterProductInPlace(vectorC, vectorA, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorC, vectorB, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorC, vectorC, r1_12);\n }\n }\n /** add scaled outer product of (4d, unit weight) point to this.sums */\n public accumulateScaledOuterProduct(point: XYAndZ, scaleFactor: number) {\n this.setOriginXYZIfNeeded(point.x, point.y, 0.0);\n const vectorA = MomentData._vectorA = Point4d.create(point.x - this.origin.x, point.y - this.origin.y, point.z - this.origin.z, 1.0, MomentData._vectorA);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, scaleFactor);\n }\n /** Accumulate wire moment integral from pointA to pointB */\n public accumulateLineMomentsXYZ(pointA: Point3d, pointB: Point3d) {\n this.setOriginXYZIfNeeded(pointA.x, pointA.y, pointA.z);\n const x0 = this.origin.x;\n const y0 = this.origin.y;\n const z0 = this.origin.z;\n const vectorA = MomentData._vectorA = Point4d.create(pointA.x - x0, pointA.y - y0, pointA.z - z0, 1.0, MomentData._vectorA);\n const vectorB = MomentData._vectorB = Point4d.create(pointB.x - x0, pointB.y - y0, pointB.z - z0, 1.0, MomentData._vectorB);\n const detJ = pointA.distance(pointB);\n const r1_3 = detJ / 3.0;\n const r1_6 = detJ / 6.0;\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, r1_3);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorB, r1_6);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorA, r1_6);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorB, r1_3);\n\n }\n\n private _point0 = Point3d.create();\n private _point1 = Point3d.create();\n /** compute moments of triangles from a base point to the given linestring.\n * Accumulate them to this.sums.\n * * If `pointA` is undefined, use `this.origin` as pointA.\n * * If `this.needOrigin` is set, the first point of the array is captured as local origin for subsequent sums.\n *\n */\n public accumulateTriangleToLineStringMomentsXY(sweepBase: XAndY | undefined, points: GrowableXYZArray) {\n const n = points.length;\n if (n > 1) {\n points.getPoint3dAtUncheckedPointIndex(0, this._point0);\n for (let i = 1; i < n; i++) {\n points.getPoint3dAtUncheckedPointIndex(i, this._point1);\n this.accumulateTriangleMomentsXY(sweepBase, this._point0, this._point1);\n this._point0.setFromPoint3d(this._point1);\n }\n }\n }\n // cspell:word ABAT\n /**\n * * Assemble XX, YY, XY products into a full matrix form [xx,xy,0,0; xy,yy,0,0;0,0,0,0;0,0,0,1].\n * * Sandwich this between transforms with columns [vectorU, vectorV, 0000, origin]. (Column weights 0001) (only xy parts of vectors)\n * * scale by detJ for the xy-only determinant of the vectors.\n * @param productXX\n * @param productXY\n * @param productYY\n * @param area Area in caller's system\n * @param origin Caller's origin\n * @param vectorU Caller's U axis (not necessarily unit)\n * @param vectorV Caller's V axis (not necessarily unit)\n */\n public accumulateXYProductsInCentroidalFrame(productXX: number, productXY: number, productYY: number, area: number,\n origin: XAndY, vectorU: XAndY, vectorV: XAndY) {\n const centroidalProducts = Matrix4d.createRowValues(\n productXX, productXY, 0, 0,\n productXY, productYY, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, area);\n const detJ = Geometry.crossProductXYXY(vectorU.x, vectorV.x, vectorU.y, vectorV.y);\n const placement = Matrix4d.createRowValues(\n vectorU.x, vectorV.x, 0, origin.x - this.origin.x,\n vectorU.y, vectorV.y, 0, origin.y - this.origin.y,\n 0, 0, 0, 0,\n 0, 0, 0, 1);\n const AB = placement.multiplyMatrixMatrix(centroidalProducts);\n const ABAT = AB.multiplyMatrixMatrixTranspose(placement);\n this.sums.addScaledInPlace(ABAT, detJ);\n }\n /**\n * Accumulate sums from other moments.\n * * scale by given scaleFactor (e.g. sign to correct orientation)\n * * pull the origin from `other` if `this` needs an origin.\n * *\n */\n public accumulateProducts(other: MomentData, scale: number) {\n this.setOriginIfNeeded(other.origin);\n this.sums.addTranslationSandwichInPlace(other.sums, this.origin.x - other.origin.x, this.origin.y - other.origin.y, this.origin.z - other.origin.z, scale);\n }\n\n /**\n * Accumulate sums from Matrix4d and origin.\n * * scale by given scaleFactor (e.g. sign to correct orientation)\n * * trap the origin if `this` needs an origin.\n * *\n */\n public accumulateProductsFromOrigin(origin: Point3d, products: Matrix4d, scale: number) {\n this.setOriginIfNeeded(origin);\n this.sums.addTranslationSandwichInPlace(products, this.origin.x - origin.x, this.origin.y - origin.y, this.origin.z - origin.z, scale);\n }\n /**\n * Convert to a json data object with:\n */\n public toJSON(): any {\n return {\n origin: this.origin,\n sums: this.sums.toJSON(),\n radiusOfGyration: this.radiusOfGyration.toJSON(),\n localToWorld: this.localToWorldMap.toJSON(),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"MomentData.js","sourceRoot":"","sources":["../../../src/geometry4d/MomentData.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\n// cspell:word ABAT\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Point3d, Vector3d, XYZ } from \"../geometry3d/Point3dVector3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XAndY, XYAndZ } from \"../geometry3d/XYZProps\";\nimport { Matrix4d } from \"./Matrix4d\";\nimport { Point4d } from \"./Point4d\";\n\n/**\n * A MomentData structure exists in several levels:\n * * First level: as a carrier of sums of inertial products that determine moments.\n * * origin = local origin used as moments are summed.\n * * sums = array of summed moments.\n * * The [i,j] entry of the sums is a summed or integrated moment for product of axis i and j.\n * * axes 0,1,2 are x,y,z.\n * * e.g. entry [0,1] is summed product xy\n * * axis 3 is \"w\", which is 1 in sums.\n * * e.g. entry 03 is summed x.\n * * In this level:\n * * the `absoluteQuantity` member is undefined.\n * * the `localToWorldMap` and `radiiOfGyration` are created by have undefined contents.\n * * Second level: after a call to inertiaProductsToPrincipalAxes, the `localToWorldMap`, `absoluteQuantity` and\n * `radiiOfGyration` are filled in.\n * @public\n */\nexport class MomentData {\n /** Origin used for sums. */\n public origin: Point3d;\n /** Flag to request deferred origin setup. */\n public needOrigin: boolean;\n /**\n * Moment sums.\n * * Set to zero at initialization and if requested later.\n * * Accumulated during data entry phase.\n */\n public sums: Matrix4d;\n /**\n * The mapping between principal and world system.\n * * This set up with its inverse already constructed.\n */\n public localToWorldMap: Transform;\n // private variables\n private static _vectorA?: Point4d;\n private static _vectorB?: Point4d;\n private static _vectorC?: Point4d;\n private _point0 = Point3d.create();\n private _point1 = Point3d.create();\n /**\n * Return the lower-right (3,3) entry in the sums.\n * * This is the quantity (i.e. length, area, or volume) summed.\n */\n public get quantitySum(): number {\n return this.sums.atIJ(3, 3);\n }\n /**\n * Return a scale factor to make these sums match the target orientation sign.\n * * 1.0 if `this.quantitySum` has the same sign as `targetSign`.\n * * -1.0 if `this.quantitySum` has the opposite sign from `targetSign`\n */\n public signFactor(targetSign: number): number {\n return targetSign * this.quantitySum > 0 ? 1.0 : -1.0;\n }\n /** If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag. */\n public setOriginIfNeeded(origin: Point3d) {\n if (this.needOrigin) {\n this.origin.setFromPoint3d(origin);\n this.needOrigin = false;\n }\n }\n /** If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag. */\n public setOriginFromGrowableXYZArrayIfNeeded(points: GrowableXYZArray) {\n if (this.needOrigin && points.length > 0) {\n points.getPoint3dAtCheckedPointIndex(0, this.origin);\n this.needOrigin = false;\n }\n }\n /** If `this.needOrigin` flag is set, copy `origin` to `this.origin` and clear the flag. */\n public setOriginXYZIfNeeded(x: number, y: number, z: number) {\n if (this.needOrigin) {\n this.origin.set(x, y, z);\n this.needOrigin = false;\n }\n }\n /** Radii of gyration (square roots of principal second moments). */\n public radiusOfGyration: Vector3d;\n /**\n * Principal quantity (e.g. length, area, or volume). This is undefined in raw moments, and becomes defined by\n * inertiaProductsToPrincipalAxes.\n */\n public absoluteQuantity?: number;\n /** Constructor. */\n private constructor() {\n this.origin = Point3d.createZero();\n this.sums = Matrix4d.createZero();\n this.localToWorldMap = Transform.createIdentity();\n this.radiusOfGyration = Vector3d.create();\n this.needOrigin = false;\n this.absoluteQuantity = 0.1; // so optimizer sees its type\n this.absoluteQuantity = undefined;\n }\n /**\n * Create moments with optional origin.\n * * Origin and needOrigin are quirky.\n * * (undefined, true) sets up to use first incoming point as origin.\n * * (origin) sets up to use that durable origin, set needsOrigin flag false.\n * * (origin, true) the \"true\" is meaningless.\n * * (undefined, false) makes 000 the durable origin.\n */\n public static create(origin?: Point3d | undefined, needOrigin: boolean = false): MomentData {\n const data = new MomentData();\n data.needOrigin = needOrigin;\n if (origin) {\n data.origin.setFromPoint3d(origin);\n data.needOrigin = false;\n }\n return data;\n }\n /**\n * Return the formal tensor of integrated values `[yy+zz,xy,xz][yx,xx+zz,yz][zx,xy,xx+yy]`.\n * @param products matrix of (integrated) `[xx,xy,xz][yx,yy,yz][zx,xy,zz]`.\n */\n public static momentTensorFromInertiaProducts(products: Matrix3d): Matrix3d {\n const rr = products.sumDiagonal();\n const result = Matrix3d.createScale(rr, rr, rr);\n result.addScaledInPlace(products, -1.0);\n return result;\n }\n /** Sort the columns of the matrix for increasing moments. */\n public static sortColumnsForIncreasingMoments(axes: Matrix3d, moments: Vector3d) {\n const points = [\n axes.indexedColumnWithWeight(0, moments.x),\n axes.indexedColumnWithWeight(1, moments.y),\n axes.indexedColumnWithWeight(2, moments.z),\n ].sort((dataA: Point4d, dataB: Point4d): number => {\n if (dataA.w < dataB.w) return -1;\n if (dataA.w > dataB.w) return 1;\n return 0;\n });\n axes.setColumnsPoint4dXYZ(points[0], points[1], points[2]);\n if (axes.determinant() < 0)\n axes.scaleColumnsInPlace(-1.0, -1.0, -1.0);\n // prefer x and z positive -- y falls wherever . ..\n if (axes.at(0, 0) < 0.0)\n axes.scaleColumnsInPlace(-1.0, -1.0, 1.0);\n if (axes.at(2, 2) < 0.0)\n axes.scaleColumnsInPlace(1.0, -1.0, -1.0);\n moments.set(points[0].w, points[1].w, points[2].w);\n }\n /**\n * Return the principal moment data for an array of points.\n * @param points array of points.\n */\n public static pointsToPrincipalAxes(points: Point3d[]): MomentData | undefined {\n const moments = new MomentData();\n if (points.length === 0)\n return moments;\n moments.clearSums(points[0]);\n moments.accumulatePointMomentsFromOrigin(points);\n return this.inertiaProductsToPrincipalAxes(moments.origin, moments.sums);\n }\n /**\n * Compute principal axes from inertial products.\n * * The radii of gyration are sorted smallest to largest.\n * * Hence x axis is long direction.\n * * Hence planar data generates large moment as Z.\n * @param origin The origin used for the inertia products.\n * @param inertiaProducts The inertia products: sums or integrals of [xx,xy,xz,xw; yx,yy, yz,yw; zx,zy,zz,zw; wx,wy,wz,w].\n */\n public static inertiaProductsToPrincipalAxes(origin: XYZ, inertiaProducts: Matrix4d): MomentData | undefined {\n const moments = new MomentData();\n moments.sums.setFrom(inertiaProducts);\n moments.origin.setFrom(origin);\n if (!moments.shiftOriginAndSumsToCentroidOfSums())\n return undefined;\n const products = moments.sums.matrixPart();\n const w = moments.sums.weight();\n if (w < 0.0)\n products.scaleColumnsInPlace(-1, -1, -1);\n const tensor = MomentData.momentTensorFromInertiaProducts(products);\n const moment2 = Vector3d.create();\n const axisVectors = Matrix3d.createZero();\n tensor.fastSymmetricEigenvalues(axisVectors, moment2);\n if (moment2.x < 0.0)\n return undefined;\n MomentData.sortColumnsForIncreasingMoments(axisVectors, moment2);\n if (w < 0.0)\n axisVectors.scaleColumnsInPlace(1, -1, -1);\n moments.localToWorldMap = Transform.createOriginAndMatrix(moments.origin, axisVectors);\n moments.radiusOfGyration.set(\n Math.sqrt(Math.abs(moment2.x)), Math.sqrt(Math.abs(moment2.y)), Math.sqrt(Math.abs(moment2.z)));\n moments.radiusOfGyration.scaleInPlace(1.0 / Math.sqrt(Math.abs(w)));\n moments.absoluteQuantity = Math.abs(w);\n return moments;\n }\n /**\n * Test for match among selected members as they exist after `inertiaProductsToPrincipalAxes`.\n * * The members considered are:\n * * origin of local to world map (i.e. centroid),\n * * radius of gyration,\n * * axes of localToWorldMap.\n * * Axis direction tests allow these quirks:\n * * opposite orientation is considered matched.\n * * Full xyz symmetry: If x,y,z radii are matched, axes are not tested.\n * * Symmetry in xy plane: If x and y radii are matched, the x and y axes area allowed to spin freely. Only Z direction\n * is tested.\n * * If either or both are undefined, returns false.\n * @param dataA first set of moments.\n * @param dataB second set of moments.\n */\n public static areEquivalentPrincipalAxes(dataA: MomentData | undefined, dataB: MomentData | undefined): boolean {\n if (dataA && dataB\n && Geometry.isSameCoordinate(dataA.quantitySum, dataB.quantitySum)) { // um.. need different tolerance for area, volume?)\n if (dataA.localToWorldMap.getOrigin().isAlmostEqual(dataB.localToWorldMap.getOrigin())\n && dataA.radiusOfGyration.isAlmostEqual(dataB.radiusOfGyration)) {\n if (Geometry.isSameCoordinate(dataA.radiusOfGyration.x, dataA.radiusOfGyration.y)) {\n // We have at least xy symmetry ....\n if (Geometry.isSameCoordinate(dataA.radiusOfGyration.x, dataA.radiusOfGyration.z))\n return true;\n // just xy.\n // allow opposite z directions.\n // If the z's are aligned, x an dy can spin freely.\n const zA = dataA.localToWorldMap.matrix.columnZ();\n const zB = dataB.localToWorldMap.matrix.columnZ();\n if (zA.isParallelTo(zB, true))\n return true;\n return false;\n }\n // no symmetry. Test all three axes.\n const vectorA = Vector3d.create();\n const vectorB = Vector3d.create();\n for (let i = 0; i < 3; i++) {\n dataA.localToWorldMap.matrix.getColumn(i, vectorA);\n dataB.localToWorldMap.matrix.getColumn(i, vectorB);\n if (!vectorA.isParallelTo(vectorB, true))\n return false;\n }\n return true;\n }\n }\n return false;\n }\n /** Clear the MomentData sums to zero, and establish a new origin. */\n public clearSums(origin?: Point3d) {\n this.sums.setZero();\n if (origin)\n this.origin.setFrom(origin);\n else\n this.origin.setZero();\n }\n /** Accumulate products-of-components for given points. */\n public accumulatePointMomentsFromOrigin(points: Point3d[]) {\n for (const p of points) {\n this.sums.addMomentsInPlace(\n p.x - this.origin.x,\n p.y - this.origin.y,\n p.z - this.origin.z,\n 1.0,\n );\n }\n }\n /** Revise the accumulated sums to be \"around the centroid\". */\n public shiftOriginAndSumsToCentroidOfSums(): boolean {\n const xyz = this.sums.columnW().realPoint();\n if (xyz) {\n this.shiftOriginAndSumsByXYZ(xyz.x, xyz.y, xyz.z);\n return true;\n }\n return false;\n }\n\n /**\n * Revise the accumulated sums.\n * * add ax,ay,ax to the origin coordinates.\n * * apply the negative translation to the sums.\n */\n public shiftOriginAndSumsByXYZ(ax: number, ay: number, az: number) {\n this.origin.addXYZInPlace(ax, ay, az);\n this.sums.multiplyTranslationSandwichInPlace(-ax, -ay, -az);\n }\n /** Revise the accumulated sums so they are based at a specified origin. */\n public shiftOriginAndSumsToNewOrigin(newOrigin: XYAndZ) {\n this.shiftOriginAndSumsByXYZ(newOrigin.x - this.origin.x, newOrigin.y - this.origin.y, newOrigin.z - this.origin.z);\n }\n /**\n * Compute moments of a triangle from the origin to the given line.\n * Accumulate them to this.sums.\n * * If `pointA` is undefined, use `this.origin` as pointA.\n * * If `this.needOrigin` is set, pointB is used\n */\n public accumulateTriangleMomentsXY(pointA: XAndY | undefined, pointB: XAndY, pointC: XAndY) {\n this.setOriginXYZIfNeeded(pointB.x, pointB.y, 0.0);\n const x0 = this.origin.x;\n const y0 = this.origin.y;\n const vectorA = MomentData._vectorA =\n pointA !== undefined ? Point4d.create(pointA.x - x0, pointA.y - y0, 0.0, 1.0, MomentData._vectorA)\n : Point4d.create(this.origin.x, this.origin.y, 0.0, 1.0, MomentData._vectorA);\n const vectorB = MomentData._vectorB = Point4d.create(pointB.x - x0, pointB.y - y0, 0.0, 1.0, MomentData._vectorB);\n const vectorC = MomentData._vectorC = Point4d.create(pointC.x - x0, pointC.y - y0, 0.0, 1.0, MomentData._vectorC);\n // accumulate Return product integrals I(0<=u<=1) I (0<=v<= u) (w*W + u *U + v * V)(w*W + u *U + v * V)^ du dv\n // where w = 1-u-v\n // W = column vector (point00.x, point00.y, point00.z, 1.0) etc.\n const detJ = Geometry.crossProductXYXY(vectorB.x - vectorA.x, vectorB.y - vectorA.y, vectorC.x - vectorA.x, vectorC.y - vectorA.y);\n if (detJ !== 0.0) {\n const r1_12 = detJ / 12.0;\n const r1_24 = detJ / 24.0;\n\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, r1_12);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorB, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorC, r1_24);\n\n this.sums.addScaledOuterProductInPlace(vectorB, vectorA, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorB, r1_12);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorC, r1_24);\n\n this.sums.addScaledOuterProductInPlace(vectorC, vectorA, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorC, vectorB, r1_24);\n this.sums.addScaledOuterProductInPlace(vectorC, vectorC, r1_12);\n }\n }\n /** Add scaled outer product of (4d, unit weight) point to this.sums. */\n public accumulateScaledOuterProduct(point: XYAndZ, scaleFactor: number) {\n this.setOriginXYZIfNeeded(point.x, point.y, 0.0);\n const vectorA = MomentData._vectorA = Point4d.create(\n point.x - this.origin.x, point.y - this.origin.y, point.z - this.origin.z, 1.0, MomentData._vectorA,\n );\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, scaleFactor);\n }\n /** Accumulate wire moment integral from pointA to pointB */\n public accumulateLineMomentsXYZ(pointA: Point3d, pointB: Point3d) {\n this.setOriginXYZIfNeeded(pointA.x, pointA.y, pointA.z);\n const x0 = this.origin.x;\n const y0 = this.origin.y;\n const z0 = this.origin.z;\n const vectorA = MomentData._vectorA = Point4d.create(\n pointA.x - x0, pointA.y - y0, pointA.z - z0, 1.0, MomentData._vectorA,\n );\n const vectorB = MomentData._vectorB = Point4d.create(\n pointB.x - x0, pointB.y - y0, pointB.z - z0, 1.0, MomentData._vectorB,\n );\n const detJ = pointA.distance(pointB);\n const r1_3 = detJ / 3.0;\n const r1_6 = detJ / 6.0;\n this.sums.addScaledOuterProductInPlace(vectorA, vectorA, r1_3);\n this.sums.addScaledOuterProductInPlace(vectorA, vectorB, r1_6);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorA, r1_6);\n this.sums.addScaledOuterProductInPlace(vectorB, vectorB, r1_3);\n }\n /**\n * Compute moments of triangles from a base point to the given linestring.\n * Accumulate them to this.sums.\n * * If `pointA` is undefined, use `this.origin` as pointA.\n * * If `this.needOrigin` is set, the first point of the array is captured as local origin for subsequent sums.\n *\n */\n public accumulateTriangleToLineStringMomentsXY(sweepBase: XAndY | undefined, points: GrowableXYZArray) {\n const n = points.length;\n if (n > 1) {\n points.getPoint3dAtUncheckedPointIndex(0, this._point0);\n for (let i = 1; i < n; i++) {\n points.getPoint3dAtUncheckedPointIndex(i, this._point1);\n this.accumulateTriangleMomentsXY(sweepBase, this._point0, this._point1);\n this._point0.setFromPoint3d(this._point1);\n }\n }\n }\n /**\n * * Assemble XX, YY, XY products into a full matrix form [xx,xy,0,0; xy,yy,0,0;0,0,0,0;0,0,0,1].\n * * Sandwich this between transforms with columns [vectorU, vectorV, 0000, origin]. (Column weights 0001) (only xy\n * parts of vectors).\n * * scale by detJ for the xy-only determinant of the vectors.\n * @param productXX\n * @param productXY\n * @param productYY\n * @param area Area in caller's system.\n * @param origin Caller's origin.\n * @param vectorU Caller's U axis (not necessarily unit).\n * @param vectorV Caller's V axis (not necessarily unit).\n */\n public accumulateXYProductsInCentroidalFrame(\n productXX: number, productXY: number, productYY: number,\n area: number, origin: XAndY, vectorU: XAndY, vectorV: XAndY,\n ) {\n const centroidalProducts = Matrix4d.createRowValues(\n productXX, productXY, 0, 0,\n productXY, productYY, 0, 0,\n 0, 0, 0, 0,\n 0, 0, 0, area,\n );\n const detJ = Geometry.crossProductXYXY(vectorU.x, vectorV.x, vectorU.y, vectorV.y);\n const placement = Matrix4d.createRowValues(\n vectorU.x, vectorV.x, 0, origin.x - this.origin.x,\n vectorU.y, vectorV.y, 0, origin.y - this.origin.y,\n 0, 0, 0, 0,\n 0, 0, 0, 1,\n );\n const AB = placement.multiplyMatrixMatrix(centroidalProducts);\n const ABAT = AB.multiplyMatrixMatrixTranspose(placement);\n this.sums.addScaledInPlace(ABAT, detJ);\n }\n /**\n * Accumulate sums from other moments.\n * * Scale by given scaleFactor (e.g. sign to correct orientation).\n * * Pull the origin from `other` if `this` needs an origin.\n */\n public accumulateProducts(other: MomentData, scale: number) {\n this.setOriginIfNeeded(other.origin);\n this.sums.addTranslationSandwichInPlace(\n other.sums, this.origin.x - other.origin.x, this.origin.y - other.origin.y, this.origin.z - other.origin.z, scale,\n );\n }\n\n /**\n * Accumulate sums from Matrix4d and origin.\n * * Scale by given scaleFactor (e.g. sign to correct orientation).\n * * Trap the origin if `this` needs an origin.\n */\n public accumulateProductsFromOrigin(origin: Point3d, products: Matrix4d, scale: number) {\n this.setOriginIfNeeded(origin);\n this.sums.addTranslationSandwichInPlace(\n products, this.origin.x - origin.x, this.origin.y - origin.y, this.origin.z - origin.z, scale,\n );\n }\n /** Convert to a json data object. */\n public toJSON(): any {\n return {\n origin: this.origin,\n sums: this.sums.toJSON(),\n radiusOfGyration: this.radiusOfGyration.toJSON(),\n localToWorld: this.localToWorldMap.toJSON(),\n };\n }\n}\n"]}
@@ -17,6 +17,11 @@ import { Point3d } from "../geometry3d/Point3dVector3d";
17
17
  * @internal
18
18
  */
19
19
  export class ClusterableArray extends GrowableBlockedArray {
20
+ // (This is pretty strange)
21
+ // The sort vector is (1,c, c*c, ...)
22
+ // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.
23
+ // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.
24
+ static { this._vectorFactor = 0.8732; } // use 1.0 to rig easy tests.
20
25
  /** Return a component of the sort vector. */
21
26
  static sortVectorComponent(index) {
22
27
  let c = 1.0;
@@ -112,6 +117,8 @@ export class ClusterableArray extends GrowableBlockedArray {
112
117
  const i0 = this.blockIndexToDoubleIndex(blockIndex);
113
118
  this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;
114
119
  }
120
+ /** this value is used as cluster terminator in the Uint232Array of indices. */
121
+ static { this.clusterTerminator = 0xFFffFFff; }
115
122
  /** Test if `x` is the cluster terminator value. */
116
123
  static isClusterTerminator(x) { return x === ClusterableArray.clusterTerminator; }
117
124
  /** Return an array giving clusters of blocks with similar coordinates.
@@ -424,13 +431,6 @@ export class ClusterableArray extends GrowableBlockedArray {
424
431
  return result;
425
432
  }
426
433
  }
427
- // (This is pretty strange)
428
- // The sort vector is (1,c, c*c, ...)
429
- // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.
430
- // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.
431
- ClusterableArray._vectorFactor = 0.8732; // use 1.0 to rig easy tests.
432
- /** this value is used as cluster terminator in the Uint232Array of indices. */
433
- ClusterableArray.clusterTerminator = 0xFFffFFff;
434
434
  /**
435
435
  * @internal
436
436
  */
@@ -452,6 +452,8 @@ function updateIndices(indices, oldToNew) {
452
452
  * @internal
453
453
  */
454
454
  class PackedPointsWithIndex {
455
+ /** integer value for unknown index. */
456
+ static { this.invalidIndex = 0xFFFFffff; }
455
457
  /** construct a PackedPoints object with
456
458
  * * empty packedPoints array
457
459
  * * oldToNew indices all initialized to PackedPoints.invalidIndex
@@ -472,12 +474,12 @@ class PackedPointsWithIndex {
472
474
  return updateIndices(indices, this.oldToNew);
473
475
  }
474
476
  }
475
- /** integer value for unknown index. */
476
- PackedPointsWithIndex.invalidIndex = 0xFFFFffff;
477
477
  /**
478
478
  * @internal
479
479
  */
480
480
  class PackedPoint2dsWithIndex {
481
+ /** integer value for unknown index. */
482
+ static { this.invalidIndex = 0xFFFFffff; }
481
483
  /** construct a PackedPoints object with
482
484
  * * empty packedPoints array
483
485
  * * oldToNew indices all initialized to PackedPoints.invalidIndex
@@ -498,12 +500,12 @@ class PackedPoint2dsWithIndex {
498
500
  return updateIndices(indices, this.oldToNew);
499
501
  }
500
502
  }
501
- /** integer value for unknown index. */
502
- PackedPoint2dsWithIndex.invalidIndex = 0xFFFFffff;
503
503
  /**
504
504
  * @internal
505
505
  */
506
506
  class PackedNumbersWithIndex {
507
+ /** integer value for unknown index. */
508
+ static { this.invalidIndex = 0xFFFFffff; }
507
509
  /** construct a PackedNumbers object with
508
510
  * * empty packedNumbers array
509
511
  * * oldToNew indices all initialized to PackedNumbers.invalidIndex
@@ -524,6 +526,4 @@ class PackedNumbersWithIndex {
524
526
  return updateIndices(indices, this.oldToNew);
525
527
  }
526
528
  }
527
- /** integer value for unknown index. */
528
- PackedNumbersWithIndex.invalidIndex = 0xFFFFffff;
529
529
  //# sourceMappingURL=ClusterableArray.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,oBAAoB;IAMxD,6CAA6C;IACtC,MAAM,CAAC,mBAAmB,CAAC,KAAa;QAC7C,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,gBAAgB,CAAC,aAAa,CAAC;QACpE,OAAO,CAAC,CAAC;IACX,CAAC;IAGD;;;;OAIG;IACH,YAAmB,qBAA6B,EAAE,oBAA4B,EAAE,oBAA4B;QAC1G,KAAK,CAAC,CAAC,GAAG,qBAAqB,GAAG,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;QAC9E,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;IACtD,CAAC;IACD;;OAEG;IACa,QAAQ,CAAC,IAAc;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD;;OAEG;IACI,SAAS,CAAC,EAAU,EAAE,EAAW,EAAE,EAAW,EAAE,EAAW,EAAE,EAAW;QAC7E,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,EAAW,EAAE,CAAU,EAAE,CAAU,EAAE,CAAU;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,GAAY,EAAE,CAAU,EAAE,CAAU,EAAE,CAAU;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,SAAS;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,6CAA6C;IACtC,UAAU,CAAC,UAAkB,EAAE,MAAgB;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,8CAA8C;IACvC,UAAU,CAAC,UAAkB,EAAE,MAAgB;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5F,CAAC;IACD,uCAAuC;IAChC,YAAY,CAAC,UAAkB,EAAE,CAAS;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,iCAAiC;IAC1B,OAAO,CAAC,UAAkB,EAAE,CAAS;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,oCAAoC;IAC7B,YAAY,CAAC,UAAkB,EAAE,CAAS,EAAE,KAAa;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAC/D,CAAC;IAID,mDAAmD;IAC5C,MAAM,CAAC,mBAAmB,CAAC,CAAS,IAAa,OAAO,CAAC,KAAK,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1G;;;;;;;;;;;OAWG;IACI,qBAAqB,CAAC,mBAA2B,QAAQ,CAAC,mBAAmB;QAClF,2BAA2B;QAC3B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAE,wEAAwE;QACvI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,4BAA4B;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,0CAA0C;QACpE,IAAI,sBAAsB,GAAG,CAAC,CAAC;QAC/B,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,MAAM,EAAE,GAAG,CAAC,CAAC,CAAG,0CAA0C;QAC1D,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvB,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAClE,2CAA2C;gBAC3C,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC;gBAC7C,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC;gBACxE,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;gBAClD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,mBAAmB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBACnC,IAAI,mBAAmB,KAAK,gBAAgB,CAAC,iBAAiB;wBAAE,SAAS,CAAC,qDAAqD;oBAC/H,IAAI,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,QAAQ;wBAAE,MAAM;oBAC9D,IAAI,IAAI,CAAC,wBAAwB,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC;wBAC1G,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAY,gCAAgC;wBACtF,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAE,iDAAiD;oBACvG,CAAC;gBACH,CAAC;gBACD,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,gFAAgF;QAChF,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IACD;;OAEG;IACI,uBAAuB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,aAAa,CAAC;QACxF,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;YACpC,GAAG,GAAG,GAAG,CAAC;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAAC,CAAC;YACpE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChB,CAAC;IACH,CAAC;IACD;;OAEG;IACI,MAAM;QACX,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,KAAK,GAAU,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE;gBAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,EAAE;gBACjD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,8BAA8B,CAAC,eAA4B;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACxD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;gBACnB,UAAU,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD;;;OAGG;IACI,8BAA8B,CAAC,eAA4B;QAChE,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,mBAAmB,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;QACtD,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;gBAClB,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,mBAAmB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,uDAAuD;IAChD,aAAa,CAAC,eAA4B;QAC/C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,UAAU;gBAClB,WAAW,EAAE,CAAC;QAClB,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD;;OAEG;IACI,gCAAgC,CAAC,eAA4B;QAClE,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,qBAAqB,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;QACtD,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;QACjC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;gBACrB,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;gBAC9B,qBAAqB,CAAC,UAAU,EAAE,CAAC,GAAG,YAAY,CAAC;YACrD,CAAC;QACH,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,sBAAsB,CAAC,cAA2B,EAAE,SAAiB;QAC1E,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,CAAC;QACT,IAAI,IAAI,EAAE,IAAI,CAAC;QACf,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC;QACnC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;gBAChE,kDAAkD;gBAClD,8CAA8C;gBAC9C,KAAK,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC1C,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;oBAC3D,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;wBACtC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;wBAC3D,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;4BAChB,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;4BAC1B,cAAc,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;4BACxC,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;4BAC1B,IAAI,GAAG,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,IAAe,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAEjG,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAU,EAAE,EAAE;YAC1B,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YAC1B,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,mBAAmB,EAAE,CAAC;gBACtB,cAAc,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,cAAc,KAAK,CAAC;oBACtB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;gBACzC,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,IAAc,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAC/F,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE,GAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YAC1B,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,mBAAmB,EAAE,CAAC;gBACtB,cAAc,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,cAAc,KAAK,CAAC;oBACtB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;gBACzC,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,MAAuB,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QACjH,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC3E,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YAC1B,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,mBAAmB,EAAE,CAAC;gBACtB,cAAc,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,cAAc,KAAK,CAAC,EAAE,iDAAiD;oBACzE,MAAM,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;gBACzC,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,MAAwB,EAAE,YAAoB,QAAQ,CAAC,mBAAmB;QAElH,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YAC1B,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,mBAAmB,EAAE,CAAC;gBACtB,cAAc,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,cAAc,KAAK,CAAC,EAAE,iDAAiD;oBACzE,MAAM,CAAC,oBAAqB,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;gBACzC,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;;AAvZD,4BAA4B;AAC5B,qCAAqC;AACrC,kFAAkF;AAClF,6HAA6H;AACrG,8BAAa,GAAG,MAAM,CAAC,CAAE,6BAA6B;AAiG9E,+EAA+E;AACxD,kCAAiB,GAAG,UAAU,CAAC;AAoTxD;;GAEG;AACH,SAAS,aAAa,CAAC,OAAiB,EAAE,QAAqB;IAC7D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,CAAS,EAAE,IAAc,EAAE,EAAE;QAC3D,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;;YAAM,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,qBAAqB;IAUzB;;;OAGG;IACH,YAAY,gBAAwB;QAClC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,YAAY,CAAC;QACxD,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,aAAa,CAAC,OAAiB;QACpC,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;;AArBD,uCAAuC;AAChB,kCAAY,GAAG,UAAU,CAAC;AAuBnD;;GAEG;AACH,MAAM,uBAAuB;IAQ3B;;;OAGG;IACH,YAAY,gBAAwB,EAAE,eAAuB;QAC3D,IAAI,CAAC,oBAAoB,GAAG,IAAI,eAAe,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC,YAAY,CAAC;QAC1D,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,aAAa,CAAC,OAAiB;QACpC,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;;AArBD,uCAAuC;AAChB,oCAAY,GAAG,UAAU,CAAC;AAuBnD;;GAEG;AACF,MAAM,sBAAsB;IAQ3B;;;OAGG;IACH,YAAY,gBAAwB;QAClC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,YAAY,CAAC;QACxD,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,aAAa,CAAC,OAAiB;QACpC,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;;AArBD,uCAAuC;AAChB,mCAAY,GAAG,UAAU,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/**\n * Blocked array with operations to sort and cluster with a tolerance.\n * * Primary sorting is along an \"arbitrary\" sort vector.\n * @internal\n */\nexport class ClusterableArray extends GrowableBlockedArray {\n // (This is pretty strange)\n // The sort vector is (1,c, c*c, ...)\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\n /** Return a component of the sort vector. */\n public static sortVectorComponent(index: number): number {\n let c = 1.0;\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\n return c;\n }\n private _numCoordinatePerPoint: number;\n private _numExtraDataPerPoint: number;\n /**\n * @param numCoordinatePerPoint number of coordinates per point\n * @param numExtraDataPerPoint of extra data values per point.\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\n */\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\n this._numExtraDataPerPoint = numExtraDataPerPoint;\n this._numCoordinatePerPoint = numCoordinatePerPoint;\n }\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\n * @param data array of numDataPerBlock values.\n */\n public override addBlock(data: number[]) {\n const i0 = this.newBlockIndex() + 1;\n const n = Math.min(this.numPerBlock - 1, data.length);\n for (let i = 0; i < n; i++)\n this._data[i0 + i] = data[i];\n }\n /** add a block directly with 1 to 5 listed content parameters.\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = x0;\n if (x1 !== undefined) this._data[i0 + 2] = x1;\n if (x2 !== undefined) this._data[i0 + 3] = x2;\n if (x3 !== undefined) this._data[i0 + 4] = x3;\n if (x4 !== undefined) this._data[i0 + 5] = x4;\n }\n\n /** add a block directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xy.x;\n this._data[i0 + 2] = xy.y;\n if (a !== undefined)\n this._data[i0 + 3] = a;\n if (b !== undefined)\n this._data[i0 + 4] = b;\n if (c !== undefined)\n this._data[i0 + 5] = c;\n }\n\n /** add a block with directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xyz.x;\n this._data[i0 + 2] = xyz.y;\n this._data[i0 + 3] = xyz.z;\n if (a !== undefined)\n this._data[i0 + 4] = a;\n if (b !== undefined)\n this._data[i0 + 5] = b;\n if (c !== undefined)\n this._data[i0 + 6] = c;\n }\n /** Get the xy coordinates by point index. */\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\n }\n /** Get the xyZ coordinates by point index. */\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\n }\n /** Return a single extra data value */\n public getExtraData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\n }\n /** Return a single data value */\n public getData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + i];\n }\n\n /** Set a single extra data value */\n public setExtraData(blockIndex: number, i: number, value: number): void {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\n }\n\n /** this value is used as cluster terminator in the Uint232Array of indices. */\n public static readonly clusterTerminator = 0xFFffFFff;\n /** Test if `x` is the cluster terminator value. */\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\n /** Return an array giving clusters of blocks with similar coordinates.\n *\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\n *\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\n * candidates for clusters.\n * ** The usual solution is to sort by u value, which is a dot product along some skew direction, and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\n * ** apply setupPrimaryClusterSort to prepare that!!!\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\n */\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\n // install primary sort key\n this.setupPrimaryClusterSort();\n // presort by all coordinates ....\n const firstSort = this.sortIndicesLexical();\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\n let m = 0; // number of cluster indices\n const n = this.numBlocks; // and this must match firstSort.length !!\n let clusterStartBlockIndex = 0;\n let candidateBlockIndex = 0;\n let barrierU = 0.0;\n let i = 0;\n let j = 0;\n\n const k0 = 1; // beginning of active column for distance\n const k1 = 1 + this._numCoordinatePerPoint;\n for (i = 0; i < n; i++) {\n clusterStartBlockIndex = firstSort[i];\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\n // unused block, so it becomes a cluster...\n clusterIndices[m++] = clusterStartBlockIndex;\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\n firstSort[i] = ClusterableArray.clusterTerminator;\n for (j = i + 1; j < n; j++) {\n candidateBlockIndex = firstSort[j];\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\n }\n }\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\n }\n }\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\n return clusterIndices.slice(0, m);\n }\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\n * This is normally called before clusterIndicesLexical.\n */\n public setupPrimaryClusterSort() {\n const nb = this.numBlocks;\n const nc = this._numCoordinatePerPoint;\n const vector = new Float64Array(nc);\n vector[0] = 1.0;\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\n let k = 0;\n let dot = 0.0;\n const data = this._data;\n for (let b = 0; b < nb; b++) {\n k = this.blockIndexToDoubleIndex(b);\n dot = 0.0;\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\n data[k] = dot;\n }\n }\n /** Convert the cluster data to an array of tuples with point i in the form\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\n */\n public toJSON(): any[] {\n const result: any[] = [];\n for (let b = 0; b < this.numBlocks; b++) {\n let i = this.blockIndexToDoubleIndex(b);\n const chunk: any[] = [b, this._data[i++]];\n const coordinates = [];\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\n chunk.push(coordinates);\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\n chunk.push(this._data[i++]);\n result.push(chunk);\n }\n return result;\n }\n /**\n * Return an array of indices from block index to cluster index.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\n const numBlocks = this.numBlocks;\n const blockToCluster = new Uint32Array(numBlocks);\n blockToCluster.fill(ClusterableArray.clusterTerminator);\n let numCluster = 0;\n for (const b of clusteredBlocks) {\n if (b >= numBlocks) {\n numCluster++;\n } else {\n blockToCluster[b] = numCluster;\n }\n }\n return blockToCluster;\n }\n /**\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n const n = clusteredBlocks.length;\n const numBlocks = this.numBlocks;\n const blockToClusterStart = new Uint32Array(numBlocks);\n const terminator = ClusterableArray.clusterTerminator;\n blockToClusterStart.fill(terminator);\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k > numBlocks) {\n clusterStart = i + 1;\n } else {\n blockToClusterStart[k] = clusterStart;\n }\n }\n return blockToClusterStart;\n }\n /** count the clusters in the clusteredBlocks array. */\n public countClusters(clusteredBlocks: Uint32Array): number {\n let numClusters = 0;\n const terminator = ClusterableArray.clusterTerminator;\n for (const b of clusteredBlocks) {\n if (b === terminator)\n numClusters++;\n }\n return numClusters;\n }\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\n * the cluster's block indices appear in clusterBlocks\n */\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n let numCluster = this.countClusters(clusteredBlocks);\n const clusterToClusterStart = new Uint32Array(numCluster);\n const terminator = ClusterableArray.clusterTerminator;\n clusterToClusterStart.fill(terminator);\n const n = clusteredBlocks.length;\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k === terminator) {\n clusterStart = i + 1;\n } else if (i === clusterStart) {\n clusterToClusterStart[numCluster++] = clusterStart;\n }\n }\n return clusterToClusterStart;\n }\n\n /**\n * Sort terminator-delimited subsets of an array of indices into the table, using a single data value as sort key.\n * @param blockedIndices indices, organized as blocks of good indices terminated by the clusterTerminator. Each block is individually sorted on return.\n * @param dataIndex index of the data key, e.g., if the sort key is the first extraData (angle) after x and y coordinate data, pass dataIndex = 2.\n */\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\n const dataOffset = 1 + dataIndex;\n let kBegin = 0;\n let swap;\n let key0, key1;\n const numK = blockedIndices.length;\n for (let kEnd = 0; kEnd < numK; kEnd++) {\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\n // bubble sort blockedIndices[kBegin <= k < kEnd].\n // (search for minimum remaining, swap . . )\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\n if (key1 < key0) {\n swap = blockedIndices[k0];\n blockedIndices[k0] = blockedIndices[k1];\n blockedIndices[k1] = swap;\n key0 = key1;\n }\n }\n }\n kBegin = kEnd + 1;\n }\n }\n }\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, data.length);\n data.forEach((p: Point3d) => {\n clusterArray.addDirect(p.x, p.y, p.z);\n });\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedPoints.push(data[k].clone());\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns number array with indices mapping old to new.\n * @param data numbers to cluster.\n */\n public static clusterNumberArray(data: number[], tolerance: number = Geometry.smallMetricDistance): PackedNumbersWithIndex {\n const clusterArray = new ClusterableArray(1, 0, data.length);\n data.forEach((x: number) => {clusterArray.addDirect(x);});\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedNumbersWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedNumbers.push(data[k]);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\n const clusterArray = new ClusterableArray(2, 0, source.length);\n const p = Point2d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint2dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const numPackedPoints = clusterArray.countClusters(order);\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, source.length);\n const p = Point3d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint3dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y, p.z);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(source.length);\n const numPackedPoints = clusterArray.countClusters(order);\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n}\n\n/**\n * @internal\n */\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\n let numErrors = 0;\n indices.forEach((value: number, i: number, data: number[]) => {\n if (value < oldToNew.length) {\n data[i] = oldToNew[value];\n } else numErrors++;\n });\n return numErrors === 0;\n}\n\n/**\n * Data carrier class for\n * * packedPoints = an array of Point3d\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\n * @internal\n */\nclass PackedPointsWithIndex {\n /** Array of Point3d */\n public packedPoints: Point3d[];\n /** array of coordinates packed in GrowableXYZArray */\n public growablePackedPoints: GrowableXYZArray | undefined;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedPoints = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\nclass PackedPoint2dsWithIndex {\n /** array of coordinates packed in GrowableXYArray */\n public growablePackedPoints: GrowableXYArray;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\n class PackedNumbersWithIndex {\n /** Array of numbers */\n public packedNumbers: number[];\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedNumbers object with\n * * empty packedNumbers array\n * * oldToNew indices all initialized to PackedNumbers.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedNumbers = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n"]}
1
+ {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/**\n * Blocked array with operations to sort and cluster with a tolerance.\n * * Primary sorting is along an \"arbitrary\" sort vector.\n * @internal\n */\nexport class ClusterableArray extends GrowableBlockedArray {\n // (This is pretty strange)\n // The sort vector is (1,c, c*c, ...)\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\n /** Return a component of the sort vector. */\n public static sortVectorComponent(index: number): number {\n let c = 1.0;\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\n return c;\n }\n private _numCoordinatePerPoint: number;\n private _numExtraDataPerPoint: number;\n /**\n * @param numCoordinatePerPoint number of coordinates per point\n * @param numExtraDataPerPoint of extra data values per point.\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\n */\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\n this._numExtraDataPerPoint = numExtraDataPerPoint;\n this._numCoordinatePerPoint = numCoordinatePerPoint;\n }\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\n * @param data array of numDataPerBlock values.\n */\n public override addBlock(data: number[]) {\n const i0 = this.newBlockIndex() + 1;\n const n = Math.min(this.numPerBlock - 1, data.length);\n for (let i = 0; i < n; i++)\n this._data[i0 + i] = data[i];\n }\n /** add a block directly with 1 to 5 listed content parameters.\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = x0;\n if (x1 !== undefined) this._data[i0 + 2] = x1;\n if (x2 !== undefined) this._data[i0 + 3] = x2;\n if (x3 !== undefined) this._data[i0 + 4] = x3;\n if (x4 !== undefined) this._data[i0 + 5] = x4;\n }\n\n /** add a block directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xy.x;\n this._data[i0 + 2] = xy.y;\n if (a !== undefined)\n this._data[i0 + 3] = a;\n if (b !== undefined)\n this._data[i0 + 4] = b;\n if (c !== undefined)\n this._data[i0 + 5] = c;\n }\n\n /** add a block with directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xyz.x;\n this._data[i0 + 2] = xyz.y;\n this._data[i0 + 3] = xyz.z;\n if (a !== undefined)\n this._data[i0 + 4] = a;\n if (b !== undefined)\n this._data[i0 + 5] = b;\n if (c !== undefined)\n this._data[i0 + 6] = c;\n }\n /** Get the xy coordinates by point index. */\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\n }\n /** Get the xyZ coordinates by point index. */\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\n }\n /** Return a single extra data value */\n public getExtraData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\n }\n /** Return a single data value */\n public getData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + i];\n }\n\n /** Set a single extra data value */\n public setExtraData(blockIndex: number, i: number, value: number): void {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\n }\n\n /** this value is used as cluster terminator in the Uint232Array of indices. */\n public static readonly clusterTerminator = 0xFFffFFff;\n /** Test if `x` is the cluster terminator value. */\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\n /** Return an array giving clusters of blocks with similar coordinates.\n *\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\n *\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\n * candidates for clusters.\n * ** The usual solution is to sort by u value, which is a dot product along some skew direction, and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\n * ** apply setupPrimaryClusterSort to prepare that!!!\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\n */\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\n // install primary sort key\n this.setupPrimaryClusterSort();\n // presort by all coordinates ....\n const firstSort = this.sortIndicesLexical();\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\n let m = 0; // number of cluster indices\n const n = this.numBlocks; // and this must match firstSort.length !!\n let clusterStartBlockIndex = 0;\n let candidateBlockIndex = 0;\n let barrierU = 0.0;\n let i = 0;\n let j = 0;\n\n const k0 = 1; // beginning of active column for distance\n const k1 = 1 + this._numCoordinatePerPoint;\n for (i = 0; i < n; i++) {\n clusterStartBlockIndex = firstSort[i];\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\n // unused block, so it becomes a cluster...\n clusterIndices[m++] = clusterStartBlockIndex;\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\n firstSort[i] = ClusterableArray.clusterTerminator;\n for (j = i + 1; j < n; j++) {\n candidateBlockIndex = firstSort[j];\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\n }\n }\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\n }\n }\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\n return clusterIndices.slice(0, m);\n }\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\n * This is normally called before clusterIndicesLexical.\n */\n public setupPrimaryClusterSort() {\n const nb = this.numBlocks;\n const nc = this._numCoordinatePerPoint;\n const vector = new Float64Array(nc);\n vector[0] = 1.0;\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\n let k = 0;\n let dot = 0.0;\n const data = this._data;\n for (let b = 0; b < nb; b++) {\n k = this.blockIndexToDoubleIndex(b);\n dot = 0.0;\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\n data[k] = dot;\n }\n }\n /** Convert the cluster data to an array of tuples with point i in the form\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\n */\n public toJSON(): any[] {\n const result: any[] = [];\n for (let b = 0; b < this.numBlocks; b++) {\n let i = this.blockIndexToDoubleIndex(b);\n const chunk: any[] = [b, this._data[i++]];\n const coordinates = [];\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\n chunk.push(coordinates);\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\n chunk.push(this._data[i++]);\n result.push(chunk);\n }\n return result;\n }\n /**\n * Return an array of indices from block index to cluster index.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\n const numBlocks = this.numBlocks;\n const blockToCluster = new Uint32Array(numBlocks);\n blockToCluster.fill(ClusterableArray.clusterTerminator);\n let numCluster = 0;\n for (const b of clusteredBlocks) {\n if (b >= numBlocks) {\n numCluster++;\n } else {\n blockToCluster[b] = numCluster;\n }\n }\n return blockToCluster;\n }\n /**\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n const n = clusteredBlocks.length;\n const numBlocks = this.numBlocks;\n const blockToClusterStart = new Uint32Array(numBlocks);\n const terminator = ClusterableArray.clusterTerminator;\n blockToClusterStart.fill(terminator);\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k > numBlocks) {\n clusterStart = i + 1;\n } else {\n blockToClusterStart[k] = clusterStart;\n }\n }\n return blockToClusterStart;\n }\n /** count the clusters in the clusteredBlocks array. */\n public countClusters(clusteredBlocks: Uint32Array): number {\n let numClusters = 0;\n const terminator = ClusterableArray.clusterTerminator;\n for (const b of clusteredBlocks) {\n if (b === terminator)\n numClusters++;\n }\n return numClusters;\n }\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\n * the cluster's block indices appear in clusterBlocks\n */\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n let numCluster = this.countClusters(clusteredBlocks);\n const clusterToClusterStart = new Uint32Array(numCluster);\n const terminator = ClusterableArray.clusterTerminator;\n clusterToClusterStart.fill(terminator);\n const n = clusteredBlocks.length;\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k === terminator) {\n clusterStart = i + 1;\n } else if (i === clusterStart) {\n clusterToClusterStart[numCluster++] = clusterStart;\n }\n }\n return clusterToClusterStart;\n }\n\n /**\n * Sort terminator-delimited subsets of an array of indices into the table, using a single data value as sort key.\n * @param blockedIndices indices, organized as blocks of good indices terminated by the clusterTerminator. Each block is individually sorted on return.\n * @param dataIndex index of the data key, e.g., if the sort key is the first extraData (angle) after x and y coordinate data, pass dataIndex = 2.\n */\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\n const dataOffset = 1 + dataIndex;\n let kBegin = 0;\n let swap;\n let key0, key1;\n const numK = blockedIndices.length;\n for (let kEnd = 0; kEnd < numK; kEnd++) {\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\n // bubble sort blockedIndices[kBegin <= k < kEnd].\n // (search for minimum remaining, swap . . )\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\n if (key1 < key0) {\n swap = blockedIndices[k0];\n blockedIndices[k0] = blockedIndices[k1];\n blockedIndices[k1] = swap;\n key0 = key1;\n }\n }\n }\n kBegin = kEnd + 1;\n }\n }\n }\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, data.length);\n data.forEach((p: Point3d) => {\n clusterArray.addDirect(p.x, p.y, p.z);\n });\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedPoints.push(data[k].clone());\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns number array with indices mapping old to new.\n * @param data numbers to cluster.\n */\n public static clusterNumberArray(data: number[], tolerance: number = Geometry.smallMetricDistance): PackedNumbersWithIndex {\n const clusterArray = new ClusterableArray(1, 0, data.length);\n data.forEach((x: number) => {clusterArray.addDirect(x);});\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedNumbersWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedNumbers.push(data[k]);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\n const clusterArray = new ClusterableArray(2, 0, source.length);\n const p = Point2d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint2dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const numPackedPoints = clusterArray.countClusters(order);\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, source.length);\n const p = Point3d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint3dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y, p.z);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(source.length);\n const numPackedPoints = clusterArray.countClusters(order);\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n}\n\n/**\n * @internal\n */\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\n let numErrors = 0;\n indices.forEach((value: number, i: number, data: number[]) => {\n if (value < oldToNew.length) {\n data[i] = oldToNew[value];\n } else numErrors++;\n });\n return numErrors === 0;\n}\n\n/**\n * Data carrier class for\n * * packedPoints = an array of Point3d\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\n * @internal\n */\nclass PackedPointsWithIndex {\n /** Array of Point3d */\n public packedPoints: Point3d[];\n /** array of coordinates packed in GrowableXYZArray */\n public growablePackedPoints: GrowableXYZArray | undefined;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedPoints = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\nclass PackedPoint2dsWithIndex {\n /** array of coordinates packed in GrowableXYArray */\n public growablePackedPoints: GrowableXYArray;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\n class PackedNumbersWithIndex {\n /** Array of numbers */\n public packedNumbers: number[];\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedNumbers object with\n * * empty packedNumbers array\n * * oldToNew indices all initialized to PackedNumbers.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedNumbers = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n"]}
@@ -7,6 +7,7 @@
7
7
  * @internal
8
8
  */
9
9
  export class PascalCoefficients {
10
+ static { this._allRows = []; }
10
11
  /**
11
12
  * * return a row of the pascal table.
12
13
  * * The contents must not be altered by the user !!!
@@ -85,5 +86,4 @@ export class PascalCoefficients {
85
86
  return result;
86
87
  }
87
88
  }
88
- PascalCoefficients._allRows = [];
89
89
  //# sourceMappingURL=PascalCoefficients.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PascalCoefficients.js","sourceRoot":"","sources":["../../../src/numerics/PascalCoefficients.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/**\n * PascalCoeffients class has static methods which return rows of the PascalTriangle.\n * @internal\n */\nexport class PascalCoefficients {\n private static _allRows: Float64Array[] = [];\n /**\n * * return a row of the pascal table.\n * * The contents must not be altered by the user !!!\n * * Hypothetically the request row can be any integer.\n * * BUT in practice, values 60 create integer entries that are too big for IEEE double.\n */\n public static getRow(row: number): Float64Array {\n const allRows = PascalCoefficients._allRows;\n if (allRows.length === 0) {\n // seed the table . . .\n allRows.push(new Float64Array([1]));\n allRows.push(new Float64Array([1, 1]));\n allRows.push(new Float64Array([1, 2, 1]));\n allRows.push(new Float64Array([1, 3, 3, 1]));\n allRows.push(new Float64Array([1, 4, 6, 4, 1]));\n allRows.push(new Float64Array([1, 5, 10, 10, 5, 1]));\n allRows.push(new Float64Array([1, 6, 15, 20, 15, 6, 1]));\n allRows.push(new Float64Array([1, 7, 21, 35, 35, 21, 7, 1]));\n }\n\n while (allRows.length <= row) {\n const k = allRows.length;\n const oldRow = allRows[k - 1];\n const newRow = new Float64Array(k + 1);\n newRow[0] = 1.0;\n for (let i = 1; i < k; i++)\n newRow[i] = oldRow[i - 1] + oldRow[i];\n newRow[k] = 1.0;\n allRows.push(newRow);\n }\n return allRows[row];\n }\n /**\n * Return an array with Bezier weighted pascal coefficients\n * @param order output size. The index of the row of the Pascal triangle supplying weights is `order - 1`.\n * @param u parameter value\n * @param result optional destination array of length `order`. If the destination array is too small, a new Float64Array is allocated.\n */\n public static getBezierBasisValues(order: number, u: number, result?: Float64Array): Float64Array {\n const row = order - 1;\n const pascalRow = PascalCoefficients.getRow(row);\n if (result === undefined || result.length < order)\n result = new Float64Array(order);\n for (let i = 0; i < order; i++)\n result[i] = pascalRow[i];\n // multiply by increasing powers of u ...\n let p = u;\n for (let i = 1; i < order; i++ , p *= u) {\n result[i] *= p;\n }\n // multiply by powers of (1-u), working from right\n const v = 1.0 - u;\n p = v;\n for (let i = order - 2; i >= 0; i-- , p *= v) {\n result[i] *= p;\n }\n return result;\n }\n\n /**\n * Return an array with derivatives of Bezier weighted pascal coefficients\n * @param order output size. The index of the row of the Pascal triangle supplying weights is `order - 2`.\n * @param u parameter value\n * @param result optional destination array of length `order`. If the destination array is too small, a new Float64Array is allocated.\n */\n public static getBezierBasisDerivatives(order: number, u: number, result?: Float64Array): Float64Array {\n if (result === undefined || result.length < order)\n result = new Float64Array(order);\n result = this.getBezierBasisValues(order - 1, u, result);\n // derivative is df/du = (order-1 ) * sum ( q[i+1] - q[i]) summed on 0 <= i < order - 1.\\\n // evaluate lower order basis, overwrite in place from right to left\n const f = order - 1;\n result[order - 1] = f * result[order - 2];\n for (let k = order - 2; k > 0; k--) {\n result[k] = f * (result[k - 1] - result[k]);\n }\n result[0] = - f * result[0];\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"PascalCoefficients.js","sourceRoot":"","sources":["../../../src/numerics/PascalCoefficients.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/**\n * PascalCoeffients class has static methods which return rows of the PascalTriangle.\n * @internal\n */\nexport class PascalCoefficients {\n private static _allRows: Float64Array[] = [];\n /**\n * * return a row of the pascal table.\n * * The contents must not be altered by the user !!!\n * * Hypothetically the request row can be any integer.\n * * BUT in practice, values 60 create integer entries that are too big for IEEE double.\n */\n public static getRow(row: number): Float64Array {\n const allRows = PascalCoefficients._allRows;\n if (allRows.length === 0) {\n // seed the table . . .\n allRows.push(new Float64Array([1]));\n allRows.push(new Float64Array([1, 1]));\n allRows.push(new Float64Array([1, 2, 1]));\n allRows.push(new Float64Array([1, 3, 3, 1]));\n allRows.push(new Float64Array([1, 4, 6, 4, 1]));\n allRows.push(new Float64Array([1, 5, 10, 10, 5, 1]));\n allRows.push(new Float64Array([1, 6, 15, 20, 15, 6, 1]));\n allRows.push(new Float64Array([1, 7, 21, 35, 35, 21, 7, 1]));\n }\n\n while (allRows.length <= row) {\n const k = allRows.length;\n const oldRow = allRows[k - 1];\n const newRow = new Float64Array(k + 1);\n newRow[0] = 1.0;\n for (let i = 1; i < k; i++)\n newRow[i] = oldRow[i - 1] + oldRow[i];\n newRow[k] = 1.0;\n allRows.push(newRow);\n }\n return allRows[row];\n }\n /**\n * Return an array with Bezier weighted pascal coefficients\n * @param order output size. The index of the row of the Pascal triangle supplying weights is `order - 1`.\n * @param u parameter value\n * @param result optional destination array of length `order`. If the destination array is too small, a new Float64Array is allocated.\n */\n public static getBezierBasisValues(order: number, u: number, result?: Float64Array): Float64Array {\n const row = order - 1;\n const pascalRow = PascalCoefficients.getRow(row);\n if (result === undefined || result.length < order)\n result = new Float64Array(order);\n for (let i = 0; i < order; i++)\n result[i] = pascalRow[i];\n // multiply by increasing powers of u ...\n let p = u;\n for (let i = 1; i < order; i++ , p *= u) {\n result[i] *= p;\n }\n // multiply by powers of (1-u), working from right\n const v = 1.0 - u;\n p = v;\n for (let i = order - 2; i >= 0; i-- , p *= v) {\n result[i] *= p;\n }\n return result;\n }\n\n /**\n * Return an array with derivatives of Bezier weighted pascal coefficients\n * @param order output size. The index of the row of the Pascal triangle supplying weights is `order - 2`.\n * @param u parameter value\n * @param result optional destination array of length `order`. If the destination array is too small, a new Float64Array is allocated.\n */\n public static getBezierBasisDerivatives(order: number, u: number, result?: Float64Array): Float64Array {\n if (result === undefined || result.length < order)\n result = new Float64Array(order);\n result = this.getBezierBasisValues(order - 1, u, result);\n // derivative is df/du = (order-1 ) * sum ( q[i+1] - q[i]) summed on 0 <= i < order - 1.\\\n // evaluate lower order basis, overwrite in place from right to left\n const f = order - 1;\n result[order - 1] = f * result[order - 2];\n for (let k = order - 2; k > 0; k--) {\n result[k] = f * (result[k - 1] - result[k]);\n }\n result[0] = - f * result[0];\n return result;\n }\n}\n"]}
@@ -23,6 +23,7 @@ export var ConstraintState;
23
23
  * @internal
24
24
  */
25
25
  export class PolarData {
26
+ static { this._defaultRadius = 1.0; }
26
27
  static get defaultRadius() { return PolarData._defaultRadius; }
27
28
  /** Count the number of defined values among x,y,r, theta */
28
29
  get numberOfConstrainedScalars() {
@@ -158,5 +159,4 @@ export class PolarData {
158
159
  return result;
159
160
  }
160
161
  }
161
- PolarData._defaultRadius = 1.0;
162
162
  //# sourceMappingURL=PolarData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PolarData.js","sourceRoot":"","sources":["../../../src/numerics/PolarData.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD;;GAEG;AACH,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,2DAAW,CAAA;IACX,mEAAe,CAAA;IACf,8EAAqB,CAAA;IACrB,2DAAW,CAAA;AAEb,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED;;;GAGG;AACH,MAAM,OAAO,SAAS;IAEb,MAAM,KAAK,aAAa,KAAa,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAa9E,4DAA4D;IAC5D,IAAW,0BAA0B;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,gEAAgE;IACzD,MAAM,CAAC,kBAAkB,CAAC,KAAuB,EAAE,CAAU,EAAE,CAAU,EAAE,CAAU,EAAE,KAAa;QACzG,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,QAAyB;QACpD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0FAA0F;IACnF,MAAM,CAAC,gBAAgB,CAAC,KAAgB;QAC7C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,kDAAkD;QAClD,qFAAqF;QACrF,yGAAyG;QACzG,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzK,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBACnB,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3H,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/H,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzE,oEAAoE;gBACpE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,oDAAoD;oBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;gBAClG,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC;iBAAM,CAAC,CAAE,4CAA4C;gBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAG,2CAA2C;YAC/E,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBACnB,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3H,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/H,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzE,oEAAoE;gBACpE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,oDAAoD;oBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAC1G,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC;iBAAM,CAAC,CAAE,8CAA8C;gBACtD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,CAAC,GAAG,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACvD,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,2FAA2F;QAC3F,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;gBACrE,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;;AAnIc,wBAAc,GAAG,GAAG,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CoordinateXYZ } from \"../curve/CoordinateXYZ\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/** Enumeration of how constraints have been resolved\n * @internal\n */\nexport enum ConstraintState {\n unknown = 0,\n singlePoint = 1,\n impossibleValues = -1,\n onCurve = 2,\n\n}\n\n/**\n * PolarData carries (possibly incomplete) data for converting among polar and cartesian coordinates.\n * @internal\n */\nexport class PolarData {\n private static _defaultRadius = 1.0;\n public static get defaultRadius(): number { return PolarData._defaultRadius; }\n /** x coordinate, possibly unknown */\n public x?: number;\n /** y coordinate, possibly unknown */\n public y?: number;\n /** radius, possibly unknown */\n public r?: number;\n /** angle, possibly unknown */\n public theta?: Angle;\n /** point, line, or arc geometry, as determined by solveFromScalars */\n public geometry?: GeometryQuery;\n /** enumeration of resolved state validity conditions. */\n public state?: ConstraintState;\n /** Count the number of defined values among x,y,r, theta */\n public get numberOfConstrainedScalars(): number {\n let n = 0;\n if (this.x !== undefined) n++;\n if (this.y !== undefined) n++;\n if (this.r !== undefined) n++;\n if (this.theta !== undefined) n++;\n return n;\n }\n /** Create with any combination of known and unknown scalars. */\n public static createMixedScalars(state?: ConstraintState, x?: number, y?: number, r?: number, theta?: Angle): PolarData {\n const result = new PolarData();\n result.x = x;\n result.y = y;\n result.r = r;\n result.theta = theta !== undefined ? theta.clone() : undefined;\n result.state = state;\n return result;\n }\n\n /** Clone the scalar data, replace the state.\n * * Geometry is NOT cloned.\n */\n public cloneScalarsWithState(newState: ConstraintState): PolarData {\n const result = new PolarData();\n result.x = this.x;\n result.y = this.y;\n result.r = this.r;\n result.theta = this.theta !== undefined ? this.theta.clone() : undefined;\n result.state = newState;\n return result;\n }\n\n /** Given a possibly incomplete set of x,y,r,theta, determine the possible completions. */\n public static solveFromScalars(known: PolarData): PolarData[] {\n const result = [];\n // .. fill out known combinations (x,y) (x,r) etc.\n // .. any \"singlePoints\" gets created with no geometry, but geometry fills in at end.\n // .. \"free on curve\" has curve filled in, with finite curve range controlled by PolarData.defaultRadius.\n if (known.x !== undefined) {\n if (known.y !== undefined) {\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, known.y, Geometry.hypotenuseXY(known.x, known.y), Angle.createAtan2(known.y, known.x)));\n } else if (known.r !== undefined) {\n const rr = known.r * known.r;\n const xx = known.x * known.x;\n const yy = rr - xx;\n if (yy < 0.0) {\n result.push(known.cloneScalarsWithState(ConstraintState.impossibleValues));\n } else {\n const y = Math.sqrt(yy);\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, y, known.r, Angle.createAtan2(y, known.x)));\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, -y, known.r, Angle.createAtan2(-y, known.x)));\n }\n } else if (known.theta !== undefined) {\n const r = Geometry.conditionalDivideFraction(known.x, known.theta.cos());\n // test 4*theta to isolate either positive or negative PI/2 case ...\n if (r === undefined) {\n // Anywhere on y axis does has x=0, this angle . . .\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYXY(0, PolarData._defaultRadius, 0, PolarData._defaultRadius);\n } else {\n const y = r * known.theta.sin();\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, y, r, known.theta));\n }\n } else { // only x known --- fill out a vertical line\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(known.x, PolarData._defaultRadius, 0, known.x, PolarData._defaultRadius, 0);\n }\n } else if (known.y !== undefined) { // and we already know x is undefined .....\n if (known.r !== undefined) {\n const rr = known.r * known.r;\n const yy = known.y * known.y;\n const xx = rr - yy;\n if (xx < 0.0) {\n result.push(known.cloneScalarsWithState(ConstraintState.impossibleValues));\n } else {\n const x = Math.sqrt(xx);\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, x, known.y, known.r, Angle.createAtan2(known.y, x)));\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, -x, known.y, known.r, Angle.createAtan2(known.y, -x)));\n }\n } else if (known.theta !== undefined) {\n const r = Geometry.conditionalDivideFraction(known.y, known.theta.sin());\n // test 4*theta to isolate either positive or negative PI/2 case ...\n if (r === undefined) {\n // Anywhere on y axis does has x=0, this angle . . .\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(0, PolarData._defaultRadius, 0, 0, PolarData._defaultRadius, 0);\n } else {\n const x = r * known.theta.cos();\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, x, known.y, r, known.theta));\n }\n } else { // only x known --- fill out a horizontal line\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(PolarData._defaultRadius, known.y, 0, PolarData._defaultRadius, known.y, 0);\n }\n } else if (known.r !== undefined) {\n if (known.theta !== undefined) {\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.r * known.theta.cos(), known.r * known.theta.sin(), known.r, known.theta));\n } else {\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = Arc3d.createXY(Point3d.create(0, 0, 0), known.r);\n result.push(q);\n }\n } else if (known.theta !== undefined) {\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n const x = PolarData._defaultRadius * known.theta.cos();\n const y = PolarData._defaultRadius * known.theta.sin();\n q.geometry = LineSegment3d.createXYXY(-x, -y, x, y);\n result.push(q);\n }\n // ----------------------------------------------------------------------------------------\n // add tangible geometry to single points ...\n for (const r of result) {\n if (r.state === ConstraintState.singlePoint && r.geometry === undefined)\n r.geometry = CoordinateXYZ.createXYZ(r.x, r.y, 0.0);\n }\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"PolarData.js","sourceRoot":"","sources":["../../../src/numerics/PolarData.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD;;GAEG;AACH,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,2DAAW,CAAA;IACX,mEAAe,CAAA;IACf,8EAAqB,CAAA;IACrB,2DAAW,CAAA;AAEb,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED;;;GAGG;AACH,MAAM,OAAO,SAAS;aACL,mBAAc,GAAG,GAAG,CAAC;IAC7B,MAAM,KAAK,aAAa,KAAa,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAa9E,4DAA4D;IAC5D,IAAW,0BAA0B;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,gEAAgE;IACzD,MAAM,CAAC,kBAAkB,CAAC,KAAuB,EAAE,CAAU,EAAE,CAAU,EAAE,CAAU,EAAE,KAAa;QACzG,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,QAAyB;QACpD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0FAA0F;IACnF,MAAM,CAAC,gBAAgB,CAAC,KAAgB;QAC7C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,kDAAkD;QAClD,qFAAqF;QACrF,yGAAyG;QACzG,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzK,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBACnB,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3H,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/H,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzE,oEAAoE;gBACpE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,oDAAoD;oBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;gBAClG,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC;iBAAM,CAAC,CAAE,4CAA4C;gBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAG,2CAA2C;YAC/E,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBACnB,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3H,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/H,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACzE,oEAAoE;gBACpE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,oDAAoD;oBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAC1G,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC;iBAAM,CAAC,CAAE,8CAA8C;gBACtD,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,CAAC,GAAG,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACvD,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,2FAA2F;QAC3F,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;gBACrE,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CoordinateXYZ } from \"../curve/CoordinateXYZ\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { Geometry } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/** Enumeration of how constraints have been resolved\n * @internal\n */\nexport enum ConstraintState {\n unknown = 0,\n singlePoint = 1,\n impossibleValues = -1,\n onCurve = 2,\n\n}\n\n/**\n * PolarData carries (possibly incomplete) data for converting among polar and cartesian coordinates.\n * @internal\n */\nexport class PolarData {\n private static _defaultRadius = 1.0;\n public static get defaultRadius(): number { return PolarData._defaultRadius; }\n /** x coordinate, possibly unknown */\n public x?: number;\n /** y coordinate, possibly unknown */\n public y?: number;\n /** radius, possibly unknown */\n public r?: number;\n /** angle, possibly unknown */\n public theta?: Angle;\n /** point, line, or arc geometry, as determined by solveFromScalars */\n public geometry?: GeometryQuery;\n /** enumeration of resolved state validity conditions. */\n public state?: ConstraintState;\n /** Count the number of defined values among x,y,r, theta */\n public get numberOfConstrainedScalars(): number {\n let n = 0;\n if (this.x !== undefined) n++;\n if (this.y !== undefined) n++;\n if (this.r !== undefined) n++;\n if (this.theta !== undefined) n++;\n return n;\n }\n /** Create with any combination of known and unknown scalars. */\n public static createMixedScalars(state?: ConstraintState, x?: number, y?: number, r?: number, theta?: Angle): PolarData {\n const result = new PolarData();\n result.x = x;\n result.y = y;\n result.r = r;\n result.theta = theta !== undefined ? theta.clone() : undefined;\n result.state = state;\n return result;\n }\n\n /** Clone the scalar data, replace the state.\n * * Geometry is NOT cloned.\n */\n public cloneScalarsWithState(newState: ConstraintState): PolarData {\n const result = new PolarData();\n result.x = this.x;\n result.y = this.y;\n result.r = this.r;\n result.theta = this.theta !== undefined ? this.theta.clone() : undefined;\n result.state = newState;\n return result;\n }\n\n /** Given a possibly incomplete set of x,y,r,theta, determine the possible completions. */\n public static solveFromScalars(known: PolarData): PolarData[] {\n const result = [];\n // .. fill out known combinations (x,y) (x,r) etc.\n // .. any \"singlePoints\" gets created with no geometry, but geometry fills in at end.\n // .. \"free on curve\" has curve filled in, with finite curve range controlled by PolarData.defaultRadius.\n if (known.x !== undefined) {\n if (known.y !== undefined) {\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, known.y, Geometry.hypotenuseXY(known.x, known.y), Angle.createAtan2(known.y, known.x)));\n } else if (known.r !== undefined) {\n const rr = known.r * known.r;\n const xx = known.x * known.x;\n const yy = rr - xx;\n if (yy < 0.0) {\n result.push(known.cloneScalarsWithState(ConstraintState.impossibleValues));\n } else {\n const y = Math.sqrt(yy);\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, y, known.r, Angle.createAtan2(y, known.x)));\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, -y, known.r, Angle.createAtan2(-y, known.x)));\n }\n } else if (known.theta !== undefined) {\n const r = Geometry.conditionalDivideFraction(known.x, known.theta.cos());\n // test 4*theta to isolate either positive or negative PI/2 case ...\n if (r === undefined) {\n // Anywhere on y axis does has x=0, this angle . . .\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYXY(0, PolarData._defaultRadius, 0, PolarData._defaultRadius);\n } else {\n const y = r * known.theta.sin();\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.x, y, r, known.theta));\n }\n } else { // only x known --- fill out a vertical line\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(known.x, PolarData._defaultRadius, 0, known.x, PolarData._defaultRadius, 0);\n }\n } else if (known.y !== undefined) { // and we already know x is undefined .....\n if (known.r !== undefined) {\n const rr = known.r * known.r;\n const yy = known.y * known.y;\n const xx = rr - yy;\n if (xx < 0.0) {\n result.push(known.cloneScalarsWithState(ConstraintState.impossibleValues));\n } else {\n const x = Math.sqrt(xx);\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, x, known.y, known.r, Angle.createAtan2(known.y, x)));\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, -x, known.y, known.r, Angle.createAtan2(known.y, -x)));\n }\n } else if (known.theta !== undefined) {\n const r = Geometry.conditionalDivideFraction(known.y, known.theta.sin());\n // test 4*theta to isolate either positive or negative PI/2 case ...\n if (r === undefined) {\n // Anywhere on y axis does has x=0, this angle . . .\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(0, PolarData._defaultRadius, 0, 0, PolarData._defaultRadius, 0);\n } else {\n const x = r * known.theta.cos();\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, x, known.y, r, known.theta));\n }\n } else { // only x known --- fill out a horizontal line\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = LineSegment3d.createXYZXYZ(PolarData._defaultRadius, known.y, 0, PolarData._defaultRadius, known.y, 0);\n }\n } else if (known.r !== undefined) {\n if (known.theta !== undefined) {\n result.push(PolarData.createMixedScalars(ConstraintState.singlePoint, known.r * known.theta.cos(), known.r * known.theta.sin(), known.r, known.theta));\n } else {\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n q.geometry = Arc3d.createXY(Point3d.create(0, 0, 0), known.r);\n result.push(q);\n }\n } else if (known.theta !== undefined) {\n const q = known.cloneScalarsWithState(ConstraintState.onCurve);\n const x = PolarData._defaultRadius * known.theta.cos();\n const y = PolarData._defaultRadius * known.theta.sin();\n q.geometry = LineSegment3d.createXYXY(-x, -y, x, y);\n result.push(q);\n }\n // ----------------------------------------------------------------------------------------\n // add tangible geometry to single points ...\n for (const r of result) {\n if (r.state === ConstraintState.singlePoint && r.geometry === undefined)\n r.geometry = CoordinateXYZ.createXYZ(r.x, r.y, 0.0);\n }\n return result;\n }\n}\n"]}
@@ -280,11 +280,11 @@ export declare class AnalyticRoots {
280
280
  * * -1 -- beta, gamma are zero, alpha is not.There is no line defined.There are no solutions.
281
281
  * * 0 -- the line is well defined, but passes completely outside the unit circle.
282
282
  * * In this case, (c1, s1) is the circle point closest to the line and(c2, s2) is the line point closest to the circle.
283
- * * 1 -- the line is tangent to the unit circle.
284
- * * Tangency is determined by tolerances, which calls a "close approach" point a tangency.
285
- * * (c1, s1) is the closest circle point
286
- * * (c2, s2) is the line point.
287
- * * 2 -- two simple intersections.
283
+ * * 1 -- the line is tangent to the unit circle.
284
+ * * Tangency is determined by tolerances, which calls a "close approach" point a tangency.
285
+ * * (c1, s1) is the closest circle point
286
+ * * (c2, s2) is the line point.
287
+ * * 2 -- two simple intersections.
288
288
  * @param alpha constant coefficient on line
289
289
  * @param beta x cosine coefficient on line
290
290
  * @param gamma y sine coefficient on line