@itwin/core-geometry 5.3.0-dev.5 → 5.3.0-dev.7

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 (89) hide show
  1. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  2. package/lib/cjs/curve/Arc3d.js +5 -7
  3. package/lib/cjs/curve/Arc3d.js.map +1 -1
  4. package/lib/cjs/curve/CurveOps.d.ts +2 -5
  5. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  6. package/lib/cjs/curve/CurveOps.js +2 -5
  7. package/lib/cjs/curve/CurveOps.js.map +1 -1
  8. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +50 -15
  9. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  10. package/lib/cjs/curve/Query/PlanarSubdivision.js +102 -84
  11. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  12. package/lib/cjs/curve/RegionOps.d.ts +44 -25
  13. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  14. package/lib/cjs/curve/RegionOps.js +74 -39
  15. package/lib/cjs/curve/RegionOps.js.map +1 -1
  16. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  17. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
  18. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  19. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  20. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  21. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
  22. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  23. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -1
  24. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  25. package/lib/cjs/geometry3d/GrowableXYArray.js +2 -1
  26. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  27. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -1
  28. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  29. package/lib/cjs/geometry3d/GrowableXYZArray.js +2 -1
  30. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  31. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +9 -16
  32. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  33. package/lib/cjs/geometry3d/IndexedXYZCollection.js +3 -3
  34. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  35. package/lib/cjs/geometry3d/PolylineOps.d.ts +2 -2
  36. package/lib/cjs/geometry3d/PolylineOps.js +2 -2
  37. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  38. package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
  39. package/lib/cjs/numerics/ClusterableArray.js +2 -2
  40. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  41. package/lib/cjs/topology/Merging.d.ts +15 -7
  42. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  43. package/lib/cjs/topology/Merging.js +15 -10
  44. package/lib/cjs/topology/Merging.js.map +1 -1
  45. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  46. package/lib/esm/curve/Arc3d.js +5 -7
  47. package/lib/esm/curve/Arc3d.js.map +1 -1
  48. package/lib/esm/curve/CurveOps.d.ts +2 -5
  49. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  50. package/lib/esm/curve/CurveOps.js +2 -5
  51. package/lib/esm/curve/CurveOps.js.map +1 -1
  52. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +50 -15
  53. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  54. package/lib/esm/curve/Query/PlanarSubdivision.js +102 -84
  55. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  56. package/lib/esm/curve/RegionOps.d.ts +44 -25
  57. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  58. package/lib/esm/curve/RegionOps.js +72 -37
  59. package/lib/esm/curve/RegionOps.js.map +1 -1
  60. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  61. package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
  62. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  63. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  64. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  65. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
  66. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  67. package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -1
  68. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  69. package/lib/esm/geometry3d/GrowableXYArray.js +2 -1
  70. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  71. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -1
  72. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  73. package/lib/esm/geometry3d/GrowableXYZArray.js +2 -1
  74. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  75. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +9 -16
  76. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  77. package/lib/esm/geometry3d/IndexedXYZCollection.js +3 -3
  78. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  79. package/lib/esm/geometry3d/PolylineOps.d.ts +2 -2
  80. package/lib/esm/geometry3d/PolylineOps.js +2 -2
  81. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  82. package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
  83. package/lib/esm/numerics/ClusterableArray.js +2 -2
  84. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  85. package/lib/esm/topology/Merging.d.ts +15 -7
  86. package/lib/esm/topology/Merging.d.ts.map +1 -1
  87. package/lib/esm/topology/Merging.js +15 -10
  88. package/lib/esm/topology/Merging.js.map +1 -1
  89. package/package.json +3 -3
@@ -118,8 +118,8 @@ export declare class PolylineOps {
118
118
  * Checks if all points are colinear.
119
119
  * * This test does not take point order into account.
120
120
  * @param points array of points to check.
121
- * @param distanceTol tolerance for co-linearity check, default is Geometry.smallMetricDistance.
122
- * @param xyOnly if true, only XY coordinates are used for the check, ignoring z coordinate.
121
+ * @param distanceTol maximum allowable distance that geometry can deviate from colinearity.Default is [[Geometry.smallMetricDistance]].
122
+ * @param xyOnly whether to ignore z-coordinates in the colinearity test.
123
123
  */
124
124
  static isColinear(points: Point3d[], distanceTol?: number, xyOnly?: boolean): boolean;
125
125
  }
