@itwin/core-geometry 4.1.0-dev.73 → 4.1.0-dev.75

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 (69) hide show
  1. package/lib/cjs/core-geometry.d.ts +2 -0
  2. package/lib/cjs/core-geometry.d.ts.map +1 -1
  3. package/lib/cjs/core-geometry.js +2 -0
  4. package/lib/cjs/core-geometry.js.map +1 -1
  5. package/lib/cjs/curve/CurvePrimitive.d.ts +5 -0
  6. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  7. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  8. package/lib/cjs/geometry3d/PolygonOps.d.ts +5 -0
  9. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  10. package/lib/cjs/geometry3d/PolygonOps.js +29 -19
  11. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  12. package/lib/cjs/polyface/PolyfaceQuery.d.ts +25 -7
  13. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  14. package/lib/cjs/polyface/PolyfaceQuery.js +61 -8
  15. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  16. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
  17. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
  18. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
  19. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  20. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
  21. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
  22. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
  23. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  24. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
  25. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
  26. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
  27. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  28. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
  29. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
  30. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  31. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
  32. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  33. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +30 -5
  34. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  35. package/lib/esm/core-geometry.d.ts +2 -0
  36. package/lib/esm/core-geometry.d.ts.map +1 -1
  37. package/lib/esm/core-geometry.js +2 -0
  38. package/lib/esm/core-geometry.js.map +1 -1
  39. package/lib/esm/curve/CurvePrimitive.d.ts +5 -0
  40. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  41. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  42. package/lib/esm/geometry3d/PolygonOps.d.ts +5 -0
  43. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  44. package/lib/esm/geometry3d/PolygonOps.js +29 -19
  45. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  46. package/lib/esm/polyface/PolyfaceQuery.d.ts +25 -7
  47. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  48. package/lib/esm/polyface/PolyfaceQuery.js +62 -9
  49. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  50. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
  51. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
  52. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
  53. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  54. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
  55. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
  56. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
  57. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  58. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
  59. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
  60. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
  61. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  62. package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
  63. package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
  64. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  65. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
  66. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  67. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +30 -6
  68. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  69. package/package.json +3 -3
@@ -3,43 +3,48 @@
3
3
  */
4
4
  import { Range2d, Range3d } from "../../geometry3d/Range";
5
5
  import { LowAndHighXY } from "../../geometry3d/XYZProps";
6
- import { LinearSearchRange2dArray } from "./LinearSearchRange2dArray";
7
- export type OptionalLinearSearchRange2dArray<T> = LinearSearchRange2dArray<T> | undefined;
6
+ import { Range2dSearchInterface } from "./Range2dSearchInterface";
8
7
  /**
9
- * A GriddedRaggedRange2dSet is
10
- * * A doubly dimensioned array of LinearSearchRange2dArray
11
- * * Each entry represents a block in a uniform grid within the master range of the GriddedRaggedRange2dSet.
8
+ * Type abbreviation to allow undefined as a Range2dSearchInterface parameter.
9
+ * @internal
10
+ */
11
+ export type OptionalRange2dSearchInterface<T> = Range2dSearchInterface<T> | undefined;
12
+ /**
13
+ * A GriddedRaggedRange2dSet is:
14
+ * * A doubly dimensioned array of Range2dSearchInterface.
15
+ * * Each entry represents a block in a uniform grid within the master range.
12
16
  * * Member ranges are noted in the grid block containing the range's lower left corner.
13
17
  * * Member ranges larger than twice the grid size are rejected by the insert method.
14
18
  * * Hence a search involving a point in grid block (i,j) must examine ranges in grid blocks left and below, i.e. (i-1,j-1), (i-1,j), (i,j-1)
15
- * @internal
19
+ * @public
16
20
  */
