X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FARCHIMEDE%2FArchimede_VolumeSection.cxx;h=4409791c8e500df6a68a101cb3e9449fc621cf10;hb=c1d63ef1f803d255b61ee99fb618bf471add07f4;hp=9558be90f4c8a9aad9272459329ab5d9835653f8;hpb=424ee09297c24f76f1e2ca2279afa5941b243bbd;p=modules%2Fgeom.git diff --git a/src/ARCHIMEDE/Archimede_VolumeSection.cxx b/src/ARCHIMEDE/Archimede_VolumeSection.cxx index 9558be90f..4409791c8 100644 --- a/src/ARCHIMEDE/Archimede_VolumeSection.cxx +++ b/src/ARCHIMEDE/Archimede_VolumeSection.cxx @@ -1,33 +1,30 @@ -// GEOM ARCHIMEDE : algorithm implementation +// Copyright (C) 2007-2023 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// GEOM ARCHIMEDE : algorithm implementation // File : Archimede_VolumeSection.cxx // Author : Nicolas REJNERI // Module : GEOM -// $Header$ - -#include - +// #include "Archimede_VolumeSection.hxx" #include "utilities.h" @@ -41,14 +38,10 @@ #include #include #include -#include -#include -#include #include #include #include #include -#include #include #include @@ -95,33 +88,32 @@ void VolumeSection::CenterOfGravity() TopoDS_Face F = TopoDS::Face(ex.Current()); Handle(Poly_Triangulation) Tr = BRep_Tool::Triangulation(F, L); if(Tr.IsNull()) - MESSAGE("Error, null layer" ) + MESSAGE("Error, null layer" ); nbNodes = Tr->NbNodes(); - const TColgp_Array1OfPnt& Nodes = Tr->Nodes(); // Calcul des dimensions de la boite englobante du solide for(i=1;i<=nbNodes;i++) - { - InitPoint = Nodes(i).Transformed(L.Transformation()); - if(InitPoint.X() < Xmin) - Xmin = InitPoint.X(); - if(InitPoint.X() > Xmax) - Xmax = InitPoint.X(); - if(InitPoint.Y() < Ymin) - Ymin = InitPoint.Y(); - if(InitPoint.Y() > Ymax) - Ymax = InitPoint.Y(); - if(InitPoint.Z() < Zmin) - Zmin = InitPoint.Z(); - if(InitPoint.Z() > Zmax) - Zmax = InitPoint.Z(); - - } + { + InitPoint = Tr->Node(i).Transformed(L.Transformation()); + if(InitPoint.X() < Xmin) + Xmin = InitPoint.X(); + if(InitPoint.X() > Xmax) + Xmax = InitPoint.X(); + if(InitPoint.Y() < Ymin) + Ymin = InitPoint.Y(); + if(InitPoint.Y() > Ymax) + Ymax = InitPoint.Y(); + if(InitPoint.Z() < Zmin) + Zmin = InitPoint.Z(); + if(InitPoint.Z() > Zmax) + Zmax = InitPoint.Z(); + + } } - // Creation du point d'initialisation, c'est € dire le centre de gravit‰ - //g‰om‰trique de la boite englobante + // Creation du point d'initialisation, c'est e dire le centre de gravite + // geometrique de la boite englobante InitPoint.SetX(0.5 * (Xmin + Xmax)); InitPoint.SetY(0.5 * (Ymin + Ymax)); @@ -131,16 +123,16 @@ void VolumeSection::CenterOfGravity() Standard_Real VolumeSection::CalculateVolume(Standard_Real Elevation) { Standard_Integer i,noeud[3],flag[3]; - Standard_Integer nbNodes; + //Standard_Integer nbNodes; TopExp_Explorer ex; TopLoc_Location L; Standard_Real z[3]; Standard_Real Volume=0; Standard_Real Determinant=0; gp_Pnt P[3]; - + // Projection du point d'initialisation sur le plan de section - + InitPoint.SetZ(Elevation); for (ex.Init(myShape, TopAbs_FACE); ex.More(); ex.Next()) @@ -148,80 +140,77 @@ Standard_Real VolumeSection::CalculateVolume(Standard_Real Elevation) TopoDS_Face F = TopoDS::Face(ex.Current()); Handle(Poly_Triangulation) Tr = BRep_Tool::Triangulation(F, L); if(Tr.IsNull()) - MESSAGE("Error, null layer" ) - const Poly_Array1OfTriangle& triangles = Tr->Triangles(); + MESSAGE("Error, null layer" ); Standard_Integer nbTriangles = Tr->NbTriangles(); - nbNodes = Tr->NbNodes(); - const TColgp_Array1OfPnt& Nodes = Tr->Nodes(); - + // Calcul des volumes de chaque triangle, de chaque face - //en tenant compte des triangles coup‰s par le plan de section - - for (i=1;i<=nbTriangles;i++) - { - Determinant=0; - //Gardons la meme orientation des noeuds - if (F.Orientation() == TopAbs_REVERSED) - triangles(i).Get(noeud[0], noeud[2], noeud[1]); - else - triangles(i).Get(noeud[0], noeud[1], noeud[2]); - - P[0] = Nodes(noeud[0]).Transformed(L.Transformation()); - z[0] = P[0].Z(); - P[1] = Nodes(noeud[1]).Transformed(L.Transformation()); - z[1] = P[1].Z(); - P[2] = Nodes(noeud[2]).Transformed(L.Transformation()); + // en tenant compte des triangles coupes par le plan de section + + for (i=1;i<=nbTriangles;i++) + { + Determinant=0; + //Gardons la meme orientation des noeuds + if (F.Orientation() == TopAbs_REVERSED) + Tr->Triangle(i).Get(noeud[0], noeud[2], noeud[1]); + else + Tr->Triangle(i).Get(noeud[0], noeud[1], noeud[2]); + + P[0] = Tr->Node(noeud[0]).Transformed(L.Transformation()); + z[0] = P[0].Z(); + P[1] = Tr->Node(noeud[1]).Transformed(L.Transformation()); + z[1] = P[1].Z(); + P[2] = Tr->Node(noeud[2]).Transformed(L.Transformation()); z[2] = P[2].Z(); - // Determination des cas aux limites pour les triangles - Standard_Integer i,compteur=0; + // Determination des cas aux limites pour les triangles + Standard_Integer i,compteur=0; - for (i=0;i<=2;i++) - { + for (i=0;i<=2;i++) + { flag[i]=Standard_False; - if(z[i]>=Elevation) - { - flag[i]=Standard_True; - compteur++; - } - } - - switch(compteur) - { - case 0: - Determinant = ElementaryVolume(P[0],P[1],P[2]); - break; - - case 1: - for (i=0;i<=2;i++) - { - if (flag[i]==Standard_True) - { - gp_Pnt Result1 = Intersection(P[i],P[(i+1)%3],Elevation); - gp_Pnt Result2 = Intersection(P[i],P[(i+2)%3],Elevation); - Determinant = ElementaryVolume(Result1,P[(i+1)%3],P[(i+2)%3]) - + ElementaryVolume(Result1,P[(i+2)%3],Result2); - } - } - break; - - case 2: - for (i=0;i<=2;i++) - { - if (flag[i]==Standard_False) - { - gp_Pnt Result1 = Intersection(P[i],P[(i+1)%3],Elevation); - gp_Pnt Result2 = Intersection(P[i],P[(i+2)%3],Elevation); - Determinant = ElementaryVolume(P[i],Result1,Result2); - } - } - break; - - case 3: - break; - } - Volume += Determinant; - } + if(z[i]>=Elevation) + { + flag[i]=Standard_True; + compteur++; + } + } + + switch(compteur) + { + case 0: + Determinant = ElementaryVolume(P[0],P[1],P[2]); + break; + + case 1: + for (i=0;i<=2;i++) + { + if (flag[i]==Standard_True) + { + gp_Pnt Result1 = Intersection(P[i],P[(i+1)%3],Elevation); + gp_Pnt Result2 = Intersection(P[i],P[(i+2)%3],Elevation); + Determinant = ElementaryVolume(Result1,P[(i+1)%3],P[(i+2)%3]) + + ElementaryVolume(Result1,P[(i+2)%3],Result2); + } + } + break; + + case 2: + for (i=0;i<=2;i++) + { + if (flag[i]==Standard_False) + { + gp_Pnt Result1 = Intersection(P[i],P[(i+1)%3],Elevation); + gp_Pnt Result2 = Intersection(P[i],P[(i+2)%3],Elevation); + Determinant = ElementaryVolume(P[i],Result1,Result2); + } + } + break; + + case 3: + break; + } + Volume += Determinant; + } } return Volume; @@ -241,7 +230,7 @@ Standard_Real VolumeSection::Archimede(Standard_Real Constante , Standard_Real E Bsup = Zmax; if(Binf>Bsup) { - MESSAGE("error, Bound + < Bound - in dichotomy") + MESSAGE("error, Bound + < Bound - in dichotomy"); return -1; } tempBsupVolume = CalculateVolume(Bsup); @@ -249,7 +238,7 @@ Standard_Real VolumeSection::Archimede(Standard_Real Constante , Standard_Real E if (Constante>tempBsupVolume || ConstanteEpsilon) - { - if((tempBinfVolume-Constante)*(tempCVolume-Constante)>0 && Abs(tempCVolume-Constante)>Epsilon) - { - Binf = c; - tempBinfVolume=tempCVolume; - - c = ((Binf*(tempBsupVolume-Constante))-(Bsup*(tempBinfVolume-Constante))) - /((tempBsupVolume-Constante)-(tempBinfVolume-Constante)); + { + if((tempBinfVolume-Constante)*(tempCVolume-Constante)>0 && Abs(tempCVolume-Constante)>Epsilon) + { + Binf = c; + tempBinfVolume=tempCVolume; + + c = ((Binf*(tempBsupVolume-Constante))-(Bsup*(tempBinfVolume-Constante))) + /((tempBsupVolume-Constante)-(tempBinfVolume-Constante)); tempCVolume=CalculateVolume(c); - } - else if((tempBinfVolume-Constante)*(tempCVolume-Constante)<0 && Abs(tempCVolume-Constante)>Epsilon) - { - Bsup = c; - tempBsupVolume =tempCVolume; - - c = ((Binf*(tempBsupVolume-Constante))-(Bsup*(tempBinfVolume-Constante))) - /((tempBsupVolume-Constante)-(tempBinfVolume-Constante)); + } + else if((tempBinfVolume-Constante)*(tempCVolume-Constante)<0 && Abs(tempCVolume-Constante)>Epsilon) + { + Bsup = c; + tempBsupVolume =tempCVolume; + + c = ((Binf*(tempBsupVolume-Constante))-(Bsup*(tempBinfVolume-Constante))) + /((tempBsupVolume-Constante)-(tempBinfVolume-Constante)); tempCVolume=CalculateVolume(c); - } - else - { - goto endMethod; - } - } + } + else + { + goto endMethod; + } + } goto endMethod; } endMethod: - MESSAGE("La ligne de flottaison correspondant a la constante :"<