@math.gl/polygon 3.6.0-alpha.1 → 3.6.0-alpha.2

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 (46) hide show
  1. package/dist/cut-by-grid.d.ts +8 -7
  2. package/dist/cut-by-grid.d.ts.map +1 -1
  3. package/dist/cut-by-grid.js +2 -4
  4. package/dist/cut-by-mercator-bounds.d.ts +5 -4
  5. package/dist/cut-by-mercator-bounds.d.ts.map +1 -1
  6. package/dist/cut-by-mercator-bounds.js +0 -1
  7. package/dist/earcut.js +1 -1
  8. package/dist/es5/cut-by-grid.js +83 -70
  9. package/dist/es5/cut-by-grid.js.map +1 -1
  10. package/dist/es5/cut-by-mercator-bounds.js +89 -52
  11. package/dist/es5/cut-by-mercator-bounds.js.map +1 -1
  12. package/dist/es5/earcut.js +95 -89
  13. package/dist/es5/earcut.js.map +1 -1
  14. package/dist/es5/index.js +14 -14
  15. package/dist/es5/lineclip.js +43 -36
  16. package/dist/es5/lineclip.js.map +1 -1
  17. package/dist/es5/polygon-utils.js +66 -56
  18. package/dist/es5/polygon-utils.js.map +1 -1
  19. package/dist/es5/polygon.js +44 -31
  20. package/dist/es5/polygon.js.map +1 -1
  21. package/dist/es5/utils.js +12 -11
  22. package/dist/es5/utils.js.map +1 -1
  23. package/dist/esm/cut-by-grid.js +1 -1
  24. package/dist/esm/cut-by-grid.js.map +1 -1
  25. package/dist/esm/cut-by-mercator-bounds.js.map +1 -1
  26. package/dist/esm/earcut.js.map +1 -1
  27. package/dist/esm/lineclip.js.map +1 -1
  28. package/dist/esm/polygon-utils.js.map +1 -1
  29. package/dist/esm/polygon.js.map +1 -1
  30. package/dist/esm/utils.js.map +1 -1
  31. package/dist/lineclip.d.ts +1 -2
  32. package/dist/lineclip.d.ts.map +1 -1
  33. package/dist/polygon-utils.d.ts.map +1 -1
  34. package/dist/polygon.d.ts +3 -2
  35. package/dist/polygon.d.ts.map +1 -1
  36. package/dist/polygon.js +1 -1
  37. package/dist/utils.d.ts +4 -3
  38. package/dist/utils.d.ts.map +1 -1
  39. package/package.json +3 -3
  40. package/src/cut-by-grid.ts +57 -39
  41. package/src/cut-by-mercator-bounds.ts +31 -21
  42. package/src/earcut.ts +1 -1
  43. package/src/lineclip.ts +14 -14
  44. package/src/polygon-utils.ts +4 -1
  45. package/src/polygon.ts +9 -8
  46. package/src/utils.ts +11 -3
@@ -1,20 +1,21 @@
1
+ import type { NumericArray } from '@math.gl/core';
1
2
  export declare type Polygon = {
2
- positions: Array<number>;
3
- holeIndices?: Array<number>;
4
- vertexTypes?: Array<number>;
3
+ positions: number[];
4
+ holeIndices?: number[];
5
+ edgeTypes?: number[];
5
6
  };
6
- export declare function cutPolylineByGrid(positions: Array<number>, options?: {
7
+ export declare function cutPolylineByGrid(positions: NumericArray, options?: {
7
8
  size?: number;
8
9
  broken?: boolean;
9
10
  gridResolution?: number;
10
11
  gridOffset?: [number, number];
11
12
  startIndex?: number;
12
13
  endIndex?: number;
13
- }): Array<number> | Array<Array<number>>;
14
- export declare function cutPolygonByGrid(positions: Array<number>, holeIndices?: Array<number> | null, options?: {
14
+ }): number[] | number[][];
15
+ export declare function cutPolygonByGrid(positions: number[], holeIndices?: number[] | null, options?: {
15
16
  size?: number;
16
17
  gridResolution?: number;
17
18
  gridOffset?: [number, number];
18
19
  edgeTypes?: boolean;
19
- }): Array<Polygon>;
20
+ }): Polygon[];
20
21
  //# sourceMappingURL=cut-by-grid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cut-by-grid.d.ts","sourceRoot":"","sources":["../src/cut-by-grid.ts"],"names":[],"mappings":"AAIA,oBAAY,OAAO,GAAG;IACpB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAkDtC;AAYD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,WAAW,GAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAW,EACxC,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,KAAK,CAAC,OAAO,CAAC,CAqEhB"}
