package.geom.flat.linechunk.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ol Show documentation
Show all versions of ol Show documentation
OpenLayers mapping library
The newest version!
import {lerp} from '../../math.js';
/**
* Creates chunks of equal length from a linestring
* @param {number} chunkLength Length of each chunk.
* @param {Array} 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>} 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;
}