Here I present a very simple angle-based polyline reduction algorithm as described in the chapter "A Simple Algorithm" of [David Eberly's "Polyline Reduction"][1]. It is vastly inefficient and has no quality control, but demonstrates the idea. Outlining the glyph, decoding `FilledCurve`s and performing uniform sampling on each of the Bézier curves: filledCurveToBeziers[fc_FilledCurve] := MapThread[processFCdata, List @@ fc]; processFCdata[desc_, pts_] := Module[{r, sd}, r = Range @@@ Partition[Prepend[Accumulate[desc[[All, 2]]], 1], 2, 1]; BezierFunction[pts[[#]]] & /@ r]; fc = Cases[ImportString[ ExportString[Style["S", FontFamily -> "Verdana", FontWeight -> Bold], "PDF"]], _FilledCurve, -1]; beziers = filledCurveToBeziers /@ fc; sample[n_] := DeleteDuplicates[Flatten[Thread[#[Range[0, 1, 1/n]]] & /@ Flatten[beziers], 1], Equal] list = sample[3]; The implementation: nextPoint[list_] := Ordering[Pi - Re@VectorAngle[#2 - #1, #2 - #3] & @@@ Partition[list, 3, 1], 1] + 1; deleteOnePoint[{pointToDelete_, list_}] := With[{listNext = Delete[list, pointToDelete]}, {nextPoint[listNext], listNext}]; Pre-computing data for each frame in `Manipulate`: seq = NestList[deleteOnePoint, {nextPoint[list], list}, Length[list] - 13]; Now everything is ready for the demonstration: Manipulate[Graphics[{Text[ Row[{Dynamic[Length[list] - n], " points"}, BaseStyle -> FontSize -> 22], Scaled[{.5, .5}]], EdgeForm[{Black, Thickness[.015]}], FaceForm[None], {Red, PointSize[.04], Point[seq[[n + 1, 2]][[seq[[n + 1, 1]]]]], Polygon[seq[[n + 1, 2]]], Yellow, PointSize[.015], Point[seq[[n + 1, 2]]]}}, PlotRange -> {{0, 14}, {3, 19}}], {n, 0, Length[seq] - 1, 1, AnimationRate -> 5, Appearance -> "Open", RefreshRate -> 60}] > [![animation][2]][2] [1]: http://www.geometrictools.com/Documentation/PolylineReduction.pdf [2]: https://i.sstatic.net/b6i0K.gif