Changeset 5339
- Timestamp:
- 08/18/10 08:32:08 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Bamg/Geometry.cpp
r5208 r5339 478 478 * a vertex v? 479 479 * To do so, we use the same chaining algorithm but there is a difficulty 480 * coming from the fact that F we have a couple of vertices and not one481 * vert ices.482 * To overcome this difficulty, we use a global ind icesexactly like in480 * coming from the fact that for F we have a couple of vertices and not one 481 * vertex. 482 * To overcome this difficulty, we use a global indexing exactly like in 483 483 * C/C++ so that 484 484 * a member of a 2-column-table can be described by one index p=i*2+j 485 485 * i=(int)p/2 line number of p 486 * j=p%2 486 * j=p%2 column number of p 487 487 * 488 488 * Algorithm: … … 506 506 double lv10=Norme2(v10); 507 507 //check that its length is not 0 508 if(lv10==0) { 509 ISSMERROR("Length of edge %i is 0",i); 510 } 508 if(lv10==0)ISSMERROR("Length of edge %i is 0",i); 511 509 //compute angle in [-Pi Pi] 512 510 eangle[i] = atan2(v10.y,v10.x); … … 521 519 //sort head_v by order of increasing edges angle 522 520 for (i=0;i<nbv;i++) { 523 int exch=1, 521 int exch=1,ord=0; 524 522 525 523 //exchange vertices position in head_v and next_p till tey are sorted 526 524 while (exch){ 527 long *p=head_v+i; // pointer toward head_v[vertex i]528 long *po=p; // copy of pointer p529 long n=*p; // next value of edge holding i525 long *p=head_v+i; 526 long *po=p; 527 long n=*p; 530 528 register float angleold=-1000 ; // angle = - infinity 531 529 ord=0; exch=0; 532 530 533 // loop over the edges that contain the vertex i 531 // loop over the edges that contain the vertex i (till -1) 534 532 while (n >=0){ 535 533 ord++; 536 register long i1=n/2; // i1 = floor (n/2)537 register long j1=n%2; // j1 = 1 if n is odd538 register long* pn=next_p+n; // pointer to next_p[n]539 540 // n = next_p[n] = position in edge of next vertex i534 long i1=n/2; // i1 = floor (n/2) -> Edge number 535 long j1=n%2; // j1 = 1 if n is odd -> Vertex index for this edge (0 or 1) 536 long* pn=next_p+n; 537 538 //Next vertex index 541 539 n=*pn; 542 540 … … 562 560 } 563 561 564 // angular test on current vertex to guess whether it is a corner (ord = number of edges ho rlding i)565 if(ord ==2) {562 // angular test on current vertex to guess whether it is a corner (ord = number of edges holding i) 563 if(ord==2) { 566 564 long n1 = head_v[i]; 567 565 long n2 = next_p[n1]; … … 574 572 vertices[i].SetCorner() ; 575 573 } 576 // if the ReferenceNumber a changing then isSetRequired();574 // if the edge type/referencenumber a changing then is SetRequired(); 577 575 if (edges[i1].type != edges[i2].type || edges[i1].Required()){ 578 576 vertices[i].SetRequired(); … … 586 584 } 587 585 588 / / close the list around the vertex586 /*close the list around the vertex to have a circular loop*/ 589 587 long no=-1, ne = head_v[i]; 590 588 while (ne >=0) ne = next_p[no=ne]; 591 589 if(no>=0) next_p[no] = head_v[i]; 592 // now the list around the vertex is circular 593 } 594 590 } 591 592 /*Check that the list makes sense (we have all the time the same vertex) 593 * and build adjacent edges*/ 595 594 k =0; 596 595 for (i=0;i<nbe;i++){ 597 596 for (j=0;j<2;j++){ 597 598 598 long n1 = next_p[k++]; 599 599 long i1 = n1/2 ,j1=n1%2; 600 if( edges[i1].v[j1] != edges[i].v[j]) { 601 ISSMERROR("Bug Adj edge");602 } 600 601 if( edges[i1].v[j1] != edges[i].v[j]) ISSMERROR("Problem while processing edges: check the edge list"); 602 603 603 edges[i1].Adj[j1] = edges + i; 604 604 edges[i1].DirAdj[j1] = j; … … 608 608 // generation of all the tangents 609 609 for (i=0;i<nbe;i++) { 610 //Get AB = vertex1->vertex2 611 R2 AB =edges[i].v[1]->r -edges[i].v[0]->r; 612 //Get length of AB 613 double lAB=Norme2(AB); 614 //initialize tangent 615 double ltg2[2]={0.0}; 610 R2 AB =edges[i].v[1]->r -edges[i].v[0]->r;// AB = vertex0 -> vertex1 611 double lAB=Norme2(AB); // Get length of AB 612 double ltg2[2]={0.0}; // initialize tangent 616 613 617 614 //loop over the 2 vertices of the edge 618 for (j j=0;jj<2;jj++) {619 R2 tg =edges[i].tg[j j];615 for (j=0;j<2;j++) { 616 R2 tg =edges[i].tg[j]; 620 617 double ltg=Norme2(tg); 621 618 622 619 //by default, tangent=[0 0] 623 if(ltg == 0){620 if(ltg==0){ 624 621 //if the current vertex of the edge is not a corner 625 if(!edges[i].v[jj]->Corner()){ 626 tg = edges[i].v[1-jj]->r - edges[i].Adj[jj]->v[1-edges[i].DirAdj[jj]]->r; //previous point and next point on curve 622 if(!edges[i].v[j]->Corner()){ 623 /*The tangent is set as the vector between the 624 * previous and next vertices connected to current vertex 625 * normed by the edge length*/ 626 tg = edges[i].v[1-j]->r - edges[i].Adj[j]->v[1-edges[i].DirAdj[j]]->r; 627 627 ltg= Norme2(tg); 628 628 tg = tg *(lAB/ltg); 629 629 ltg= lAB; 630 630 } 631 //else: a Corner withno tangent => nothing to do631 //else: a Corner no tangent => nothing to do 632 632 } 633 633 else{ … … 636 636 } 637 637 638 ltg2[jj] = ltg; 639 640 if ((tg,AB)<0){ 641 tg = -tg; 642 } 643 644 edges[i].tg[jj] = tg; 638 ltg2[j] = ltg; 639 640 if ((tg,AB)<0) tg = -tg; 641 642 edges[i].tg[j]=tg; 645 643 } 646 644 if (ltg2[0]!=0) edges[i].SetTgA(); … … 649 647 650 648 for (int step=0;step<2;step++){ 649 651 650 for (i=0;i<nbe;i++) edges[i].SetUnMark(); 651 652 652 nbcurves = 0; 653 653 long nbgem=0; 654 for (int level=0;level < 2 && nbgem != nbe;level++) 655 for (i=0;i<nbe;i++) { 656 GeometricalEdge & ei = edges[i]; 657 for(jj=0;jj<2;jj++){ 658 if (!ei.Mark() && (level || ei[jj].Required())) { 659 // warning ei.Mark() can be change in loop for(jj=0;jj<2;jj++) 660 int k0=jj,k1; 661 GeometricalEdge *e = & ei; 662 GeometricalVertex *a=(*e)(k0); // begin 663 if(curves){ 664 curves[nbcurves].be=e; 665 curves[nbcurves].kb=k0; 666 } 667 int nee=0; 668 for(;;) { 669 nee++; 670 k1 = 1-k0; // next vertex of the edge 671 e->SetMark(); 672 nbgem++; 673 e->CurveNumber=nbcurves; 674 if(curves) { 675 curves[nbcurves].ee=e; 676 curves[nbcurves].ke=k1; 677 } 678 679 GeometricalVertex *b=(*e)(k1); 680 if (a == b || b->Required() ) break; 681 k0 = e->DirAdj[k1];// vertex in next edge 682 e = e->Adj[k1]; // next edge 683 } 684 nbcurves++; 685 if(level) a->SetRequired(); 686 } 687 } 688 } 654 655 for (int level=0;level < 2 && nbgem != nbe;level++){ 656 for (i=0;i<nbe;i++){ 657 GeometricalEdge & ei = edges[i]; 658 for(j=0;j<2;j++){ 659 if (!ei.Mark() && (level || ei[j].Required())) { 660 // warning ei.Mark() can be change in loop for(j=0;j<2;j++) 661 int k0=j,k1; 662 GeometricalEdge *e = & ei; 663 GeometricalVertex *a=(*e)(k0); // begin 664 if(curves){ 665 curves[nbcurves].be=e; 666 curves[nbcurves].kb=k0; 667 } 668 int nee=0; 669 for(;;) { 670 nee++; 671 k1 = 1-k0; // next vertex of the edge 672 e->SetMark(); 673 nbgem++; 674 e->CurveNumber=nbcurves; 675 if(curves) { 676 curves[nbcurves].ee=e; 677 curves[nbcurves].ke=k1; 678 } 679 680 GeometricalVertex *b=(*e)(k1); 681 if (a == b || b->Required() ) break; 682 k0 = e->DirAdj[k1];// vertex in next edge 683 e = e->Adj[k1]; // next edge 684 } 685 nbcurves++; 686 if(level) a->SetRequired(); 687 } 688 } 689 } 690 } 689 691 ISSMASSERT(nbgem && nbe); 690 692 if(step==0){
Note:
See TracChangeset
for help on using the changeset viewer.