export function douglasPeucker()

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
}