1
+ {"version":3,"file":"cut-by-grid.d.ts","sourceRoot":"","sources":["../src/cut-by-grid.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAEhD,oBAAY,OAAO,GAAG;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAkDvB;AAYD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,GAAE,MAAM,EAAE,GAAG,IAAW,EACnC,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,EAAE,CAmEX"}
@@ -57,11 +57,12 @@ export function cutPolygonByGrid(positions, holeIndices = null, options) {
57
57
  const queue = [
58
58
  {
59
59
  pos: positions,
60
- types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER),
60
+ types: edgeTypes ? new Array(positions.length / size).fill(TYPE_BORDER) : null,
61
61
  holes: holeIndices || []
62
62
  }
63
63
  ];
64
64
  const bbox = [[], []];
65
+ // @ts-ignore
65
66
  let cell = [];
66
67
  // Recursively bisect polygon until every part fit in a single grid cell
67
68
  while (queue.length) {
@@ -69,7 +70,6 @@ export function cutPolygonByGrid(positions, holeIndices = null, options) {
69
70
  // Get the bounding box of the outer polygon
70
71
  getBoundingBox(pos, size, holes[0] || pos.length, bbox);
71
72
  cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);
72
- // @ts-expect-error
73
73
  const code = bitCode(bbox[1], cell);
74
74
  if (code) {
75
75
  // Split the outer ring at the boundary
@@ -100,11 +100,9 @@ export function cutPolygonByGrid(positions, holeIndices = null, options) {
100
100
  // Polygon fits in a single cell, no more processing required
101
101
  const polygon = { positions: pos };
102
102
  if (edgeTypes) {
103
- // @ts-expect-error
104
103
  polygon.edgeTypes = types;
105
104
  }
106
105
  if (holes.length) {
107
- // @ts-expect-error
108
106
  polygon.holeIndices = holes;
109
107
  }
110
108
  result.push(polygon);
@@ -1,16 +1,17 @@
1
1
  import type { Polygon } from './cut-by-grid';
2
+ import type { NumericArray } from '@math.gl/core';
2
3
  /** https://user-images.githubusercontent.com/2059298/78465769-938b7a00-76ae-11ea-9b95-1f4c26425ab9.png */
3
- export declare function cutPolylineByMercatorBounds(positions: Array<number>, options?: {
4
+ export declare function cutPolylineByMercatorBounds(positions: NumericArray, options?: {
4
5
  size?: number;
5
6
  startIndex?: number;
6
7
  endIndex?: number;
7
8
  normalize?: boolean;
8
- }): Array<number>;
9
+ }): number[][];
9
10
  /** https://user-images.githubusercontent.com/2059298/78465770-94241080-76ae-11ea-809a-6a8534dac1d9.png */
10
- export declare function cutPolygonByMercatorBounds(positions: Array<number>, holeIndices?: Array<number> | null, options?: {
11
+ export declare function cutPolygonByMercatorBounds(positions: number[], holeIndices?: number[] | null, options?: {
11
12
  size?: number;
12
13
  normalize?: boolean;
13
14
  maxLatitude?: number;
14
15
  edgeTypes?: boolean;
15
- }): Array<Polygon>;
16
+ }): Polygon[];
16
17
  //# sourceMappingURL=cut-by-mercator-bounds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cut-by-mercator-bounds.d.ts","sourceRoot":"","sources":["../src/cut-by-mercator-bounds.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAK3C,0GAA0G;AAC1G,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,KAAK,CAAC,MAAM,CAAC,CAuBf;AAED,0GAA0G;AAC1G,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,WAAW,GAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAW,EACxC,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,KAAK,CAAC,OAAO,CAAC,CAmDhB"}
1
+ {"version":3,"file":"cut-by-mercator-bounds.d.ts","sourceRoot":"","sources":["../src/cut-by-mercator-bounds.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAKhD,0GAA0G;AAC1G,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,MAAM,EAAE,EAAE,CAsBZ;AAED,0GAA0G;AAC1G,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,GAAE,MAAM,EAAE,GAAG,IAAW,EACnC,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,EAAE,CAmDX"}
@@ -21,7 +21,6 @@ export function cutPolylineByMercatorBounds(positions, options) {
21
21
  shiftLongitudesIntoRange(part, size);
22
22
  }
23
23
  }
24
- // @ts-expect-error
25
24
  return parts;
26
25
  }
27
26
  /** https://user-images.githubusercontent.com/2059298/78465770-94241080-76ae-11ea-809a-6a8534dac1d9.png */
package/dist/earcut.js CHANGED
@@ -21,7 +21,7 @@
21
21
  THIS SOFTWARE.
22
22
 
23
23
  */
24
- /* eslint-disable complexity, max-params, max-statements, max-depth, no-continue, no-shadow */
24
+ /* eslint-disable */
25
25
  import { getPolygonSignedArea } from './polygon-utils';
26
26
  /**
27
27
  * Computes a triangulation of a polygon
@@ -11,31 +11,37 @@ var _lineclip = require("./lineclip");
11
11
  var _utils = require("./utils");
12
12
 
13
13
  function cutPolylineByGrid(positions, options) {
14
- const {
15
- size = 2,
16
- broken = false,
17
- gridResolution = 10,
18
- gridOffset = [0, 0],
19
- startIndex = 0,
20
- endIndex = positions.length
21
- } = options || {};
22
- const numPoints = (endIndex - startIndex) / size;
23
- let part = [];
24
- const result = [part];
25
- const a = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);
26
- let b;
27
- let codeB;
28
- const cell = getGridCell(a, gridResolution, gridOffset, []);
29
- const scratchPoint = [];
14
+ var _ref = options || {},
15
+ _ref$size = _ref.size,
16
+ size = _ref$size === void 0 ? 2 : _ref$size,
17
+ _ref$broken = _ref.broken,
18
+ broken = _ref$broken === void 0 ? false : _ref$broken,
19
+ _ref$gridResolution = _ref.gridResolution,
20
+ gridResolution = _ref$gridResolution === void 0 ? 10 : _ref$gridResolution,
21
+ _ref$gridOffset = _ref.gridOffset,
22
+ gridOffset = _ref$gridOffset === void 0 ? [0, 0] : _ref$gridOffset,
23
+ _ref$startIndex = _ref.startIndex,
24
+ startIndex = _ref$startIndex === void 0 ? 0 : _ref$startIndex,
25
+ _ref$endIndex = _ref.endIndex,
26
+ endIndex = _ref$endIndex === void 0 ? positions.length : _ref$endIndex;
27
+
28
+ var numPoints = (endIndex - startIndex) / size;
29
+ var part = [];
30
+ var result = [part];
31
+ var a = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);
32
+ var b;
33
+ var codeB;
34
+ var cell = getGridCell(a, gridResolution, gridOffset, []);
35
+ var scratchPoint = [];
30
36
  (0, _utils.push)(part, a);
31
37
 
32
- for (let i = 1; i < numPoints; i++) {
38
+ for (var i = 1; i < numPoints; i++) {
33
39
  b = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, b);
34
40
  codeB = (0, _lineclip.bitCode)(b, cell);
35
41
 
36
42
  while (codeB) {
37
43
  (0, _lineclip.intersect)(a, b, codeB, cell, scratchPoint);
38
- const codeAlt = (0, _lineclip.bitCode)(scratchPoint, cell);
44
+ var codeAlt = (0, _lineclip.bitCode)(scratchPoint, cell);
39
45
 
40
46
  if (codeAlt) {
41
47
  (0, _lineclip.intersect)(a, scratchPoint, codeAlt, cell, scratchPoint);
@@ -62,62 +68,69 @@ function cutPolylineByGrid(positions, options) {
62
68
  return broken ? result : result[0];
63
69
  }
64
70
 
65
- const TYPE_INSIDE = 0;
66
- const TYPE_BORDER = 1;
71
+ var TYPE_INSIDE = 0;
72
+ var TYPE_BORDER = 1;
67
73
 
68
74
  function concatInPlace(arr1, arr2) {
69
- for (let i = 0; i < arr2.length; i++) {
75
+ for (var i = 0; i < arr2.length; i++) {
70
76
  arr1.push(arr2[i]);
71
77
  }
72
78
 
73
79
  return arr1;
74
80
  }
75
81
 
76
- function cutPolygonByGrid(positions, holeIndices = null, options) {
82
+ function cutPolygonByGrid(positions) {
83
+ var holeIndices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
84
+ var options = arguments.length > 2 ? arguments[2] : undefined;
85
+
77
86
  if (!positions.length) {
78
87
  return [];
79
88
  }
80
89
 
81
- const {
82
- size = 2,
83
- gridResolution = 10,
84
- gridOffset = [0, 0],
85
- edgeTypes = false
86
- } = options || {};
87
- const result = [];
88
- const queue = [{
90
+ var _ref2 = options || {},
91
+ _ref2$size = _ref2.size,
92
+ size = _ref2$size === void 0 ? 2 : _ref2$size,
93
+ _ref2$gridResolution = _ref2.gridResolution,
94
+ gridResolution = _ref2$gridResolution === void 0 ? 10 : _ref2$gridResolution,
95
+ _ref2$gridOffset = _ref2.gridOffset,
96
+ gridOffset = _ref2$gridOffset === void 0 ? [0, 0] : _ref2$gridOffset,
97
+ _ref2$edgeTypes = _ref2.edgeTypes,
98
+ edgeTypes = _ref2$edgeTypes === void 0 ? false : _ref2$edgeTypes;
99
+
100
+ var result = [];
101
+ var queue = [{
89
102
  pos: positions,
90
- types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER),
103
+ types: edgeTypes ? new Array(positions.length / size).fill(TYPE_BORDER) : null,
91
104
  holes: holeIndices || []
92
105
  }];
93
- const bbox = [[], []];
94
- let cell = [];
106
+ var bbox = [[], []];
107
+ var cell = [];
95
108
 
96
109
  while (queue.length) {
97
- const {
98
- pos,
99
- types,
100
- holes
101
- } = queue.shift();
110
+ var _queue$shift = queue.shift(),
111
+ pos = _queue$shift.pos,
112
+ types = _queue$shift.types,
113
+ holes = _queue$shift.holes;
114
+
102
115
  getBoundingBox(pos, size, holes[0] || pos.length, bbox);
103
116
  cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);
104
- const code = (0, _lineclip.bitCode)(bbox[1], cell);
117
+ var code = (0, _lineclip.bitCode)(bbox[1], cell);
105
118
 
106
119
  if (code) {
107
- let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);
108
- const polygonLow = {
120
+ var parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);
121
+ var polygonLow = {
109
122
  pos: parts[0].pos,
110
123
  types: parts[0].types,
111
124
  holes: []
112
125
  };
113
- const polygonHigh = {
126
+ var polygonHigh = {
114
127
  pos: parts[1].pos,
115
128
  types: parts[1].types,
116
129
  holes: []
117
130
  };
118
131
  queue.push(polygonLow, polygonHigh);
119
132
 
120
- for (let i = 0; i < holes.length; i++) {
133
+ for (var i = 0; i < holes.length; i++) {
121
134
  parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code);
122
135
 
123
136
  if (parts[0]) {
@@ -139,7 +152,7 @@ function cutPolygonByGrid(positions, holeIndices = null, options) {
139
152
  }
140
153
  }
141
154
  } else {
142
- const polygon = {
155
+ var polygon = {
143
156
  positions: pos
144
157
  };
145
158
 
@@ -159,22 +172,22 @@ function cutPolygonByGrid(positions, holeIndices = null, options) {
159
172
  }
160
173
 
161
174
  function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) {
162
- const numPoints = (endIndex - startIndex) / size;
163
- const resultLow = [];
164
- const resultHigh = [];
165
- const typesLow = [];
166
- const typesHigh = [];
167
- const scratchPoint = [];
168
- let p;
169
- let side;
170
- let type;
171
- const prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex);
172
- let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);
173
- let prevType = edgeTypes && edgeTypes[numPoints - 1];
174
- let lowPointCount = 0;
175
- let highPointCount = 0;
176
-
177
- for (let i = 0; i < numPoints; i++) {
175
+ var numPoints = (endIndex - startIndex) / size;
176
+ var resultLow = [];
177
+ var resultHigh = [];
178
+ var typesLow = [];
179
+ var typesHigh = [];
180
+ var scratchPoint = [];
181
+ var p;
182
+ var side;
183
+ var type;
184
+ var prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex);
185
+ var prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);
186
+ var prevType = edgeTypes && edgeTypes[numPoints - 1];
187
+ var lowPointCount = 0;
188
+ var highPointCount = 0;
189
+
190
+ for (var i = 0; i < numPoints; i++) {
178
191
  p = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, p);
179
192
  side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]);
180
193
  type = edgeTypes && edgeTypes[startIndex / size + i];
@@ -214,8 +227,8 @@ function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, e
214
227
  }
215
228
 
216
229
  function getGridCell(p, gridResolution, gridOffset, out) {
217
- const left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];
218
- const bottom = Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];
230
+ var left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];
231
+ var bottom = Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];
219
232
  out[0] = left;
220
233
  out[1] = bottom;
221
234
  out[2] = left + gridResolution;
@@ -240,14 +253,14 @@ function moveToNeighborCell(cell, gridResolution, edge) {
240
253
  }
241
254
 
242
255
  function getBoundingBox(positions, size, endIndex, out) {
243
- let minX = Infinity;
244
- let maxX = -Infinity;
245
- let minY = Infinity;
246
- let maxY = -Infinity;
247
-
248
- for (let i = 0; i < endIndex; i += size) {
249
- const x = positions[i];
250
- const y = positions[i + 1];
256
+ var minX = Infinity;
257
+ var maxX = -Infinity;
258
+ var minY = Infinity;
259
+ var maxY = -Infinity;
260
+
261
+ for (var i = 0; i < endIndex; i += size) {
262
+ var x = positions[i];
263
+ var y = positions[i + 1];
251
264
  minX = x < minX ? x : minX;
252
265
  maxX = x > maxX ? x : maxX;
253
266
  minY = y < minY ? y : minY;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cut-by-grid.ts"],"names":["cutPolylineByGrid","positions","options","size","broken","gridResolution","gridOffset","startIndex","endIndex","length","numPoints","part","result","a","b","codeB","cell","getGridCell","scratchPoint","i","codeAlt","moveToNeighborCell","push","TYPE_INSIDE","TYPE_BORDER","concatInPlace","arr1","arr2","cutPolygonByGrid","holeIndices","edgeTypes","queue","pos","types","Array","fill","holes","bbox","shift","getBoundingBox","code","parts","bisectPolygon","polygonLow","polygonHigh","polygon","edge","resultLow","resultHigh","typesLow","typesHigh","p","side","type","prev","prevSide","Math","sign","prevType","lowPointCount","highPointCount","out","left","floor","bottom","minX","Infinity","maxX","minY","maxY","x","y"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements, max-depth, complexity, no-unused-expressions */\nimport {bitCode, intersect} from './lineclip';\nimport {getPointAtIndex, copy, push} from './utils';\n\nexport type Polygon = {\n positions: Array<number>;\n holeIndices?: Array<number>;\n vertexTypes?: Array<number>;\n};\n\nexport function cutPolylineByGrid(\n positions: Array<number>,\n options?: {\n size?: number;\n broken?: boolean;\n gridResolution?: number;\n gridOffset?: [number, number];\n startIndex?: number;\n endIndex?: number;\n }\n): Array<number> | Array<Array<number>> {\n const {\n size = 2,\n broken = false,\n gridResolution = 10,\n gridOffset = [0, 0],\n startIndex = 0,\n endIndex = positions.length\n } = options || {};\n const numPoints = (endIndex - startIndex) / size;\n let part = [];\n const result = [part];\n const a = getPointAtIndex(positions, 0, size, startIndex);\n let b;\n let codeB;\n const cell = getGridCell(a, gridResolution, gridOffset, []);\n const scratchPoint = [];\n push(part, a);\n\n for (let i = 1; i < numPoints; i++) {\n b = getPointAtIndex(positions, i, size, startIndex, b);\n codeB = bitCode(b, cell);\n\n while (codeB) {\n // find the intersection with the current cell\n intersect(a, b, codeB, cell, scratchPoint);\n const codeAlt = bitCode(scratchPoint, cell);\n if (codeAlt) {\n intersect(a, scratchPoint, codeAlt, cell, scratchPoint);\n codeB = codeAlt;\n }\n push(part, scratchPoint);\n // move to the next cell\n copy(a, scratchPoint);\n\n moveToNeighborCell(cell, gridResolution, codeB);\n if (broken && part.length > size) {\n part = [];\n result.push(part);\n push(part, a);\n }\n\n codeB = bitCode(b, cell);\n }\n\n push(part, b);\n copy(a, b);\n }\n\n return broken ? result : result[0];\n}\n\nconst TYPE_INSIDE = 0;\nconst TYPE_BORDER = 1;\n\nfunction concatInPlace(arr1, arr2) {\n for (let i = 0; i < arr2.length; i++) {\n arr1.push(arr2[i]);\n }\n return arr1;\n}\n\nexport function cutPolygonByGrid(\n positions: Array<number>,\n holeIndices: Array<number> | null = null,\n options?: {\n size?: number;\n gridResolution?: number;\n gridOffset?: [number, number];\n edgeTypes?: boolean;\n }\n): Array<Polygon> {\n if (!positions.length) {\n // input is empty\n return [];\n }\n const {size = 2, gridResolution = 10, gridOffset = [0, 0], edgeTypes = false} = options || {};\n const result = [];\n const queue = [\n {\n pos: positions,\n types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER),\n holes: holeIndices || []\n }\n ];\n const bbox = [[], []];\n let cell = [];\n\n // Recursively bisect polygon until every part fit in a single grid cell\n while (queue.length) {\n const {pos, types, holes} = queue.shift();\n\n // Get the bounding box of the outer polygon\n getBoundingBox(pos, size, holes[0] || pos.length, bbox);\n cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);\n // @ts-expect-error\n const code = bitCode(bbox[1], cell);\n\n if (code) {\n // Split the outer ring at the boundary\n let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);\n const polygonLow = {pos: parts[0].pos, types: parts[0].types, holes: []};\n const polygonHigh = {pos: parts[1].pos, types: parts[1].types, holes: []};\n queue.push(polygonLow, polygonHigh);\n\n // Split each hole at the boundary\n for (let i = 0; i < holes.length; i++) {\n parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code);\n\n if (parts[0]) {\n polygonLow.holes.push(polygonLow.pos.length);\n polygonLow.pos = concatInPlace(polygonLow.pos, parts[0].pos);\n if (edgeTypes) {\n polygonLow.types = concatInPlace(polygonLow.types, parts[0].types);\n }\n }\n if (parts[1]) {\n polygonHigh.holes.push(polygonHigh.pos.length);\n polygonHigh.pos = concatInPlace(polygonHigh.pos, parts[1].pos);\n if (edgeTypes) {\n polygonHigh.types = concatInPlace(polygonHigh.types, parts[1].types);\n }\n }\n }\n } else {\n // Polygon fits in a single cell, no more processing required\n const polygon = {positions: pos};\n if (edgeTypes) {\n // @ts-expect-error\n polygon.edgeTypes = types;\n }\n if (holes.length) {\n // @ts-expect-error\n polygon.holeIndices = holes;\n }\n\n result.push(polygon);\n }\n }\n return result;\n}\n\n// edgeTypes:\n// TYPE_BORDER - edge from the original polygon\n// TYPE_INSIDE - inside the original polygon\n// eslint-disable-next-line max-params\nfunction bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) {\n const numPoints = (endIndex - startIndex) / size;\n const resultLow = [];\n const resultHigh = [];\n const typesLow = [];\n const typesHigh = [];\n const scratchPoint = [];\n\n let p;\n let side;\n let type;\n const prev = getPointAtIndex(positions, numPoints - 1, size, startIndex);\n let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);\n let prevType = edgeTypes && edgeTypes[numPoints - 1];\n let lowPointCount = 0;\n let highPointCount = 0;\n\n for (let i = 0; i < numPoints; i++) {\n p = getPointAtIndex(positions, i, size, startIndex, p);\n side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]);\n type = edgeTypes && edgeTypes[startIndex / size + i];\n\n // if segment goes through the boundary, add an intersection\n if (side && prevSide && prevSide !== side) {\n intersect(prev, p, edge, bbox, scratchPoint);\n push(resultLow, scratchPoint) && typesLow.push(prevType);\n push(resultHigh, scratchPoint) && typesHigh.push(prevType);\n }\n\n if (side <= 0) {\n push(resultLow, p) && typesLow.push(type);\n lowPointCount -= side;\n } else if (typesLow.length) {\n typesLow[typesLow.length - 1] = TYPE_INSIDE;\n }\n if (side >= 0) {\n push(resultHigh, p) && typesHigh.push(type);\n highPointCount += side;\n } else if (typesHigh.length) {\n typesHigh[typesHigh.length - 1] = TYPE_INSIDE;\n }\n\n copy(prev, p);\n prevSide = side;\n prevType = type;\n }\n\n return [\n lowPointCount ? {pos: resultLow, types: edgeTypes && typesLow} : null,\n highPointCount ? {pos: resultHigh, types: edgeTypes && typesHigh} : null\n ];\n}\n\nfunction getGridCell(p, gridResolution, gridOffset, out) {\n const left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];\n const bottom =\n Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];\n out[0] = left;\n out[1] = bottom;\n out[2] = left + gridResolution;\n out[3] = bottom + gridResolution;\n return out;\n}\n\nfunction moveToNeighborCell(cell, gridResolution, edge) {\n if (edge & 8) {\n // top\n cell[1] += gridResolution;\n cell[3] += gridResolution;\n } else if (edge & 4) {\n // bottom\n cell[1] -= gridResolution;\n cell[3] -= gridResolution;\n } else if (edge & 2) {\n // right\n cell[0] += gridResolution;\n cell[2] += gridResolution;\n } else if (edge & 1) {\n // left\n cell[0] -= gridResolution;\n cell[2] -= gridResolution;\n }\n}\n\nfunction getBoundingBox(positions, size, endIndex, out) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n for (let i = 0; i < endIndex; i += size) {\n const x = positions[i];\n const y = positions[i + 1];\n minX = x < minX ? x : minX;\n maxX = x > maxX ? x : maxX;\n minY = y < minY ? y : minY;\n maxY = y > maxY ? y : maxY;\n }\n\n out[0][0] = minX;\n out[0][1] = minY;\n out[1][0] = maxX;\n out[1][1] = maxY;\n return out;\n}\n"],"file":"cut-by-grid.js"}
1
+ {"version":3,"sources":["../../src/cut-by-grid.ts"],"names":["cutPolylineByGrid","positions","options","size","broken","gridResolution","gridOffset","startIndex","endIndex","length","numPoints","part","result","a","b","codeB","cell","getGridCell","scratchPoint","i","codeAlt","moveToNeighborCell","push","TYPE_INSIDE","TYPE_BORDER","concatInPlace","arr1","arr2","cutPolygonByGrid","holeIndices","edgeTypes","queue","pos","types","Array","fill","holes","bbox","shift","getBoundingBox","code","parts","bisectPolygon","polygonLow","polygonHigh","polygon","edge","resultLow","resultHigh","typesLow","typesHigh","p","side","type","prev","prevSide","Math","sign","prevType","lowPointCount","highPointCount","out","left","floor","bottom","minX","Infinity","maxX","minY","maxY","x","y"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements, max-depth, complexity, no-unused-expressions */\nimport {bitCode, intersect, BoundingBox} from './lineclip';\nimport {getPointAtIndex, copy, push} from './utils';\n\nimport type {NumericArray} from '@math.gl/core';\n\nexport type Polygon = {\n positions: number[];\n holeIndices?: number[];\n edgeTypes?: number[];\n};\n\nexport function cutPolylineByGrid(\n positions: NumericArray,\n options?: {\n size?: number;\n broken?: boolean;\n gridResolution?: number;\n gridOffset?: [number, number];\n startIndex?: number;\n endIndex?: number;\n }\n): number[] | number[][] {\n const {\n size = 2,\n broken = false,\n gridResolution = 10,\n gridOffset = [0, 0],\n startIndex = 0,\n endIndex = positions.length\n } = options || {};\n const numPoints = (endIndex - startIndex) / size;\n let part: number[] = [];\n const result: number[][] = [part];\n const a: number[] = getPointAtIndex(positions, 0, size, startIndex);\n let b: number[];\n let codeB: number;\n const cell: BoundingBox = getGridCell(a, gridResolution, gridOffset, []);\n const scratchPoint: number[] = [];\n push(part, a);\n\n for (let i = 1; i < numPoints; i++) {\n b = getPointAtIndex(positions, i, size, startIndex, b);\n codeB = bitCode(b, cell);\n\n while (codeB) {\n // find the intersection with the current cell\n intersect(a, b, codeB, cell, scratchPoint);\n const codeAlt = bitCode(scratchPoint, cell);\n if (codeAlt) {\n intersect(a, scratchPoint, codeAlt, cell, scratchPoint);\n codeB = codeAlt;\n }\n push(part, scratchPoint);\n // move to the next cell\n copy(a, scratchPoint);\n\n moveToNeighborCell(cell, gridResolution, codeB);\n if (broken && part.length > size) {\n part = [];\n result.push(part);\n push(part, a);\n }\n\n codeB = bitCode(b, cell);\n }\n\n push(part, b);\n copy(a, b);\n }\n\n return broken ? result : result[0];\n}\n\nconst TYPE_INSIDE = 0;\nconst TYPE_BORDER = 1;\n\nfunction concatInPlace(arr1: number[], arr2: number[]): number[] {\n for (let i = 0; i < arr2.length; i++) {\n arr1.push(arr2[i]);\n }\n return arr1;\n}\n\nexport function cutPolygonByGrid(\n positions: number[],\n holeIndices: number[] | null = null,\n options?: {\n size?: number;\n gridResolution?: number;\n gridOffset?: [number, number];\n edgeTypes?: boolean;\n }\n): Polygon[] {\n if (!positions.length) {\n // input is empty\n return [];\n }\n const {size = 2, gridResolution = 10, gridOffset = [0, 0], edgeTypes = false} = options || {};\n const result: Polygon[] = [];\n const queue: {pos: number[]; types: number[]; holes: number[]}[] = [\n {\n pos: positions,\n types: edgeTypes ? (new Array(positions.length / size).fill(TYPE_BORDER) as number[]) : null,\n holes: holeIndices || []\n }\n ];\n const bbox: number[][] = [[], []];\n // @ts-ignore\n let cell: BoundingBox = [];\n\n // Recursively bisect polygon until every part fit in a single grid cell\n while (queue.length) {\n const {pos, types, holes} = queue.shift();\n\n // Get the bounding box of the outer polygon\n getBoundingBox(pos, size, holes[0] || pos.length, bbox);\n cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);\n const code = bitCode(bbox[1], cell);\n\n if (code) {\n // Split the outer ring at the boundary\n let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);\n const polygonLow = {pos: parts[0].pos, types: parts[0].types, holes: []};\n const polygonHigh = {pos: parts[1].pos, types: parts[1].types, holes: []};\n queue.push(polygonLow, polygonHigh);\n\n // Split each hole at the boundary\n for (let i = 0; i < holes.length; i++) {\n parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code);\n\n if (parts[0]) {\n polygonLow.holes.push(polygonLow.pos.length);\n polygonLow.pos = concatInPlace(polygonLow.pos, parts[0].pos);\n if (edgeTypes) {\n polygonLow.types = concatInPlace(polygonLow.types, parts[0].types);\n }\n }\n if (parts[1]) {\n polygonHigh.holes.push(polygonHigh.pos.length);\n polygonHigh.pos = concatInPlace(polygonHigh.pos, parts[1].pos);\n if (edgeTypes) {\n polygonHigh.types = concatInPlace(polygonHigh.types, parts[1].types);\n }\n }\n }\n } else {\n // Polygon fits in a single cell, no more processing required\n const polygon: Polygon = {positions: pos};\n if (edgeTypes) {\n polygon.edgeTypes = types;\n }\n if (holes.length) {\n polygon.holeIndices = holes;\n }\n\n result.push(polygon);\n }\n }\n return result;\n}\n\n// edgeTypes:\n// TYPE_BORDER - edge from the original polygon\n// TYPE_INSIDE - inside the original polygon\n// eslint-disable-next-line max-params\nfunction bisectPolygon(\n positions: NumericArray,\n edgeTypes: number[] | undefined,\n size: number,\n startIndex: number,\n endIndex: number,\n bbox: BoundingBox,\n edge: number\n) {\n const numPoints = (endIndex - startIndex) / size;\n const resultLow: number[] = [];\n const resultHigh: number[] = [];\n const typesLow: number[] = [];\n const typesHigh: number[] = [];\n const scratchPoint: number[] = [];\n\n let p: number[];\n let side: number;\n let type: number;\n const prev = getPointAtIndex(positions, numPoints - 1, size, startIndex);\n let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);\n let prevType = edgeTypes && edgeTypes[numPoints - 1];\n let lowPointCount = 0;\n let highPointCount = 0;\n\n for (let i = 0; i < numPoints; i++) {\n p = getPointAtIndex(positions, i, size, startIndex, p);\n side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]);\n type = edgeTypes && edgeTypes[startIndex / size + i];\n\n // if segment goes through the boundary, add an intersection\n if (side && prevSide && prevSide !== side) {\n intersect(prev, p, edge, bbox, scratchPoint);\n push(resultLow, scratchPoint) && typesLow.push(prevType);\n push(resultHigh, scratchPoint) && typesHigh.push(prevType);\n }\n\n if (side <= 0) {\n push(resultLow, p) && typesLow.push(type);\n lowPointCount -= side;\n } else if (typesLow.length) {\n typesLow[typesLow.length - 1] = TYPE_INSIDE;\n }\n if (side >= 0) {\n push(resultHigh, p) && typesHigh.push(type);\n highPointCount += side;\n } else if (typesHigh.length) {\n typesHigh[typesHigh.length - 1] = TYPE_INSIDE;\n }\n\n copy(prev, p);\n prevSide = side;\n prevType = type;\n }\n\n return [\n lowPointCount ? {pos: resultLow, types: edgeTypes && typesLow} : null,\n highPointCount ? {pos: resultHigh, types: edgeTypes && typesHigh} : null\n ];\n}\n\nfunction getGridCell(\n p: number[],\n gridResolution: number,\n gridOffset: [number, number],\n out: number[]\n): BoundingBox {\n const left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];\n const bottom =\n Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];\n out[0] = left;\n out[1] = bottom;\n out[2] = left + gridResolution;\n out[3] = bottom + gridResolution;\n return out as BoundingBox;\n}\n\nfunction moveToNeighborCell(cell: number[], gridResolution: number, edge: number): void {\n if (edge & 8) {\n // top\n cell[1] += gridResolution;\n cell[3] += gridResolution;\n } else if (edge & 4) {\n // bottom\n cell[1] -= gridResolution;\n cell[3] -= gridResolution;\n } else if (edge & 2) {\n // right\n cell[0] += gridResolution;\n cell[2] += gridResolution;\n } else if (edge & 1) {\n // left\n cell[0] -= gridResolution;\n cell[2] -= gridResolution;\n }\n}\n\nfunction getBoundingBox(\n positions: NumericArray,\n size: number,\n endIndex: number,\n out: number[][]\n): number[][] {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n for (let i = 0; i < endIndex; i += size) {\n const x = positions[i];\n const y = positions[i + 1];\n minX = x < minX ? x : minX;\n maxX = x > maxX ? x : maxX;\n minY = y < minY ? y : minY;\n maxY = y > maxY ? y : maxY;\n }\n\n out[0][0] = minX;\n out[0][1] = minY;\n out[1][0] = maxX;\n out[1][1] = maxY;\n return out;\n}\n"],"file":"cut-by-grid.js"}