@@ -355,8 +355,8 @@ class PolylineOps {
355
355
  * Checks if all points are colinear.
356
356
  * * This test does not take point order into account.
357
357
  * @param points array of points to check.
358
- * @param distanceTol tolerance for co-linearity check, default is Geometry.smallMetricDistance.
359
- * @param xyOnly if true, only XY coordinates are used for the check, ignoring z coordinate.
358
+ * @param distanceTol maximum allowable distance that geometry can deviate from colinearity.Default is [[Geometry.smallMetricDistance]].
359
+ * @param xyOnly whether to ignore z-coordinates in the colinearity test.
360
360
  */
361
361
  static isColinear(points, distanceTol = Geometry_1.Geometry.smallMetricDistance, xyOnly = false) {
362
362
  if (points.length < 3)
@@ -1 +1 @@
1
- {"version":3,"file":"PolylineOps.js","sourceRoot":"","sources":["../../../src/geometry3d/PolylineOps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,8DAA4G;AAE5G,gDAA6C;AAC7C,0DAAuD;AACvD,wDAAqD;AACrD,0CAAuC;AACvC,yDAAsD;AAEtD,iFAA8E;AAC9E,+DAA4D;AAC5D,uDAAsD;AACtD,uFAA+E;AAC/E,mCAAkC;AAElC,sBAAsB;AACtB;;;GAGG;AACH,MAAa,WAAW;IACtB;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,MAAiB;QAC7C,MAAM,KAAK,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;;;OASG;IACI,MAAM,CAAC,oBAAoB,CAAC,MAAiB,EAAE,iBAAyB,mBAAQ,CAAC,mBAAmB,EAAE,WAAoB,KAAK;QACpI,OAAO,4DAA0B,CAAC,gCAAgC,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IACvG,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,kBAAkB,CAAC,MAAwC,EAAE,aAAqB;QAC9F,MAAM,IAAI,GAAG,mCAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,4DAA0B,CAAC,gCAAgC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CAAC,MAAiB,EAAE,eAAuB;QAC7E,MAAM,IAAI,GAAG,mCAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,4DAA0B,CAAC,kCAAkC,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,+BAA+B,CAAC,MAAiB,EAAE,WAAmB,EAAE,UAAkB,CAAC;QACvG,MAAM,IAAI,GAAG,mCAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACvB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1C,4DAA0B,CAAC,sCAAsC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YACzB,IAAI,IAAI,KAAK,IAAI;gBACf,MAAM;YACR,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IACO,MAAM,CAAC,kCAAkC,CAAC,MAAe,EAAE,MAAe,EAAE,QAAgB,EAAE,MAAe;QACnH,MAAM,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC;IACD;;;;;;;OAOG;IACK,MAAM,CAAC,sBAAsB,CAAC,MAAiB,EAAE,MAAc,EAAE,MAAc,EAAE,MAAe,EAAE,wBAAgC;QACxI,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM;YACvC,OAAO,KAAK,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,yBAAyB;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,GAAG,IAAI,wBAAwB;YACjC,OAAO,IAAI,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM;YACvC,OAAO,KAAK,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,6GAA6G;QAC7G,EAAE;QACF,YAAY;QACZ,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,0DAA0D;QAC1D,IAAI,GAAG,IAAI,GAAG;YACZ,OAAO,KAAK,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,eAAe,CAAC;QACpB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,iFAAiF;YACjF,+EAA+E;YAC/E,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,8CAA8C;YAC1E,eAAe,GAAG,IAAI,CAAC,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,2DAA2D;YAC3D,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;YAC3B,eAAe,GAAG,IAAI,CAAC,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,eAAe,GAAG,wBAAwB,CAAC;IACpD,CAAC;IACD;;;;;SAKK;IACE,MAAM,CAAC,gBAAgB,CAAC,MAAiB,EAAE,SAAkB,KAAK,EAAE,YAAoB,mBAAQ,CAAC,mBAAmB;QACzH,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,CAAC;QACvD,IAAI,MAAM;YACR,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,wBAAwB;gBAClF,CAAC,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC;gBAC5G,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,0CAA0C;YAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,OAAO,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC,EAAE,CAAC;oBAC5G,SAAS,EAAE,CAAC;gBACd,CAAC;qBAAM,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,wBAAwB,CAAC,EAAE,CAAC;oBACpH,UAAU,EAAE,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAC9B,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC;YAC/B,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,IAA6B;QACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YACnB,OAAO;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACtB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,YAAY,yBAAO,IAAI,EAAE,YAAY,yBAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3E,IAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAAC,IAA6B;QAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YACnB,OAAO;QACT,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,YAAY,yBAAO,IAAI,EAAE,YAAY,yBAAO,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1E,IAAkB,CAAC,GAAG,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IACD;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,qCAAqC,CACjD,UAA4C,EAAE,yBAAkC,KAAK;QAErF,MAAM,YAAY,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,mBAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAE,2DAA2D;QACjK,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,MAAM,cAAc,GAAmC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,0BAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAE,CAAC;QAClE,MAAM,cAAc,GAAG,2DAA4B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAE,CAAC;QAC5E,MAAM,cAAc,GAAG,2DAA4B,CAAC,aAAa,EAAE,CAAC;QACpE,wCAAwC;QACxC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5C,kEAAkE;QAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,0BAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAChF,0GAA0G;YAC1G,IAAI,SAAS,KAAK,2DAA4B,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC/F,MAAM,iBAAiB,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;gBACxG,MAAM,gBAAgB,GAAG,2DAA4B,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBACjG,IAAI,SAAS,KAAK,gBAAgB;oBAChC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACxC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,gEAAgE;QAChE,cAAc,CAAC,IAAI,CAAC,2DAA4B,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,YAAY,EAAE,CAAE,CAAC,CAAC;QAChI,+FAA+F;QAC/F,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,IAAI,SAAS,GAAG,CAAC,IAAI,sBAAsB,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,mBAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;gBAChF,MAAM,iBAAiB,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,iCAAiC;gBACrH,MAAM,gBAAgB,GAAG,2DAA4B,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,iBAAiB,CAAC,CAAC;gBAC3G,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;oBACnC,cAAc,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;oBACrC,cAAc,CAAC,SAAS,CAAC,GAAG,2DAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,iBAAiB,CAAE,CAAC;gBAChH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAEO,MAAM,CAAC,aAAa,CAAiB;IACrC,MAAM,CAAC,aAAa,CAAiB;IACrC,MAAM,CAAC,oBAAoB,CAA2B;IAC9D;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,eAAe,CAC3B,OAAyC,EACzC,OAAoC,EACpC,OAAyC,EACzC,OAAoC,EACpC,OAAe,MAAM,CAAC,SAAS,EAC/B,MAAgC;QAEhC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACxB,OAAO,GAAG,IAAI,yCAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACxB,OAAO,GAAG,IAAI,yCAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,CAAC,iCAAe,CAAC,IAAI,EAAE,iCAAe,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,CAAC,iCAAe,CAAC,IAAI,EAAE,iCAAe,CAAC,IAAI,CAAC,CAAC;QAChE,mEAAmE;QACnE,MAAM,aAAa,GAAG,CAAC,SAA4B,EAAE,QAAqC,EAAE,YAAoB,EAAE,WAAmB,EAAE,EAAE;YACvI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,iCAAe,CAAC,IAAI,CAAC;YACnD,IAAI,YAAY,KAAK,CAAC;gBACpB,SAAS,CAAC,CAAC,CAAC,GAAG,oCAAkB,CAAC,mDAAmD,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;iBAChG,IAAI,YAAY,KAAK,WAAW,GAAG,CAAC;gBACvC,SAAS,CAAC,CAAC,CAAC,GAAG,oCAAkB,CAAC,mDAAmD,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC;QACF,gDAAgD;QAChD,MAAM,WAAW,GAAG,CAAC,MAA4B,EAAE,KAAa,EAAE,OAAkC,EAAiB,EAAE;YACrH,IAAI,OAAO,KAAK,SAAS;gBACvB,OAAO,6BAAa,CAAC,aAAa,CAAC,MAAM,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,+BAA+B,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACvI,MAAM,CAAC,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,+BAA+B,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACrE,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,yBAAyB;QACzB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACtE,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACxD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;gBACpD,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtE,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBACxD,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,6BAAa,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC;oBACzK,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC9C,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;wBACb,MAAM,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,iBAAiB;wBACnE,MAAM,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC;wBACjD,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B;wBAC9E,2BAAY,CAAC,0BAA0B,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;wBACtG,2BAAY,CAAC,0BAA0B,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;wBACtG,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW;4BAC1D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,uCAAuC;wBAC1H,IAAI,GAAG,CAAC,CAAC;wBACT,QAAQ,GAAG,IAAI,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,UAAU,CACtB,MAAiB,EAAE,cAAsB,mBAAQ,CAAC,mBAAmB,EAAE,SAAkB,KAAK;QAE9F,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,OAAO,SAAS,KAAK,mBAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACtG,CAAC;CACF;AA7VD,kCA6VC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"../curve/CurveExtendMode\";\nimport { CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { CurveOps } from \"../curve/CurveOps\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"./IndexedXYZCollection\";\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { PolylineCompressionContext } from \"./PolylineCompressionByEdgeOffset\";\nimport { Range1d } from \"./Range\";\n\n// cspell:word Puecker\n/**\n * PolylineOps is a collection of static methods operating on polylines.\n * @public\n */\nexport class PolylineOps {\n /**\n * Return a Range1d with the shortest and longest edge lengths of the polyline.\n * @param points points to examine.\n */\n public static edgeLengthRange(points: Point3d[]): Range1d {\n const range = Range1d.createNull();\n for (let i = 1; i < points.length; i++) {\n range.extendX(points[i - 1].distance(points[i]));\n }\n return range;\n }\n /**\n * Return a simplified subset of given points.\n * * Points are removed by the Douglas-Puecker algorithm, viz https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm\n * * This is a global search, with multiple passes over the data.\n * @param source input points.\n * @param chordTolerance Points less than this distance from a retained edge may be ignored.\n * Default is [[Geometry.smallMetricDistance]].\n * @param keepSeam whether to preserve the endpoints of physically closed input.\n * Default is false, meaning physically closed input points are treated cyclically, allowing removal of the seam.\n */\n public static compressByChordError(source: Point3d[], chordTolerance: number = Geometry.smallMetricDistance, keepSeam: boolean = false): Point3d[] {\n return PolylineCompressionContext.compressPoint3dArrayByChordError(source, chordTolerance, keepSeam);\n }\n /**\n * Return a simplified subset of given points, omitting a point if very close to its predecessor.\n * * This is a local search, with a single pass over the data.\n * * First and last points are always retained.\n * @param source input points\n * @param maxEdgeLength length of largest edge to be compressed out\n * @see [[GrowableXYZArray.cloneCompressed]]\n */\n public static compressShortEdges(source: Point3d[] | IndexedXYZCollection, maxEdgeLength: number): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dest, maxEdgeLength);\n return dest.getPoint3dArray();\n }\n /**\n * Return a simplified subset of given points, omitting the middle of three successive points if the triangle they form is small.\n * * This is a local search, with a single pass over the data.\n * @param source input points\n * @param maxTriangleArea area of largest triangle to compress\n */\n public static compressSmallTriangles(source: Point3d[], maxTriangleArea: number): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n PolylineCompressionContext.compressInPlaceBySmallTriangleArea(dest, maxTriangleArea);\n return dest.getPoint3dArray();\n }\n\n /**\n * Return a simplified subset of given points, omitting points if close to the edge between neighboring points before and after\n * * This is a local search, with a single pass over the data for each pass.\n * @param source input points\n * @param maxDistance omit points if this close to edge between points before and after\n * @param numPass max number of times to run the filter. numPass=2 is observed to behave well.\n *\n */\n public static compressByPerpendicularDistance(source: Point3d[], maxDistance: number, numPass: number = 2): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n let num0 = dest.length;\n for (let pass = 0; pass < numPass; pass++) {\n PolylineCompressionContext.compressInPlaceByPerpendicularDistance(dest, maxDistance);\n const num1 = dest.length;\n if (num1 === num0)\n break;\n num0 = num1;\n }\n return dest.getPoint3dArray();\n }\n private static squaredDistanceToInterpolatedPoint(pointQ: Point3d, point0: Point3d, fraction: number, point1: Point3d): number {\n const g = 1.0 - fraction;\n const dx = pointQ.x - (g * point0.x + fraction * point1.x);\n const dy = pointQ.y - (g * point0.y + fraction * point1.y);\n const dz = pointQ.z - (g * point0.z + fraction * point1.z);\n return dx * dx + dy * dy + dz * dz;\n }\n /**\n * test if either\n * * points[indexA] matches pointQ\n * * line from points[indexA] to points[indexB] overlaps points[indexA] to pointQ\n * @param points\n * @param pointQ\n * @param tolerance\n */\n private static isDanglerConfiguration(points: Point3d[], indexA: number, indexB: number, pointQ: Point3d, squaredDistanceTolerance: number): boolean {\n if (indexA < 0 || indexA >= points.length)\n return false;\n const pointA = points[indexA];\n // simple point match ...\n const d2Q = pointA.distanceSquared(pointQ);\n if (d2Q <= squaredDistanceTolerance)\n return true;\n if (indexB < 0 || indexB >= points.length)\n return false;\n const pointB = points[indexB];\n // The expensive test .. does newPoint double back to an interior or extrapolation of the final dest segment?\n //\n // or pointQ\n const dot = pointA.dotVectorsToTargets(pointB, pointQ);\n // simple case -- pointB..pointA..pointQ continues forward\n if (dot <= 0.0)\n return false;\n const d2B = pointA.distanceSquared(pointB);\n let distanceSquared;\n if (d2Q >= d2B) {\n // pointB----------------------------------->>>>>>> pointA\n // pointQ<<<<---------------------------------------------------------\n const fraction = dot / d2Q; // safe to divide because of earlier d2Q test.\n distanceSquared = this.squaredDistanceToInterpolatedPoint(pointB, pointA, fraction, pointQ);\n } else {\n // pointB----------------------------------->>>>>>> pointA\n // pointQ<<<<----------------------\n const fraction = dot / d2B;\n distanceSquared = this.squaredDistanceToInterpolatedPoint(pointQ, pointA, fraction, pointB);\n }\n return distanceSquared < squaredDistanceTolerance;\n }\n /**\n * Return a simplified subset of given points, omitting points on \"danglers\" that depart and return on a single path.\n * @param source input points\n * @param closed if true, an edge returning to point 0 is implied even if final point does not match.\n * @param tolerance tolerance for near-zero distance.\n */\n public static compressDanglers(source: Point3d[], closed: boolean = false, tolerance: number = Geometry.smallMetricDistance): Point3d[] {\n let n = source.length;\n const squaredDistanceTolerance = tolerance * tolerance;\n if (closed)\n while (n > 1 && source[n - 1].distanceSquared(source[0]) <= squaredDistanceTolerance)\n n--;\n const dest = [];\n dest.push(source[0].clone());\n for (let i = 1; i < n; i++) {\n const newPoint = source[i];\n while (this.isDanglerConfiguration(dest, dest.length - 1, dest.length - 2, newPoint, squaredDistanceTolerance))\n dest.pop();\n dest.push(newPoint.clone());\n }\n if (closed) {\n // No purge moving backwards. Last point\n let leftIndex = 0;\n let rightIndex = dest.length - 1;\n while (rightIndex > leftIndex + 2) {\n if (this.isDanglerConfiguration(dest, leftIndex, leftIndex + 1, dest[rightIndex], squaredDistanceTolerance)) {\n leftIndex++;\n } else if (this.isDanglerConfiguration(dest, rightIndex, rightIndex - 1, dest[leftIndex], squaredDistanceTolerance)) {\n rightIndex--;\n } else {\n break;\n }\n }\n if (rightIndex + 1 < dest.length)\n dest.length = rightIndex + 1;\n if (leftIndex > 0) {\n dest.splice(0, leftIndex);\n }\n }\n return dest;\n }\n /**\n * Add closure points to a polyline or array of polylines\n * @param data points.\n */\n public static addClosurePoint(data: Point3d[] | Point3d[][]) {\n if (data.length === 0)\n return;\n const q0 = data[0];\n if (Array.isArray(q0)) {\n for (const child of data) {\n if (Array.isArray(child))\n this.addClosurePoint(child);\n }\n return;\n }\n const q1 = data[data.length - 1];\n if (q0 instanceof Point3d && q1 instanceof Point3d && !q0.isAlmostEqual(q1)) {\n (data as Point3d[]).push(q0.clone());\n }\n }\n /**\n * Remove closure points of a polyline or array of polylines\n * @param data points.\n */\n public static removeClosurePoint(data: Point3d[] | Point3d[][]) {\n if (data.length === 0)\n return;\n const q0 = data[0];\n if (Array.isArray(q0)) {\n for (const child of data) {\n if (Array.isArray(child))\n this.removeClosurePoint(child);\n }\n return;\n }\n const q1 = data[data.length - 1];\n if (q0 instanceof Point3d && q1 instanceof Point3d && q0.isAlmostEqual(q1)) {\n (data as Point3d[]).pop();\n }\n }\n /**\n * Create an array of planes.\n * * First plane has origin at first centerline point, with unit normal directed at the next point.\n * * Intermediate planes have origin at intermediate points, with unit normals computed from the average of unit vectors\n * along the incoming and outgoing segments.\n * * Last plane has origin at last centerline point, with unit normal directed from previous point.\n * * All sets of adjacent coincident points are reduced to a single point.\n * * Hence the output array may have fewer points than the centerline.\n * * If there are one or fewer distinct input points, the return is undefined.\n * @param centerline points to reside in output planes.\n * @param wrapIfPhysicallyClosed if true and the first and last centerline points are the same, then the first and last\n * output planes are averaged and equated (cloned). Default false.\n */\n public static createBisectorPlanesForDistinctPoints(\n centerline: IndexedXYZCollection | Point3d[], wrapIfPhysicallyClosed: boolean = false,\n ): Plane3dByOriginAndUnitNormal[] | undefined {\n const packedPoints = PolylineOps.compressShortEdges(centerline, 2.0 * Geometry.smallMetricDistance); // double the tolerance to ensure normalized vectors exist.\n if (packedPoints.length < 2)\n return undefined;\n const bisectorPlanes: Plane3dByOriginAndUnitNormal[] = [];\n const point0 = packedPoints[0];\n const point1 = packedPoints[1];\n const unit01 = Vector3d.createNormalizedStartEnd(point0, point1)!;\n const perpendicular0 = Plane3dByOriginAndUnitNormal.create(point0, unit01)!;\n const perpendicular1 = Plane3dByOriginAndUnitNormal.createXYPlane();\n // FIRST point gets simple perpendicular\n bisectorPlanes.push(perpendicular0.clone());\n // Each intermediate point gets average of adjacent perpendiculars\n for (let i = 1; i + 1 < packedPoints.length; i++) {\n Vector3d.createNormalizedStartEnd(packedPoints[i], packedPoints[i + 1], unit01);\n // remark: the prior pack should ensure the normalization is ok. But if it fails, we ignore this point...\n if (undefined !== Plane3dByOriginAndUnitNormal.create(packedPoints[i], unit01, perpendicular1)) {\n const newBisectorNormal = perpendicular0.getNormalRef().interpolate(0.5, perpendicular1.getNormalRef());\n const newBisectorPlane = Plane3dByOriginAndUnitNormal.create(packedPoints[i], newBisectorNormal);\n if (undefined !== newBisectorPlane)\n bisectorPlanes.push(newBisectorPlane);\n perpendicular0.setFrom(perpendicular1);\n }\n }\n // LAST point gets simple perpendicular inherited from last pass\n bisectorPlanes.push(Plane3dByOriginAndUnitNormal.create(packedPoints[packedPoints.length - 1], perpendicular0.getNormalRef())!);\n // reset end planes to their average plane, but leave them alone if the closure point is a cusp\n const lastIndex = bisectorPlanes.length - 1;\n if (lastIndex > 0 && wrapIfPhysicallyClosed) {\n const firstPlane = bisectorPlanes[0];\n const lastPlane = bisectorPlanes[lastIndex];\n if (Geometry.isSamePoint3d(firstPlane.getOriginRef(), lastPlane.getOriginRef())) {\n const newBisectorNormal = firstPlane.getNormalRef().plus(lastPlane.getNormalRef()); // could be zero vector at a cusp\n const newBisectorPlane = Plane3dByOriginAndUnitNormal.create(firstPlane.getOriginRef(), newBisectorNormal);\n if (undefined !== newBisectorPlane) {\n bisectorPlanes[0] = newBisectorPlane;\n bisectorPlanes[lastIndex] = Plane3dByOriginAndUnitNormal.create(lastPlane.getOriginRef(), newBisectorNormal)!;\n }\n }\n }\n return bisectorPlanes.length > 1 ? bisectorPlanes : undefined;\n }\n\n private static _workSegmentA?: LineSegment3d;\n private static _workSegmentB?: LineSegment3d;\n private static _workLocalDetailPair?: CurveLocationDetailPair;\n /**\n * Find smallest distance between polylines.\n * * For polylines with many points, it is more efficient to use [[LineString3dRangeTreeContext.searchForClosestApproach]].\n * @param pointsA first polyline\n * @param extendA how to extend polylineA forward/backward\n * @param pointsB second polyline\n * @param extendB how to extend polylineB forward/backward\n * @param dMax largest approach distance to consider\n * @param result optional pre-allocated object to populate and return\n * @returns pair of details, one for each polyline, with field values:\n * * `a` is the closest approach distance\n * * `point` is the point of closest approach\n * * `fraction` is the global polyline fraction\n * * `childDetail.a` is the segment index\n * * `childDetail.fraction` is the local segment fraction\n */\n public static closestApproach(\n pointsA: Point3d[] | IndexedXYZCollection,\n extendA: VariantCurveExtendParameter,\n pointsB: Point3d[] | IndexedXYZCollection,\n extendB: VariantCurveExtendParameter,\n dMax: number = Number.MAX_VALUE,\n result?: CurveLocationDetailPair,\n ): CurveLocationDetailPair | undefined {\n if (Array.isArray(pointsA))\n pointsA = new Point3dArrayCarrier(pointsA);\n if (Array.isArray(pointsB))\n pointsB = new Point3dArrayCarrier(pointsB);\n let dMin = dMax;\n let foundMin = false;\n const numSegmentA = pointsA.length - 1;\n const numSegmentB = pointsB.length - 1;\n const extendSegA = [CurveExtendMode.None, CurveExtendMode.None];\n const extendSegB = [CurveExtendMode.None, CurveExtendMode.None];\n // lambda to set extension for first and last segment of a polyline\n const convertExtend = (extendOut: CurveExtendMode[], extendIn: VariantCurveExtendParameter, segmentIndex: number, numSegments: number) => {\n extendOut[0] = extendOut[1] = CurveExtendMode.None;\n if (segmentIndex === 0)\n extendOut[0] = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extendIn, 0);\n else if (segmentIndex === numSegments - 1)\n extendOut[1] = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extendIn, 1);\n };\n // lambda to extract LineSegment3d from polyline\n const fillSegment = (points: IndexedXYZCollection, index: number, segment: LineSegment3d | undefined): LineSegment3d => {\n if (segment === undefined)\n return LineSegment3d.createCapture(points.getPoint3dAtUncheckedPointIndex(index), points.getPoint3dAtUncheckedPointIndex(index + 1));\n points.getPoint3dAtUncheckedPointIndex(index, segment.point0Ref);\n points.getPoint3dAtUncheckedPointIndex(index + 1, segment.point1Ref);\n return segment;\n };\n // just test the segments\n for (let indexA = 0; indexA < numSegmentA; indexA++) {\n this._workSegmentA = fillSegment(pointsA, indexA, this._workSegmentA);\n convertExtend(extendSegA, extendA, indexA, numSegmentA);\n for (let indexB = 0; indexB < numSegmentB; indexB++) {\n this._workSegmentB = fillSegment(pointsB, indexB, this._workSegmentB);\n convertExtend(extendSegB, extendB, indexB, numSegmentB);\n if (undefined !== (this._workLocalDetailPair = LineSegment3d.closestApproach(this._workSegmentA, extendSegA, this._workSegmentB, extendSegB, this._workLocalDetailPair))) {\n const d = this._workLocalDetailPair.detailA.a;\n if (d < dMin) {\n const childDetailA = result?.detailA.childDetail; // save and reuse\n const childDetailB = result?.detailB.childDetail;\n result = this._workLocalDetailPair.clone(result); // overwrite previous result\n LineString3d.convertLocalToGlobalDetail(result.detailA, indexA, numSegmentA, undefined, childDetailA);\n LineString3d.convertLocalToGlobalDetail(result.detailB, indexB, numSegmentB, undefined, childDetailB);\n if (result.detailA.childDetail && result.detailB.childDetail)\n result.detailA.childDetail.curve = result.detailB.childDetail.curve = undefined; // no CurvePrimitives survive in output\n dMin = d;\n foundMin = true;\n }\n }\n }\n }\n return foundMin ? result : undefined;\n }\n /**\n * Checks if all points are colinear.\n * * This test does not take point order into account.\n * @param points array of points to check.\n * @param distanceTol tolerance for co-linearity check, default is Geometry.smallMetricDistance.\n * @param xyOnly if true, only XY coordinates are used for the check, ignoring z coordinate.\n */\n public static isColinear(\n points: Point3d[], distanceTol: number = Geometry.smallMetricDistance, xyOnly: boolean = false,\n ): boolean {\n if (points.length < 3)\n return true;\n return undefined !== CurveOps.isColinear(points, { maxDeviation: distanceTol, xyColinear: xyOnly });\n }\n}\n"]}
1
+ {"version":3,"file":"PolylineOps.js","sourceRoot":"","sources":["../../../src/geometry3d/PolylineOps.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"../curve/CurveExtendMode\";\nimport { CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\nimport { CurveOps } from \"../curve/CurveOps\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { IndexedXYZCollection } from \"./IndexedXYZCollection\";\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\nimport { Point3dArrayCarrier } from \"./Point3dArrayCarrier\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { PolylineCompressionContext } from \"./PolylineCompressionByEdgeOffset\";\nimport { Range1d } from \"./Range\";\n\n// cspell:word Puecker\n/**\n * PolylineOps is a collection of static methods operating on polylines.\n * @public\n */\nexport class PolylineOps {\n /**\n * Return a Range1d with the shortest and longest edge lengths of the polyline.\n * @param points points to examine.\n */\n public static edgeLengthRange(points: Point3d[]): Range1d {\n const range = Range1d.createNull();\n for (let i = 1; i < points.length; i++) {\n range.extendX(points[i - 1].distance(points[i]));\n }\n return range;\n }\n /**\n * Return a simplified subset of given points.\n * * Points are removed by the Douglas-Puecker algorithm, viz https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm\n * * This is a global search, with multiple passes over the data.\n * @param source input points.\n * @param chordTolerance Points less than this distance from a retained edge may be ignored.\n * Default is [[Geometry.smallMetricDistance]].\n * @param keepSeam whether to preserve the endpoints of physically closed input.\n * Default is false, meaning physically closed input points are treated cyclically, allowing removal of the seam.\n */\n public static compressByChordError(source: Point3d[], chordTolerance: number = Geometry.smallMetricDistance, keepSeam: boolean = false): Point3d[] {\n return PolylineCompressionContext.compressPoint3dArrayByChordError(source, chordTolerance, keepSeam);\n }\n /**\n * Return a simplified subset of given points, omitting a point if very close to its predecessor.\n * * This is a local search, with a single pass over the data.\n * * First and last points are always retained.\n * @param source input points\n * @param maxEdgeLength length of largest edge to be compressed out\n * @see [[GrowableXYZArray.cloneCompressed]]\n */\n public static compressShortEdges(source: Point3d[] | IndexedXYZCollection, maxEdgeLength: number): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n PolylineCompressionContext.compressInPlaceByShortEdgeLength(dest, maxEdgeLength);\n return dest.getPoint3dArray();\n }\n /**\n * Return a simplified subset of given points, omitting the middle of three successive points if the triangle they form is small.\n * * This is a local search, with a single pass over the data.\n * @param source input points\n * @param maxTriangleArea area of largest triangle to compress\n */\n public static compressSmallTriangles(source: Point3d[], maxTriangleArea: number): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n PolylineCompressionContext.compressInPlaceBySmallTriangleArea(dest, maxTriangleArea);\n return dest.getPoint3dArray();\n }\n\n /**\n * Return a simplified subset of given points, omitting points if close to the edge between neighboring points before and after\n * * This is a local search, with a single pass over the data for each pass.\n * @param source input points\n * @param maxDistance omit points if this close to edge between points before and after\n * @param numPass max number of times to run the filter. numPass=2 is observed to behave well.\n *\n */\n public static compressByPerpendicularDistance(source: Point3d[], maxDistance: number, numPass: number = 2): Point3d[] {\n const dest = GrowableXYZArray.create(source);\n let num0 = dest.length;\n for (let pass = 0; pass < numPass; pass++) {\n PolylineCompressionContext.compressInPlaceByPerpendicularDistance(dest, maxDistance);\n const num1 = dest.length;\n if (num1 === num0)\n break;\n num0 = num1;\n }\n return dest.getPoint3dArray();\n }\n private static squaredDistanceToInterpolatedPoint(pointQ: Point3d, point0: Point3d, fraction: number, point1: Point3d): number {\n const g = 1.0 - fraction;\n const dx = pointQ.x - (g * point0.x + fraction * point1.x);\n const dy = pointQ.y - (g * point0.y + fraction * point1.y);\n const dz = pointQ.z - (g * point0.z + fraction * point1.z);\n return dx * dx + dy * dy + dz * dz;\n }\n /**\n * test if either\n * * points[indexA] matches pointQ\n * * line from points[indexA] to points[indexB] overlaps points[indexA] to pointQ\n * @param points\n * @param pointQ\n * @param tolerance\n */\n private static isDanglerConfiguration(points: Point3d[], indexA: number, indexB: number, pointQ: Point3d, squaredDistanceTolerance: number): boolean {\n if (indexA < 0 || indexA >= points.length)\n return false;\n const pointA = points[indexA];\n // simple point match ...\n const d2Q = pointA.distanceSquared(pointQ);\n if (d2Q <= squaredDistanceTolerance)\n return true;\n if (indexB < 0 || indexB >= points.length)\n return false;\n const pointB = points[indexB];\n // The expensive test .. does newPoint double back to an interior or extrapolation of the final dest segment?\n //\n // or pointQ\n const dot = pointA.dotVectorsToTargets(pointB, pointQ);\n // simple case -- pointB..pointA..pointQ continues forward\n if (dot <= 0.0)\n return false;\n const d2B = pointA.distanceSquared(pointB);\n let distanceSquared;\n if (d2Q >= d2B) {\n // pointB----------------------------------->>>>>>> pointA\n // pointQ<<<<---------------------------------------------------------\n const fraction = dot / d2Q; // safe to divide because of earlier d2Q test.\n distanceSquared = this.squaredDistanceToInterpolatedPoint(pointB, pointA, fraction, pointQ);\n } else {\n // pointB----------------------------------->>>>>>> pointA\n // pointQ<<<<----------------------\n const fraction = dot / d2B;\n distanceSquared = this.squaredDistanceToInterpolatedPoint(pointQ, pointA, fraction, pointB);\n }\n return distanceSquared < squaredDistanceTolerance;\n }\n /**\n * Return a simplified subset of given points, omitting points on \"danglers\" that depart and return on a single path.\n * @param source input points\n * @param closed if true, an edge returning to point 0 is implied even if final point does not match.\n * @param tolerance tolerance for near-zero distance.\n */\n public static compressDanglers(source: Point3d[], closed: boolean = false, tolerance: number = Geometry.smallMetricDistance): Point3d[] {\n let n = source.length;\n const squaredDistanceTolerance = tolerance * tolerance;\n if (closed)\n while (n > 1 && source[n - 1].distanceSquared(source[0]) <= squaredDistanceTolerance)\n n--;\n const dest = [];\n dest.push(source[0].clone());\n for (let i = 1; i < n; i++) {\n const newPoint = source[i];\n while (this.isDanglerConfiguration(dest, dest.length - 1, dest.length - 2, newPoint, squaredDistanceTolerance))\n dest.pop();\n dest.push(newPoint.clone());\n }\n if (closed) {\n // No purge moving backwards. Last point\n let leftIndex = 0;\n let rightIndex = dest.length - 1;\n while (rightIndex > leftIndex + 2) {\n if (this.isDanglerConfiguration(dest, leftIndex, leftIndex + 1, dest[rightIndex], squaredDistanceTolerance)) {\n leftIndex++;\n } else if (this.isDanglerConfiguration(dest, rightIndex, rightIndex - 1, dest[leftIndex], squaredDistanceTolerance)) {\n rightIndex--;\n } else {\n break;\n }\n }\n if (rightIndex + 1 < dest.length)\n dest.length = rightIndex + 1;\n if (leftIndex > 0) {\n dest.splice(0, leftIndex);\n }\n }\n return dest;\n }\n /**\n * Add closure points to a polyline or array of polylines\n * @param data points.\n */\n public static addClosurePoint(data: Point3d[] | Point3d[][]) {\n if (data.length === 0)\n return;\n const q0 = data[0];\n if (Array.isArray(q0)) {\n for (const child of data) {\n if (Array.isArray(child))\n this.addClosurePoint(child);\n }\n return;\n }\n const q1 = data[data.length - 1];\n if (q0 instanceof Point3d && q1 instanceof Point3d && !q0.isAlmostEqual(q1)) {\n (data as Point3d[]).push(q0.clone());\n }\n }\n /**\n * Remove closure points of a polyline or array of polylines\n * @param data points.\n */\n public static removeClosurePoint(data: Point3d[] | Point3d[][]) {\n if (data.length === 0)\n return;\n const q0 = data[0];\n if (Array.isArray(q0)) {\n for (const child of data) {\n if (Array.isArray(child))\n this.removeClosurePoint(child);\n }\n return;\n }\n const q1 = data[data.length - 1];\n if (q0 instanceof Point3d && q1 instanceof Point3d && q0.isAlmostEqual(q1)) {\n (data as Point3d[]).pop();\n }\n }\n /**\n * Create an array of planes.\n * * First plane has origin at first centerline point, with unit normal directed at the next point.\n * * Intermediate planes have origin at intermediate points, with unit normals computed from the average of unit vectors\n * along the incoming and outgoing segments.\n * * Last plane has origin at last centerline point, with unit normal directed from previous point.\n * * All sets of adjacent coincident points are reduced to a single point.\n * * Hence the output array may have fewer points than the centerline.\n * * If there are one or fewer distinct input points, the return is undefined.\n * @param centerline points to reside in output planes.\n * @param wrapIfPhysicallyClosed if true and the first and last centerline points are the same, then the first and last\n * output planes are averaged and equated (cloned). Default false.\n */\n public static createBisectorPlanesForDistinctPoints(\n centerline: IndexedXYZCollection | Point3d[], wrapIfPhysicallyClosed: boolean = false,\n ): Plane3dByOriginAndUnitNormal[] | undefined {\n const packedPoints = PolylineOps.compressShortEdges(centerline, 2.0 * Geometry.smallMetricDistance); // double the tolerance to ensure normalized vectors exist.\n if (packedPoints.length < 2)\n return undefined;\n const bisectorPlanes: Plane3dByOriginAndUnitNormal[] = [];\n const point0 = packedPoints[0];\n const point1 = packedPoints[1];\n const unit01 = Vector3d.createNormalizedStartEnd(point0, point1)!;\n const perpendicular0 = Plane3dByOriginAndUnitNormal.create(point0, unit01)!;\n const perpendicular1 = Plane3dByOriginAndUnitNormal.createXYPlane();\n // FIRST point gets simple perpendicular\n bisectorPlanes.push(perpendicular0.clone());\n // Each intermediate point gets average of adjacent perpendiculars\n for (let i = 1; i + 1 < packedPoints.length; i++) {\n Vector3d.createNormalizedStartEnd(packedPoints[i], packedPoints[i + 1], unit01);\n // remark: the prior pack should ensure the normalization is ok. But if it fails, we ignore this point...\n if (undefined !== Plane3dByOriginAndUnitNormal.create(packedPoints[i], unit01, perpendicular1)) {\n const newBisectorNormal = perpendicular0.getNormalRef().interpolate(0.5, perpendicular1.getNormalRef());\n const newBisectorPlane = Plane3dByOriginAndUnitNormal.create(packedPoints[i], newBisectorNormal);\n if (undefined !== newBisectorPlane)\n bisectorPlanes.push(newBisectorPlane);\n perpendicular0.setFrom(perpendicular1);\n }\n }\n // LAST point gets simple perpendicular inherited from last pass\n bisectorPlanes.push(Plane3dByOriginAndUnitNormal.create(packedPoints[packedPoints.length - 1], perpendicular0.getNormalRef())!);\n // reset end planes to their average plane, but leave them alone if the closure point is a cusp\n const lastIndex = bisectorPlanes.length - 1;\n if (lastIndex > 0 && wrapIfPhysicallyClosed) {\n const firstPlane = bisectorPlanes[0];\n const lastPlane = bisectorPlanes[lastIndex];\n if (Geometry.isSamePoint3d(firstPlane.getOriginRef(), lastPlane.getOriginRef())) {\n const newBisectorNormal = firstPlane.getNormalRef().plus(lastPlane.getNormalRef()); // could be zero vector at a cusp\n const newBisectorPlane = Plane3dByOriginAndUnitNormal.create(firstPlane.getOriginRef(), newBisectorNormal);\n if (undefined !== newBisectorPlane) {\n bisectorPlanes[0] = newBisectorPlane;\n bisectorPlanes[lastIndex] = Plane3dByOriginAndUnitNormal.create(lastPlane.getOriginRef(), newBisectorNormal)!;\n }\n }\n }\n return bisectorPlanes.length > 1 ? bisectorPlanes : undefined;\n }\n\n private static _workSegmentA?: LineSegment3d;\n private static _workSegmentB?: LineSegment3d;\n private static _workLocalDetailPair?: CurveLocationDetailPair;\n /**\n * Find smallest distance between polylines.\n * * For polylines with many points, it is more efficient to use [[LineString3dRangeTreeContext.searchForClosestApproach]].\n * @param pointsA first polyline\n * @param extendA how to extend polylineA forward/backward\n * @param pointsB second polyline\n * @param extendB how to extend polylineB forward/backward\n * @param dMax largest approach distance to consider\n * @param result optional pre-allocated object to populate and return\n * @returns pair of details, one for each polyline, with field values:\n * * `a` is the closest approach distance\n * * `point` is the point of closest approach\n * * `fraction` is the global polyline fraction\n * * `childDetail.a` is the segment index\n * * `childDetail.fraction` is the local segment fraction\n */\n public static closestApproach(\n pointsA: Point3d[] | IndexedXYZCollection,\n extendA: VariantCurveExtendParameter,\n pointsB: Point3d[] | IndexedXYZCollection,\n extendB: VariantCurveExtendParameter,\n dMax: number = Number.MAX_VALUE,\n result?: CurveLocationDetailPair,\n ): CurveLocationDetailPair | undefined {\n if (Array.isArray(pointsA))\n pointsA = new Point3dArrayCarrier(pointsA);\n if (Array.isArray(pointsB))\n pointsB = new Point3dArrayCarrier(pointsB);\n let dMin = dMax;\n let foundMin = false;\n const numSegmentA = pointsA.length - 1;\n const numSegmentB = pointsB.length - 1;\n const extendSegA = [CurveExtendMode.None, CurveExtendMode.None];\n const extendSegB = [CurveExtendMode.None, CurveExtendMode.None];\n // lambda to set extension for first and last segment of a polyline\n const convertExtend = (extendOut: CurveExtendMode[], extendIn: VariantCurveExtendParameter, segmentIndex: number, numSegments: number) => {\n extendOut[0] = extendOut[1] = CurveExtendMode.None;\n if (segmentIndex === 0)\n extendOut[0] = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extendIn, 0);\n else if (segmentIndex === numSegments - 1)\n extendOut[1] = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extendIn, 1);\n };\n // lambda to extract LineSegment3d from polyline\n const fillSegment = (points: IndexedXYZCollection, index: number, segment: LineSegment3d | undefined): LineSegment3d => {\n if (segment === undefined)\n return LineSegment3d.createCapture(points.getPoint3dAtUncheckedPointIndex(index), points.getPoint3dAtUncheckedPointIndex(index + 1));\n points.getPoint3dAtUncheckedPointIndex(index, segment.point0Ref);\n points.getPoint3dAtUncheckedPointIndex(index + 1, segment.point1Ref);\n return segment;\n };\n // just test the segments\n for (let indexA = 0; indexA < numSegmentA; indexA++) {\n this._workSegmentA = fillSegment(pointsA, indexA, this._workSegmentA);\n convertExtend(extendSegA, extendA, indexA, numSegmentA);\n for (let indexB = 0; indexB < numSegmentB; indexB++) {\n this._workSegmentB = fillSegment(pointsB, indexB, this._workSegmentB);\n convertExtend(extendSegB, extendB, indexB, numSegmentB);\n if (undefined !== (this._workLocalDetailPair = LineSegment3d.closestApproach(this._workSegmentA, extendSegA, this._workSegmentB, extendSegB, this._workLocalDetailPair))) {\n const d = this._workLocalDetailPair.detailA.a;\n if (d < dMin) {\n const childDetailA = result?.detailA.childDetail; // save and reuse\n const childDetailB = result?.detailB.childDetail;\n result = this._workLocalDetailPair.clone(result); // overwrite previous result\n LineString3d.convertLocalToGlobalDetail(result.detailA, indexA, numSegmentA, undefined, childDetailA);\n LineString3d.convertLocalToGlobalDetail(result.detailB, indexB, numSegmentB, undefined, childDetailB);\n if (result.detailA.childDetail && result.detailB.childDetail)\n result.detailA.childDetail.curve = result.detailB.childDetail.curve = undefined; // no CurvePrimitives survive in output\n dMin = d;\n foundMin = true;\n }\n }\n }\n }\n return foundMin ? result : undefined;\n }\n /**\n * Checks if all points are colinear.\n * * This test does not take point order into account.\n * @param points array of points to check.\n * @param distanceTol maximum allowable distance that geometry can deviate from colinearity.Default is [[Geometry.smallMetricDistance]].\n * @param xyOnly whether to ignore z-coordinates in the colinearity test.\n */\n public static isColinear(\n points: Point3d[], distanceTol: number = Geometry.smallMetricDistance, xyOnly: boolean = false,\n ): boolean {\n if (points.length < 3)\n return true;\n return undefined !== CurveOps.isColinear(points, { maxDeviation: distanceTol, xyColinear: xyOnly });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterableArray.d.ts","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClusterableArray.d.ts","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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"}
@@ -164,9 +164,9 @@ class ClusterableArray extends GrowableBlockedArray_1.GrowableBlockedArray {
164
164
  candidateBlockIndex = firstSort[j];
165
165
  if (candidateBlockIndex === ClusterableArray.clusterTerminator)
166
166
  continue; // nearby in sort direction but already in a cluster.
167
- if (this.component(candidateBlockIndex, 0) >= barrierU)
167
+ if (this.component(candidateBlockIndex, 0) > barrierU)
168
168
  break;
169
- if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {
169
+ if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) <= clusterTolerance) {
170
170
  clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block
171
171
  firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base
172
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/**\n * Blocked array with operations to sort and cluster with a tolerance.\n * * Primary sorting is along an \"arbitrary\" sort vector.\n * @internal\n */\nexport class ClusterableArray extends GrowableBlockedArray {\n // (This is pretty strange)\n // The sort vector is (1,c, c*c, ...)\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\n /** Return a component of the sort vector. */\n public static sortVectorComponent(index: number): number {\n let c = 1.0;\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\n return c;\n }\n private _numCoordinatePerPoint: number;\n private _numExtraDataPerPoint: number;\n /**\n * @param numCoordinatePerPoint number of coordinates per point\n * @param numExtraDataPerPoint of extra data values per point.\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\n */\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\n this._numExtraDataPerPoint = numExtraDataPerPoint;\n this._numCoordinatePerPoint = numCoordinatePerPoint;\n }\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\n * @param data array of numDataPerBlock values.\n */\n public override addBlock(data: number[]) {\n const i0 = this.newBlockIndex() + 1;\n const n = Math.min(this.numPerBlock - 1, data.length);\n for (let i = 0; i < n; i++)\n this._data[i0 + i] = data[i];\n }\n /** add a block directly with 1 to 5 listed content parameters.\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = x0;\n if (x1 !== undefined) this._data[i0 + 2] = x1;\n if (x2 !== undefined) this._data[i0 + 3] = x2;\n if (x3 !== undefined) this._data[i0 + 4] = x3;\n if (x4 !== undefined) this._data[i0 + 5] = x4;\n }\n\n /** add a block directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xy.x;\n this._data[i0 + 2] = xy.y;\n if (a !== undefined)\n this._data[i0 + 3] = a;\n if (b !== undefined)\n this._data[i0 + 4] = b;\n if (c !== undefined)\n this._data[i0 + 5] = c;\n }\n\n /** add a block with directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xyz.x;\n this._data[i0 + 2] = xyz.y;\n this._data[i0 + 3] = xyz.z;\n if (a !== undefined)\n this._data[i0 + 4] = a;\n if (b !== undefined)\n this._data[i0 + 5] = b;\n if (c !== undefined)\n this._data[i0 + 6] = c;\n }\n /** Get the xy coordinates by point index. */\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\n }\n /** Get the xyZ coordinates by point index. */\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\n }\n /** Return a single extra data value */\n public getExtraData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\n }\n /** Return a single data value */\n public getData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + i];\n }\n\n /** Set a single extra data value */\n public setExtraData(blockIndex: number, i: number, value: number): void {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\n }\n\n /** this value is used as cluster terminator in the Uint232Array of indices. */\n public static readonly clusterTerminator = 0xFFffFFff;\n /** Test if `x` is the cluster terminator value. */\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\n /** Return an array giving clusters of blocks with similar coordinates.\n *\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\n *\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\n * candidates for clusters.\n * ** The usual solution is to sort by u value, which is a dot product along some skew direction, and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\n * ** apply setupPrimaryClusterSort to prepare that!!!\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\n */\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\n // install primary sort key\n this.setupPrimaryClusterSort();\n // presort by all coordinates ....\n const firstSort = this.sortIndicesLexical();\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\n let m = 0; // number of cluster indices\n const n = this.numBlocks; // and this must match firstSort.length !!\n let clusterStartBlockIndex = 0;\n let candidateBlockIndex = 0;\n let barrierU = 0.0;\n let i = 0;\n let j = 0;\n\n const k0 = 1; // beginning of active column for distance\n const k1 = 1 + this._numCoordinatePerPoint;\n for (i = 0; i < n; i++) {\n clusterStartBlockIndex = firstSort[i];\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\n // unused block, so it becomes a cluster...\n clusterIndices[m++] = clusterStartBlockIndex;\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\n firstSort[i] = ClusterableArray.clusterTerminator;\n for (j = i + 1; j < n; j++) {\n candidateBlockIndex = firstSort[j];\n if (candidateBlockIndex === ClusterableArray.clusterTerminator) continue; // nearby in sort direction but already in a cluster.\n if (this.component(candidateBlockIndex, 0) >= barrierU) break;\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) < clusterTolerance) {\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\n }\n }\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\n }\n }\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\n return clusterIndices.slice(0, m);\n }\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\n * This is normally called before clusterIndicesLexical.\n */\n public setupPrimaryClusterSort() {\n const nb = this.numBlocks;\n const nc = this._numCoordinatePerPoint;\n const vector = new Float64Array(nc);\n vector[0] = 1.0;\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\n let k = 0;\n let dot = 0.0;\n const data = this._data;\n for (let b = 0; b < nb; b++) {\n k = this.blockIndexToDoubleIndex(b);\n dot = 0.0;\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\n data[k] = dot;\n }\n }\n /** Convert the cluster data to an array of tuples with point i in the form\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\n */\n public toJSON(): any[] {\n const result: any[] = [];\n for (let b = 0; b < this.numBlocks; b++) {\n let i = this.blockIndexToDoubleIndex(b);\n const chunk: any[] = [b, this._data[i++]];\n const coordinates = [];\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\n chunk.push(coordinates);\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\n chunk.push(this._data[i++]);\n result.push(chunk);\n }\n return result;\n }\n /**\n * Return an array of indices from block index to cluster index.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\n const numBlocks = this.numBlocks;\n const blockToCluster = new Uint32Array(numBlocks);\n blockToCluster.fill(ClusterableArray.clusterTerminator);\n let numCluster = 0;\n for (const b of clusteredBlocks) {\n if (b >= numBlocks) {\n numCluster++;\n } else {\n blockToCluster[b] = numCluster;\n }\n }\n return blockToCluster;\n }\n /**\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n const n = clusteredBlocks.length;\n const numBlocks = this.numBlocks;\n const blockToClusterStart = new Uint32Array(numBlocks);\n const terminator = ClusterableArray.clusterTerminator;\n blockToClusterStart.fill(terminator);\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k > numBlocks) {\n clusterStart = i + 1;\n } else {\n blockToClusterStart[k] = clusterStart;\n }\n }\n return blockToClusterStart;\n }\n /** count the clusters in the clusteredBlocks array. */\n public countClusters(clusteredBlocks: Uint32Array): number {\n let numClusters = 0;\n const terminator = ClusterableArray.clusterTerminator;\n for (const b of clusteredBlocks) {\n if (b === terminator)\n numClusters++;\n }\n return numClusters;\n }\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\n * the cluster's block indices appear in clusterBlocks\n */\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n let numCluster = this.countClusters(clusteredBlocks);\n const clusterToClusterStart = new Uint32Array(numCluster);\n const terminator = ClusterableArray.clusterTerminator;\n clusterToClusterStart.fill(terminator);\n const n = clusteredBlocks.length;\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k === terminator) {\n clusterStart = i + 1;\n } else if (i === clusterStart) {\n clusterToClusterStart[numCluster++] = clusterStart;\n }\n }\n return clusterToClusterStart;\n }\n\n /**\n * Sort terminator-delimited subsets of an array of indices into the table, using a single data value as sort key.\n * @param blockedIndices indices, organized as blocks of good indices terminated by the clusterTerminator. Each block is individually sorted on return.\n * @param dataIndex index of the data key, e.g., if the sort key is the first extraData (angle) after x and y coordinate data, pass dataIndex = 2.\n */\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\n const dataOffset = 1 + dataIndex;\n let kBegin = 0;\n let swap;\n let key0, key1;\n const numK = blockedIndices.length;\n for (let kEnd = 0; kEnd < numK; kEnd++) {\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\n // bubble sort blockedIndices[kBegin <= k < kEnd].\n // (search for minimum remaining, swap . . )\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\n if (key1 < key0) {\n swap = blockedIndices[k0];\n blockedIndices[k0] = blockedIndices[k1];\n blockedIndices[k1] = swap;\n key0 = key1;\n }\n }\n }\n kBegin = kEnd + 1;\n }\n }\n }\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, data.length);\n data.forEach((p: Point3d) => {\n clusterArray.addDirect(p.x, p.y, p.z);\n });\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedPoints.push(data[k].clone());\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns number array with indices mapping old to new.\n * @param data numbers to cluster.\n */\n public static clusterNumberArray(data: number[], tolerance: number = Geometry.smallMetricDistance): PackedNumbersWithIndex {\n const clusterArray = new ClusterableArray(1, 0, data.length);\n data.forEach((x: number) => {clusterArray.addDirect(x);});\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedNumbersWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedNumbers.push(data[k]);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\n const clusterArray = new ClusterableArray(2, 0, source.length);\n const p = Point2d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint2dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const numPackedPoints = clusterArray.countClusters(order);\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, source.length);\n const p = Point3d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint3dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y, p.z);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(source.length);\n const numPackedPoints = clusterArray.countClusters(order);\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n}\n\n/**\n * @internal\n */\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\n let numErrors = 0;\n indices.forEach((value: number, i: number, data: number[]) => {\n if (value < oldToNew.length) {\n data[i] = oldToNew[value];\n } else numErrors++;\n });\n return numErrors === 0;\n}\n\n/**\n * Data carrier class for\n * * packedPoints = an array of Point3d\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\n * @internal\n */\nclass PackedPointsWithIndex {\n /** Array of Point3d */\n public packedPoints: Point3d[];\n /** array of coordinates packed in GrowableXYZArray */\n public growablePackedPoints: GrowableXYZArray | undefined;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedPoints = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\nclass PackedPoint2dsWithIndex {\n /** array of coordinates packed in GrowableXYArray */\n public growablePackedPoints: GrowableXYArray;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\n class PackedNumbersWithIndex {\n /** Array of numbers */\n public packedNumbers: number[];\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedNumbers object with\n * * empty packedNumbers array\n * * oldToNew indices all initialized to PackedNumbers.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedNumbers = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n"]}
1
+ {"version":3,"file":"ClusterableArray.js","sourceRoot":"","sources":["../../../src/numerics/ClusterableArray.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Numerics\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { GrowableBlockedArray } from \"../geometry3d/GrowableBlockedArray\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\n\n/**\n * Blocked array with operations to sort and cluster with a tolerance.\n * * Primary sorting is along an \"arbitrary\" sort vector.\n * @internal\n */\nexport class ClusterableArray extends GrowableBlockedArray {\n // (This is pretty strange)\n // The sort vector is (1,c, c*c, ...)\n // Setting c = 1 makes it 1,1,1 which may be useful for visual scans during debug.\n // c with some non-obvious digits makes it unlikely that there will be multiple points on a perpendicular to the sort vector.\n private static readonly _vectorFactor = 0.8732; // use 1.0 to rig easy tests.\n /** Return a component of the sort vector. */\n public static sortVectorComponent(index: number): number {\n let c = 1.0;\n for (let i = 1; i < index; i++) c *= ClusterableArray._vectorFactor;\n return c;\n }\n private _numCoordinatePerPoint: number;\n private _numExtraDataPerPoint: number;\n /**\n * @param numCoordinatePerPoint number of coordinates per point\n * @param numExtraDataPerPoint of extra data values per point.\n * @param initialBlockCapacity predicted number of points. (This does not have to be accurate)\n */\n public constructor(numCoordinatePerPoint: number, numExtraDataPerPoint: number, initialBlockCapacity: number) {\n super(1 + numCoordinatePerPoint + numExtraDataPerPoint, initialBlockCapacity);\n this._numExtraDataPerPoint = numExtraDataPerPoint;\n this._numCoordinatePerPoint = numCoordinatePerPoint;\n }\n /** load a block, placing data[i] at block[i+1] to allow sort coordinate first.\n * @param data array of numDataPerBlock values.\n */\n public override addBlock(data: number[]) {\n const i0 = this.newBlockIndex() + 1;\n const n = Math.min(this.numPerBlock - 1, data.length);\n for (let i = 0; i < n; i++)\n this._data[i0 + i] = data[i];\n }\n /** add a block directly with 1 to 5 listed content parameters.\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addDirect(x0: number, x1?: number, x2?: number, x3?: number, x4?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = x0;\n if (x1 !== undefined) this._data[i0 + 2] = x1;\n if (x2 !== undefined) this._data[i0 + 3] = x2;\n if (x3 !== undefined) this._data[i0 + 4] = x3;\n if (x4 !== undefined) this._data[i0 + 5] = x4;\n }\n\n /** add a block directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint2d(xy: Point2d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xy.x;\n this._data[i0 + 2] = xy.y;\n if (a !== undefined)\n this._data[i0 + 3] = a;\n if (b !== undefined)\n this._data[i0 + 4] = b;\n if (c !== undefined)\n this._data[i0 + 5] = c;\n }\n\n /** add a block with directly from a Point2d with 0 to 3 extras\n * This assumes numDataPerPoint is sufficient for the parameters provided.\n */\n public addPoint3d(xyz: Point3d, a?: number, b?: number, c?: number) {\n const i0 = this.newBlockIndex();\n this._data[i0 + 1] = xyz.x;\n this._data[i0 + 2] = xyz.y;\n this._data[i0 + 3] = xyz.z;\n if (a !== undefined)\n this._data[i0 + 4] = a;\n if (b !== undefined)\n this._data[i0 + 5] = b;\n if (c !== undefined)\n this._data[i0 + 6] = c;\n }\n /** Get the xy coordinates by point index. */\n public getPoint2d(blockIndex: number, result?: Point2d): Point2d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point2d.create(this._data[i0 + 1], this._data[i0 + 2], result);\n }\n /** Get the xyZ coordinates by point index. */\n public getPoint3d(blockIndex: number, result?: Point3d): Point3d {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return Point3d.create(this._data[i0 + 1], this._data[i0 + 2], this._data[i0 + 3], result);\n }\n /** Return a single extra data value */\n public getExtraData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + 1 + this._numCoordinatePerPoint + i];\n }\n /** Return a single data value */\n public getData(blockIndex: number, i: number): number {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n return this._data[i0 + i];\n }\n\n /** Set a single extra data value */\n public setExtraData(blockIndex: number, i: number, value: number): void {\n const i0 = this.blockIndexToDoubleIndex(blockIndex);\n this._data[i0 + 1 + this._numCoordinatePerPoint + i] = value;\n }\n\n /** this value is used as cluster terminator in the Uint232Array of indices. */\n public static readonly clusterTerminator = 0xFFffFFff;\n /** Test if `x` is the cluster terminator value. */\n public static isClusterTerminator(x: number): boolean { return x === ClusterableArray.clusterTerminator; }\n /** Return an array giving clusters of blocks with similar coordinates.\n *\n * * The contents of each block is assumed to be set up so the primary sort coordinate is first.\n *\n * ** simple coordinate blocks (x,y) or (x,y,z) would work fine but have occasional performance problems because points with same x would generate big blocks of\n * candidates for clusters.\n * ** The usual solution is to sort by u value, which is a dot product along some skew direction, and have the blocks contain (u,x,y) or (u,x,y,z) for 2d versus 3d.\n * ** apply setupPrimaryClusterSort to prepare that!!!\n * * After a simple lexical sort, consecutive blocks that are within tolerance in the 0 component\n * are inspected. Within that candidate set, all blocks that are within tolerance for ALL components are clustered.\n * * In the output cluster array, clusters are terminated a invalid index. Test for the invalid index with GrowableBlockArray.isClusterTerminator (x)\n */\n public clusterIndicesLexical(clusterTolerance: number = Geometry.smallMetricDistance): Uint32Array {\n // install primary sort key\n this.setupPrimaryClusterSort();\n // presort by all coordinates ....\n const firstSort = this.sortIndicesLexical();\n const clusterIndices = new Uint32Array(2 * firstSort.length); // worst case: no duplicates, each index goes in followed by terminator.\n let m = 0; // number of cluster indices\n const n = this.numBlocks; // and this must match firstSort.length !!\n let clusterStartBlockIndex = 0;\n let candidateBlockIndex = 0;\n let barrierU = 0.0;\n let i = 0;\n let j = 0;\n const k0 = 1; // beginning of active column for distance\n const k1 = 1 + this._numCoordinatePerPoint;\n for (i = 0; i < n; i++) {\n clusterStartBlockIndex = firstSort[i];\n if (!ClusterableArray.isClusterTerminator(clusterStartBlockIndex)) {\n // unused block, so it becomes a cluster...\n clusterIndices[m++] = clusterStartBlockIndex;\n barrierU = this.component(clusterStartBlockIndex, 0) + clusterTolerance;\n firstSort[i] = ClusterableArray.clusterTerminator;\n for (j = i + 1; j < n; j++) {\n candidateBlockIndex = firstSort[j];\n if (candidateBlockIndex === ClusterableArray.clusterTerminator)\n continue; // nearby in sort direction but already in a cluster.\n if (this.component(candidateBlockIndex, 0) > barrierU)\n break;\n if (this.distanceBetweenSubBlocks(clusterStartBlockIndex, candidateBlockIndex, k0, k1) <= clusterTolerance) {\n clusterIndices[m++] = candidateBlockIndex; // The candidate is in the block\n firstSort[j] = ClusterableArray.clusterTerminator; // and it will not be reused as future block base\n }\n }\n clusterIndices[m++] = ClusterableArray.clusterTerminator;\n }\n }\n // Alas, the clusterIndices array has fluff at the end. So it has to be copied.\n return clusterIndices.slice(0, m);\n }\n /** setup (overwrite!!) the \"0\" component with the dot product of numClusterCoordinate later components with a non-axis aligned vector.\n * This is normally called before clusterIndicesLexical.\n */\n public setupPrimaryClusterSort() {\n const nb = this.numBlocks;\n const nc = this._numCoordinatePerPoint;\n const vector = new Float64Array(nc);\n vector[0] = 1.0;\n for (let c = 1; c < nc; c++) vector[c] = vector[c - 1] * ClusterableArray._vectorFactor;\n let k = 0;\n let dot = 0.0;\n const data = this._data;\n for (let b = 0; b < nb; b++) {\n k = this.blockIndexToDoubleIndex(b);\n dot = 0.0;\n for (let c = 0; c < nc; c++) { dot += vector[c] * data[k + 1 + c]; }\n data[k] = dot;\n }\n }\n /** Convert the cluster data to an array of tuples with point i in the form\n * `[i, primarySortCoordinate, [x,y,..], [extraData0, extraData1, ...]]`\n */\n public toJSON(): any[] {\n const result: any[] = [];\n for (let b = 0; b < this.numBlocks; b++) {\n let i = this.blockIndexToDoubleIndex(b);\n const chunk: any[] = [b, this._data[i++]];\n const coordinates = [];\n for (let c = 0; c < this._numCoordinatePerPoint; c++)coordinates.push(this._data[i++]);\n chunk.push(coordinates);\n for (let c = 0; c < this._numExtraDataPerPoint; c++)\n chunk.push(this._data[i++]);\n result.push(chunk);\n }\n return result;\n }\n /**\n * Return an array of indices from block index to cluster index.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterIndex(clusteredBlocks: Uint32Array): Uint32Array {\n const numBlocks = this.numBlocks;\n const blockToCluster = new Uint32Array(numBlocks);\n blockToCluster.fill(ClusterableArray.clusterTerminator);\n let numCluster = 0;\n for (const b of clusteredBlocks) {\n if (b >= numBlocks) {\n numCluster++;\n } else {\n blockToCluster[b] = numCluster;\n }\n }\n return blockToCluster;\n }\n /**\n * Return an array of indices from block index to index of its cluster's start in the cluster index array.\n * @param clusteredBlocks clusters of block indices followed by separators.\n */\n public createIndexBlockToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n const n = clusteredBlocks.length;\n const numBlocks = this.numBlocks;\n const blockToClusterStart = new Uint32Array(numBlocks);\n const terminator = ClusterableArray.clusterTerminator;\n blockToClusterStart.fill(terminator);\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k > numBlocks) {\n clusterStart = i + 1;\n } else {\n blockToClusterStart[k] = clusterStart;\n }\n }\n return blockToClusterStart;\n }\n /** count the clusters in the clusteredBlocks array. */\n public countClusters(clusteredBlocks: Uint32Array): number {\n let numClusters = 0;\n const terminator = ClusterableArray.clusterTerminator;\n for (const b of clusteredBlocks) {\n if (b === terminator)\n numClusters++;\n }\n return numClusters;\n }\n /** create a reverse index: given a cluster index k, clusterToClusterStart[k] is the place\n * the cluster's block indices appear in clusterBlocks\n */\n public createIndexClusterToClusterStart(clusteredBlocks: Uint32Array): Uint32Array {\n let numCluster = this.countClusters(clusteredBlocks);\n const clusterToClusterStart = new Uint32Array(numCluster);\n const terminator = ClusterableArray.clusterTerminator;\n clusterToClusterStart.fill(terminator);\n const n = clusteredBlocks.length;\n let clusterStart = 0;\n for (let i = 0; i < n; i++) {\n const k = clusteredBlocks[i];\n if (k === terminator) {\n clusterStart = i + 1;\n } else if (i === clusterStart) {\n clusterToClusterStart[numCluster++] = clusterStart;\n }\n }\n return clusterToClusterStart;\n }\n\n /**\n * Sort terminator-delimited subsets of an array of indices into the table, using a single data value as sort key.\n * @param blockedIndices indices, organized as blocks of good indices terminated by the clusterTerminator. Each block is individually sorted on return.\n * @param dataIndex index of the data key, e.g., if the sort key is the first extraData (angle) after x and y coordinate data, pass dataIndex = 2.\n */\n public sortSubsetsBySingleKey(blockedIndices: Uint32Array, dataIndex: number) {\n const dataOffset = 1 + dataIndex;\n let kBegin = 0;\n let swap;\n let key0, key1;\n const numK = blockedIndices.length;\n for (let kEnd = 0; kEnd < numK; kEnd++) {\n if (blockedIndices[kEnd] === ClusterableArray.clusterTerminator) {\n // bubble sort blockedIndices[kBegin <= k < kEnd].\n // (search for minimum remaining, swap . . )\n for (let k0 = kBegin; k0 + 1 < kEnd; k0++) {\n key0 = this.getWithinBlock(blockedIndices[k0], dataOffset);\n for (let k1 = k0 + 1; k1 < kEnd; k1++) {\n key1 = this.getWithinBlock(blockedIndices[k1], dataOffset);\n if (key1 < key0) {\n swap = blockedIndices[k0];\n blockedIndices[k0] = blockedIndices[k1];\n blockedIndices[k1] = swap;\n key0 = key1;\n }\n }\n }\n kBegin = kEnd + 1;\n }\n }\n }\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterPoint3dArray(data: Point3d[], tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, data.length);\n data.forEach((p: Point3d) => {\n clusterArray.addDirect(p.x, p.y, p.z);\n });\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedPoints.push(data[k].clone());\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns number array with indices mapping old to new.\n * @param data numbers to cluster.\n */\n public static clusterNumberArray(data: number[], tolerance: number = Geometry.smallMetricDistance): PackedNumbersWithIndex {\n const clusterArray = new ClusterableArray(1, 0, data.length);\n data.forEach((x: number) => {clusterArray.addDirect(x);});\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedNumbersWithIndex(data.length);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0)\n result.packedNumbers.push(data[k]);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint2dArray(source: GrowableXYArray, tolerance: number = Geometry.smallMetricDistance): PackedPoint2dsWithIndex {\n const clusterArray = new ClusterableArray(2, 0, source.length);\n const p = Point2d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint2dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const numPackedPoints = clusterArray.countClusters(order);\n const result = new PackedPoint2dsWithIndex(source.length, numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints.pushFromGrowableXYArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n\n /**\n * Returns packed points with indices mapping old to new.\n * @param data points to cluster.\n */\n public static clusterGrowablePoint3dArray(source: GrowableXYZArray, tolerance: number = Geometry.smallMetricDistance):\n PackedPointsWithIndex {\n const clusterArray = new ClusterableArray(3, 0, source.length);\n const p = Point3d.create();\n const numSourcePoint = source.length;\n for (let i = 0; i < numSourcePoint; i++) {\n source.getPoint3dAtUncheckedPointIndex(i, p);\n clusterArray.addDirect(p.x, p.y, p.z);\n }\n const order = clusterArray.clusterIndicesLexical(tolerance);\n const result = new PackedPointsWithIndex(source.length);\n const numPackedPoints = clusterArray.countClusters(order);\n result.growablePackedPoints = new GrowableXYZArray(numPackedPoints);\n let currentClusterIndex = 0;\n let numThisCluster = 0;\n order.forEach((k: number) => {\n if (ClusterableArray.isClusterTerminator(k)) {\n currentClusterIndex++;\n numThisCluster = 0;\n } else {\n if (numThisCluster === 0) // This is the first encounter with a new cluster\n result.growablePackedPoints!.pushFromGrowableXYZArray(source, k);\n result.oldToNew[k] = currentClusterIndex;\n numThisCluster++;\n }\n });\n return result;\n }\n}\n\n/**\n * @internal\n */\nfunction updateIndices(indices: number[], oldToNew: Uint32Array): boolean {\n let numErrors = 0;\n indices.forEach((value: number, i: number, data: number[]) => {\n if (value < oldToNew.length) {\n data[i] = oldToNew[value];\n } else numErrors++;\n });\n return numErrors === 0;\n}\n\n/**\n * Data carrier class for\n * * packedPoints = an array of Point3d\n * * oldToNew = array of indices from some prior Point3d[] to the packed points.\n * @internal\n */\nclass PackedPointsWithIndex {\n /** Array of Point3d */\n public packedPoints: Point3d[];\n /** array of coordinates packed in GrowableXYZArray */\n public growablePackedPoints: GrowableXYZArray | undefined;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedPoints = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\nclass PackedPoint2dsWithIndex {\n /** array of coordinates packed in GrowableXYArray */\n public growablePackedPoints: GrowableXYArray;\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedPoints object with\n * * empty packedPoints array\n * * oldToNew indices all initialized to PackedPoints.invalidIndex\n */\n constructor(numOldIndexEntry: number, numPackedPoints: number) {\n this.growablePackedPoints = new GrowableXYArray(numPackedPoints);\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPoint2dsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n\n/**\n * @internal\n */\n class PackedNumbersWithIndex {\n /** Array of numbers */\n public packedNumbers: number[];\n /** mapping from old point index to new point index. */\n public oldToNew: Uint32Array;\n /** integer value for unknown index. */\n public static readonly invalidIndex = 0xFFFFffff;\n\n /** construct a PackedNumbers object with\n * * empty packedNumbers array\n * * oldToNew indices all initialized to PackedNumbers.invalidIndex\n */\n constructor(numOldIndexEntry: number) {\n this.packedNumbers = [];\n this.oldToNew = new Uint32Array(numOldIndexEntry);\n for (let i = 0; i < numOldIndexEntry; i++) {\n this.oldToNew[i] = PackedPointsWithIndex.invalidIndex;\n }\n }\n /**\n * Use the oldToNew array to update an array of \"old\" indices.\n * @param indices array of indices into prepacked array.\n * @returns true if all input indices were valid for the oldToNew array.\n */\n public updateIndices(indices: number[]): boolean {\n return updateIndices(indices, this.oldToNew);\n }\n}\n"]}
@@ -117,13 +117,21 @@ export declare class HalfEdgeGraphMerge {
117
117
  static curvatureSortKey(node: HalfEdge): number;
118
118
  /** Whether the HalfEdge is part of a null face, as marked by [[clusterAndMergeXYTheta]]. */
119
119
  static isNullFace(node: HalfEdge): boolean;
120
- /** Simplest merge algorithm:
121
- * * collect array of (x,y,theta) at all nodes
122
- * * lexical sort of the array.
123
- * * twist all vertices together.
124
- * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.
125
- * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.
126
- * * Mask.NULL_FACE is cleared throughout and applied within null faces.
120
+ /**
121
+ * Cluster the HalfEdges so that xy-coordinates within `mergeTolerance` are equated.
122
+ * * Note that any additional data (e.g., edgeTag, faceTag) on the HalfEdges are ignored. In particular,
123
+ * [[CurveLocationDetail]]s attached to clustered HalfEdges do *not* get their points adjusted.
124
+ * * This is a simple merge algorithm:
125
+ * * untwist all edges from the vertex loops
126
+ * * collect array of (x,y,theta) at all nodes
127
+ * * lexical sort of the array
128
+ * * twist all edges together in sort order around each vertex
129
+ * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.
130
+ * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.
131
+ * * [[HalfEdgeMask.NULL_FACE]] is cleared throughout and applied within null faces.
132
+ * @param graph input graph
133
+ * @param outboundRadiansFunction optional function to compute the sort angle of an edge at its start vertex
134
+ * @param clusterTol optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].
127
135
  */
128
136
  static clusterAndMergeXYTheta(graph: HalfEdgeGraph, outboundRadiansFunction?: (he: HalfEdge) => number, clusterTol?: number): void;
129
137
  private static buildVerticalSweepPriorityQueue;
@@ -1 +1 @@
1
- {"version":3,"file":"Merging.d.ts","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOhE,qBAAa,cAAc;IAClB,SAAS,SAAK;IACd,mBAAmB,SAAK;IACxB,QAAQ,SAAK;IACb,SAAS,SAAK;IACd,OAAO,SAAK;IACZ,OAAO,SAAK;;CAGpB;AACD;;GAEG;AACH,qBAAa,0BAA0B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;gBACL,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM;CAMhF;AAED,8EAA8E;AAC9E,MAAM,MAAM,kCAAkC,GAAG,CAAC,IAAI,EAAE,0BAA0B,EAAE,KAAK,GAAG,CAAC;AAC7F;;;GAGG;AACH,qBAAa,gBAAgB;IAE3B,iFAAiF;WACnE,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ;IAgBvD,mIAAmI;WACrH,UAAU,CAAC,KAAK,EAAE,QAAQ;IAQxC;;;;OAIG;WACW,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAIjG,iDAAiD;WACnC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO;IAOjE,oDAAoD;WACtC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO;IAQnE,gFAAgF;WAClE,wBAAwB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,QAAQ,EAAE;IAwB7H;;;;;OAKG;WACW,eAAe,CAAC,KAAK,EAAE,aAAa;IAMlD;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAmB7C;;;;;;;;OAQG;WACW,qCAAqC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,YAAyC,GAAG,MAAM;IAqBzJ;;;;;;;OAOG;WACW,wCAAwC,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,YAAyC,GAAG,QAAQ,EAAE,GAAG,SAAS;IAiBxJ;;;;;;;OAOG;WACW,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,YAAyC,GAAG,MAAM;IAWjH;;;;;OAKG;WACW,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,GAAE,YAAoC,GAAG,OAAO;CAU5G;AAED;;;GAGG;AACH,qBAAa,kBAAkB;WAIf,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAYpH,OAAO,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAqC;IACxF;;OAEG;IACH,WAAkB,kCAAkC,CAAC,IAAI,EAAE,kCAAkC,GAAG,SAAS,EAAsD;IAC/J,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAqB3C,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAqBxC;;;OAGG;WACW,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;IActD,4FAA4F;WAC9E,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAGjD;;;;;;;OAOG;WACW,sBAAsB,CAClC,KAAK,EAAE,aAAa,EACpB,uBAAuB,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,MAAM,EAClD,UAAU,GAAE,MAAqC;IA8HnD,OAAO,CAAC,MAAM,CAAC,+BAA+B;IAW9C,OAAO,CAAC,MAAM,CAAC,mCAAmC;IAkClD;;;;OAIG;WACW,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,GAAE,MAAqC,EAAE,WAAW,GAAE,MAAe,GAAG,cAAc;IA4C5J;;;;;;;;OAQG;WACW,qBAAqB,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,aAAa;IASjF;;;;OAIG;WACW,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,EAAE,UAAU,GAAE,OAAc,EAAE,IAAI,GAAE,YAAwC,GAAG,aAAa,GAAG,SAAS;CAiB7K"}
1
+ {"version":3,"file":"Merging.d.ts","sourceRoot":"","sources":["../../../src/topology/Merging.ts"],"names":[],"mappings":"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"}
@@ -331,13 +331,21 @@ class HalfEdgeGraphMerge {
331
331
  static isNullFace(node) {
332
332
  return node.isMaskSet(Graph_1.HalfEdgeMask.NULL_FACE) && node.faceSuccessor.isMaskSet(Graph_1.HalfEdgeMask.NULL_FACE) && node === node.faceSuccessor.faceSuccessor;
333
333
  }
334
- /** Simplest merge algorithm:
335
- * * collect array of (x,y,theta) at all nodes
336
- * * lexical sort of the array.
337
- * * twist all vertices together.
338
- * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.
339
- * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.
340
- * * Mask.NULL_FACE is cleared throughout and applied within null faces.
334
+ /**
335
+ * Cluster the HalfEdges so that xy-coordinates within `mergeTolerance` are equated.
336
+ * * Note that any additional data (e.g., edgeTag, faceTag) on the HalfEdges are ignored. In particular,
337
+ * [[CurveLocationDetail]]s attached to clustered HalfEdges do *not* get their points adjusted.
338
+ * * This is a simple merge algorithm:
339
+ * * untwist all edges from the vertex loops
340
+ * * collect array of (x,y,theta) at all nodes
341
+ * * lexical sort of the array
342
+ * * twist all edges together in sort order around each vertex
343
+ * * This effectively creates valid face loops for a planar subdivision if there are no edge crossings.
344
+ * * If there are edge crossings, the graph can be a (highly complicated) Klein bottle topology.
345
+ * * [[HalfEdgeMask.NULL_FACE]] is cleared throughout and applied within null faces.
346
+ * @param graph input graph
347
+ * @param outboundRadiansFunction optional function to compute the sort angle of an edge at its start vertex
348
+ * @param clusterTol optional distance tolerance for clustering vertices. Default value is [[Geometry.smallMetricDistance]].
341
349
  */
342
350
  static clusterAndMergeXYTheta(graph, outboundRadiansFunction, clusterTol = Geometry_1.Geometry.smallMetricDistance) {
343
351
  const allNodes = graph.allHalfEdges;
@@ -395,14 +403,11 @@ class HalfEdgeGraphMerge {
395
403
  const unmatchedNullFaceNodes = [];
396
404
  k0 = 0;
397
405
  let thetaA, thetaB;
398
- // GeometryCoreTestIO.consoleLog("START VERTEX LINKS");
399
406
  // now pinch each neighboring pair together
400
407
  for (let k1 = 0; k1 < numK; k1++) {
401
408
  if (order[k1] === ClusterableArray_1.ClusterableArray.clusterTerminator) {
402
409
  // nodes identified in order[k0]..order[k1-1] are properly sorted around a vertex.
403
410
  if (k1 > k0) {
404
- // const xy = clusters.getPoint2d(order[k0]);
405
- // GeometryCoreTestIO.consoleLog({ k0, k1, x: xy.x, y: xy.y });
406
411
  if (k1 > k0 + 1)
407
412
  this.secondarySortAroundVertex(clusters, order, allNodes, k0, k1);
408
413
  this.doAnnounceVertexNeighborhood(clusters, order, allNodes, k0, k1);