I didn't use any special theory, just the combination of usual computational geometry alorithms (most important provided by clipper lib, like point in poligon, poligon clipping, area of polygon, and some additional functions for finding the intersection of line segments, centroid, etc.) and relatively basic linear algebra. The basic idea is, as you already found out, to keep track of the cleared area (desribed as paths/polygons) and then through small enough steps trying to move the tool so that the area of tool shape crossing outside the cleared area is constant over distance travelled (with feedrate and depth of cut beeing constant that should give the constant material removal rate). Each step goes through iterations of different deflection angles and for each iteration the cutting area is calculated, next iteration is guessed by interpolating previous results until the cut area is within the defined error/allowed deviation from the optimal cut. In majority of steps there are only 1-2 iterations per step as the deflection agle tends to be relatively constant (except in the beginning and end of the cut line). The first/starting point is chosen by finding the largest circular area not crossing the boundary of regions being cut. This is done by using clipper offset algorithm (i.e. incremetaly offseting inwards the boundary paths (in steps aprox. to tool radius) until point when all offset paths disapear, then you take the offset paths just right before that point and calculate the centroid for one of them, that gives the center point of one of the largest areas to clear). When the tool reaches the boundary (checked by clipper's "point in polygon" function and then finding the exact intersection point) i.e. at the end of trochoidal cut, the cut is ended and a new start point is calculated. This is done simply by moving (in CCW direction for most outer boundary path and CW direction for inner islands/holes) accros the boundary line until we find first/closest not cleared area in the tool radius span (i.e. where area to cut is above some defined threshold), and then start again stepping from this point. When there are no more such points, the algorithm finishes and generates the GCode for helix ramp and in each step down (i.e. in Z direction) adds the same previously calculated toolpaths with appropriate Z coord.
I hope this makes it a bit clearer, unfortunately I don't have time at the moment to make more detailed documentation (maybe in a week or two)