Für das MTDrawing-Projekt musste ich aus Perfomancegründen zu malende Pfade vereinfachen.

Douglas-Peucker-Algorithmus

Um den Douglas-Peucker-Algorithmus zu Implementieren habe ich eine C#-Implementierung als  Vorlage benutzt.

Um die NSBezierPath_DouglasPeucker Category zu benutzen muss nur das NSBezierPath+DouglasPeucker.h Headerfile importiert werden. Dann kann man mit der Methode

- (NSBezierPath *)pathFromDouglasPeuckerReduction:(double)tolerance;

ein neuner vereinfachter NSBezierPath produziert werden.
Damit die Methode funktioniert, darf der Pfad keine NSCurveToBezierPathElement-Elemente beinhalten.

FitCurves-Algorithmus

Der von Philip J. Schneider entwickelte FitCurves-Algorithmus wurde 1990 in den GraphicGems veröffentlicht.
Die ANSI-C Implementierung ist theoretisch direkt in ObjC verwendbar. Ich musste die Funktionen aber noch soweit anpassen, dass ich einen NSBezierPath bilden konnte.
Ruf man die Methode

- (int)schneiderCurveFit:(double) error;

auf wird der bisherige Pfad durch einen neuen Pfad mit NSCurveToPointElement-Elementen ersetzt.
Der ursprüngliche Pfad darf keine NSCurveToPointElement-Elemente enthalten.

Durch die Benutzung beider Algorithmen nacheinander kann man die Elementzahl eines NSBezierPaths erheblich reduzieren und so auch die Zeichengeschwindigkeit beschleunigen

Die Categories können auf GitHub runtergeladen werden.
Wenn jemand Verbesserungsvorschläge oder Anmerkungen hat, freue ich mich über Kommentare, Nachrichten oder Pull-Requests auf Github.