@itwin/core-geometry 4.9.0-dev.12 → 4.9.0-dev.14

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 (202) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Geometry.d.ts +57 -46
  3. package/lib/cjs/Geometry.d.ts.map +1 -1
  4. package/lib/cjs/Geometry.js +73 -53
  5. package/lib/cjs/Geometry.js.map +1 -1
  6. package/lib/cjs/curve/Arc3d.d.ts +128 -34
  7. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  8. package/lib/cjs/curve/Arc3d.js +174 -20
  9. package/lib/cjs/curve/Arc3d.js.map +1 -1
  10. package/lib/cjs/curve/CurveCollection.d.ts +2 -1
  11. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  12. package/lib/cjs/curve/CurveCollection.js +2 -1
  13. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  14. package/lib/cjs/curve/CurveLocationDetail.d.ts +19 -1
  15. package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
  16. package/lib/cjs/curve/CurveLocationDetail.js +39 -0
  17. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  18. package/lib/cjs/curve/LineString3d.js +1 -1
  19. package/lib/cjs/curve/LineString3d.js.map +1 -1
  20. package/lib/cjs/curve/OffsetOptions.d.ts +1 -1
  21. package/lib/cjs/curve/OffsetOptions.js +1 -1
  22. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  23. package/lib/cjs/curve/RegionOps.d.ts +2 -1
  24. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  25. package/lib/cjs/curve/RegionOps.js +2 -1
  26. package/lib/cjs/curve/RegionOps.js.map +1 -1
  27. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  28. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  29. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  30. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  31. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  32. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  33. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +1000 -0
  34. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  35. package/lib/cjs/geometry3d/Angle.d.ts +18 -5
  36. package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
  37. package/lib/cjs/geometry3d/Angle.js +23 -7
  38. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  39. package/lib/cjs/geometry3d/AngleSweep.d.ts +14 -1
  40. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  41. package/lib/cjs/geometry3d/AngleSweep.js +47 -12
  42. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  43. package/lib/cjs/geometry3d/Matrix3d.d.ts +6 -4
  44. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  45. package/lib/cjs/geometry3d/Matrix3d.js +6 -4
  46. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  47. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +2 -3
  48. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  49. package/lib/cjs/geometry3d/Point3dVector3d.js +2 -3
  50. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  51. package/lib/cjs/geometry3d/PointHelpers.d.ts +6 -5
  52. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  53. package/lib/cjs/geometry3d/PointHelpers.js +11 -10
  54. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  55. package/lib/cjs/geometry3d/Range.d.ts +6 -1
  56. package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
  57. package/lib/cjs/geometry3d/Range.js +9 -3
  58. package/lib/cjs/geometry3d/Range.js.map +1 -1
  59. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  60. package/lib/cjs/geometry3d/Transform.js +1 -1
  61. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  62. package/lib/cjs/numerics/Newton.d.ts +3 -3
  63. package/lib/cjs/numerics/Newton.d.ts.map +1 -1
  64. package/lib/cjs/numerics/Newton.js +14 -16
  65. package/lib/cjs/numerics/Newton.js.map +1 -1
  66. package/lib/cjs/numerics/Polynomials.d.ts +2 -2
  67. package/lib/cjs/numerics/Polynomials.js +2 -2
  68. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  69. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +7 -4
  70. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  71. package/lib/cjs/polyface/PolyfaceBuilder.js +8 -4
  72. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  73. package/lib/cjs/polyface/PolyfaceQuery.d.ts +3 -3
  74. package/lib/cjs/polyface/PolyfaceQuery.js +3 -3
  75. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  76. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  77. package/lib/cjs/serialization/BGFBWriter.js +2 -2
  78. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  79. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  80. package/lib/cjs/topology/Graph.d.ts +1 -1
  81. package/lib/cjs/topology/Graph.js +2 -2
  82. package/lib/cjs/topology/Graph.js.map +1 -1
  83. package/lib/cjs/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  84. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +1 -1
  85. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  86. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  87. package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  88. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +168 -127
  89. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  90. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +35 -35
  91. package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  92. package/lib/cjs/topology/HalfEdgePositionDetail.js +63 -41
  93. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  94. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +64 -12
  95. package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  96. package/lib/cjs/topology/InsertAndRetriangulateContext.js +174 -75
  97. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  98. package/lib/cjs/topology/Triangulation.d.ts +16 -10
  99. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  100. package/lib/cjs/topology/Triangulation.js +23 -30
  101. package/lib/cjs/topology/Triangulation.js.map +1 -1
  102. package/lib/esm/Geometry.d.ts +57 -46
  103. package/lib/esm/Geometry.d.ts.map +1 -1
  104. package/lib/esm/Geometry.js +73 -53
  105. package/lib/esm/Geometry.js.map +1 -1
  106. package/lib/esm/curve/Arc3d.d.ts +128 -34
  107. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  108. package/lib/esm/curve/Arc3d.js +172 -19
  109. package/lib/esm/curve/Arc3d.js.map +1 -1
  110. package/lib/esm/curve/CurveCollection.d.ts +2 -1
  111. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  112. package/lib/esm/curve/CurveCollection.js +2 -1
  113. package/lib/esm/curve/CurveCollection.js.map +1 -1
  114. package/lib/esm/curve/CurveLocationDetail.d.ts +19 -1
  115. package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
  116. package/lib/esm/curve/CurveLocationDetail.js +39 -0
  117. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  118. package/lib/esm/curve/LineString3d.js +1 -1
  119. package/lib/esm/curve/LineString3d.js.map +1 -1
  120. package/lib/esm/curve/OffsetOptions.d.ts +1 -1
  121. package/lib/esm/curve/OffsetOptions.js +1 -1
  122. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  123. package/lib/esm/curve/RegionOps.d.ts +2 -1
  124. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  125. package/lib/esm/curve/RegionOps.js +2 -1
  126. package/lib/esm/curve/RegionOps.js.map +1 -1
  127. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +23 -7
  128. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
  129. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +43 -35
  130. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  131. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts +211 -0
  132. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.d.ts.map +1 -0
  133. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +995 -0
  134. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -0
  135. package/lib/esm/geometry3d/Angle.d.ts +18 -5
  136. package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
  137. package/lib/esm/geometry3d/Angle.js +23 -7
  138. package/lib/esm/geometry3d/Angle.js.map +1 -1
  139. package/lib/esm/geometry3d/AngleSweep.d.ts +14 -1
  140. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  141. package/lib/esm/geometry3d/AngleSweep.js +47 -12
  142. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  143. package/lib/esm/geometry3d/Matrix3d.d.ts +6 -4
  144. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  145. package/lib/esm/geometry3d/Matrix3d.js +6 -4
  146. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  147. package/lib/esm/geometry3d/Point3dVector3d.d.ts +2 -3
  148. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  149. package/lib/esm/geometry3d/Point3dVector3d.js +2 -3
  150. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  151. package/lib/esm/geometry3d/PointHelpers.d.ts +6 -5
  152. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  153. package/lib/esm/geometry3d/PointHelpers.js +11 -10
  154. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  155. package/lib/esm/geometry3d/Range.d.ts +6 -1
  156. package/lib/esm/geometry3d/Range.d.ts.map +1 -1
  157. package/lib/esm/geometry3d/Range.js +9 -3
  158. package/lib/esm/geometry3d/Range.js.map +1 -1
  159. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  160. package/lib/esm/geometry3d/Transform.js +1 -1
  161. package/lib/esm/geometry3d/Transform.js.map +1 -1
  162. package/lib/esm/numerics/Newton.d.ts +3 -3
  163. package/lib/esm/numerics/Newton.d.ts.map +1 -1
  164. package/lib/esm/numerics/Newton.js +14 -16
  165. package/lib/esm/numerics/Newton.js.map +1 -1
  166. package/lib/esm/numerics/Polynomials.d.ts +2 -2
  167. package/lib/esm/numerics/Polynomials.js +2 -2
  168. package/lib/esm/numerics/Polynomials.js.map +1 -1
  169. package/lib/esm/polyface/PolyfaceBuilder.d.ts +7 -4
  170. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  171. package/lib/esm/polyface/PolyfaceBuilder.js +8 -4
  172. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  173. package/lib/esm/polyface/PolyfaceQuery.d.ts +3 -3
  174. package/lib/esm/polyface/PolyfaceQuery.js +3 -3
  175. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  176. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  177. package/lib/esm/serialization/BGFBWriter.js +2 -2
  178. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  179. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  180. package/lib/esm/topology/Graph.d.ts +1 -1
  181. package/lib/esm/topology/Graph.js +2 -2
  182. package/lib/esm/topology/Graph.js.map +1 -1
  183. package/lib/esm/topology/HalfEdgeNodeXYZUV.d.ts +1 -1
  184. package/lib/esm/topology/HalfEdgeNodeXYZUV.js +1 -1
  185. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  186. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts +57 -15
  187. package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
  188. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +168 -127
  189. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  190. package/lib/esm/topology/HalfEdgePositionDetail.d.ts +35 -35
  191. package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
  192. package/lib/esm/topology/HalfEdgePositionDetail.js +63 -41
  193. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  194. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +64 -12
  195. package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
  196. package/lib/esm/topology/InsertAndRetriangulateContext.js +173 -74
  197. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  198. package/lib/esm/topology/Triangulation.d.ts +16 -10
  199. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  200. package/lib/esm/topology/Triangulation.js +24 -31
  201. package/lib/esm/topology/Triangulation.js.map +1 -1
  202. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"InsertAndRetriangulateContext.d.ts","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD,OAAO,EAAY,aAAa,EAAgB,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;;;GAKG;AACH,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAK1C,OAAO;IAOP,kDAAkD;WACpC,MAAM,CAAC,KAAK,EAAE,aAAa;IAGzC,uDAAuD;IACvD,IAAW,KAAK,IAAI,aAAa,CAAwB;IAIzD,OAAO,CAAC,2BAA2B;IAenC,qDAAqD;IAC9C,KAAK;IAIZ,iEAAiE;IACjE,IAAW,eAAe,2BAA6B;IACvD;;;;OAIG;IACI,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAkClE,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAc5D,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAMxC,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IAmChE,WAAW,CAAC,cAAc,EAAE,sBAAsB,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,GAAG,OAAO;CA2F7I"}
