Zugegeben, der Titel dieses Beitrags hört sich etwas komisch an. Was Besseres ist mir aber leider nicht eingefallen. Im Grunde habe ich mir folgendes in den Kopf gesetzt: Ich möchte in meinem Programm diverse 3D-Objekte wie Pfeile, Böden (nicht nur rein rechteckige) o. Ä. relativ einfach dynamisch erzeugen können. Die Path-Objekte aus WPF bieten mir dafür schon die Grundlage, die ich brauche, nur leider lediglich in 2D. Daher habe ich ein kleines Programm geschrieben, welches aus einen Path per Triangulation-Algorithmus ein Modell aus Dreiecken errechnen kann. Daraus im Anschluss ein wirkliches 3D-Objekt zu machen, ist bekanntlich kein großes Problem mehr.
Was macht das Programm? Zunächst definiere ich zu Testzwecken einige Path-Objekte direkt in Xaml und zeige sie in einer Liste an. So sehe ich schon direkt im WPF-Designer, wie das Ergebnis ausschauen soll. Welche Formen das aktuell sind sieht man im Screenshot oben links. Natürlich sind alle Formen erlaubt, also auch mit Kurven. Eine Triangulation kann man aber darauf noch nicht direkt anwenden, denn dazu bräuchte man ein Modell, welches nur aus Eckpunkten und geraden Linien besteht. Somit muss man die eventuell in dem Path enthaltenen Kurven auf Linien runterrechnen. Glücklicherweise gibt es in der Klasse PathGeometry dafür folgende Methode.
private const double POLYGON_SIMPLIFICATION = 2.0; ... PathGeometry flattened = pathGeometry.GetFlattenedPathGeometry( POLYGON_SIMPLIFICATION, ToleranceType.Absolute);
Ergebnis ist hier ein PathGeometry-Objekt, welches nur noch aus Linien besteht – völlig egal, wie komplex das vorherige PathGeometry-Objekt ist. Der erste Parameter beeinflusst die Genauigkeit. Im Ergebnis hat man nun einen einzigen Polygon, der aus X Punkten und X-1 Linien besteht. Per Triangulation-Algorithmus lassen sich daraus nun alle Dreiecke berechnen, welche zum Füllen der Fläche notwendig sind. Ich verwende hier Methode Ear Clipping. Den Code dafür habe ich aus dem Codeplex-Projekt Helix Toolkit. Die errechneten Dreiecke werden im Programm direkt mit angezeigt (siehe Screenshot).
Quellcode
https://www.rolandk.de/files/Testing.WpfPathTriangulator.zip