00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "Rn.h"
00028 #include "aptrte.h"
00029 #include "utilities.h"
00030
00031 using namespace std;
00032
00033 extern "C"
00034 {
00035 R aretemaxface_;
00036 MEFISTO2D_EXPORT
00037 R
00038 #ifdef WIN32
00039 #ifdef F2C_BUILD
00040 #else
00041 __stdcall
00042 #endif
00043 #endif
00044 areteideale()
00045 {
00046 return aretemaxface_;
00047 }
00048 }
00049
00050
00051
00052
00053
00054 static double cpunew, cpuold=0;
00055
00056 void
00057 #ifdef WIN32
00058 #ifdef F2C_BUILD
00059 #else
00060 __stdcall
00061 #endif
00062 #endif
00063 tempscpu_( double & tempsec )
00064
00065 {
00066 tempsec = ( (double) clock() ) / CLOCKS_PER_SEC;
00067
00068 }
00069
00070
00071 void
00072 #ifdef WIN32
00073 #ifdef F2C_BUILD
00074 #else
00075 __stdcall
00076 #endif
00077 #endif
00078 deltacpu_( R & dtcpu )
00079
00080 {
00081 tempscpu_( cpunew );
00082 dtcpu = R( cpunew - cpuold );
00083 cpuold = cpunew;
00084
00085 return;
00086 }
00087
00088
00089 void aptrte( Z nutysu, R aretmx,
00090 Z nblf, Z * nudslf, R2 * uvslf,
00091 Z nbpti, R2 * uvpti,
00092 Z & nbst, R2 * & uvst,
00093 Z & nbt, Z * & nust,
00094 Z & ierr )
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 {
00140 Z nbsttria=4;
00141
00142
00143 R d, tcpu=0;
00144
00145 Z nbarfr=nudslf[nblf];
00146 Z mxtrou = Max( 1024, nblf );
00147
00148 R3 *mnpxyd=NULL;
00149 Z *mnsoar=NULL, mosoar=7, mxsoar, n1soar;
00150 Z *mnartr=NULL, moartr=3, mxartr, n1artr;
00151 Z *mntree=NULL, motree=9, mxtree;
00152 Z *mnqueu=NULL, mxqueu;
00153 Z *mn1arcf=NULL;
00154 Z *mnarcf=NULL, mxarcf;
00155 Z *mnarcf1=NULL;
00156 Z *mnarcf2=NULL;
00157 Z *mnarcf3=NULL;
00158 Z *mntrsu=NULL;
00159 Z *mnslig=NULL;
00160 Z *mnarst=NULL;
00161 Z *mnlftr=NULL;
00162
00163 R3 comxmi[2];
00164 R aremin, aremax;
00165 R airemx;
00166 R quamoy, quamin;
00167
00168 Z noar0, noar, na;
00169 Z i, l, n, ns, ns0, ns1, ns2, nosotr[3], nt;
00170 Z mxsomm, nbsomm, nbarpi, nbarli, ndtri0, mn;
00171 Z moins1=-1;
00172 Z nuds = 0;
00173
00174
00175 deltacpu_( d );
00176 ierr = 0;
00177
00178
00179
00180
00181
00182
00183 i = 4*nbarfr/10;
00184 mxsomm = Max( 20000, 64*nbpti+i*i );
00185 MESSAGE( "APTRTE: Debut de la triangulation plane avec " );
00186 MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx
00187 << " mxsomm=" << mxsomm );
00188 MESSAGE( nbarfr << " sommets sur la frontiere et " << nbpti << " points internes");
00189
00190 NEWDEPART:
00191
00192 if( mnpxyd!=NULL ) delete [] mnpxyd;
00193 mnpxyd = new R3[mxsomm];
00194 if( mnpxyd==NULL ) goto ERREUR;
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 if( mnsoar!=NULL ) delete [] mnsoar;
00209 mxsoar = 3 * ( mxsomm + mxtrou );
00210 mnsoar = new Z[mosoar*mxsoar];
00211 if( mnsoar==NULL ) goto ERREUR;
00212
00213 insoar( mxsomm, mosoar, mxsoar, n1soar, mnsoar );
00214
00215
00216 if( mnarst!=NULL ) delete [] mnarst;
00217 mnarst = new Z[1+mxsomm];
00218 if( mnarst==NULL ) goto ERREUR;
00219 n = 1+mxsomm;
00220 azeroi( n, mnarst );
00221
00222
00223
00224
00225 if( mnslig!=NULL ) delete [] mnslig;
00226 mnslig = new Z[mxsomm];
00227 if( mnslig==NULL ) goto ERREUR;
00228 azeroi( mxsomm, mnslig );
00229
00230
00231
00232
00233
00234
00235
00236 noar = 0;
00237 aremin = 1e100;
00238 aremax = 0;
00239
00240 for (n=1; n<=nblf; n++)
00241 {
00242
00243
00244
00245 ns0 = nudslf[n-1];
00246 mnpxyd[ns0].x = uvslf[ns0].x;
00247 mnpxyd[ns0].y = uvslf[ns0].y;
00248 mnpxyd[ns0].z = areteideale();
00249
00250
00251
00252
00253 d = pow( uvslf[ns0+1].x - uvslf[ns0].x, 2 )
00254 + pow( uvslf[ns0+1].y - uvslf[ns0].y, 2 ) ;
00255 aremin = Min( aremin, d );
00256 aremax = Max( aremax, d );
00257
00258
00259
00260
00261
00262
00263
00264 ns0++;
00265 ns1 = ns0;
00266 ns2 = ns1+1;
00267
00268
00269 mnslig[ns0-1] = 1000000 * n + ns1-nudslf[n-1];
00270 fasoar( ns1, ns2, moins1, moins1, n,
00271 mosoar, mxsoar, n1soar, mnsoar, mnarst,
00272 noar0, ierr );
00273
00274
00275
00276
00277
00278
00279 if( noar > 0 )
00280 mnsoar[mosoar * noar - mosoar + 5] = noar0;
00281
00282
00283
00284 nbarli = nudslf[n] - nudslf[n-1];
00285 for (i=2; i<=nbarli; i++)
00286 {
00287 ns1 = ns2;
00288 if( i < nbarli )
00289
00290 ns2 = ns1+1;
00291 else
00292
00293 ns2 = ns0;
00294
00295
00296
00297 ns = ns1 - 1;
00298
00299 nuds = Max( nuds, ns );
00300
00301 mnpxyd[ns].x = uvslf[ns].x;
00302 mnpxyd[ns].y = uvslf[ns].y;
00303 mnpxyd[ns].z = areteideale();
00304
00305
00306
00307
00308 d = pow( uvslf[ns2-1].x - uvslf[ns1-1].x, 2)
00309 + pow( uvslf[ns2-1].y - uvslf[ns1-1].y, 2);
00310 aremin = Min( aremin, d );
00311 aremax = Max( aremax, d );
00312
00313
00314
00315 d = sqrt( d );
00316
00317 mnpxyd[ns ].z = Min( mnpxyd[ns ].z, d );
00318 mnpxyd[ns2-1].z = Min( mnpxyd[ns2-1].z, d );
00319
00320
00321
00322 mnslig[ns] = 1000000 * n + ns1-nudslf[n-1];
00323
00324
00325 fasoar( ns1, ns2, moins1, moins1, n,
00326 mosoar, mxsoar, n1soar, mnsoar,
00327 mnarst, noar, ierr );
00328
00329
00330
00331
00332 mnsoar[ mosoar * noar0 - mosoar + 5 ] = noar;
00333 noar0 = noar;
00334 }
00335
00336
00337
00338 }
00339 if( ierr != 0 ) goto ERREUR;
00340
00341 aremin = sqrt( aremin );
00342 aremax = sqrt( aremax );
00343
00344
00345
00346
00347
00348
00349 #define _MAXFACT 4.05
00350 if( aretmx > aremin*_MAXFACT ) aretmx = aremin*_MAXFACT;
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 aretemaxface_ = aretmx;
00361
00362
00363 airemx = aretmx * aretmx * sqrt(3.0) / 2.0;
00364
00365 for(i=0; i<=nuds; i++ )
00366 mnpxyd[i].z = Min( mnpxyd[i].z, aretmx );
00367
00368
00369
00370
00371 MESSAGE("Sur le bord: arete min=" << aremin << " arete max=" << aremax );
00372 MESSAGE("Triangulation: arete mx=" << aretmx
00373 << " triangle aire mx=" << airemx );
00374
00375
00376 mnsoar[ mosoar * noar - mosoar + 5 ] = 0;
00377
00378
00379
00380
00381
00382
00383
00384
00385 if( mnartr!=NULL ) delete [] mnartr;
00386 mxartr = 2 * ( mxsomm + mxtrou );
00387 mnartr = new Z[moartr*mxartr];
00388 if( mnartr==NULL ) goto ERREUR;
00389
00390
00391 ns1 = nudslf[ nblf ];
00392 for (i=0; i<nbpti; i++)
00393 {
00394
00395 mnpxyd[ns1].x = uvpti[i].x;
00396 mnpxyd[ns1].y = uvpti[i].y;
00397 mnpxyd[ns1].z = areteideale();
00398
00399 mnslig[ns1] = i+1;
00400 ns1++;
00401 }
00402
00403
00404 nbarpi = ns1;
00405
00406
00407
00408
00409
00410 mxtree = 2 * mxsomm;
00411
00412 NEWTREE:
00413 MESSAGE( "Debut triangulation avec mxsomm=" << mxsomm );
00414 if( mntree != NULL ) delete [] mntree;
00415 nbsomm = nbarpi;
00416 mntree = new Z[motree*(1+mxtree)];
00417 if( mntree==NULL ) goto ERREUR;
00418
00419
00420 comxmi[0].x = comxmi[1].x = uvslf[0].x;
00421 comxmi[0].y = comxmi[1].y = uvslf[0].y;
00422 teajte( mxsomm, nbsomm, mnpxyd, comxmi, aretmx, mxtree, mntree, ierr );
00423 comxmi[0].z=0;
00424 comxmi[1].z=0;
00425
00426 if( ierr == 51 )
00427 {
00428
00429 mxtree = mxtree * 2;
00430 ierr = 0;
00431 MESSAGE( "Nouvelle valeur de mxtree=" << mxtree );
00432 goto NEWTREE;
00433 }
00434
00435 deltacpu_( d );
00436 tcpu += d;
00437 MESSAGE( "Temps de l'ajout arbre-4 des Triangles Equilateraux=" << d << " secondes" );
00438 if( ierr != 0 ) goto ERREUR;
00439
00440
00441
00442
00443
00444
00445 if( mnqueu != NULL ) delete [] mnqueu;
00446 mxqueu = mxtree;
00447 mnqueu = new Z[mxqueu];
00448 if( mnqueu==NULL) goto ERREUR;
00449
00450 tehote( nutysu, nbarpi, mxsomm, nbsomm, mnpxyd,
00451 comxmi, aretmx,
00452 mntree, mxqueu, mnqueu,
00453 ierr );
00454
00455 deltacpu_( d );
00456 tcpu += d;
00457 MESSAGE("Temps de l'adaptation et l'homogeneisation de l'arbre-4 des TE="
00458 << d << " secondes");
00459 if( ierr != 0 )
00460 {
00461
00462 if( ierr == 51 )
00463 {
00464
00465 mxtree = mxtree * 2;
00466 MESSAGE( "Redemarrage avec la valeur de mxtree=" << mxtree );
00467 ierr = 0;
00468 goto NEWTREE;
00469 }
00470 else
00471 goto ERREUR;
00472 }
00473
00474
00475
00476
00477 tetrte( comxmi, aretmx, nbarpi, mxsomm, mnpxyd,
00478 mxqueu, mnqueu, mntree, mosoar, mxsoar, n1soar, mnsoar,
00479 moartr, mxartr, n1artr, mnartr, mnarst,
00480 ierr );
00481
00482
00483 delete [] mnqueu; mnqueu=NULL;
00484 delete [] mntree; mntree=NULL;
00485
00486
00487 deltacpu_( d );
00488 tcpu += d;
00489 MESSAGE( "Temps de la triangulation des TE=" << d << " secondes" );
00490
00491
00492
00493
00494
00495
00496 if( ierr != 0 ) goto ERREUR;
00497
00498
00499 qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
00500 nbt, quamoy, quamin );
00501
00502
00503
00504
00505
00506 aisoar( mosoar, mxsoar, mnsoar, na );
00507 tedela( mnpxyd, mnarst,
00508 mosoar, mxsoar, n1soar, mnsoar, na,
00509 moartr, mxartr, n1artr, mnartr, n );
00510
00511 MESSAGE( "Nombre d'echanges des diagonales de 2 triangles=" << n );
00512 deltacpu_( d );
00513 tcpu += d;
00514 MESSAGE("Temps de la triangulation Delaunay par echange des diagonales="
00515 << d << " secondes");
00516
00517
00518 qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
00519 nbt, quamoy, quamin );
00520
00521
00522
00523
00524 mxarcf = mxsomm/5;
00525 if( mn1arcf != NULL ) delete [] mn1arcf;
00526 if( mnarcf != NULL ) delete [] mnarcf;
00527 if( mnarcf1 != NULL ) delete [] mnarcf1;
00528 if( mnarcf2 != NULL ) delete [] mnarcf2;
00529 mn1arcf = new Z[1+mxarcf];
00530 if( mn1arcf == NULL ) goto ERREUR;
00531 mnarcf = new Z[3*mxarcf];
00532 if( mnarcf == NULL ) goto ERREUR;
00533 mnarcf1 = new Z[mxarcf];
00534 if( mnarcf1 == NULL ) goto ERREUR;
00535 mnarcf2 = new Z[mxarcf];
00536 if( mnarcf2 == NULL ) goto ERREUR;
00537
00538 terefr( nbarpi, mnpxyd,
00539 mosoar, mxsoar, n1soar, mnsoar,
00540 moartr, mxartr, n1artr, mnartr, mnarst,
00541 mxarcf, mn1arcf, mnarcf, mnarcf1, mnarcf2,
00542 n, ierr );
00543
00544 MESSAGE( "Restauration de " << n << " aretes perdues de la frontiere ierr=" << ierr );
00545 deltacpu_( d );
00546 tcpu += d;
00547 MESSAGE("Temps de la recuperation des aretes perdues de la frontiere="
00548 << d << " secondes");
00549
00550 if( ierr != 0 ) goto ERREUR;
00551
00552
00553 qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
00554 nbt, quamoy, quamin );
00555
00556
00557
00558
00559
00560
00561 mn = mxartr * moartr;
00562 for ( ndtri0=mxartr; ndtri0<=1; ndtri0-- )
00563 {
00564 mn -= moartr;
00565 if( mnartr[mn] != 0 ) break;
00566 }
00567
00568 if( mntrsu != NULL ) delete [] mntrsu;
00569 mntrsu = new Z[ndtri0];
00570 if( mntrsu == NULL ) goto ERREUR;
00571
00572 if( mnlftr != NULL ) delete [] mnlftr;
00573 mnlftr = new Z[nblf];
00574 if( mnlftr == NULL ) goto ERREUR;
00575
00576 for (n=0; n<nblf; n++)
00577 mnlftr[n] = n+1;
00578
00579 tesuex( nblf, mnlftr,
00580 ndtri0, nbsomm, mnpxyd, mnslig,
00581 mosoar, mxsoar, mnsoar,
00582 moartr, mxartr, n1artr, mnartr, mnarst,
00583 nbt, mntrsu, ierr );
00584
00585 delete [] mnlftr; mnlftr=NULL;
00586 delete [] mntrsu; mntrsu=NULL;
00587
00588 deltacpu_( d );
00589 tcpu += d;
00590 MESSAGE( "Temps de la suppression des triangles externes=" << d << "ierr=" << ierr );
00591 if( ierr != 0 ) goto ERREUR;
00592
00593
00594 qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
00595 nbt, quamoy, quamin );
00596
00597
00598
00599
00600
00601
00602
00603 mnarcf3 = new Z[mxarcf];
00604 if( mnarcf3 == NULL )
00605 {
00606 MESSAGE ( "aptrte: MC saturee mnarcf3=" << mnarcf3 );
00607 goto ERREUR;
00608 }
00609 teamqt( nutysu, aretmx, airemx,
00610 mnarst, mosoar, mxsoar, n1soar, mnsoar,
00611 moartr, mxartr, n1artr, mnartr,
00612 mxarcf, mnarcf2, mnarcf3,
00613 mn1arcf, mnarcf, mnarcf1,
00614 nbarpi, nbsomm, mxsomm, mnpxyd, mnslig,
00615 ierr );
00616 if( mnarcf3 != NULL ) {delete [] mnarcf3; mnarcf3=NULL;}
00617 if( mn1arcf != NULL ) {delete [] mn1arcf; mn1arcf=NULL;}
00618 if( mnarcf != NULL ) {delete [] mnarcf; mnarcf =NULL;}
00619 if( mnarcf1 != NULL ) {delete [] mnarcf1; mnarcf1=NULL;}
00620 if( mnarcf2 != NULL ) {delete [] mnarcf2; mnarcf2=NULL;}
00621
00622 deltacpu_( d );
00623 tcpu += d;
00624 MESSAGE( "Temps de l'amelioration de la qualite de la triangulation=" << d );
00625 if( ierr == -13 ) ierr=0;
00626 if( ierr != 0 ) goto ERREUR;
00627
00628
00629 qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
00630 nbt, quamoy, quamin );
00631
00632
00633
00634 for (i=0; i<=nbsomm; i++)
00635 mnarst[i] = 0;
00636
00637 for (nt=1; nt<=mxartr; nt++)
00638 {
00639 if( mnartr[nt*moartr-moartr] != 0 )
00640 {
00641
00642 nusotr( nt, mosoar, mnsoar, moartr, mnartr, nosotr );
00643
00644 mnarst[ nosotr[0] ] = 1;
00645 mnarst[ nosotr[1] ] = 1;
00646 mnarst[ nosotr[2] ] = 1;
00647 }
00648 }
00649 nbst = 0;
00650 for (i=1; i<=nbsomm; i++)
00651 {
00652 if( mnarst[i] >0 )
00653 mnarst[i] = ++nbst;
00654 }
00655
00656
00657
00658 if( uvst != NULL ) delete [] uvst;
00659 uvst = new R2[nbst];
00660 if( uvst == NULL ) goto ERREUR;
00661
00662 nbst=-1;
00663 for (i=0; i<nbsomm; i++ )
00664 {
00665 if( mnarst[i+1]>0 )
00666 {
00667 nbst++;
00668 uvst[nbst].x = mnpxyd[i].x;
00669 uvst[nbst].y = mnpxyd[i].y;
00670
00671
00672
00673 n = mnslig[i];
00674 if( n > 0 )
00675 {
00676 if( n >= 1000000 )
00677 {
00678
00679
00680 l = n / 1000000;
00681 n = n - 1000000 * l + nudslf[l-1] - 1;
00682 uvst[nbst].x = uvslf[n].x;
00683 uvst[nbst].y = uvslf[n].y;
00684 }
00685 else
00686 {
00687
00688
00689 uvst[nbst].x = uvpti[n-1].x;
00690 uvst[nbst].y = uvpti[n-1].y;
00691 }
00692 }
00693 }
00694 }
00695 nbst++;
00696
00697
00698
00699
00700 if( nust != NULL ) delete [] nust;
00701 nust = new Z[nbsttria*nbt];
00702 if( nust == NULL ) goto ERREUR;
00703 nbt = 0;
00704 for (i=1; i<=mxartr; i++)
00705 {
00706
00707 if( mnartr[i*moartr-moartr] != 0 )
00708 {
00709
00710 nusotr( i, mosoar, mnsoar, moartr, mnartr, nosotr );
00711 nust[nbt++] = mnarst[ nosotr[0] ];
00712 nust[nbt++] = mnarst[ nosotr[1] ];
00713 nust[nbt++] = mnarst[ nosotr[2] ];
00714 nust[nbt++] = 0;
00715 }
00716 }
00717 nbt /= nbsttria;
00718 MESSAGE( "APTRTE: Fin de la triangulation plane avec "<<nbst<<" sommets et "
00719 << nbt << " triangles" );
00720 deltacpu_( d );
00721 tcpu += d;
00722 MESSAGE( "APTRTE: Temps total de la triangulation plane=" << tcpu << " secondes" );
00723
00724
00725
00726 NETTOYAGE:
00727 if( mnarst != NULL ) delete [] mnarst;
00728 if( mnartr != NULL ) delete [] mnartr;
00729 if( mnslig != NULL ) delete [] mnslig;
00730 if( mnsoar != NULL ) delete [] mnsoar;
00731 if( mnpxyd != NULL ) delete [] mnpxyd;
00732 if( mntree != NULL ) delete [] mntree;
00733 if( mnqueu != NULL ) delete [] mnqueu;
00734 if( mntrsu != NULL ) delete [] mntrsu;
00735 if( mnlftr != NULL ) delete [] mnlftr;
00736 if( mn1arcf != NULL ) delete [] mn1arcf;
00737 if( mnarcf != NULL ) delete [] mnarcf;
00738 if( mnarcf1 != NULL ) delete [] mnarcf1;
00739 if( mnarcf2 != NULL ) delete [] mnarcf2;
00740 if( mnarcf3 != NULL ) delete [] mnarcf3;
00741 return;
00742
00743 ERREUR:
00744 if( ierr == 51 || ierr == 52 )
00745 {
00746
00747 mxsomm = 2 * mxsomm;
00748 ierr = 0;
00749 goto NEWDEPART;
00750 }
00751 else
00752 {
00753 MESSAGE( "APTRTE: Triangulation NON REALISEE avec erreur=" << ierr );
00754 if( ierr == 0 ) ierr=1;
00755 goto NETTOYAGE;
00756 }
00757 }
00758 void
00759 #ifdef WIN32
00760 #ifdef F2C_BUILD
00761 #else
00762 __stdcall
00763 #endif
00764 #endif
00765 qualitetrte( R3 *mnpxyd,
00766 Z & mosoar, Z & mxsoar, Z *mnsoar,
00767 Z & moartr, Z & mxartr, Z *mnartr,
00768 Z & nbtria, R & quamoy, R & quamin )
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797 {
00798 R d, aire, qualite;
00799 Z nosotr[3], mn, nbtrianeg, nt, ntqmin;
00800
00801 aire = 0;
00802 quamoy = 0;
00803 quamin = 2.0;
00804 nbtria = 0;
00805 nbtrianeg = 0;
00806 ntqmin = 0;
00807
00808 mn = -moartr;
00809 for ( nt=1; nt<=mxartr; nt++ )
00810 {
00811 mn += moartr;
00812 if( mnartr[mn]!=0 )
00813 {
00814
00815 nbtria++;
00816
00817
00818 nusotr( nt, mosoar, mnsoar, moartr, mnartr, nosotr );
00819
00820
00821 qutr2d( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1],
00822 qualite );
00823
00824
00825 quamoy += qualite;
00826
00827
00828 if( qualite < quamin )
00829 {
00830 quamin = qualite;
00831 ntqmin = nt;
00832 }
00833
00834
00835 d = surtd2( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1] );
00836 if( d<0 )
00837 {
00838
00839 nbtrianeg++;
00840 MESSAGE("ATTENTION: le triangle " << nt << " de sommets:"
00841 << nosotr[0] << " " << nosotr[1] << " " << nosotr[2]
00842 << " a une aire " << d <<"<=0");
00843 }
00844
00845
00846 aire += Abs(d);
00847 }
00848 }
00849
00850
00851 quamoy /= nbtria;
00852 MESSAGE("Qualite moyenne=" << quamoy
00853 << " Qualite minimale=" << quamin
00854 << " des " << nbtria << " triangles de surface plane totale="
00855 << aire);
00856
00857 if( quamin<0.3 )
00858 {
00859
00860 nusotr(ntqmin, mosoar, mnsoar, moartr, mnartr, nosotr );
00861 MESSAGE("Triangle de qualite minimale "<<quamin<<" de sommets:"
00862 <<nosotr[0]<<" "<<nosotr[1]<<" "<<nosotr[2]<<" ");
00863 for (int i=0;i<3;i++)
00864 MESSAGE("Sommet "<<nosotr[i]<<": x="<< mnpxyd[nosotr[i]-1].x
00865 <<" y="<< mnpxyd[nosotr[i]-1].y);
00866 }
00867
00868 if( nbtrianeg>0 )
00869 MESSAGE( "ATTENTION: "<< nbtrianeg << " TRIANGLES d'AIRE NEGATIVE" );
00870
00871 MESSAGE(" ");
00872 return;
00873 }