Wie finden Sie den Bereich der komplexen polygon - c++
Für nicht-komplexe Polygone, es ist ziemlich einfach:
A = 1/2 * (x1*y2 - x2*y1 + x2*y3 - x3*y2 + ... + x(n-1)*yn - xn*y(n-1) + xn*y1 - x1*yn)
Hier ist meine Implementierung in C++:
struct Point {
double x, y;
} point[210];
double area(int n) {
double a=0, b=0;
for(int i=0; i<n-1; ++i) {
a += point[i].x * point[i+1].y;
b += point[i].y * point[i+1].x;
}
return (a - b)/2;
}
Aber was ist, wenn das polygon ist Komplex? Gibt es eine ähnliche Art und Weise zu finden, die den Bereich?
Hinweis: ich versuchte, verwenden die gleiche Technik, aber es hat nicht funktioniert. Für die polygon -
(0,0) , (0,7) , (4,3) , (0,3) , (2,4) , (2,1) , (0, 0)
die obige Formel gibt mir 28.000, die 26.000. Die einzige Erklärung, die ich geben konnte war, dass das Dreieck (0,3) , (2,4) , (2,3) wird doppelt gezählt(der Punkt (2,3) ist der Schnittpunkt der Segmente (0,3) , (4,3) und (2,4) , (2,1)).
- Die Formel, die Sie verwenden ist für nicht-sich selbst schneidende Polygone, aber Sie haben eine Kreuzung für die Linien (4,3)-(0,3) und (2,4)-(2,1). Für self-interecting Polygone, die Sie brauchen, um einen Entscheidung, wie zu behandeln, um die Kreuzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut dieser link die Formel, die Sie dargestellt haben, ist für konvexe Polygone, aber das Beispiel, das Sie geben nicht angezeigt werden ein.
p.s. Statt einem 2D-array mit den folgenden für die bessere Lesbarkeit.
Dass die Formel funktioniert für einfach Polygone (die, wie nicht selbst schneidende), konvex oder nicht. Beachten Sie, dass es berechnet die unterzeichnet Fläche des Polygons. Wenn (einfaches) polygon ist orientiert sich im Uhrzeigersinn, wird der Bereich berechnet, der Formel negativ sein.
Für ein nicht-einfaches polygon, wird die Formel berechnet die Summe der signierten Fläche aller einfachen Komponenten des Polygons. Dein Beispiel-Komponente selbst-Kreuzungen, und zwar eine Bestandteile es, das Dreieck, trägt zweimal auf die Fläche.