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.
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.
Es gibt einen Algorithmus zur Berechnung des Polygonbereichs:
%Vor%Es gibt keine Magie dahinter. Werfen Sie einen Blick auf Determinante einer Matrix ( Ссылка )
bearbeiten:
Um ehrlich zu sein: In diesem Code steckt eine Magie:
(0,0)
und mit (Xi, Yi)
und (Xj, Yj)
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. 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.
Tags und Links javascript math