MCPcopy Create free account
hub / github.com/alceal/plotlars / rdp_simplify

Function rdp_simplify

crates/plotlars-plotters/src/render/mod.rs:275–301  ·  view source on GitHub ↗

Ramer-Douglas-Peucker polyline simplification.

(points: &[(f64, f64)], epsilon: f64)

Source from the content-addressed store, hash-verified

273
274/// Ramer-Douglas-Peucker polyline simplification.
275fn rdp_simplify(points: &[(f64, f64)], epsilon: f64) -> Vec<(f64, f64)> {
276 if points.len() <= 2 {
277 return points.to_vec();
278 }
279 let first = points[0];
280 let last = points[points.len() - 1];
281
282 let mut max_dist = 0.0f64;
283 let mut max_idx = 0;
284 for (i, &p) in points.iter().enumerate().skip(1).take(points.len() - 2) {
285 let d = perp_distance(p, first, last);
286 if d > max_dist {
287 max_dist = d;
288 max_idx = i;
289 }
290 }
291
292 if max_dist > epsilon {
293 let mut left = rdp_simplify(&points[..=max_idx], epsilon);
294 let right = rdp_simplify(&points[max_idx..], epsilon);
295 left.pop();
296 left.extend(right);
297 left
298 } else {
299 vec![first, last]
300 }
301}
302
303fn perp_distance((px, py): (f64, f64), (ax, ay): (f64, f64), (bx, by): (f64, f64)) -> f64 {
304 let dx = bx - ax;

Callers 1

simplify_svg_polylinesFunction · 0.85

Calls 1

perp_distanceFunction · 0.85

Tested by

no test coverage detected