@math.gl/polygon
Advanced tools
Comparing version 3.2.0-alpha.3 to 3.2.0-alpha.4
@@ -1,6 +0,6 @@ | ||
type Polygon = Array<number> | {positions: Array<number>, holeIndices: Array<number>}; | ||
type Polygon = {positions: Array<number>, holeIndices?: Array<number>, vertexTypes?: Array<Number>}; | ||
export function cutPolylineByGrid( | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -18,7 +18,8 @@ broken? : boolean, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
gridResolution? : number, | ||
gridOffset? : [number, number] | ||
gridOffset? : [number, number], | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; |
@@ -70,2 +70,5 @@ "use strict"; | ||
var TYPE_INSIDE = 0; | ||
var TYPE_BORDER = 1; | ||
function cutPolygonByGrid(positions, holeIndices) { | ||
@@ -83,6 +86,9 @@ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | ||
_options$gridOffset2 = options.gridOffset, | ||
gridOffset = _options$gridOffset2 === void 0 ? [0, 0] : _options$gridOffset2; | ||
gridOffset = _options$gridOffset2 === void 0 ? [0, 0] : _options$gridOffset2, | ||
_options$edgeTypes = options.edgeTypes, | ||
edgeTypes = _options$edgeTypes === void 0 ? false : _options$edgeTypes; | ||
var result = []; | ||
var queue = [{ | ||
pos: positions, | ||
types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER), | ||
holes: holeIndices || [] | ||
@@ -96,2 +102,3 @@ }]; | ||
pos = _queue$shift.pos, | ||
types = _queue$shift.types, | ||
holes = _queue$shift.holes; | ||
@@ -104,9 +111,11 @@ | ||
if (code) { | ||
var parts = bisectPolygon(pos, size, 0, holes[0] || pos.length, cell, code); | ||
var parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code); | ||
var polygonLow = { | ||
pos: parts[0], | ||
pos: parts[0].pos, | ||
types: parts[0].types, | ||
holes: [] | ||
}; | ||
var polygonHigh = { | ||
pos: parts[1], | ||
pos: parts[1].pos, | ||
types: parts[1].types, | ||
holes: [] | ||
@@ -117,7 +126,11 @@ }; | ||
for (var i = 0; i < holes.length; i++) { | ||
parts = bisectPolygon(pos, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
if (parts[0]) { | ||
polygonLow.holes.push(polygonLow.pos.length); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0]); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0].pos); | ||
if (edgeTypes) { | ||
polygonLow.types = polygonLow.types.concat(parts[0].types); | ||
} | ||
} | ||
@@ -127,10 +140,23 @@ | ||
polygonHigh.holes.push(polygonHigh.pos.length); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1]); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1].pos); | ||
if (edgeTypes) { | ||
polygonHigh.types = polygonHigh.types.concat(parts[1].types); | ||
} | ||
} | ||
} | ||
} else { | ||
result.push(holes.length ? { | ||
positions: pos, | ||
holeIndices: holes | ||
} : pos); | ||
var polygon = { | ||
positions: pos | ||
}; | ||
if (edgeTypes) { | ||
polygon.edgeTypes = types; | ||
} | ||
if (holes.length) { | ||
polygon.holeIndices = holes; | ||
} | ||
result.push(polygon); | ||
} | ||
@@ -142,11 +168,15 @@ } | ||
function bisectPolygon(positions, size, startIndex, endIndex, bbox, edge) { | ||
function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) { | ||
var numPoints = (endIndex - startIndex) / size; | ||
var resultLow = []; | ||
var resultHigh = []; | ||
var typesLow = edgeTypes && []; | ||
var typesHigh = edgeTypes && []; | ||
var scratchPoint = []; | ||
var p; | ||
var side; | ||
var type; | ||
var prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex); | ||
var prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]); | ||
var prevType = edgeTypes && edgeTypes[numPoints - 1]; | ||
var lowPointCount = 0; | ||
@@ -158,2 +188,3 @@ var highPointCount = 0; | ||
side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]); | ||
type = edgeTypes && edgeTypes[startIndex / size + i]; | ||
@@ -164,2 +195,7 @@ if (side && prevSide && prevSide !== side) { | ||
(0, _utils.push)(resultHigh, scratchPoint); | ||
if (edgeTypes) { | ||
typesLow.push(prevType); | ||
typesHigh.push(prevType); | ||
} | ||
} | ||
@@ -177,7 +213,28 @@ | ||
if (edgeTypes) { | ||
if (side <= 0) { | ||
typesLow.push(type); | ||
} else if (typesLow.length) { | ||
typesLow[typesLow.length - 1] = TYPE_INSIDE; | ||
} | ||
if (side >= 0) { | ||
typesHigh.push(type); | ||
} else if (typesHigh.length) { | ||
typesHigh[typesHigh.length - 1] = TYPE_INSIDE; | ||
} | ||
} | ||
(0, _utils.copy)(prev, p); | ||
prevSide = side; | ||
prevType = type; | ||
} | ||
return [lowPointCount ? resultLow : null, highPointCount ? resultHigh : null]; | ||
return [lowPointCount ? { | ||
pos: resultLow, | ||
types: typesLow | ||
} : null, highPointCount ? { | ||
pos: resultHigh, | ||
types: typesHigh | ||
} : null]; | ||
} | ||
@@ -184,0 +241,0 @@ |
@@ -5,3 +5,3 @@ import {Polygon} from "./cut-by-grid"; | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,8 +17,9 @@ startIndex? : number, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
normalize? : boolean, | ||
maxLatitude: number | ||
maxLatitude?: number, | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; | ||
@@ -68,3 +68,5 @@ "use strict"; | ||
_options$normalize2 = options.normalize, | ||
normalize = _options$normalize2 === void 0 ? true : _options$normalize2; | ||
normalize = _options$normalize2 === void 0 ? true : _options$normalize2, | ||
_options$edgeTypes = options.edgeTypes, | ||
edgeTypes = _options$edgeTypes === void 0 ? false : _options$edgeTypes; | ||
holeIndices = holeIndices || []; | ||
@@ -99,3 +101,4 @@ var newPositions = []; | ||
gridResolution: 360, | ||
gridOffset: [-180, -180] | ||
gridOffset: [-180, -180], | ||
edgeTypes: edgeTypes | ||
}); | ||
@@ -111,3 +114,3 @@ | ||
var part = _step2.value; | ||
shiftLongitudesIntoRange(Array.isArray(part) ? part : part.positions, size); | ||
shiftLongitudesIntoRange(part.positions, size); | ||
} | ||
@@ -114,0 +117,0 @@ } catch (err) { |
@@ -6,3 +6,3 @@ type BoundingBox = [number, number, number, number]; | ||
bbox : BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,3 +17,3 @@ startIndex? : number, | ||
bbox: BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -20,0 +20,0 @@ startIndex? : number, |
@@ -1,6 +0,6 @@ | ||
type Polygon = Array<number> | {positions: Array<number>, holeIndices: Array<number>}; | ||
type Polygon = {positions: Array<number>, holeIndices?: Array<number>, vertexTypes?: Array<Number>}; | ||
export function cutPolylineByGrid( | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -18,7 +18,8 @@ broken? : boolean, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
gridResolution? : number, | ||
gridOffset? : [number, number] | ||
gridOffset? : [number, number], | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; |
@@ -54,2 +54,4 @@ import { bitCode, intersect } from './lineclip'; | ||
} | ||
const TYPE_INSIDE = 0; | ||
const TYPE_BORDER = 1; | ||
export function cutPolygonByGrid(positions, holeIndices, options = {}) { | ||
@@ -63,3 +65,4 @@ if (!positions.length) { | ||
gridResolution = 10, | ||
gridOffset = [0, 0] | ||
gridOffset = [0, 0], | ||
edgeTypes = false | ||
} = options; | ||
@@ -69,2 +72,3 @@ const result = []; | ||
pos: positions, | ||
types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER), | ||
holes: holeIndices || [] | ||
@@ -78,2 +82,3 @@ }]; | ||
pos, | ||
types, | ||
holes | ||
@@ -86,9 +91,11 @@ } = queue.shift(); | ||
if (code) { | ||
let parts = bisectPolygon(pos, size, 0, holes[0] || pos.length, cell, code); | ||
let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code); | ||
const polygonLow = { | ||
pos: parts[0], | ||
pos: parts[0].pos, | ||
types: parts[0].types, | ||
holes: [] | ||
}; | ||
const polygonHigh = { | ||
pos: parts[1], | ||
pos: parts[1].pos, | ||
types: parts[1].types, | ||
holes: [] | ||
@@ -99,7 +106,11 @@ }; | ||
for (let i = 0; i < holes.length; i++) { | ||
parts = bisectPolygon(pos, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
if (parts[0]) { | ||
polygonLow.holes.push(polygonLow.pos.length); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0]); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0].pos); | ||
if (edgeTypes) { | ||
polygonLow.types = polygonLow.types.concat(parts[0].types); | ||
} | ||
} | ||
@@ -109,10 +120,23 @@ | ||
polygonHigh.holes.push(polygonHigh.pos.length); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1]); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1].pos); | ||
if (edgeTypes) { | ||
polygonHigh.types = polygonHigh.types.concat(parts[1].types); | ||
} | ||
} | ||
} | ||
} else { | ||
result.push(holes.length ? { | ||
positions: pos, | ||
holeIndices: holes | ||
} : pos); | ||
const polygon = { | ||
positions: pos | ||
}; | ||
if (edgeTypes) { | ||
polygon.edgeTypes = types; | ||
} | ||
if (holes.length) { | ||
polygon.holeIndices = holes; | ||
} | ||
result.push(polygon); | ||
} | ||
@@ -124,11 +148,15 @@ } | ||
function bisectPolygon(positions, size, startIndex, endIndex, bbox, edge) { | ||
function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) { | ||
const numPoints = (endIndex - startIndex) / size; | ||
const resultLow = []; | ||
const resultHigh = []; | ||
const typesLow = edgeTypes && []; | ||
const typesHigh = edgeTypes && []; | ||
const scratchPoint = []; | ||
let p; | ||
let side; | ||
let type; | ||
const prev = getPointAtIndex(positions, numPoints - 1, size, startIndex); | ||
let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]); | ||
let prevType = edgeTypes && edgeTypes[numPoints - 1]; | ||
let lowPointCount = 0; | ||
@@ -140,2 +168,3 @@ let highPointCount = 0; | ||
side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]); | ||
type = edgeTypes && edgeTypes[startIndex / size + i]; | ||
@@ -146,2 +175,7 @@ if (side && prevSide && prevSide !== side) { | ||
push(resultHigh, scratchPoint); | ||
if (edgeTypes) { | ||
typesLow.push(prevType); | ||
typesHigh.push(prevType); | ||
} | ||
} | ||
@@ -159,7 +193,28 @@ | ||
if (edgeTypes) { | ||
if (side <= 0) { | ||
typesLow.push(type); | ||
} else if (typesLow.length) { | ||
typesLow[typesLow.length - 1] = TYPE_INSIDE; | ||
} | ||
if (side >= 0) { | ||
typesHigh.push(type); | ||
} else if (typesHigh.length) { | ||
typesHigh[typesHigh.length - 1] = TYPE_INSIDE; | ||
} | ||
} | ||
copy(prev, p); | ||
prevSide = side; | ||
prevType = type; | ||
} | ||
return [lowPointCount ? resultLow : null, highPointCount ? resultHigh : null]; | ||
return [lowPointCount ? { | ||
pos: resultLow, | ||
types: typesLow | ||
} : null, highPointCount ? { | ||
pos: resultHigh, | ||
types: typesHigh | ||
} : null]; | ||
} | ||
@@ -166,0 +221,0 @@ |
@@ -5,3 +5,3 @@ import {Polygon} from "./cut-by-grid"; | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,8 +17,9 @@ startIndex? : number, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
normalize? : boolean, | ||
maxLatitude: number | ||
maxLatitude?: number, | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; | ||
@@ -31,3 +31,4 @@ import { cutPolylineByGrid, cutPolygonByGrid } from './cut-by-grid'; | ||
size = 2, | ||
normalize = true | ||
normalize = true, | ||
edgeTypes = false | ||
} = options; | ||
@@ -63,3 +64,4 @@ holeIndices = holeIndices || []; | ||
gridResolution: 360, | ||
gridOffset: [-180, -180] | ||
gridOffset: [-180, -180], | ||
edgeTypes | ||
}); | ||
@@ -69,3 +71,3 @@ | ||
for (const part of parts) { | ||
shiftLongitudesIntoRange(Array.isArray(part) ? part : part.positions, size); | ||
shiftLongitudesIntoRange(part.positions, size); | ||
} | ||
@@ -72,0 +74,0 @@ } |
@@ -6,3 +6,3 @@ type BoundingBox = [number, number, number, number]; | ||
bbox : BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,3 +17,3 @@ startIndex? : number, | ||
bbox: BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -20,0 +20,0 @@ startIndex? : number, |
@@ -1,6 +0,6 @@ | ||
type Polygon = Array<number> | {positions: Array<number>, holeIndices: Array<number>}; | ||
type Polygon = {positions: Array<number>, holeIndices?: Array<number>, vertexTypes?: Array<Number>}; | ||
export function cutPolylineByGrid( | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -18,7 +18,8 @@ broken? : boolean, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
gridResolution? : number, | ||
gridOffset? : [number, number] | ||
gridOffset? : [number, number], | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; |
@@ -59,2 +59,4 @@ import { bitCode, intersect } from './lineclip'; | ||
} | ||
var TYPE_INSIDE = 0; | ||
var TYPE_BORDER = 1; | ||
export function cutPolygonByGrid(positions, holeIndices) { | ||
@@ -72,6 +74,9 @@ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; | ||
_options$gridOffset2 = options.gridOffset, | ||
gridOffset = _options$gridOffset2 === void 0 ? [0, 0] : _options$gridOffset2; | ||
gridOffset = _options$gridOffset2 === void 0 ? [0, 0] : _options$gridOffset2, | ||
_options$edgeTypes = options.edgeTypes, | ||
edgeTypes = _options$edgeTypes === void 0 ? false : _options$edgeTypes; | ||
var result = []; | ||
var queue = [{ | ||
pos: positions, | ||
types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER), | ||
holes: holeIndices || [] | ||
@@ -85,2 +90,3 @@ }]; | ||
pos = _queue$shift.pos, | ||
types = _queue$shift.types, | ||
holes = _queue$shift.holes; | ||
@@ -93,9 +99,11 @@ | ||
if (code) { | ||
var parts = bisectPolygon(pos, size, 0, holes[0] || pos.length, cell, code); | ||
var parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code); | ||
var polygonLow = { | ||
pos: parts[0], | ||
pos: parts[0].pos, | ||
types: parts[0].types, | ||
holes: [] | ||
}; | ||
var polygonHigh = { | ||
pos: parts[1], | ||
pos: parts[1].pos, | ||
types: parts[1].types, | ||
holes: [] | ||
@@ -106,7 +114,11 @@ }; | ||
for (var i = 0; i < holes.length; i++) { | ||
parts = bisectPolygon(pos, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
if (parts[0]) { | ||
polygonLow.holes.push(polygonLow.pos.length); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0]); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0].pos); | ||
if (edgeTypes) { | ||
polygonLow.types = polygonLow.types.concat(parts[0].types); | ||
} | ||
} | ||
@@ -116,10 +128,23 @@ | ||
polygonHigh.holes.push(polygonHigh.pos.length); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1]); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1].pos); | ||
if (edgeTypes) { | ||
polygonHigh.types = polygonHigh.types.concat(parts[1].types); | ||
} | ||
} | ||
} | ||
} else { | ||
result.push(holes.length ? { | ||
positions: pos, | ||
holeIndices: holes | ||
} : pos); | ||
var polygon = { | ||
positions: pos | ||
}; | ||
if (edgeTypes) { | ||
polygon.edgeTypes = types; | ||
} | ||
if (holes.length) { | ||
polygon.holeIndices = holes; | ||
} | ||
result.push(polygon); | ||
} | ||
@@ -131,11 +156,15 @@ } | ||
function bisectPolygon(positions, size, startIndex, endIndex, bbox, edge) { | ||
function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) { | ||
var numPoints = (endIndex - startIndex) / size; | ||
var resultLow = []; | ||
var resultHigh = []; | ||
var typesLow = edgeTypes && []; | ||
var typesHigh = edgeTypes && []; | ||
var scratchPoint = []; | ||
var p; | ||
var side; | ||
var type; | ||
var prev = getPointAtIndex(positions, numPoints - 1, size, startIndex); | ||
var prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]); | ||
var prevType = edgeTypes && edgeTypes[numPoints - 1]; | ||
var lowPointCount = 0; | ||
@@ -147,2 +176,3 @@ var highPointCount = 0; | ||
side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]); | ||
type = edgeTypes && edgeTypes[startIndex / size + i]; | ||
@@ -153,2 +183,7 @@ if (side && prevSide && prevSide !== side) { | ||
push(resultHigh, scratchPoint); | ||
if (edgeTypes) { | ||
typesLow.push(prevType); | ||
typesHigh.push(prevType); | ||
} | ||
} | ||
@@ -166,7 +201,28 @@ | ||
if (edgeTypes) { | ||
if (side <= 0) { | ||
typesLow.push(type); | ||
} else if (typesLow.length) { | ||
typesLow[typesLow.length - 1] = TYPE_INSIDE; | ||
} | ||
if (side >= 0) { | ||
typesHigh.push(type); | ||
} else if (typesHigh.length) { | ||
typesHigh[typesHigh.length - 1] = TYPE_INSIDE; | ||
} | ||
} | ||
copy(prev, p); | ||
prevSide = side; | ||
prevType = type; | ||
} | ||
return [lowPointCount ? resultLow : null, highPointCount ? resultHigh : null]; | ||
return [lowPointCount ? { | ||
pos: resultLow, | ||
types: typesLow | ||
} : null, highPointCount ? { | ||
pos: resultHigh, | ||
types: typesHigh | ||
} : null]; | ||
} | ||
@@ -173,0 +229,0 @@ |
@@ -5,3 +5,3 @@ import {Polygon} from "./cut-by-grid"; | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,8 +17,9 @@ startIndex? : number, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
normalize? : boolean, | ||
maxLatitude: number | ||
maxLatitude?: number, | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; | ||
@@ -56,3 +56,5 @@ import { cutPolylineByGrid, cutPolygonByGrid } from './cut-by-grid'; | ||
_options$normalize2 = options.normalize, | ||
normalize = _options$normalize2 === void 0 ? true : _options$normalize2; | ||
normalize = _options$normalize2 === void 0 ? true : _options$normalize2, | ||
_options$edgeTypes = options.edgeTypes, | ||
edgeTypes = _options$edgeTypes === void 0 ? false : _options$edgeTypes; | ||
holeIndices = holeIndices || []; | ||
@@ -87,3 +89,4 @@ var newPositions = []; | ||
gridResolution: 360, | ||
gridOffset: [-180, -180] | ||
gridOffset: [-180, -180], | ||
edgeTypes: edgeTypes | ||
}); | ||
@@ -99,3 +102,3 @@ | ||
var part = _step2.value; | ||
shiftLongitudesIntoRange(Array.isArray(part) ? part : part.positions, size); | ||
shiftLongitudesIntoRange(part.positions, size); | ||
} | ||
@@ -102,0 +105,0 @@ } catch (err) { |
@@ -6,3 +6,3 @@ type BoundingBox = [number, number, number, number]; | ||
bbox : BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,3 +17,3 @@ startIndex? : number, | ||
bbox: BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -20,0 +20,0 @@ startIndex? : number, |
@@ -8,3 +8,3 @@ { | ||
}, | ||
"version": "3.2.0-alpha.3", | ||
"version": "3.2.0-alpha.4", | ||
"keywords": [ | ||
@@ -31,3 +31,3 @@ "webgl", | ||
}, | ||
"gitHead": "d4dbf43e20c7d51108bcdb52a3bd2ee6846d05a7" | ||
"gitHead": "92417c40480d10a9e933459ca838df13a34e48a1" | ||
} |
@@ -1,6 +0,6 @@ | ||
type Polygon = Array<number> | {positions: Array<number>, holeIndices: Array<number>}; | ||
type Polygon = {positions: Array<number>, holeIndices?: Array<number>, vertexTypes?: Array<Number>}; | ||
export function cutPolylineByGrid( | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -18,7 +18,8 @@ broken? : boolean, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
gridResolution? : number, | ||
gridOffset? : [number, number] | ||
gridOffset? : [number, number], | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; |
@@ -57,2 +57,5 @@ /* eslint-disable max-statements, max-depth, complexity */ | ||
const TYPE_INSIDE = 0; | ||
const TYPE_BORDER = 1; | ||
export function cutPolygonByGrid(positions, holeIndices, options = {}) { | ||
@@ -63,5 +66,11 @@ if (!positions.length) { | ||
} | ||
const {size = 2, gridResolution = 10, gridOffset = [0, 0]} = options; | ||
const {size = 2, gridResolution = 10, gridOffset = [0, 0], edgeTypes = false} = options; | ||
const result = []; | ||
const queue = [{pos: positions, holes: holeIndices || []}]; | ||
const queue = [ | ||
{ | ||
pos: positions, | ||
types: edgeTypes && new Array(positions.length / size).fill(TYPE_BORDER), | ||
holes: holeIndices || [] | ||
} | ||
]; | ||
const bbox = [[], []]; | ||
@@ -72,3 +81,3 @@ let cell = []; | ||
while (queue.length) { | ||
const {pos, holes} = queue.shift(); | ||
const {pos, types, holes} = queue.shift(); | ||
@@ -81,5 +90,5 @@ getBoundingBox(pos, size, bbox); | ||
// Split the outer ring at the boundary | ||
let parts = bisectPolygon(pos, size, 0, holes[0] || pos.length, cell, code); | ||
const polygonLow = {pos: parts[0], holes: []}; | ||
const polygonHigh = {pos: parts[1], holes: []}; | ||
let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code); | ||
const polygonLow = {pos: parts[0].pos, types: parts[0].types, holes: []}; | ||
const polygonHigh = {pos: parts[1].pos, types: parts[1].types, holes: []}; | ||
queue.push(polygonLow, polygonHigh); | ||
@@ -89,11 +98,17 @@ | ||
for (let i = 0; i < holes.length; i++) { | ||
parts = bisectPolygon(pos, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code); | ||
if (parts[0]) { | ||
polygonLow.holes.push(polygonLow.pos.length); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0]); | ||
polygonLow.pos = polygonLow.pos.concat(parts[0].pos); | ||
if (edgeTypes) { | ||
polygonLow.types = polygonLow.types.concat(parts[0].types); | ||
} | ||
} | ||
if (parts[1]) { | ||
polygonHigh.holes.push(polygonHigh.pos.length); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1]); | ||
polygonHigh.pos = polygonHigh.pos.concat(parts[1].pos); | ||
if (edgeTypes) { | ||
polygonHigh.types = polygonHigh.types.concat(parts[1].types); | ||
} | ||
} | ||
@@ -103,3 +118,11 @@ } | ||
// Polygon fits in a single cell, no more processing required | ||
result.push(holes.length ? {positions: pos, holeIndices: holes} : pos); | ||
const polygon = {positions: pos}; | ||
if (edgeTypes) { | ||
polygon.edgeTypes = types; | ||
} | ||
if (holes.length) { | ||
polygon.holeIndices = holes; | ||
} | ||
result.push(polygon); | ||
} | ||
@@ -110,7 +133,12 @@ } | ||
// edgeTypes: | ||
// TYPE_BORDER - edge from the original polygon | ||
// TYPE_INSIDE - inside the original polygon | ||
// eslint-disable-next-line max-params | ||
function bisectPolygon(positions, size, startIndex, endIndex, bbox, edge) { | ||
function bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) { | ||
const numPoints = (endIndex - startIndex) / size; | ||
const resultLow = []; | ||
const resultHigh = []; | ||
const typesLow = edgeTypes && []; | ||
const typesHigh = edgeTypes && []; | ||
const scratchPoint = []; | ||
@@ -120,4 +148,6 @@ | ||
let side; | ||
let type; | ||
const prev = getPointAtIndex(positions, numPoints - 1, size, startIndex); | ||
let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]); | ||
let prevType = edgeTypes && edgeTypes[numPoints - 1]; | ||
let lowPointCount = 0; | ||
@@ -129,2 +159,3 @@ let highPointCount = 0; | ||
side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]); | ||
type = edgeTypes && edgeTypes[startIndex / size + i]; | ||
@@ -136,2 +167,6 @@ // if segment goes through the boundary, add an intersection | ||
push(resultHigh, scratchPoint); | ||
if (edgeTypes) { | ||
typesLow.push(prevType); | ||
typesHigh.push(prevType); | ||
} | ||
} | ||
@@ -148,7 +183,24 @@ | ||
if (edgeTypes) { | ||
if (side <= 0) { | ||
typesLow.push(type); | ||
} else if (typesLow.length) { | ||
typesLow[typesLow.length - 1] = TYPE_INSIDE; | ||
} | ||
if (side >= 0) { | ||
typesHigh.push(type); | ||
} else if (typesHigh.length) { | ||
typesHigh[typesHigh.length - 1] = TYPE_INSIDE; | ||
} | ||
} | ||
copy(prev, p); | ||
prevSide = side; | ||
prevType = type; | ||
} | ||
return [lowPointCount ? resultLow : null, highPointCount ? resultHigh : null]; | ||
return [ | ||
lowPointCount ? {pos: resultLow, types: typesLow} : null, | ||
highPointCount ? {pos: resultHigh, types: typesHigh} : null | ||
]; | ||
} | ||
@@ -155,0 +207,0 @@ |
@@ -5,3 +5,3 @@ import {Polygon} from "./cut-by-grid"; | ||
positions : Array<number>, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,8 +17,9 @@ startIndex? : number, | ||
holeIndices : Array<number> | null, | ||
options : { | ||
options? : { | ||
size? : number, | ||
normalize? : boolean, | ||
maxLatitude: number | ||
maxLatitude?: number, | ||
edgeTypes? : boolean | ||
} | ||
) : Array<Polygon>; | ||
@@ -34,3 +34,3 @@ import {cutPolylineByGrid, cutPolygonByGrid} from './cut-by-grid'; | ||
export function cutPolygonByMercatorBounds(positions, holeIndices, options = {}) { | ||
const {size = 2, normalize = true} = options; | ||
const {size = 2, normalize = true, edgeTypes = false} = options; | ||
holeIndices = holeIndices || []; | ||
@@ -73,3 +73,4 @@ const newPositions = []; | ||
gridResolution: 360, | ||
gridOffset: [-180, -180] | ||
gridOffset: [-180, -180], | ||
edgeTypes | ||
}); | ||
@@ -81,3 +82,3 @@ | ||
for (const part of parts) { | ||
shiftLongitudesIntoRange(Array.isArray(part) ? part : part.positions, size); | ||
shiftLongitudesIntoRange(part.positions, size); | ||
} | ||
@@ -84,0 +85,0 @@ } |
@@ -6,3 +6,3 @@ type BoundingBox = [number, number, number, number]; | ||
bbox : BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -17,3 +17,3 @@ startIndex? : number, | ||
bbox: BoundingBox, | ||
options : { | ||
options? : { | ||
size? : number, | ||
@@ -20,0 +20,0 @@ startIndex? : number, |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
225180
2618