@itwin/core-geometry 4.2.0-dev.0 → 4.2.0-dev.10

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 (514) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  5. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  10. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  13. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  14. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  15. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  16. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  17. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  19. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPlane.d.ts +10 -7
  21. package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
  22. package/lib/cjs/clipping/ClipPlane.js +5 -3
  23. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  24. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  25. package/lib/cjs/clipping/ClipUtils.d.ts +16 -4
  26. package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
  27. package/lib/cjs/clipping/ClipUtils.js +77 -2
  28. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  29. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  30. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +3 -2
  31. package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  32. package/lib/cjs/clipping/ConvexClipPlaneSet.js +3 -2
  33. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  34. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
  35. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  36. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  37. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  38. package/lib/cjs/core-geometry.js.map +1 -1
  39. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  40. package/lib/cjs/curve/Arc3d.js.map +1 -1
  41. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  42. package/lib/cjs/curve/CoordinateXYZ.d.ts +15 -15
  43. package/lib/cjs/curve/CoordinateXYZ.d.ts.map +1 -1
  44. package/lib/cjs/curve/CoordinateXYZ.js +15 -15
  45. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  46. package/lib/cjs/curve/CurveChain.d.ts +4 -2
  47. package/lib/cjs/curve/CurveChain.d.ts.map +1 -1
  48. package/lib/cjs/curve/CurveChain.js.map +1 -1
  49. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  50. package/lib/cjs/curve/CurveCollection.d.ts +1 -1
  51. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  52. package/lib/cjs/curve/CurveCollection.js +1 -1
  53. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  54. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  55. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts +18 -7
  56. package/lib/cjs/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
  57. package/lib/cjs/curve/CurveCurveCloseApproachXY.js +17 -5
  58. package/lib/cjs/curve/CurveCurveCloseApproachXY.js.map +1 -1
  59. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +2 -2
  60. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  61. package/lib/cjs/curve/CurveCurveIntersectXY.js +12 -10
  62. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
  63. package/lib/cjs/curve/CurveCurveIntersectXYZ.js.map +1 -1
  64. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  65. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  66. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  67. package/lib/cjs/curve/CurveOps.js.map +1 -1
  68. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  69. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  70. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  71. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  72. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  73. package/lib/cjs/curve/LineString3d.js.map +1 -1
  74. package/lib/cjs/curve/Loop.d.ts +1 -2
  75. package/lib/cjs/curve/Loop.d.ts.map +1 -1
  76. package/lib/cjs/curve/Loop.js.map +1 -1
  77. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  78. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  79. package/lib/cjs/curve/Path.d.ts +2 -3
  80. package/lib/cjs/curve/Path.d.ts.map +1 -1
  81. package/lib/cjs/curve/Path.js +1 -1
  82. package/lib/cjs/curve/Path.js.map +1 -1
  83. package/lib/cjs/curve/PointString3d.js.map +1 -1
  84. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  85. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  86. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  87. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  88. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  89. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  90. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  91. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  92. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  93. package/lib/cjs/curve/RegionOps.js.map +1 -1
  94. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  95. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  96. package/lib/cjs/curve/UnionRegion.js +1 -1
  97. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  98. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  100. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  101. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  102. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  103. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  104. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  105. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  106. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  107. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  108. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  109. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  110. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  111. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  112. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  113. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  114. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  115. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  116. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  117. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  118. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  119. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  120. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  121. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  122. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  123. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  124. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  125. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  126. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  127. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  128. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  129. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  130. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  131. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  132. package/lib/cjs/geometry3d/FrameBuilder.d.ts +29 -25
  133. package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
  134. package/lib/cjs/geometry3d/FrameBuilder.js +42 -29
  135. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  136. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  137. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  138. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  139. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  140. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +26 -6
  141. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  142. package/lib/cjs/geometry3d/GrowableXYArray.js +66 -15
  143. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  144. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +5 -2
  145. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  146. package/lib/cjs/geometry3d/GrowableXYZArray.js +10 -3
  147. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  148. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  149. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  150. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  151. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  152. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  153. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  154. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  155. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  156. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  157. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  158. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  159. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  160. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  161. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  162. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  163. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  164. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  165. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  166. package/lib/cjs/geometry3d/Range.js.map +1 -1
  167. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  168. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  169. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  170. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  171. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  172. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  173. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  174. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  175. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  176. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  177. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  178. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  179. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  180. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  181. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  182. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  183. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  184. package/lib/cjs/numerics/Complex.js.map +1 -1
  185. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  186. package/lib/cjs/numerics/Newton.js.map +1 -1
  187. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  188. package/lib/cjs/numerics/PolarData.js.map +1 -1
  189. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  190. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  191. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  192. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  193. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  194. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  195. package/lib/cjs/polyface/AuxData.js.map +1 -1
  196. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  197. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  198. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  199. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  200. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  201. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  202. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  203. package/lib/cjs/polyface/Polyface.js.map +1 -1
  204. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +9 -5
  205. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  206. package/lib/cjs/polyface/PolyfaceBuilder.js +9 -5
  207. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  208. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  209. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  210. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  211. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  212. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  213. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  214. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  215. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  216. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  217. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  218. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  219. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  220. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  221. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  222. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  223. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  224. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  225. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  226. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  227. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  228. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  229. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  230. package/lib/cjs/solid/Box.js.map +1 -1
  231. package/lib/cjs/solid/Cone.js.map +1 -1
  232. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  233. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  234. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  235. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  236. package/lib/cjs/solid/Sphere.js.map +1 -1
  237. package/lib/cjs/solid/SweepContour.js.map +1 -1
  238. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  239. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  240. package/lib/cjs/topology/Graph.js.map +1 -1
  241. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  242. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  243. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  244. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  245. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  246. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  247. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  248. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  249. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  250. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  251. package/lib/cjs/topology/MaskManager.js.map +1 -1
  252. package/lib/cjs/topology/Merging.js.map +1 -1
  253. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  254. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  255. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  256. package/lib/cjs/topology/Triangulation.js.map +1 -1
  257. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  258. package/lib/esm/Constant.js.map +1 -1
  259. package/lib/esm/Geometry.js.map +1 -1
  260. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  261. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  262. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  263. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  264. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  265. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  266. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  267. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  268. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  269. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  270. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  271. package/lib/esm/bspline/KnotVector.js.map +1 -1
  272. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  273. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  274. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  275. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  276. package/lib/esm/clipping/ClipPlane.d.ts +10 -7
  277. package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
  278. package/lib/esm/clipping/ClipPlane.js +5 -3
  279. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  280. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  281. package/lib/esm/clipping/ClipUtils.d.ts +16 -4
  282. package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
  283. package/lib/esm/clipping/ClipUtils.js +77 -2
  284. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  285. package/lib/esm/clipping/ClipVector.js.map +1 -1
  286. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +3 -2
  287. package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
  288. package/lib/esm/clipping/ConvexClipPlaneSet.js +3 -2
  289. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  290. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +2 -2
  291. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -2
  292. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  293. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  294. package/lib/esm/core-geometry.js.map +1 -1
  295. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  296. package/lib/esm/curve/Arc3d.js.map +1 -1
  297. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  298. package/lib/esm/curve/CoordinateXYZ.d.ts +15 -15
  299. package/lib/esm/curve/CoordinateXYZ.d.ts.map +1 -1
  300. package/lib/esm/curve/CoordinateXYZ.js +15 -15
  301. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  302. package/lib/esm/curve/CurveChain.d.ts +4 -2
  303. package/lib/esm/curve/CurveChain.d.ts.map +1 -1
  304. package/lib/esm/curve/CurveChain.js.map +1 -1
  305. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  306. package/lib/esm/curve/CurveCollection.d.ts +1 -1
  307. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  308. package/lib/esm/curve/CurveCollection.js +1 -1
  309. package/lib/esm/curve/CurveCollection.js.map +1 -1
  310. package/lib/esm/curve/CurveCurve.js.map +1 -1
  311. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts +18 -7
  312. package/lib/esm/curve/CurveCurveCloseApproachXY.d.ts.map +1 -1
  313. package/lib/esm/curve/CurveCurveCloseApproachXY.js +17 -5
  314. package/lib/esm/curve/CurveCurveCloseApproachXY.js.map +1 -1
  315. package/lib/esm/curve/CurveCurveIntersectXY.d.ts +2 -2
  316. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  317. package/lib/esm/curve/CurveCurveIntersectXY.js +12 -10
  318. package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
  319. package/lib/esm/curve/CurveCurveIntersectXYZ.js.map +1 -1
  320. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  321. package/lib/esm/curve/CurveFactory.js.map +1 -1
  322. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  323. package/lib/esm/curve/CurveOps.js.map +1 -1
  324. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  325. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  326. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  327. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  328. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  329. package/lib/esm/curve/LineString3d.js.map +1 -1
  330. package/lib/esm/curve/Loop.d.ts +1 -2
  331. package/lib/esm/curve/Loop.d.ts.map +1 -1
  332. package/lib/esm/curve/Loop.js.map +1 -1
  333. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  334. package/lib/esm/curve/ParityRegion.js.map +1 -1
  335. package/lib/esm/curve/Path.d.ts +2 -3
  336. package/lib/esm/curve/Path.d.ts.map +1 -1
  337. package/lib/esm/curve/Path.js +1 -1
  338. package/lib/esm/curve/Path.js.map +1 -1
  339. package/lib/esm/curve/PointString3d.js.map +1 -1
  340. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  341. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  342. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  343. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  344. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  345. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  346. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  347. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  348. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  349. package/lib/esm/curve/RegionOps.js.map +1 -1
  350. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  351. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  352. package/lib/esm/curve/UnionRegion.js +1 -1
  353. package/lib/esm/curve/UnionRegion.js.map +1 -1
  354. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  355. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  356. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  357. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  358. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  359. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  360. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  361. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  362. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  363. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  364. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  365. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  366. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  367. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  368. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  369. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  370. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  371. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  372. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  373. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  374. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  375. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  376. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  377. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  378. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  379. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  380. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  381. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  382. package/lib/esm/geometry3d/Angle.js.map +1 -1
  383. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  384. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  385. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  386. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  387. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  388. package/lib/esm/geometry3d/FrameBuilder.d.ts +29 -25
  389. package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
  390. package/lib/esm/geometry3d/FrameBuilder.js +42 -29
  391. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  392. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  393. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  394. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  395. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  396. package/lib/esm/geometry3d/GrowableXYArray.d.ts +26 -6
  397. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  398. package/lib/esm/geometry3d/GrowableXYArray.js +66 -15
  399. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  400. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +5 -2
  401. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  402. package/lib/esm/geometry3d/GrowableXYZArray.js +10 -3
  403. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  404. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  405. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  406. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  407. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  408. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  409. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  410. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  411. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  412. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  413. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  414. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  415. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  416. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  417. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  418. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  419. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  420. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  421. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  422. package/lib/esm/geometry3d/Range.js.map +1 -1
  423. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  424. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  425. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  426. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  427. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  428. package/lib/esm/geometry3d/Transform.js.map +1 -1
  429. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  430. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  431. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  432. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  433. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  434. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  435. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  436. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  437. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  438. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  439. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  440. package/lib/esm/numerics/Complex.js.map +1 -1
  441. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  442. package/lib/esm/numerics/Newton.js.map +1 -1
  443. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  444. package/lib/esm/numerics/PolarData.js.map +1 -1
  445. package/lib/esm/numerics/Polynomials.js.map +1 -1
  446. package/lib/esm/numerics/Quadrature.js.map +1 -1
  447. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  448. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  449. package/lib/esm/numerics/UnionFind.js.map +1 -1
  450. package/lib/esm/numerics/UsageSums.js.map +1 -1
  451. package/lib/esm/polyface/AuxData.js.map +1 -1
  452. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  453. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  454. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  455. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  456. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  457. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  458. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  459. package/lib/esm/polyface/Polyface.js.map +1 -1
  460. package/lib/esm/polyface/PolyfaceBuilder.d.ts +9 -5
  461. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  462. package/lib/esm/polyface/PolyfaceBuilder.js +9 -5
  463. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  464. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  465. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  466. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  467. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  468. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  469. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  470. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  471. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  472. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  473. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  474. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  475. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  476. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  477. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  478. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  479. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  480. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  481. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  482. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  483. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  484. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  485. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  486. package/lib/esm/solid/Box.js.map +1 -1
  487. package/lib/esm/solid/Cone.js.map +1 -1
  488. package/lib/esm/solid/LinearSweep.js.map +1 -1
  489. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  490. package/lib/esm/solid/RuledSweep.js.map +1 -1
  491. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  492. package/lib/esm/solid/Sphere.js.map +1 -1
  493. package/lib/esm/solid/SweepContour.js.map +1 -1
  494. package/lib/esm/solid/TorusPipe.js.map +1 -1
  495. package/lib/esm/topology/ChainMerge.js.map +1 -1
  496. package/lib/esm/topology/Graph.js.map +1 -1
  497. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  498. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  499. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  500. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  501. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  502. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  503. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  504. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  505. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  506. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  507. package/lib/esm/topology/MaskManager.js.map +1 -1
  508. package/lib/esm/topology/Merging.js.map +1 -1
  509. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  510. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  511. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  512. package/lib/esm/topology/Triangulation.js.map +1 -1
  513. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  514. package/package.json +3 -3