1
+ {"version":3,"file":"InsertAndRetriangulateContext.d.ts","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAIxD,OAAO,EAAY,aAAa,EAAgB,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,oBAAY,sBAAsB;IAChC,gGAAgG;IAChG,MAAM,IAAA;IACN,4EAA4E;IAC5E,OAAO,IAAA;IACP;;;OAGG;IACH,eAAe,IAAA;IACf;;;OAGG;IACH,gBAAgB,IAAA;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAMP,kDAAkD;WACpC,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,GAAE,MAAqC;IAG3F,uDAAuD;IACvD,IAAW,KAAK,IAAI,aAAa,CAEhC;IACD;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAenC,qDAAqD;IAC9C,KAAK;IAGZ,kEAAkE;IAClE,IAAW,eAAe,2BAEzB;IACD,0DAA0D;IACnD,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAkCzE,kDAAkD;IAC3C,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB;IAanE;;;;MAIE;IACK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAM/D,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;IAqBzB,sGAAsG;IACtG,OAAO,CAAC,iBAAiB;IA4BzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;;;;;OAMG;IACI,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO;IAgCxF;;;;;;OAMG;IACI,WAAW,CAChB,cAAc,EAAE,sBAAsB,EACtC,MAAM,EAAE,OAAO,EACf,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,GACxD,OAAO;CAqFX"}
@@ -7,8 +7,11 @@
7
7
  * @module Topology
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.InsertAndRetriangulateContext = void 0;
10
+ exports.InsertAndRetriangulateContext = exports.InsertedVertexZOptions = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const Geometry_1 = require("../Geometry");
11
13
  const Point3dVector3d_1 = require("../geometry3d/Point3dVector3d");
14
+ const PolygonOps_1 = require("../geometry3d/PolygonOps");
12
15
  const Ray3d_1 = require("../geometry3d/Ray3d");
13
16
  const Polynomials_1 = require("../numerics/Polynomials");
14
17
  const Graph_1 = require("./Graph");
@@ -16,37 +19,59 @@ const HalfEdgeMarkSet_1 = require("./HalfEdgeMarkSet");
16
19
  const HalfEdgePointInGraphSearch_1 = require("./HalfEdgePointInGraphSearch");
17
20
  const HalfEdgePositionDetail_1 = require("./HalfEdgePositionDetail");
18
21
  const Triangulation_1 = require("./Triangulation");
