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