X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEFISTO2%2Faptrte.cxx;h=ca2474262911681b847433498632c4a1f640baa1;hb=7084b4f9799cf4a0145ba86ab8b653de8f2d2bdb;hp=46429ead71ba0df4cf1c95b986a9ecd3c0b625bc;hpb=57b43b4d010e2d0a1529d3c131bbb9d416e63258;p=modules%2Fsmesh.git diff --git a/src/MEFISTO2/aptrte.cxx b/src/MEFISTO2/aptrte.cxx index 46429ead7..ca2474262 100755 --- a/src/MEFISTO2/aptrte.cxx +++ b/src/MEFISTO2/aptrte.cxx @@ -1,27 +1,28 @@ // MEFISTO2: a library to compute 2D triangulation from segmented boundaries // -// Copyright (C) 2006 Laboratoire J.-L. Lions UPMC Paris // -// 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. +// Copyright (C) 2006-2015 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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. +// 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. // -// 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 +// 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. // -// See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr +// 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 // // File : aptrte.cxx le C++ de l'appel du trianguleur plan // Module : SMESH // Author : Alain PERRONNET -// Date : 16 mars 2006 +// Date : 13 novembre 2006 #include "Rn.h" #include "aptrte.h" @@ -32,7 +33,15 @@ using namespace std; extern "C" { R aretemaxface_; - R areteideale_( R3 xyz, R3 direction ) + MEFISTO2D_EXPORT + R + #ifdef WIN32 + #ifdef F2C_BUILD + #else + __stdcall + #endif + #endif + areteideale()//( R3 xyz, R3 direction ) { return aretemaxface_; } @@ -44,7 +53,14 @@ extern "C" static double cpunew, cpuold=0; -void tempscpu_( double & tempsec ) +void +#ifdef WIN32 +#ifdef F2C_BUILD +#else + __stdcall +#endif +#endif +tempscpu_( double & tempsec ) //Retourne le temps CPU utilise en secondes { tempsec = ( (double) clock() ) / CLOCKS_PER_SEC; @@ -52,7 +68,14 @@ void tempscpu_( double & tempsec ) } -void deltacpu_( R & dtcpu ) +void +#ifdef WIN32 +#ifdef F2C_BUILD +#else + __stdcall +#endif +#endif +deltacpu_( R & dtcpu ) //Retourne le temps CPU utilise en secondes depuis le precedent appel { tempscpu_( cpunew ); @@ -64,11 +87,11 @@ void deltacpu_( R & dtcpu ) void aptrte( Z nutysu, R aretmx, - Z nblf, Z * nudslf, R2 * uvslf, - Z nbpti, R2 * uvpti, - Z & nbst, R2 * & uvst, - Z & nbt, Z * & nust, - Z & ierr ) + Z nblf, Z * nudslf, R2 * uvslf, + Z nbpti, R2 * uvpti, + Z & nbst, R2 * & uvst, + Z & nbt, Z * & nust, + Z & ierr ) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // but : appel de la triangulation par un arbre-4 recouvrant // ----- de triangles equilateraux @@ -118,7 +141,7 @@ void aptrte( Z nutysu, R aretmx, //no st1, st2, st3, 0 (non quadrangle) R d, tcpu=0; - R3 direction=R3(0,0,0); //direction pour areteideale() inactive ici! +// R3 direction=R3(0,0,0); //direction pour areteideale() inactive ici! Z nbarfr=nudslf[nblf]; //nombre total d'aretes des lignes fermees Z mxtrou = Max( 1024, nblf ); //nombre maximal de trous dans la surface @@ -139,15 +162,14 @@ void aptrte( Z nutysu, R aretmx, R3 comxmi[2]; //coordonnees UV Min et Maximales R aremin, aremax; //longueur minimale et maximale des aretes + R airemx; //aire maximale souhaitee d'un triangle R quamoy, quamin; Z noar0, noar, na; Z i, l, n, ns, ns0, ns1, ns2, nosotr[3], nt; Z mxsomm, nbsomm, nbarpi, nbarli, ndtri0, mn; Z moins1=-1; - R dist; - - aretemaxface_ = aretmx; + Z nuds = 0; // initialisation du temps cpu deltacpu_( d ); @@ -161,7 +183,8 @@ void aptrte( Z nutysu, R aretmx, i = 4*nbarfr/10; mxsomm = Max( 20000, 64*nbpti+i*i ); MESSAGE( "APTRTE: Debut de la triangulation plane avec " ); - MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx << " mxsomm=" << mxsomm ); + MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx + << " mxsomm=" << mxsomm ); MESSAGE( nbarfr << " sommets sur la frontiere et " << nbpti << " points internes"); NEWDEPART: @@ -187,14 +210,14 @@ void aptrte( Z nutysu, R aretmx, mnsoar = new Z[mosoar*mxsoar]; if( mnsoar==NULL ) goto ERREUR; //initialiser le tableau mnsoar pour le hachage des aretes - insoar_( mxsomm, mosoar, mxsoar, n1soar, mnsoar ); + insoar( mxsomm, mosoar, mxsoar, n1soar, mnsoar ); // mnarst( mxsomm ) numero mnsoar d'une arete pour chacun des sommets if( mnarst!=NULL ) delete [] mnarst; mnarst = new Z[1+mxsomm]; if( mnarst==NULL ) goto ERREUR; n = 1+mxsomm; - azeroi_( n, mnarst ); + azeroi( n, mnarst ); // mnslig( mxsomm ) no de sommet dans sa ligne pour chaque sommet frontalier // ou no du point si interne forc'e par l'utilisateur @@ -202,7 +225,7 @@ void aptrte( Z nutysu, R aretmx, if( mnslig!=NULL ) delete [] mnslig; mnslig = new Z[mxsomm]; if( mnslig==NULL ) goto ERREUR; - azeroi_( mxsomm, mnslig ); + azeroi( mxsomm, mnslig ); // initialisation des aretes frontalieres de la triangulation future // renumerotation des sommets des aretes des lignes pour la triangulation @@ -222,9 +245,9 @@ void aptrte( Z nutysu, R aretmx, ns0 = nudslf[n-1]; mnpxyd[ns0].x = uvslf[ns0].x; mnpxyd[ns0].y = uvslf[ns0].y; - mnpxyd[ns0].z = areteideale_( mnpxyd[ns0], direction ); + mnpxyd[ns0].z = areteideale();//( mnpxyd[ns0], direction ); // MESSAGE("Sommet " << ns0 << ": " << mnpxyd[ns0].x -// << " " << mnpxyd[ns0].y << " longueur arete=" << mnpxyd[ns0].z); +// << " " << mnpxyd[ns0].y << " longueur arete=" << mnpxyd[ns0].z); //carre de la longueur de l'arete 1 de la ligne fermee n d = pow( uvslf[ns0+1].x - uvslf[ns0].x, 2 ) @@ -244,9 +267,9 @@ void aptrte( Z nutysu, R aretmx, //le numero n de la ligne du sommet et son numero ns1 dans la ligne mnslig[ns0-1] = 1000000 * n + ns1-nudslf[n-1]; - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, mnarst, - noar0, ierr ); + fasoar( ns1, ns2, moins1, moins1, n, + mosoar, mxsoar, n1soar, mnsoar, mnarst, + noar0, ierr ); //pas de test sur ierr car pas de saturation possible a ce niveau //le pointeur dans le hachage sur la premiere arete de la ligne fermee n @@ -263,20 +286,23 @@ void aptrte( Z nutysu, R aretmx, { ns1 = ns2; //le numero de l'arete et le numero du premier sommet de l'arete if( i < nbarli ) - //nbs+1 est le 2-eme sommet de l'arete i de la ligne fermee n - ns2 = ns1+1; + //nbs+1 est le 2-eme sommet de l'arete i de la ligne fermee n + ns2 = ns1+1; else - //le 2-eme sommet de la derniere arete est le premier sommet de la ligne - ns2 = ns0; + //le 2-eme sommet de la derniere arete est le premier sommet de la ligne + ns2 = ns0; //l'arete precedente est dotee de sa suivante:celle cree ensuite //les 2 coordonnees du sommet ns2 de la ligne ns = ns1 - 1; +//debut ajout 5/10/2006 ................................................ + nuds = Max( nuds, ns ); //le numero du dernier sommet traite +//fin ajout 5/10/2006 ................................................ mnpxyd[ns].x = uvslf[ns].x; mnpxyd[ns].y = uvslf[ns].y; - mnpxyd[ns].z = areteideale_( mnpxyd[ns], direction ); + mnpxyd[ns].z = areteideale();//( mnpxyd[ns], direction ); // MESSAGE("Sommet " << ns << ": " << mnpxyd[ns].x -// << " " << mnpxyd[ns].y << " longueur arete=" << mnpxyd[ns].z); +// << " " << mnpxyd[ns].y << " longueur arete=" << mnpxyd[ns].z); //carre de la longueur de l'arete d = pow( uvslf[ns2-1].x - uvslf[ns1-1].x, 2) @@ -284,13 +310,21 @@ void aptrte( Z nutysu, R aretmx, aremin = Min( aremin, d ); aremax = Max( aremax, d ); +//debut ajout du 5/10/2006 ............................................. + //la longueur de l'arete ns1-ns2 + d = sqrt( d ); + //longueur arete = Min ( aretmx, aretes incidentes ) + mnpxyd[ns ].z = Min( mnpxyd[ns ].z, d ); + mnpxyd[ns2-1].z = Min( mnpxyd[ns2-1].z, d ); +//fin ajout du 5/10/2006 ............................................... + //le numero n de la ligne du sommet et son numero ns1 dans la ligne mnslig[ns] = 1000000 * n + ns1-nudslf[n-1]; //ajout de l'arete dans la liste - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, - mnarst, noar, ierr ); + fasoar( ns1, ns2, moins1, moins1, n, + mosoar, mxsoar, n1soar, mnsoar, + mnarst, noar, ierr ); //pas de test sur ierr car pas de saturation possible a ce niveau //chainage des aretes frontalieres en position 6 du tableau mnsoar @@ -307,9 +341,34 @@ void aptrte( Z nutysu, R aretmx, aremin = sqrt( aremin ); //longueur minimale d'une arete des lignes fermees aremax = sqrt( aremax ); //longueur maximale d'une arete - aretmx = Min( aretmx, aremax ); //pour homogeneiser - MESSAGE("nutysu=" << nutysu << " aretmx=" << aretmx - << " arete min=" << aremin << " arete max=" << aremax); +//debut ajout 9/11/2006 ................................................ + // devenu un commentaire aretmx = Min( aretmx, aremax ); //pour homogeneiser + + // protection contre une arete max desiree trop grande ou trop petite + if( aretmx > aremax*2.05 ) aretmx = aremax; + + // protection contre une arete max desiree trop petite + if( (aremax-aremin) > (aremin+aremax)*0.05 && aretmx < aremin*0.5 ) + aretmx =(aremin+aremax*2)/3.0; + + if( aretmx < aremin && aremin > 0 ) + aretmx = aremin; + + //sauvegarde pour la fonction areteideale_ + aretemaxface_ = aretmx; + + //aire maximale souhaitee des triangles + airemx = aretmx * aretmx * sqrt(3.0) / 2.0; //Aire triangle equilateral + + for(i=0; i<=nuds; i++ ) + mnpxyd[i].z = Min( mnpxyd[i].z, aretmx ); + //MESSAGE("Numero du dernier sommet frontalier=" << nuds+1); +//fin ajout 9/11/2006 ................................................. + + + MESSAGE("Sur le bord: arete min=" << aremin << " arete max=" << aremax ); + MESSAGE("Triangulation: arete mx=" << aretmx + << " triangle aire mx=" << airemx ); //chainage des aretes frontalieres : la derniere arete frontaliere mnsoar[ mosoar * noar - mosoar + 5 ] = 0; @@ -333,7 +392,7 @@ void aptrte( Z nutysu, R aretmx, //les 2 coordonnees du point i de sommet nbs mnpxyd[ns1].x = uvpti[i].x; mnpxyd[ns1].y = uvpti[i].y; - mnpxyd[ns1].z = areteideale_( mnpxyd[ns1], direction ); + mnpxyd[ns1].z = areteideale();//( mnpxyd[ns1], direction ); //le numero i du point interne mnslig[ns1] = i+1; ns1++; @@ -356,7 +415,9 @@ void aptrte( Z nutysu, R aretmx, if( mntree==NULL ) goto ERREUR; //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm - teajte_( mxsomm, nbsomm, mnpxyd, comxmi, aretmx, mxtree, mntree, ierr ); + comxmi[0].x = comxmi[1].x = uvslf[0].x; + comxmi[0].y = comxmi[1].y = uvslf[0].y; + teajte( mxsomm, nbsomm, mnpxyd, comxmi, aretmx, mxtree, mntree, ierr ); comxmi[0].z=0; comxmi[1].z=0; @@ -384,10 +445,10 @@ void aptrte( Z nutysu, R aretmx, mnqueu = new Z[mxqueu]; if( mnqueu==NULL) goto ERREUR; - tehote_( nutysu, nbarpi, mxsomm, nbsomm, mnpxyd, - comxmi, aretmx, - mntree, mxqueu, mnqueu, - ierr ); + tehote( nutysu, nbarpi, mxsomm, nbsomm, mnpxyd, + comxmi, aretmx, + mntree, mxqueu, mnqueu, + ierr ); deltacpu_( d ); tcpu += d; @@ -411,10 +472,10 @@ void aptrte( Z nutysu, R aretmx, // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets // et des points de la frontiere, des points internes imposes interieurs // ========================================================================== - tetrte_( comxmi, aretmx, nbarpi, mxsomm, mnpxyd, - mxqueu, mnqueu, mntree, mosoar, mxsoar, n1soar, mnsoar, - moartr, mxartr, n1artr, mnartr, mnarst, - ierr ); + tetrte( comxmi, aretmx, nbarpi, mxsomm, mnpxyd, + mxqueu, mnqueu, mntree, mosoar, mxsoar, n1soar, mnsoar, + moartr, mxartr, n1artr, mnartr, mnarst, + ierr ); // destruction de la queue et de l'arbre devenus inutiles delete [] mnqueu; mnqueu=NULL; @@ -434,16 +495,16 @@ void aptrte( Z nutysu, R aretmx, //qualites de la triangulation actuelle qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr, - nbt, quamoy, quamin ); + nbt, quamoy, quamin ); // boucle sur les aretes internes (non sur une ligne de la frontiere) // avec echange des 2 diagonales afin de rendre la triangulation delaunay // ====================================================================== // formation du chainage 6 des aretes internes a echanger eventuellement - aisoar_( mosoar, mxsoar, mnsoar, na ); - tedela_( mnpxyd, mnarst, - mosoar, mxsoar, n1soar, mnsoar, na, - moartr, mxartr, n1artr, mnartr, n ); + aisoar( mosoar, mxsoar, mnsoar, na ); + tedela( mnpxyd, mnarst, + mosoar, mxsoar, n1soar, mnsoar, na, + moartr, mxartr, n1artr, mnartr, n ); MESSAGE( "Nombre d'echanges des diagonales de 2 triangles=" << n ); deltacpu_( d ); @@ -453,7 +514,7 @@ void aptrte( Z nutysu, R aretmx, //qualites de la triangulation actuelle qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr, - nbt, quamoy, quamin ); + nbt, quamoy, quamin ); // detection des aretes frontalieres initiales perdues // triangulation frontale pour les restaurer @@ -472,13 +533,13 @@ void aptrte( Z nutysu, R aretmx, mnarcf2 = new Z[mxarcf]; if( mnarcf2 == NULL ) goto ERREUR; - terefr_( nbarpi, mnpxyd, - mosoar, mxsoar, n1soar, mnsoar, - moartr, n1artr, mnartr, mnarst, - mxarcf, mn1arcf, mnarcf, mnarcf1, mnarcf2, - n, ierr ); + terefr( nbarpi, mnpxyd, + mosoar, mxsoar, n1soar, mnsoar, + moartr, mxartr, n1artr, mnartr, mnarst, + mxarcf, mn1arcf, mnarcf, mnarcf1, mnarcf2, + n, ierr ); - MESSAGE( "Restauration de " << n << " aretes perdues de la frontiere" ); + MESSAGE( "Restauration de " << n << " aretes perdues de la frontiere ierr=" << ierr ); deltacpu_( d ); tcpu += d; MESSAGE("Temps de la recuperation des aretes perdues de la frontiere=" @@ -488,7 +549,7 @@ void aptrte( Z nutysu, R aretmx, //qualites de la triangulation actuelle qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr, - nbt, quamoy, quamin ); + nbt, quamoy, quamin ); // fin de la triangulation avec respect des aretes initiales frontalieres @@ -513,23 +574,23 @@ void aptrte( Z nutysu, R aretmx, for (n=0; n