Flächeninhalt eines 3D Polygons



  • Hallo,
    mein Mathematische verständiss ist leider nicht sonderlich groß, habe aber folgendes Problem zu lösen. Ich muss den Flächeninhalt eines 3D Polygons bestimmen. Für 2D habe ich die Gaußsche Trapezformel gefunden. Hilft mir aber leider auch nicht weiter.

    Ich hab mir nat. ein paar Gedanken gemacht dabei ist mir folgende Ideen gekommen,

    Die Polygonen sind alle eben. (keine Krümungen oder sonstiges). Evtl kann man diese so verschieben/rotieren/transformieren das am Ende nur noch x und y Koordinaten vorliegen. (das übersteigt meine Fähigkeiten aber bereits bei weitem)

    Am besten wäre es nat. wenn es eine fertige Formel gäbe. Damit könnte ich schon am meisten Anfangen. Hab aber im Netz nichts dergleichen gefunden was mir da weiterhilft.

    Wenn mir jemand dabei helfen könnte, würde mich das freuen.

    Anmerkung: bekannt sind nur die Eckpunkte des Polygons



  • Schrittweise Anleitung, fertige Formeln gibts erstmal so nicht:

    1. aus 3 Eckpunkten berechnest du die Ebene in der das Polygon liegt, und zwar in Normalendarstellung.
    2. Bestimme die Gerade r, die senkrecht zur Normalen und zur z-Achse ist sowie den Winkel φ zwischen Normalen und z-Achse
    3. rotiere das gesamte Koordinatensystem um r, und zwar um den Winkel φ. prüfe das Ergebnis, damit sich kein Vorzeichenfehler einschleicht
    4. der Polygon liegt jetzt in der x-y-Ebene. verschiebe ihn so in x-Richtung und y-Richtung, dass alle Koordinaten >=0 sind.
    5. jetzt ist recht einfach den Flächeninhalt zu berechnen...


  • Determinante der eckpunkte-matrix
    1/2*|AC AB|



  • na das klingt ja interessant. was genau ist eine eckpunkte-matrix?



  • PeterTheMaster schrieb:

    na das klingt ja interessant. was genau ist eine eckpunkte-matrix?

    dau



  • die_rübe schrieb:

    Ich muss den Flächeninhalt eines 3D Polygons bestimmen.
    ...
    Die Polygonen sind alle eben. (keine Krümungen oder sonstiges).
    ...
    Am besten wäre es nat. wenn es eine fertige Formel gäbe.

    ja es gibt eine Formel.
    Angenommen da sind n Punkte (in 3D) p_i mit i e{0..n-1}, dann ist der Flächeninhalt des geschlossenen Polygons, welches durch diese Punkte bestimmt ist:
    F = 0,5 * |Summe{i=0 bis i=n-1}{p_i % p_((i+1)mod n)}|
    das '%' soll das Kreuzprodukt sein. Das 'mod n' sorgt nur dafür das aus p_(n) ein p_0 wird. D.h. das letzte Element in der Summe ist also {p_(n-1) x p_0}.

    In C++ kann man das sehr schön mit dem std::inner_product-Algorithmus berechen. Hier ein Beispiel:

    #include <functional> // plus, modulus
    #include <iostream>
    #include <iterator> // istream_iterator
    #include <numeric>  // inner_product
    #include <sstream>
    #include <vector>
    
    #include "Vektor.h" // s.: <http://www.c-plusplus.net/forum/viewtopic-var-t-is-154875-and-start-is-20.html>
    
    // --   Einlesendes des Vectors vom Stream
    template< typename T >
    std::istream& operator>>( std::istream& in, basic_vector< T >& v )
    {
        T x, y, z;
        if( in >> x >> y >> z )
            v = basic_vector< T >( x, y, z );
        return in;
    }
    
    int main()
    {
        using namespace std;
        istringstream in(           // Pkt.  3
            " 1.25 2.165064 3 "     // 0     +-------+2
            " 2.25 3.897114 3 "     // 1     |       |  
            " 0    5.196152 1.5 "   // 2    4+---+5  |  
            "-1    3.464102 1.5 "   // 3         |   |  
            "-0.25 3.031089 2 "     // 4    7+---+6  |  
            " 0.25 3.897114 2 "     // 5     |       |  
            " 1    3.464102 2.5 "   // 6     +-------+1  
            " 0.5  2.598076 2.5 "   // 7     0     
            );
        vector< Vector > poly( (istream_iterator< Vector >( in )), istream_iterator< Vector >() );
        cout << "soll 5 sein: " << 0.5 * abs( inner_product( poly.begin(), poly.end()-1, poly.begin()+1, 
            poly.back() % poly.front(), plus< Vector >(), modulus< Vector >() ) ) << endl;
        return 0;
    }
    

    siehe auch diesen Thread zur Berechnung des Flächeninhalts.
    Bleibt noch zu erwähnen, dass das auch funktioniert, wenn das Polygon nicht konvex ist. Es dürfen aber keine Überschneidungen vorkommen; z.B. in Form einer 8. Oder anders ausgedrückt: die Umlaufrichtung muss immer eindeutig sein.

    Gruß
    Werner



  • Vielen Dank an euch. Ich glaube damit kann ich etwas anfangen 🙂


Anmelden zum Antworten