17
- export declare class GriddedRaggedRange2dSet<T> {
21
+ export declare class GriddedRaggedRange2dSet<T> implements Range2dSearchInterface<T> {
18
22
  private _range;
19
23
  private _numXEdge;
20
24
  private _numYEdge;
21
- /** Each grid block is a simple linear search set
22
- *
23
- */
25
+ /** Each grid block is a simple linear search set */
24
26
  private _rangesInBlock;
27
+ private static _workRange?;
25
28
  private constructor();
26
29
  /**
27
30
  * Create an (empty) set of ranges.
28
- * @param range
29
- * @param numXEdge
30
- * @param numYEdge
31
+ * @param range master range
32
+ * @param numXEdge size of grid in x direction
33
+ * @param numYEdge size of grid in y direction
31
34
  */
32
35
  static create<T>(range: Range2d, numXEdge: number, numYEdge: number): GriddedRaggedRange2dSet<T> | undefined;
33
36
  private xIndex;
34
37
  private yIndex;
35
38
  private getBlock;
36
39
  /** If possible, insert a range into the set.
37
- * * Decline to insert (and return false) if
38
- * * range is null
39
- * * range is not completely contained in the overall range of this set.
40
- * * range x or y extent is larger than 2 grid blocks.
40
+ * * Decline to insert (and return false) if:
41
+ * * range is null
42
+ * * range is not completely contained in the overall range of this set
43
+ * * range x or y extent is larger than 2 grid blocks
41
44
  */
42
- conditionalInsert(range: Range2d | Range3d, tag: T): boolean;
45
+ conditionalInsert(range: Range2d | Range3d | LowAndHighXY, tag: T): boolean;
46
+ /** Add a range to the search set. */
47
+ addRange(range: LowAndHighXY, tag: T): void;
43
48
  /**
44
49
  * * Search a single block
45
50
  * * Pass each range and tag to handler
@@ -76,6 +81,9 @@ export declare class GriddedRaggedRange2dSet<T> {
76
81
  * @return false if search terminated by handler. Return true if no handler returned false.
77
82
  */
78
83
  searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean;
79
- visitChildren(initialDepth: number, handler: (depth: number, child: LinearSearchRange2dArray<T>) => void): void;
84
+ /** Return the overall range of all members. */
85
+ totalRange(result?: Range2d): Range2d;
86
+ /** Call the handler on each defined block in the grid. */
87
+ visitChildren(initialDepth: number, handler: (depth: number, child: Range2dSearchInterface<T>) => void): void;
80
88
  }
81
89
  //# sourceMappingURL=GriddedRaggedRange2dSet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GriddedRaggedRange2dSet.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,MAAM,gCAAgC,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAC1F;;;;;;;;GAQG;AACH,qBAAa,uBAAuB,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoD;IAC1E,OAAO;IAaP;;;;;OAKG;WACW,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,SAAS;IAKnH,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAQhB;;;;;OAKG;IACI,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO;IAoBnE;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAM9B;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAQ5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAa7F,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,IAAI;CAQhH"}
1
+ {"version":3,"file":"GriddedRaggedRange2dSet.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEtF;;;;;;;;GAQG;AACH,qBAAa,uBAAuB,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,oDAAoD;IACpD,OAAO,CAAC,cAAc,CAAkD;IACxE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAU;IACpC,OAAO;IAaP;;;;;OAKG;WACW,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,SAAS;IAKnH,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAQhB;;;;;OAKG;IACI,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO;IAoBlF,qCAAqC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAGlD;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAM9B;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAQ5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAapG,+CAA+C;IACxC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAW5C,0DAA0D;IACnD,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI;CAQ9G"}
@@ -8,15 +8,16 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.GriddedRaggedRange2dSet = void 0;
11
+ const Range_1 = require("../../geometry3d/Range");
11
12
  const LinearSearchRange2dArray_1 = require("./LinearSearchRange2dArray");
12
13
  /**
13
- * A GriddedRaggedRange2dSet is
14
- * * A doubly dimensioned array of LinearSearchRange2dArray
15
- * * Each entry represents a block in a uniform grid within the master range of the GriddedRaggedRange2dSet.
14
+ * A GriddedRaggedRange2dSet is:
15
+ * * A doubly dimensioned array of Range2dSearchInterface.
16
+ * * Each entry represents a block in a uniform grid within the master range.
16
17
  * * Member ranges are noted in the grid block containing the range's lower left corner.
17
18
  * * Member ranges larger than twice the grid size are rejected by the insert method.
18
19
  * * Hence a search involving a point in grid block (i,j) must examine ranges in grid blocks left and below, i.e. (i-1,j-1), (i-1,j), (i,j-1)
19
- * @internal
20
+ * @public
20
21
  */
21
22
  class GriddedRaggedRange2dSet {
22
23
  constructor(range, numXEdge, numYEdge) {
@@ -34,9 +35,9 @@ class GriddedRaggedRange2dSet {
34
35
  }
35
36
  /**
36
37
  * Create an (empty) set of ranges.
37
- * @param range
38
- * @param numXEdge
39
- * @param numYEdge
38
+ * @param range master range
39
+ * @param numXEdge size of grid in x direction
40
+ * @param numYEdge size of grid in y direction
40
41
  */
41
42
  static create(range, numXEdge, numYEdge) {
42
43
  if (numXEdge < 1 || numYEdge < 1 || range.isNull || range.isSinglePoint)
@@ -60,13 +61,13 @@ class GriddedRaggedRange2dSet {
60
61
  return undefined;
61
62
  }
62
63
  /** If possible, insert a range into the set.
63
- * * Decline to insert (and return false) if
64
- * * range is null
65
- * * range is not completely contained in the overall range of this set.
66
- * * range x or y extent is larger than 2 grid blocks.
64
+ * * Decline to insert (and return false) if:
65
+ * * range is null
66
+ * * range is not completely contained in the overall range of this set
67
+ * * range x or y extent is larger than 2 grid blocks
67
68
  */
68
69
  conditionalInsert(range, tag) {
69
- if (range.isNull)
70
+ if (Range_1.Range2d.isNull(range))
70
71
  return false;
71
72
  if (!this._range.containsRange(range))
72
73
  return false;
@@ -85,6 +86,10 @@ class GriddedRaggedRange2dSet {
85
86
  }
86
87
  return false;
87
88
  }
89
+ /** Add a range to the search set. */
90
+ addRange(range, tag) {
91
+ this.conditionalInsert(range, tag);
92
+ }
88
93
  /**
89
94
  * * Search a single block
90
95
  * * Pass each range and tag to handler
@@ -150,6 +155,19 @@ class GriddedRaggedRange2dSet {
150
155
  }
151
156
  return true;
152
157
  }
158
+ /** Return the overall range of all members. */
159
+ totalRange(result) {
160
+ if (result)
161
+ result.setNull();
162
+ else
163
+ result = Range_1.Range2d.createNull();
164
+ this.visitChildren(0, (_depth, child) => {
165
+ const childRange = GriddedRaggedRange2dSet._workRange = child.totalRange(GriddedRaggedRange2dSet._workRange);
166
+ result.extendRange(childRange);
167
+ });
168
+ return result;
169
+ }
170
+ /** Call the handler on each defined block in the grid. */
153
171
  visitChildren(initialDepth, handler) {
154
172
  for (const row of this._rangesInBlock) {
155
173
  for (const block of row) {
@@ -1 +1 @@
1
- {"version":3,"file":"GriddedRaggedRange2dSet.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSet.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,yEAAsE;AAGtE;;;;;;;;GAQG;AACH,MAAa,uBAAuB;IAQlC,YAAoB,KAAc,EAAE,QAAgB,EAAE,QAAgB;QACpE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,OAAO,GAA+C,EAAE,CAAC;YAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;gBACvC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACzB;YACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACnC;IACH,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAI,KAAc,EAAE,QAAgB,EAAE,QAAgB;QACxE,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa;YACrE,OAAO,SAAS,CAAC;QACnB,OAAO,IAAI,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IACO,MAAM,CAAC,CAAS;QACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IACO,MAAM,CAAC,CAAS;QACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IACO,QAAQ,CAAC,CAAS,EAAE,CAAS;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;YAChE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,mDAAwB,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAClC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACI,iBAAiB,CAAC,KAAwB,EAAE,GAAM;QACvD,IAAI,KAAK,CAAC,MAAM;YACd,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE;YACjB,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;OAOG;IACK,sBAAsB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,OAA4C;QACrH,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa;YAChB,OAAO,IAAI,CAAC;QACd,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD;;;;;;;OAOG;IACK,2BAA2B,CAAC,CAAS,EAAE,CAAS,EAAE,SAAuB,EAAE,OAA4C;QAC7H,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa;YAChB,OAAO,IAAI,CAAC;QACd,OAAO,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,OAA4C;QAChF,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;eAClD,IAAI,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;eACpD,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;eACpD,IAAI,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAAC,SAAuB,EAAE,OAA4C;QACxF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE;YACvC,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC;oBAC7D,OAAO,KAAK,CAAC;aAChB;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACM,aAAa,CAAC,YAAoB,EAAE,OAAoE;QAC7G,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;YACrC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;gBACvB,IAAI,KAAK;oBACP,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;aAChC;SACF;IACH,CAAC;CACF;AAnJD,0DAmJC","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 RangeSearch\r\n */\r\n\r\nimport { Range2d, Range3d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { LinearSearchRange2dArray } from \"./LinearSearchRange2dArray\";\r\n\r\nexport type OptionalLinearSearchRange2dArray<T> = LinearSearchRange2dArray<T> | undefined;\r\n/**\r\n * A GriddedRaggedRange2dSet is\r\n * * A doubly dimensioned array of LinearSearchRange2dArray\r\n * * Each entry represents a block in a uniform grid within the master range of the GriddedRaggedRange2dSet.\r\n * * Member ranges are noted in the grid block containing the range's lower left corner.\r\n * * Member ranges larger than twice the grid size are rejected by the insert method.\r\n * * Hence a search involving a point in grid block (i,j) must examine ranges in grid blocks left and below, i.e. (i-1,j-1), (i-1,j), (i,j-1)\r\n * @internal\r\n */\r\nexport class GriddedRaggedRange2dSet<T> {\r\n private _range: Range2d;\r\n private _numXEdge: number;\r\n private _numYEdge: number;\r\n /** Each grid block is a simple linear search set\r\n *\r\n */\r\n private _rangesInBlock: Array<Array<OptionalLinearSearchRange2dArray<T>>>;\r\n private constructor(range: Range2d, numXEdge: number, numYEdge: number) {\r\n this._range = range;\r\n this._numXEdge = numXEdge;\r\n this._numYEdge = numYEdge;\r\n this._rangesInBlock = [];\r\n for (let j = 0; j < this._numYEdge; j++) {\r\n const thisRow: Array<OptionalLinearSearchRange2dArray<T>> = [];\r\n for (let i = 0; i < this._numXEdge; i++) {\r\n thisRow.push(undefined);\r\n }\r\n this._rangesInBlock.push(thisRow);\r\n }\r\n }\r\n /**\r\n * Create an (empty) set of ranges.\r\n * @param range\r\n * @param numXEdge\r\n * @param numYEdge\r\n */\r\n public static create<T>(range: Range2d, numXEdge: number, numYEdge: number): GriddedRaggedRange2dSet<T> | undefined {\r\n if (numXEdge < 1 || numYEdge < 1 || range.isNull || range.isSinglePoint)\r\n return undefined;\r\n return new GriddedRaggedRange2dSet(range.clone(), numXEdge, numYEdge);\r\n }\r\n private xIndex(x: number): number {\r\n const fraction = (x - this._range.low.x) / (this._range.high.x - this._range.low.x);\r\n return Math.floor(fraction * this._numXEdge);\r\n }\r\n private yIndex(y: number): number {\r\n const fraction = (y - this._range.low.y) / (this._range.high.y - this._range.low.y);\r\n return Math.floor(fraction * this._numXEdge);\r\n }\r\n private getBlock(i: number, j: number): LinearSearchRange2dArray<T> | undefined {\r\n if (i >= 0 && i < this._numXEdge && j >= 0 && j < this._numYEdge) {\r\n if (!this._rangesInBlock[j][i])\r\n this._rangesInBlock[j][i] = new LinearSearchRange2dArray();\r\n return this._rangesInBlock[j][i];\r\n }\r\n return undefined;\r\n }\r\n /** If possible, insert a range into the set.\r\n * * Decline to insert (and return false) if\r\n * * range is null\r\n * * range is not completely contained in the overall range of this set.\r\n * * range x or y extent is larger than 2 grid blocks.\r\n */\r\n public conditionalInsert(range: Range2d | Range3d, tag: T): boolean {\r\n if (range.isNull)\r\n return false;\r\n if (!this._range.containsRange(range))\r\n return false;\r\n const xIndex0 = this.xIndex(range.low.x);\r\n const xIndex1 = this.xIndex(range.high.x);\r\n const yIndex0 = this.yIndex(range.low.y);\r\n const yIndex1 = this.yIndex(range.high.y);\r\n if (!(xIndex0 === xIndex1 || xIndex0 + 1 === xIndex1))\r\n return false;\r\n if (!(yIndex0 === yIndex1 || yIndex0 + 1 === yIndex1))\r\n return false;\r\n const rangesInBlock = this.getBlock(xIndex0, yIndex0);\r\n if (rangesInBlock) {\r\n rangesInBlock.addRange(range, tag);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * * Search a single block\r\n * * Pass each range and tag to handler\r\n * * and return false if bad cell or if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n private searchXYInIndexedBlock(i: number, j: number, x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const rangesInBlock = this.getBlock(i, j);\r\n if (!rangesInBlock)\r\n return true;\r\n return rangesInBlock.searchXY(x, y, handler);\r\n }\r\n /**\r\n * * Search a single block\r\n * * Pass each range and tag to handler\r\n * * and return false if bad cell or if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n private searchRange2dInIndexedBlock(i: number, j: number, testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const rangesInBlock = this.getBlock(i, j);\r\n if (!rangesInBlock)\r\n return true;\r\n return rangesInBlock.searchRange2d(testRange, handler);\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const i = this.xIndex(x);\r\n const j = this.yIndex(y);\r\n return this.searchXYInIndexedBlock(i, j, x, y, handler)\r\n && this.searchXYInIndexedBlock(i - 1, j, x, y, handler)\r\n && this.searchXYInIndexedBlock(i, j - 1, x, y, handler)\r\n && this.searchXYInIndexedBlock(i - 1, j - 1, x, y, handler);\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const xIndex0 = this.xIndex(testRange.low.x) - 1;\r\n const xIndex1 = this.xIndex(testRange.high.x);\r\n const yIndex0 = this.yIndex(testRange.low.y) - 1;\r\n const yIndex1 = this.yIndex(testRange.high.y);\r\n for (let i = xIndex0; i <= xIndex1; i++) {\r\n for (let j = yIndex0; j <= yIndex1; j++) {\r\n if (!this.searchRange2dInIndexedBlock(i, j, testRange, handler))\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n public visitChildren(initialDepth: number, handler: (depth: number, child: LinearSearchRange2dArray<T>) => void) {\r\n for (const row of this._rangesInBlock) {\r\n for (const block of row) {\r\n if (block)\r\n handler(initialDepth, block);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GriddedRaggedRange2dSet.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSet.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 RangeSearch\r\n */\r\n\r\nimport { Range2d, Range3d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { LinearSearchRange2dArray } from \"./LinearSearchRange2dArray\";\r\nimport { Range2dSearchInterface } from \"./Range2dSearchInterface\";\r\n\r\n/**\r\n * Type abbreviation to allow undefined as a Range2dSearchInterface parameter.\r\n * @internal\r\n */\r\nexport type OptionalRange2dSearchInterface<T> = Range2dSearchInterface<T> | undefined;\r\n\r\n/**\r\n * A GriddedRaggedRange2dSet is:\r\n * * A doubly dimensioned array of Range2dSearchInterface.\r\n * * Each entry represents a block in a uniform grid within the master range.\r\n * * Member ranges are noted in the grid block containing the range's lower left corner.\r\n * * Member ranges larger than twice the grid size are rejected by the insert method.\r\n * * Hence a search involving a point in grid block (i,j) must examine ranges in grid blocks left and below, i.e. (i-1,j-1), (i-1,j), (i,j-1)\r\n * @public\r\n */\r\nexport class GriddedRaggedRange2dSet<T> implements Range2dSearchInterface<T> {\r\n private _range: Range2d;\r\n private _numXEdge: number;\r\n private _numYEdge: number;\r\n /** Each grid block is a simple linear search set */\r\n private _rangesInBlock: Array<Array<OptionalRange2dSearchInterface<T>>>;\r\n private static _workRange?: Range2d;\r\n private constructor(range: Range2d, numXEdge: number, numYEdge: number) {\r\n this._range = range;\r\n this._numXEdge = numXEdge;\r\n this._numYEdge = numYEdge;\r\n this._rangesInBlock = [];\r\n for (let j = 0; j < this._numYEdge; j++) {\r\n const thisRow: Array<OptionalRange2dSearchInterface<T>> = [];\r\n for (let i = 0; i < this._numXEdge; i++) {\r\n thisRow.push(undefined);\r\n }\r\n this._rangesInBlock.push(thisRow);\r\n }\r\n }\r\n /**\r\n * Create an (empty) set of ranges.\r\n * @param range master range\r\n * @param numXEdge size of grid in x direction\r\n * @param numYEdge size of grid in y direction\r\n */\r\n public static create<T>(range: Range2d, numXEdge: number, numYEdge: number): GriddedRaggedRange2dSet<T> | undefined {\r\n if (numXEdge < 1 || numYEdge < 1 || range.isNull || range.isSinglePoint)\r\n return undefined;\r\n return new GriddedRaggedRange2dSet(range.clone(), numXEdge, numYEdge);\r\n }\r\n private xIndex(x: number): number {\r\n const fraction = (x - this._range.low.x) / (this._range.high.x - this._range.low.x);\r\n return Math.floor(fraction * this._numXEdge);\r\n }\r\n private yIndex(y: number): number {\r\n const fraction = (y - this._range.low.y) / (this._range.high.y - this._range.low.y);\r\n return Math.floor(fraction * this._numXEdge);\r\n }\r\n private getBlock(i: number, j: number): OptionalRange2dSearchInterface<T> {\r\n if (i >= 0 && i < this._numXEdge && j >= 0 && j < this._numYEdge) {\r\n if (!this._rangesInBlock[j][i])\r\n this._rangesInBlock[j][i] = new LinearSearchRange2dArray();\r\n return this._rangesInBlock[j][i];\r\n }\r\n return undefined;\r\n }\r\n /** If possible, insert a range into the set.\r\n * * Decline to insert (and return false) if:\r\n * * range is null\r\n * * range is not completely contained in the overall range of this set\r\n * * range x or y extent is larger than 2 grid blocks\r\n */\r\n public conditionalInsert(range: Range2d | Range3d | LowAndHighXY, tag: T): boolean {\r\n if (Range2d.isNull(range))\r\n return false;\r\n if (!this._range.containsRange(range))\r\n return false;\r\n const xIndex0 = this.xIndex(range.low.x);\r\n const xIndex1 = this.xIndex(range.high.x);\r\n const yIndex0 = this.yIndex(range.low.y);\r\n const yIndex1 = this.yIndex(range.high.y);\r\n if (!(xIndex0 === xIndex1 || xIndex0 + 1 === xIndex1))\r\n return false;\r\n if (!(yIndex0 === yIndex1 || yIndex0 + 1 === yIndex1))\r\n return false;\r\n const rangesInBlock = this.getBlock(xIndex0, yIndex0);\r\n if (rangesInBlock) {\r\n rangesInBlock.addRange(range, tag);\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Add a range to the search set. */\r\n public addRange(range: LowAndHighXY, tag: T): void {\r\n this.conditionalInsert(range, tag);\r\n }\r\n /**\r\n * * Search a single block\r\n * * Pass each range and tag to handler\r\n * * and return false if bad cell or if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n private searchXYInIndexedBlock(i: number, j: number, x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const rangesInBlock = this.getBlock(i, j);\r\n if (!rangesInBlock)\r\n return true;\r\n return rangesInBlock.searchXY(x, y, handler);\r\n }\r\n /**\r\n * * Search a single block\r\n * * Pass each range and tag to handler\r\n * * and return false if bad cell or if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n private searchRange2dInIndexedBlock(i: number, j: number, testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const rangesInBlock = this.getBlock(i, j);\r\n if (!rangesInBlock)\r\n return true;\r\n return rangesInBlock.searchRange2d(testRange, handler);\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const i = this.xIndex(x);\r\n const j = this.yIndex(y);\r\n return this.searchXYInIndexedBlock(i, j, x, y, handler)\r\n && this.searchXYInIndexedBlock(i - 1, j, x, y, handler)\r\n && this.searchXYInIndexedBlock(i, j - 1, x, y, handler)\r\n && this.searchXYInIndexedBlock(i - 1, j - 1, x, y, handler);\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n const xIndex0 = this.xIndex(testRange.low.x) - 1;\r\n const xIndex1 = this.xIndex(testRange.high.x);\r\n const yIndex0 = this.yIndex(testRange.low.y) - 1;\r\n const yIndex1 = this.yIndex(testRange.high.y);\r\n for (let i = xIndex0; i <= xIndex1; i++) {\r\n for (let j = yIndex0; j <= yIndex1; j++) {\r\n if (!this.searchRange2dInIndexedBlock(i, j, testRange, handler))\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n /** Return the overall range of all members. */\r\n public totalRange(result?: Range2d): Range2d {\r\n if (result)\r\n result.setNull();\r\n else\r\n result = Range2d.createNull();\r\n this.visitChildren(0, (_depth, child) => {\r\n const childRange = GriddedRaggedRange2dSet._workRange = child.totalRange(GriddedRaggedRange2dSet._workRange);\r\n result!.extendRange(childRange);\r\n });\r\n return result;\r\n }\r\n /** Call the handler on each defined block in the grid. */\r\n public visitChildren(initialDepth: number, handler: (depth: number, child: Range2dSearchInterface<T>) => void) {\r\n for (const row of this._rangesInBlock) {\r\n for (const block of row) {\r\n if (block)\r\n handler(initialDepth, block);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1,20 +1,21 @@
1
1
  /** @packageDocumentation
2
2
  * @module RangeSearch
3
3
  */
4
- import { Range2d, Range3d } from "../../geometry3d/Range";
4
+ import { Range2d } from "../../geometry3d/Range";
5
5
  import { LowAndHighXY } from "../../geometry3d/XYZProps";
6
- import { LinearSearchRange2dArray } from "./LinearSearchRange2dArray";
6
+ import { Range2dSearchInterface } from "./Range2dSearchInterface";
7
7
  /**
8
- * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which
8
+ * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which:
9
9
  * * Most ranges are of somewhat consistent size.
10
10
  * * A modest number of oversizes.
11
11
  * * Maintain the smallish ones in a GriddedRaggedRange2dSet.
12
- * * Maintain the overflows in a LinearSearchRange2dArray
13
- * @internal
12
+ * * Maintain the overflows in a Range2dSearchInterface.
13
+ * @public
14
14
  */
15
- export declare class GriddedRaggedRange2dSetWithOverflow<T> {
15
+ export declare class GriddedRaggedRange2dSetWithOverflow<T> implements Range2dSearchInterface<T> {
16
16
  private _gridSet;
17
17
  private _overflowSet;
18
+ private static _workRange?;
18
19
  private constructor();
19
20
  /**
20
21
  * Create an (empty) set of ranges.
@@ -47,7 +48,10 @@ export declare class GriddedRaggedRange2dSetWithOverflow<T> {
47
48
  * * range is not completely contained in the overall range of this set.
48
49
  * * range x or y extent is larger than 2 grid blocks.
49
50
  */
50
- addRange(range: Range2d | Range3d, tag: T): void;
51
- visitChildren(initialDepth: number, handler: (depth: number, child: LinearSearchRange2dArray<T>) => void): void;
51
+ addRange(range: LowAndHighXY, tag: T): void;
52
+ /** Return the overall range of all members. */
53
+ totalRange(result?: Range2d): Range2d;
54
+ /** Call the handler on the overflow set, and on each defined block in the grid. */
55
+ visitChildren(initialDepth: number, handler: (depth: number, child: Range2dSearchInterface<T>) => void): void;
52
56
  }
53
57
  //# sourceMappingURL=GriddedRaggedRange2dSetWithOverflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GriddedRaggedRange2dSetWithOverflow.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;GAOG;AACH,qBAAa,mCAAmC,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO;IAIP;;;;;OAKG;WACW,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mCAAmC,CAAC,CAAC,CAAC,GAAG,SAAS;IAM/H;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAG5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAGpG;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAMhD,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,IAAI;CAIhH"}
1
+ {"version":3,"file":"GriddedRaggedRange2dSetWithOverflow.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;GAOG;AACH,qBAAa,mCAAmC,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAU;IACpC,OAAO;IAIP;;;;;OAKG;WACW,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mCAAmC,CAAC,CAAC,CAAC,GAAG,SAAS;IAM/H;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAG5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAGpG;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAMlD,+CAA+C;IACxC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAW5C,mFAAmF;IAC5E,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI;CAI9G"}
@@ -8,15 +8,16 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.GriddedRaggedRange2dSetWithOverflow = void 0;
11
+ const Range_1 = require("../../geometry3d/Range");
11
12
  const GriddedRaggedRange2dSet_1 = require("./GriddedRaggedRange2dSet");
12
13
  const LinearSearchRange2dArray_1 = require("./LinearSearchRange2dArray");
13
14
  /**
14
- * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which
15
+ * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which:
15
16
  * * Most ranges are of somewhat consistent size.
16
17
  * * A modest number of oversizes.
17
18
  * * Maintain the smallish ones in a GriddedRaggedRange2dSet.
18
- * * Maintain the overflows in a LinearSearchRange2dArray
19
- * @internal
19
+ * * Maintain the overflows in a Range2dSearchInterface.
20
+ * @public
20
21
  */
21
22
  class GriddedRaggedRange2dSetWithOverflow {
22
23
  constructor(gridSet, overflowSet) {
@@ -64,11 +65,24 @@ class GriddedRaggedRange2dSetWithOverflow {
64
65
  * * range x or y extent is larger than 2 grid blocks.
65
66
  */
66
67
  addRange(range, tag) {
67
- if (!range.isNull) {
68
+ if (!Range_1.Range2d.isNull(range)) {
68
69
  if (!this._gridSet.conditionalInsert(range, tag))
69
70
  this._overflowSet.addRange(range, tag);
70
71
  }
71
72
  }
73
+ /** Return the overall range of all members. */
74
+ totalRange(result) {
75
+ if (result)
76
+ result.setNull();
77
+ else
78
+ result = Range_1.Range2d.createNull();
79
+ this.visitChildren(0, (_depth, child) => {
80
+ const childRange = GriddedRaggedRange2dSetWithOverflow._workRange = child.totalRange(GriddedRaggedRange2dSetWithOverflow._workRange);
81
+ result.extendRange(childRange);
82
+ });
83
+ return result;
84
+ }
85
+ /** Call the handler on the overflow set, and on each defined block in the grid. */
72
86
  visitChildren(initialDepth, handler) {
73
87
  handler(initialDepth, this._overflowSet);
74
88
  this._gridSet.visitChildren(initialDepth + 1, handler);
@@ -1 +1 @@
1
- {"version":3,"file":"GriddedRaggedRange2dSetWithOverflow.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAIH,uEAAoE;AACpE,yEAAsE;AAEtE;;;;;;;GAOG;AACH,MAAa,mCAAmC;IAG9C,YAAoB,OAAmC,EAAE,WAAwC;QAC/F,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAI,KAAc,EAAE,QAAgB,EAAE,QAAgB;QACxE,MAAM,KAAK,GAAG,iDAAuB,CAAC,MAAM,CAAI,KAAK,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnF,IAAI,KAAK;YACP,OAAO,IAAI,mCAAmC,CAAI,KAAK,EAAE,IAAI,mDAAwB,EAAK,CAAC,CAAC;QAC9F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,OAA4C;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAAC,SAAuB,EAAE,OAA4C;QACxF,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChH,CAAC;IACD;;;;;OAKG;IACI,QAAQ,CAAC,KAAwB,EAAE,GAAM;QAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAC1C;IACH,CAAC;IACM,aAAa,CAAC,YAAoB,EAAE,OAAoE;QAC7G,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAzDD,kFAyDC","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 RangeSearch\r\n */\r\n\r\nimport { Range2d, Range3d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { GriddedRaggedRange2dSet } from \"./GriddedRaggedRange2dSet\";\r\nimport { LinearSearchRange2dArray } from \"./LinearSearchRange2dArray\";\r\n\r\n/**\r\n * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which\r\n * * Most ranges are of somewhat consistent size.\r\n * * A modest number of oversizes.\r\n * * Maintain the smallish ones in a GriddedRaggedRange2dSet.\r\n * * Maintain the overflows in a LinearSearchRange2dArray\r\n * @internal\r\n */\r\nexport class GriddedRaggedRange2dSetWithOverflow<T> {\r\n private _gridSet: GriddedRaggedRange2dSet<T>;\r\n private _overflowSet: LinearSearchRange2dArray<T>;\r\n private constructor(gridSet: GriddedRaggedRange2dSet<T>, overflowSet: LinearSearchRange2dArray<T>) {\r\n this._gridSet = gridSet;\r\n this._overflowSet = overflowSet;\r\n }\r\n /**\r\n * Create an (empty) set of ranges.\r\n * @param range\r\n * @param numXEdge\r\n * @param numYEdge\r\n */\r\n public static create<T>(range: Range2d, numXEdge: number, numYEdge: number): GriddedRaggedRange2dSetWithOverflow<T> | undefined {\r\n const grids = GriddedRaggedRange2dSet.create<T>(range.clone(), numXEdge, numYEdge);\r\n if (grids)\r\n return new GriddedRaggedRange2dSetWithOverflow<T>(grids, new LinearSearchRange2dArray<T>());\r\n return undefined;\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n return this._gridSet.searchXY(x, y, handler) && this._overflowSet.searchXY(x, y, handler);\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n return this._gridSet.searchRange2d(testRange, handler) && this._overflowSet.searchRange2d(testRange, handler);\r\n }\r\n /** If possible, insert a range into the set.\r\n * * Decline to insert (and return false) if\r\n * * range is null\r\n * * range is not completely contained in the overall range of this set.\r\n * * range x or y extent is larger than 2 grid blocks.\r\n */\r\n public addRange(range: Range2d | Range3d, tag: T): void {\r\n if (!range.isNull) {\r\n if (!this._gridSet.conditionalInsert(range, tag))\r\n this._overflowSet.addRange(range, tag);\r\n }\r\n }\r\n public visitChildren(initialDepth: number, handler: (depth: number, child: LinearSearchRange2dArray<T>) => void) {\r\n handler(initialDepth, this._overflowSet);\r\n this._gridSet.visitChildren(initialDepth + 1, handler);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GriddedRaggedRange2dSetWithOverflow.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,kDAAiD;AAEjD,uEAAoE;AACpE,yEAAsE;AAGtE;;;;;;;GAOG;AACH,MAAa,mCAAmC;IAI9C,YAAoB,OAAmC,EAAE,WAAsC;QAC7F,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,MAAM,CAAI,KAAc,EAAE,QAAgB,EAAE,QAAgB;QACxE,MAAM,KAAK,GAAG,iDAAuB,CAAC,MAAM,CAAI,KAAK,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnF,IAAI,KAAK;YACP,OAAO,IAAI,mCAAmC,CAAI,KAAK,EAAE,IAAI,mDAAwB,EAAK,CAAC,CAAC;QAC9F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,OAA4C;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAAC,SAAuB,EAAE,OAA4C;QACxF,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChH,CAAC;IACD;;;;;OAKG;IACI,QAAQ,CAAC,KAAmB,EAAE,GAAM;QACzC,IAAI,CAAC,eAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAC1C;IACH,CAAC;IACD,+CAA+C;IACxC,UAAU,CAAC,MAAgB;QAChC,IAAI,MAAM;YACR,MAAM,CAAC,OAAO,EAAE,CAAC;;YAEjB,MAAM,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACtC,MAAM,UAAU,GAAG,mCAAmC,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,mCAAmC,CAAC,UAAU,CAAC,CAAC;YACrI,MAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,mFAAmF;IAC5E,aAAa,CAAC,YAAoB,EAAE,OAAkE;QAC3G,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAvED,kFAuEC","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 RangeSearch\r\n */\r\n\r\nimport { Range2d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { GriddedRaggedRange2dSet } from \"./GriddedRaggedRange2dSet\";\r\nimport { LinearSearchRange2dArray } from \"./LinearSearchRange2dArray\";\r\nimport { Range2dSearchInterface } from \"./Range2dSearchInterface\";\r\n\r\n/**\r\n * Use GriddedRaggedRange2dSetWithOverflow for searching among many ranges for which:\r\n * * Most ranges are of somewhat consistent size.\r\n * * A modest number of oversizes.\r\n * * Maintain the smallish ones in a GriddedRaggedRange2dSet.\r\n * * Maintain the overflows in a Range2dSearchInterface.\r\n * @public\r\n */\r\nexport class GriddedRaggedRange2dSetWithOverflow<T> implements Range2dSearchInterface<T> {\r\n private _gridSet: GriddedRaggedRange2dSet<T>;\r\n private _overflowSet: Range2dSearchInterface<T>;\r\n private static _workRange?: Range2d;\r\n private constructor(gridSet: GriddedRaggedRange2dSet<T>, overflowSet: Range2dSearchInterface<T>) {\r\n this._gridSet = gridSet;\r\n this._overflowSet = overflowSet;\r\n }\r\n /**\r\n * Create an (empty) set of ranges.\r\n * @param range\r\n * @param numXEdge\r\n * @param numYEdge\r\n */\r\n public static create<T>(range: Range2d, numXEdge: number, numYEdge: number): GriddedRaggedRange2dSetWithOverflow<T> | undefined {\r\n const grids = GriddedRaggedRange2dSet.create<T>(range.clone(), numXEdge, numYEdge);\r\n if (grids)\r\n return new GriddedRaggedRange2dSetWithOverflow<T>(grids, new LinearSearchRange2dArray<T>());\r\n return undefined;\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n return this._gridSet.searchXY(x, y, handler) && this._overflowSet.searchXY(x, y, handler);\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n return this._gridSet.searchRange2d(testRange, handler) && this._overflowSet.searchRange2d(testRange, handler);\r\n }\r\n /** If possible, insert a range into the set.\r\n * * Decline to insert (and return false) if\r\n * * range is null\r\n * * range is not completely contained in the overall range of this set.\r\n * * range x or y extent is larger than 2 grid blocks.\r\n */\r\n public addRange(range: LowAndHighXY, tag: T): void {\r\n if (!Range2d.isNull(range)) {\r\n if (!this._gridSet.conditionalInsert(range, tag))\r\n this._overflowSet.addRange(range, tag);\r\n }\r\n }\r\n /** Return the overall range of all members. */\r\n public totalRange(result?: Range2d): Range2d {\r\n if (result)\r\n result.setNull();\r\n else\r\n result = Range2d.createNull();\r\n this.visitChildren(0, (_depth, child) => {\r\n const childRange = GriddedRaggedRange2dSetWithOverflow._workRange = child.totalRange(GriddedRaggedRange2dSetWithOverflow._workRange);\r\n result!.extendRange(childRange);\r\n });\r\n return result;\r\n }\r\n /** Call the handler on the overflow set, and on each defined block in the grid. */\r\n public visitChildren(initialDepth: number, handler: (depth: number, child: Range2dSearchInterface<T>) => void) {\r\n handler(initialDepth, this._overflowSet);\r\n this._gridSet.visitChildren(initialDepth + 1, handler);\r\n }\r\n}\r\n"]}
@@ -5,11 +5,10 @@ import { Range2d } from "../../geometry3d/Range";
5
5
  import { LowAndHighXY } from "../../geometry3d/XYZProps";
6
6
  import { Range2dSearchInterface } from "./Range2dSearchInterface";
7
7
  /**
8
- * * Array of Range2d
9
- * * user data tag attached to each range via cast as (any).userTag.
8
+ * An array of decorated Range2d.
9
+ * * User data is attached to each range via `(myRange as any).tag = myTag`.
10
10
  * * Search operations are simple linear.
11
11
  * * This class can be used directly for "smallish" range sets, or as the leaf level of hierarchical structures for larger range sets.
12
- * *
13
12
  * @internal
14
13
  */
15
14
  export declare class LinearSearchRange2dArray<T> implements Range2dSearchInterface<T> {
@@ -18,7 +17,7 @@ export declare class LinearSearchRange2dArray<T> implements Range2dSearchInterfa
18
17
  private _compositeRange;
19
18
  constructor();
20
19
  private updateForSearch;
21
- /** Return the overall range of all member ranges. */
20
+ /** Return the overall range of all members. */
22
21
  totalRange(result?: Range2d): Range2d;
23
22
  /** Add a range to the search set. */
24
23
  addRange(range: LowAndHighXY, tag: T): void;
@@ -1 +1 @@
1
- {"version":3,"file":"LinearSearchRange2dArray.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/LinearSearchRange2dArray.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;GAOG;AACH,qBAAa,wBAAwB,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,eAAe,CAAU;;IAOjC,OAAO,CAAC,eAAe;IAGvB,qDAAqD;IAC9C,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAI5C,qCAAqC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IAS3C;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAW5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;CAUrG"}
1
+ {"version":3,"file":"LinearSearchRange2dArray.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/LinearSearchRange2dArray.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;GAMG;AACH,qBAAa,wBAAwB,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,eAAe,CAAU;;IAOjC,OAAO,CAAC,eAAe;IAGvB,+CAA+C;IACxC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAG5C,qCAAqC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IASlD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;IAW5F;;;;;;;OAOG;IACI,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO;CAUrG"}
@@ -10,11 +10,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.LinearSearchRange2dArray = void 0;
11
11
  const Range_1 = require("../../geometry3d/Range");
12
12
  /**
13
- * * Array of Range2d
14
- * * user data tag attached to each range via cast as (any).userTag.
13
+ * An array of decorated Range2d.
14
+ * * User data is attached to each range via `(myRange as any).tag = myTag`.
15
15
  * * Search operations are simple linear.
16
16
  * * This class can be used directly for "smallish" range sets, or as the leaf level of hierarchical structures for larger range sets.
17
- * *
18
17
  * @internal
19
18
  */
20
19
  class LinearSearchRange2dArray {
@@ -27,9 +26,8 @@ class LinearSearchRange2dArray {
27
26
  updateForSearch() {
28
27
  this._isDirty = false;
29
28
  }
30
- /** Return the overall range of all member ranges. */
29
+ /** Return the overall range of all members. */
31
30
  totalRange(result) {
32
- result = result ? result : Range_1.Range2d.createNull();
33
31
  return this._compositeRange.clone(result);
34
32
  }
35
33
  /** Add a range to the search set. */
@@ -1 +1 @@
1
- {"version":3,"file":"LinearSearchRange2dArray.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/LinearSearchRange2dArray.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,kDAAiD;AAIjD;;;;;;;GAOG;AACH,MAAa,wBAAwB;IAInC;QACE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IACD,+BAA+B;IACvB,eAAe;QACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,qDAAqD;IAC9C,UAAU,CAAC,MAAgB;QAChC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAO,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,qCAAqC;IAC9B,QAAQ,CAAC,KAAmB,EAAE,GAAM;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QACpC,OAAe,CAAC,GAAG,GAAG,GAAG,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,OAA4C;QAChF,IAAI,IAAI,CAAC,QAAQ;YACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,+CAA+C;QAC/C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE;YACxC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAG,SAAiB,CAAC,GAAG,CAAC;oBAC7C,OAAO,KAAK,CAAC;SAClB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAAC,SAAuB,EAAE,OAA4C;QACxF,IAAI,IAAI,CAAC,QAAQ;YACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE;YACxC,IAAI,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAG,SAAiB,CAAC,GAAG,CAAC;oBAC7C,OAAO,KAAK,CAAC;SAClB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAjED,4DAiEC","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 RangeSearch\r\n */\r\n\r\nimport { Range2d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { Range2dSearchInterface } from \"./Range2dSearchInterface\";\r\n\r\n/**\r\n * * Array of Range2d\r\n * * user data tag attached to each range via cast as (any).userTag.\r\n * * Search operations are simple linear.\r\n * * This class can be used directly for \"smallish\" range sets, or as the leaf level of hierarchical structures for larger range sets.\r\n * *\r\n * @internal\r\n */\r\nexport class LinearSearchRange2dArray<T> implements Range2dSearchInterface<T> {\r\n private _rangeArray: Range2d[];\r\n private _isDirty: boolean;\r\n private _compositeRange: Range2d;\r\n public constructor() {\r\n this._rangeArray = [];\r\n this._isDirty = false;\r\n this._compositeRange = Range2d.createNull();\r\n }\r\n // TODO: build search structure\r\n private updateForSearch() {\r\n this._isDirty = false;\r\n }\r\n /** Return the overall range of all member ranges. */\r\n public totalRange(result?: Range2d): Range2d {\r\n result = result ? result : Range2d.createNull();\r\n return this._compositeRange.clone(result);\r\n }\r\n /** Add a range to the search set. */\r\n public addRange(range: LowAndHighXY, tag: T) {\r\n this._isDirty = true;\r\n const myRange = Range2d.createNull();\r\n (myRange as any).tag = tag;\r\n myRange.extendXY(range.low.x, range.low.y);\r\n myRange.extendXY(range.high.x, range.high.y);\r\n this._compositeRange.extendRange(myRange);\r\n this._rangeArray.push(myRange);\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n if (this._isDirty)\r\n this.updateForSearch();\r\n // NEEDS WORK: Linear search here -- do better!\r\n for (const candidate of this._rangeArray) {\r\n if (candidate.containsXY(x, y))\r\n if (!handler(candidate, (candidate as any).tag))\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n if (this._isDirty)\r\n this.updateForSearch();\r\n for (const candidate of this._rangeArray) {\r\n if (candidate.intersectsRange(testRange))\r\n if (!handler(candidate, (candidate as any).tag))\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LinearSearchRange2dArray.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/LinearSearchRange2dArray.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,kDAAiD;AAIjD;;;;;;GAMG;AACH,MAAa,wBAAwB;IAInC;QACE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IACD,+BAA+B;IACvB,eAAe;QACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,+CAA+C;IACxC,UAAU,CAAC,MAAgB;QAChC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,qCAAqC;IAC9B,QAAQ,CAAC,KAAmB,EAAE,GAAM;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,eAAO,CAAC,UAAU,EAAE,CAAC;QACpC,OAAe,CAAC,GAAG,GAAG,GAAG,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD;;;;;;;OAOG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,OAA4C;QAChF,IAAI,IAAI,CAAC,QAAQ;YACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,+CAA+C;QAC/C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE;YACxC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAG,SAAiB,CAAC,GAAG,CAAC;oBAC7C,OAAO,KAAK,CAAC;SAClB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;;;OAOG;IACI,aAAa,CAAC,SAAuB,EAAE,OAA4C;QACxF,IAAI,IAAI,CAAC,QAAQ;YACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE;YACxC,IAAI,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAG,SAAiB,CAAC,GAAG,CAAC;oBAC7C,OAAO,KAAK,CAAC;SAClB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAhED,4DAgEC","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 RangeSearch\r\n */\r\n\r\nimport { Range2d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\nimport { Range2dSearchInterface } from \"./Range2dSearchInterface\";\r\n\r\n/**\r\n * An array of decorated Range2d.\r\n * * User data is attached to each range via `(myRange as any).tag = myTag`.\r\n * * Search operations are simple linear.\r\n * * This class can be used directly for \"smallish\" range sets, or as the leaf level of hierarchical structures for larger range sets.\r\n * @internal\r\n */\r\nexport class LinearSearchRange2dArray<T> implements Range2dSearchInterface<T> {\r\n private _rangeArray: Range2d[];\r\n private _isDirty: boolean;\r\n private _compositeRange: Range2d;\r\n public constructor() {\r\n this._rangeArray = [];\r\n this._isDirty = false;\r\n this._compositeRange = Range2d.createNull();\r\n }\r\n // TODO: build search structure\r\n private updateForSearch() {\r\n this._isDirty = false;\r\n }\r\n /** Return the overall range of all members. */\r\n public totalRange(result?: Range2d): Range2d {\r\n return this._compositeRange.clone(result);\r\n }\r\n /** Add a range to the search set. */\r\n public addRange(range: LowAndHighXY, tag: T): void {\r\n this._isDirty = true;\r\n const myRange = Range2d.createNull();\r\n (myRange as any).tag = tag;\r\n myRange.extendXY(range.low.x, range.low.y);\r\n myRange.extendXY(range.high.x, range.high.y);\r\n this._compositeRange.extendRange(myRange);\r\n this._rangeArray.push(myRange);\r\n }\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n if (this._isDirty)\r\n this.updateForSearch();\r\n // NEEDS WORK: Linear search here -- do better!\r\n for (const candidate of this._rangeArray) {\r\n if (candidate.containsXY(x, y))\r\n if (!handler(candidate, (candidate as any).tag))\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits.\r\n * @return false if search terminated by handler. Return true if no handler returned false.\r\n */\r\n public searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean {\r\n if (this._isDirty)\r\n this.updateForSearch();\r\n for (const candidate of this._rangeArray) {\r\n if (candidate.intersectsRange(testRange))\r\n if (!handler(candidate, (candidate as any).tag))\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
@@ -4,29 +4,32 @@
4
4
  import { Range2d } from "../../geometry3d/Range";
5
5
  import { LowAndHighXY } from "../../geometry3d/XYZProps";
6
6
  /**
7
- * Interface for classes that can search with range optimizations.
7
+ * Interface for classes that implement optimized search of 2D ranges.
8
+ * * Each range is associated with user data of type `T`.
8
9
  * @public
9
10
  */
10
11
  export interface Range2dSearchInterface<T> {
11
12
  /**
12
- * * Search for ranges containing testRange
13
- * * Pass each range and tag to handler
14
- * * terminate search if handler returns false.
13
+ * * Search for ranges containing the xy-coordinates.
14
+ * * Pass each range and tag to handler.
15
+ * * Terminate search if handler returns false.
15
16
  * @param testRange search range.
16
- * @param handler function to receive range and tag hits. "true" means continue the search.
17
- * @returns false if any handler call returned false. Otherwise return true.
17
+ * @param handler function to receive range hits, and their associated user data. Returning "true" means continue the search.
18
+ * @returns false if any handler call returned false. Otherwise return true.
18
19
  */
19
20
  searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean;
20
21
  /**
21
- * * Search for ranges overlapping testRange
22
- * * Pass each range and tag to handler
23
- * * terminate search if handler returns false.
22
+ * * Search for ranges overlapping testRange.
23
+ * * Pass each range and tag to handler.
24
+ * * Terminate search if handler returns false.
24
25
  * @param testRange search range.
25
- * @param handler function to receive range and tag hits. "true" means continue the search.
26
- * @returns false if any handler call returned false. Otherwise return true.
26
+ * @param handler function to receive range hits, and their associated user data. Returning "true" means continue the search.
27
+ * @returns false if any handler call returned false. Otherwise return true.
27
28
  */
28
29
  searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean;
29
- /** Add a range to the search set. */
30
+ /** Add a range to the search set, and associate the range with user data `tag`. */
30
31
  addRange(range: LowAndHighXY, tag: T): void;
32
+ /** Return the overall range of all members. */
33
+ totalRange(result?: Range2d): Range2d;
31
34
  }
32
35
  //# sourceMappingURL=Range2dSearchInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Range2dSearchInterface.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/Range2dSearchInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC;IACtF;;;;;;;OAOG;IACH,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC;IAC9F,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;CAC7C"}
1
+ {"version":3,"file":"Range2dSearchInterface.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/Range2dSearchInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC;IACtF;;;;;;;OAOG;IACH,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC;IAC9F,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,+CAA+C;IAC/C,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Range2dSearchInterface.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/Range2dSearchInterface.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG","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 RangeSearch\r\n */\r\n\r\nimport { Range2d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\n\r\n/**\r\n * Interface for classes that can search with range optimizations.\r\n * @public\r\n */\r\nexport interface Range2dSearchInterface<T> {\r\n /**\r\n * * Search for ranges containing testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits. \"true\" means continue the search.\r\n * @returns false if any handler call returned false. Otherwise return true.\r\n */\r\n searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean;\r\n /**\r\n * * Search for ranges overlapping testRange\r\n * * Pass each range and tag to handler\r\n * * terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range and tag hits. \"true\" means continue the search.\r\n * @returns false if any handler call returned false. Otherwise return true.\r\n */\r\n searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean;\r\n /** Add a range to the search set. */\r\n addRange(range: LowAndHighXY, tag: T): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"Range2dSearchInterface.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/Range2dSearchInterface.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG","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 RangeSearch\r\n */\r\n\r\nimport { Range2d } from \"../../geometry3d/Range\";\r\nimport { LowAndHighXY } from \"../../geometry3d/XYZProps\";\r\n\r\n/**\r\n * Interface for classes that implement optimized search of 2D ranges.\r\n * * Each range is associated with user data of type `T`.\r\n * @public\r\n */\r\nexport interface Range2dSearchInterface<T> {\r\n /**\r\n * * Search for ranges containing the xy-coordinates.\r\n * * Pass each range and tag to handler.\r\n * * Terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range hits, and their associated user data. Returning \"true\" means continue the search.\r\n * @returns false if any handler call returned false. Otherwise return true.\r\n */\r\n searchXY(x: number, y: number, handler: (range: Range2d, tag: T) => boolean): boolean;\r\n /**\r\n * * Search for ranges overlapping testRange.\r\n * * Pass each range and tag to handler.\r\n * * Terminate search if handler returns false.\r\n * @param testRange search range.\r\n * @param handler function to receive range hits, and their associated user data. Returning \"true\" means continue the search.\r\n * @returns false if any handler call returned false. Otherwise return true.\r\n */\r\n searchRange2d(testRange: LowAndHighXY, handler: (range: Range2d, tag: T) => boolean): boolean;\r\n /** Add a range to the search set, and associate the range with user data `tag`. */\r\n addRange(range: LowAndHighXY, tag: T): void;\r\n /** Return the overall range of all members. */\r\n totalRange(result?: Range2d): Range2d;\r\n}\r\n"]}
@@ -5,6 +5,8 @@ import { GrowableXYZArray } from "../../geometry3d/GrowableXYZArray";
5
5
  import { Point3d, Vector3d } from "../../geometry3d/Point3dVector3d";
6
6
  import { AnnounceDrapePanel } from "../PolyfaceQuery";
7
7
  import { Polyface } from "../Polyface";
8
+ import { ClipPlane } from "../../clipping/ClipPlane";
9
+ import { ConvexClipPlaneSet } from "../../clipping/ConvexClipPlaneSet";
8
10
  export declare class SweepLineStringToFacetContext {
9
11
  private _spacePoints;
10
12
  private _spacePointsRange;
@@ -23,14 +25,39 @@ export declare class SweepLineStringToFacetContext {
23
25
  */
24
26
  projectToPolygon(polygon: GrowableXYZArray, announce: AnnounceDrapePanel, polyface: Polyface, readIndex: number): number;
25
27
  }
28
+ /**
29
+ * Context for sweeping a line segment onto a convex polygon.
30
+ * @internal
31
+ */
32
+ export declare class EdgeClipData {
33
+ /** Plane containing the edge and sweep vector */
34
+ edgePlane: ClipPlane;
35
+ /** Two clip planes facing each other at each end of the edge */
36
+ clip: ConvexClipPlaneSet;
37
+ /** work array for clipper method */
38
+ private _crossingPoints;
39
+ /** CAPTURE the planes */
40
+ constructor(edgePlane: ClipPlane, clip: ConvexClipPlaneSet);
41
+ /** create object from segment and sweep. Inputs are not captured. */
42
+ static createPointPointSweep(pointA: Point3d, pointB: Point3d, sweep: Vector3d): EdgeClipData | undefined;
43
+ /** Intersect this edge plane with the given convex polygon and announce the intersection segment to the callback. */
44
+ processPolygon(polygon: Point3d[] | GrowableXYZArray, announceEdge: (pointA: Point3d, pointB: Point3d) => void): void;
45
+ }
26
46
  /**
27
47
  * Context for sweeping a line string onto a convex polygon.
28
48
  * @internal
29
49
  */
30
50
  export declare class ClipSweptLineStringContext {
31
51
  private _edgeClippers;
52
+ private _localToWorld?;
53
+ private _worldToLocal?;
54
+ private _localRange?;
32
55
  private constructor();
33
56
  static create(xyz: GrowableXYZArray, sweepVector: Vector3d | undefined): ClipSweptLineStringContext | undefined;
57
+ /**
58
+ * Intersect a polygon with each of the edgeClippers.
59
+ * * If transforms and local range are defined, test the polygon's local range to see if it offers a quick exit.
60
+ */
34
61
  processPolygon(polygon: Point3d[], announceEdge: (pointA: Point3d, pointB: Point3d) => void): void;
35
62
  }
36
63
  //# sourceMappingURL=SweepLineStringToFacetContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SweepLineStringToFacetContext.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/SweepLineStringToFacetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKvC,qBAAa,6BAA6B;IACxC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO;WAMO,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,6BAA6B,GAAG,SAAS;IAQtF,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,aAAa,CAAoB;IAEzC;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAoDhI;AAqDD;;;GAGG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO;WAGO,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,0BAA0B,GAAG,SAAS;IAoB/G,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;CAKnG"}
1
+ {"version":3,"file":"SweepLineStringToFacetContext.d.ts","sourceRoot":"","sources":["../../../../src/polyface/multiclip/SweepLineStringToFacetContext.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAIvE,qBAAa,6BAA6B;IACxC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO;WAMO,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,6BAA6B,GAAG,SAAS;IAQtF,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,aAAa,CAAoB;IAEzC;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAoDhI;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,iDAAiD;IAC1C,SAAS,EAAE,SAAS,CAAC;IAC5B,gEAAgE;IACzD,IAAI,EAAE,kBAAkB,CAAC;IAChC,oCAAoC;IACpC,OAAO,CAAC,eAAe,CAAY;IAEnC,yBAAyB;gBACN,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB;IAKjE,qEAAqE;WACvD,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAiBhH,qHAAqH;IAC9G,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;CAgBtH;AACD;;;GAGG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,aAAa,CAAC,CAAY;IAClC,OAAO,CAAC,aAAa,CAAC,CAAY;IAClC,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO;WAQO,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,0BAA0B,GAAG,SAAS;IA2BtH;;;OAGG;IACI,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;CAUnG"}