22
+ /**
23
+ * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.
24
+ * @internal
25
+ */
26
+ var InsertedVertexZOptions;
27
+ (function (InsertedVertexZOptions) {
28
+ /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */
29
+ InsertedVertexZOptions[InsertedVertexZOptions["Ignore"] = 0] = "Ignore";
30
+ /** The point's z-coordinate replaces the existing vertex's z-coordinate. */
31
+ InsertedVertexZOptions[InsertedVertexZOptions["Replace"] = 1] = "Replace";
32
+ /**
33
+ * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the
34
+ * point's z-coordinate is larger.
35
+ */
36
+ InsertedVertexZOptions[InsertedVertexZOptions["ReplaceIfLarger"] = 2] = "ReplaceIfLarger";
37
+ /**
38
+ * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the
39
+ * point's z-coordinate is smaller.
40
+ */
41
+ InsertedVertexZOptions[InsertedVertexZOptions["ReplaceIfSmaller"] = 3] = "ReplaceIfSmaller";
42
+ })(InsertedVertexZOptions || (exports.InsertedVertexZOptions = InsertedVertexZOptions = {}));
19
43
  /**
20
44
  * Context for repeated insertion of new points in a graph.
21
- * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)
45
+ * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and
46
+ * `HalfEdgeMask.BOUNDARY_EDGE`).
22
47
  * * After each insertion, the current "position" within the graph is remembered so that each subsequent insertion
23
- * can reuse that position as start for walking to the new point.
48
+ * can reuse that position as start for walking to the new point.
49
+ * @internal
24
50
  */
25
51
  class InsertAndRetriangulateContext {
26
- // Temporaries used in reAimFromFace
27
- // private _lastBefore: HalfEdgePositionDetail;
28
- // private _firstAfter: HalfEdgePositionDetail;
29
- constructor(graph) {
52
+ constructor(graph, tolerance) {
30
53
  this._graph = graph;
31
54
  this._edgeSet = HalfEdgeMarkSet_1.MarkedEdgeSet.create(graph);
32
55
  this._searcher = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
33
- // this._lastBefore = HalfEdgePositionDetail.create();
34
- // this._firstAfter = HalfEdgePositionDetail.create();
56
+ this._tolerance = tolerance;
35
57
  }
36
58
  /** Create a new context referencing the graph. */
37
- static create(graph) {
38
- return new InsertAndRetriangulateContext(graph);
59
+ static create(graph, tolerance = Geometry_1.Geometry.smallMetricDistance) {
60
+ return new InsertAndRetriangulateContext(graph, tolerance);
39
61
  }
40
62
  /** Query the (pointer to) the graph in the context. */
41
- get graph() { return this._graph; }
42
- // Walk face from edgeNode; insert new edges back to start node from all except
43
- // immediate successor and predecessor.
44
- // insert all new nodes, and nodes of the existing face, in edgeSet.
63
+ get graph() {
64
+ return this._graph;
65
+ }
66
+ /**
67
+ * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.
68
+ * Insert all new nodes and nodes of the existing face in edgeSet.
69
+ */
45
70
  retriangulateFromBaseVertex(centralNode) {
46
71
  const numNode = centralNode.countEdgesAroundFace();
47
- this._edgeSet.addAroundFace(centralNode);
48
- if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)
72
+ if (numNode < 4 || centralNode.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR))
49
73
  return;
74
+ this._edgeSet.addAroundFace(centralNode);
50
75
  const numEdge = numNode - 3;
51
76
  let farNode = centralNode.faceSuccessor;
52
77
  let nearNode = centralNode;
@@ -61,13 +86,11 @@ class InsertAndRetriangulateContext {
61
86
  reset() {
62
87
  this._searcher = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
63
88
  }
64
- /** Return a (reference to!) the current position in the graph */
65
- get currentPosition() { return this._searcher; }
66
- /**
67
- * Linear search through the graph
68
- * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.
69
- * @param xyz
70
- */
89
+ /** Return a (reference to!) the current position in the graph. */
90
+ get currentPosition() {
91
+ return this._searcher;
92
+ }
93
+ /** Linear search for the nearest graph edge or vertex. */
71
94
  searchForNearestEdgeOrVertex(xyz) {
72
95
  const position = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
73
96
  position.setDTag(Number.MAX_VALUE);
@@ -103,6 +126,7 @@ class InsertAndRetriangulateContext {
103
126
  }
104
127
  return position;
105
128
  }
129
+ /** Linear search for the nearest graph vertex. */
106
130
  searchForNearestVertex(xyz) {
107
131
  const position = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
108
132
  position.setDTag(Number.MAX_VALUE);
@@ -116,60 +140,139 @@ class InsertAndRetriangulateContext {
116
140
  }
117
141
  return position;
118
142
  }
119
- resetSearch(xyz, maxDim) {
120
- if (maxDim > 0)
143
+ /**
144
+ * Reset the "current" position to a vertex nearest the target point.
145
+ * @param xyz target point
146
+ * @param searchEdgesToo reset to nearest vertex or edge
147
+ */
148
+ resetSearch(xyz, searchEdgesToo) {
149
+ if (searchEdgesToo)
121
150
  this._searcher = this.searchForNearestEdgeOrVertex(xyz);
122
151
  else
123
152
  this._searcher = this.searchForNearestVertex(xyz);
124
153
  }
125
- insertAndRetriangulate(xyz, newZWins) {
126
- this.moveToPoint(this._searcher, xyz);
127
- const seedNode = this._searcher.node;
128
- let stat = false;
129
- if (seedNode === undefined) {
154
+ /** Reclassify the current interior face hit if it is too close to an edge of the face. */
155
+ reclassifyFaceHit(point) {
156
+ if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR))
157
+ return false;
158
+ const pointXY = Point3dVector3d_1.Point3d.create(point.x, point.y);
159
+ const face = this._searcher.node.collectAroundFace((node) => {
160
+ const xy = Point3dVector3d_1.Point3d.create(node.x, node.y);
161
+ xy.node = node; // decorate the point with the node
162
+ return xy;
163
+ });
164
+ const detail = PolygonOps_1.PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);
165
+ (0, core_bentley_1.assert)(detail.code === Geometry_1.PolygonLocation.OnPolygonEdgeInterior);
166
+ if (detail.a > this._tolerance)
167
+ return false;
168
+ const edge = face[detail.closestEdgeIndex].node;
169
+ const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;
170
+ if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)
171
+ this._searcher.resetAsVertex(vertex);
172
+ else
173
+ this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);
174
+ return true;
175
+ }
176
+ /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */
177
+ reclassifyEdgeHit(point) {
178
+ if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.BOUNDARY_EDGE))
179
+ return false;
180
+ const pointXY = Point3dVector3d_1.Point3d.create(point.x, point.y);
181
+ const superFace = [];
182
+ for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {
183
+ const xy = Point3dVector3d_1.Point3d.create(n.x, n.y);
184
+ xy.node = n; // decorate the point with a node of the left face
185
+ superFace.push(xy);
186
+ }
187
+ for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {
188
+ const xy = Point3dVector3d_1.Point3d.create(n.x, n.y);
189
+ xy.node = n; // decorate the point with a node of the right face
190
+ superFace.push(xy);
130
191
  }
