Changeset 16233 for issm/trunk-jpl/src/c/bamg/BamgQuadtree.cpp
- Timestamp:
- 09/23/13 11:01:34 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/bamg/BamgQuadtree.cpp ΒΆ
r16158 r16233 391 391 } 392 392 /*}}}*/ 393 /*FUNCTION BamgQuadtree::NearestVertexWithNormal{{{*/394 BamgVertex* BamgQuadtree::NearestVertexWithNormal(Icoor1 i,Icoor1 j) {395 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, BamgQuadtree.cpp/NearestVertexWithNormal)*/396 397 BamgQuadtreeBox * pb[ MaxDepth ];398 int pi[ MaxDepth ];399 Icoor1 ii[ MaxDepth ], jj [ MaxDepth];400 int l; // level401 BamgQuadtreeBox * b;402 long h =MaxISize,h0;403 long hb=MaxISize;404 Icoor1 i0=0,j0=0;405 Icoor1 iplus( i<MaxISize?(i<0?0:i):MaxISize-1);406 Icoor1 jplus( j<MaxISize?(j<0?0:j):MaxISize-1);407 408 BamgVertex *vn=0;409 410 // init for optimisation ---411 b = root;412 register long n0;413 if (!root->nbitems)414 return vn; // empty tree415 416 while( (n0 = b->nbitems) < 0)417 {418 // search the non empty419 // BamgQuadtreeBox containing the point (i,j)420 register Icoor1 hb2 = hb >> 1 ;421 register int k = IJ(iplus,jplus,hb2);// BamgQuadtreeBox number of size hb2 contening i;j422 register BamgQuadtreeBox * b0= b->b[k];423 if ( ( b0 == 0) || (b0->nbitems == 0) )424 break; // null box or empty => break425 b=b0;426 i0 += I_IJ(k,hb2); // i orign of BamgQuadtreeBox427 j0 += J_IJ(k,hb2); // j orign of BamgQuadtreeBox428 hb = hb2;429 }430 431 if ( n0 > 0)432 {433 for(register int k=0;k<n0;k++)434 {435 I2 i2 = b->v[k]->i;436 // try if is in the right direction --437 h0 = NORM(iplus,i2.x,jplus,i2.y);438 if (h0 <h) {439 h = h0;440 vn = b->v[k];}441 }442 if (vn) return vn;443 }444 // general case -----445 // INITIALISATION OF THE HEAP446 l =0; // level447 pb[0]= b;448 pi[0]=b->nbitems>0 ?(int) b->nbitems : 4 ;449 ii[0]=i0;450 jj[0]=j0;451 h=hb;452 do { // walk on the tree453 b= pb[l];454 while (pi[l]--) // loop on 4 element of the box455 {456 int k = pi[l];457 458 if (b->nbitems>0) // BamgVertex BamgQuadtreeBox none empty459 {460 I2 i2 = b->v[k]->i;461 // if good direction when try --462 463 h0 = NORM(iplus,i2.x,jplus,i2.y);464 if (h0 <h)465 {466 h = h0;467 vn = b->v[k];468 }469 }470 else // Pointer BamgQuadtreeBox471 {472 register BamgQuadtreeBox *b0=b;473 if ((b=b->b[k]))474 {475 hb >>=1 ; // div by 2476 register Icoor1 iii = ii[l]+I_IJ(k,hb);477 register Icoor1 jjj = jj[l]+J_IJ(k,hb);478 479 if (INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h))480 {481 pb[++l]= b;482 pi[l]= b->nbitems>0 ?(int) b->nbitems : 4 ;483 ii[l]= iii;484 jj[l]= jjj;485 486 }487 else488 b=b0, hb <<=1 ;489 }490 else491 b=b0;492 }493 }494 hb <<= 1; // mul by 2495 } while (l--);496 497 return vn;498 }499 /*}}}*/500 393 /*FUNCTION BamgQuadtree::NewBamgQuadtreeBox {{{*/ 501 394 BamgQuadtree::BamgQuadtreeBox* BamgQuadtree::NewBamgQuadtreeBox(void){
Note:
See TracChangeset
for help on using the changeset viewer.