Another approach Douglas–Peucker algorithm
Recursive
(defun DouglasPeucker_elimPtos (PointList CorridorWidth / p1 p2 distan valmax nn 2lis)
(if (< (length PointList) 3)
PointList (progn
(setq p1 (car PointList)
p2 (last PointList)
distan (mapcar (function (lambda (pt) (PerDist p1 p2 pt))) (reverse (cdr (reverse (cdr PointList)))))
valmax (apply (function max) distan)
)
(if (> valmax CorridorWidth) (progn
(setq nn (vl-position valmax distan) ;hay uno menos, se suman 2
2lis (breaklistAt (+ 2 nn) PointList T))
(append (DouglasPeucker_elimPtos (car 2lis) CorridorWidth)
(cdr (DouglasPeucker_elimPtos (cadr 2lis) CorridorWidth)))
)
(list p1 p2))
))
)
(defun PerDist (pt1 pt2 pt3 / ang1 ang2)
; Compute perpendiculat distance
; c. 1992 author unknown, Mod KJM 1994
; perpendicular distance from pt3 to line segment pt1-pt2
(setq ang1 (angle pt1 pt2)
ang2 (angle pt1 pt3)
ang1 (if (> ang2 ang1)(+ ang1 2pi) ang1)
)
(abs (* (distance pt1 pt3) (sin (- ang1 ang2))))
)
(defun breaklistAt (n l repeat? / r)
(while (and l (< 0 n))
(setq r (cons (car l) r)
l (cdr l)
n (1- n)
)
)
(list (reverse r) (if repeat? (cons (car r) l) l))
)