@itwin/core-geometry 5.2.0-dev.18 → 5.2.0-dev.19

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 (449) hide show
  1. package/lib/cjs/Constant.js.map +1 -1
  2. package/lib/cjs/Geometry.js.map +1 -1
  3. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  4. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  5. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  9. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  10. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  13. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  14. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  15. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  16. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  17. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  19. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  21. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  22. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  23. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  24. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  25. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  26. package/lib/cjs/core-geometry.js.map +1 -1
  27. package/lib/cjs/curve/Arc3d.js.map +1 -1
  28. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  29. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  30. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  31. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  32. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  33. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  34. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  35. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  36. package/lib/cjs/curve/CurveOps.js.map +1 -1
  37. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  38. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  39. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  40. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  41. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  42. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  43. package/lib/cjs/curve/LineString3d.js.map +1 -1
  44. package/lib/cjs/curve/Loop.js.map +1 -1
  45. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  46. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  47. package/lib/cjs/curve/Path.js.map +1 -1
  48. package/lib/cjs/curve/PointString3d.js.map +1 -1
  49. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  50. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  51. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  52. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  53. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  54. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  55. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  56. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  57. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  58. package/lib/cjs/curve/RegionOps.js.map +1 -1
  59. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  60. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  61. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  62. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  63. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  64. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  65. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  66. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  67. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  68. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  69. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  72. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  74. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  75. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  78. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  79. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  81. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  83. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  84. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  85. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  86. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  87. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  88. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  89. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  90. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  91. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  92. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  93. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  94. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  95. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  96. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  97. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  98. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  99. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  100. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  101. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  102. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  103. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  104. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  105. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  106. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  107. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  108. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  109. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  110. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  111. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  112. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  113. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  114. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  115. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  116. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  117. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  118. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  119. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  120. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  121. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  122. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  123. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  124. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  125. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  126. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  127. package/lib/cjs/geometry3d/Range.js.map +1 -1
  128. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  129. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  130. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  131. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  132. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  133. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  134. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  135. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  136. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  137. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  138. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  139. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  140. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  141. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  142. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  143. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  144. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  145. package/lib/cjs/numerics/Complex.js.map +1 -1
  146. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  147. package/lib/cjs/numerics/Newton.js.map +1 -1
  148. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  149. package/lib/cjs/numerics/PolarData.js.map +1 -1
  150. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  151. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  152. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  153. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  154. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  155. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  156. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  157. package/lib/cjs/polyface/AuxData.js.map +1 -1
  158. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  159. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  160. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  161. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  162. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  163. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  164. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  165. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  166. package/lib/cjs/polyface/Polyface.js.map +1 -1
  167. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  168. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  169. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  170. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  171. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  172. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  173. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  174. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  175. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  176. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  177. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  178. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  179. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  180. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  181. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  182. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  183. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  184. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  185. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  186. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  187. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  188. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  189. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  190. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  191. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  192. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  193. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  194. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  195. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  196. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  197. package/lib/cjs/solid/Box.js.map +1 -1
  198. package/lib/cjs/solid/Cone.js.map +1 -1
  199. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  200. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  201. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  202. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  203. package/lib/cjs/solid/Sphere.js.map +1 -1
  204. package/lib/cjs/solid/SweepContour.js.map +1 -1
  205. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  206. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  207. package/lib/cjs/topology/Graph.js.map +1 -1
  208. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  209. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  210. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  211. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  212. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  213. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  214. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  215. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  216. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  217. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  218. package/lib/cjs/topology/MaskManager.js.map +1 -1
  219. package/lib/cjs/topology/Merging.js.map +1 -1
  220. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  221. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  222. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  223. package/lib/cjs/topology/Triangulation.js.map +1 -1
  224. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  225. package/lib/esm/Constant.js.map +1 -1
  226. package/lib/esm/Geometry.js.map +1 -1
  227. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  228. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  229. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  230. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  231. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  232. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  233. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  234. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  235. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  236. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  237. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  238. package/lib/esm/bspline/KnotVector.js.map +1 -1
  239. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  240. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  241. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  242. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  243. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  244. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  245. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  246. package/lib/esm/clipping/ClipVector.js.map +1 -1
  247. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  248. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  249. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  250. package/lib/esm/core-geometry.js.map +1 -1
  251. package/lib/esm/curve/Arc3d.js.map +1 -1
  252. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  253. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  254. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  255. package/lib/esm/curve/CurveCollection.js.map +1 -1
  256. package/lib/esm/curve/CurveCurve.js.map +1 -1
  257. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  258. package/lib/esm/curve/CurveFactory.js.map +1 -1
  259. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  260. package/lib/esm/curve/CurveOps.js.map +1 -1
  261. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  262. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  263. package/lib/esm/curve/CurveTypes.js.map +1 -1
  264. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  265. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  266. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  267. package/lib/esm/curve/LineString3d.js.map +1 -1
  268. package/lib/esm/curve/Loop.js.map +1 -1
  269. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  270. package/lib/esm/curve/ParityRegion.js.map +1 -1
  271. package/lib/esm/curve/Path.js.map +1 -1
  272. package/lib/esm/curve/PointString3d.js.map +1 -1
  273. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  274. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  275. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  276. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  277. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  278. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  279. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  280. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  281. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  282. package/lib/esm/curve/RegionOps.js.map +1 -1
  283. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  284. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  285. package/lib/esm/curve/UnionRegion.js.map +1 -1
  286. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  287. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  288. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  289. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  290. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  291. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  292. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  293. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  294. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  295. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  296. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  297. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  298. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  299. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  300. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  301. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  302. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  303. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  304. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  305. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  306. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  307. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  308. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  309. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  310. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  311. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  312. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  313. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  314. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  315. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  316. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  317. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  318. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  319. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  320. package/lib/esm/geometry3d/Angle.js.map +1 -1
  321. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  322. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  323. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  324. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  325. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  326. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  327. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  328. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  329. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  330. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  331. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  332. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  333. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  334. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  335. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  336. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  337. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  338. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  339. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  340. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  341. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  342. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  343. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  344. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  345. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  346. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  347. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  348. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  349. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  350. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  351. package/lib/esm/geometry3d/Range.js.map +1 -1
  352. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  353. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  354. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  355. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  356. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  357. package/lib/esm/geometry3d/Transform.js.map +1 -1
  358. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  359. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  360. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  361. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  362. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  363. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  364. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  365. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  366. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  367. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  368. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  369. package/lib/esm/numerics/Complex.js.map +1 -1
  370. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  371. package/lib/esm/numerics/Newton.js.map +1 -1
  372. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  373. package/lib/esm/numerics/PolarData.js.map +1 -1
  374. package/lib/esm/numerics/Polynomials.js.map +1 -1
  375. package/lib/esm/numerics/Quadrature.js.map +1 -1
  376. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  377. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  378. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  379. package/lib/esm/numerics/UnionFind.js.map +1 -1
  380. package/lib/esm/numerics/UsageSums.js.map +1 -1
  381. package/lib/esm/polyface/AuxData.js.map +1 -1
  382. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  383. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  384. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  385. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  386. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  387. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  388. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  389. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  390. package/lib/esm/polyface/Polyface.js.map +1 -1
  391. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  392. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  393. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  394. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  395. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  396. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  397. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  398. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  399. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  400. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  401. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  402. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  403. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  404. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  405. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  406. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  407. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  408. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  409. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  410. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  411. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  412. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  413. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  414. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  415. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  416. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  417. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  418. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  419. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  420. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  421. package/lib/esm/solid/Box.js.map +1 -1
  422. package/lib/esm/solid/Cone.js.map +1 -1
  423. package/lib/esm/solid/LinearSweep.js.map +1 -1
  424. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  425. package/lib/esm/solid/RuledSweep.js.map +1 -1
  426. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  427. package/lib/esm/solid/Sphere.js.map +1 -1
  428. package/lib/esm/solid/SweepContour.js.map +1 -1
  429. package/lib/esm/solid/TorusPipe.js.map +1 -1
  430. package/lib/esm/topology/ChainMerge.js.map +1 -1
  431. package/lib/esm/topology/Graph.js.map +1 -1
  432. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  433. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  434. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  435. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  436. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  437. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  438. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  439. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  440. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  441. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  442. package/lib/esm/topology/MaskManager.js.map +1 -1
  443. package/lib/esm/topology/Merging.js.map +1 -1
  444. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  445. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  446. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  447. package/lib/esm/topology/Triangulation.js.map +1 -1
  448. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  449. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"SerializationHelpers.js","sourceRoot":"","sources":["../../../src/serialization/SerializationHelpers.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 Serialization\n */\nimport { BSplineWrapMode, KnotVector } from \"../bspline/KnotVector\";\nimport { NumberArray } from \"../geometry3d/PointHelpers\";\n\n/**\n * The `SerializationHelpers` namespace has helper classes for serializing and deserializing geometry, such as B-spline curves and surfaces.\n * @public\n */\nexport namespace SerializationHelpers {\n /** Interface for data common to B-spline curves and surfaces. */\n export interface BSplineParams {\n /** The number of control points, aka poles. */\n numPoles: number;\n /** B-spline order, one more than the degree. */\n order: number;\n /** Whether the B-spline is to be considered closed. */\n closed?: boolean;\n /** Full knot vector. */\n knots: number[] | Float64Array;\n /** Wrap mode, for data roundtrip. */\n wrapMode?: BSplineWrapMode;\n }\n /** Interface for B-spline curve data. */\n export interface BSplineCurveData {\n /** Control points, aka poles. */\n poles: number[][] | Float64Array;\n /** The number of coordinates per pole. This is the inner dimension of the poles number array. Possible values: 3, 4. Dimension 4 means the curve is rational, with poles of homogeneous form [wx,wy,wz,w]. */\n dim: number;\n /** Weights for a rational curve that is specified by parallel arrays of poles and weights. If defined, dim is expected to be 3, and poles are of homogeneous form [wx,wy,wz]. */\n weights?: number[] | Float64Array;\n /** Knots and other B-spline data. */\n params: BSplineParams;\n }\n /** Interface for B-spline surface data. */\n export interface BSplineSurfaceData {\n /** Control points, aka poles in row-major order. */\n poles: number[][][] | Float64Array;\n /** The number of coordinates per pole. This is the inner dimension of the poles number array. Possible values: 3, 4. Dimension 4 means the surface is rational, with poles of homogeneous form [wx,wy,wz,w]. */\n dim: number;\n /** Weights for a rational surface that is specified by parallel arrays of poles and weights. If defined, dim is expected to be 3, and poles are of homogeneous form [wx,wy,wz]. */\n weights?: number[][] | Float64Array;\n /** Knots and other B-spline data with respect to the surface u parameter. uParams.numPoles = # columns (middle dimension) of the poles array. */\n uParams: BSplineParams;\n /** Knots and other B-spline data with respect to the surface v parameter. vParams.numPoles = # rows (outer dimension) of the poles array. */\n vParams: BSplineParams;\n }\n /** Interface of options for import/export. */\n export interface BSplineDataOptions {\n /** Type of output pole/weight arrays. true: structured number array; false: Float64Array; undefined: either. */\n jsonPoles?: boolean;\n /** Type of output knot arrays. true: number array; false: Float64Array; undefined: either. */\n jsonKnots?: boolean;\n /** Extraneous knot handling during Import: true: remove them; false | undefined: leave them. Has no effect during Export, which always outputs the extraneous knots. */\n removeExtraKnots?: boolean;\n }\n\n /** Constructor for BSplineCurveData that populates the required data. Inputs are captured, not copied. */\n export function createBSplineCurveData(poles: number[][] | Float64Array, dim: number, knots: number[] | Float64Array, numPoles: number, order: number): BSplineCurveData {\n return { poles, dim, params: { numPoles, order, knots } };\n }\n\n /** Constructor for BSplineSurfaceData that populates the required data. Inputs are captured, not copied. */\n export function createBSplineSurfaceData(poles: number[][][] | Float64Array, dim: number, uKnots: number[] | Float64Array, uNumPoles: number, uOrder: number, vKnots: number[] | Float64Array, vNumPoles: number, vOrder: number): BSplineSurfaceData {\n return { poles, dim, uParams: { numPoles: uNumPoles, order: uOrder, knots: uKnots }, vParams: { numPoles: vNumPoles, order: vOrder, knots: vKnots } };\n }\n\n /** Clone B-spline curve data */\n export function cloneBSplineCurveData(source: BSplineCurveData): BSplineCurveData {\n return {\n poles: (source.poles instanceof Float64Array) ? new Float64Array(source.poles) : NumberArray.copy2d(source.poles),\n dim: source.dim,\n weights: source.weights ? source.weights.slice() : undefined,\n params: {\n numPoles: source.params.numPoles,\n order: source.params.order,\n closed: source.params.closed,\n knots: source.params.knots.slice(),\n wrapMode: source.params.wrapMode,\n },\n };\n }\n\n /** Clone B-spline surface data */\n export function cloneBSplineSurfaceData(source: BSplineSurfaceData): BSplineSurfaceData {\n return {\n poles: (source.poles instanceof Float64Array) ? new Float64Array(source.poles) : NumberArray.copy3d(source.poles),\n dim: source.dim,\n weights: source.weights ? ((source.weights instanceof Float64Array) ? source.weights.slice() : NumberArray.copy2d(source.weights)) : undefined,\n uParams: {\n numPoles: source.uParams.numPoles,\n order: source.uParams.order,\n closed: source.uParams.closed,\n knots: source.uParams.knots.slice(),\n wrapMode: source.uParams.wrapMode,\n },\n vParams: {\n numPoles: source.vParams.numPoles,\n order: source.vParams.order,\n closed: source.vParams.closed,\n knots: source.vParams.knots.slice(),\n wrapMode: source.vParams.wrapMode,\n },\n };\n }\n\n /** Copy B-spline curve data from source to dest */\n function copyBSplineCurveDataPoles(source: BSplineCurveData): { poles?: number[][], weights?: number[] } {\n let nPole = 0;\n let nCoordPerPole = 0;\n let nPoleCoords = 0;\n let poleDimProduct = 0;\n if (source.poles instanceof Float64Array) {\n nPole = source.params.numPoles;\n nCoordPerPole = source.dim;\n nPoleCoords = source.poles.length;\n poleDimProduct = nPole * nCoordPerPole;\n } else {\n nPole = source.poles.length;\n if (nPole > 0)\n nCoordPerPole = source.poles[0].length;\n nPoleCoords = poleDimProduct = nPole * nCoordPerPole;\n }\n if (0 === poleDimProduct || poleDimProduct > nPoleCoords || nCoordPerPole !== source.dim)\n return {};\n\n let nWeight = 0;\n let nWeightCoords = 0;\n let weightDimProduct = 0;\n if (source.weights !== undefined) {\n if (source.weights instanceof Float64Array) {\n nWeight = source.params.numPoles;\n nWeightCoords = source.weights.length;\n weightDimProduct = nWeight;\n } else {\n nWeight = source.weights.length;\n nWeightCoords = weightDimProduct = nWeight;\n }\n if (0 === weightDimProduct || weightDimProduct > nWeightCoords || nWeight !== nPole)\n return {};\n }\n\n // convert variant source to structured number array\n let poles: number[][] | undefined;\n let weights: number[] | undefined;\n if (source.poles instanceof Float64Array)\n poles = NumberArray.unpack2d(source.poles, nCoordPerPole);\n else\n poles = NumberArray.copy2d(source.poles);\n if (poles && source.weights)\n weights = NumberArray.create(source.weights);\n return { poles, weights };\n }\n\n /** Copy B-spline surface data from source to dest */\n function copyBSplineSurfaceDataPoles(source: BSplineSurfaceData): { poles?: number[][][], weights?: number[][] } {\n let nPoleRow = 0;\n let nPolePerRow = 0;\n let nCoordPerPole = 0;\n let nCoords = 0;\n let poleDimProduct = 0;\n if (source.poles instanceof Float64Array) {\n nPoleRow = source.vParams.numPoles;\n nPolePerRow = source.uParams.numPoles;\n nCoordPerPole = source.dim;\n nCoords = source.poles.length;\n poleDimProduct = nPoleRow * nPolePerRow * nCoordPerPole;\n } else {\n nPoleRow = source.poles.length;\n if (nPoleRow > 0)\n nPolePerRow = source.poles[0].length;\n if (nPolePerRow > 0)\n nCoordPerPole = source.poles[0][0].length;\n nCoords = poleDimProduct = nPoleRow * nPolePerRow * nCoordPerPole;\n }\n if (0 === poleDimProduct || poleDimProduct > nCoords || nCoordPerPole !== source.dim)\n return {};\n\n let nWeightRow = 0;\n let nWeightPerRow = 0;\n let nWeightCoords = 0;\n let weightDimProduct = 0;\n if (source.weights !== undefined) {\n if (source.weights instanceof Float64Array) {\n nWeightRow = source.vParams.numPoles;\n nWeightPerRow = source.uParams.numPoles;\n nWeightCoords = source.weights.length;\n weightDimProduct = nWeightRow * nWeightPerRow;\n } else {\n nWeightRow = source.weights.length;\n if (nWeightRow > 0)\n nWeightPerRow = source.weights[0].length;\n nWeightCoords = weightDimProduct = nWeightRow * nWeightPerRow;\n }\n if (0 === weightDimProduct || weightDimProduct > nWeightCoords || nWeightRow !== nPoleRow || nWeightPerRow !== nPolePerRow)\n return {};\n }\n\n // convert variant source to structured number array\n let poles: number[][][] | undefined;\n let weights: number[][] | undefined;\n if (source.poles instanceof Float64Array)\n poles = NumberArray.unpack3d(source.poles, nPolePerRow, nCoordPerPole);\n else\n poles = NumberArray.copy3d(source.poles);\n if (poles && source.weights) {\n if (source.weights instanceof Float64Array)\n weights = NumberArray.unpack2d(source.weights, nWeightPerRow);\n else\n weights = NumberArray.copy2d(source.weights);\n }\n return { poles, weights };\n }\n\n /** Convert B-spline curve data arrays to the types specified by options. */\n function convertBSplineCurveDataArrays(data: BSplineCurveData, options?: BSplineDataOptions) {\n if (undefined !== options?.jsonPoles) {\n const packedPoles = data.poles instanceof Float64Array;\n if (options.jsonPoles && packedPoles)\n data.poles = NumberArray.unpack2d(data.poles as Float64Array, data.dim)!;\n else if (!options.jsonPoles && !packedPoles)\n data.poles = NumberArray.pack(data.poles as number[][]);\n\n if (data.weights) {\n const packedWeights = data.weights instanceof Float64Array;\n if (options.jsonPoles && packedWeights)\n data.weights = NumberArray.create(data.weights);\n else if (!options.jsonPoles && !packedWeights)\n data.weights = NumberArray.pack(data.weights as number[]);\n }\n }\n if (undefined !== options?.jsonKnots) {\n const packedKnots = data.params.knots instanceof Float64Array;\n if (options.jsonKnots && packedKnots)\n data.params.knots = NumberArray.create(data.params.knots);\n else if (!options.jsonKnots && !packedKnots)\n data.params.knots = NumberArray.pack(data.params.knots as number[]);\n }\n }\n\n /** Convert B-spline surface data arrays to the types specified by options. */\n function convertBSplineSurfaceDataArrays(data: BSplineSurfaceData, options?: BSplineDataOptions) {\n if (undefined !== options?.jsonPoles) {\n const packedPoles = data.poles instanceof Float64Array;\n if (options.jsonPoles && packedPoles)\n data.poles = NumberArray.unpack3d(data.poles as Float64Array, data.uParams.numPoles, data.dim)!;\n else if (!options.jsonPoles && !packedPoles)\n data.poles = NumberArray.pack(data.poles as number[][][]);\n\n if (data.weights) {\n const packedWeights = data.weights instanceof Float64Array;\n if (options.jsonPoles && packedWeights)\n data.weights = NumberArray.unpack2d(data.weights as Float64Array, data.uParams.numPoles);\n else if (!options.jsonPoles && !packedWeights)\n data.weights = NumberArray.pack(data.weights as number[][]);\n }\n }\n if (undefined !== options?.jsonKnots) {\n const packedKnotsU = data.uParams.knots instanceof Float64Array;\n if (options.jsonKnots && packedKnotsU)\n data.uParams.knots = NumberArray.create(data.uParams.knots);\n else if (!options.jsonKnots && !packedKnotsU)\n data.uParams.knots = NumberArray.pack(data.uParams.knots as number[]);\n\n const packedKnotsV = data.vParams.knots instanceof Float64Array;\n if (options.jsonKnots && packedKnotsV)\n data.vParams.knots = NumberArray.create(data.vParams.knots);\n else if (!options.jsonKnots && !packedKnotsV)\n data.vParams.knots = NumberArray.pack(data.vParams.knots as number[]);\n }\n }\n\n /**\n * Process 1-based blocked indices into 0-based indices.\n * @param sourceIndices signed, 1-based, 0-terminated/padded source indices, blocking specified by `numPerBlock`\n * @param numPerBlock index blocking: fixed blocks of size numPerBlock > 1, possibly 0-padded; otherwise, variable-sized blocks terminated by 0\n * @param announceZeroBasedIndex callback to receive a 0-based index and optional flag indicating whether the sign of the source index is positive\n * @param terminateBlock optional callback called after each index block has been announced\n */\n export function announceZeroBasedIndicesFromSignedOneBasedIndices(\n sourceIndices: Int32Array,\n numPerBlock: number,\n announceZeroBasedIndex: (i0: number, flag?: boolean) => any,\n terminateBlock?: () => any,\n ): void {\n let numIndices = sourceIndices.length;\n if (!numIndices)\n return;\n if (numPerBlock > 1) {\n numIndices -= sourceIndices.length % numPerBlock;\n for (let i = 0; i < numIndices; i++) {\n const p = sourceIndices[i];\n if (p !== 0) // skip padding\n announceZeroBasedIndex(Math.abs(p) - 1, p > 0);\n if (terminateBlock && ((i + 1) % numPerBlock) === 0)\n terminateBlock();\n }\n } else {\n for (let i = 0; i < numIndices; i++) {\n const p = sourceIndices[i];\n if (p !== 0) // skip terminator\n announceZeroBasedIndex(Math.abs(p) - 1, p > 0);\n if (terminateBlock) {\n if (p === 0) {\n if (i + 1 === numIndices || sourceIndices[i + 1] !== 0) // skip extra terminators\n terminateBlock();\n } else {\n if (i + 1 === numIndices) // missing last terminator\n terminateBlock();\n }\n }\n }\n }\n }\n\n /**\n * Process 0-based indices with blocking specified by another index array.\n * @param sourceIndices 0-based source indices. This array is compressed (has no blocking).\n * @param blockingIndices 1-based source indices, blocking specified by `numPerBlock`. Assumed to have length equal to its zero count plus `sourceIndices.length`.\n * @param numPerBlock index blocking: fixed blocks of size numPerBlock > 1, possibly 0-padded; otherwise, variable-sized blocks terminated by 0\n * @param announceZeroBasedIndex callback to receive a 0-based index\n * @param terminateBlock optional callback called after each index block has been announced\n */\n export function announceZeroBasedIndicesWithExternalBlocking(\n sourceIndices: Int32Array,\n blockingIndices: Int32Array,\n numPerBlock: number,\n announceZeroBasedIndex: (i0: number) => any,\n terminateBlock?: () => any,\n ): void {\n if (!sourceIndices.length || !blockingIndices.length)\n return;\n const blockingZeroCount = blockingIndices.filter((i) => i === 0).length;\n if (sourceIndices.length + blockingZeroCount !== blockingIndices.length)\n return; // invalid input\n let iSource = 0;\n let numBlocking = blockingIndices.length;\n if (numPerBlock > 1) {\n numBlocking -= blockingIndices.length % numPerBlock;\n for (let iBlocking = 0; iBlocking < numBlocking && iSource < sourceIndices.length; iBlocking++) {\n const p = blockingIndices[iBlocking];\n if (p !== 0) // skip padding\n announceZeroBasedIndex(sourceIndices[iSource++]);\n if (terminateBlock && ((iBlocking + 1) % numPerBlock) === 0)\n terminateBlock();\n }\n } else {\n for (let iBlocking = 0; iBlocking < numBlocking && iSource < sourceIndices.length; iBlocking++) {\n const p = blockingIndices[iBlocking];\n if (p !== 0) // skip terminator\n announceZeroBasedIndex(sourceIndices[iSource++]);\n if (terminateBlock) {\n if (p === 0) {\n if (iBlocking + 1 === numBlocking || blockingIndices[iBlocking + 1] !== 0) // skip extra terminators\n terminateBlock();\n } else {\n if (iBlocking + 1 === numBlocking) // missing last terminator\n terminateBlock();\n }\n }\n }\n }\n }\n\n /** Special values for persistent zero-based edge mate indices. */\n export enum EdgeMateIndex {\n /** Separates face loops. */\n BlockSeparator = -1,\n /** Indicates no edge mate. */\n NoEdgeMate = -2\n };\n\n /**\n * Build two index arrays into a source array:\n * * `sourceStarts[k]` is the first index of the k_th block in `sourceIndices`.\n * * `compressedStarts[k]` is the first index of the k_th block in a compressed clone `C` of `sourceIndices`\n * with all pads/terminators removed.\n * * The last entry of `sourceStarts`/`compressedStarts` is the length of `sourceIndices`/`C`.\n * @returns `undefined` if invalid inputs, or the two computed arrays of block start indices.\n */\n function buildBlockStartIndices(sourceIndices: Int32Array, numPerBlock: number, blockSeparator: number): { sourceStarts: number[], compressedStarts: number[] } | undefined {\n if (sourceIndices.length === 0 || sourceIndices[0] === blockSeparator)\n return undefined;\n const sourceStarts: number[] = [];\n const compressedStarts: number[] = [];\n sourceStarts.push(0);\n compressedStarts.push(0);\n const getBlockLength = (iBlockStart: number): number => {\n if (sourceIndices[iBlockStart] === blockSeparator)\n return 0;\n for (let i = iBlockStart + 1; i < sourceIndices.length; i++) {\n if ((sourceIndices[i - 1] !== blockSeparator && sourceIndices[i] === blockSeparator) || (numPerBlock > 2 && (i % numPerBlock === 0)))\n return i - iBlockStart;\n if (i === sourceIndices.length - 1) // last fixed block, or unterminated last variable block\n return sourceIndices.length - iBlockStart;\n }\n return 0;\n }\n for (let i = 0; i < sourceIndices.length;) {\n const blockLength = getBlockLength(i);\n if (blockLength <= 0)\n return undefined;\n i += blockLength;\n for (; i < sourceIndices.length && sourceIndices[i] === blockSeparator; i++);\n sourceStarts.push(i);\n compressedStarts.push(compressedStarts[compressedStarts.length - 1] + blockLength);\n }\n return { sourceStarts, compressedStarts };\n }\n\n /**\n * Compress a 0-based blocked index array by removing block separators/pads and remapping each index.\n * * The entries of `sourceIndices` are reflexive indices, i.e., they index `sourceIndices`.\n * * The remapped index `j` must refer to the same block location in the compressed array to which the\n * original index `i >= 0` refers in `sourceIndices`; therefore `j` is obtained from `i` by subtracting the\n * number of block separators/pads preceding `sourceIndices[i]`.\n * @param sourceIndices array of blocked indices to process. Each entry is a 0-based reflexive index, `nullValue`, or `blockSeparator`.\n * @param numPerBlock index blocking for sourceIndices: padded block size > 2 or variable-sized terminated blocks.\n * @param blockSeparator negative value that terminates/pads blocks in sourceIndices, e.g. -1. This value is not announced.\n * @param nullValue negative value that represents \"no index\" in sourceIndices, e.g., -2. This value is announced as \"undefined\".\n * @param announceRemappedIndex callback to receive a remapped index.\n * @returns true if and only if the mapping was successful.\n */\n export function announceCompressedZeroBasedReflexiveIndices(\n sourceIndices: Int32Array,\n numPerBlock: number,\n blockSeparator: number,\n nullValue: number,\n announceRemappedIndex: (i: number | undefined) => any,\n ): boolean {\n if (!sourceIndices.length || blockSeparator >= 0 || nullValue >= 0 || (blockSeparator === nullValue))\n return false;\n // remapped index = source index - # preceding terminators/pads in sourceIndices\n // Instead of counting terminators/pads, we use a pair of block start index arrays\n const blocking = buildBlockStartIndices(sourceIndices, numPerBlock, blockSeparator);\n if (!blocking)\n return false;\n for (const index of sourceIndices) {\n if (index === nullValue)\n announceRemappedIndex(undefined);\n else if (index >= 0) {\n const iBlock = NumberArray.searchStrictlyIncreasingNumbers(blocking.sourceStarts, index);\n if (iBlock === undefined)\n return false;\n const blockOffset = index - blocking.sourceStarts[iBlock];\n announceRemappedIndex(blocking.compressedStarts[iBlock] + blockOffset);\n }\n }\n return true;\n }\n\n /**\n * Uncompress a 0-based index array by inserting block separators and remapping each index.\n * * Defined entries of `sourceIndices` are reflexive indices, i.e., they index `sourceIndices`.\n * * The remapped index `j` must refer to the same block location in the uncompressed array to which the\n * original defined index `i` refers in `sourceIndices`; therefore `j` is obtained from `i` by adding the\n * number of full blocks preceding `sourceIndices[i]`.\n * @param sourceIndices array of compressed indices to process. Each entry is a 0-based reflexive index, or `undefined`.\n * @param sourceStarts sourceStarts[k] is the first index of the k_th block in `sourceIndices`; its last entry is the\n * length of `sourceIndices`.\n * @param blockSeparator negative value that represents an announced block terminator, e.g. -1.\n * @param nullValue negative value to announce for an undefined source index, e.g., -2.\n * @param announceRemappedIndex callback to receive a remapped index.\n * @returns true if and only if the mapping was successful.\n */\n export function announceUncompressedZeroBasedReflexiveIndices(\n sourceIndices: Array<number | undefined>,\n sourceStarts: ReadonlyArray<number>,\n blockSeparator: number,\n nullValue: number,\n announceRemappedIndex: (i: number) => any,\n ): boolean {\n if (!sourceIndices.length || sourceStarts.length < 2 || blockSeparator >= 0 || nullValue >= 0 || (blockSeparator === nullValue))\n return false;\n // remapped index = source index + # preceding blocks in sourceIndices\n for (let i = 0; i < sourceStarts.length - 1; i++) {\n for (let j = sourceStarts[i]; j < sourceStarts[i + 1]; j++) {\n const index = sourceIndices[j];\n if (index === undefined)\n announceRemappedIndex(nullValue);\n else if (index >= 0) {\n const iBlock = NumberArray.searchStrictlyIncreasingNumbers(sourceStarts, index);\n if (iBlock === undefined)\n return false;\n announceRemappedIndex(index + iBlock);\n }\n }\n announceRemappedIndex(blockSeparator);\n }\n return true;\n }\n\n /** Helper class for preparing geometry data for import. */\n export class Import {\n /** copy knots, with options to control destination type and extraneous knot removal */\n private static copyKnots(knots: Float64Array | number[], options?: BSplineDataOptions, iStart?: number, iEnd?: number): Float64Array | number[] {\n if (undefined === iStart)\n iStart = 0;\n if (undefined === iEnd)\n iEnd = knots.length;\n if (options?.removeExtraKnots) {\n ++iStart; // ignore start knot\n --iEnd; // ignore end knot\n }\n let newNumKnots = iEnd - iStart;\n if (newNumKnots < 0)\n newNumKnots = 0;\n const newKnots = options?.jsonKnots ? new Array<number>(newNumKnots) : new Float64Array(newNumKnots);\n for (let i = iStart, k = 0; i < iEnd; i++, k++)\n newKnots[k] = knots[i];\n return newKnots;\n }\n\n /**\n * Recognize the special legacy periodic B-spline data of mode BSplineWrapMode.OpenByRemovingKnots, and return the corresponding modern open clamped knots.\n * * Note that the B-spline poles corresponding to the converted knots remain unchanged, but it is assumed that first and last poles are equal.\n * * Example: the legacy 7-point quadratic circle periodic knots {-1/3 0 0 0 1/3 1/3 2/3 2/3 1 1 1 4/3} are converted to open knots {0 0 1/3 1/3 2/3 2/3 1 1}.\n * * General form of knot vector (k = order, d = k-1 = degree, p = numPoles):\n * * * legacy input: {k/2 periodically extended knots} {start knot multiplicity k} {p-k interior knots} {end knot multiplicity k} {d/2 periodically extended knots}\n * * * converted output: {start knot multiplicity d} {p-k interior knots} {end knot multiplicity d}\n * @param knots classic knot vector to test\n * @param numPoles number of poles\n * @param order B-spline order\n * @param options for output type, extraneous knot removal\n * @returns open knots if legacy periodic B-spline input data is recognized; otherwise, undefined\n * @see Export.closeLegacyPeriodicKnots\n */\n private static openLegacyPeriodicKnots(knots: Float64Array | number[], numPoles: number, order: number, options?: BSplineDataOptions): Float64Array | number[] | undefined {\n const numKnots = knots.length;\n if (order < 2 || numPoles + 2 * order - 1 !== numKnots)\n return undefined; // not legacy periodic knots\n\n const startKnot = knots[order - 1];\n const endKnot = knots[numKnots - order];\n const iStart0 = Math.floor(order / 2); // index of first expected multiple of the start knot\n const iEnd0 = iStart0 + numPoles; // index of first expected multiple of the end knot\n const iEnd1 = iEnd0 + order; // one past index of last expected multiple of the end knot\n for (let i = 0; i < order; ++i) {\n if (Math.abs(knots[iStart0 + i] - startKnot) >= KnotVector.knotTolerance)\n return undefined; // start knot multiplicity too small\n if (Math.abs(knots[iEnd0 + i] - endKnot) >= KnotVector.knotTolerance)\n return undefined; // end knot multiplicity too small\n }\n return this.copyKnots(knots, options, iStart0, iEnd1);\n }\n\n /** Prepare imported B-spline curve data for eventual conversion to BSplineCurve3d | BSplineCurve3dH:\n * * Opens legacy \"fake\" periodic data by expanding knots\n * * Opens true periodic data by expanding poles and weights\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\n * @param options output specifications\n * @returns whether data was successfully prepared\n */\n public static prepareBSplineCurveData(data: BSplineCurveData, options?: BSplineDataOptions): boolean {\n let polesExpanded: number[][] | undefined;\n let weightsExpanded: number[] | undefined;\n let knotsCorrected: number[] | Float64Array | undefined;\n data.params.wrapMode = undefined;\n\n if (true === data.params.closed) {\n knotsCorrected = this.openLegacyPeriodicKnots(data.params.knots, data.params.numPoles, data.params.order, options);\n if (undefined !== knotsCorrected) {\n // legacy periodic knots removed, poles untouched\n data.params.knots = knotsCorrected;\n data.params.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\n } else {\n // wrap poles, knots untouched\n if (!polesExpanded) {\n const arrays = copyBSplineCurveDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesExpanded = arrays.poles;\n data.weights = weightsExpanded = arrays.weights;\n }\n for (let i = 0; i < data.params.order - 1; ++i) {\n const wraparoundPt = [];\n for (let j = 0; j < data.dim; ++j)\n wraparoundPt.push(polesExpanded[i][j]);\n polesExpanded.push(wraparoundPt); // append degree wraparound poles\n }\n if (weightsExpanded) {\n for (let i = 0; i < data.params.order - 1; ++i)\n weightsExpanded.push(weightsExpanded[i]); // append degree wraparound weights\n }\n data.params.numPoles += data.params.order - 1;\n data.params.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\n }\n }\n\n if (options?.removeExtraKnots) {\n if (!knotsCorrected)\n data.params.knots = this.copyKnots(data.params.knots, options);\n }\n\n data.params.closed = undefined; // we are open\n\n convertBSplineCurveDataArrays(data, options);\n return true;\n }\n\n /** Prepare imported B-spline surface data for eventual conversion to BSplineSurface3d | BSplineSurface3dH:\n * * Opens legacy \"fake\" periodic data by expanding knots\n * * Opens true periodic data by expanding poles and weights\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\n * @param options output specifications\n * @returns whether data was successfully prepared\n */\n public static prepareBSplineSurfaceData(data: BSplineSurfaceData, options?: BSplineDataOptions): boolean {\n let polesExpanded: number[][][] | undefined;\n let weightsExpanded: number[][] | undefined;\n let uKnotsCorrected: number[] | Float64Array | undefined;\n let vKnotsCorrected: number[] | Float64Array | undefined;\n data.uParams.wrapMode = data.vParams.wrapMode = undefined;\n\n if (true === data.uParams.closed) {\n uKnotsCorrected = this.openLegacyPeriodicKnots(data.uParams.knots, data.uParams.numPoles, data.uParams.order, options);\n if (undefined !== uKnotsCorrected) {\n // legacy periodic knots removed, poles untouched\n data.uParams.knots = uKnotsCorrected;\n data.uParams.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\n } else {\n // wrap poles, knots untouched\n if (!polesExpanded) {\n const arrays = copyBSplineSurfaceDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesExpanded = arrays.poles;\n data.weights = weightsExpanded = arrays.weights;\n }\n for (let i = 0; i < data.vParams.numPoles; ++i) { // #rows\n for (let j = 0; j < data.uParams.order - 1; ++j) {\n const wraparoundPt = [];\n for (let k = 0; k < data.dim; ++k)\n wraparoundPt.push(polesExpanded[i][j][k]);\n polesExpanded[i].push(wraparoundPt); // append degreeU wraparound poles to each row\n }\n }\n if (weightsExpanded) {\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\n for (let j = 0; j < data.uParams.order - 1; ++j)\n weightsExpanded[i].push(weightsExpanded[i][j]); // append degreeU wraparound weights to each row\n }\n data.uParams.numPoles += data.uParams.order - 1;\n data.uParams.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\n }\n }\n\n if (true === data.vParams.closed) {\n vKnotsCorrected = this.openLegacyPeriodicKnots(data.vParams.knots, data.vParams.numPoles, data.vParams.order, options);\n if (undefined !== vKnotsCorrected) {\n // legacy periodic knots removed, poles untouched\n data.vParams.knots = vKnotsCorrected;\n data.vParams.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\n } else {\n // wrap poles, knots untouched\n if (!polesExpanded) {\n const arrays = copyBSplineSurfaceDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesExpanded = arrays.poles;\n data.weights = weightsExpanded = arrays.weights;\n }\n for (let i = 0; i < data.vParams.order - 1; ++i) {\n const wrapAroundRow = [];\n for (let j = 0; j < data.uParams.numPoles; ++j) { // #cols\n const wrapAroundPt = [];\n for (let k = 0; k < data.dim; ++k)\n wrapAroundPt.push(polesExpanded[i][j][k]);\n wrapAroundRow.push(wrapAroundPt);\n }\n polesExpanded.push(wrapAroundRow); // append degreeV wraparound rows of poles\n }\n if (weightsExpanded) {\n for (let i = 0; i < data.vParams.order - 1; ++i) {\n const wrapAroundRow = [];\n for (let j = 0; j < data.uParams.numPoles; ++j) // #cols\n wrapAroundRow.push(weightsExpanded[i][j]);\n weightsExpanded.push(wrapAroundRow); // append degreeV wraparound rows of weights\n }\n }\n data.vParams.numPoles += data.vParams.order - 1;\n data.vParams.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\n }\n }\n\n if (options?.removeExtraKnots) {\n if (!uKnotsCorrected)\n data.uParams.knots = this.copyKnots(data.uParams.knots, options);\n if (!vKnotsCorrected)\n data.vParams.knots = this.copyKnots(data.vParams.knots, options);\n }\n\n data.uParams.closed = data.vParams.closed = undefined; // we are open\n\n convertBSplineSurfaceDataArrays(data, options);\n return true;\n }\n }\n\n /** Helper class for preparing geometry data for export. */\n export class Export {\n /**\n * Restore special legacy periodic B-spline knots opened via BSplineWrapMode.OpenByRemovingKnots logic.\n * @param knots modern knot vector: {start knot multiplicity d} {p-k interior knots} {end knot multiplicity d}\n * @param order B-spline order\n * @param options for output type\n * @param wrapMode wrap mode of the knots\n * @returns legacy periodic knots (with classic extraneous start/end knot) if wrapMode recognized; otherwise, undefined\n * @see Import.openLegacyPeriodicKnots\n */\n private static closeLegacyPeriodicKnots(knots: Float64Array | number[], order: number, options?: BSplineDataOptions, wrapMode?: BSplineWrapMode): Float64Array | number[] | undefined {\n if (wrapMode === undefined || wrapMode !== BSplineWrapMode.OpenByRemovingKnots)\n return undefined;\n\n const degree = order - 1;\n const leftIndex = degree - 1;\n const rightIndex = knots.length - degree;\n const leftKnot = knots[leftIndex];\n const rightKnot = knots[rightIndex];\n const knotPeriod = rightKnot - leftKnot;\n const newNumKnots = knots.length + degree + 2;\n const newKnots = options?.jsonKnots ? new Array<number>(newNumKnots) : new Float64Array(newNumKnots);\n\n let k = 0;\n for (let i = Math.floor(order / 2); i > 0; --i)\n newKnots[k++] = knots[rightIndex - i] - knotPeriod;\n newKnots[k++] = leftKnot; // extraneous start knot\n for (const knot of knots)\n newKnots[k++] = knot;\n newKnots[k++] = rightKnot; // extraneous end knot\n for (let i = 1; i <= Math.floor(degree / 2); ++i)\n newKnots[k++] = knots[leftIndex + i] + knotPeriod;\n\n return newKnots;\n }\n\n /**\n * Prepare data from a B-spline curve for export.\n * * adds classic extraneous knot at start and end of knot vector\n * * re-closes periodic data based on BSplineWrapMode\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\n * @param options output specifications\n * @returns whether data was successfully prepared\n */\n public static prepareBSplineCurveData(data: BSplineCurveData, options?: BSplineDataOptions): boolean {\n let polesTrimmed: number[][] | undefined;\n let weightsTrimmed: number[] | undefined;\n let knotsCorrected: number[] | Float64Array | undefined;\n data.params.closed = undefined;\n\n switch (data.params.wrapMode) {\n case BSplineWrapMode.OpenByRemovingKnots: {\n // add legacy periodic and extraneous knots, poles untouched\n knotsCorrected = this.closeLegacyPeriodicKnots(data.params.knots, data.params.order, options, data.params.wrapMode);\n if (undefined === knotsCorrected)\n return false; // invalid input\n data.params.knots = knotsCorrected;\n data.params.closed = true;\n break;\n }\n case BSplineWrapMode.OpenByAddingControlPoints: {\n // unwrap poles, knots untouched\n if (!polesTrimmed) {\n const arrays = copyBSplineCurveDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesTrimmed = arrays.poles;\n data.weights = weightsTrimmed = arrays.weights;\n }\n for (let i = 0; i < data.params.order - 1; ++i)\n polesTrimmed.pop(); // remove last degree poles\n if (weightsTrimmed) {\n for (let i = 0; i < data.params.order - 1; ++i)\n weightsTrimmed.pop(); // remove last degree weights\n }\n data.params.numPoles -= data.params.order - 1;\n data.params.closed = true;\n break;\n }\n }\n\n // always add extraneous knots\n if (!knotsCorrected)\n data.params.knots = KnotVector.copyKnots(data.params.knots, data.params.order - 1, true, data.params.wrapMode);\n\n convertBSplineCurveDataArrays(data, options);\n return true;\n }\n\n /**\n * Prepare data from a B-spline surface for export.\n * * adds classic extraneous knot at start and end of knot vectors\n * * re-closes periodic data based on BSplineWrapMode\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\n * @param options output specifications\n * @returns whether data was successfully prepared\n */\n public static prepareBSplineSurfaceData(data: BSplineSurfaceData, options?: BSplineDataOptions): boolean {\n let polesTrimmed: number[][][] | undefined;\n let weightsTrimmed: number[][] | undefined;\n let uKnotsCorrected: number[] | Float64Array | undefined;\n let vKnotsCorrected: number[] | Float64Array | undefined;\n data.uParams.closed = data.vParams.closed = undefined;\n\n switch (data.uParams.wrapMode) {\n case BSplineWrapMode.OpenByRemovingKnots: {\n // add legacy periodic and extraneous knots, poles untouched\n uKnotsCorrected = this.closeLegacyPeriodicKnots(data.uParams.knots, data.uParams.order, options, data.uParams.wrapMode);\n if (undefined === uKnotsCorrected)\n return false; // invalid input\n data.uParams.knots = uKnotsCorrected;\n data.uParams.closed = true;\n break;\n }\n case BSplineWrapMode.OpenByAddingControlPoints: {\n // unwrap poles, knots untouched\n if (!polesTrimmed) {\n const arrays = copyBSplineSurfaceDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesTrimmed = arrays.poles;\n data.weights = weightsTrimmed = arrays.weights;\n }\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\n for (let j = 0; j < data.uParams.order - 1; ++j)\n polesTrimmed[i].pop(); // remove last degreeU poles from each row\n if (weightsTrimmed) {\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\n for (let j = 0; j < data.uParams.order - 1; ++j)\n weightsTrimmed[i].pop(); // remove last degreeU weights from each row\n }\n data.uParams.numPoles -= data.uParams.order - 1;\n data.uParams.closed = true;\n break;\n }\n }\n\n switch (data.vParams.wrapMode) {\n case BSplineWrapMode.OpenByRemovingKnots: {\n // add legacy periodic and extraneous knots, poles untouched\n vKnotsCorrected = this.closeLegacyPeriodicKnots(data.vParams.knots, data.vParams.order, options, data.vParams.wrapMode);\n if (undefined === vKnotsCorrected)\n return false; // invalid input\n data.vParams.knots = vKnotsCorrected;\n data.vParams.closed = true;\n break;\n }\n case BSplineWrapMode.OpenByAddingControlPoints: {\n // unwrap poles, knots untouched\n if (!polesTrimmed) {\n const arrays = copyBSplineSurfaceDataPoles(data);\n if (undefined === arrays.poles)\n return false; // invalid input\n data.poles = polesTrimmed = arrays.poles;\n data.weights = weightsTrimmed = arrays.weights;\n }\n for (let i = 0; i < data.vParams.order - 1; ++i)\n polesTrimmed.pop(); // remove last degreeV rows of poles\n if (weightsTrimmed) {\n for (let i = 0; i < data.vParams.order - 1; ++i)\n weightsTrimmed.pop(); // remove last degreeV rows of weights\n }\n data.vParams.numPoles -= data.vParams.order - 1;\n data.vParams.closed = true;\n break;\n }\n }\n\n // always add extraneous knots\n if (!uKnotsCorrected)\n data.uParams.knots = KnotVector.copyKnots(data.uParams.knots, data.uParams.order - 1, true, data.uParams.wrapMode);\n if (!vKnotsCorrected)\n data.vParams.knots = KnotVector.copyKnots(data.vParams.knots, data.vParams.order - 1, true, data.vParams.wrapMode);\n\n convertBSplineSurfaceDataArrays(data, options);\n return true;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"SerializationHelpers.js","sourceRoot":"","sources":["../../../src/serialization/SerializationHelpers.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 Serialization\r\n */\r\nimport { BSplineWrapMode, KnotVector } from \"../bspline/KnotVector\";\r\nimport { NumberArray } from \"../geometry3d/PointHelpers\";\r\n\r\n/**\r\n * The `SerializationHelpers` namespace has helper classes for serializing and deserializing geometry, such as B-spline curves and surfaces.\r\n * @public\r\n */\r\nexport namespace SerializationHelpers {\r\n /** Interface for data common to B-spline curves and surfaces. */\r\n export interface BSplineParams {\r\n /** The number of control points, aka poles. */\r\n numPoles: number;\r\n /** B-spline order, one more than the degree. */\r\n order: number;\r\n /** Whether the B-spline is to be considered closed. */\r\n closed?: boolean;\r\n /** Full knot vector. */\r\n knots: number[] | Float64Array;\r\n /** Wrap mode, for data roundtrip. */\r\n wrapMode?: BSplineWrapMode;\r\n }\r\n /** Interface for B-spline curve data. */\r\n export interface BSplineCurveData {\r\n /** Control points, aka poles. */\r\n poles: number[][] | Float64Array;\r\n /** The number of coordinates per pole. This is the inner dimension of the poles number array. Possible values: 3, 4. Dimension 4 means the curve is rational, with poles of homogeneous form [wx,wy,wz,w]. */\r\n dim: number;\r\n /** Weights for a rational curve that is specified by parallel arrays of poles and weights. If defined, dim is expected to be 3, and poles are of homogeneous form [wx,wy,wz]. */\r\n weights?: number[] | Float64Array;\r\n /** Knots and other B-spline data. */\r\n params: BSplineParams;\r\n }\r\n /** Interface for B-spline surface data. */\r\n export interface BSplineSurfaceData {\r\n /** Control points, aka poles in row-major order. */\r\n poles: number[][][] | Float64Array;\r\n /** The number of coordinates per pole. This is the inner dimension of the poles number array. Possible values: 3, 4. Dimension 4 means the surface is rational, with poles of homogeneous form [wx,wy,wz,w]. */\r\n dim: number;\r\n /** Weights for a rational surface that is specified by parallel arrays of poles and weights. If defined, dim is expected to be 3, and poles are of homogeneous form [wx,wy,wz]. */\r\n weights?: number[][] | Float64Array;\r\n /** Knots and other B-spline data with respect to the surface u parameter. uParams.numPoles = # columns (middle dimension) of the poles array. */\r\n uParams: BSplineParams;\r\n /** Knots and other B-spline data with respect to the surface v parameter. vParams.numPoles = # rows (outer dimension) of the poles array. */\r\n vParams: BSplineParams;\r\n }\r\n /** Interface of options for import/export. */\r\n export interface BSplineDataOptions {\r\n /** Type of output pole/weight arrays. true: structured number array; false: Float64Array; undefined: either. */\r\n jsonPoles?: boolean;\r\n /** Type of output knot arrays. true: number array; false: Float64Array; undefined: either. */\r\n jsonKnots?: boolean;\r\n /** Extraneous knot handling during Import: true: remove them; false | undefined: leave them. Has no effect during Export, which always outputs the extraneous knots. */\r\n removeExtraKnots?: boolean;\r\n }\r\n\r\n /** Constructor for BSplineCurveData that populates the required data. Inputs are captured, not copied. */\r\n export function createBSplineCurveData(poles: number[][] | Float64Array, dim: number, knots: number[] | Float64Array, numPoles: number, order: number): BSplineCurveData {\r\n return { poles, dim, params: { numPoles, order, knots } };\r\n }\r\n\r\n /** Constructor for BSplineSurfaceData that populates the required data. Inputs are captured, not copied. */\r\n export function createBSplineSurfaceData(poles: number[][][] | Float64Array, dim: number, uKnots: number[] | Float64Array, uNumPoles: number, uOrder: number, vKnots: number[] | Float64Array, vNumPoles: number, vOrder: number): BSplineSurfaceData {\r\n return { poles, dim, uParams: { numPoles: uNumPoles, order: uOrder, knots: uKnots }, vParams: { numPoles: vNumPoles, order: vOrder, knots: vKnots } };\r\n }\r\n\r\n /** Clone B-spline curve data */\r\n export function cloneBSplineCurveData(source: BSplineCurveData): BSplineCurveData {\r\n return {\r\n poles: (source.poles instanceof Float64Array) ? new Float64Array(source.poles) : NumberArray.copy2d(source.poles),\r\n dim: source.dim,\r\n weights: source.weights ? source.weights.slice() : undefined,\r\n params: {\r\n numPoles: source.params.numPoles,\r\n order: source.params.order,\r\n closed: source.params.closed,\r\n knots: source.params.knots.slice(),\r\n wrapMode: source.params.wrapMode,\r\n },\r\n };\r\n }\r\n\r\n /** Clone B-spline surface data */\r\n export function cloneBSplineSurfaceData(source: BSplineSurfaceData): BSplineSurfaceData {\r\n return {\r\n poles: (source.poles instanceof Float64Array) ? new Float64Array(source.poles) : NumberArray.copy3d(source.poles),\r\n dim: source.dim,\r\n weights: source.weights ? ((source.weights instanceof Float64Array) ? source.weights.slice() : NumberArray.copy2d(source.weights)) : undefined,\r\n uParams: {\r\n numPoles: source.uParams.numPoles,\r\n order: source.uParams.order,\r\n closed: source.uParams.closed,\r\n knots: source.uParams.knots.slice(),\r\n wrapMode: source.uParams.wrapMode,\r\n },\r\n vParams: {\r\n numPoles: source.vParams.numPoles,\r\n order: source.vParams.order,\r\n closed: source.vParams.closed,\r\n knots: source.vParams.knots.slice(),\r\n wrapMode: source.vParams.wrapMode,\r\n },\r\n };\r\n }\r\n\r\n /** Copy B-spline curve data from source to dest */\r\n function copyBSplineCurveDataPoles(source: BSplineCurveData): { poles?: number[][], weights?: number[] } {\r\n let nPole = 0;\r\n let nCoordPerPole = 0;\r\n let nPoleCoords = 0;\r\n let poleDimProduct = 0;\r\n if (source.poles instanceof Float64Array) {\r\n nPole = source.params.numPoles;\r\n nCoordPerPole = source.dim;\r\n nPoleCoords = source.poles.length;\r\n poleDimProduct = nPole * nCoordPerPole;\r\n } else {\r\n nPole = source.poles.length;\r\n if (nPole > 0)\r\n nCoordPerPole = source.poles[0].length;\r\n nPoleCoords = poleDimProduct = nPole * nCoordPerPole;\r\n }\r\n if (0 === poleDimProduct || poleDimProduct > nPoleCoords || nCoordPerPole !== source.dim)\r\n return {};\r\n\r\n let nWeight = 0;\r\n let nWeightCoords = 0;\r\n let weightDimProduct = 0;\r\n if (source.weights !== undefined) {\r\n if (source.weights instanceof Float64Array) {\r\n nWeight = source.params.numPoles;\r\n nWeightCoords = source.weights.length;\r\n weightDimProduct = nWeight;\r\n } else {\r\n nWeight = source.weights.length;\r\n nWeightCoords = weightDimProduct = nWeight;\r\n }\r\n if (0 === weightDimProduct || weightDimProduct > nWeightCoords || nWeight !== nPole)\r\n return {};\r\n }\r\n\r\n // convert variant source to structured number array\r\n let poles: number[][] | undefined;\r\n let weights: number[] | undefined;\r\n if (source.poles instanceof Float64Array)\r\n poles = NumberArray.unpack2d(source.poles, nCoordPerPole);\r\n else\r\n poles = NumberArray.copy2d(source.poles);\r\n if (poles && source.weights)\r\n weights = NumberArray.create(source.weights);\r\n return { poles, weights };\r\n }\r\n\r\n /** Copy B-spline surface data from source to dest */\r\n function copyBSplineSurfaceDataPoles(source: BSplineSurfaceData): { poles?: number[][][], weights?: number[][] } {\r\n let nPoleRow = 0;\r\n let nPolePerRow = 0;\r\n let nCoordPerPole = 0;\r\n let nCoords = 0;\r\n let poleDimProduct = 0;\r\n if (source.poles instanceof Float64Array) {\r\n nPoleRow = source.vParams.numPoles;\r\n nPolePerRow = source.uParams.numPoles;\r\n nCoordPerPole = source.dim;\r\n nCoords = source.poles.length;\r\n poleDimProduct = nPoleRow * nPolePerRow * nCoordPerPole;\r\n } else {\r\n nPoleRow = source.poles.length;\r\n if (nPoleRow > 0)\r\n nPolePerRow = source.poles[0].length;\r\n if (nPolePerRow > 0)\r\n nCoordPerPole = source.poles[0][0].length;\r\n nCoords = poleDimProduct = nPoleRow * nPolePerRow * nCoordPerPole;\r\n }\r\n if (0 === poleDimProduct || poleDimProduct > nCoords || nCoordPerPole !== source.dim)\r\n return {};\r\n\r\n let nWeightRow = 0;\r\n let nWeightPerRow = 0;\r\n let nWeightCoords = 0;\r\n let weightDimProduct = 0;\r\n if (source.weights !== undefined) {\r\n if (source.weights instanceof Float64Array) {\r\n nWeightRow = source.vParams.numPoles;\r\n nWeightPerRow = source.uParams.numPoles;\r\n nWeightCoords = source.weights.length;\r\n weightDimProduct = nWeightRow * nWeightPerRow;\r\n } else {\r\n nWeightRow = source.weights.length;\r\n if (nWeightRow > 0)\r\n nWeightPerRow = source.weights[0].length;\r\n nWeightCoords = weightDimProduct = nWeightRow * nWeightPerRow;\r\n }\r\n if (0 === weightDimProduct || weightDimProduct > nWeightCoords || nWeightRow !== nPoleRow || nWeightPerRow !== nPolePerRow)\r\n return {};\r\n }\r\n\r\n // convert variant source to structured number array\r\n let poles: number[][][] | undefined;\r\n let weights: number[][] | undefined;\r\n if (source.poles instanceof Float64Array)\r\n poles = NumberArray.unpack3d(source.poles, nPolePerRow, nCoordPerPole);\r\n else\r\n poles = NumberArray.copy3d(source.poles);\r\n if (poles && source.weights) {\r\n if (source.weights instanceof Float64Array)\r\n weights = NumberArray.unpack2d(source.weights, nWeightPerRow);\r\n else\r\n weights = NumberArray.copy2d(source.weights);\r\n }\r\n return { poles, weights };\r\n }\r\n\r\n /** Convert B-spline curve data arrays to the types specified by options. */\r\n function convertBSplineCurveDataArrays(data: BSplineCurveData, options?: BSplineDataOptions) {\r\n if (undefined !== options?.jsonPoles) {\r\n const packedPoles = data.poles instanceof Float64Array;\r\n if (options.jsonPoles && packedPoles)\r\n data.poles = NumberArray.unpack2d(data.poles as Float64Array, data.dim)!;\r\n else if (!options.jsonPoles && !packedPoles)\r\n data.poles = NumberArray.pack(data.poles as number[][]);\r\n\r\n if (data.weights) {\r\n const packedWeights = data.weights instanceof Float64Array;\r\n if (options.jsonPoles && packedWeights)\r\n data.weights = NumberArray.create(data.weights);\r\n else if (!options.jsonPoles && !packedWeights)\r\n data.weights = NumberArray.pack(data.weights as number[]);\r\n }\r\n }\r\n if (undefined !== options?.jsonKnots) {\r\n const packedKnots = data.params.knots instanceof Float64Array;\r\n if (options.jsonKnots && packedKnots)\r\n data.params.knots = NumberArray.create(data.params.knots);\r\n else if (!options.jsonKnots && !packedKnots)\r\n data.params.knots = NumberArray.pack(data.params.knots as number[]);\r\n }\r\n }\r\n\r\n /** Convert B-spline surface data arrays to the types specified by options. */\r\n function convertBSplineSurfaceDataArrays(data: BSplineSurfaceData, options?: BSplineDataOptions) {\r\n if (undefined !== options?.jsonPoles) {\r\n const packedPoles = data.poles instanceof Float64Array;\r\n if (options.jsonPoles && packedPoles)\r\n data.poles = NumberArray.unpack3d(data.poles as Float64Array, data.uParams.numPoles, data.dim)!;\r\n else if (!options.jsonPoles && !packedPoles)\r\n data.poles = NumberArray.pack(data.poles as number[][][]);\r\n\r\n if (data.weights) {\r\n const packedWeights = data.weights instanceof Float64Array;\r\n if (options.jsonPoles && packedWeights)\r\n data.weights = NumberArray.unpack2d(data.weights as Float64Array, data.uParams.numPoles);\r\n else if (!options.jsonPoles && !packedWeights)\r\n data.weights = NumberArray.pack(data.weights as number[][]);\r\n }\r\n }\r\n if (undefined !== options?.jsonKnots) {\r\n const packedKnotsU = data.uParams.knots instanceof Float64Array;\r\n if (options.jsonKnots && packedKnotsU)\r\n data.uParams.knots = NumberArray.create(data.uParams.knots);\r\n else if (!options.jsonKnots && !packedKnotsU)\r\n data.uParams.knots = NumberArray.pack(data.uParams.knots as number[]);\r\n\r\n const packedKnotsV = data.vParams.knots instanceof Float64Array;\r\n if (options.jsonKnots && packedKnotsV)\r\n data.vParams.knots = NumberArray.create(data.vParams.knots);\r\n else if (!options.jsonKnots && !packedKnotsV)\r\n data.vParams.knots = NumberArray.pack(data.vParams.knots as number[]);\r\n }\r\n }\r\n\r\n /**\r\n * Process 1-based blocked indices into 0-based indices.\r\n * @param sourceIndices signed, 1-based, 0-terminated/padded source indices, blocking specified by `numPerBlock`\r\n * @param numPerBlock index blocking: fixed blocks of size numPerBlock > 1, possibly 0-padded; otherwise, variable-sized blocks terminated by 0\r\n * @param announceZeroBasedIndex callback to receive a 0-based index and optional flag indicating whether the sign of the source index is positive\r\n * @param terminateBlock optional callback called after each index block has been announced\r\n */\r\n export function announceZeroBasedIndicesFromSignedOneBasedIndices(\r\n sourceIndices: Int32Array,\r\n numPerBlock: number,\r\n announceZeroBasedIndex: (i0: number, flag?: boolean) => any,\r\n terminateBlock?: () => any,\r\n ): void {\r\n let numIndices = sourceIndices.length;\r\n if (!numIndices)\r\n return;\r\n if (numPerBlock > 1) {\r\n numIndices -= sourceIndices.length % numPerBlock;\r\n for (let i = 0; i < numIndices; i++) {\r\n const p = sourceIndices[i];\r\n if (p !== 0) // skip padding\r\n announceZeroBasedIndex(Math.abs(p) - 1, p > 0);\r\n if (terminateBlock && ((i + 1) % numPerBlock) === 0)\r\n terminateBlock();\r\n }\r\n } else {\r\n for (let i = 0; i < numIndices; i++) {\r\n const p = sourceIndices[i];\r\n if (p !== 0) // skip terminator\r\n announceZeroBasedIndex(Math.abs(p) - 1, p > 0);\r\n if (terminateBlock) {\r\n if (p === 0) {\r\n if (i + 1 === numIndices || sourceIndices[i + 1] !== 0) // skip extra terminators\r\n terminateBlock();\r\n } else {\r\n if (i + 1 === numIndices) // missing last terminator\r\n terminateBlock();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Process 0-based indices with blocking specified by another index array.\r\n * @param sourceIndices 0-based source indices. This array is compressed (has no blocking).\r\n * @param blockingIndices 1-based source indices, blocking specified by `numPerBlock`. Assumed to have length equal to its zero count plus `sourceIndices.length`.\r\n * @param numPerBlock index blocking: fixed blocks of size numPerBlock > 1, possibly 0-padded; otherwise, variable-sized blocks terminated by 0\r\n * @param announceZeroBasedIndex callback to receive a 0-based index\r\n * @param terminateBlock optional callback called after each index block has been announced\r\n */\r\n export function announceZeroBasedIndicesWithExternalBlocking(\r\n sourceIndices: Int32Array,\r\n blockingIndices: Int32Array,\r\n numPerBlock: number,\r\n announceZeroBasedIndex: (i0: number) => any,\r\n terminateBlock?: () => any,\r\n ): void {\r\n if (!sourceIndices.length || !blockingIndices.length)\r\n return;\r\n const blockingZeroCount = blockingIndices.filter((i) => i === 0).length;\r\n if (sourceIndices.length + blockingZeroCount !== blockingIndices.length)\r\n return; // invalid input\r\n let iSource = 0;\r\n let numBlocking = blockingIndices.length;\r\n if (numPerBlock > 1) {\r\n numBlocking -= blockingIndices.length % numPerBlock;\r\n for (let iBlocking = 0; iBlocking < numBlocking && iSource < sourceIndices.length; iBlocking++) {\r\n const p = blockingIndices[iBlocking];\r\n if (p !== 0) // skip padding\r\n announceZeroBasedIndex(sourceIndices[iSource++]);\r\n if (terminateBlock && ((iBlocking + 1) % numPerBlock) === 0)\r\n terminateBlock();\r\n }\r\n } else {\r\n for (let iBlocking = 0; iBlocking < numBlocking && iSource < sourceIndices.length; iBlocking++) {\r\n const p = blockingIndices[iBlocking];\r\n if (p !== 0) // skip terminator\r\n announceZeroBasedIndex(sourceIndices[iSource++]);\r\n if (terminateBlock) {\r\n if (p === 0) {\r\n if (iBlocking + 1 === numBlocking || blockingIndices[iBlocking + 1] !== 0) // skip extra terminators\r\n terminateBlock();\r\n } else {\r\n if (iBlocking + 1 === numBlocking) // missing last terminator\r\n terminateBlock();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Special values for persistent zero-based edge mate indices. */\r\n export enum EdgeMateIndex {\r\n /** Separates face loops. */\r\n BlockSeparator = -1,\r\n /** Indicates no edge mate. */\r\n NoEdgeMate = -2\r\n };\r\n\r\n /**\r\n * Build two index arrays into a source array:\r\n * * `sourceStarts[k]` is the first index of the k_th block in `sourceIndices`.\r\n * * `compressedStarts[k]` is the first index of the k_th block in a compressed clone `C` of `sourceIndices`\r\n * with all pads/terminators removed.\r\n * * The last entry of `sourceStarts`/`compressedStarts` is the length of `sourceIndices`/`C`.\r\n * @returns `undefined` if invalid inputs, or the two computed arrays of block start indices.\r\n */\r\n function buildBlockStartIndices(sourceIndices: Int32Array, numPerBlock: number, blockSeparator: number): { sourceStarts: number[], compressedStarts: number[] } | undefined {\r\n if (sourceIndices.length === 0 || sourceIndices[0] === blockSeparator)\r\n return undefined;\r\n const sourceStarts: number[] = [];\r\n const compressedStarts: number[] = [];\r\n sourceStarts.push(0);\r\n compressedStarts.push(0);\r\n const getBlockLength = (iBlockStart: number): number => {\r\n if (sourceIndices[iBlockStart] === blockSeparator)\r\n return 0;\r\n for (let i = iBlockStart + 1; i < sourceIndices.length; i++) {\r\n if ((sourceIndices[i - 1] !== blockSeparator && sourceIndices[i] === blockSeparator) || (numPerBlock > 2 && (i % numPerBlock === 0)))\r\n return i - iBlockStart;\r\n if (i === sourceIndices.length - 1) // last fixed block, or unterminated last variable block\r\n return sourceIndices.length - iBlockStart;\r\n }\r\n return 0;\r\n }\r\n for (let i = 0; i < sourceIndices.length;) {\r\n const blockLength = getBlockLength(i);\r\n if (blockLength <= 0)\r\n return undefined;\r\n i += blockLength;\r\n for (; i < sourceIndices.length && sourceIndices[i] === blockSeparator; i++);\r\n sourceStarts.push(i);\r\n compressedStarts.push(compressedStarts[compressedStarts.length - 1] + blockLength);\r\n }\r\n return { sourceStarts, compressedStarts };\r\n }\r\n\r\n /**\r\n * Compress a 0-based blocked index array by removing block separators/pads and remapping each index.\r\n * * The entries of `sourceIndices` are reflexive indices, i.e., they index `sourceIndices`.\r\n * * The remapped index `j` must refer to the same block location in the compressed array to which the\r\n * original index `i >= 0` refers in `sourceIndices`; therefore `j` is obtained from `i` by subtracting the\r\n * number of block separators/pads preceding `sourceIndices[i]`.\r\n * @param sourceIndices array of blocked indices to process. Each entry is a 0-based reflexive index, `nullValue`, or `blockSeparator`.\r\n * @param numPerBlock index blocking for sourceIndices: padded block size > 2 or variable-sized terminated blocks.\r\n * @param blockSeparator negative value that terminates/pads blocks in sourceIndices, e.g. -1. This value is not announced.\r\n * @param nullValue negative value that represents \"no index\" in sourceIndices, e.g., -2. This value is announced as \"undefined\".\r\n * @param announceRemappedIndex callback to receive a remapped index.\r\n * @returns true if and only if the mapping was successful.\r\n */\r\n export function announceCompressedZeroBasedReflexiveIndices(\r\n sourceIndices: Int32Array,\r\n numPerBlock: number,\r\n blockSeparator: number,\r\n nullValue: number,\r\n announceRemappedIndex: (i: number | undefined) => any,\r\n ): boolean {\r\n if (!sourceIndices.length || blockSeparator >= 0 || nullValue >= 0 || (blockSeparator === nullValue))\r\n return false;\r\n // remapped index = source index - # preceding terminators/pads in sourceIndices\r\n // Instead of counting terminators/pads, we use a pair of block start index arrays\r\n const blocking = buildBlockStartIndices(sourceIndices, numPerBlock, blockSeparator);\r\n if (!blocking)\r\n return false;\r\n for (const index of sourceIndices) {\r\n if (index === nullValue)\r\n announceRemappedIndex(undefined);\r\n else if (index >= 0) {\r\n const iBlock = NumberArray.searchStrictlyIncreasingNumbers(blocking.sourceStarts, index);\r\n if (iBlock === undefined)\r\n return false;\r\n const blockOffset = index - blocking.sourceStarts[iBlock];\r\n announceRemappedIndex(blocking.compressedStarts[iBlock] + blockOffset);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Uncompress a 0-based index array by inserting block separators and remapping each index.\r\n * * Defined entries of `sourceIndices` are reflexive indices, i.e., they index `sourceIndices`.\r\n * * The remapped index `j` must refer to the same block location in the uncompressed array to which the\r\n * original defined index `i` refers in `sourceIndices`; therefore `j` is obtained from `i` by adding the\r\n * number of full blocks preceding `sourceIndices[i]`.\r\n * @param sourceIndices array of compressed indices to process. Each entry is a 0-based reflexive index, or `undefined`.\r\n * @param sourceStarts sourceStarts[k] is the first index of the k_th block in `sourceIndices`; its last entry is the\r\n * length of `sourceIndices`.\r\n * @param blockSeparator negative value that represents an announced block terminator, e.g. -1.\r\n * @param nullValue negative value to announce for an undefined source index, e.g., -2.\r\n * @param announceRemappedIndex callback to receive a remapped index.\r\n * @returns true if and only if the mapping was successful.\r\n */\r\n export function announceUncompressedZeroBasedReflexiveIndices(\r\n sourceIndices: Array<number | undefined>,\r\n sourceStarts: ReadonlyArray<number>,\r\n blockSeparator: number,\r\n nullValue: number,\r\n announceRemappedIndex: (i: number) => any,\r\n ): boolean {\r\n if (!sourceIndices.length || sourceStarts.length < 2 || blockSeparator >= 0 || nullValue >= 0 || (blockSeparator === nullValue))\r\n return false;\r\n // remapped index = source index + # preceding blocks in sourceIndices\r\n for (let i = 0; i < sourceStarts.length - 1; i++) {\r\n for (let j = sourceStarts[i]; j < sourceStarts[i + 1]; j++) {\r\n const index = sourceIndices[j];\r\n if (index === undefined)\r\n announceRemappedIndex(nullValue);\r\n else if (index >= 0) {\r\n const iBlock = NumberArray.searchStrictlyIncreasingNumbers(sourceStarts, index);\r\n if (iBlock === undefined)\r\n return false;\r\n announceRemappedIndex(index + iBlock);\r\n }\r\n }\r\n announceRemappedIndex(blockSeparator);\r\n }\r\n return true;\r\n }\r\n\r\n /** Helper class for preparing geometry data for import. */\r\n export class Import {\r\n /** copy knots, with options to control destination type and extraneous knot removal */\r\n private static copyKnots(knots: Float64Array | number[], options?: BSplineDataOptions, iStart?: number, iEnd?: number): Float64Array | number[] {\r\n if (undefined === iStart)\r\n iStart = 0;\r\n if (undefined === iEnd)\r\n iEnd = knots.length;\r\n if (options?.removeExtraKnots) {\r\n ++iStart; // ignore start knot\r\n --iEnd; // ignore end knot\r\n }\r\n let newNumKnots = iEnd - iStart;\r\n if (newNumKnots < 0)\r\n newNumKnots = 0;\r\n const newKnots = options?.jsonKnots ? new Array<number>(newNumKnots) : new Float64Array(newNumKnots);\r\n for (let i = iStart, k = 0; i < iEnd; i++, k++)\r\n newKnots[k] = knots[i];\r\n return newKnots;\r\n }\r\n\r\n /**\r\n * Recognize the special legacy periodic B-spline data of mode BSplineWrapMode.OpenByRemovingKnots, and return the corresponding modern open clamped knots.\r\n * * Note that the B-spline poles corresponding to the converted knots remain unchanged, but it is assumed that first and last poles are equal.\r\n * * Example: the legacy 7-point quadratic circle periodic knots {-1/3 0 0 0 1/3 1/3 2/3 2/3 1 1 1 4/3} are converted to open knots {0 0 1/3 1/3 2/3 2/3 1 1}.\r\n * * General form of knot vector (k = order, d = k-1 = degree, p = numPoles):\r\n * * * legacy input: {k/2 periodically extended knots} {start knot multiplicity k} {p-k interior knots} {end knot multiplicity k} {d/2 periodically extended knots}\r\n * * * converted output: {start knot multiplicity d} {p-k interior knots} {end knot multiplicity d}\r\n * @param knots classic knot vector to test\r\n * @param numPoles number of poles\r\n * @param order B-spline order\r\n * @param options for output type, extraneous knot removal\r\n * @returns open knots if legacy periodic B-spline input data is recognized; otherwise, undefined\r\n * @see Export.closeLegacyPeriodicKnots\r\n */\r\n private static openLegacyPeriodicKnots(knots: Float64Array | number[], numPoles: number, order: number, options?: BSplineDataOptions): Float64Array | number[] | undefined {\r\n const numKnots = knots.length;\r\n if (order < 2 || numPoles + 2 * order - 1 !== numKnots)\r\n return undefined; // not legacy periodic knots\r\n\r\n const startKnot = knots[order - 1];\r\n const endKnot = knots[numKnots - order];\r\n const iStart0 = Math.floor(order / 2); // index of first expected multiple of the start knot\r\n const iEnd0 = iStart0 + numPoles; // index of first expected multiple of the end knot\r\n const iEnd1 = iEnd0 + order; // one past index of last expected multiple of the end knot\r\n for (let i = 0; i < order; ++i) {\r\n if (Math.abs(knots[iStart0 + i] - startKnot) >= KnotVector.knotTolerance)\r\n return undefined; // start knot multiplicity too small\r\n if (Math.abs(knots[iEnd0 + i] - endKnot) >= KnotVector.knotTolerance)\r\n return undefined; // end knot multiplicity too small\r\n }\r\n return this.copyKnots(knots, options, iStart0, iEnd1);\r\n }\r\n\r\n /** Prepare imported B-spline curve data for eventual conversion to BSplineCurve3d | BSplineCurve3dH:\r\n * * Opens legacy \"fake\" periodic data by expanding knots\r\n * * Opens true periodic data by expanding poles and weights\r\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\r\n * @param options output specifications\r\n * @returns whether data was successfully prepared\r\n */\r\n public static prepareBSplineCurveData(data: BSplineCurveData, options?: BSplineDataOptions): boolean {\r\n let polesExpanded: number[][] | undefined;\r\n let weightsExpanded: number[] | undefined;\r\n let knotsCorrected: number[] | Float64Array | undefined;\r\n data.params.wrapMode = undefined;\r\n\r\n if (true === data.params.closed) {\r\n knotsCorrected = this.openLegacyPeriodicKnots(data.params.knots, data.params.numPoles, data.params.order, options);\r\n if (undefined !== knotsCorrected) {\r\n // legacy periodic knots removed, poles untouched\r\n data.params.knots = knotsCorrected;\r\n data.params.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\r\n } else {\r\n // wrap poles, knots untouched\r\n if (!polesExpanded) {\r\n const arrays = copyBSplineCurveDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesExpanded = arrays.poles;\r\n data.weights = weightsExpanded = arrays.weights;\r\n }\r\n for (let i = 0; i < data.params.order - 1; ++i) {\r\n const wraparoundPt = [];\r\n for (let j = 0; j < data.dim; ++j)\r\n wraparoundPt.push(polesExpanded[i][j]);\r\n polesExpanded.push(wraparoundPt); // append degree wraparound poles\r\n }\r\n if (weightsExpanded) {\r\n for (let i = 0; i < data.params.order - 1; ++i)\r\n weightsExpanded.push(weightsExpanded[i]); // append degree wraparound weights\r\n }\r\n data.params.numPoles += data.params.order - 1;\r\n data.params.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\r\n }\r\n }\r\n\r\n if (options?.removeExtraKnots) {\r\n if (!knotsCorrected)\r\n data.params.knots = this.copyKnots(data.params.knots, options);\r\n }\r\n\r\n data.params.closed = undefined; // we are open\r\n\r\n convertBSplineCurveDataArrays(data, options);\r\n return true;\r\n }\r\n\r\n /** Prepare imported B-spline surface data for eventual conversion to BSplineSurface3d | BSplineSurface3dH:\r\n * * Opens legacy \"fake\" periodic data by expanding knots\r\n * * Opens true periodic data by expanding poles and weights\r\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\r\n * @param options output specifications\r\n * @returns whether data was successfully prepared\r\n */\r\n public static prepareBSplineSurfaceData(data: BSplineSurfaceData, options?: BSplineDataOptions): boolean {\r\n let polesExpanded: number[][][] | undefined;\r\n let weightsExpanded: number[][] | undefined;\r\n let uKnotsCorrected: number[] | Float64Array | undefined;\r\n let vKnotsCorrected: number[] | Float64Array | undefined;\r\n data.uParams.wrapMode = data.vParams.wrapMode = undefined;\r\n\r\n if (true === data.uParams.closed) {\r\n uKnotsCorrected = this.openLegacyPeriodicKnots(data.uParams.knots, data.uParams.numPoles, data.uParams.order, options);\r\n if (undefined !== uKnotsCorrected) {\r\n // legacy periodic knots removed, poles untouched\r\n data.uParams.knots = uKnotsCorrected;\r\n data.uParams.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\r\n } else {\r\n // wrap poles, knots untouched\r\n if (!polesExpanded) {\r\n const arrays = copyBSplineSurfaceDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesExpanded = arrays.poles;\r\n data.weights = weightsExpanded = arrays.weights;\r\n }\r\n for (let i = 0; i < data.vParams.numPoles; ++i) { // #rows\r\n for (let j = 0; j < data.uParams.order - 1; ++j) {\r\n const wraparoundPt = [];\r\n for (let k = 0; k < data.dim; ++k)\r\n wraparoundPt.push(polesExpanded[i][j][k]);\r\n polesExpanded[i].push(wraparoundPt); // append degreeU wraparound poles to each row\r\n }\r\n }\r\n if (weightsExpanded) {\r\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\r\n for (let j = 0; j < data.uParams.order - 1; ++j)\r\n weightsExpanded[i].push(weightsExpanded[i][j]); // append degreeU wraparound weights to each row\r\n }\r\n data.uParams.numPoles += data.uParams.order - 1;\r\n data.uParams.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\r\n }\r\n }\r\n\r\n if (true === data.vParams.closed) {\r\n vKnotsCorrected = this.openLegacyPeriodicKnots(data.vParams.knots, data.vParams.numPoles, data.vParams.order, options);\r\n if (undefined !== vKnotsCorrected) {\r\n // legacy periodic knots removed, poles untouched\r\n data.vParams.knots = vKnotsCorrected;\r\n data.vParams.wrapMode = BSplineWrapMode.OpenByRemovingKnots;\r\n } else {\r\n // wrap poles, knots untouched\r\n if (!polesExpanded) {\r\n const arrays = copyBSplineSurfaceDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesExpanded = arrays.poles;\r\n data.weights = weightsExpanded = arrays.weights;\r\n }\r\n for (let i = 0; i < data.vParams.order - 1; ++i) {\r\n const wrapAroundRow = [];\r\n for (let j = 0; j < data.uParams.numPoles; ++j) { // #cols\r\n const wrapAroundPt = [];\r\n for (let k = 0; k < data.dim; ++k)\r\n wrapAroundPt.push(polesExpanded[i][j][k]);\r\n wrapAroundRow.push(wrapAroundPt);\r\n }\r\n polesExpanded.push(wrapAroundRow); // append degreeV wraparound rows of poles\r\n }\r\n if (weightsExpanded) {\r\n for (let i = 0; i < data.vParams.order - 1; ++i) {\r\n const wrapAroundRow = [];\r\n for (let j = 0; j < data.uParams.numPoles; ++j) // #cols\r\n wrapAroundRow.push(weightsExpanded[i][j]);\r\n weightsExpanded.push(wrapAroundRow); // append degreeV wraparound rows of weights\r\n }\r\n }\r\n data.vParams.numPoles += data.vParams.order - 1;\r\n data.vParams.wrapMode = BSplineWrapMode.OpenByAddingControlPoints;\r\n }\r\n }\r\n\r\n if (options?.removeExtraKnots) {\r\n if (!uKnotsCorrected)\r\n data.uParams.knots = this.copyKnots(data.uParams.knots, options);\r\n if (!vKnotsCorrected)\r\n data.vParams.knots = this.copyKnots(data.vParams.knots, options);\r\n }\r\n\r\n data.uParams.closed = data.vParams.closed = undefined; // we are open\r\n\r\n convertBSplineSurfaceDataArrays(data, options);\r\n return true;\r\n }\r\n }\r\n\r\n /** Helper class for preparing geometry data for export. */\r\n export class Export {\r\n /**\r\n * Restore special legacy periodic B-spline knots opened via BSplineWrapMode.OpenByRemovingKnots logic.\r\n * @param knots modern knot vector: {start knot multiplicity d} {p-k interior knots} {end knot multiplicity d}\r\n * @param order B-spline order\r\n * @param options for output type\r\n * @param wrapMode wrap mode of the knots\r\n * @returns legacy periodic knots (with classic extraneous start/end knot) if wrapMode recognized; otherwise, undefined\r\n * @see Import.openLegacyPeriodicKnots\r\n */\r\n private static closeLegacyPeriodicKnots(knots: Float64Array | number[], order: number, options?: BSplineDataOptions, wrapMode?: BSplineWrapMode): Float64Array | number[] | undefined {\r\n if (wrapMode === undefined || wrapMode !== BSplineWrapMode.OpenByRemovingKnots)\r\n return undefined;\r\n\r\n const degree = order - 1;\r\n const leftIndex = degree - 1;\r\n const rightIndex = knots.length - degree;\r\n const leftKnot = knots[leftIndex];\r\n const rightKnot = knots[rightIndex];\r\n const knotPeriod = rightKnot - leftKnot;\r\n const newNumKnots = knots.length + degree + 2;\r\n const newKnots = options?.jsonKnots ? new Array<number>(newNumKnots) : new Float64Array(newNumKnots);\r\n\r\n let k = 0;\r\n for (let i = Math.floor(order / 2); i > 0; --i)\r\n newKnots[k++] = knots[rightIndex - i] - knotPeriod;\r\n newKnots[k++] = leftKnot; // extraneous start knot\r\n for (const knot of knots)\r\n newKnots[k++] = knot;\r\n newKnots[k++] = rightKnot; // extraneous end knot\r\n for (let i = 1; i <= Math.floor(degree / 2); ++i)\r\n newKnots[k++] = knots[leftIndex + i] + knotPeriod;\r\n\r\n return newKnots;\r\n }\r\n\r\n /**\r\n * Prepare data from a B-spline curve for export.\r\n * * adds classic extraneous knot at start and end of knot vector\r\n * * re-closes periodic data based on BSplineWrapMode\r\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\r\n * @param options output specifications\r\n * @returns whether data was successfully prepared\r\n */\r\n public static prepareBSplineCurveData(data: BSplineCurveData, options?: BSplineDataOptions): boolean {\r\n let polesTrimmed: number[][] | undefined;\r\n let weightsTrimmed: number[] | undefined;\r\n let knotsCorrected: number[] | Float64Array | undefined;\r\n data.params.closed = undefined;\r\n\r\n switch (data.params.wrapMode) {\r\n case BSplineWrapMode.OpenByRemovingKnots: {\r\n // add legacy periodic and extraneous knots, poles untouched\r\n knotsCorrected = this.closeLegacyPeriodicKnots(data.params.knots, data.params.order, options, data.params.wrapMode);\r\n if (undefined === knotsCorrected)\r\n return false; // invalid input\r\n data.params.knots = knotsCorrected;\r\n data.params.closed = true;\r\n break;\r\n }\r\n case BSplineWrapMode.OpenByAddingControlPoints: {\r\n // unwrap poles, knots untouched\r\n if (!polesTrimmed) {\r\n const arrays = copyBSplineCurveDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesTrimmed = arrays.poles;\r\n data.weights = weightsTrimmed = arrays.weights;\r\n }\r\n for (let i = 0; i < data.params.order - 1; ++i)\r\n polesTrimmed.pop(); // remove last degree poles\r\n if (weightsTrimmed) {\r\n for (let i = 0; i < data.params.order - 1; ++i)\r\n weightsTrimmed.pop(); // remove last degree weights\r\n }\r\n data.params.numPoles -= data.params.order - 1;\r\n data.params.closed = true;\r\n break;\r\n }\r\n }\r\n\r\n // always add extraneous knots\r\n if (!knotsCorrected)\r\n data.params.knots = KnotVector.copyKnots(data.params.knots, data.params.order - 1, true, data.params.wrapMode);\r\n\r\n convertBSplineCurveDataArrays(data, options);\r\n return true;\r\n }\r\n\r\n /**\r\n * Prepare data from a B-spline surface for export.\r\n * * adds classic extraneous knot at start and end of knot vectors\r\n * * re-closes periodic data based on BSplineWrapMode\r\n * @param data updated in place. If poles/weights/knots are updated, their respective arrays are reallocated.\r\n * @param options output specifications\r\n * @returns whether data was successfully prepared\r\n */\r\n public static prepareBSplineSurfaceData(data: BSplineSurfaceData, options?: BSplineDataOptions): boolean {\r\n let polesTrimmed: number[][][] | undefined;\r\n let weightsTrimmed: number[][] | undefined;\r\n let uKnotsCorrected: number[] | Float64Array | undefined;\r\n let vKnotsCorrected: number[] | Float64Array | undefined;\r\n data.uParams.closed = data.vParams.closed = undefined;\r\n\r\n switch (data.uParams.wrapMode) {\r\n case BSplineWrapMode.OpenByRemovingKnots: {\r\n // add legacy periodic and extraneous knots, poles untouched\r\n uKnotsCorrected = this.closeLegacyPeriodicKnots(data.uParams.knots, data.uParams.order, options, data.uParams.wrapMode);\r\n if (undefined === uKnotsCorrected)\r\n return false; // invalid input\r\n data.uParams.knots = uKnotsCorrected;\r\n data.uParams.closed = true;\r\n break;\r\n }\r\n case BSplineWrapMode.OpenByAddingControlPoints: {\r\n // unwrap poles, knots untouched\r\n if (!polesTrimmed) {\r\n const arrays = copyBSplineSurfaceDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesTrimmed = arrays.poles;\r\n data.weights = weightsTrimmed = arrays.weights;\r\n }\r\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\r\n for (let j = 0; j < data.uParams.order - 1; ++j)\r\n polesTrimmed[i].pop(); // remove last degreeU poles from each row\r\n if (weightsTrimmed) {\r\n for (let i = 0; i < data.vParams.numPoles; ++i) // #rows\r\n for (let j = 0; j < data.uParams.order - 1; ++j)\r\n weightsTrimmed[i].pop(); // remove last degreeU weights from each row\r\n }\r\n data.uParams.numPoles -= data.uParams.order - 1;\r\n data.uParams.closed = true;\r\n break;\r\n }\r\n }\r\n\r\n switch (data.vParams.wrapMode) {\r\n case BSplineWrapMode.OpenByRemovingKnots: {\r\n // add legacy periodic and extraneous knots, poles untouched\r\n vKnotsCorrected = this.closeLegacyPeriodicKnots(data.vParams.knots, data.vParams.order, options, data.vParams.wrapMode);\r\n if (undefined === vKnotsCorrected)\r\n return false; // invalid input\r\n data.vParams.knots = vKnotsCorrected;\r\n data.vParams.closed = true;\r\n break;\r\n }\r\n case BSplineWrapMode.OpenByAddingControlPoints: {\r\n // unwrap poles, knots untouched\r\n if (!polesTrimmed) {\r\n const arrays = copyBSplineSurfaceDataPoles(data);\r\n if (undefined === arrays.poles)\r\n return false; // invalid input\r\n data.poles = polesTrimmed = arrays.poles;\r\n data.weights = weightsTrimmed = arrays.weights;\r\n }\r\n for (let i = 0; i < data.vParams.order - 1; ++i)\r\n polesTrimmed.pop(); // remove last degreeV rows of poles\r\n if (weightsTrimmed) {\r\n for (let i = 0; i < data.vParams.order - 1; ++i)\r\n weightsTrimmed.pop(); // remove last degreeV rows of weights\r\n }\r\n data.vParams.numPoles -= data.vParams.order - 1;\r\n data.vParams.closed = true;\r\n break;\r\n }\r\n }\r\n\r\n // always add extraneous knots\r\n if (!uKnotsCorrected)\r\n data.uParams.knots = KnotVector.copyKnots(data.uParams.knots, data.uParams.order - 1, true, data.uParams.wrapMode);\r\n if (!vKnotsCorrected)\r\n data.vParams.knots = KnotVector.copyKnots(data.vParams.knots, data.vParams.order - 1, true, data.vParams.wrapMode);\r\n\r\n convertBSplineSurfaceDataArrays(data, options);\r\n return true;\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/solid/Box.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 { CurveCollection } from \"../curve/CurveCollection\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { Geometry } from \"../Geometry\";\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { SolidPrimitive } from \"./SolidPrimitive\";\n\n/**\n * A box-like solid defined by\n * * A local coordinate frame\n * * (0,0,0) is left lower rear corner of box (considering \"left\" to reference x, \"lower\" to reference y, \"rear and front\" to reference z=0 and z=1)\n * * (0,0,1) is left lower front corner.\n * * (baseX,baseY,z) is right upper corner at z\n * * note that the frame x and y columns are usually unit vectors in local space, but z is full rear to front vector\n * * The separate values for base and top x and y allow the box to be a \"view frustum\" with parallel back and front planes but independent x and y bellows effects.\n * @public\n */\nexport class Box extends SolidPrimitive {\n /** String name for schema properties */\n public readonly solidPrimitiveType = \"box\";\n\n private _localToWorld: Transform;\n private _baseX: number;\n private _baseY: number;\n private _topX: number;\n private _topY: number;\n\n protected constructor(map: Transform,\n baseX: number, baseY: number, topX: number, topY: number, capped: boolean) {\n super(capped);\n this._localToWorld = map;\n this._baseX = baseX;\n this._baseY = baseY;\n this._topX = topX;\n this._topY = topY;\n }\n /** Return a clone */\n public clone(): Box {\n return new Box(this._localToWorld.clone(), this._baseX, this._baseY, this._topX, this._topY, this.capped);\n }\n\n /** Return a coordinate frame (right handed unit vectors)\n * * origin lower left of box\n * * x direction on base rectangle x edge\n * * y direction in base rectangle\n * * z direction perpendicular\n */\n public getConstructiveFrame(): Transform | undefined {\n return this._localToWorld.cloneRigid();\n }\n /**\n * Apply the transform to the box's `localToWorld` frame.\n * * Note that this may make the frame nonrigid.\n * * This fails if the transformation is singular.\n */\n public tryTransformInPlace(transform: Transform): boolean {\n if (transform.matrix.isSingular())\n return false;\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\n if (transform.matrix.determinant() < 0.0) {\n // if mirror, reverse z-axis (origin and direction) to preserve outward normals\n this._localToWorld.origin.addInPlace(this._localToWorld.matrix.columnZ());\n this._localToWorld.matrix.scaleColumnsInPlace(1, 1, -1);\n [this._baseX, this._topX] = [this._topX, this._baseX];\n [this._baseY, this._topY] = [this._topY, this._baseY];\n }\n return true;\n }\n /**\n * Clone the box and immediately apply `transform` to the local frame of the clone.\n * * Note that this may make the frame nonrigid.\n * * This fails if the transformation is singular.\n */\n public cloneTransformed(transform: Transform): Box | undefined {\n const result = this.clone();\n return result.tryTransformInPlace(transform) ? result : undefined;\n }\n\n /**\n * Create a new box from vector and size daa.\n * @param origin Origin of base rectangle\n * @param vectorX Direction for base rectangle\n * @param vectorY Direction for base rectangle\n * @param topOrigin origin of top rectangle\n * @param baseX size factor for base rectangle (multiplies vectorX)\n * @param baseY size factor for base rectangle (multiplies vectorY)\n * @param topX size factor for top rectangle (multiplies vectorX)\n * @param topY size factor for top rectangle (multiplies vectorY)\n * @param capped true to define top and bottom closure caps\n */\n public static createDgnBox(origin: Point3d, vectorX: Vector3d, vectorY: Vector3d,\n topOrigin: Point3d,\n baseX: number, baseY: number, topX: number, topY: number,\n capped: boolean): Box | undefined {\n const vectorZ = origin.vectorTo(topOrigin);\n const localToWorld = Transform.createOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\n return new Box(localToWorld, baseX, baseY, topX, topY, capped);\n }\n\n /**\n * Create a new box with xy directions taken from columns of the `axes` matrix.\n * @param origin Origin of base rectangle\n * @param axes Direction for base rectangle\n * @param topOrigin origin of top rectangle\n * @param baseX size factor for base rectangle (multiplies vectorX)\n * @param baseY size factor for base rectangle (multiplies vectorY)\n * @param topX size factor for top rectangle (multiplies vectorX)\n * @param topY size factor for top rectangle (multiplies vectorY)\n * @param capped true to define top and bottom closure caps\n */\n public static createDgnBoxWithAxes(origin: Point3d, axes: Matrix3d,\n topOrigin: Point3d,\n baseX: number, baseY: number, topX: number, topY: number,\n capped: boolean): Box | undefined {\n return Box.createDgnBox(origin, axes.columnX(), axes.columnY(), topOrigin,\n baseX, baseY, topX, topY, capped);\n }\n\n /**\n * Create an axis-aligned `Box` primitive for a range.\n * @param range range low point is origin of base rectangle, range extents are box extents\n * @param capped true to define top and bottom closure caps\n */\n public static createRange(range: Range3d, capped: boolean): Box | undefined {\n if (!range.isNull) {\n const lowPoint = range.low;\n const xSize = range.xLength();\n const ySize = range.yLength();\n const zPoint = range.low.clone();\n zPoint.z = zPoint.z + range.zLength();\n return Box.createDgnBox(\n lowPoint,\n Vector3d.unitX(), Vector3d.unitY(),\n zPoint,\n xSize, ySize, xSize, ySize, capped);\n }\n return undefined;\n }\n /** (property accessor) return the x length at z = 0 */\n public getBaseX(): number { return this._baseX; }\n /** (property accessor) return the y length at z = 0 */\n public getBaseY(): number { return this._baseY; }\n /** (property accessor) return the x length at z = 1 */\n public getTopX(): number { return this._topX; }\n /** (property accessor) return the x length at z = 1 */\n public getTopY(): number { return this._topY; }\n /** (property accessor) return the local coordinates point (0,0,0) to world */\n public getBaseOrigin(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 0); }\n /** (property accessor) return the local coordinates point (0,0,1) to world */\n public getTopOrigin(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 1); }\n /** (property accessor) return the local coordinate frame x vector */\n public getVectorX(): Vector3d { return this._localToWorld.matrix.columnX(); }\n /** (property accessor) return the local coordinate frame y vector */\n public getVectorY(): Vector3d { return this._localToWorld.matrix.columnY(); }\n /** (property accessor) return the local coordinate frame z vector */\n public getVectorZ(): Vector3d { return this._localToWorld.matrix.columnZ(); }\n /** Test of `other` is also of class `Box` */\n public isSameGeometryClass(other: any): boolean { return other instanceof Box; }\n /** test for near equality */\n public override isAlmostEqual(other: GeometryQuery): boolean {\n if (other instanceof Box) {\n if (this.capped !== other.capped) return false;\n if (!this._localToWorld.isAlmostEqual(other._localToWorld)) return false;\n return Geometry.isSameCoordinate(this._baseX, other._baseX)\n && Geometry.isSameCoordinate(this._baseY, other._baseY)\n && Geometry.isSameCoordinate(this._topX, other._topX)\n && Geometry.isSameCoordinate(this._topY, other._topY);\n }\n return false;\n }\n /** Second step of double dispatch: call `handler.handleBox(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleBox(this);\n }\n /** Return strokes of the cross-section rectangle at local z coordinate */\n public strokeConstantVSection(zFraction: number): LineString3d {\n const ax = Geometry.interpolate(this._baseX, zFraction, this._topX);\n const ay = Geometry.interpolate(this._baseY, zFraction, this._topY);\n const result = LineString3d.create();\n const transform = this._localToWorld;\n const workPoint = Point3d.create();\n transform.multiplyXYZ(0, 0, zFraction, workPoint);\n result.addPoint(workPoint);\n transform.multiplyXYZ(ax, 0, zFraction, workPoint);\n result.addPoint(workPoint);\n transform.multiplyXYZ(ax, ay, zFraction, workPoint);\n result.addPoint(workPoint);\n transform.multiplyXYZ(0, ay, zFraction, workPoint);\n result.addPoint(workPoint);\n transform.multiplyXYZ(0, 0, zFraction, workPoint);\n result.addPoint(workPoint);\n return result;\n }\n /**\n * Returns the 8 corners in x fastest, then y, finally z lexical order.\n */\n public getCorners(): Point3d[] {\n const transform = this._localToWorld;\n const ax = this._baseX;\n const ay = this._baseY;\n const bx = this._topX;\n const by = this._topY;\n return [\n transform.multiplyXYZ(0, 0, 0),\n transform.multiplyXYZ(ax, 0, 0),\n transform.multiplyXYZ(0, ay, 0),\n transform.multiplyXYZ(ax, ay, 0),\n transform.multiplyXYZ(0, 0, 1),\n transform.multiplyXYZ(bx, 0, 1),\n transform.multiplyXYZ(0, by, 1),\n transform.multiplyXYZ(bx, by, 1),\n ];\n }\n\n /**\n * Consider the box sides (not top and bottom) as a (u,v) surface with\n * * v = 0 as the z=0 local plane\n * * v = 1 as the z=1 local plane\n * Return the (rectangular) section at fractional v\n */\n public constantVSection(zFraction: number): CurveCollection {\n const ls = this.strokeConstantVSection(zFraction);\n return Loop.create(ls);\n }\n /** Extend `rangeToExtend` by each of the 8 corners */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n const boxTransform = this._localToWorld;\n const ax = this._baseX;\n const ay = this._baseY;\n const bx = this._topX;\n const by = this._topY;\n if (transform) {\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, 0, 0);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, ax, 0, 0);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, ay, 0);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, ax, ay, 0);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, 0, 1);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, bx, 0, 1);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, by, 1);\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, bx, by, 1);\n } else {\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, 0, 0);\n rangeToExtend.extendTransformedXYZ(boxTransform, ax, 0, 0);\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, ay, 0);\n rangeToExtend.extendTransformedXYZ(boxTransform, ax, ay, 0);\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, 0, 1);\n rangeToExtend.extendTransformedXYZ(boxTransform, bx, 0, 1);\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, by, 1);\n rangeToExtend.extendTransformedXYZ(boxTransform, bx, by, 1);\n }\n }\n /**\n * @return true if this is a closed volume.\n */\n public get isClosedVolume(): boolean {\n return this.capped;\n }\n}\n"]}
