Guck dir das an. Es funktioniert durch einige sehr klare Diagramme.
http://www.mathopenref.com/coordpolygonarea2.html
Sie berechnen nur die Fläche und Sie zählen Punkte auf. Sie können diese Ideen jedoch anpassen. Schauen Sie sich 'Ein komplexerer Fall' genau an und wie die horizontalen Linien das Polygon in eine Reihe von Trapezoiden unterteilen (wenn Sie ein Dreieck als entartetes Trapez mit einer Seite von Null Länge erkennen).
Wenn Ihre Polygone (möglicherweise) konkav sind, müssen Sie einige Trapezoide basierend auf der im Text erwähnten Fahrtrichtung Y (n) -Y (n + 1) verwerfen.
Jetzt haben Sie die Aufzählungspunkte in einem Polygon auf die Aufzählung von Punkten in einer Reihe von Trapezoiden reduziert. Das sollte nicht zu schwer sein, insbesondere wenn die Trapezoide gut ausgerichtet sind und zwei Linien parallel zur X-Achse "eingefangen" werden. Es ist wahrscheinlich am einfachsten zu tun , dass in einem Raster - Scan , so dass Sie nur den Start X und Ende X jede Rasterzeile berechnen haben.
Ihre Datenstruktur sieht möglicherweise aus wie eine Liste von Polygonen, ein Index, der angibt, in welchem Polygon Sie sich befinden, welche x- und y-Koordinaten Sie haben und der Endindex der Rasterzeile, in der Sie sich befinden.
Ich gehe davon aus, dass es Ihnen nichts ausmacht, in welcher Reihenfolge Sie aufzählen!
Weitere Komplexität entsteht, wenn Ihre "Polygone" disjunkte Formen enthalten (dh tatsächlich mehr als ein Polygon oder polygonale "Löcher" enthalten könnten.
Die Komplexität des Erhaltens der Trapezoide ist ziemlich gering, aber das Iterieren über eine große Anzahl von Punkten kann ziemlich langsam sein. Ich habe keine Ahnung, wofür Sie dies tun, aber wie Stephane Hockenhull über ein herkömmliches Gewicht hinausführt, um es einfacher zu machen, ist es, eine Vergröberungsnäherung zu verwenden.
Das würde bedeuten, tatsächlich in Schritten von (sagen wir) 5 zu scannen und (wenn Ihr Algorithmus verständlich ist) den Mittelpunkt einer 5 * 5-Zelle als irgendwie repräsentativ zu behandeln.
Ich hoffe, Sie haben nicht nach einer einfachen Antwort gesucht? Ich würde gerne einen Code dafür sehen!