Volume (hexaèdre et pentaèdre quelconques)
Bonjour
Je pensais l'information facilement accessible, mais j'ai le sentiment de tourner en rond depuis plusieurs heures. Je cherche à calculer le volume d’hexaèdres et pentaèdres quelconques à partir des seules coordonnées des sommets (faces opposées non parallèles et de dimensions différentes typiquement).
J'ai trouvé des informations pour les tétraèdres (via par le calcul du déterminant de Cayley-Menger), mais cela m'intéresse de savoir s'il existe une méthode "générale" applicable à mon besoin.
Bien sûr je pourrais découper mes volumes élémentaires en tétra, mais ce n'est pas le propos pour le moment.
L'idée est de programmer ça sous Scilab, Python ou Julia par exemple (la raison pour laquelle je poste ici).
Merci par avance pour toute suggestion et autres pistes.
Paul
Je pensais l'information facilement accessible, mais j'ai le sentiment de tourner en rond depuis plusieurs heures. Je cherche à calculer le volume d’hexaèdres et pentaèdres quelconques à partir des seules coordonnées des sommets (faces opposées non parallèles et de dimensions différentes typiquement).
J'ai trouvé des informations pour les tétraèdres (via par le calcul du déterminant de Cayley-Menger), mais cela m'intéresse de savoir s'il existe une méthode "générale" applicable à mon besoin.
Bien sûr je pourrais découper mes volumes élémentaires en tétra, mais ce n'est pas le propos pour le moment.
L'idée est de programmer ça sous Scilab, Python ou Julia par exemple (la raison pour laquelle je poste ici).
Merci par avance pour toute suggestion et autres pistes.
Paul
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
$$\frac16 \; \left|\begin{array}{cccc} 1&1&1&1\\x_0&x_1&x_2&x_3\\y_0&y_1&y_2&y_3\\z_0&z_1&z_2&z_3\end{array}\right|\;.$$
Pour calculer l'aire d'un polygone, c'est facile quand on a comme information la succession des côtés dans le sens trigonométrique direct. Pour un polytope, je ne vois pas comment éviter de passer par une description des faces.
Si on a la liste des faces, chacune donnée par une liste des sommets avec sens de parcours selon l'orientation de la face par la normale sortante, alors aucun problème pour le calcul du volume (de n'importe quel polytope).
Encore un ajout : cette information sur les faces peut s'obtenir par un calcul d'enveloppe convexe (en dimension 3, c'est plus cher que dans le plan !). Par ailleurs, si tu as juste la liste des sommets, comment sais-tu qu'il s'agit d'un pentaèdre ou d'un hexaèdre ou ... ?
Merci pour ces retours.
Une nouvelle fois (par ignorance), j'ai cherché à réinventer l'eau chaude 8-) et j'ai fini par trouver. Paul
Dans ce cas, il s'agit de calculer le volume de troncs de prismes triangulaires et ça se fait très simplement, surtout sans faire appel au calcul d'enveloppe convexe !
En projetant le contour de la surface, je "ferme" le volume.
Pour le moment je ne saurais sire si Scipy réalise une tesselation pour déterminer les faces extérieures, mais en pratique, je n'ai que des points à fournir et il se charge du reste B-)
Merci pour l'intérêt
Ça conduit à calculer l'enveloppe convexe d'un nuage de points et ensuite le volume du polytope obtenu (à partir de l'information sur les faces du polytope). C'est ce que j'avais indiqué dans ma première réponse, vu la façon dont tu posais le problème, mais ici c'est vraiment prendre un marteau-pilon pour écraser les mouches.
On peut bien sûr se ramener à des triangles en divisant les quadrangles en deux. Si on a un triangle de sommets $(x_i,y_i,z_i)$ pour $i=0,1,2$, où $z_i$ est la "hauteur" supposée positive, le volume du tronc de prisme sous le triangle est donné par la valeur absolue de
$$\frac16 (z_0+z_1+z_2)\, \det\pmatrix{1&1&1\\x_0&x_1&x_2\\y_0&y_1&y_2}\;.$$
Je peux te garantir que ça ira beaucoup plus vite que de passer par le calcul de l'enveloppe convexe !
Un défaut habituel : ne pas spécifier exactement son problème, mais plutôt en donner une interprétation."]
[/quote]
Je plaide coupable; je pensais naïvement qu'une formule générale (et simple) existait et j'ai donc orienté mes questions.
Je me rends compte aujourd'hui que je ne peux pas éviter de découper mes quadrangles en triangles (certains des quadrangles ne sont pas coplanaires), donc je vais tester ta solution que tu proposes.
Merci
J'imagine : une liste des coordonnées des noeuds, et une liste des triangles du maillage (triplets de noeuds). Est-ce ça ?
Effectivement je dispose des infos sur les sommets (numéros et coordonnées), et des faces (numéros et connectivités avec les sommets - pour les quadrangles, la liste des sommets se fait dans un ordre connu); pas de problème particulier de ce côté-là, c'est juste un traitement numérique sur base de tableaux/matrices.
Un petit retour sur cette étude : comme précisé par GaBuZoMeu, la formule est simple et rapide à mettre en place; en revanche, j'ai largement sous-estimé le cas des quadrangles lorsque les nœuds ne sont pas coplanaires. Je m'attendais à une certaine erreur en les découpant en triangles, mais elle devient significative lorsque le quadrangle est "gauche" (-20% comparativement à la référence).
Quandragle "gauche"
(trouvée sur internet; pour illustration)
Si je dois conjecturer, ne dois-je pas aller voir du côté des surfaces bilinéaires (et donc des polytopes) pour calculer plus précisément mon volume?
Merci
Paul
Tu peux mettre cette formule dans ton calcul pour ne pas découper les quadrangles en deux triangles. Cette formule vient d'une paramétrisation de la surface et d'une intégration. Je l'ai calculée avec Sage :
ce qui donne
Je ne suis pas un utilisateur de Sage, mais son approche "formelle" semble être utile dans certaines circonstances ;-)
Dans le calcul de "vol", les bornes d'intégration semblent être $[0,1]$, $\Rightarrow$ j'ai alors un volume unitaire, non ?
Le morceau de surface (d'hyperboloïde de paraboloïde hyperbolique, plus précisément) délimité par les côtés du quadrilatère gauche de sommets $(x0,y0,z0), (x1,y1,z1), (x2,y2,z2), (x3,y3,z3)$ est paramétré par $(s,t)$ qui parcourt le carré $[0,1]\times [0,1]$. La paramétrisation est :
$$ (1-s)(1-t)\pmatrix{x0\\y0\\z0}+s(1-t)\pmatrix{x1\\y1\\z1}+st\pmatrix{x2\\y2\\z2}+(1-s)t \pmatrix{x3\\y3\\z3}\;.
$$Les $f,g,h$ de mon code Sage sont les trois coordonnées de cette paramétrisation.
Pour calculer le volume entre le plan $z=0$ et le morceau de surface, j'utilise bien sûr cette paramétrisation. Soit $Q$ le quadrilatère du plan $z=0$ projection du morceau de surface, c.-à-d. le quadrilatère de sommets $(x0,y0), (x1,y1), (x2,y2), (x3,y3)$. Alors
$$\mathrm{Vol}=\iint_Q z\,\mathrm{d}x\,\mathrm{d}y =\iint_{[0,1]^2} h\, J\,\mathrm{d}s\,\mathrm{d}t\;,
$$où $J$ est le déterminant jacobien du changement de variables :
$$ J= \det\pmatrix{ \frac{\partial f}{\partial s} & \frac{\partial f}{\partial t}\\
\frac{\partial g}{\partial s} & \frac{\partial g}{\partial t}}\;.
$$
As-tu essayé la formule que je t'ai donnée pour les quadrilatères dans tes calculs ?
On peut comparer avec ce que ça donne en coupant le quadrilatère en deux triangles. Il y a deux façons de découper : soit en prenant $A_0A_1A_2$ et $A_0A_2A_3$ (triangles rouges sur la figure), soit en prenant $A_1A_2A_3$ et $A_0A_1A_3$ (triangles bleus sur la figure). Le volume sous la réunion des triangles rouges est 209.166... et le volume sous la réunion des triangles bleus est 143.33... On constate que la moyenne de ces deux volumes est le volume sous la surface verte calculé plus haut. Ce n'est pas un hasard, c'est tout le temps comme ça ; ça se vérifie facilement avec Sage, mais j'aimerais bien une explication mathématique que je ne possède pas.
Donc, si on n'est pas content avec la formule que j'ai donnée pour les quadrilatères, eh bien on utilise celle que j'ai donnée pour les triangles et on fait la moyenne des résultats obtenus pour les deux façons de découper le quadrilatère en triangles. (:P)
Il suffit de montrer que pour tout tétraèdre $[A,B,C,D]$, la portion d'hyperboloïde de paraboloïde hyperbolique qui s'appuie sur le quadrilatère $ABCD$ divise le tétraèdre en deux parties de volumes égaux.
Comme il s'agit de rapport de volumes en dimension 3, on peut sans perte de généralité appliquer une transformation affine $\varphi$ pour travailler avec un tétraèdre régulier : la portion d'hyperboloïde de paraboloïde hyperbolique qui s'appuie sur le quadrilatère $ABCD$ est envoyée par $\varphi$ sur la portion d'hyperboloïde de paraboloïde hyperbolique qui s'appuie sur l'image du quadrilatère $ABCD$ par $\varphi$.
On suppose donc à partir de maintenant que $[A,B,C,D]$ est régulier. Soit $r$ le demi-tour d'axe joignant les milieux des arêtes $[A,D]$ et $[B,C]$. Le quadrilatère $ABCD$ est globalement invariant par $r$ et donc le morceau d'hyperboloïde de paraboloïde hyperbolique $H$ qui s'appuie dessus aussi. Le demi-tour $r$ échange les deux morceaux de tétraèdre découpés par $H$, puisqu'il envoie l'arête $[A,C]$ qui est d'un côté sur l'arête $[BD]$ qui est de l'autre côté. Les deux morceaux ont donc même volume, CQFD.
PS. Je parle toujours ci-dessus d'hyperboloïde, alors que je devrais parler de paraboloïde hyperbolique. Bon, on reste toujours avec des surfaces quadriques réglées.
Que veut dire "un point quelconque $z=\alpha$" ? Tu voulais écrire "un plan quelconque" ? Ça aurait plus de sens, sauf qu'un plan quelconque n'a pas de raison d'être horizontal.
Si par hasard ce que tu voulais demander est "Comment faire pour calculer le volume compris entre la surface verte de la figure et le plan horizontal $z=\alpha$ (en supposant que la surface est au-dessus de ce plan) ?", alors la réponse est effectivement très simpliste : se ramener au cas $z=0$ en faisant le changement de coordonnées $z'=z-\alpha$.
Si tu voulais autre chose, explique. Quel est le volume que tu veux calculer, précisément ?
Je faisais référence aux points de la figure, et en cela, mes propos ne sont pas erronés il me semble (avec des études loin derrière-moi, je suis moins rigoureux, dans un domaine qui n'est pas/plus le mien).
Je pense que je vais arrêter d'abuser de ta patience.
Merci pour l'aide (restons sur une note positive ;-)
J'ai proposé une interprétation de ce que tu écrivais. Tu aurais pu au moins dire si c'était bien ça, ou autre chose.
J'ai fait l'effort de te proposer une façon de procéder dans le cas d'un quadrilatère. Tu n'as même pas daigné dire si tu avais essayé cette formule dans tes calculs et si ça répondait à ton problème.
Je reviens brièvement sur les posts précédent: je cherche à calculer le volume entre un plan arbitrairement choisi ($z=a$), et une surface 3D au préalablement maillée, et composée de quadrangles et triangles; je complèterai en disant que sous l'effet de chargements extérieurs (températures, actions mécaniques, combinaison des 2), cette surface va "évoluer" et je cherche à quantifier le changement de volume (d'où le plan arbitraire).
Je ne l'ai pas encore testée; je dois modifier mon code Python pour l'implémenter, mais promis, je te ferai un retour.
Je ne comprends pas bien en quoi l'évolution de la surface a à voir avec le changement de hauteur du plan horizontal ... Si c'est juste la hauteur du plan horizontal qui change, l'évolution du volume n'est pas dure à calculer !!! Bref, je ne vois pas la pertinence de ta modélisation. Si tu étais plus explicite, peut-être verrais-je ?
Je me demande dans quel cadre tu te poses ce problème. Professionnel ?
Tu auras compris à quoi correspond chaque quadrilatère/triangle qui compose le maillage.
J'essaie de donner un sens à ta question.
1°) Tu as un maillage de ta surface, avec une liste de noeuds $A_i$ de coordonnées $(x_i,y_i,z_i)$ et une liste de triangles et de quadrilatères de sommets les $A_i$. La surface est modélisée par la réunion des triangles plans et des morceaux de paraboloïdes hyperboliques ("surfaces bilinéaires") qui s'appuient sur les quadrilatères.
Est-ce bien ça ?
2°) Tu déformes la surface en faisant varier la hauteur $z_i$ des noeuds $A_i$, sans changer la structure du maillage : disons que tu passes de $z_i$ à $z_i+\Delta z_i$
Est-ce bien ça ?
3°) Tu veux connaître le volume compris entre la surface de départ, avant déformation, et la surface après déformation.
Est-ce bien ça ?
Si c'est bien ça, la réponse est extrêmement simple : les formules que j'ai données (aussi bien pour le cas triangle que pour le cas quadrilatère) sont linéaires en les $z_i$. La volume compris entre la surface et la surface déformée s'obtient donc tout bêtement en remplaçant dans ces formules les $z_i$ par les $\Delta z_i$.
Est-ce que ça répond à ta question ?
J'aimerais une réponse claire aux questions que je viens de poser.
J'aimerais aussi un retour sur la formule que je t'ai donnée pour le cas d'un quadrilatère.
Je constate que tu n'as pas répondu à ma question sur le contexte dans lequel tu te poses ce problème. Y a-t-il une gêne sur ce point ? Tu me donnes l'impression d'avoir le cul entre deux chaises, entre le souhait d'obtenir une aide utile pour toi et le souci de ne pas en dire trop sur tes activités.
Alors je conclus. On a un maillage de surface avec des triangles et des quadrilatères (les quadrilatères gauches sont remplis par une "surface bilinéaire", c.-à-d. un morceau de paraboloïde hyperbolique), les noeuds du maillage ont des coordonnées $(x_i,y_i,z_i)$. On perturbe la surface en changeant la hauteur des noeuds en $z_i+\Delta z_i$, et on veut calculer le volume entre la surface de départ et la surface perturbée. On calcule bien sûr au-dessus de chaque maille, et on fait la somme. Voila sans doute les pentaèdres et hexaèdres du titre du fil (voir dessin ci-dessous). Sauf qu'ici les hexaèdres ne sont pas des polytopes, vu que leurs faces supérieure (rouge) et inférieure (verte) ne sont pas planes.
Je récapitule les formules que j'ai données pour le calcul des volumes. Dans le cas d'une maille triangulaire,
$$ \Delta V_{0,1,2} = \frac16 (\Delta z_0+\Delta z_1+\Delta z_2)\, \det\pmatrix{1&1&1\\x_0&x_1&x_2\\y_0&y_1&y_2}\;.$$
Dans le cas d'une maille quadrangulaire,
$$ \Delta V_{0,1,2,3} = \frac12 \left( \Delta V_{1,2,3} + \Delta V_{0,2,3}+ \Delta V_{0,1,3} + \Delta V_{0,1,2} \right)\;.$$
La numérotation des sommets est supposée faite dans le sens direct.
Je ne sais pas si ça correspondait à la demande au fond de Paul18, mais c'est ce que j'en ai compris.
chose promise, chose due : la formule fonctionne très bien et donne le même résultat qu'un logiciel de CAO.
Pour les curieux, je suis tombé sur un développement qui donne le même résultat sans passer par Sage (voir page 102 et annexe A - je n'ai pas chercher à développer ):
Thèse Damien Rohmer
(petite erreur de copier/coller sur $q_{4}^{d}$ (points $P_c$ et $P_b$ qui sont concernés)
Merci pour l'aide
Paul