ol
Version:
OpenLayers mapping library
58 lines (56 loc) • 1.89 kB
JavaScript
import {lerp} from '../../math.js';
/**
* Creates chunks of equal length from a linestring
* @param {number} chunkLength Length of each chunk.
* @param {Array<number>} flatCoordinates Flat coordinates.
* @param {number} offset Start offset of the `flatCoordinates`.
* @param {number} end End offset of the `flatCoordinates`.
* @param {number} stride Stride.
* @return {Array<Array<number>>} Chunks of linestrings with stride 2.
*/
export function lineChunk(chunkLength, flatCoordinates, offset, end, stride) {
const chunks = [];
let cursor = offset;
let chunkM = 0;
let currentChunk = flatCoordinates.slice(offset, 2);
while (chunkM < chunkLength && cursor + stride < end) {
const [x1, y1] = currentChunk.slice(-2);
const x2 = flatCoordinates[cursor + stride];
const y2 = flatCoordinates[cursor + stride + 1];
const segmentLength = Math.sqrt(
(x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1),
);
chunkM += segmentLength;
if (chunkM >= chunkLength) {
const m = (chunkLength - chunkM + segmentLength) / segmentLength;
const x = lerp(x1, x2, m);
const y = lerp(y1, y2, m);
currentChunk.push(x, y);
chunks.push(currentChunk);
currentChunk = [x, y];
if (chunkM == chunkLength) {
cursor += stride;
}
chunkM = 0;
} else if (chunkM < chunkLength) {
currentChunk.push(
flatCoordinates[cursor + stride],
flatCoordinates[cursor + stride + 1],
);
cursor += stride;
} else {
const missing = segmentLength - chunkM;
const x = lerp(x1, x2, missing / segmentLength);
const y = lerp(y1, y2, missing / segmentLength);
currentChunk.push(x, y);
chunks.push(currentChunk);
currentChunk = [x, y];
chunkM = 0;
cursor += stride;
}
}
if (chunkM > 0) {
chunks.push(currentChunk);
}
return chunks;
}