Forum: PC-Programmierung Flächenberechnung anhand von.


von robert c. (Gast)


Lesenswert?

Hallo liebe Leute!


Ich habe ein neues Projekt.
Und zwar möchte ich ein Programm schreiben, welches anhand von 
Koordinaten (X,Y) mir eine Fläche berechnet.

Die Anzahl der Koordinatenpunkte ist beliebig, je mehr Punkte, desto 
genauer soll die Rechnung (logischerweise) ausfallen.

Man stelle sich also eine Art Landkarte vor, die bespielsweise 
Deutschland abbildet. So soll nun auch die Fläche aussehen, die anhand 
der Punkte am Rand (Umfang) berechnet werden soll.

Nur: Wie berechne ich sowas? Ich habe leider keine Ahnung wie ich sowas 
mache.

Vielleicht könnt ihr mir helfen?!




Vielen Dank und Gruß
Robert

: Verschoben durch Admin
von robert c. (Gast)


Lesenswert?

Nochmals zu den Punkten selbst.

Jeder Punkt hat eine X- und Y-Koordinate.

Die Anzahl der Punkte (bestehend aus X,Y) ist beliebig.

von Oppi (Gast)


Lesenswert?

Hallo Robert,

Sie könnten zwischen allen Punkten die jeweiligen Dreiecke bilden - 
durch einfügen einer Hilfs-Diagonalen - und dann die Teilflächen der 
Einzeldreiecke aufsummieren!

Gruß, Oppi

von robert c. (Gast)


Lesenswert?

Ok, von dem Gauß'schen Dreiecksatz habe ich schon gehört, allerdings 
weiß ich nicht, wie ich das Programm aus so etwas Dreiecke "erkennen 
lassen kann"

:)


Danke!

von TomTom (Gast)


Lesenswert?

Eine Triangulation ist hier nicht notwendig.

Gauss bietet da eine nette Formel:
http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Trapezformel


Damit kannst du den Flächeninhalt deines Polygonzuges berechnen.

von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

robert c. schrieb:
> Jeder Punkt hat eine X- und Y-Koordinate.
> Die Anzahl der Punkte (bestehend aus X,Y) ist beliebig.

Wenn deine Punkte beliebige Koordinaten einer geschlossenen Kurve sind, 
wie verhinderst du z.B. solche Formen? Gehören die Flächen dazu oder 
werden sie abgezogen?

von robert c. (Gast)


Lesenswert?

Danke erstmal für den Link mit der Formel, diesen werde ich mir genauer 
ansehen.

@Joe G.: Die "weißen Flächen" würden in diesem Fall zur Fläche (grün) 
addiert werden.

Der Sinn der Flächenberechnung ist, dass ich später auch ein Volumen 
damit berechnen kann (hoffe ich zumindest) ;-)

Würde denn nun diese Gaussche Trapezformel auch die Fläche der oben 
gezeigten Karte anhand dieser einzigen Formel berechnen? Oder muss man 
zunächst die Karte in mehrere Einzel-Polygone/Trapeze unterteilen?

Das versteh' ich noch nicht.



Gruß

von D. I. (Gast)


Lesenswert?

Dann musst du zuallererst die konvexe Hülle deiner Punktmenge berechnen 
(zum Beispiel mit Grahams Scan Algorithmus), anschließend die Fläche mit 
dieser Formel berechnen:

http://de.wikipedia.org/wiki/Graham_Scan
http://de.wikipedia.org/wiki/Polygon#Fl.C3.A4che

von robert c. (Gast)


Lesenswert?

ok und kann man anhand derer dann auch das Volumen berechnen?


Danke :)

von robert c. (Gast)


Lesenswert?

Das mit der konvexen Hülle verstehe ich auch noch nicht ganz.

Wird sie auch für die Flächenberechnung eines Polygons mit einer Anzahl 
von n Punkten? Oder war deine Antwort auf das Volumenberechnen bezogen?

Ich habe ein VB-Projekt gefunden, welches ausschließlich die Gaussche 
Formel zum Berechnen der Fläche benötigt und nicht die Hülle.

Nicht dass wir aneinander vorbei reden :)

Gruß
robert

von D. I. (Gast)


Lesenswert?

Die konvexe Hülle brauchst du um diesen Spezialfall abzufangen:

Beitrag "Re: Flächenberechnung anhand von."