131
- else if (this._searcher.isFace) {
132
- if (!seedNode.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR)) {
133
- const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);
134
- this.retriangulateFromBaseVertex(newInteriorNode);
192
+ const detail = PolygonOps_1.PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);
193
+ if (detail.a > this._tolerance)
194
+ return false;
195
+ const edge = superFace[detail.closestEdgeIndex].node;
196
+ const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;
197
+ if (detail.code === Geometry_1.PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)
198
+ this._searcher.resetAsVertex(vertex);
199
+ else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)
200
+ this._searcher.resetAsVertex(vertex);
201
+ else
202
+ this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);
203
+ return true;
204
+ }
205
+ /**
206
+ * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around
207
+ * the vertex loop.
208
+ */
209
+ updateZAroundVertex(node, point, zOption) {
210
+ if (InsertedVertexZOptions.Ignore === zOption)
211
+ return;
212
+ if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))
213
+ return;
214
+ if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))
215
+ return;
216
+ // only replace z; preserving xy preserves convexity of the hull
217
+ node.setXYZAroundVertex(node.x, node.y, point.z);
218
+ }
219
+ /**
220
+ * Insert a new point into the graph and retriangulate.
221
+ * @param point the coordinates of the node to be inserted.
222
+ * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the
223
+ * same x and y.
224
+ * @returns true if and only if the point didn't need to be inserted or was successfully inserted.
225
+ */
226
+ insertAndRetriangulate(point, newZWins) {
227
+ this.moveToPoint(this._searcher, point);
228
+ if (this._searcher.node === undefined)
229
+ return false;
230
+ // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).
231
+ // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles
232
+ // adjacent to the hull.
233
+ if (!this.reclassifyFaceHit(point))
234
+ this.reclassifyEdgeHit(point);
235
+ if (this._searcher.isFace) {
236
+ // insert point into the graph if it lies in an interior face
237
+ if (!this._searcher.node.isMaskSet(Graph_1.HalfEdgeMask.EXTERIOR)) {
238
+ const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);
239
+ this.retriangulateFromBaseVertex(newNode);
135
240
  Triangulation_1.Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);
136
- this._searcher.resetAsVertex(newInteriorNode);
241
+ this._searcher.resetAsVertex(newNode);
137
242
  }
138
- stat = true;
139
243
  }
140
244
  else if (this._searcher.isEdge) {
141
- const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction);
245
+ // insert point into the graph by splitting its containing edge
246
+ const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction);
142
247
  const newB = newA.vertexPredecessor;
248
+ this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace
143
249
  this.retriangulateFromBaseVertex(newA);
144
250
  this.retriangulateFromBaseVertex(newB);
145
251
  Triangulation_1.Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);
146
252
  this._searcher.resetAsVertex(newA);
147
- stat = true;
148
253
  }
149
254
  else if (this._searcher.isVertex) {
150
- // There's already a vertex there. Maybe the z is different.
151
- if (newZWins)
152
- seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);
153
- stat = true;
154
- }
155
- else {
156
- stat = false;
255
+ // no need to insert point as there's already a vertex there, but maybe update its z-coord
256
+ this.updateZAroundVertex(this._searcher.node, point, newZWins);
157
257
  }
158
- return stat;
258
+ return true;
159
259
  }
160
- // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.
161
- // Prior content in movingPosition is used as seed.
162
- // Return true if successful.
163
- moveToPoint(movingPosition, xyz, announcer) {
164
- const psc = HalfEdgePointInGraphSearch_1.PointSearchContext.create();
260
+ /**
261
+ * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.
262
+ * @param movingPosition input seed for search, updated on return.
263
+ * @param target point to search for containing topology in the graph.
264
+ * @param announcer optional callback invoked during search loop; return false to end search.
265
+ * @returns true if search was successful.
266
+ */
267
+ moveToPoint(movingPosition, target, announcer) {
268
+ const psc = HalfEdgePointInGraphSearch_1.PointSearchContext.create(this._tolerance);
165
269
  movingPosition.setITag(0);
166
270
  if (movingPosition.isUnclassified) {
167
- moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);
271
+ moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, Graph_1.HalfEdgeMask.NULL_MASK);
168
272
  if (movingPosition.isUnclassified)
169
273
  return false;
170
274
  }
171
275
  let trap = 0;
172
- // double tol = vu_getMergeTol (pGraph);
173
276
  const ray = Ray3d_1.Ray3d.createXAxis();
