in src/lib/components/molecules/canvas-map/lib/util/simplify.js [91:152]
export function douglasPeucker(
flatCoordinates,
offset,
end,
stride,
squaredTolerance,
simplifiedFlatCoordinates,
simplifiedOffset,
) {
const n = (end - offset) / stride
if (n < 3) {
for (; offset < end; offset += stride) {
simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset]
simplifiedFlatCoordinates[simplifiedOffset++] =
flatCoordinates[offset + 1]
}
return simplifiedOffset
}
/** @type {Array<number>} */
const markers = new Array(n)
markers[0] = 1
markers[n - 1] = 1
/** @type {Array<number>} */
const stack = [offset, end - stride]
let index = 0
while (stack.length > 0) {
const last = stack.pop()
const first = stack.pop()
let maxSquaredDistance = 0
const x1 = flatCoordinates[first]
const y1 = flatCoordinates[first + 1]
const x2 = flatCoordinates[last]
const y2 = flatCoordinates[last + 1]
for (let i = first + stride; i < last; i += stride) {
const x = flatCoordinates[i]
const y = flatCoordinates[i + 1]
const squaredDistance = squaredSegmentDistance(x, y, x1, y1, x2, y2)
if (squaredDistance > maxSquaredDistance) {
index = i
maxSquaredDistance = squaredDistance
}
}
if (maxSquaredDistance > squaredTolerance) {
markers[(index - offset) / stride] = 1
if (first + stride < index) {
stack.push(first, index)
}
if (index + stride < last) {
stack.push(index, last)
}
}
}
for (let i = 0; i < n; ++i) {
if (markers[i]) {
simplifiedFlatCoordinates[simplifiedOffset++] =
flatCoordinates[offset + i * stride]
simplifiedFlatCoordinates[simplifiedOffset++] =
flatCoordinates[offset + i * stride + 1]
}
}
return simplifiedOffset
}