------------------------------------------------------------------------------ Internal method to find those buckets that are within distance specified. Only those buckets outside of level radiuses of ijk are returned. The bucket neighbors are indices into the "leaf-node" layer of the octree. These indices must be offset by number of octants before the leaf node layer before they can be used. Only
| 564 | // layer before they can be used. Only buckets that have cells are placed |
| 565 | // in the bucket list. |
| 566 | void vtkCellLocator::GetOverlappingBuckets(vtkNeighborCells& buckets, const double x[3], |
| 567 | double dist, int prevMinLevel[3], int prevMaxLevel[3]) |
| 568 | { |
| 569 | int i, j, k, nei[3], minLevel[3], maxLevel[3]; |
| 570 | int leafStart, kFactor, jFactor; |
| 571 | int numberOfBucketsPerPlane, jkSkipFlag, kSkipFlag; |
| 572 | |
| 573 | numberOfBucketsPerPlane = this->NumberOfDivisions * this->NumberOfDivisions; |
| 574 | leafStart = this->NumberOfOctants - numberOfBucketsPerPlane * this->NumberOfDivisions; |
| 575 | |
| 576 | // Initialize |
| 577 | buckets.Reset(); |
| 578 | |
| 579 | // Determine the range of indices in each direction |
| 580 | for (i = 0; i < 3; i++) |
| 581 | { |
| 582 | minLevel[i] = static_cast<int>(((x[i] - dist) - this->Bounds[2 * i]) / this->H[i]); |
| 583 | maxLevel[i] = static_cast<int>(((x[i] + dist) - this->Bounds[2 * i]) / this->H[i]); |
| 584 | |
| 585 | if (minLevel[i] < 0) |
| 586 | { |
| 587 | minLevel[i] = 0; |
| 588 | } |
| 589 | else if (minLevel[i] >= this->NumberOfDivisions) |
| 590 | { |
| 591 | minLevel[i] = this->NumberOfDivisions - 1; |
| 592 | } |
| 593 | if (maxLevel[i] >= this->NumberOfDivisions) |
| 594 | { |
| 595 | maxLevel[i] = this->NumberOfDivisions - 1; |
| 596 | } |
| 597 | else if (maxLevel[i] < 0) |
| 598 | { |
| 599 | maxLevel[i] = 0; |
| 600 | } |
| 601 | } |
| 602 | |
| 603 | if (minLevel[0] == prevMinLevel[0] && maxLevel[0] == prevMaxLevel[0] && |
| 604 | minLevel[1] == prevMinLevel[1] && maxLevel[1] == prevMaxLevel[1] && |
| 605 | minLevel[2] == prevMinLevel[2] && maxLevel[2] == prevMaxLevel[2]) |
| 606 | { |
| 607 | return; |
| 608 | } |
| 609 | |
| 610 | for (k = minLevel[2]; k <= maxLevel[2]; k++) |
| 611 | { |
| 612 | kFactor = k * numberOfBucketsPerPlane; |
| 613 | if (k >= prevMinLevel[2] && k <= prevMaxLevel[2]) |
| 614 | { |
| 615 | kSkipFlag = 1; |
| 616 | } |
| 617 | else |
| 618 | { |
| 619 | kSkipFlag = 0; |
| 620 | } |
| 621 | for (j = minLevel[1]; j <= maxLevel[1]; j++) |
| 622 | { |
| 623 | if (kSkipFlag && j >= prevMinLevel[1] && j <= prevMaxLevel[1]) |
no test coverage detected