@@ -16,7 +16,6 @@ const CurveCollection_1 = require("../curve/CurveCollection");
16
16
  const CurvePrimitive_1 = require("../curve/CurvePrimitive");
17
17
  const LineSegment3d_1 = require("../curve/LineSegment3d");
18
18
  const LineString3d_1 = require("../curve/LineString3d");
19
- /* eslint-disable @typescript-eslint/naming-convention, no-empty */
20
19
  const Geometry_1 = require("../Geometry");
21
20
  const GrowableXYZArray_1 = require("./GrowableXYZArray");
22
21
  const Matrix3d_1 = require("./Matrix3d");
@@ -24,6 +23,7 @@ const Point3dVector3d_1 = require("./Point3dVector3d");
24
23
  const PointHelpers_1 = require("./PointHelpers");
25
24
  const PolygonOps_1 = require("./PolygonOps");
26
25
  const Transform_1 = require("./Transform");
26
+ /* eslint-disable @typescript-eslint/naming-convention, no-empty */
27
27
  /**
28
28
  * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.
29
29
  *
@@ -31,10 +31,10 @@ const Transform_1 = require("./Transform");
31
31
  * * create the FrameBuilder and make calls to announcePoint and announceVector.
32
32
  * * the frame will be fully determined by an origin and two vectors.
33
33
  * * the first call to announcePoint will set the origin.
34
- * * additional calls to announcePoint will produce announceVector call with the vector from the origin.
35
- * * After each announcement, call getValidatedFrame(false)
34
+ * * additional calls to announcePoint will produce announceVector call with the vector from the origin.
35
+ * * after each announcement, call getValidatedFrame(false)
36
36
  * * getValidatedFrame will succeed when it has two independent vectors.
37
- * * to build a left handed frame,
37
+ * * To build a left handed frame,
38
38
  * * an origin and 3 independent vectors are required.
39
39
  * * announce as above, but query with getValidatedFrame (true).
40
40
  * * this will use the third vector to select right or left handed frame.
@@ -49,11 +49,18 @@ class FrameBuilder {
49
49
  }
50
50
  return false;
51
51
  }
52
- /** clear all accumulated point and vector data */
53
- clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }
54
- constructor() { this.clear(); }
55
- /** Try to assemble the data into a non-singular transform.
56
- *
52
+ /** Clear all accumulated point and vector data */
53
+ clear() {
54
+ this._origin = undefined;
55
+ this._vector0 = undefined;
56
+ this._vector1 = undefined;
57
+ this._vector2 = undefined;
58
+ }
59
+ constructor() {
60
+ this.clear();
61
+ }
62
+ /**
63
+ * Try to assemble the data into a non-singular transform.
57
64
  * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.
58
65
  * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.
59
66
  */
@@ -88,8 +95,11 @@ class FrameBuilder {
88
95
  }
89
96
  }
90
97
  /** Ask if there is a defined origin for the evolving frame */
91
- get hasOrigin() { return this._origin !== undefined; }
92
- /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
98
+ get hasOrigin() {
99
+ return this._origin !== undefined;
100
+ }
101
+ /**
102
+ * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.
93
103
  */