1
+ {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/solid/Box.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 Solid\r\n */\r\n\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\n\r\n/**\r\n * A box-like solid defined by\r\n * * A local coordinate frame\r\n * * (0,0,0) is left lower rear corner of box (considering \"left\" to reference x, \"lower\" to reference y, \"rear and front\" to reference z=0 and z=1)\r\n * * (0,0,1) is left lower front corner.\r\n * * (baseX,baseY,z) is right upper corner at z\r\n * * note that the frame x and y columns are usually unit vectors in local space, but z is full rear to front vector\r\n * * The separate values for base and top x and y allow the box to be a \"view frustum\" with parallel back and front planes but independent x and y bellows effects.\r\n * @public\r\n */\r\nexport class Box extends SolidPrimitive {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"box\";\r\n\r\n private _localToWorld: Transform;\r\n private _baseX: number;\r\n private _baseY: number;\r\n private _topX: number;\r\n private _topY: number;\r\n\r\n protected constructor(map: Transform,\r\n baseX: number, baseY: number, topX: number, topY: number, capped: boolean) {\r\n super(capped);\r\n this._localToWorld = map;\r\n this._baseX = baseX;\r\n this._baseY = baseY;\r\n this._topX = topX;\r\n this._topY = topY;\r\n }\r\n /** Return a clone */\r\n public clone(): Box {\r\n return new Box(this._localToWorld.clone(), this._baseX, this._baseY, this._topX, this._topY, this.capped);\r\n }\r\n\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin lower left of box\r\n * * x direction on base rectangle x edge\r\n * * y direction in base rectangle\r\n * * z direction perpendicular\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._localToWorld.cloneRigid();\r\n }\r\n /**\r\n * Apply the transform to the box's `localToWorld` frame.\r\n * * Note that this may make the frame nonrigid.\r\n * * This fails if the transformation is singular.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\r\n if (transform.matrix.determinant() < 0.0) {\r\n // if mirror, reverse z-axis (origin and direction) to preserve outward normals\r\n this._localToWorld.origin.addInPlace(this._localToWorld.matrix.columnZ());\r\n this._localToWorld.matrix.scaleColumnsInPlace(1, 1, -1);\r\n [this._baseX, this._topX] = [this._topX, this._baseX];\r\n [this._baseY, this._topY] = [this._topY, this._baseY];\r\n }\r\n return true;\r\n }\r\n /**\r\n * Clone the box and immediately apply `transform` to the local frame of the clone.\r\n * * Note that this may make the frame nonrigid.\r\n * * This fails if the transformation is singular.\r\n */\r\n public cloneTransformed(transform: Transform): Box | undefined {\r\n const result = this.clone();\r\n return result.tryTransformInPlace(transform) ? result : undefined;\r\n }\r\n\r\n /**\r\n * Create a new box from vector and size daa.\r\n * @param origin Origin of base rectangle\r\n * @param vectorX Direction for base rectangle\r\n * @param vectorY Direction for base rectangle\r\n * @param topOrigin origin of top rectangle\r\n * @param baseX size factor for base rectangle (multiplies vectorX)\r\n * @param baseY size factor for base rectangle (multiplies vectorY)\r\n * @param topX size factor for top rectangle (multiplies vectorX)\r\n * @param topY size factor for top rectangle (multiplies vectorY)\r\n * @param capped true to define top and bottom closure caps\r\n */\r\n public static createDgnBox(origin: Point3d, vectorX: Vector3d, vectorY: Vector3d,\r\n topOrigin: Point3d,\r\n baseX: number, baseY: number, topX: number, topY: number,\r\n capped: boolean): Box | undefined {\r\n const vectorZ = origin.vectorTo(topOrigin);\r\n const localToWorld = Transform.createOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\r\n return new Box(localToWorld, baseX, baseY, topX, topY, capped);\r\n }\r\n\r\n /**\r\n * Create a new box with xy directions taken from columns of the `axes` matrix.\r\n * @param origin Origin of base rectangle\r\n * @param axes Direction for base rectangle\r\n * @param topOrigin origin of top rectangle\r\n * @param baseX size factor for base rectangle (multiplies vectorX)\r\n * @param baseY size factor for base rectangle (multiplies vectorY)\r\n * @param topX size factor for top rectangle (multiplies vectorX)\r\n * @param topY size factor for top rectangle (multiplies vectorY)\r\n * @param capped true to define top and bottom closure caps\r\n */\r\n public static createDgnBoxWithAxes(origin: Point3d, axes: Matrix3d,\r\n topOrigin: Point3d,\r\n baseX: number, baseY: number, topX: number, topY: number,\r\n capped: boolean): Box | undefined {\r\n return Box.createDgnBox(origin, axes.columnX(), axes.columnY(), topOrigin,\r\n baseX, baseY, topX, topY, capped);\r\n }\r\n\r\n /**\r\n * Create an axis-aligned `Box` primitive for a range.\r\n * @param range range low point is origin of base rectangle, range extents are box extents\r\n * @param capped true to define top and bottom closure caps\r\n */\r\n public static createRange(range: Range3d, capped: boolean): Box | undefined {\r\n if (!range.isNull) {\r\n const lowPoint = range.low;\r\n const xSize = range.xLength();\r\n const ySize = range.yLength();\r\n const zPoint = range.low.clone();\r\n zPoint.z = zPoint.z + range.zLength();\r\n return Box.createDgnBox(\r\n lowPoint,\r\n Vector3d.unitX(), Vector3d.unitY(),\r\n zPoint,\r\n xSize, ySize, xSize, ySize, capped);\r\n }\r\n return undefined;\r\n }\r\n /** (property accessor) return the x length at z = 0 */\r\n public getBaseX(): number { return this._baseX; }\r\n /** (property accessor) return the y length at z = 0 */\r\n public getBaseY(): number { return this._baseY; }\r\n /** (property accessor) return the x length at z = 1 */\r\n public getTopX(): number { return this._topX; }\r\n /** (property accessor) return the x length at z = 1 */\r\n public getTopY(): number { return this._topY; }\r\n /** (property accessor) return the local coordinates point (0,0,0) to world */\r\n public getBaseOrigin(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 0); }\r\n /** (property accessor) return the local coordinates point (0,0,1) to world */\r\n public getTopOrigin(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 1); }\r\n /** (property accessor) return the local coordinate frame x vector */\r\n public getVectorX(): Vector3d { return this._localToWorld.matrix.columnX(); }\r\n /** (property accessor) return the local coordinate frame y vector */\r\n public getVectorY(): Vector3d { return this._localToWorld.matrix.columnY(); }\r\n /** (property accessor) return the local coordinate frame z vector */\r\n public getVectorZ(): Vector3d { return this._localToWorld.matrix.columnZ(); }\r\n /** Test of `other` is also of class `Box` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof Box; }\r\n /** test for near equality */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof Box) {\r\n if (this.capped !== other.capped) return false;\r\n if (!this._localToWorld.isAlmostEqual(other._localToWorld)) return false;\r\n return Geometry.isSameCoordinate(this._baseX, other._baseX)\r\n && Geometry.isSameCoordinate(this._baseY, other._baseY)\r\n && Geometry.isSameCoordinate(this._topX, other._topX)\r\n && Geometry.isSameCoordinate(this._topY, other._topY);\r\n }\r\n return false;\r\n }\r\n /** Second step of double dispatch: call `handler.handleBox(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBox(this);\r\n }\r\n /** Return strokes of the cross-section rectangle at local z coordinate */\r\n public strokeConstantVSection(zFraction: number): LineString3d {\r\n const ax = Geometry.interpolate(this._baseX, zFraction, this._topX);\r\n const ay = Geometry.interpolate(this._baseY, zFraction, this._topY);\r\n const result = LineString3d.create();\r\n const transform = this._localToWorld;\r\n const workPoint = Point3d.create();\r\n transform.multiplyXYZ(0, 0, zFraction, workPoint);\r\n result.addPoint(workPoint);\r\n transform.multiplyXYZ(ax, 0, zFraction, workPoint);\r\n result.addPoint(workPoint);\r\n transform.multiplyXYZ(ax, ay, zFraction, workPoint);\r\n result.addPoint(workPoint);\r\n transform.multiplyXYZ(0, ay, zFraction, workPoint);\r\n result.addPoint(workPoint);\r\n transform.multiplyXYZ(0, 0, zFraction, workPoint);\r\n result.addPoint(workPoint);\r\n return result;\r\n }\r\n /**\r\n * Returns the 8 corners in x fastest, then y, finally z lexical order.\r\n */\r\n public getCorners(): Point3d[] {\r\n const transform = this._localToWorld;\r\n const ax = this._baseX;\r\n const ay = this._baseY;\r\n const bx = this._topX;\r\n const by = this._topY;\r\n return [\r\n transform.multiplyXYZ(0, 0, 0),\r\n transform.multiplyXYZ(ax, 0, 0),\r\n transform.multiplyXYZ(0, ay, 0),\r\n transform.multiplyXYZ(ax, ay, 0),\r\n transform.multiplyXYZ(0, 0, 1),\r\n transform.multiplyXYZ(bx, 0, 1),\r\n transform.multiplyXYZ(0, by, 1),\r\n transform.multiplyXYZ(bx, by, 1),\r\n ];\r\n }\r\n\r\n /**\r\n * Consider the box sides (not top and bottom) as a (u,v) surface with\r\n * * v = 0 as the z=0 local plane\r\n * * v = 1 as the z=1 local plane\r\n * Return the (rectangular) section at fractional v\r\n */\r\n public constantVSection(zFraction: number): CurveCollection {\r\n const ls = this.strokeConstantVSection(zFraction);\r\n return Loop.create(ls);\r\n }\r\n /** Extend `rangeToExtend` by each of the 8 corners */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n const boxTransform = this._localToWorld;\r\n const ax = this._baseX;\r\n const ay = this._baseY;\r\n const bx = this._topX;\r\n const by = this._topY;\r\n if (transform) {\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, 0, 0);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, ax, 0, 0);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, ay, 0);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, ax, ay, 0);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, 0, 1);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, bx, 0, 1);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, 0, by, 1);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, boxTransform, bx, by, 1);\r\n } else {\r\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, 0, 0);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, ax, 0, 0);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, ay, 0);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, ax, ay, 0);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, 0, 1);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, bx, 0, 1);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, 0, by, 1);\r\n rangeToExtend.extendTransformedXYZ(boxTransform, bx, by, 1);\r\n }\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Cone.js","sourceRoot":"","sources":["../../../src/solid/Cone.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 { Arc3d } from \"../curve/Arc3d\";\nimport { CurveCollection } from \"../curve/CurveCollection\";\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\nimport { AxisOrder, Geometry } from \"../Geometry\";\nimport { GeometryHandler, UVSurface, UVSurfaceIsoParametricDistance } from \"../geometry3d/GeometryHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { SolidPrimitive } from \"./SolidPrimitive\";\n\n/**\n * A cone with axis along the z-axis of a (possibly skewed) local coordinate system.\n * * The curved surface of the cone `C` with axis `vectorZ = centerB - centerA` is parameterized over (u,v) in [0,1]x[0,1] by\n * `C(u,v) = centerA + vFractionToRadius(v) * (cos(u * 2pi) * vectorX + sin(u * 2pi) * vectorY) + v * vectorZ`.\n * * Either radius may be zero, but they may not both be zero.\n * * Cross section size is determined by the lengths of `vectorX`, `vectorY`, and the radii.\n * * If `vectorX` and `vectorY` are orthonormal, the cross sections are circular, with sections at v = 0 and v = 1 having radius\n * `radiusA` and `radiusB`, respectively; otherwise, the cross sections are elliptical.\n * * The stored matrix encapsulates `vectorX`, `vectorY`, and `vectorZ` in the respective columns. Typically the first two columns\n * are orthogonal and unit length, and the last is full length.\n * * Creating a Cone without orthogonal xy-axes of equal length is possible, but not recommended, for the resulting geometry\n * lacks portability; for example, such a Cone cannot be represented as a DGN element (see [[createDgnCone]]).\n * @public\n */\nexport class Cone extends SolidPrimitive implements UVSurface, UVSurfaceIsoParametricDistance {\n /** String name for schema properties */\n public readonly solidPrimitiveType = \"cone\";\n\n /** Local to world transform. Axes may have any nonzero length and may be non-perpendicular. */\n private _localToWorld: Transform;\n /** Nominal cross sectional radius at z=0 (scales the cone's xy-axes). */\n private _radiusA: number;\n /** Nominal cross sectional radius at z=1 (scales the cone's xy-axes). */\n private _radiusB: number;\n /** Maximum of _radiusA and _radiusB. */\n private _maxRadius: number;\n\n /** Constructor, inputs CONSUMED. */\n protected constructor(map: Transform, radiusA: number, radiusB: number, capped: boolean) {\n super(capped);\n this._localToWorld = map;\n this._radiusA = radiusA;\n this._radiusB = radiusB;\n this._maxRadius = Math.max(this._radiusA, this._radiusB); // um... should resolve elliptical sections\n }\n /** Return a clone of this Cone. */\n public clone(): Cone {\n return new Cone(this._localToWorld.clone(), this._radiusA, this._radiusB, this.capped);\n }\n /** Return a coordinate frame (right handed unit vectors)\n * * origin at center of the base circle.\n * * base circle in the xy plane\n * * z axis by right hand rule.\n */\n public getConstructiveFrame(): Transform | undefined {\n return this._localToWorld.cloneRigid();\n }\n /** Apply the transform to this cone's local to world coordinates.\n * * Note that the radii are not changed. Scaling is absorbed into the frame.\n * * This fails if the transformation is singular.\n */\n public tryTransformInPlace(transform: Transform): boolean {\n if (transform.matrix.isSingular())\n return false;\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\n if (transform.matrix.determinant() < 0.0) {\n // if mirror, reverse z-axis (origin and direction) to preserve outward normals\n this._localToWorld.origin.addInPlace(this._localToWorld.matrix.columnZ());\n this._localToWorld.matrix.scaleColumnsInPlace(1, 1, -1);\n [this._radiusA, this._radiusB] = [this._radiusB, this._radiusA];\n }\n return true;\n }\n /**\n * Create a clone and immediately transform the clone.\n * * This fails if the transformation is singular.\n */\n public cloneTransformed(transform: Transform): Cone | undefined {\n const result = this.clone();\n return result.tryTransformInPlace(transform) ? result : undefined;\n }\n /**\n * Create a right circular cylinder or cone from the given base centers and radii.\n * * The circular cross sections are perpendicular to the axis line between the centers.\n * * Both radii must be of the same sign, and at least one radius must be nonzero.\n * * Negative radii are accepted to create an interior surface, however the downstream effects of this, combined with capping, may be problematic.\n */\n public static createAxisPoints(centerA: Point3d, centerB: Point3d, radiusA: number, radiusB: number, capped?: boolean): Cone | undefined {\n const zDirection = centerA.vectorTo(centerB);\n const a = zDirection.magnitude();\n if (Geometry.isSmallMetricDistance(a)) return undefined;\n // force near-zero radii to true zero\n radiusA = Geometry.correctSmallMetricDistance(radiusA);\n radiusB = Geometry.correctSmallMetricDistance(radiusB);\n // cone tip may not be \"within\" the z range.\n if (radiusA * radiusB < 0.0) return undefined;\n // at least one must be nonzero.\n if (radiusA + radiusB === 0.0) return undefined;\n const matrix = Matrix3d.createRigidHeadsUp(zDirection);\n matrix.scaleColumns(1.0, 1.0, a, matrix);\n const localToWorld = Transform.createOriginAndMatrix(centerA, matrix);\n return new Cone(localToWorld, radiusA, radiusB, capped ?? false);\n }\n /**\n * Create a general cone from cross sections parallel to the plane spanned by the given vectors.\n * * Circular cross sections are indicated by perpendicular vectors of the same length.\n * * Elliptical cross sections are indicated by non-perpendicular vectors, or vectors of different lengths.\n * * Cross sectional planes do not have to be perpendicular to the axis line between centers.\n * * Cross section size is affected both by the given vector lengths and radii. To avoid unexpected scaling,\n * pass orthonormal vectors for circular cross sections, or unit radii for elliptical cross sections.\n * * There is no validation of the input radii. For best results, they should be nonnegative, and at least one should be nonzero.\n */\n public static createBaseAndTarget(centerA: Point3d, centerB: Point3d, vectorX: Vector3d, vectorY: Vector3d, radiusA: number, radiusB: number, capped?: boolean): Cone {\n radiusA = Math.abs(Geometry.correctSmallMetricDistance(radiusA));\n radiusB = Math.abs(Geometry.correctSmallMetricDistance(radiusB));\n const vectorZ = centerA.vectorTo(centerB);\n const localToWorld = Transform.createOriginAndMatrixColumns(centerA, vectorX, vectorY, vectorZ);\n return new Cone(localToWorld, radiusA, radiusB, capped ?? false);\n }\n\n /**\n * Create a circular cone from the typical parameters of the DGN file.\n * * This method calls [[createBaseAndTarget]] with normalized vectors, `vectorY` squared against `vectorX`, and\n * `radiusA` and `radiusB` scaled by the original length of `vectorX`.\n * * These restrictions allow the cone to be represented by an element in the DGN file.\n */\n public static createDgnCone(centerA: Point3d, centerB: Point3d, vectorX: Vector3d, vectorY: Vector3d, radiusA: number, radiusB: number, capped?: boolean): Cone | undefined {\n const rigidMatrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, AxisOrder.XYZ);\n if (rigidMatrix) {\n const vectorXMag = vectorX.magnitude();\n return this.createBaseAndTarget(centerA, centerB, rigidMatrix.columnX(), rigidMatrix.columnY(), radiusA * vectorXMag, radiusB * vectorXMag, capped);\n }\n return undefined;\n }\n\n /** (Property accessor) Return the center point at the base plane */\n public getCenterA(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 0); }\n /** (Property accessor) */\n public getCenterB(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 1); }\n /** (Property accessor) Return the x vector in the local frame */\n public getVectorX(): Vector3d { return this._localToWorld.matrix.columnX(); }\n /** (Property accessor) Return the y vector in the local frame */\n public getVectorY(): Vector3d { return this._localToWorld.matrix.columnY(); }\n /** (Property accessor) return the radius at the base plane */\n public getRadiusA(): number { return this._radiusA; }\n /** (Property accessor) return the radius at the top plane */\n public getRadiusB(): number { return this._radiusB; }\n /** (Property accessor) return the larger of radiusA and radiusB */\n public getMaxRadius(): number { return this._maxRadius; }\n /** (Property accessor) return the radius at fraction `v` along the axis */\n public vFractionToRadius(v: number): number { return Geometry.interpolate(this._radiusA, v, this._radiusB); }\n /** (Property accessor) test if `other` is an instance of `Cone` */\n public isSameGeometryClass(other: any): boolean { return other instanceof Cone; }\n /** (Property accessor) Test for nearly equal coordinate data. */\n public override isAlmostEqual(other: GeometryQuery): boolean {\n if (other instanceof Cone) {\n if (this.capped !== other.capped) return false;\n if (!this._localToWorld.isAlmostEqualAllowZRotation(other._localToWorld)) return false;\n return Geometry.isSameCoordinate(this._radiusA, other._radiusA)\n && Geometry.isSameCoordinate(this._radiusB, other._radiusB);\n }\n return false;\n }\n /** Second step of double dispatch: call `handler.handleCone(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleCone(this);\n }\n\n /**\n * return strokes for a cross-section (elliptic arc) at specified fraction v along the axis.\n * * fixedStrokeCount takes priority over stroke options.\n * * The linestring is created by LineString3d.createForStrokes (fixedStrokeCount, options), which sets up property according to the options:\n * * optional fractions member\n * * optional uvParams. uvParams are installed as full-scale distance parameters.\n * * optional derivatives.\n * @param v fractional position along the cone axis\n * @param fixedStrokeCount optional stroke count.\n * @param options optional stroke options.\n */\n public strokeConstantVSection(v: number, fixedStrokeCount?: number, options?: StrokeOptions): LineString3d {\n let strokeCount = 16;\n if (fixedStrokeCount !== undefined)\n strokeCount = fixedStrokeCount;\n else if (options !== undefined)\n strokeCount = options.defaultCircleStrokes; // NEEDS WORK -- get circle stroke count with this.maxRadius !!!\n else {\n // accept the local default\n }\n strokeCount = Geometry.clampToStartEnd(strokeCount, 4, 64);\n const r = this.vFractionToRadius(v);\n const result = LineString3d.createForStrokes(fixedStrokeCount, options);\n const twoPi = Math.PI * 2.0;\n const deltaRadians = twoPi / strokeCount;\n let radians = 0;\n const fractions = result.fractions; // possibly undefined !!!\n const derivatives = result.packedDerivatives; // possibly undefined !!!\n const uvParams = result.packedUVParams; // possibly undefined !!\n const surfaceNormals = result.packedSurfaceNormals;\n const xyz = Point3d.create();\n const dXdu = Vector3d.create();\n const dXdv = Vector3d.create();\n const normal = Vector3d.create();\n const transform = this._localToWorld;\n let rc, rs, cc, ss;\n for (let i = 0; i <= strokeCount; i++) {\n if (i * 2 <= strokeCount)\n radians = i * deltaRadians;\n else\n radians = (i - strokeCount) * deltaRadians;\n cc = Math.cos(radians);\n ss = Math.sin(radians);\n rc = r * cc;\n rs = r * ss;\n\n transform.multiplyXYZ(rc, rs, v, xyz);\n result.addPoint(xyz);\n if (fractions)\n fractions.push(i / strokeCount);\n if (derivatives) {\n transform.matrix.multiplyXYZ(-rs * twoPi, rc * twoPi, 0.0, dXdu);\n derivatives.push(dXdu);\n }\n if (surfaceNormals) {\n // the along-hoop vector does not need to be scaled by radius -- just need the direction for a cross product.\n transform.matrix.multiplyXYZ(-ss, cc, 0.0, dXdu);\n transform.matrix.multiplyXYZ(0, 0, 1, dXdv);\n dXdu.unitCrossProduct(dXdv, normal);\n surfaceNormals.push(normal);\n }\n if (uvParams) {\n uvParams.pushXY(i / strokeCount, v);\n }\n }\n return result;\n }\n /**\n * Return the Arc3d section at vFraction\n * @param vFraction fractional position along the sweep direction\n */\n public constantVSection(vFraction: number): CurveCollection | undefined {\n const r = this.vFractionToRadius(vFraction);\n const transform = this._localToWorld;\n const center = transform.multiplyXYZ(0, 0, vFraction);\n const vector0 = transform.matrix.multiplyXYZ(r, 0, 0);\n const vector90 = transform.matrix.multiplyXYZ(0, r, 0);\n return Loop.create(Arc3d.create(center, vector0, vector90));\n }\n /** Extend `rangeToExtend` so it includes this `Cone` instance. */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n const arc0 = this.constantVSection(0.0)!;\n const arc1 = this.constantVSection(1.0)!;\n arc0.extendRange(rangeToExtend, transform);\n arc1.extendRange(rangeToExtend, transform);\n }\n /** Evaluate a point on the Cone surfaces, with\n * * v = 0 is the base plane.\n * * v = 1 is the top plane\n * * u = 0 to u = 1 wraps the angular range.\n */\n public uvFractionToPoint(uFraction: number, vFraction: number, result?: Point3d): Point3d {\n const theta = uFraction * Math.PI * 2.0;\n const r = Geometry.interpolate(this._radiusA, vFraction, this._radiusB);\n const cosTheta = Math.cos(theta);\n const sinTheta = Math.sin(theta);\n return this._localToWorld.multiplyXYZ(r * cosTheta, r * sinTheta, vFraction, result);\n }\n /** Evaluate a point tangent plane on the Cone surfaces, with\n * * v = 0 is the base plane.\n * * v = 1 is the top plane\n * * u = 0 to u = 1 wraps the angular range.\n */\n public uvFractionToPointAndTangents(uFraction: number, vFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const theta = uFraction * Math.PI * 2.0;\n const r = Geometry.interpolate(this._radiusA, vFraction, this._radiusB);\n const drdv = this._radiusB - this._radiusA;\n const cosTheta = Math.cos(theta);\n const sinTheta = Math.sin(theta);\n const fTheta = 2.0 * Math.PI;\n return Plane3dByOriginAndVectors.createOriginAndVectors(\n this._localToWorld.multiplyXYZ(r * cosTheta, r * sinTheta, vFraction),\n this._localToWorld.multiplyVectorXYZ(-r * sinTheta * fTheta, r * cosTheta * fTheta, 0),\n this._localToWorld.multiplyVectorXYZ(drdv * cosTheta, drdv * sinTheta, 1.0),\n result);\n }\n /**\n * @return true if this is a closed volume.\n */\n public get isClosedVolume(): boolean {\n return this.capped;\n }\n /**\n * Directional distance query\n * * u direction is around longitude circle at maximum distance from axis.\n * * v direction is on a line of longitude between the latitude limits.\n */\n public maxIsoParametricDistance(): Vector2d {\n const vectorX = this._localToWorld.matrix.columnX();\n const vectorY = this._localToWorld.matrix.columnY();\n const columnZ = this._localToWorld.matrix.columnZ();\n\n const xyNormal = vectorX.unitCrossProduct(vectorY)!;\n const hZ = xyNormal.dotProduct(columnZ);\n const zSkewVector = columnZ.plusScaled(xyNormal, hZ);\n const zSkewDistance = zSkewVector.magnitudeXY();\n return Vector2d.create(Math.PI * 2 * Math.max(this._radiusA, this._radiusB),\n Geometry.hypotenuseXY(Math.abs(this._radiusB - this._radiusA) + zSkewDistance, hZ));\n }\n}\n"]}
1
+ {"version":3,"file":"Cone.js","sourceRoot":"","sources":["../../../src/solid/Cone.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 Solid\r\n */\r\n\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { StrokeOptions } from \"../curve/StrokeOptions\";\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, UVSurface, UVSurfaceIsoParametricDistance } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\n\r\n/**\r\n * A cone with axis along the z-axis of a (possibly skewed) local coordinate system.\r\n * * The curved surface of the cone `C` with axis `vectorZ = centerB - centerA` is parameterized over (u,v) in [0,1]x[0,1] by\r\n * `C(u,v) = centerA + vFractionToRadius(v) * (cos(u * 2pi) * vectorX + sin(u * 2pi) * vectorY) + v * vectorZ`.\r\n * * Either radius may be zero, but they may not both be zero.\r\n * * Cross section size is determined by the lengths of `vectorX`, `vectorY`, and the radii.\r\n * * If `vectorX` and `vectorY` are orthonormal, the cross sections are circular, with sections at v = 0 and v = 1 having radius\r\n * `radiusA` and `radiusB`, respectively; otherwise, the cross sections are elliptical.\r\n * * The stored matrix encapsulates `vectorX`, `vectorY`, and `vectorZ` in the respective columns. Typically the first two columns\r\n * are orthogonal and unit length, and the last is full length.\r\n * * Creating a Cone without orthogonal xy-axes of equal length is possible, but not recommended, for the resulting geometry\r\n * lacks portability; for example, such a Cone cannot be represented as a DGN element (see [[createDgnCone]]).\r\n * @public\r\n */\r\nexport class Cone extends SolidPrimitive implements UVSurface, UVSurfaceIsoParametricDistance {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"cone\";\r\n\r\n /** Local to world transform. Axes may have any nonzero length and may be non-perpendicular. */\r\n private _localToWorld: Transform;\r\n /** Nominal cross sectional radius at z=0 (scales the cone's xy-axes). */\r\n private _radiusA: number;\r\n /** Nominal cross sectional radius at z=1 (scales the cone's xy-axes). */\r\n private _radiusB: number;\r\n /** Maximum of _radiusA and _radiusB. */\r\n private _maxRadius: number;\r\n\r\n /** Constructor, inputs CONSUMED. */\r\n protected constructor(map: Transform, radiusA: number, radiusB: number, capped: boolean) {\r\n super(capped);\r\n this._localToWorld = map;\r\n this._radiusA = radiusA;\r\n this._radiusB = radiusB;\r\n this._maxRadius = Math.max(this._radiusA, this._radiusB); // um... should resolve elliptical sections\r\n }\r\n /** Return a clone of this Cone. */\r\n public clone(): Cone {\r\n return new Cone(this._localToWorld.clone(), this._radiusA, this._radiusB, this.capped);\r\n }\r\n /** Return a coordinate frame (right handed unit vectors)\r\n * * origin at center of the base circle.\r\n * * base circle in the xy plane\r\n * * z axis by right hand rule.\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._localToWorld.cloneRigid();\r\n }\r\n /** Apply the transform to this cone's local to world coordinates.\r\n * * Note that the radii are not changed. Scaling is absorbed into the frame.\r\n * * This fails if the transformation is singular.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\r\n if (transform.matrix.determinant() < 0.0) {\r\n // if mirror, reverse z-axis (origin and direction) to preserve outward normals\r\n this._localToWorld.origin.addInPlace(this._localToWorld.matrix.columnZ());\r\n this._localToWorld.matrix.scaleColumnsInPlace(1, 1, -1);\r\n [this._radiusA, this._radiusB] = [this._radiusB, this._radiusA];\r\n }\r\n return true;\r\n }\r\n /**\r\n * Create a clone and immediately transform the clone.\r\n * * This fails if the transformation is singular.\r\n */\r\n public cloneTransformed(transform: Transform): Cone | undefined {\r\n const result = this.clone();\r\n return result.tryTransformInPlace(transform) ? result : undefined;\r\n }\r\n /**\r\n * Create a right circular cylinder or cone from the given base centers and radii.\r\n * * The circular cross sections are perpendicular to the axis line between the centers.\r\n * * Both radii must be of the same sign, and at least one radius must be nonzero.\r\n * * Negative radii are accepted to create an interior surface, however the downstream effects of this, combined with capping, may be problematic.\r\n */\r\n public static createAxisPoints(centerA: Point3d, centerB: Point3d, radiusA: number, radiusB: number, capped?: boolean): Cone | undefined {\r\n const zDirection = centerA.vectorTo(centerB);\r\n const a = zDirection.magnitude();\r\n if (Geometry.isSmallMetricDistance(a)) return undefined;\r\n // force near-zero radii to true zero\r\n radiusA = Geometry.correctSmallMetricDistance(radiusA);\r\n radiusB = Geometry.correctSmallMetricDistance(radiusB);\r\n // cone tip may not be \"within\" the z range.\r\n if (radiusA * radiusB < 0.0) return undefined;\r\n // at least one must be nonzero.\r\n if (radiusA + radiusB === 0.0) return undefined;\r\n const matrix = Matrix3d.createRigidHeadsUp(zDirection);\r\n matrix.scaleColumns(1.0, 1.0, a, matrix);\r\n const localToWorld = Transform.createOriginAndMatrix(centerA, matrix);\r\n return new Cone(localToWorld, radiusA, radiusB, capped ?? false);\r\n }\r\n /**\r\n * Create a general cone from cross sections parallel to the plane spanned by the given vectors.\r\n * * Circular cross sections are indicated by perpendicular vectors of the same length.\r\n * * Elliptical cross sections are indicated by non-perpendicular vectors, or vectors of different lengths.\r\n * * Cross sectional planes do not have to be perpendicular to the axis line between centers.\r\n * * Cross section size is affected both by the given vector lengths and radii. To avoid unexpected scaling,\r\n * pass orthonormal vectors for circular cross sections, or unit radii for elliptical cross sections.\r\n * * There is no validation of the input radii. For best results, they should be nonnegative, and at least one should be nonzero.\r\n */\r\n public static createBaseAndTarget(centerA: Point3d, centerB: Point3d, vectorX: Vector3d, vectorY: Vector3d, radiusA: number, radiusB: number, capped?: boolean): Cone {\r\n radiusA = Math.abs(Geometry.correctSmallMetricDistance(radiusA));\r\n radiusB = Math.abs(Geometry.correctSmallMetricDistance(radiusB));\r\n const vectorZ = centerA.vectorTo(centerB);\r\n const localToWorld = Transform.createOriginAndMatrixColumns(centerA, vectorX, vectorY, vectorZ);\r\n return new Cone(localToWorld, radiusA, radiusB, capped ?? false);\r\n }\r\n\r\n /**\r\n * Create a circular cone from the typical parameters of the DGN file.\r\n * * This method calls [[createBaseAndTarget]] with normalized vectors, `vectorY` squared against `vectorX`, and\r\n * `radiusA` and `radiusB` scaled by the original length of `vectorX`.\r\n * * These restrictions allow the cone to be represented by an element in the DGN file.\r\n */\r\n public static createDgnCone(centerA: Point3d, centerB: Point3d, vectorX: Vector3d, vectorY: Vector3d, radiusA: number, radiusB: number, capped?: boolean): Cone | undefined {\r\n const rigidMatrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, AxisOrder.XYZ);\r\n if (rigidMatrix) {\r\n const vectorXMag = vectorX.magnitude();\r\n return this.createBaseAndTarget(centerA, centerB, rigidMatrix.columnX(), rigidMatrix.columnY(), radiusA * vectorXMag, radiusB * vectorXMag, capped);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** (Property accessor) Return the center point at the base plane */\r\n public getCenterA(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 0); }\r\n /** (Property accessor) */\r\n public getCenterB(): Point3d { return this._localToWorld.multiplyXYZ(0, 0, 1); }\r\n /** (Property accessor) Return the x vector in the local frame */\r\n public getVectorX(): Vector3d { return this._localToWorld.matrix.columnX(); }\r\n /** (Property accessor) Return the y vector in the local frame */\r\n public getVectorY(): Vector3d { return this._localToWorld.matrix.columnY(); }\r\n /** (Property accessor) return the radius at the base plane */\r\n public getRadiusA(): number { return this._radiusA; }\r\n /** (Property accessor) return the radius at the top plane */\r\n public getRadiusB(): number { return this._radiusB; }\r\n /** (Property accessor) return the larger of radiusA and radiusB */\r\n public getMaxRadius(): number { return this._maxRadius; }\r\n /** (Property accessor) return the radius at fraction `v` along the axis */\r\n public vFractionToRadius(v: number): number { return Geometry.interpolate(this._radiusA, v, this._radiusB); }\r\n /** (Property accessor) test if `other` is an instance of `Cone` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof Cone; }\r\n /** (Property accessor) Test for nearly equal coordinate data. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof Cone) {\r\n if (this.capped !== other.capped) return false;\r\n if (!this._localToWorld.isAlmostEqualAllowZRotation(other._localToWorld)) return false;\r\n return Geometry.isSameCoordinate(this._radiusA, other._radiusA)\r\n && Geometry.isSameCoordinate(this._radiusB, other._radiusB);\r\n }\r\n return false;\r\n }\r\n /** Second step of double dispatch: call `handler.handleCone(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleCone(this);\r\n }\r\n\r\n /**\r\n * return strokes for a cross-section (elliptic arc) at specified fraction v along the axis.\r\n * * fixedStrokeCount takes priority over stroke options.\r\n * * The linestring is created by LineString3d.createForStrokes (fixedStrokeCount, options), which sets up property according to the options:\r\n * * optional fractions member\r\n * * optional uvParams. uvParams are installed as full-scale distance parameters.\r\n * * optional derivatives.\r\n * @param v fractional position along the cone axis\r\n * @param fixedStrokeCount optional stroke count.\r\n * @param options optional stroke options.\r\n */\r\n public strokeConstantVSection(v: number, fixedStrokeCount?: number, options?: StrokeOptions): LineString3d {\r\n let strokeCount = 16;\r\n if (fixedStrokeCount !== undefined)\r\n strokeCount = fixedStrokeCount;\r\n else if (options !== undefined)\r\n strokeCount = options.defaultCircleStrokes; // NEEDS WORK -- get circle stroke count with this.maxRadius !!!\r\n else {\r\n // accept the local default\r\n }\r\n strokeCount = Geometry.clampToStartEnd(strokeCount, 4, 64);\r\n const r = this.vFractionToRadius(v);\r\n const result = LineString3d.createForStrokes(fixedStrokeCount, options);\r\n const twoPi = Math.PI * 2.0;\r\n const deltaRadians = twoPi / strokeCount;\r\n let radians = 0;\r\n const fractions = result.fractions; // possibly undefined !!!\r\n const derivatives = result.packedDerivatives; // possibly undefined !!!\r\n const uvParams = result.packedUVParams; // possibly undefined !!\r\n const surfaceNormals = result.packedSurfaceNormals;\r\n const xyz = Point3d.create();\r\n const dXdu = Vector3d.create();\r\n const dXdv = Vector3d.create();\r\n const normal = Vector3d.create();\r\n const transform = this._localToWorld;\r\n let rc, rs, cc, ss;\r\n for (let i = 0; i <= strokeCount; i++) {\r\n if (i * 2 <= strokeCount)\r\n radians = i * deltaRadians;\r\n else\r\n radians = (i - strokeCount) * deltaRadians;\r\n cc = Math.cos(radians);\r\n ss = Math.sin(radians);\r\n rc = r * cc;\r\n rs = r * ss;\r\n\r\n transform.multiplyXYZ(rc, rs, v, xyz);\r\n result.addPoint(xyz);\r\n if (fractions)\r\n fractions.push(i / strokeCount);\r\n if (derivatives) {\r\n transform.matrix.multiplyXYZ(-rs * twoPi, rc * twoPi, 0.0, dXdu);\r\n derivatives.push(dXdu);\r\n }\r\n if (surfaceNormals) {\r\n // the along-hoop vector does not need to be scaled by radius -- just need the direction for a cross product.\r\n transform.matrix.multiplyXYZ(-ss, cc, 0.0, dXdu);\r\n transform.matrix.multiplyXYZ(0, 0, 1, dXdv);\r\n dXdu.unitCrossProduct(dXdv, normal);\r\n surfaceNormals.push(normal);\r\n }\r\n if (uvParams) {\r\n uvParams.pushXY(i / strokeCount, v);\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return the Arc3d section at vFraction\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(vFraction: number): CurveCollection | undefined {\r\n const r = this.vFractionToRadius(vFraction);\r\n const transform = this._localToWorld;\r\n const center = transform.multiplyXYZ(0, 0, vFraction);\r\n const vector0 = transform.matrix.multiplyXYZ(r, 0, 0);\r\n const vector90 = transform.matrix.multiplyXYZ(0, r, 0);\r\n return Loop.create(Arc3d.create(center, vector0, vector90));\r\n }\r\n /** Extend `rangeToExtend` so it includes this `Cone` instance. */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n const arc0 = this.constantVSection(0.0)!;\r\n const arc1 = this.constantVSection(1.0)!;\r\n arc0.extendRange(rangeToExtend, transform);\r\n arc1.extendRange(rangeToExtend, transform);\r\n }\r\n /** Evaluate a point on the Cone surfaces, with\r\n * * v = 0 is the base plane.\r\n * * v = 1 is the top plane\r\n * * u = 0 to u = 1 wraps the angular range.\r\n */\r\n public uvFractionToPoint(uFraction: number, vFraction: number, result?: Point3d): Point3d {\r\n const theta = uFraction * Math.PI * 2.0;\r\n const r = Geometry.interpolate(this._radiusA, vFraction, this._radiusB);\r\n const cosTheta = Math.cos(theta);\r\n const sinTheta = Math.sin(theta);\r\n return this._localToWorld.multiplyXYZ(r * cosTheta, r * sinTheta, vFraction, result);\r\n }\r\n /** Evaluate a point tangent plane on the Cone surfaces, with\r\n * * v = 0 is the base plane.\r\n * * v = 1 is the top plane\r\n * * u = 0 to u = 1 wraps the angular range.\r\n */\r\n public uvFractionToPointAndTangents(uFraction: number, vFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const theta = uFraction * Math.PI * 2.0;\r\n const r = Geometry.interpolate(this._radiusA, vFraction, this._radiusB);\r\n const drdv = this._radiusB - this._radiusA;\r\n const cosTheta = Math.cos(theta);\r\n const sinTheta = Math.sin(theta);\r\n const fTheta = 2.0 * Math.PI;\r\n return Plane3dByOriginAndVectors.createOriginAndVectors(\r\n this._localToWorld.multiplyXYZ(r * cosTheta, r * sinTheta, vFraction),\r\n this._localToWorld.multiplyVectorXYZ(-r * sinTheta * fTheta, r * cosTheta * fTheta, 0),\r\n this._localToWorld.multiplyVectorXYZ(drdv * cosTheta, drdv * sinTheta, 1.0),\r\n result);\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped;\r\n }\r\n /**\r\n * Directional distance query\r\n * * u direction is around longitude circle at maximum distance from axis.\r\n * * v direction is on a line of longitude between the latitude limits.\r\n */\r\n public maxIsoParametricDistance(): Vector2d {\r\n const vectorX = this._localToWorld.matrix.columnX();\r\n const vectorY = this._localToWorld.matrix.columnY();\r\n const columnZ = this._localToWorld.matrix.columnZ();\r\n\r\n const xyNormal = vectorX.unitCrossProduct(vectorY)!;\r\n const hZ = xyNormal.dotProduct(columnZ);\r\n const zSkewVector = columnZ.plusScaled(xyNormal, hZ);\r\n const zSkewDistance = zSkewVector.magnitudeXY();\r\n return Vector2d.create(Math.PI * 2 * Math.max(this._radiusA, this._radiusB),\r\n Geometry.hypotenuseXY(Math.abs(this._radiusB - this._radiusA) + zSkewDistance, hZ));\r\n }\r\n}\r\n"]}