Mit der konvexen Hülle berechnest du erstmal nur die Punktmenge aus 
deinen XY-Kooridnaten welche minimal nötig ist um alle Punkte 
einzuspannen.

Daraus kannst du dann mit der Flächenformel die Fläche berechnen.

In 3D ist das alles etwas komplizierter, da musst du schon genau sagen 
was für ein Volumen du berechnen willst.

von robert c. (Gast)


Lesenswert?

Wiegesagt, dieser Fehler tritt nie auf, da alle Punkte so liegen, dass 
es keine "weißen Flächen" (wie in der Karte) gibt.

Mit einem Messgerät (Tachymeter) wird zum Beispiel ein Erdhaufen 
vermessen.
Die Grundfläche des Erdhaufens liegt ja komplett (ohne "weiße Fläche") 
am Boden auf, sodass das Phänomen nicht passieren kann.


D.h., dass ich die konvexe Hülle dann doch nicht benötige?

Später soll dann berechnet werden, wieviel Kubikmeter Erde z.B. sich 
dort befinden.
Wie sieht die Volumenberechnung (3D) aus?



Gruß

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die Messpunkte alleine bilden noch kein (eindeutiges) Volumen. Du musst
dich für eine Methode entscheiden, mittels der Punkte eine Oberfläche
festzulegen. Mit dieser Oberfläche ist dann auch das Volumen definiert.

Hier findest du die Begriffe, nach denen du weitersuchen kannst:

  http://en.wikipedia.org/wiki/3D_scanner#Reconstruction.2C_or_Modeling

Wahrscheinlich ist ein Polygonnetz (Polygon mesh) das, was dich weiter-
bringt. Wenn der Erdhaufen mit dem Tachymeter zeilenweise abgescannt
wird und jede Zeile aus gleichvielen Messpunkten besteht, ist die
Erstellung dieses Modells und dessen Volumenberechnung recht einfach.

Liegen die Messpunkte unregelmäßig, musst du irgendwie entscheiden, wel-
che der Punkte jeweils benachbart sind und zusammen ein Flächenelement
bilden. Dafür gibt es in der Literatur mehrere Verfahren unterschiedli-
cher Qualität und Komplexität. Die anschließende Volumenberechung ist
dann wieder einfach.

von robert c. (Gast)


Lesenswert?

Oh mann, das wird ja lustig ...


Zielen wir mal gleich auf die Volumenberechnung..:

 - Benötige ich für die dann auch die Gaussche Formel oder berechne ich 
die dann mit einem anderen Verfahren (wie oben schon geschrieben wurde: 
Polygonnetz)?

Ich weiß leider nicht wo ich ansetzen soll.




Gruß

von Arc N. (arc)


Lesenswert?

Volumen wird etwas komplizierter. Stichworte: Punktewolke, QuickHull 
(3d),
http://en.wikipedia.org/wiki/Convex_polyhedra#Volume
http://www.qhull.org/ (kann auch das Volumen berechnen)

von robert c. (Gast)


Lesenswert?

Hi,

das QuickHull-Programm berechnet ja auch dieses Polygonnetz.

Aber was genau gibt es mir dann als "Ergebnis"?



Wie errechnet man denn dann das Volumen? Das Problem ist, dass man über 
dieses Programm fast nix im Netz findet und ich noch immer nicht genau 
weiß, welches Verfahren man nehmen sollte.

Nochmals konkret:

 - Für Flächenberechnung: Gaussche Formel
 - Für Volumenberechnung: QuickHull, und/oder was noch??



Gruß

von robert c. (Gast)


Lesenswert?

Also zur Flächenberechnung habe ich nun folgenden Code in VB 2008 
geschrieben. (VB deshalb, weil man am schnellsten einen Erfolg sieht):

1
Imports System.IO
2
3
4
Public Class Form1
5
    Dim AnzahlPunkte As Integer
6
7
    Dim X As New List(Of String)     'saubere aufbereitete Strings
8
    Dim Y As New List(Of String)
9
    Dim Z As New List(Of String)
10
11
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
12
        Dim pDatei As New StreamReader("C:\test.pkn")
13
14
        Dim i As Integer                'Zählvariable
15
        i = 0
16
17
        Do Until pDatei.Peek() = -1
18
            Dim Zeile As String = pDatei.ReadLine()
19
            Dim trot() As String
20
            Dim trotz() As String