94
104
  savedVectorCount() {
95
105
  if (!this._vector0)
@@ -100,7 +110,9 @@ class FrameBuilder {
100
110
  return 2;
101
111
  return 3;
102
112
  }
103
- /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/
113
+ /**
114
+ * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.
115
+ */
104
116
  announcePoint(point) {
105
117
  if (!this._origin) {
106
118
  this._origin = point.clone();
@@ -111,7 +123,7 @@ class FrameBuilder {
111
123
  return this.savedVectorCount();
112
124
  return this.announceVector(this._origin.vectorTo(point));
113
125
  }
114
- /** announce a new vector. */
126
+ /** Announce a new vector. */
115
127
  announceVector(vector) {
116
128
  if (vector.isAlmostZero)
117
129
  return this.savedVectorCount();
@@ -138,8 +150,9 @@ class FrameBuilder {
138
150
  // fall through if prior vectors are all there -- no need for the new one.
139
151
  return 3;
140
152
  }
141
- /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes
142
- * sufficient for a coordinate system.
153
+ /**
154
+ * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient
155
+ * for a coordinate system.
143
156
  */
144
157
  announce(data) {
145
158
  if (this.savedVectorCount() > 1)
@@ -220,11 +233,11 @@ class FrameBuilder {
220
233
  }
221
234
  }
222
235
  }
223
- /** create a localToWorld frame for the given data.
224
- *
225
- * * origin is at first point
226
- * * x axis in direction of first nonzero vector present or implied by the input.
227
- * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
236
+ /**
237
+ * Create a localToWorld frame for the given data.
238
+ * * origin is at first point.
239
+ * * x axis in direction of first nonzero vector present or implied by the input.
240
+ * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.
228
241
  */
229
242
  static createRightHandedFrame(defaultUpVector, ...params) {
230
243
  const builder = new FrameBuilder();
@@ -259,10 +272,11 @@ class FrameBuilder {
259
272
  }
260
273
  return undefined;
261
274
  }
262
- /** create a transform containing points or vectors in the given data.
275
+ /**
276
+ * Create a transform containing points or vectors in the given data.
263
277
  * * The xy columns of the transform contain the first points or vectors of the data.
264
278
  * * The z column is perpendicular to that xy plane.
265
- * * The calculation favors the first points found. It does not try to get a "best" plane.
279
+ * * The calculation favors the first points found. It does not try to get a "best" plane.
266
280
  */
267
281
  static createRightHandedLocalToWorld(...params) {
268
282
  const builder = new FrameBuilder();
@@ -275,10 +289,9 @@ class FrameBuilder {
275
289
  return undefined;
276
290
  }
277
291
  /**
278
- * try to create a frame whose xy plane is through points.
279
- *
280
- * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the
281
- * point most distant from that line.
292
+ * Try to create a frame whose xy plane is through points.
293
+ * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
294
+ * direction is toward the point most distant from that line.
282
295
  * @param points array of points
283
296
  */
284
297
  static createFrameToDistantPoints(points) {
@@ -295,10 +308,10 @@ class FrameBuilder {
295
308
  return undefined;
296
309
  }
297
310
  /**
298
- * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
311
+ * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.
299
312
  *
300
- * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the
301
- * point most distant from that line.
313
+ * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y
314
+ * direction is toward the point most distant from that line.
302
315
  * @param points array of points
303
316
  */
304
317
  static createFrameWithCCWPolygon(points) {
@@ -1 +1 @@
1
- {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.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 CartesianGeometry\n */\n\n// import { Point2d } from \"./Geometry2d\";\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveCollection } from \"../curve/CurveCollection\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Point3dArray } from \"./PointHelpers\";\nimport { PolygonOps } from \"./PolygonOps\";\nimport { Range3d } from \"./Range\";\nimport { Transform } from \"./Transform\";\n\n/**\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\n *\n * * For the common case of building a right handed frame:\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\n * * the frame will be fully determined by an origin and two vectors.\n * * the first call to announcePoint will set the origin.\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\n * * After each announcement, call getValidatedFrame(false)\n * * getValidatedFrame will succeed when it has two independent vectors.\n * * to build a left handed frame,\n * * an origin and 3 independent vectors are required.\n * * announce as above, but query with getValidatedFrame (true).\n * * this will use the third vector to select right or left handed frame.\n * @public\n */\nexport class FrameBuilder {\n private _origin: undefined | Point3d;\n private _vector0: undefined | Vector3d;\n private _vector1: undefined | Vector3d;\n private _vector2: undefined | Vector3d;\n // test if both vectors are defined and have significant angle between.\n private areStronglyIndependentVectors(vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians): boolean {\n if (vector0 !== undefined && vector1 !== undefined) {\n const q = vector0.smallerUnorientedRadiansTo(vector1);\n return q > radiansTolerance;\n }\n return false;\n }\n /** clear all accumulated point and vector data */\n public clear() { this._origin = undefined; this._vector0 = undefined; this._vector1 = undefined; this._vector2 = undefined; }\n constructor() { this.clear(); }\n /** Try to assemble the data into a non-singular transform.\n *\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\n */\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\n if (this._origin && this._vector0 && this._vector1) {\n if (!allowLeftHanded) {\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\n if (matrix)\n return Transform.createOriginAndMatrix(this._origin, matrix);\n // uh oh -- vector1 was not really independent. clear everything after vector0.\n this._vector1 = this._vector2 = undefined;\n } else if (this._vector2) {\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\n if (matrix) {\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\n matrix.scaleColumns(1.0, 1.0, -1.0);\n return Transform.createOriginAndMatrix(this._origin, matrix);\n }\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\n const vector2 = this._vector2;\n this._vector1 = this._vector2 = undefined;\n this.announceVector(vector2);\n }\n }\n return undefined;\n }\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\n public applyDefaultUpVector(vector?: Vector3d) {\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\n this._vector1 = vector.crossProduct(this._vector0);\n }\n }\n /** Ask if there is a defined origin for the evolving frame */\n public get hasOrigin(): boolean { return this._origin !== undefined; }\n /** Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\n */\n public savedVectorCount(): number {\n if (!this._vector0)\n return 0;\n if (!this._vector1)\n return 1;\n if (!this._vector2)\n return 2;\n return 3;\n }\n /** announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.*/\n public announcePoint(point: Point3d): number {\n if (!this._origin) {\n this._origin = point.clone();\n return this.savedVectorCount();\n }\n // the new point may provide an additional vector\n if (this._origin.isAlmostEqual(point))\n return this.savedVectorCount();\n return this.announceVector(this._origin.vectorTo(point));\n }\n /** announce a new vector. */\n public announceVector(vector: Vector3d): number {\n if (vector.isAlmostZero)\n return this.savedVectorCount();\n\n if (!this._vector0) { this._vector0 = vector.clone(this._vector0); return 1; }\n\n if (!this._vector1) {\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\n this._vector1 = vector.clone(this._vector1);\n return 2;\n }\n return 1;\n }\n\n // vector0 and vector1 are independent.\n if (!this._vector2) {\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\n this._vector2 = vector.clone(this._vector2);\n return 3;\n }\n return 2;\n }\n // fall through if prior vectors are all there -- no need for the new one.\n return 3;\n }\n /** Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes\n * sufficient for a coordinate system.\n */\n public announce(data: any) {\n if (this.savedVectorCount() > 1) return;\n if (data instanceof Point3d)\n this.announcePoint(data);\n else if (data instanceof Vector3d)\n this.announceVector(data);\n else if (Array.isArray(data)) {\n for (const child of data) {\n if (this.savedVectorCount() > 1)\n break;\n this.announce(child);\n }\n } else if (data instanceof CurvePrimitive) {\n if (data instanceof LineSegment3d) {\n this.announcePoint(data.startPoint());\n this.announcePoint(data.endPoint());\n } else if (data instanceof Arc3d) {\n const ray = data.fractionToPointAndDerivative(0.0);\n this.announcePoint(ray.origin);\n this.announceVector(ray.direction);\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\n } else if (data instanceof LineString3d) {\n for (const point of data.points) {\n this.announcePoint(point);\n if (this.savedVectorCount() > 1)\n break;\n }\n } else if (data instanceof BSplineCurve3d) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (data.getPolePoint3d(i, point) instanceof Point3d)\n this.announcePoint(point);\n else break;\n }\n } else if (data instanceof InterpolationCurve3d) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (i < data.options.fitPoints.length) {\n point.setFrom(data.options.fitPoints[i]);\n this.announcePoint(point);\n } else break;\n }\n } else { // unimplemented CurvePrimitive type\n const frame = data.fractionToFrenetFrame(0.0);\n if (undefined !== frame) {\n this.announcePoint(frame.getOrigin());\n this.announceVector(frame.matrix.getColumn(0));\n this.announceVector(frame.matrix.getColumn(1));\n }\n }\n } else if (data instanceof CurveCollection) {\n if (data.children)\n for (const child of data.children) {\n this.announce(child);\n if (this.savedVectorCount() > 1)\n break;\n }\n } else if (data instanceof GrowableXYZArray) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\n this.announcePoint(point);\n else break;\n }\n }\n }\n /** create a localToWorld frame for the given data.\n *\n * * origin is at first point\n * * x axis in direction of first nonzero vector present or implied by the input.\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\n */\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\n const builder = new FrameBuilder();\n for (const data of params) {\n builder.announce(data);\n builder.applyDefaultUpVector(defaultUpVector);\n const result = builder.getValidatedFrame(false);\n if (result !== undefined) {\n if (defaultUpVector) {\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\n result.matrix.scaleColumnsInPlace(1, -1, -1);\n }\n return result;\n }\n }\n\n const evaluatePrimitiveFrame = (curve: CurvePrimitive): Transform | undefined => {\n return curve.fractionToFrenetFrame(0.0);\n };\n\n // try direct evaluation of curve primitives using the above lambda\n for (const data of params) {\n if (data instanceof CurvePrimitive) {\n return evaluatePrimitiveFrame(data);\n } else if (data instanceof CurveCollection) {\n const children = data.collectCurvePrimitives();\n for (const curve of children) {\n const frenetFrame = evaluatePrimitiveFrame(curve);\n if (frenetFrame)\n return frenetFrame;\n }\n }\n }\n return undefined;\n }\n /** create a transform containing points or vectors in the given data.\n * * The xy columns of the transform contain the first points or vectors of the data.\n * * The z column is perpendicular to that xy plane.\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\n */\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\n const builder = new FrameBuilder();\n for (const data of params) {\n builder.announce(data);\n const localToWorld = builder.getValidatedFrame(false);\n if (localToWorld !== undefined)\n return localToWorld;\n }\n return undefined;\n }\n\n /**\n * try to create a frame whose xy plane is through points.\n *\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\n * point most distant from that line.\n * @param points array of points\n */\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\n if (points.length > 2) {\n const origin = points[0].clone();\n const vector01 = Vector3d.create();\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\n const vector02 = Vector3d.create();\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\n if (matrix)\n return Transform.createRefs(origin, matrix);\n }\n return undefined;\n }\n /**\n * try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\n *\n * * if 3 or more distinct points are present, the x axis is from the first point to the most distance, and y direction is toward the\n * point most distant from that line.\n * @param points array of points\n */\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\n if (points.length > 2) {\n const ray = PolygonOps.centroidAreaNormal(points);\n if (ray) {\n return ray.toRigidZFrame();\n }\n }\n return undefined;\n }\n /**\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\n * @param range [in] range to inspect\n * @param fractionX [in] fractional coordinate of frame origin x\n * @param fractionY [in] fractional coordinate of frame origin y\n * @param fractionZ [in] fractional coordinate of frame origin z\n * @param scaleSelect [in] selects size of localToWorld axes.\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\n */\n public static createLocalToWorldTransformInRange(\n range: Range3d,\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\n fractionX: number = 0,\n fractionY: number = 0,\n fractionZ: number = 0,\n defaultAxisLength: number = 1.0): Transform {\n if (range.isNull)\n return Transform.createIdentity();\n let a = 1.0;\n let b = 1.0;\n let c = 1.0;\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\n }\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\n }\n\n}\n"]}
1
+ {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * after each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * To build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(\r\n vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians,\r\n ): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** Clear all accumulated point and vector data */\r\n public clear() {\r\n this._origin = undefined;\r\n this._vector0 = undefined;\r\n this._vector1 = undefined;\r\n this._vector2 = undefined;\r\n }\r\n constructor() {\r\n this.clear();\r\n }\r\n /**\r\n * Try to assemble the data into a non-singular transform.\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n if (!allowLeftHanded) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = Matrix3d.createRigidFromColumns(this._vector0, this._vector1, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean {\r\n return this._origin !== undefined;\r\n }\r\n /**\r\n * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /**\r\n * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.\r\n */\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** Announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n if (!this._vector0) {\r\n this._vector0 = vector.clone(this._vector0);\r\n return 1;\r\n }\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /**\r\n * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient\r\n * for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1) return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n } else { // unimplemented CurvePrimitive type\r\n const frame = data.fractionToFrenetFrame(0.0);\r\n if (undefined !== frame) {\r\n this.announcePoint(frame.getOrigin());\r\n this.announceVector(frame.matrix.getColumn(0));\r\n this.announceVector(frame.matrix.getColumn(1));\r\n }\r\n }\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n }\r\n }\r\n /**\r\n * Create a localToWorld frame for the given data.\r\n * * origin is at first point.\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n const result = builder.getValidatedFrame(false);\r\n if (result !== undefined) {\r\n if (defaultUpVector) {\r\n if (result.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n result.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return result;\r\n }\r\n }\r\n const evaluatePrimitiveFrame = (curve: CurvePrimitive): Transform | undefined => {\r\n return curve.fractionToFrenetFrame(0.0);\r\n };\r\n // try direct evaluation of curve primitives using the above lambda\r\n for (const data of params) {\r\n if (data instanceof CurvePrimitive) {\r\n return evaluatePrimitiveFrame(data);\r\n } else if (data instanceof CurveCollection) {\r\n const children = data.collectCurvePrimitives();\r\n for (const curve of children) {\r\n const frenetFrame = evaluatePrimitiveFrame(curve);\r\n if (frenetFrame)\r\n return frenetFrame;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n const localToWorld = builder.getValidatedFrame(false);\r\n if (localToWorld !== undefined)\r\n return localToWorld;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Try to create a frame whose xy plane is through points.\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0].clone();\r\n const vector01 = Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ);\r\n if (matrix)\r\n return Transform.createRefs(origin, matrix);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n *\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[]): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points);\r\n if (ray) {\r\n return ray.toRigidZFrame();\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range [in] range to inspect\r\n * @param fractionX [in] fractional coordinate of frame origin x\r\n * @param fractionY [in] fractional coordinate of frame origin y\r\n * @param fractionZ [in] fractional coordinate of frame origin z\r\n * @param scaleSelect [in] selects size of localToWorld axes.\r\n * @param defaultAxisLength [in] if true and any axis length is 0, that axis vector takes this physical length.\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity();\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n return Transform.createRefs(range.fractionToPoint(fractionX, fractionY, fractionZ), Matrix3d.createScale(a, b, c));\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FrustumAnimation.js","sourceRoot":"","sources":["../../../src/geometry3d/FrustumAnimation.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 Solid\n */\n\nimport { AxisOrder, Geometry } from \"../Geometry\";\nimport { Angle } from \"./Angle\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Point3dArray } from \"./PointHelpers\";\nimport { Transform } from \"./Transform\";\n\n/**\n * context for constructing smooth motion a startFrustum and endFrustum.\n * The externally interesting calls are\n * * Create a context to shift corner0 to corner1, with the(NPC coordinate) point(fractionU, fractionV, fractionW) moving along its connecting segment, all other points rotating smoothly from the start orientation to end orientation:\n * `const context = SmoothTransformBetweenFrusta (cornerA, cornerB)`\n * * Get any intermediate 8 corners(at fraction) with `context.fractionToWorldCorners(fraction)`\n * * Frustum corners are ordered by \"x varies fastest, then y, then z\", hence (xyz) order on nondimensional space is\n * * (left lower rear) (000)\n * * (right lower rear) (100)\n * * (left upper rear) (010)\n * * (right upper rear) (100)\n * * (left lower front) (001)\n * * (right lower front) (101)\n * * (left upper front) (011)\n * * (right upper front) (101)\n * * which uses names\n * * (left,right) for horizontal (x)\n * * (bottom, top) for vertical (y)\n * * (rear, front) for back and front planes (z)\n * @public\n */\nexport class SmoothTransformBetweenFrusta {\n // raw frusta:\n private _localCornerA: Point3d[];\n private _localCornerB: Point3d[];\n\n private _localToWorldA: Transform;\n private _localToWorldB: Transform;\n /** (property accessor) rigid frame at start of motion */\n public get localToWorldA(): Transform { return this._localToWorldA; }\n /** (property accessor) rigid frame at end of motion */\n public get localToWorldB(): Transform { return this._localToWorldB; }\n private _rotationAxis: Vector3d;\n private _rotationAngle: Angle;\n\n /**\n * CAPTURE local corners, pickup and putdown frames, and rotation-around-vector data\n * @param localCornerA\n * @param localCornerB\n * @param localToWordA\n * @param localToWordB\n * @param rotationAxis\n * @param rotationAngle\n */\n private constructor(localToWorldA: Transform, localCornerA: Point3d[], localToWorldB: Transform, localCornerB: Point3d[], rotationAxis: Vector3d, rotationAngle: Angle) {\n this._localCornerA = localCornerA;\n this._localCornerB = localCornerB;\n this._localToWorldA = localToWorldA;\n this._localToWorldB = localToWorldB;\n this._rotationAxis = rotationAxis;\n this._rotationAngle = rotationAngle;\n }\n\n /**\n * Set up rotation data for smooth transition from 8 point frusta cornerA and cornerB\n * @param cornerA\n * @param cornerB\n */\n public static create(cornerA: Point3d[], cornerB: Point3d[], preferSimpleRotation: boolean = true): SmoothTransformBetweenFrusta | undefined {\n const localToWorldA = Point3dArray.evaluateTrilinearDerivativeTransform(cornerA, 0.5, 0.5, 0.5);\n const localToWorldB = Point3dArray.evaluateTrilinearDerivativeTransform(cornerB, 0.5, 0.5, 0.5);\n const rigidA = Transform.createOriginAndMatrix(localToWorldA.origin, Matrix3d.createRigidFromMatrix3d(localToWorldA.matrix, AxisOrder.ZXY));\n const rigidB = Transform.createOriginAndMatrix(localToWorldB.origin, Matrix3d.createRigidFromMatrix3d(localToWorldB.matrix, AxisOrder.ZXY));\n if (rigidA.matrix.computeCachedInverse(true) && rigidB.matrix.computeCachedInverse(true)) {\n const spinMatrix = rigidB.matrix.multiplyMatrixMatrixInverse(rigidA.matrix)!;\n const spinAxis = spinMatrix.getAxisAndAngleOfRotation();\n const localCornerA = rigidA.multiplyInversePoint3dArray(cornerA)!;\n const localCornerB = rigidB.multiplyInversePoint3dArray(cornerB)!;\n /** Is this a pure rotation -- i.e. no clip volume resizing for camera or clip changes */\n if (preferSimpleRotation && Point3dArray.isAlmostEqual(localCornerA, localCornerB) && !spinAxis.angle.isAlmostZero) {\n // world vectors\n const worldOriginShift = Vector3d.createStartEnd(localToWorldA.origin, localToWorldB.origin);\n const chordMidPoint = localToWorldA.getOrigin().interpolate(0.5, localToWorldB.getOrigin());\n const bisector = spinAxis.axis.unitCrossProduct(worldOriginShift);\n if (bisector) {\n const halfChordLength = 0.5 * worldOriginShift.magnitude();\n const alpha = Geometry.conditionalDivideFraction(halfChordLength, Math.tan(spinAxis.angle.radians * 0.5));\n if (alpha !== undefined) {\n const spinCenter = chordMidPoint.plusScaled(bisector, alpha);\n const rigidA1 = Transform.createOriginAndMatrix(spinCenter, rigidA.matrix);\n const rigidB1 = Transform.createOriginAndMatrix(spinCenter, rigidB.matrix);\n const localCornerA1 = rigidA1.multiplyInversePoint3dArray(cornerA)!;\n const localCornerB1 = rigidB1.multiplyInversePoint3dArray(cornerB)!;\n return new SmoothTransformBetweenFrusta(rigidA1, localCornerA1, rigidB1, localCornerB1,\n spinAxis.axis, spinAxis.angle);\n }\n }\n }\n return new SmoothTransformBetweenFrusta(rigidA, localCornerA, rigidB, localCornerB,\n spinAxis.axis, spinAxis.angle);\n }\n return undefined;\n }\n\n /** interpolate local corner coordinates at fractional move from m_localFrustum0 to m_localFrustum1 */\n public interpolateLocalCorners(fraction: number, result?: Point3d[]): Point3d[] {\n result = result || [];\n result.length = 0;\n const n = this._localCornerA.length;\n for (let i = 0; i < n; i++) {\n result.push(this._localCornerA[i].interpolate(fraction, this._localCornerB[i]));\n }\n return result;\n }\n /**\n * After initialization, call this for various intermediate fractions.\n * The returned corner points are in world coordinates \"between\" start and end positions.\n */\n public fractionToWorldCorners(fraction: number, result?: Point3d[]): Point3d[] {\n const corners = this.interpolateLocalCorners(fraction, result);\n const fractionalRotation = Matrix3d.createRotationAroundVector(this._rotationAxis,\n this._rotationAngle.cloneScaled(fraction))!;\n const axes0 = this._localToWorldA.matrix;\n const fractionalAxes = fractionalRotation.multiplyMatrixMatrix(axes0);\n const fractionalOrigin = this._localToWorldA.getOrigin().interpolate(fraction, this._localToWorldB.origin);\n const putdownFrame = Transform.createOriginAndMatrix(fractionalOrigin, fractionalAxes);\n putdownFrame.multiplyPoint3dArray(corners, corners);\n return corners;\n }\n}\n"]}
1
+ {"version":3,"file":"FrustumAnimation.js","sourceRoot":"","sources":["../../../src/geometry3d/FrustumAnimation.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AAEH,0CAAkD;AAElD,yCAAsC;AACtC,uDAAsD;AACtD,iDAA8C;AAC9C,2CAAwC;AAExC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,4BAA4B;IAOvC,yDAAyD;IACzD,IAAW,aAAa,KAAgB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACrE,uDAAuD;IACvD,IAAW,aAAa,KAAgB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAIrE;;;;;;;;OAQG;IACH,YAAoB,aAAwB,EAAE,YAAuB,EAAE,aAAwB,EAAE,YAAuB,EAAE,YAAsB,EAAE,aAAoB;QACpK,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,MAAM,CAAC,OAAkB,EAAE,OAAkB,EAAE,uBAAgC,IAAI;QAC/F,MAAM,aAAa,GAAG,2BAAY,CAAC,oCAAoC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChG,MAAM,aAAa,GAAG,2BAAY,CAAC,oCAAoC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChG,MAAM,MAAM,GAAG,qBAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,MAAM,EAAE,mBAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM,EAAE,oBAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5I,MAAM,MAAM,GAAG,qBAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,MAAM,EAAE,mBAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM,EAAE,oBAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5I,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE;YACxF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC;YAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,yBAAyB,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAE,CAAC;YAClE,MAAM,YAAY,GAAG,MAAM,CAAC,2BAA2B,CAAC,OAAO,CAAE,CAAC;YAClE,yFAAyF;YACzF,IAAI,oBAAoB,IAAI,2BAAY,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;gBAClH,gBAAgB;gBAChB,MAAM,gBAAgB,GAAG,0BAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC7F,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC5F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;gBAClE,IAAI,QAAQ,EAAE;oBACZ,MAAM,eAAe,GAAG,GAAG,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC;oBAC3D,MAAM,KAAK,GAAG,mBAAQ,CAAC,yBAAyB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;oBAC1G,IAAI,KAAK,KAAK,SAAS,EAAE;wBACvB,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;wBAC7D,MAAM,OAAO,GAAG,qBAAS,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC3E,MAAM,OAAO,GAAG,qBAAS,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC3E,MAAM,aAAa,GAAG,OAAO,CAAC,2BAA2B,CAAC,OAAO,CAAE,CAAC;wBACpE,MAAM,aAAa,GAAG,OAAO,CAAC,2BAA2B,CAAC,OAAO,CAAE,CAAC;wBACpE,OAAO,IAAI,4BAA4B,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EACpF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;qBAClC;iBACF;aACF;YACD,OAAO,IAAI,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAChF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;SAClC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sGAAsG;IAC/F,uBAAuB,CAAC,QAAgB,EAAE,MAAkB;QACjE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;OAGG;IACI,sBAAsB,CAAC,QAAgB,EAAE,MAAkB;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,kBAAkB,GAAG,mBAAQ,CAAC,0BAA0B,CAAC,IAAI,CAAC,aAAa,EAC/E,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QACzC,MAAM,cAAc,GAAG,kBAAkB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3G,MAAM,YAAY,GAAG,qBAAS,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QACvF,YAAY,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAlGD,oEAkGC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module Solid\r\n */\r\n\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/**\r\n * context for constructing smooth motion a startFrustum and endFrustum.\r\n * The externally interesting calls are\r\n * * Create a context to shift corner0 to corner1, with the(NPC coordinate) point(fractionU, fractionV, fractionW) moving along its connecting segment, all other points rotating smoothly from the start orientation to end orientation:\r\n * `const context = SmoothTransformBetweenFrusta (cornerA, cornerB)`\r\n * * Get any intermediate 8 corners(at fraction) with `context.fractionToWorldCorners(fraction)`\r\n * * Frustum corners are ordered by \"x varies fastest, then y, then z\", hence (xyz) order on nondimensional space is\r\n * * (left lower rear) (000)\r\n * * (right lower rear) (100)\r\n * * (left upper rear) (010)\r\n * * (right upper rear) (100)\r\n * * (left lower front) (001)\r\n * * (right lower front) (101)\r\n * * (left upper front) (011)\r\n * * (right upper front) (101)\r\n * * which uses names\r\n * * (left,right) for horizontal (x)\r\n * * (bottom, top) for vertical (y)\r\n * * (rear, front) for back and front planes (z)\r\n * @public\r\n */\r\nexport class SmoothTransformBetweenFrusta {\r\n // raw frusta:\r\n private _localCornerA: Point3d[];\r\n private _localCornerB: Point3d[];\r\n\r\n private _localToWorldA: Transform;\r\n private _localToWorldB: Transform;\r\n /** (property accessor) rigid frame at start of motion */\r\n public get localToWorldA(): Transform { return this._localToWorldA; }\r\n /** (property accessor) rigid frame at end of motion */\r\n public get localToWorldB(): Transform { return this._localToWorldB; }\r\n private _rotationAxis: Vector3d;\r\n private _rotationAngle: Angle;\r\n\r\n /**\r\n * CAPTURE local corners, pickup and putdown frames, and rotation-around-vector data\r\n * @param localCornerA\r\n * @param localCornerB\r\n * @param localToWordA\r\n * @param localToWordB\r\n * @param rotationAxis\r\n * @param rotationAngle\r\n */\r\n private constructor(localToWorldA: Transform, localCornerA: Point3d[], localToWorldB: Transform, localCornerB: Point3d[], rotationAxis: Vector3d, rotationAngle: Angle) {\r\n this._localCornerA = localCornerA;\r\n this._localCornerB = localCornerB;\r\n this._localToWorldA = localToWorldA;\r\n this._localToWorldB = localToWorldB;\r\n this._rotationAxis = rotationAxis;\r\n this._rotationAngle = rotationAngle;\r\n }\r\n\r\n /**\r\n * Set up rotation data for smooth transition from 8 point frusta cornerA and cornerB\r\n * @param cornerA\r\n * @param cornerB\r\n */\r\n public static create(cornerA: Point3d[], cornerB: Point3d[], preferSimpleRotation: boolean = true): SmoothTransformBetweenFrusta | undefined {\r\n const localToWorldA = Point3dArray.evaluateTrilinearDerivativeTransform(cornerA, 0.5, 0.5, 0.5);\r\n const localToWorldB = Point3dArray.evaluateTrilinearDerivativeTransform(cornerB, 0.5, 0.5, 0.5);\r\n const rigidA = Transform.createOriginAndMatrix(localToWorldA.origin, Matrix3d.createRigidFromMatrix3d(localToWorldA.matrix, AxisOrder.ZXY));\r\n const rigidB = Transform.createOriginAndMatrix(localToWorldB.origin, Matrix3d.createRigidFromMatrix3d(localToWorldB.matrix, AxisOrder.ZXY));\r\n if (rigidA.matrix.computeCachedInverse(true) && rigidB.matrix.computeCachedInverse(true)) {\r\n const spinMatrix = rigidB.matrix.multiplyMatrixMatrixInverse(rigidA.matrix)!;\r\n const spinAxis = spinMatrix.getAxisAndAngleOfRotation();\r\n const localCornerA = rigidA.multiplyInversePoint3dArray(cornerA)!;\r\n const localCornerB = rigidB.multiplyInversePoint3dArray(cornerB)!;\r\n /** Is this a pure rotation -- i.e. no clip volume resizing for camera or clip changes */\r\n if (preferSimpleRotation && Point3dArray.isAlmostEqual(localCornerA, localCornerB) && !spinAxis.angle.isAlmostZero) {\r\n // world vectors\r\n const worldOriginShift = Vector3d.createStartEnd(localToWorldA.origin, localToWorldB.origin);\r\n const chordMidPoint = localToWorldA.getOrigin().interpolate(0.5, localToWorldB.getOrigin());\r\n const bisector = spinAxis.axis.unitCrossProduct(worldOriginShift);\r\n if (bisector) {\r\n const halfChordLength = 0.5 * worldOriginShift.magnitude();\r\n const alpha = Geometry.conditionalDivideFraction(halfChordLength, Math.tan(spinAxis.angle.radians * 0.5));\r\n if (alpha !== undefined) {\r\n const spinCenter = chordMidPoint.plusScaled(bisector, alpha);\r\n const rigidA1 = Transform.createOriginAndMatrix(spinCenter, rigidA.matrix);\r\n const rigidB1 = Transform.createOriginAndMatrix(spinCenter, rigidB.matrix);\r\n const localCornerA1 = rigidA1.multiplyInversePoint3dArray(cornerA)!;\r\n const localCornerB1 = rigidB1.multiplyInversePoint3dArray(cornerB)!;\r\n return new SmoothTransformBetweenFrusta(rigidA1, localCornerA1, rigidB1, localCornerB1,\r\n spinAxis.axis, spinAxis.angle);\r\n }\r\n }\r\n }\r\n return new SmoothTransformBetweenFrusta(rigidA, localCornerA, rigidB, localCornerB,\r\n spinAxis.axis, spinAxis.angle);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** interpolate local corner coordinates at fractional move from m_localFrustum0 to m_localFrustum1 */\r\n public interpolateLocalCorners(fraction: number, result?: Point3d[]): Point3d[] {\r\n result = result || [];\r\n result.length = 0;\r\n const n = this._localCornerA.length;\r\n for (let i = 0; i < n; i++) {\r\n result.push(this._localCornerA[i].interpolate(fraction, this._localCornerB[i]));\r\n }\r\n return result;\r\n }\r\n /**\r\n * After initialization, call this for various intermediate fractions.\r\n * The returned corner points are in world coordinates \"between\" start and end positions.\r\n */\r\n public fractionToWorldCorners(fraction: number, result?: Point3d[]): Point3d[] {\r\n const corners = this.interpolateLocalCorners(fraction, result);\r\n const fractionalRotation = Matrix3d.createRotationAroundVector(this._rotationAxis,\r\n this._rotationAngle.cloneScaled(fraction))!;\r\n const axes0 = this._localToWorldA.matrix;\r\n const fractionalAxes = fractionalRotation.multiplyMatrixMatrix(axes0);\r\n const fractionalOrigin = this._localToWorldA.getOrigin().interpolate(fraction, this._localToWorldB.origin);\r\n const putdownFrame = Transform.createOriginAndMatrix(fractionalOrigin, fractionalAxes);\r\n putdownFrame.multiplyPoint3dArray(corners, corners);\r\n return corners;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryHandler.js","sourceRoot":"","sources":["../../../src/geometry3d/GeometryHandler.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 ArraysAndInterfaces\n */\n\nimport { AkimaCurve3d } from \"../bspline/AkimaCurve3d\";\nimport { BezierCurve3d } from \"../bspline/BezierCurve3d\";\nimport { BezierCurve3dH } from \"../bspline/BezierCurve3dH\";\nimport { BezierCurveBase } from \"../bspline/BezierCurveBase\";\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\nimport { BSplineSurface3d, BSplineSurface3dH } from \"../bspline/BSplineSurface\";\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CoordinateXYZ } from \"../curve/CoordinateXYZ\";\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { ParityRegion } from \"../curve/ParityRegion\";\nimport { Path } from \"../curve/Path\";\nimport { PointString3d } from \"../curve/PointString3d\";\nimport { TransitionSpiral3d } from \"../curve/spiral/TransitionSpiral3d\";\nimport { UnionRegion } from \"../curve/UnionRegion\";\nimport { IndexedPolyface } from \"../polyface/Polyface\";\nimport { Box } from \"../solid/Box\";\nimport { Cone } from \"../solid/Cone\";\nimport { LinearSweep } from \"../solid/LinearSweep\";\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\nimport { RuledSweep } from \"../solid/RuledSweep\";\nimport { Sphere } from \"../solid/Sphere\";\nimport { TorusPipe } from \"../solid/TorusPipe\";\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\nimport { Vector2d } from \"./Point2dVector2d\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\n\n/**\n * `GeometryHandler` defines the base abstract methods for double-dispatch geometry computation.\n * * User code that wants to handle one or all of the commonly known geometry types implements a handler class.\n * * User code that does not handle all types is most likely to start with `NullGeometryHandler`, which will provide\n * No-action implementations for all types.\n * @public\n */\nexport abstract class GeometryHandler {\n /** Handle strongly typed [[LineSegment3d]] */\n public abstract handleLineSegment3d(g: LineSegment3d): any;\n /** Handle strongly typed [[LineString3d]] */\n public abstract handleLineString3d(g: LineString3d): any;\n /** Handle strongly typed [[Arc3d]] */\n public abstract handleArc3d(g: Arc3d): any;\n /** Handle strongly typed [[CurveCollection]] */\n public handleCurveCollection(_g: CurveCollection): any { }\n /** Handle strongly typed [[BSplineCurve3d]] */\n public abstract handleBSplineCurve3d(g: BSplineCurve3d): any;\n /** Handle strongly typed [[InterpolationCurve3d]] */\n public abstract handleInterpolationCurve3d(g: InterpolationCurve3d): any;\n /** Handle strongly typed [[AkimaCurve3d]] */\n public abstract handleAkimaCurve3d(g: AkimaCurve3d): any;\n /** Handle strongly typed [[BSplineCurve3dH]] */\n public abstract handleBSplineCurve3dH(g: BSplineCurve3dH): any;\n /** Handle strongly typed [[BSplineSurface3d]] */\n public abstract handleBSplineSurface3d(g: BSplineSurface3d): any;\n /** Handle strongly typed [[CoordinateXYZ]] */\n public abstract handleCoordinateXYZ(g: CoordinateXYZ): any;\n /** Handle strongly typed [[BSplineSurface3dH]] */\n public abstract handleBSplineSurface3dH(g: BSplineSurface3dH): any;\n /** Handle strongly typed [[IndexedPolyface]] */\n public abstract handleIndexedPolyface(g: IndexedPolyface): any;\n /**\n * Handle strongly typed [[TransitionSpiral3d]]\n * @alpha\n */\n public abstract handleTransitionSpiral(g: TransitionSpiral3d): any;\n /** Handle strongly typed Path (base class method calls handleCurveCollection) */\n public handlePath(g: Path): any {\n return this.handleCurveCollection(g);\n }\n /** Handle strongly typed Loop (base class method calls handleCurveCollection) */\n public handleLoop(g: Loop): any {\n return this.handleCurveCollection(g);\n }\n /** Handle strongly typed ParityRegion (base class method calls handleCurveCollection) */\n public handleParityRegion(g: ParityRegion): any {\n return this.handleCurveCollection(g);\n }\n /** Handle strongly typed UnionRegion (base class method calls handleCurveCollection) */\n public handleUnionRegion(g: UnionRegion): any {\n return this.handleCurveCollection(g);\n }\n /** Handle strongly typed BagOfCurves (base class method calls handleCurveCollection) */\n public handleBagOfCurves(g: BagOfCurves): any {\n return this.handleCurveCollection(g);\n }\n /** Handle strongly typed Sphere */\n public abstract handleSphere(g: Sphere): any;\n /** Handle strongly typed Cone */\n public abstract handleCone(g: Cone): any;\n /** Handle strongly typed Box */\n public abstract handleBox(g: Box): any;\n /** Handle strongly typed TorusPipe */\n public abstract handleTorusPipe(g: TorusPipe): any;\n /** Handle strongly typed LinearSweep */\n public abstract handleLinearSweep(g: LinearSweep): any;\n /** Handle strongly typed RotationalSweep */\n public abstract handleRotationalSweep(g: RotationalSweep): any;\n /** Handle strongly typed RuledSweep */\n public abstract handleRuledSweep(g: RuledSweep): any;\n /** Handle strongly typed PointString3d */\n public abstract handlePointString3d(g: PointString3d): any;\n /** Handle strongly typed BezierCurve3d */\n public abstract handleBezierCurve3d(g: BezierCurve3d): any;\n /** Handle strongly typed BezierCurve3dH */\n public abstract handleBezierCurve3dH(g: BezierCurve3dH): any;\n}\n/**\n * `NullGeometryHandler` is a base class for dispatching various geometry types to application specific implementation\n * of some service.\n * To use:\n * * Derive a class from `NullGeometryHandler`\n * * Re-implement any or all of the specific `handleXXXX` methods\n * * Create a handler instance `myHandler`\n * * To send a `GeometryQuery` object `candidateGeometry` through the (fast) dispatch, invoke\n * `candidateGeometry.dispatchToHandler (myHandler).\n * * The appropriate method or methods will get called with a strongly typed `_g ` value.\n * @public\n */\nexport class NullGeometryHandler extends GeometryHandler {\n /** No-action implementation */\n public handleLineSegment3d(_g: LineSegment3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleLineString3d(_g: LineString3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleArc3d(_g: Arc3d): any {\n return undefined;\n }\n /** No-action implementation */\n public override handleCurveCollection(_g: CurveCollection): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineCurve3d(_g: BSplineCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleInterpolationCurve3d(_g: InterpolationCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleAkimaCurve3d(_g: AkimaCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineCurve3dH(_g: BSplineCurve3dH): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineSurface3d(_g: BSplineSurface3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleCoordinateXYZ(_g: CoordinateXYZ): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineSurface3dH(_g: BSplineSurface3dH): any {\n return undefined;\n }\n /** No-action implementation */\n public handleIndexedPolyface(_g: IndexedPolyface): any {\n return undefined;\n }\n /** No-action implementation\n * @alpha\n */\n public handleTransitionSpiral(_g: TransitionSpiral3d): any {\n return undefined;\n }\n /** No-action implementation */\n public override handlePath(_g: Path): any {\n return undefined;\n }\n /** No-action implementation */\n public override handleLoop(_g: Loop): any {\n return undefined;\n }\n /** No-action implementation */\n public override handleParityRegion(_g: ParityRegion): any {\n return undefined;\n }\n /** No-action implementation */\n public override handleUnionRegion(_g: UnionRegion): any {\n return undefined;\n }\n /** No-action implementation */\n public override handleBagOfCurves(_g: BagOfCurves): any {\n return undefined;\n }\n /** No-action implementation */\n public handleSphere(_g: Sphere): any {\n return undefined;\n }\n /** No-action implementation */\n public handleCone(_g: Cone): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBox(_g: Box): any {\n return undefined;\n }\n /** No-action implementation */\n public handleTorusPipe(_g: TorusPipe): any {\n return undefined;\n }\n /** No-action implementation */\n public handleLinearSweep(_g: LinearSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handleRotationalSweep(_g: RotationalSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handleRuledSweep(_g: RuledSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handlePointString3d(_g: PointString3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBezierCurve3d(_g: BezierCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBezierCurve3dH(_g: BezierCurve3dH): any {\n return undefined;\n }\n}\n/**\n * Implement GeometryHandler methods, with all curve collection methods recursing to children.\n * @public\n */\nexport class RecurseToCurvesGeometryHandler extends GeometryHandler {\n /** No-action implementation */\n public handleLineSegment3d(_g: LineSegment3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleLineString3d(_g: LineString3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleArc3d(_g: Arc3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineCurve3d(_g: BSplineCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleInterpolationCurve3d(_g: InterpolationCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleAkimaCurve3d(_g: AkimaCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineCurve3dH(_g: BSplineCurve3dH): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineSurface3d(_g: BSplineSurface3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleCoordinateXYZ(_g: CoordinateXYZ): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBSplineSurface3dH(_g: BSplineSurface3dH): any {\n return undefined;\n }\n /** No-action implementation */\n public handleIndexedPolyface(_g: IndexedPolyface): any {\n return undefined;\n }\n /** No-action implementation\n * @alpha\n */\n public handleTransitionSpiral(_g: TransitionSpiral3d): any {\n return undefined;\n }\n /** Invoke `child.dispatchToGeometryHandler(this)` for each child in the array returned by the query `g.children` */\n public handleChildren(g: GeometryQuery): any {\n const children = g.children;\n if (children)\n for (const child of children) {\n child.dispatchToGeometryHandler(this);\n }\n }\n /** Recurse to children */\n public override handleCurveCollection(g: CurveCollection): any {\n return this.handleChildren(g);\n }\n /** Recurse to children */\n public override handlePath(g: Path): any {\n return this.handleChildren(g);\n }\n /** Recurse to children */\n public override handleLoop(g: Loop): any {\n return this.handleChildren(g);\n }\n /** Recurse to children */\n public override handleParityRegion(g: ParityRegion): any {\n return this.handleChildren(g);\n }\n /** Recurse to children */\n public override handleUnionRegion(g: UnionRegion): any {\n return this.handleChildren(g);\n }\n /** Recurse to children */\n public override handleBagOfCurves(g: BagOfCurves): any {\n return this.handleChildren(g);\n }\n /** No-action implementation */\n public handleSphere(_g: Sphere): any {\n return undefined;\n }\n /** No-action implementation */\n public handleCone(_g: Cone): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBox(_g: Box): any {\n return undefined;\n }\n /** No-action implementation */\n public handleTorusPipe(_g: TorusPipe): any {\n return undefined;\n }\n /** No-action implementation */\n public handleLinearSweep(_g: LinearSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handleRotationalSweep(_g: RotationalSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handleRuledSweep(_g: RuledSweep): any {\n return undefined;\n }\n /** No-action implementation */\n public handlePointString3d(_g: PointString3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBezierCurve3d(_g: BezierCurve3d): any {\n return undefined;\n }\n /** No-action implementation */\n public handleBezierCurve3dH(_g: BezierCurve3dH): any {\n return undefined;\n }\n}\n\n/**\n * IStrokeHandler is an interface with methods to receive data about curves being stroked.\n * CurvePrimitives emitStrokes () methods emit calls to a handler object with these methods.\n * The various CurvePrimitive types are free to announce either single points (announcePoint), linear fragments,\n * or fractional intervals of the parent curve.\n * * handler.startCurvePrimitive (cp) -- announce the curve primitive whose strokes will follow.\n * * announcePointTangent (xyz, fraction, tangent) -- announce a single point on the curve.\n * * announceIntervalForUniformStepStrokes (cp, numStrokes, fraction0, fraction1) -- announce a fraction\n * interval in which the curve can be evaluated (e.g. the handler can call cp->fractionToPointAndDerivative ())\n * * announceSegmentInterval (cp, point0, point1, numStrokes, fraction0, fraction1) -- announce\n * that the fractional interval fraction0, fraction1 is a straight line which should be broken into\n * numStrokes strokes.\n * * A LineSegment would make a single call to this.\n * * A LineString would make one call to this for each of its segments, with fractions indicating position\n * within the linestring.\n * * endCurvePrimitive (cp) -- announce the end of the curve primitive.\n * @public\n */\nexport interface IStrokeHandler {\n /**\n * Announce a parent curve primitive\n * * startParentCurvePrimitive() ...endParentCurvePrimitive() are wrapped around startCurvePrimitive and\n * endCurvePrimitive when the interior primitive is a proxy.\n */\n startParentCurvePrimitive(cp: CurvePrimitive): void;\n /** Announce the curve primitive that will be described in subsequent calls. */\n startCurvePrimitive(cp: CurvePrimitive): void;\n /**\n * Announce a single point with its fraction and tangent.\n * * (IMPORTANT) the same Point3d and Vector3d will be reset and passed on multiple calls.\n * * (THEREFORE) if the implementation is saving coordinates, it must copy the xyz data out into its own data\n * structure rather than save the references.\n */\n announcePointTangent(xyz: Point3d, fraction: number, tangent: Vector3d): void;\n\n /**\n * Announce that curve primitive cp should be evaluated in the specified fraction interval.\n * * Note that this method is permitted (expected) to provide pre-stroked data if available.\n * * In th pre-stroked case, the cp passed to the handler will be the stroked image, not the original.\n * * Callers that want summary data should implement (and return true from) needPrimaryDataForStrokes\n */\n announceIntervalForUniformStepStrokes(\n cp: CurvePrimitive,\n numStrokes: number,\n fraction0: number,\n fraction1: number): void;\n /**\n * OPTIONAL method for a handler to indicate that it wants primary geometry (e.g. spirals) rather than strokes.\n * @returns true if primary geometry should be passed (rather than stroked or otherwise simplified)\n */\n needPrimaryGeometryForStrokes?(): boolean;\n /** Announce numPoints interpolated between point0 and point1, with associated fractions */\n announceSegmentInterval(\n cp: CurvePrimitive, point0: Point3d, point1: Point3d, numStrokes: number, fraction0: number, fraction1: number,\n ): void;\n /** Announce that all data about `cp` has been announced. */\n endCurvePrimitive(cp: CurvePrimitive): void;\n /** Announce that all data about the parent primitive has been announced. */\n endParentCurvePrimitive(cp: CurvePrimitive): void;\n /**\n * Announce a bezier curve fragment.\n * * this is usually a section of BsplineCurve\n * * If this function is missing, the same interval will be passed to announceIntervalForUniformSteps.\n * @param bezier bezier fragment\n * @param numStrokes suggested number of strokes (uniform in bezier interval 0..1)\n * @param parent parent curve\n * @param spanIndex spanIndex within parent\n * @param fraction0 start fraction on parent curve\n * @param fraction1 end fraction on parent curve\n */\n announceBezierCurve?(\n bezier: BezierCurveBase,\n numStrokes: number,\n parent: CurvePrimitive,\n spandex: number,\n fraction0: number,\n fraction1: number,\n ): void;\n}\n\n/**\n * Interface with methods for mapping (u,v) fractional coordinates to surface xyz and derivatives.\n * @public\n */\nexport interface UVSurface {\n /**\n * Convert fractional u and v coordinates to surface point.\n * @param uFraction fractional coordinate in u direction\n * @param vFraction fractional coordinate in v direction\n * @param result optional pre-allocated point\n */\n uvFractionToPoint(uFraction: number, vFraction: number, result?: Point3d): Point3d;\n /**\n * Convert fractional u and v coordinates to surface point and in-surface tangent directions.\n * * The vectors are expected to be non-zero tangents which can be crossed to get a normal.\n * * Hence they are not necessarily (a) partial derivatives or (b) Frenet vectors.\n * @param uFraction fractional coordinate in u direction\n * @param vFraction fractional coordinate in v direction\n * @param result optional pre-allocated carrier for point and vectors\n */\n uvFractionToPointAndTangents(\n uFraction: number, vFraction: number, result?: Plane3dByOriginAndVectors,\n ): Plane3dByOriginAndVectors;\n}\n/**\n * Interface for queries of distance-along in u and v directions\n * @public\n */\nexport interface UVSurfaceIsoParametricDistance {\n /**\n * * Return a vector whose x and y parts are \"size\" of the surface in the u and v directions.\n * * Sizes are use for applying scaling to mesh parameters\n * * These sizes are (reasonable approximations of) the max curve length along u and v isoparameter lines.\n * * e.g. for a sphere, these are:\n * * u direction = distance around the equator\n * * v direction = distance from south pole to north pole.\n */\n maxIsoParametricDistance(): Vector2d;\n}\n"]}
1
+ {"version":3,"file":"GeometryHandler.js","sourceRoot":"","sources":["../../../src/geometry3d/GeometryHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module ArraysAndInterfaces\r\n */\r\n\r\nimport { AkimaCurve3d } from \"../bspline/AkimaCurve3d\";\r\nimport { BezierCurve3d } from \"../bspline/BezierCurve3d\";\r\nimport { BezierCurve3dH } from \"../bspline/BezierCurve3dH\";\r\nimport { BezierCurveBase } from \"../bspline/BezierCurveBase\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { BSplineCurve3dH } from \"../bspline/BSplineCurve3dH\";\r\nimport { BSplineSurface3d, BSplineSurface3dH } from \"../bspline/BSplineSurface\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CoordinateXYZ } from \"../curve/CoordinateXYZ\";\r\nimport { BagOfCurves, CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { ParityRegion } from \"../curve/ParityRegion\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { PointString3d } from \"../curve/PointString3d\";\r\nimport { TransitionSpiral3d } from \"../curve/spiral/TransitionSpiral3d\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { IndexedPolyface } from \"../polyface/Polyface\";\r\nimport { Box } from \"../solid/Box\";\r\nimport { Cone } from \"../solid/Cone\";\r\nimport { LinearSweep } from \"../solid/LinearSweep\";\r\nimport { RotationalSweep } from \"../solid/RotationalSweep\";\r\nimport { RuledSweep } from \"../solid/RuledSweep\";\r\nimport { Sphere } from \"../solid/Sphere\";\r\nimport { TorusPipe } from \"../solid/TorusPipe\";\r\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\r\nimport { Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\n\r\n/**\r\n * `GeometryHandler` defines the base abstract methods for double-dispatch geometry computation.\r\n * * User code that wants to handle one or all of the commonly known geometry types implements a handler class.\r\n * * User code that does not handle all types is most likely to start with `NullGeometryHandler`, which will provide\r\n * No-action implementations for all types.\r\n * @public\r\n */\r\nexport abstract class GeometryHandler {\r\n /** Handle strongly typed [[LineSegment3d]] */\r\n public abstract handleLineSegment3d(g: LineSegment3d): any;\r\n /** Handle strongly typed [[LineString3d]] */\r\n public abstract handleLineString3d(g: LineString3d): any;\r\n /** Handle strongly typed [[Arc3d]] */\r\n public abstract handleArc3d(g: Arc3d): any;\r\n /** Handle strongly typed [[CurveCollection]] */\r\n public handleCurveCollection(_g: CurveCollection): any { }\r\n /** Handle strongly typed [[BSplineCurve3d]] */\r\n public abstract handleBSplineCurve3d(g: BSplineCurve3d): any;\r\n /** Handle strongly typed [[InterpolationCurve3d]] */\r\n public abstract handleInterpolationCurve3d(g: InterpolationCurve3d): any;\r\n /** Handle strongly typed [[AkimaCurve3d]] */\r\n public abstract handleAkimaCurve3d(g: AkimaCurve3d): any;\r\n /** Handle strongly typed [[BSplineCurve3dH]] */\r\n public abstract handleBSplineCurve3dH(g: BSplineCurve3dH): any;\r\n /** Handle strongly typed [[BSplineSurface3d]] */\r\n public abstract handleBSplineSurface3d(g: BSplineSurface3d): any;\r\n /** Handle strongly typed [[CoordinateXYZ]] */\r\n public abstract handleCoordinateXYZ(g: CoordinateXYZ): any;\r\n /** Handle strongly typed [[BSplineSurface3dH]] */\r\n public abstract handleBSplineSurface3dH(g: BSplineSurface3dH): any;\r\n /** Handle strongly typed [[IndexedPolyface]] */\r\n public abstract handleIndexedPolyface(g: IndexedPolyface): any;\r\n /**\r\n * Handle strongly typed [[TransitionSpiral3d]]\r\n * @alpha\r\n */\r\n public abstract handleTransitionSpiral(g: TransitionSpiral3d): any;\r\n /** Handle strongly typed Path (base class method calls handleCurveCollection) */\r\n public handlePath(g: Path): any {\r\n return this.handleCurveCollection(g);\r\n }\r\n /** Handle strongly typed Loop (base class method calls handleCurveCollection) */\r\n public handleLoop(g: Loop): any {\r\n return this.handleCurveCollection(g);\r\n }\r\n /** Handle strongly typed ParityRegion (base class method calls handleCurveCollection) */\r\n public handleParityRegion(g: ParityRegion): any {\r\n return this.handleCurveCollection(g);\r\n }\r\n /** Handle strongly typed UnionRegion (base class method calls handleCurveCollection) */\r\n public handleUnionRegion(g: UnionRegion): any {\r\n return this.handleCurveCollection(g);\r\n }\r\n /** Handle strongly typed BagOfCurves (base class method calls handleCurveCollection) */\r\n public handleBagOfCurves(g: BagOfCurves): any {\r\n return this.handleCurveCollection(g);\r\n }\r\n /** Handle strongly typed Sphere */\r\n public abstract handleSphere(g: Sphere): any;\r\n /** Handle strongly typed Cone */\r\n public abstract handleCone(g: Cone): any;\r\n /** Handle strongly typed Box */\r\n public abstract handleBox(g: Box): any;\r\n /** Handle strongly typed TorusPipe */\r\n public abstract handleTorusPipe(g: TorusPipe): any;\r\n /** Handle strongly typed LinearSweep */\r\n public abstract handleLinearSweep(g: LinearSweep): any;\r\n /** Handle strongly typed RotationalSweep */\r\n public abstract handleRotationalSweep(g: RotationalSweep): any;\r\n /** Handle strongly typed RuledSweep */\r\n public abstract handleRuledSweep(g: RuledSweep): any;\r\n /** Handle strongly typed PointString3d */\r\n public abstract handlePointString3d(g: PointString3d): any;\r\n /** Handle strongly typed BezierCurve3d */\r\n public abstract handleBezierCurve3d(g: BezierCurve3d): any;\r\n /** Handle strongly typed BezierCurve3dH */\r\n public abstract handleBezierCurve3dH(g: BezierCurve3dH): any;\r\n}\r\n/**\r\n * `NullGeometryHandler` is a base class for dispatching various geometry types to application specific implementation\r\n * of some service.\r\n * To use:\r\n * * Derive a class from `NullGeometryHandler`\r\n * * Re-implement any or all of the specific `handleXXXX` methods\r\n * * Create a handler instance `myHandler`\r\n * * To send a `GeometryQuery` object `candidateGeometry` through the (fast) dispatch, invoke\r\n * `candidateGeometry.dispatchToHandler (myHandler).\r\n * * The appropriate method or methods will get called with a strongly typed `_g ` value.\r\n * @public\r\n */\r\nexport class NullGeometryHandler extends GeometryHandler {\r\n /** No-action implementation */\r\n public handleLineSegment3d(_g: LineSegment3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleLineString3d(_g: LineString3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleArc3d(_g: Arc3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handleCurveCollection(_g: CurveCollection): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineCurve3d(_g: BSplineCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleInterpolationCurve3d(_g: InterpolationCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleAkimaCurve3d(_g: AkimaCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineCurve3dH(_g: BSplineCurve3dH): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineSurface3d(_g: BSplineSurface3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleCoordinateXYZ(_g: CoordinateXYZ): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineSurface3dH(_g: BSplineSurface3dH): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleIndexedPolyface(_g: IndexedPolyface): any {\r\n return undefined;\r\n }\r\n /** No-action implementation\r\n * @alpha\r\n */\r\n public handleTransitionSpiral(_g: TransitionSpiral3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handlePath(_g: Path): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handleLoop(_g: Loop): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handleParityRegion(_g: ParityRegion): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handleUnionRegion(_g: UnionRegion): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public override handleBagOfCurves(_g: BagOfCurves): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleSphere(_g: Sphere): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleCone(_g: Cone): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBox(_g: Box): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleTorusPipe(_g: TorusPipe): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleLinearSweep(_g: LinearSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleRotationalSweep(_g: RotationalSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleRuledSweep(_g: RuledSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handlePointString3d(_g: PointString3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBezierCurve3d(_g: BezierCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBezierCurve3dH(_g: BezierCurve3dH): any {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Implement GeometryHandler methods, with all curve collection methods recursing to children.\r\n * @public\r\n */\r\nexport class RecurseToCurvesGeometryHandler extends GeometryHandler {\r\n /** No-action implementation */\r\n public handleLineSegment3d(_g: LineSegment3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleLineString3d(_g: LineString3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleArc3d(_g: Arc3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineCurve3d(_g: BSplineCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleInterpolationCurve3d(_g: InterpolationCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleAkimaCurve3d(_g: AkimaCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineCurve3dH(_g: BSplineCurve3dH): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineSurface3d(_g: BSplineSurface3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleCoordinateXYZ(_g: CoordinateXYZ): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBSplineSurface3dH(_g: BSplineSurface3dH): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleIndexedPolyface(_g: IndexedPolyface): any {\r\n return undefined;\r\n }\r\n /** No-action implementation\r\n * @alpha\r\n */\r\n public handleTransitionSpiral(_g: TransitionSpiral3d): any {\r\n return undefined;\r\n }\r\n /** Invoke `child.dispatchToGeometryHandler(this)` for each child in the array returned by the query `g.children` */\r\n public handleChildren(g: GeometryQuery): any {\r\n const children = g.children;\r\n if (children)\r\n for (const child of children) {\r\n child.dispatchToGeometryHandler(this);\r\n }\r\n }\r\n /** Recurse to children */\r\n public override handleCurveCollection(g: CurveCollection): any {\r\n return this.handleChildren(g);\r\n }\r\n /** Recurse to children */\r\n public override handlePath(g: Path): any {\r\n return this.handleChildren(g);\r\n }\r\n /** Recurse to children */\r\n public override handleLoop(g: Loop): any {\r\n return this.handleChildren(g);\r\n }\r\n /** Recurse to children */\r\n public override handleParityRegion(g: ParityRegion): any {\r\n return this.handleChildren(g);\r\n }\r\n /** Recurse to children */\r\n public override handleUnionRegion(g: UnionRegion): any {\r\n return this.handleChildren(g);\r\n }\r\n /** Recurse to children */\r\n public override handleBagOfCurves(g: BagOfCurves): any {\r\n return this.handleChildren(g);\r\n }\r\n /** No-action implementation */\r\n public handleSphere(_g: Sphere): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleCone(_g: Cone): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBox(_g: Box): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleTorusPipe(_g: TorusPipe): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleLinearSweep(_g: LinearSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleRotationalSweep(_g: RotationalSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleRuledSweep(_g: RuledSweep): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handlePointString3d(_g: PointString3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBezierCurve3d(_g: BezierCurve3d): any {\r\n return undefined;\r\n }\r\n /** No-action implementation */\r\n public handleBezierCurve3dH(_g: BezierCurve3dH): any {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * IStrokeHandler is an interface with methods to receive data about curves being stroked.\r\n * CurvePrimitives emitStrokes () methods emit calls to a handler object with these methods.\r\n * The various CurvePrimitive types are free to announce either single points (announcePoint), linear fragments,\r\n * or fractional intervals of the parent curve.\r\n * * handler.startCurvePrimitive (cp) -- announce the curve primitive whose strokes will follow.\r\n * * announcePointTangent (xyz, fraction, tangent) -- announce a single point on the curve.\r\n * * announceIntervalForUniformStepStrokes (cp, numStrokes, fraction0, fraction1) -- announce a fraction\r\n * interval in which the curve can be evaluated (e.g. the handler can call cp->fractionToPointAndDerivative ())\r\n * * announceSegmentInterval (cp, point0, point1, numStrokes, fraction0, fraction1) -- announce\r\n * that the fractional interval fraction0, fraction1 is a straight line which should be broken into\r\n * numStrokes strokes.\r\n * * A LineSegment would make a single call to this.\r\n * * A LineString would make one call to this for each of its segments, with fractions indicating position\r\n * within the linestring.\r\n * * endCurvePrimitive (cp) -- announce the end of the curve primitive.\r\n * @public\r\n */\r\nexport interface IStrokeHandler {\r\n /**\r\n * Announce a parent curve primitive\r\n * * startParentCurvePrimitive() ...endParentCurvePrimitive() are wrapped around startCurvePrimitive and\r\n * endCurvePrimitive when the interior primitive is a proxy.\r\n */\r\n startParentCurvePrimitive(cp: CurvePrimitive): void;\r\n /** Announce the curve primitive that will be described in subsequent calls. */\r\n startCurvePrimitive(cp: CurvePrimitive): void;\r\n /**\r\n * Announce a single point with its fraction and tangent.\r\n * * (IMPORTANT) the same Point3d and Vector3d will be reset and passed on multiple calls.\r\n * * (THEREFORE) if the implementation is saving coordinates, it must copy the xyz data out into its own data\r\n * structure rather than save the references.\r\n */\r\n announcePointTangent(xyz: Point3d, fraction: number, tangent: Vector3d): void;\r\n\r\n /**\r\n * Announce that curve primitive cp should be evaluated in the specified fraction interval.\r\n * * Note that this method is permitted (expected) to provide pre-stroked data if available.\r\n * * In th pre-stroked case, the cp passed to the handler will be the stroked image, not the original.\r\n * * Callers that want summary data should implement (and return true from) needPrimaryDataForStrokes\r\n */\r\n announceIntervalForUniformStepStrokes(\r\n cp: CurvePrimitive,\r\n numStrokes: number,\r\n fraction0: number,\r\n fraction1: number): void;\r\n /**\r\n * OPTIONAL method for a handler to indicate that it wants primary geometry (e.g. spirals) rather than strokes.\r\n * @returns true if primary geometry should be passed (rather than stroked or otherwise simplified)\r\n */\r\n needPrimaryGeometryForStrokes?(): boolean;\r\n /** Announce numPoints interpolated between point0 and point1, with associated fractions */\r\n announceSegmentInterval(\r\n cp: CurvePrimitive, point0: Point3d, point1: Point3d, numStrokes: number, fraction0: number, fraction1: number,\r\n ): void;\r\n /** Announce that all data about `cp` has been announced. */\r\n endCurvePrimitive(cp: CurvePrimitive): void;\r\n /** Announce that all data about the parent primitive has been announced. */\r\n endParentCurvePrimitive(cp: CurvePrimitive): void;\r\n /**\r\n * Announce a bezier curve fragment.\r\n * * this is usually a section of BsplineCurve\r\n * * If this function is missing, the same interval will be passed to announceIntervalForUniformSteps.\r\n * @param bezier bezier fragment\r\n * @param numStrokes suggested number of strokes (uniform in bezier interval 0..1)\r\n * @param parent parent curve\r\n * @param spanIndex spanIndex within parent\r\n * @param fraction0 start fraction on parent curve\r\n * @param fraction1 end fraction on parent curve\r\n */\r\n announceBezierCurve?(\r\n bezier: BezierCurveBase,\r\n numStrokes: number,\r\n parent: CurvePrimitive,\r\n spandex: number,\r\n fraction0: number,\r\n fraction1: number,\r\n ): void;\r\n}\r\n\r\n/**\r\n * Interface with methods for mapping (u,v) fractional coordinates to surface xyz and derivatives.\r\n * @public\r\n */\r\nexport interface UVSurface {\r\n /**\r\n * Convert fractional u and v coordinates to surface point.\r\n * @param uFraction fractional coordinate in u direction\r\n * @param vFraction fractional coordinate in v direction\r\n * @param result optional pre-allocated point\r\n */\r\n uvFractionToPoint(uFraction: number, vFraction: number, result?: Point3d): Point3d;\r\n /**\r\n * Convert fractional u and v coordinates to surface point and in-surface tangent directions.\r\n * * The vectors are expected to be non-zero tangents which can be crossed to get a normal.\r\n * * Hence they are not necessarily (a) partial derivatives or (b) Frenet vectors.\r\n * @param uFraction fractional coordinate in u direction\r\n * @param vFraction fractional coordinate in v direction\r\n * @param result optional pre-allocated carrier for point and vectors\r\n */\r\n uvFractionToPointAndTangents(\r\n uFraction: number, vFraction: number, result?: Plane3dByOriginAndVectors,\r\n ): Plane3dByOriginAndVectors;\r\n}\r\n/**\r\n * Interface for queries of distance-along in u and v directions\r\n * @public\r\n */\r\nexport interface UVSurfaceIsoParametricDistance {\r\n /**\r\n * * Return a vector whose x and y parts are \"size\" of the surface in the u and v directions.\r\n * * Sizes are use for applying scaling to mesh parameters\r\n * * These sizes are (reasonable approximations of) the max curve length along u and v isoparameter lines.\r\n * * e.g. for a sphere, these are:\r\n * * u direction = distance around the equator\r\n * * v direction = distance from south pole to north pole.\r\n */\r\n maxIsoParametricDistance(): Vector2d;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GrowableBlockedArray.js","sourceRoot":"","sources":["../../../src/geometry3d/GrowableBlockedArray.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/** @packageDocumentation\n * @module ArraysAndInterfaces\n */\n\nimport { BlockComparisonFunction } from \"./GrowableFloat64Array\";\n\n/**\n * Array of contiguous doubles, indexed by block number and index within block.\n * * This is essentially a rectangular matrix (two dimensional array), with each block being a row of the matrix.\n * @public\n */\nexport class GrowableBlockedArray {\n /** underlying contiguous, oversized buffer. */\n protected _data: Float64Array;\n /** Number of blocks (matrix rows) in use. */\n protected _inUse: number;\n /** number of numbers per block in the array.\n * * If viewing the array as a two dimensional array, this is the row size.\n */\n protected _blockSize: number; // positive integer !!!\n /**\n * multiplier used by ensureBlockCapacity to expand requested reallocation size\n */\n protected _growthFactor: number;\n\n /**\n * Construct an array whose contents are in blocked (row-major) order, possibly with extra capacity.\n * * Total capacity is `this._data.length`\n * * Actual in-use count is `this._inUse * this._blockSize`\n * @param blockSize number of entries in each block, i.e., row size\n * @param initialBlocks initial capacity in blocks (default 8)\n * @param growthFactor used by ensureBlockCapacity to expand requested reallocation size (default 1.5)\n */\n public constructor(blockSize: number, initialBlocks: number = 8, growthFactor?: number) {\n this._data = new Float64Array(initialBlocks * blockSize);\n this._inUse = 0;\n this._blockSize = blockSize > 0 ? blockSize : 1;\n this._growthFactor = (undefined !== growthFactor && growthFactor >= 1.0) ? growthFactor : 1.5;\n }\n\n /** Copy data from source array. Does not reallocate or change active block count.\n * @param source array to copy from\n * @param sourceCount copy the first sourceCount blocks; all blocks if undefined\n * @param destOffset copy to instance array starting at this block index; zero if undefined\n * @return count and offset of blocks copied\n */\n protected copyData(source: Float64Array | number[], sourceCount?: number, destOffset?: number): {count: number, offset: number} {\n // validate inputs and convert from blocks to entries\n let myOffset = (undefined !== destOffset) ? destOffset * this.numPerBlock : 0;\n if (myOffset < 0)\n myOffset = 0;\n if (myOffset >= this._data.length)\n return {count: 0, offset: 0};\n let myCount = (undefined !== sourceCount) ? sourceCount * this.numPerBlock : source.length;\n if (myCount > 0) {\n if (myCount > source.length)\n myCount = source.length;\n if (myOffset + myCount > this._data.length)\n myCount = this._data.length - myOffset;\n if (myCount % this.numPerBlock !== 0)\n myCount -= myCount % this.numPerBlock;\n }\n if (myCount <= 0)\n return {count: 0, offset: 0};\n if (myCount === source.length)\n this._data.set(source, myOffset);\n else if (source instanceof Float64Array)\n this._data.set(source.subarray(0, myCount), myOffset);\n else\n this._data.set(source.slice(0, myCount), myOffset);\n return {count: myCount / this.numPerBlock, offset: myOffset / this.numPerBlock};\n }\n\n /**\n * Make a copy of the (active) blocks in this array.\n * (The clone does NOT get excess capacity)\n */\n public clone(): GrowableBlockedArray {\n const newBlocks = new GrowableBlockedArray(this.numPerBlock, this.numBlocks, this._growthFactor);\n newBlocks.copyData(this._data, this.numBlocks);\n newBlocks._inUse = this.numBlocks;\n return newBlocks;\n }\n\n /** computed property: length (in blocks, not doubles) */\n public get length(): number { return this._inUse; }\n /** computed property: length (in blocks, not doubles) */\n public get numBlocks(): number { return this._inUse; }\n /** property: number of data values per block */\n public get numPerBlock(): number { return this._blockSize; }\n /**\n * Return a single value indexed within a block. Indices are unchecked.\n * @param blockIndex index of block to read\n * @param indexInBlock offset within the block\n */\n public getWithinBlock(blockIndex: number, indexWithinBlock: number): number {\n return this._data[blockIndex * this._blockSize + indexWithinBlock];\n }\n /** clear the block count to zero, but maintain the allocated memory */\n public clear() { this._inUse = 0; }\n /** Return the capacity in blocks (not doubles) */\n public blockCapacity() {\n return this._data.length / this._blockSize;\n }\n /** ensure capacity (in blocks, not doubles) */\n public ensureBlockCapacity(blockCapacity: number, applyGrowthFactor: boolean = true) {\n if (blockCapacity > this.blockCapacity()) {\n if (applyGrowthFactor)\n blockCapacity *= this._growthFactor;\n const prevData = this._data;\n this._data = new Float64Array(blockCapacity * this._blockSize);\n this.copyData(prevData, this._inUse);\n }\n }\n /** Add a new block of data.\n * * If newData has fewer than numPerBlock entries, the remaining part of the new block is zeros.\n * * If newData has more entries, only the first numPerBlock are taken.\n */\n public addBlock(newData: number[]) {\n const k0 = this.newBlockIndex();\n let numValue = newData.length;\n if (numValue > this._blockSize)\n numValue = this._blockSize;\n for (let i = 0; i < numValue; i++)\n this._data[k0 + i] = newData[i];\n }\n /**\n * Return the starting index of a block of (zero-initialized) doubles at the end.\n *\n * * this.data is reallocated if needed to include the new block.\n * * The inUse count is incremented to include the new block.\n * * The returned block is an index to the Float64Array (not a block index)\n */\n protected newBlockIndex(): number {\n const index = this._blockSize * this._inUse;\n if ((index + 1) > this._data.length)\n this.ensureBlockCapacity(1 + this._inUse);\n this._inUse++;\n for (let i = index; i < index + this._blockSize; i++)\n this._data[i] = 0.0;\n return index;\n }\n /** reduce the block count by one. */\n public popBlock() {\n if (this._inUse > 0)\n this._inUse--;\n }\n /** convert a block index to the simple index to the underlying Float64Array. */\n protected blockIndexToDoubleIndex(blockIndex: number) { return this._blockSize * blockIndex; }\n /** Access a single double at offset within a block, with index checking and return undefined if indexing is invalid. */\n public checkedComponent(blockIndex: number, componentIndex: number): number | undefined {\n if (blockIndex >= this._inUse || blockIndex < 0 || componentIndex < 0 || componentIndex >= this._blockSize)\n return undefined;\n return this._data[this._blockSize * blockIndex + componentIndex];\n }\n /** Access a single double at offset within a block. This has no index checking. */\n public component(blockIndex: number, componentIndex: number): number {\n return this._data[this._blockSize * blockIndex + componentIndex];\n }\n /** compare two blocks in simple lexical order.\n * @param data data array\n * @param blockSize number of items to compare\n * @param ia raw index (not block index) of first block\n * @param ib raw index (not block index) of second block\n */\n public static compareLexicalBlock(data: Float64Array, blockSize: number, ia: number, ib: number): number {\n let ax = 0;\n let bx = 0;\n for (let i = 0; i < blockSize; i++) {\n ax = data[ia + i];\n bx = data[ib + i];\n if (ax > bx) return 1;\n if (ax < bx) return -1;\n }\n return ia - ib; // so original order is maintained among duplicates !!!!\n }\n /** Return an array of block indices sorted per compareLexicalBlock function */\n public sortIndicesLexical(compareBlocks: BlockComparisonFunction = (dataArray, size, iA, iB) => GrowableBlockedArray.compareLexicalBlock(dataArray, size, iA, iB)): Uint32Array {\n const n = this._inUse;\n // let numCompare = 0;\n const result = new Uint32Array(n);\n const data = this._data;\n const blockSize = this._blockSize;\n for (let i = 0; i < n; i++)result[i] = i;\n result.sort(\n (blockIndexA: number, blockIndexB: number) => {\n // numCompare++;\n return compareBlocks(data, blockSize, blockIndexA * blockSize, blockIndexB * blockSize);\n });\n // console.log (n, numCompare);\n return result;\n }\n /** Return the distance (hypotenuse=sqrt(summed squares)) between indicated blocks */\n public distanceBetweenBlocks(blockIndexA: number, blockIndexB: number): number {\n let dd = 0.0;\n let iA = this.blockIndexToDoubleIndex(blockIndexA);\n let iB = this.blockIndexToDoubleIndex(blockIndexB);\n let a = 0;\n const data = this._data;\n for (let i = 0; i < this._blockSize; i++) {\n a = data[iA++] - data[iB++];\n dd += a * a;\n }\n return Math.sqrt(dd);\n }\n\n /** Return the distance (hypotenuse=sqrt(summed squares)) between block entries `iBegin <= i < iEnd` of indicated blocks */\n public distanceBetweenSubBlocks(blockIndexA: number, blockIndexB: number, iBegin: number, iEnd: number): number {\n let dd = 0.0;\n const iA = this.blockIndexToDoubleIndex(blockIndexA);\n const iB = this.blockIndexToDoubleIndex(blockIndexB);\n let a = 0;\n const data = this._data;\n for (let i = iBegin; i < iEnd; i++) {\n a = data[iA + i] - data[iB + i];\n dd += a * a;\n }\n return Math.sqrt(dd);\n }\n}\n"]}
1
+ {"version":3,"file":"GrowableBlockedArray.js","sourceRoot":"","sources":["../../../src/geometry3d/GrowableBlockedArray.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module ArraysAndInterfaces\r\n */\r\n\r\nimport { BlockComparisonFunction } from \"./GrowableFloat64Array\";\r\n\r\n/**\r\n * Array of contiguous doubles, indexed by block number and index within block.\r\n * * This is essentially a rectangular matrix (two dimensional array), with each block being a row of the matrix.\r\n * @public\r\n */\r\nexport class GrowableBlockedArray {\r\n /** underlying contiguous, oversized buffer. */\r\n protected _data: Float64Array;\r\n /** Number of blocks (matrix rows) in use. */\r\n protected _inUse: number;\r\n /** number of numbers per block in the array.\r\n * * If viewing the array as a two dimensional array, this is the row size.\r\n */\r\n protected _blockSize: number; // positive integer !!!\r\n /**\r\n * multiplier used by ensureBlockCapacity to expand requested reallocation size\r\n */\r\n protected _growthFactor: number;\r\n\r\n /**\r\n * Construct an array whose contents are in blocked (row-major) order, possibly with extra capacity.\r\n * * Total capacity is `this._data.length`\r\n * * Actual in-use count is `this._inUse * this._blockSize`\r\n * @param blockSize number of entries in each block, i.e., row size\r\n * @param initialBlocks initial capacity in blocks (default 8)\r\n * @param growthFactor used by ensureBlockCapacity to expand requested reallocation size (default 1.5)\r\n */\r\n public constructor(blockSize: number, initialBlocks: number = 8, growthFactor?: number) {\r\n this._data = new Float64Array(initialBlocks * blockSize);\r\n this._inUse = 0;\r\n this._blockSize = blockSize > 0 ? blockSize : 1;\r\n this._growthFactor = (undefined !== growthFactor && growthFactor >= 1.0) ? growthFactor : 1.5;\r\n }\r\n\r\n /** Copy data from source array. Does not reallocate or change active block count.\r\n * @param source array to copy from\r\n * @param sourceCount copy the first sourceCount blocks; all blocks if undefined\r\n * @param destOffset copy to instance array starting at this block index; zero if undefined\r\n * @return count and offset of blocks copied\r\n */\r\n protected copyData(source: Float64Array | number[], sourceCount?: number, destOffset?: number): {count: number, offset: number} {\r\n // validate inputs and convert from blocks to entries\r\n let myOffset = (undefined !== destOffset) ? destOffset * this.numPerBlock : 0;\r\n if (myOffset < 0)\r\n myOffset = 0;\r\n if (myOffset >= this._data.length)\r\n return {count: 0, offset: 0};\r\n let myCount = (undefined !== sourceCount) ? sourceCount * this.numPerBlock : source.length;\r\n if (myCount > 0) {\r\n if (myCount > source.length)\r\n myCount = source.length;\r\n if (myOffset + myCount > this._data.length)\r\n myCount = this._data.length - myOffset;\r\n if (myCount % this.numPerBlock !== 0)\r\n myCount -= myCount % this.numPerBlock;\r\n }\r\n if (myCount <= 0)\r\n return {count: 0, offset: 0};\r\n if (myCount === source.length)\r\n this._data.set(source, myOffset);\r\n else if (source instanceof Float64Array)\r\n this._data.set(source.subarray(0, myCount), myOffset);\r\n else\r\n this._data.set(source.slice(0, myCount), myOffset);\r\n return {count: myCount / this.numPerBlock, offset: myOffset / this.numPerBlock};\r\n }\r\n\r\n /**\r\n * Make a copy of the (active) blocks in this array.\r\n * (The clone does NOT get excess capacity)\r\n */\r\n public clone(): GrowableBlockedArray {\r\n const newBlocks = new GrowableBlockedArray(this.numPerBlock, this.numBlocks, this._growthFactor);\r\n newBlocks.copyData(this._data, this.numBlocks);\r\n newBlocks._inUse = this.numBlocks;\r\n return newBlocks;\r\n }\r\n\r\n /** computed property: length (in blocks, not doubles) */\r\n public get length(): number { return this._inUse; }\r\n /** computed property: length (in blocks, not doubles) */\r\n public get numBlocks(): number { return this._inUse; }\r\n /** property: number of data values per block */\r\n public get numPerBlock(): number { return this._blockSize; }\r\n /**\r\n * Return a single value indexed within a block. Indices are unchecked.\r\n * @param blockIndex index of block to read\r\n * @param indexInBlock offset within the block\r\n */\r\n public getWithinBlock(blockIndex: number, indexWithinBlock: number): number {\r\n return this._data[blockIndex * this._blockSize + indexWithinBlock];\r\n }\r\n /** clear the block count to zero, but maintain the allocated memory */\r\n public clear() { this._inUse = 0; }\r\n /** Return the capacity in blocks (not doubles) */\r\n public blockCapacity() {\r\n return this._data.length / this._blockSize;\r\n }\r\n /** ensure capacity (in blocks, not doubles) */\r\n public ensureBlockCapacity(blockCapacity: number, applyGrowthFactor: boolean = true) {\r\n if (blockCapacity > this.blockCapacity()) {\r\n if (applyGrowthFactor)\r\n blockCapacity *= this._growthFactor;\r\n const prevData = this._data;\r\n this._data = new Float64Array(blockCapacity * this._blockSize);\r\n this.copyData(prevData, this._inUse);\r\n }\r\n }\r\n /** Add a new block of data.\r\n * * If newData has fewer than numPerBlock entries, the remaining part of the new block is zeros.\r\n * * If newData has more entries, only the first numPerBlock are taken.\r\n */\r\n public addBlock(newData: number[]) {\r\n const k0 = this.newBlockIndex();\r\n let numValue = newData.length;\r\n if (numValue > this._blockSize)\r\n numValue = this._blockSize;\r\n for (let i = 0; i < numValue; i++)\r\n this._data[k0 + i] = newData[i];\r\n }\r\n /**\r\n * Return the starting index of a block of (zero-initialized) doubles at the end.\r\n *\r\n * * this.data is reallocated if needed to include the new block.\r\n * * The inUse count is incremented to include the new block.\r\n * * The returned block is an index to the Float64Array (not a block index)\r\n */\r\n protected newBlockIndex(): number {\r\n const index = this._blockSize * this._inUse;\r\n if ((index + 1) > this._data.length)\r\n this.ensureBlockCapacity(1 + this._inUse);\r\n this._inUse++;\r\n for (let i = index; i < index + this._blockSize; i++)\r\n this._data[i] = 0.0;\r\n return index;\r\n }\r\n /** reduce the block count by one. */\r\n public popBlock() {\r\n if (this._inUse > 0)\r\n this._inUse--;\r\n }\r\n /** convert a block index to the simple index to the underlying Float64Array. */\r\n protected blockIndexToDoubleIndex(blockIndex: number) { return this._blockSize * blockIndex; }\r\n /** Access a single double at offset within a block, with index checking and return undefined if indexing is invalid. */\r\n public checkedComponent(blockIndex: number, componentIndex: number): number | undefined {\r\n if (blockIndex >= this._inUse || blockIndex < 0 || componentIndex < 0 || componentIndex >= this._blockSize)\r\n return undefined;\r\n return this._data[this._blockSize * blockIndex + componentIndex];\r\n }\r\n /** Access a single double at offset within a block. This has no index checking. */\r\n public component(blockIndex: number, componentIndex: number): number {\r\n return this._data[this._blockSize * blockIndex + componentIndex];\r\n }\r\n /** compare two blocks in simple lexical order.\r\n * @param data data array\r\n * @param blockSize number of items to compare\r\n * @param ia raw index (not block index) of first block\r\n * @param ib raw index (not block index) of second block\r\n */\r\n public static compareLexicalBlock(data: Float64Array, blockSize: number, ia: number, ib: number): number {\r\n let ax = 0;\r\n let bx = 0;\r\n for (let i = 0; i < blockSize; i++) {\r\n ax = data[ia + i];\r\n bx = data[ib + i];\r\n if (ax > bx) return 1;\r\n if (ax < bx) return -1;\r\n }\r\n return ia - ib; // so original order is maintained among duplicates !!!!\r\n }\r\n /** Return an array of block indices sorted per compareLexicalBlock function */\r\n public sortIndicesLexical(compareBlocks: BlockComparisonFunction = (dataArray, size, iA, iB) => GrowableBlockedArray.compareLexicalBlock(dataArray, size, iA, iB)): Uint32Array {\r\n const n = this._inUse;\r\n // let numCompare = 0;\r\n const result = new Uint32Array(n);\r\n const data = this._data;\r\n const blockSize = this._blockSize;\r\n for (let i = 0; i < n; i++)result[i] = i;\r\n result.sort(\r\n (blockIndexA: number, blockIndexB: number) => {\r\n // numCompare++;\r\n return compareBlocks(data, blockSize, blockIndexA * blockSize, blockIndexB * blockSize);\r\n });\r\n // console.log (n, numCompare);\r\n return result;\r\n }\r\n /** Return the distance (hypotenuse=sqrt(summed squares)) between indicated blocks */\r\n public distanceBetweenBlocks(blockIndexA: number, blockIndexB: number): number {\r\n let dd = 0.0;\r\n let iA = this.blockIndexToDoubleIndex(blockIndexA);\r\n let iB = this.blockIndexToDoubleIndex(blockIndexB);\r\n let a = 0;\r\n const data = this._data;\r\n for (let i = 0; i < this._blockSize; i++) {\r\n a = data[iA++] - data[iB++];\r\n dd += a * a;\r\n }\r\n return Math.sqrt(dd);\r\n }\r\n\r\n /** Return the distance (hypotenuse=sqrt(summed squares)) between block entries `iBegin <= i < iEnd` of indicated blocks */\r\n public distanceBetweenSubBlocks(blockIndexA: number, blockIndexB: number, iBegin: number, iEnd: number): number {\r\n let dd = 0.0;\r\n const iA = this.blockIndexToDoubleIndex(blockIndexA);\r\n const iB = this.blockIndexToDoubleIndex(blockIndexB);\r\n let a = 0;\r\n const data = this._data;\r\n for (let i = iBegin; i < iEnd; i++) {\r\n a = data[iA + i] - data[iB + i];\r\n dd += a * a;\r\n }\r\n return Math.sqrt(dd);\r\n }\r\n}\r\n"]}