Spaces:
Sleeping
Sleeping
| import { type Point, distancePointToSegment } from "./math"; | |
| export function douglasPeucker(points: Point[], epsilon: number): Point[] { | |
| if (epsilon === 0) { | |
| return points; | |
| } | |
| if (points.length <= 2) { | |
| return points; | |
| } | |
| const first = points[0]; | |
| const last = points[points.length - 1]; | |
| const [maxDistance, maxIndex] = points.reduce( | |
| ([maxDistance, maxIndex], point, index) => { | |
| const distance = distancePointToSegment(point, first, last); | |
| return distance > maxDistance | |
| ? [distance, index] | |
| : [maxDistance, maxIndex]; | |
| }, | |
| [0, -1], | |
| ); | |
| if (maxDistance >= epsilon) { | |
| const maxIndexPoint = points[maxIndex]; | |
| return [ | |
| ...douglasPeucker( | |
| [first, ...points.slice(1, maxIndex), maxIndexPoint], | |
| epsilon, | |
| ).slice(0, -1), | |
| maxIndexPoint, | |
| ...douglasPeucker( | |
| [maxIndexPoint, ...points.slice(maxIndex, -1), last], | |
| epsilon, | |
| ).slice(1), | |
| ]; | |
| } | |
| return [first, last]; | |
| } | |