21
            Zeile = Zeile.Replace(".", ",")     ' Mache aus Punkt ein Komma (Trennzeichen)
22
            trot = Zeile.Split("  ")
23
            X.Add(trot(3))
24
            Y.Add(trot(5))
25
            trotz = Zeile.Split("   ")
26
            Z.Add(trotz(8))
27
            i = i + 1
28
        Loop
29
30
        AnzahlPunkte = X.Count        ' Zuweisung der Anzahl der Punkte
31
        MsgBox(gauss_area() & " m²")
32
33
    End Sub
34
    'Welche Einheit haben die Punkte (Koordinaten)?
35
36
    Public Function gauss_area() As Double
37
        Dim w As Integer
38
        Dim Area As Double
39
        Dim xs, ys, xa, ya As Double
40
41
        xs = X.Item(0)
42
        ys = Y.Item(0)
43
44
        For w = 0 To AnzahlPunkte - 1
45
            xa = X.Item(w)
46
            ya = Y.Item(w)
47
            Area = Area + (ys + ya) * (xs - xa)
48
            xs = xa
49
            ys = ya
50
        Next w
51
52
        ' der letzte Punkt ist wieder der erste Punkt
53
        xs = X.Item(0)
54
        ys = Y.Item(0)
55
56
        Area = Area + (ys + ya) * (xs - xa)
57
58
        ' Rückgabewert
59
        gauss_area = Math.Abs(Area) / 2
60
    End Function
61
62
End Class


Könnt gerne mal drüber schauen ob Euch ein Fehler auffällt.

Die berechnete Fläche wirkt schon noch sehr groß ;-)




Gruß
Robert

von robert c. (Gast)


Lesenswert?

Könnte mir jemand mal Step-by-Step erklären, was ich nun (noch) machen 
muss, um das Volumen zu berechnen?


Vielen Dank!

von Arc N. (arc)


Lesenswert?

robert c. schrieb:
> Könnte mir jemand mal Step-by-Step erklären, was ich nun (noch) machen
> muss, um das Volumen zu berechnen?
>
>
> Vielen Dank!

Bin nicht ganz so fit in diesem Bereich (Karl Heinz Buchegger kennt sich 
mit so was deutlich besser aus), aber:
Von QuickHull zum Volumen geht es z.B. über die Delaunay-Triangulation. 
Diese Triangulation kann z.T. mit dem QuickHull in n+1-Dimensionen 
berechnet werden
http://en.wikipedia.org/wiki/Delaunay_triangulation#d-dimensional_Delaunay
andere Möglichkeiten 
http://mathoverflow.net/questions/979/algorithm-for-finding-the-volume-of-a-convex-polytope
(oder in den qhull Quelltext schauen).

von robert c. (Gast)


Lesenswert?

Ok super, vielleicht meldet sich ja Karl-Heinz mal bei mir, habe davon 
leider wirklich nicht viel Ahnung, da ich sowas noch nie gemacht habe.


Ich schau mir mal die Links durch und werde mich wieder melden, wenn ich 
fragen habe.



Gruß

von robert c. (Gast)


Lesenswert?

So...An die Denkenden eine Frage:

Was um Himmels Willen ist in meinem Programm falsch? :)

Das Ergebnis der Fläche ist nicht richtig :o(


Könnt ihr mir sagen wo der Fehler liegt?

Ich suche seit 3 Stunden und finde nichts....



Gruß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

robert c. schrieb:
> Ich suche seit 3 Stunden und finde nichts....
Beispielrechnungen suchen, unittest schreiben, Zwischnergebnisse prüfen 
und nachvollziehen, für Ostern isses noch etwas weit ;)

von robert c. (Gast)


Lesenswert?

>Beispielrechnungen suchen, unittest schreiben, Zwischnergebnisse prüfen
>und nachvollziehen, für Ostern isses noch etwas weit ;)


Soweit alles schon probiert ;)

von D. I. (Gast)


Lesenswert?

Warum machst du so eine komplizierte for-Schleife (die eindeutig falsch 
ist)?

Ich kann kein Basic also überlasse ich dir das zu übersetzen:
1
double area = 0;
2
for (int i = 0; i < n; i++)
3
{
4
  area += (y[i] + y[(i+1)%n]) * (x[i] - x[(i+1)%n]);
5
}
6
return abs(area)/2.0;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.