Berechnung des Polygonbereichs

8

Also habe ich diesen Code in Javascript bekommen, um unregelmäßige Polygonfläche aus dem Netz zu berechnen.

%Vor%

Die Ergebnisse scheinen korrekt zu sein. Wenn der Scheitelpunkt im Uhrzeigersinn verläuft, zeigt er positive Ergebnisse, wird jedoch negativ, wenn ich den Scheitelpunkt im Gegenuhrzeigersinn verfolge. Warum ist das so?

Wie funktioniert dieser Algorithmus? Ich möchte wirklich wissen, was die mathematische Erklärung dahinter ist, weil es mir immer noch schwer fällt, die Erklärung im Netz zu verstehen.

    
Charlie Kee 29.04.2013, 17:53
quelle

4 Antworten

13

Stellen Sie sich vor, Sie zeichnen horizontale Linien von jedem Eckpunkt zur Y-Achse; für jede Kante wird dies ein Trapez beschreiben:

%Vor%

Die Formel (X[j]+X[i]) * (Y[j]-Y[i]) in der inneren Schleife berechnet die doppelte Fläche dieses Trapezes, wenn Y[i] <= Y[j] , oder negative zweimal die Fläche, wenn Y[i] >= Y[j] .

Bei einem geschlossenen Polygon subtrahiert dies natürlich den Bereich links von den "nach oben gehenden" Kanten von dem Bereich links von den "nach unten gehenden" Kanten. Wenn das Polygon im Uhrzeigersinn ist, schneidet es die exakte (doppelte) Fläche des Polygons sauber aus; wenn gegen den Uhrzeigersinn, erhalten Sie den negativen (doppelten) Bereich.

Um die Fläche eines gegebenen Polygons zu berechnen,

%Vor%

Nimm den abgehenden Bereich:

%Vor%

minus dem durchgehenden Bereich:

%Vor%

Obwohl das obige Beispiel ein konvexes Polygon verwendet, ist diese Bereichsberechnung für beliebige Polygone korrekt, unabhängig davon, wie viele Up- und Down-Pfade sie haben.

    
comingstorm 29.04.2013, 20:45
quelle
5

Es gibt einen Algorithmus zur Berechnung des Polygonbereichs:

%Vor%     
Andrii Verbytskyi 12.11.2015 11:44
quelle
1

Es gibt keine Magie dahinter. Werfen Sie einen Blick auf Determinante einer Matrix ( Ссылка )

bearbeiten:

Um ehrlich zu sein: In diesem Code steckt eine Magie:

  1. Sie brauchen eine Triangulation. Hier: wir erstellen Dreiecke beginnend in (0,0) und mit (Xi, Yi) und (Xj, Yj)
  2. Sie berechnen die Determinante für jedes zu erhaltende Dreieck: Xi Yj - Xj Yi . Aber hier berechnet jemand (X[j]+X[i]) * (Y[j]-Y[i]) = Xj Yj - Xj Yi + Xi Yj - Xi Yi = (Xj Yj - Xi Yi) + (Xi Yj - Xj Yi) . Aber glücklich, wenn Sie all das hinzufügen, bricht das Teil (Xj Yj - Xi Yi) sich selbst ab. So ist es der schwierige Teil.
neo 29.04.2013 17:59
quelle
0

Es akkumuliert den vorzeichenbehafteten Bereich zwischen jedem orientierten Segment P [i], P [i + 1] und der Y-Achse. Am Ende der Schleife wird der Bereich außerhalb des Polygons aufgehoben (es wird zweimal mit unterschiedlichen Vorzeichen gezählt), und ein vorzeichenbehafteter Bereich des Inneren bleibt erhalten.

    
Eric Bainville 29.04.2013 18:05
quelle

Tags und Links