@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.
- package/dist/cut-by-grid.d.ts +8 -7
- package/dist/cut-by-grid.d.ts.map +1 -1
- package/dist/cut-by-grid.js +2 -4
- package/dist/cut-by-mercator-bounds.d.ts +5 -4
- package/dist/cut-by-mercator-bounds.d.ts.map +1 -1
- package/dist/cut-by-mercator-bounds.js +0 -1
- package/dist/earcut.js +1 -1
- package/dist/es5/cut-by-grid.js +83 -70
- package/dist/es5/cut-by-grid.js.map +1 -1
- package/dist/es5/cut-by-mercator-bounds.js +89 -52
- package/dist/es5/cut-by-mercator-bounds.js.map +1 -1
- package/dist/es5/earcut.js +95 -89
- package/dist/es5/earcut.js.map +1 -1
- package/dist/es5/index.js +14 -14
- package/dist/es5/lineclip.js +43 -36
- package/dist/es5/lineclip.js.map +1 -1
- package/dist/es5/polygon-utils.js +66 -56
- package/dist/es5/polygon-utils.js.map +1 -1
- package/dist/es5/polygon.js +44 -31
- package/dist/es5/polygon.js.map +1 -1
- package/dist/es5/utils.js +12 -11
- package/dist/es5/utils.js.map +1 -1
- package/dist/esm/cut-by-grid.js +1 -1
- package/dist/esm/cut-by-grid.js.map +1 -1
- package/dist/esm/cut-by-mercator-bounds.js.map +1 -1
- package/dist/esm/earcut.js.map +1 -1
- package/dist/esm/lineclip.js.map +1 -1
- package/dist/esm/polygon-utils.js.map +1 -1
- package/dist/esm/polygon.js.map +1 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/lineclip.d.ts +1 -2
- package/dist/lineclip.d.ts.map +1 -1
- package/dist/polygon-utils.d.ts.map +1 -1
- package/dist/polygon.d.ts +3 -2
- package/dist/polygon.d.ts.map +1 -1
- package/dist/polygon.js +1 -1
- package/dist/utils.d.ts +4 -3
- package/dist/utils.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/cut-by-grid.ts +57 -39
- package/src/cut-by-mercator-bounds.ts +31 -21
- package/src/earcut.ts +1 -1
- package/src/lineclip.ts +14 -14
- package/src/polygon-utils.ts +4 -1
- package/src/polygon.ts +9 -8
- package/src/utils.ts +11 -3
package/dist/cut-by-grid.d.ts
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
import type { NumericArray } from '@math.gl/core';
|
|
1
2
|
export declare type Polygon = {
|
|
2
|
-
positions:
|
|
3
|
-
holeIndices?:
|
|
4
|
-
|
|
3
|
+
positions: number[];
|
|
4
|
+
holeIndices?: number[];
|
|
5
|
+
edgeTypes?: number[];
|
|
5
6
|
};
|
|
6
|
-
export declare function cutPolylineByGrid(positions:
|
|
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
|
-
}):
|
|
14
|
-
export declare function cutPolygonByGrid(positions:
|
|
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
|
-
}):
|
|
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,
|
|
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"}
|
package/dist/cut-by-grid.js
CHANGED
|
@@ -57,11 +57,12 @@ export function cutPolygonByGrid(positions, holeIndices = null, options) {
|
|
|
57
57
|
const queue = [
|
|
58
58
|
{
|
|
59
59
|
pos: positions,
|
|
60
|
-
types: edgeTypes
|
|
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:
|
|
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
|
-
}):
|
|
9
|
+
}): number[][];
|
|
9
10
|
/** https://user-images.githubusercontent.com/2059298/78465770-94241080-76ae-11ea-809a-6a8534dac1d9.png */
|
|
10
|
-
export declare function cutPolygonByMercatorBounds(positions:
|
|
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
|
-
}):
|
|
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;
|
|
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
package/dist/es5/cut-by-grid.js
CHANGED
|
@@ -11,31 +11,37 @@ var _lineclip = require("./lineclip");
|
|
|
11
11
|
var _utils = require("./utils");
|
|
12
12
|
|
|
13
13
|
function cutPolylineByGrid(positions, options) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
71
|
+
var TYPE_INSIDE = 0;
|
|
72
|
+
var TYPE_BORDER = 1;
|
|
67
73
|
|
|
68
74
|
function concatInPlace(arr1, arr2) {
|
|
69
|
-
for (
|
|
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
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
103
|
+
types: edgeTypes ? new Array(positions.length / size).fill(TYPE_BORDER) : null,
|
|
91
104
|
holes: holeIndices || []
|
|
92
105
|
}];
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
var bbox = [[], []];
|
|
107
|
+
var cell = [];
|
|
95
108
|
|
|
96
109
|
while (queue.length) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
117
|
+
var code = (0, _lineclip.bitCode)(bbox[1], cell);
|
|
105
118
|
|
|
106
119
|
if (code) {
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
for (
|
|
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
|
-
|
|
218
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
for (
|
|
249
|
-
|
|
250
|
-
|
|
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"}
|