Volumen eines beliebigen Hexaeders



  • In meiner Mathe-Formelsammlung (Formeln+Hilfen, Binomi Verlgag) tauchen sowohl Tetraeder als auch Hexaeder nur unter den platonischen Körpern auch.

    Am besten, der Fragesteller erklärt mal, was er gemeint hat. Dann müssen wir nicht wild rumraten und uns mit Definitionen herumärgern.



  • Bashar schrieb:

    Vielleicht irgendwie in Tetraeder zerlegen und fuer die dann die Formel fuer Pyramiden anwenden. (Kann ein Hexaeder eigentlich konkav sein?)

    Ich kannte Hexaeder bis dato nur als Würfel. Aber wenn man es als Körper mit 6 Flächen nimmt, dann kann's auch konkav sein. Einfach mit nem Würfel anfangen und eine Kante so lange in Richtung der ihr gegenüberliegenden Kanten verschieben, bis man über die Diagonale hinaus ist. Ab dann wird's konkav.



  • Der Hexaeder, von dem ich rede, kann beliebig verzerrt oder gestreckt sein. Demnach ist eine triviale Berechnung des Volumens über die Kanten nicht möglich.



  • W2K2005 schrieb:

    Der Hexaeder, von dem ich rede, kann beliebig verzerrt oder gestreckt sein. Demnach ist eine triviale Berechnung des Volumens über die Kanten nicht möglich.

    Dann entzerr' ihn vor der Berechnung oder vergiss es...

    W2K2005 schrieb:

    Der Hexaeder [...] kann beliebig [...] gestreckt sein. Demnach ist eine triviale Berechnung des Volumens über die Kanten nicht möglich.

    Doch! (Laut meines Wissen über Streckung)

    Gib doch einmal ein Beispiel
    in etwa so:

    Ich schrieb:

    A( 0 | 0 | 0 )
    B( 0 | 0 | 1 )
    C( 0 | 1 | 0 )
    D( 0 | 1 | 1 )
    E( 1 | 0 | 0 )
    F( 1 | 0 | 1 )
    G( 1 | 1 | 0 )
    H( 1 | 1 | 1 )

    - Gestreckt um P( 7 | 1 | 0 ) mit dem Faktor (-π)
    ...



  • Den Hexaeder kannst du doch als eingeschlossenen Koerper zwischen 6 Ebenen auffassen und dann evtl. mit dem Satz von Fubini integrieren.



  • Das Volumen berechnet sich mithilfe der Gausspunkt-Integration:

    V = ∫ dΩ = Σ wgp * det(J)

    wobei wgp das Gewicht des Gausspunkts und J die Jacobi-Matrix ist.

    Damit lässt sich ein kleines C-Programm realisieren:

    #include <stdio.h>
    
    int main()
    {
      double Volume( double x[8], double y[8], double z[8] );
    
      // coordinates of the master element (cube length = 2, volume = 8)
      double x[8] = { -1,+1,+1,-1,-1,+1,+1,-1 };
      double y[8] = { -1,-1,+1,+1,-1,-1,+1,+1 };
      double z[8] = { +1,+1,+1,+1,-1,-1,-1,-1 };
    
      printf( "Volume = %lf\n", Volume( x, y, z ) );
    
      return 0;
    }
    
    double Volume( double x[8], double y[8], double z[8] )
    {
      double J[3][3];
    
      // initialize the jacobian matrix
      J[0][0] = 0.0;
      J[0][1] = 0.0;
      J[0][2] = 0.0;
      J[1][0] = 0.0;
      J[1][1] = 0.0;
      J[1][2] = 0.0;
      J[2][0] = 0.0;
      J[2][1] = 0.0;
      J[2][2] = 0.0;
    
      // local coordinates of the master element (cube) 
      double xl[8] = { -1,+1,+1,-1,-1,+1,+1,-1 };
      double yl[8] = { -1,-1,+1,+1,-1,-1,+1,+1 };
      double zl[8] = { +1,+1,+1,+1,-1,-1,-1,-1 };
    
      // compute components of the jacobian matrix
      int n;
      for( n=0; n<8; n++ )
      {
        J[0][0] += xl[n] * x[n];
        J[0][1] += xl[n] * y[n];
        J[0][2] += xl[n] * z[n];
    
        J[1][0] += yl[n] * x[n];
        J[1][1] += yl[n] * y[n];
        J[1][2] += yl[n] * z[n];
    
        J[2][0] += zl[n] * x[n];
        J[2][1] += zl[n] * y[n];
        J[2][2] += zl[n] * z[n];
      }
    
      // compute the determinant
      return (  J[0][0] * J[1][1] * J[2][2]
              + J[0][1] * J[1][2] * J[2][0]
              + J[0][2] * J[1][0] * J[2][1]
              - J[0][0] * J[1][2] * J[2][1]
              - J[0][1] * J[1][0] * J[2][2]
              - J[0][2] * J[1][1] * J[2][0] ) / 64.0;
    }
    


  • Noch ein Hinweis: Die Reihenfolge der Eckpunkte des Hexaeders ist natürlich nicht beliebig. Folgende Skizze gibt die Knotenreihenfolge und die Orientierung des Koordinatensystems wieder:

    + Z
                 |
         4 ------------- 3
        /|              /|
       / |             / |
      /  |            /  |
     1 ------------- 2   |
     |   |           |   | -- + Y
     |   |           |   |
     |   8 ----------|-- 7
     |  /            |  /
     | /             | /
     |/              |/
     5 ------------- 6
             /
            + X
    


  • Ist Dir bewusst, dass der Thread mehr als sieben Jahre alt ist?



  • Durchaus. Selber auf der Suche nach einer geschickten Lösung, war ich auf diesen Thread gestoßen, ohne hier eine Lösung zu finden. Ist eine Problemlösung aufgrund des Threadalters nun unerwünscht? Vieleicht geht's jemand anderem ähnlich wie mir, und er freut sich eine Lösung zu finden.



  • pm.schroeder schrieb:

    Ist eine Problemlösung aufgrund des Threadalters nun unerwünscht?

    Nein, keinesfalls. Ich wollte nur wissen, ob Dir klar ist, dass der Threadersteller (oder diverse andere beteiligte) die Mühe die Du Dir offensichtlich machst mit hoher Wahrscheinlichkeit nicht würdigen/überhaupt mitbekommen. In diesem Sinne ist Deine Arbeit womöglich "umsonst". Wenn Dir das aber klar ist, passt ja alles. Der nächste der sowas sucht und Deine Antwort findet freut sich bestimmt. 👍


Anmelden zum Antworten