-
Notifications
You must be signed in to change notification settings - Fork 0
/
dense-polygon.js
48 lines (32 loc) · 1.19 KB
/
dense-polygon.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"use_strict";
function densePolygon([xmin, ymin, xmax, ymax], { density = 0 } = { density: 0 }) {
if (typeof density === "number") density = [density, density];
const [x_density, y_density] = density;
const height = ymax - ymin;
const width = xmax - xmin;
const ring = [];
// left-side, bottom-side, right-side, top-side
const x_distance = width / (x_density + 1);
const y_distance = height / (y_density + 1);
// add top left corner
ring.push([xmin, ymax]);
// left-edge
for (let i = 1; i <= y_density; i++) ring.push([xmin, ymax - i * y_distance]);
// add bottom left corner
ring.push([xmin, ymin]);
// bottom-edge
for (let i = 1; i <= x_density; i++) ring.push([xmin + i * x_distance, ymin]);
// add bottom right corner
ring.push([xmax, ymin]);
// right-edge
for (let i = 1; i <= y_density; i++) ring.push([xmax, ymin + i * y_distance]);
// add top right corner
ring.push([xmax, ymax]);
// top-edge
for (let i = 1; i <= x_density; i++) ring.push([xmax - i * x_distance, ymax]);
// add top left corner (repeats according to GeoJSON spec)
ring.push([xmin, ymax]);
return [ring];
}
module.exports = densePolygon;
module.exports.default = densePolygon;