174
277
  for (; movingPosition.getITag() === 0 && trap < 2;) {
175
278
  if (announcer !== undefined) {
@@ -177,40 +280,40 @@ class InsertAndRetriangulateContext {
177
280
  if (!continueSearch)
178
281
  break;
179
282
  }
180
- if (!psc.setSearchRay(movingPosition, xyz, ray)) {
283
+ if (!psc.setSearchRay(movingPosition, target, ray)) {
181
284
  return false;
182
285
  }
183
286
  else if (movingPosition.isFace) {
184
287
  const lastBefore = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
185
288
  const firstAfter = HalfEdgePositionDetail_1.HalfEdgePositionDetail.create();
186
289
  const rc = psc.reAimAroundFace(movingPosition.node, ray, ray.a, lastBefore, firstAfter);
187
- // reAimAroundFace returns lots of cases in `lastBefore` !!
290
+ // reAimAroundFace returns lots of cases in `lastBefore`
188
291
  switch (rc) {
189
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_NoHits: {
292
+ case HalfEdgePointInGraphSearch_1.RayClassification.NoHits: {
190
293
  movingPosition.resetAsUnknown();
191
294
  break;
192
295
  }
193
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetOnVertex: {
296
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetOnVertex: {
194
297
  movingPosition.setFrom(lastBefore);
195
298
  movingPosition.setITag(1);
196
299
  break;
197
300
  }
198
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetOnEdge: {
301
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetOnEdge: {
199
302
  movingPosition.setFrom(lastBefore);
200
303
  movingPosition.setITag(1);
201
304
  break;
202
305
  }
203
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_Bracket: {
204
- movingPosition.resetAsFace(lastBefore.node, xyz);
306
+ case HalfEdgePointInGraphSearch_1.RayClassification.Bracket: {
307
+ movingPosition.resetAsFace(lastBefore.node, target);
205
308
  movingPosition.setITag(1);
206
309
  break;
207
310
  }
208
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetBefore: {
209
- movingPosition.resetAsFace(movingPosition.node, xyz);
311
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetBefore: { // do we ever get here?
312
+ movingPosition.resetAsFace(movingPosition.node, target);
210
313
  movingPosition.setITag(1);
211
314
  break;
212
315
  }
213
- case HalfEdgePointInGraphSearch_1.RayClassification.RC_TargetAfter: {
316
+ case HalfEdgePointInGraphSearch_1.RayClassification.TargetAfter: {
214
317
  if (movingPosition.node === lastBefore.node
215
318
  && movingPosition.isFace
216
319
  && (lastBefore.isEdge || lastBefore.isVertex)) {
@@ -235,28 +338,24 @@ class InsertAndRetriangulateContext {
235
338
  break;
236
339
  }
237
340
  }
238
- if (movingPosition.isAtXY(xyz.x, xyz.y))
341
+ if (movingPosition.isAtXY(target.x, target.y))
239
342
  return true;
240
343
  if (trap > 1) {
241
- // Ugh. We exited the loop by repeatedly hitting the same node
242
- // with edge or vertex type in lastBefore.
243
- // This happens only when the target point is exterior.
244
- // (Heavy triangulation use cases start with a convex hull and only do interior intersections,
245
- // so case only happens in contrived unit tests.... so far ...)
246
- // What to mark?
247
- // Leave it as is, but mark as exterior target
248
- //
344
+ // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.
345
+ // This happens only when the target point is exterior (heavy triangulation use cases start with a convex
346
+ // hull and only do interior intersections, so case only happens in contrived unit tests so far
347
+ // What to mark? Leave it as is, but mark as exterior target
249
348
  if (movingPosition.node !== undefined) {
250
349
  movingPosition.setIsExteriorTarget(true);
251
350
  }
252
351
  return false;
253
352
  }
254
- // Murky here ... should never be hit. Has never been hit in unit tests.
353
+ // murky here; should never be hit. Has never been hit in unit tests.
255
354
  return false;
256
355
  }
257
356
  }
258
357
  exports.InsertAndRetriangulateContext = InsertAndRetriangulateContext;
259
- // Create a VuPositionDetail for specified fraction along any unmasked edge.
358
+ /** Set `position` to a random unmasked edge at the specified fraction. */
260
359
  function moveToAnyUnmaskedEdge(graph, position, edgeFraction, skipMask) {
261
360
  for (const candidate of graph.allHalfEdges) {
262
361
  if (!candidate.isMaskSet(skipMask)) {
@@ -1 +1 @@
1
- {"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary. (e.g. as typically marked with HalfEdgeMask.EXTERIOR)\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n // Temporaries used in reAimFromFace\r\n // private _lastBefore: HalfEdgePositionDetail;\r\n // private _firstAfter: HalfEdgePositionDetail;\r\n\r\n private constructor(graph: HalfEdgeGraph) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n // this._lastBefore = HalfEdgePositionDetail.create();\r\n // this._firstAfter = HalfEdgePositionDetail.create();\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph) {\r\n return new InsertAndRetriangulateContext(graph);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph { return this._graph; }\r\n // Walk face from edgeNode; insert new edges back to start node from all except\r\n // immediate successor and predecessor.\r\n // insert all new nodes, and nodes of the existing face, in edgeSet.\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n this._edgeSet.addAroundFace(centralNode);\r\n if (numNode < 4 || centralNode.signedFaceArea() <= 0.0)\r\n return;\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n\r\n /** Return a (reference to!) the current position in the graph */\r\n public get currentPosition() { return this._searcher; }\r\n /**\r\n * Linear search through the graph\r\n * * Returns a HalfEdgePositionDetail for the nearest edge or vertex.\r\n * @param xyz\r\n */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n\r\n public resetSearch(xyz: Point3d, maxDim: number) {\r\n if (maxDim > 0)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n public insertAndRetriangulate(xyz: Point3d, newZWins: boolean): boolean {\r\n this.moveToPoint(this._searcher, xyz);\r\n const seedNode = this._searcher.node;\r\n let stat = false;\r\n if (seedNode === undefined) {\r\n } else if (this._searcher.isFace) {\r\n if (!seedNode.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newInteriorNode = this._graph.createEdgeXYZHalfEdge(xyz.x, xyz.y, xyz.z, 0, seedNode, 0);\r\n this.retriangulateFromBaseVertex(newInteriorNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newInteriorNode);\r\n }\r\n stat = true;\r\n } else if (this._searcher.isEdge) {\r\n const newA = this._graph.splitEdgeAtFraction(seedNode, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n stat = true;\r\n } else if (this._searcher.isVertex) {\r\n // There's already a vertex there. Maybe the z is different.\r\n if (newZWins)\r\n seedNode.setXYZAroundVertex(xyz.x, xyz.y, xyz.z);\r\n stat = true;\r\n } else {\r\n stat = false;\r\n }\r\n return stat;\r\n }\r\n\r\n // Advance movingPosition to a face, edge, or vertex position detail that contains xyz.\r\n // Prior content in movingPosition is used as seed.\r\n // Return true if successful.\r\n public moveToPoint(movingPosition: HalfEdgePositionDetail, xyz: Point3d, announcer?: (position: HalfEdgePositionDetail) => boolean): boolean {\r\n const psc = PointSearchContext.create();\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, 0);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n // double tol = vu_getMergeTol (pGraph);\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, xyz, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore` !!\r\n switch (rc) {\r\n case RayClassification.RC_NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetBefore: {\r\n movingPosition.resetAsFace(movingPosition.node, xyz);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.RC_TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)){\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(xyz.x, xyz.y))\r\n return true;\r\n if (trap > 1) {\r\n // Ugh. We exited the loop by repeatedly hitting the same node\r\n // with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior.\r\n // (Heavy triangulation use cases start with a convex hull and only do interior intersections,\r\n // so case only happens in contrived unit tests.... so far ...)\r\n // What to mark?\r\n // Leave it as is, but mark as exterior target\r\n //\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // Murky here ... should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n\r\n}\r\n// Create a VuPositionDetail for specified fraction along any unmasked edge.\r\nfunction moveToAnyUnmaskedEdge(graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
1
+ {"version":3,"file":"InsertAndRetriangulateContext.js","sourceRoot":"","sources":["../../../src/topology/InsertAndRetriangulateContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Topology\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from \"./Graph\";\r\nimport { MarkedEdgeSet } from \"./HalfEdgeMarkSet\";\r\nimport { PointSearchContext, RayClassification } from \"./HalfEdgePointInGraphSearch\";\r\nimport { HalfEdgePositionDetail } from \"./HalfEdgePositionDetail\";\r\nimport { Triangulator } from \"./Triangulation\";\r\n\r\n/**\r\n * Options for setting the z-coordinate of a vertex in the triangulation when a point with the same xy is inserted.\r\n * @internal\r\n */\r\nexport enum InsertedVertexZOptions {\r\n /** The point's z-coordinate is ignored, and the existing vertex's z-coordinate is unchanged. */\r\n Ignore,\r\n /** The point's z-coordinate replaces the existing vertex's z-coordinate. */\r\n Replace,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is larger.\r\n */\r\n ReplaceIfLarger,\r\n /**\r\n * Like [[InsertedVertexZOptions.Replace]], but the existing vertex's z-coordinate is updated only if the\r\n * point's z-coordinate is smaller.\r\n */\r\n ReplaceIfSmaller,\r\n}\r\n\r\n/**\r\n * Context for repeated insertion of new points in a graph.\r\n * * Initial graph should have clean outer boundary (e.g., as typically marked with `HalfEdgeMask.EXTERIOR` and\r\n * `HalfEdgeMask.BOUNDARY_EDGE`).\r\n * * After each insertion, the current \"position\" within the graph is remembered so that each subsequent insertion\r\n * can reuse that position as start for walking to the new point.\r\n * @internal\r\n */\r\nexport class InsertAndRetriangulateContext {\r\n private _graph: HalfEdgeGraph;\r\n private _edgeSet: MarkedEdgeSet;\r\n private _searcher: HalfEdgePositionDetail;\r\n private _tolerance: number;\r\n\r\n private constructor(graph: HalfEdgeGraph, tolerance: number) {\r\n this._graph = graph;\r\n this._edgeSet = MarkedEdgeSet.create(graph)!;\r\n this._searcher = HalfEdgePositionDetail.create();\r\n this._tolerance = tolerance;\r\n }\r\n /** Create a new context referencing the graph. */\r\n public static create(graph: HalfEdgeGraph, tolerance: number = Geometry.smallMetricDistance) {\r\n return new InsertAndRetriangulateContext(graph, tolerance);\r\n }\r\n /** Query the (pointer to) the graph in the context. */\r\n public get graph(): HalfEdgeGraph {\r\n return this._graph;\r\n }\r\n /**\r\n * Walk face from edgeNode. Insert new edges back to start node from all except immediate successor and predecessor.\r\n * Insert all new nodes and nodes of the existing face in edgeSet.\r\n */\r\n private retriangulateFromBaseVertex(centralNode: HalfEdge) {\r\n const numNode = centralNode.countEdgesAroundFace();\r\n if (numNode < 4 || centralNode.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return;\r\n this._edgeSet.addAroundFace(centralNode);\r\n const numEdge = numNode - 3;\r\n let farNode = centralNode.faceSuccessor;\r\n let nearNode = centralNode;\r\n for (let i = 0; i < numEdge; i++) {\r\n farNode = farNode.faceSuccessor;\r\n nearNode = this._graph.createEdgeHalfEdgeHalfEdge(nearNode, 0, farNode, 0);\r\n farNode = nearNode.faceSuccessor;\r\n this._edgeSet.addToSet(nearNode);\r\n }\r\n }\r\n /** Reset the \"current\" position to unknown state. */\r\n public reset() {\r\n this._searcher = HalfEdgePositionDetail.create();\r\n }\r\n /** Return a (reference to!) the current position in the graph. */\r\n public get currentPosition() {\r\n return this._searcher;\r\n }\r\n /** Linear search for the nearest graph edge or vertex. */\r\n public searchForNearestEdgeOrVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n const xyzC = Point3d.create();\r\n let fractionC;\r\n let distanceC;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n const nodeB = nodeA.faceSuccessor;\r\n fractionC = SmallSystem.lineSegment3dXYClosestPointUnbounded(nodeA, nodeB, xyz);\r\n if (fractionC !== undefined) {\r\n if (fractionC > 1.0) {\r\n distanceC = xyz.distanceXY(nodeB);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeB);\r\n position.setDTag(distanceC);\r\n }\r\n } else if (fractionC < 0.0) {\r\n distanceC = xyz.distanceXY(nodeA);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceC);\r\n }\r\n } else {\r\n nodeA.fractionToPoint3d(fractionC, xyzC);\r\n\r\n distanceC = xyz.distanceXY(xyzC);\r\n if (distanceC < position.getDTag()!) {\r\n position.resetAtEdgeAndFraction(nodeA, fractionC);\r\n }\r\n }\r\n }\r\n }\r\n return position;\r\n }\r\n /** Linear search for the nearest graph vertex. */\r\n public searchForNearestVertex(xyz: Point3d): HalfEdgePositionDetail {\r\n const position = HalfEdgePositionDetail.create();\r\n position.setDTag(Number.MAX_VALUE);\r\n let distanceA;\r\n for (const nodeA of this._graph.allHalfEdges) {\r\n distanceA = xyz.distanceXY(nodeA);\r\n if (distanceA < position.getDTag()!) {\r\n position.resetAsVertex(nodeA);\r\n position.setDTag(distanceA);\r\n }\r\n }\r\n return position;\r\n }\r\n /**\r\n * Reset the \"current\" position to a vertex nearest the target point.\r\n * @param xyz target point\r\n * @param searchEdgesToo reset to nearest vertex or edge\r\n */\r\n public resetSearch(xyz: Point3d, searchEdgesToo: boolean): void {\r\n if (searchEdgesToo)\r\n this._searcher = this.searchForNearestEdgeOrVertex(xyz);\r\n else\r\n this._searcher = this.searchForNearestVertex(xyz);\r\n }\r\n /** Reclassify the current interior face hit if it is too close to an edge of the face. */\r\n private reclassifyFaceHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isFace || this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const face = this._searcher.node.collectAroundFace((node: HalfEdge) => {\r\n const xy = Point3d.create(node.x, node.y);\r\n (xy as any).node = node; // decorate the point with the node\r\n return xy;\r\n });\r\n const detail = PolygonOps.closestPointOnBoundary(face, pointXY, this._tolerance);\r\n assert(detail.code === PolygonLocation.OnPolygonEdgeInterior);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = face[detail.closestEdgeIndex].node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /** Reclassify the current interior edge hit if it is too close to an edge of either adjacent face. */\r\n private reclassifyEdgeHit(point: Point3d): boolean {\r\n if (undefined === this._searcher.node || !this._searcher.isEdge || this._searcher.node.isMaskSet(HalfEdgeMask.BOUNDARY_EDGE))\r\n return false;\r\n const pointXY = Point3d.create(point.x, point.y);\r\n const superFace: Point3d[] = [];\r\n for (let n = this._searcher.node.faceSuccessor; n !== this._searcher.node; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the left face\r\n superFace.push(xy);\r\n }\r\n for (let n = this._searcher.node.vertexPredecessor; n !== this._searcher.node.edgeMate; n = n.faceSuccessor) {\r\n const xy = Point3d.create(n.x, n.y);\r\n (xy as any).node = n; // decorate the point with a node of the right face\r\n superFace.push(xy);\r\n }\r\n const detail = PolygonOps.closestPointOnBoundary(superFace, pointXY, this._tolerance);\r\n if (detail.a > this._tolerance)\r\n return false;\r\n const edge = (superFace[detail.closestEdgeIndex] as any).node;\r\n const vertex = (detail.closestEdgeParam < 0.5) ? edge : edge.faceSuccessor;\r\n if (detail.code === PolygonLocation.OnPolygonVertex) // can happen if superFace is non-concave (e.g., a dart)\r\n this._searcher.resetAsVertex(vertex);\r\n else if (detail.point.distanceSquaredXY(vertex) <= this._tolerance * this._tolerance)\r\n this._searcher.resetAsVertex(vertex);\r\n else\r\n this._searcher.resetAtEdgeAndFraction(edge, detail.closestEdgeParam);\r\n return true;\r\n }\r\n /**\r\n * Given a point that was just inserted into the graph at the given node, apply the z-coordinate rule around\r\n * the vertex loop.\r\n */\r\n private updateZAroundVertex(node: HalfEdge, point: Point3d, zOption: InsertedVertexZOptions): void {\r\n if (InsertedVertexZOptions.Ignore === zOption)\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfLarger === zOption) && (point.z <= node.z))\r\n return;\r\n if ((InsertedVertexZOptions.ReplaceIfSmaller === zOption) && (point.z >= node.z))\r\n return;\r\n // only replace z; preserving xy preserves convexity of the hull\r\n node.setXYZAroundVertex(node.x, node.y, point.z);\r\n }\r\n /**\r\n * Insert a new point into the graph and retriangulate.\r\n * @param point the coordinates of the node to be inserted.\r\n * @param newZWins rule governing when `point.z` should override the z-coordinate of an existing vertex with the\r\n * same x and y.\r\n * @returns true if and only if the point didn't need to be inserted or was successfully inserted.\r\n */\r\n public insertAndRetriangulate(point: Point3d, newZWins: InsertedVertexZOptions): boolean {\r\n this.moveToPoint(this._searcher, point);\r\n if (this._searcher.node === undefined)\r\n return false;\r\n // Try to avoid skinny triangles. If we iterated, this could get out of control (e.g., inserting point into a fan).\r\n // Limiting to one reclassification ensures the hit doesn't move more than tol and reduces skinny triangles\r\n // adjacent to the hull.\r\n if (!this.reclassifyFaceHit(point))\r\n this.reclassifyEdgeHit(point);\r\n if (this._searcher.isFace) {\r\n // insert point into the graph if it lies in an interior face\r\n if (!this._searcher.node.isMaskSet(HalfEdgeMask.EXTERIOR)) {\r\n const newNode = this._graph.createEdgeXYZHalfEdge(point.x, point.y, point.z, 0, this._searcher.node, 0);\r\n this.retriangulateFromBaseVertex(newNode);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newNode);\r\n }\r\n } else if (this._searcher.isEdge) {\r\n // insert point into the graph by splitting its containing edge\r\n const newA = this._graph.splitEdgeAtFraction(this._searcher.node, this._searcher.edgeFraction!);\r\n const newB = newA.vertexPredecessor;\r\n this.updateZAroundVertex(newA, point, InsertedVertexZOptions.Replace); // always replace\r\n this.retriangulateFromBaseVertex(newA);\r\n this.retriangulateFromBaseVertex(newB);\r\n Triangulator.flipTrianglesInEdgeSet(this._graph, this._edgeSet);\r\n this._searcher.resetAsVertex(newA);\r\n } else if (this._searcher.isVertex) {\r\n // no need to insert point as there's already a vertex there, but maybe update its z-coord\r\n this.updateZAroundVertex(this._searcher.node, point, newZWins);\r\n }\r\n return true;\r\n }\r\n /**\r\n * Advance movingPosition to a face, edge, or vertex position detail that contains `target`.\r\n * @param movingPosition input seed for search, updated on return.\r\n * @param target point to search for containing topology in the graph.\r\n * @param announcer optional callback invoked during search loop; return false to end search.\r\n * @returns true if search was successful.\r\n */\r\n public moveToPoint(\r\n movingPosition: HalfEdgePositionDetail,\r\n target: Point3d,\r\n announcer?: (position: HalfEdgePositionDetail) => boolean,\r\n ): boolean {\r\n const psc = PointSearchContext.create(this._tolerance);\r\n movingPosition.setITag(0);\r\n if (movingPosition.isUnclassified) {\r\n moveToAnyUnmaskedEdge(this.graph, movingPosition, 0.5, HalfEdgeMask.NULL_MASK);\r\n if (movingPosition.isUnclassified)\r\n return false;\r\n }\r\n let trap = 0;\r\n const ray = Ray3d.createXAxis();\r\n for (; movingPosition.getITag() === 0 && trap < 2;) {\r\n if (announcer !== undefined) {\r\n const continueSearch = announcer(movingPosition);\r\n if (!continueSearch)\r\n break;\r\n }\r\n if (!psc.setSearchRay(movingPosition, target, ray)) {\r\n return false;\r\n } else if (movingPosition.isFace) {\r\n const lastBefore = HalfEdgePositionDetail.create();\r\n const firstAfter = HalfEdgePositionDetail.create();\r\n const rc = psc.reAimAroundFace(movingPosition.node!, ray, ray.a!, lastBefore, firstAfter);\r\n // reAimAroundFace returns lots of cases in `lastBefore`\r\n switch (rc) {\r\n case RayClassification.NoHits: {\r\n movingPosition.resetAsUnknown();\r\n break;\r\n }\r\n case RayClassification.TargetOnVertex: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetOnEdge: {\r\n movingPosition.setFrom(lastBefore);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.Bracket: {\r\n movingPosition.resetAsFace(lastBefore.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetBefore: { // do we ever get here?\r\n movingPosition.resetAsFace(movingPosition.node, target);\r\n movingPosition.setITag(1);\r\n break;\r\n }\r\n case RayClassification.TargetAfter: {\r\n if (movingPosition.node === lastBefore.node\r\n && movingPosition.isFace\r\n && (lastBefore.isEdge || lastBefore.isVertex)) {\r\n trap++;\r\n } else {\r\n trap = 0;\r\n }\r\n movingPosition.setFrom(lastBefore);\r\n break;\r\n }\r\n }\r\n } else if (movingPosition.isEdge) {\r\n psc.reAimFromEdge(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n } else if (movingPosition.isVertex) {\r\n psc.reAimFromVertex(movingPosition, ray, ray.a!);\r\n if (movingPosition.isUnclassified)\r\n break;\r\n }\r\n }\r\n if (movingPosition.isAtXY(target.x, target.y))\r\n return true;\r\n if (trap > 1) {\r\n // ugh! We exited the loop by repeatedly hitting the same node with edge or vertex type in lastBefore.\r\n // This happens only when the target point is exterior (heavy triangulation use cases start with a convex\r\n // hull and only do interior intersections, so case only happens in contrived unit tests so far\r\n // What to mark? Leave it as is, but mark as exterior target\r\n if (movingPosition.node !== undefined) {\r\n movingPosition.setIsExteriorTarget(true);\r\n }\r\n return false;\r\n }\r\n // murky here; should never be hit. Has never been hit in unit tests.\r\n return false;\r\n }\r\n}\r\n/** Set `position` to a random unmasked edge at the specified fraction. */\r\nfunction moveToAnyUnmaskedEdge(\r\n graph: HalfEdgeGraph, position: HalfEdgePositionDetail, edgeFraction: number, skipMask: HalfEdgeMask,\r\n): boolean {\r\n for (const candidate of graph.allHalfEdges) {\r\n if (!candidate.isMaskSet(skipMask)) {\r\n position.resetAtEdgeAndFraction(candidate, edgeFraction);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n"]}
@@ -2,15 +2,16 @@ import { LineStringDataVariant, MultiLineStringDataVariant } from "../geometry3d
2
2
  import { Point3d } from "../geometry3d/Point3dVector3d";
3
3
  import { HalfEdge, HalfEdgeGraph, HalfEdgeMask } from "./Graph";
4
4
  import { MarkedEdgeSet } from "./HalfEdgeMarkSet";
5
+ import { InsertedVertexZOptions } from "./InsertAndRetriangulateContext";
5
6
  /**
6
- * (static) methods for triangulating polygons
7
+ * Static methods for triangulating polygons and points.
7
8
  * * @internal
8
9
  */
9
10
  export declare class Triangulator {
10
11
  /** Given the six nodes that make up two bordering triangles, "pinch" and relocate the nodes to flip them
11
12
  * * The shared edge mates are c and e.
12
13
  * * (abc) are a triangle in CCW order
13
- * * (dfe) are a triangle in CCW order. (!! node dfe instead of def.)
14
+ * * (dfe) are a triangle in CCW order. (Note: dfe instead of def!!)
14
15
  */
15
16
  private static flipEdgeBetweenTriangles;
16
17
  /**
@@ -42,11 +43,16 @@ export declare class Triangulator {
42
43
  * * If revealed to be an improvement, conduct the flip, mark involved nodes as unvisited, and repeat until all nodes are visited
43
44
  */
44
45
  static flipTrianglesInEdgeSet(graph: HalfEdgeGraph, edgeSet: MarkedEdgeSet): number;
45
- /** Create a graph with a triangulation points.
46
- * * The outer limit of the graph is the convex hull of the points.
47
- * * The outside loop is marked `HalfEdgeMask.EXTERIOR`
46
+ /**
47
+ * Create a graph from an xy-triangulation of the given points.
48
+ * * The outer boundary of the graph is the xy-convex hull of the points; it is marked `HalfEdgeMask.EXTERIOR`.
49
+ * @param points the points to triangulate
50
+ * @param zRule optional rule for updating the z-coordinate of an existing vertex when an xy-duplicate point is
51
+ * inserted into the graph. Default is `InsertedVertexZOptions.ReplaceIfLarger`.
52
+ * @param pointTolerance optional xy-distance tolerance for equating vertices. Default is
53
+ * `Geometry.smallMetricDistance`.
48
54
  */
49
- static createTriangulatedGraphFromPoints(points: Point3d[]): HalfEdgeGraph | undefined;
55
+ static createTriangulatedGraphFromPoints(points: Point3d[], zRule?: InsertedVertexZOptions, pointTolerance?: number): HalfEdgeGraph | undefined;
50
56
  /**
51
57
  * * Only one outer loop permitted.
52
58
  * * Largest area loop is assumed outer.
@@ -74,7 +80,7 @@ export declare class Triangulator {
74
80
  /**
75
81
  * Triangulate the polygon made up of by a series of points.
76
82
  * * The loop may be either CCW or CW -- CCW order will be used for triangles.
77
- * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops
83
+ * * To triangulate a polygon with holes, use createTriangulatedGraphFromLoops.
78
84
  */
79
85
  static createTriangulatedGraphFromSingleLoop(data: LineStringDataVariant): HalfEdgeGraph | undefined;
80
86
  /**
@@ -109,11 +115,11 @@ export declare class Triangulator {
109
115
  */
110
116
  private static maskAndOrientNewFaceLoop;
111
117
  /**
112
- * create a circular doubly linked list of internal and external nodes from polygon points in the specified winding order
118
+ * Create a circular doubly linked list of internal and external nodes from polygon points in the specified winding order.
113
119
  * * This applies the masks used by typical applications:
114
- * * HalfEdgeMask.BOUNDARY on both sides
120
+ * * HalfEdgeMask.BOUNDARY on both sides.
115
121
  * * HalfEdgeMask.PRIMARY_EDGE on both sides.
116
- * * Use `createFaceLoopFromCoordinatesAndMasks` for detail control of masks.
122
+ * * Use [[createFaceLoopFromCoordinatesAndMasks]] for detailed control of masks.
117
123
  */
118
124
  static createFaceLoopFromCoordinates(graph: HalfEdgeGraph, data: LineStringDataVariant, returnPositiveAreaLoop: boolean, markExterior: boolean): HalfEdge | undefined;
119
125
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Triangulation.d.ts","sourceRoot":"","sources":["../../../src/topology/Triangulation.ts"],"names":[],"mappings":"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"}