------------------------------------------------------------------------------
| 594 | |
| 595 | //------------------------------------------------------------------------------ |
| 596 | bool vtkLabeledContourPolyDataItem::ResolveLabels() |
| 597 | { |
| 598 | typedef std::vector<PDILabelInfo>::iterator InnerIterator; |
| 599 | typedef std::vector<std::vector<PDILabelInfo>>::iterator OuterIterator; |
| 600 | |
| 601 | bool removedA = false; |
| 602 | bool removedB = false; |
| 603 | |
| 604 | OuterIterator outerA = this->Internal->LabelInfos.begin(); |
| 605 | OuterIterator outerEnd = this->Internal->LabelInfos.end(); |
| 606 | while (outerA != outerEnd) |
| 607 | { |
| 608 | InnerIterator innerA = outerA->begin(); |
| 609 | InnerIterator innerAEnd = outerA->end(); |
| 610 | while (innerA != innerAEnd) |
| 611 | { |
| 612 | removedA = false; |
| 613 | OuterIterator outerB = outerA; |
| 614 | while (!removedA && outerB != outerEnd) |
| 615 | { |
| 616 | InnerIterator innerB = outerA == outerB ? innerA + 1 : outerB->begin(); |
| 617 | InnerIterator innerBEnd = outerB->end(); |
| 618 | while (!removedA && innerB != innerBEnd) |
| 619 | { |
| 620 | removedB = false; |
| 621 | // Does innerA overlap with innerB? |
| 622 | if (this->Internal->TestOverlap(*innerA, *innerB)) |
| 623 | { |
| 624 | // Remove the label that has the most labels for its isoline: |
| 625 | if (outerA->size() > outerB->size()) |
| 626 | { |
| 627 | // Remove innerA |
| 628 | innerA = outerA->erase(innerA); |
| 629 | innerAEnd = outerA->end(); |
| 630 | removedA = true; |
| 631 | } |
| 632 | else |
| 633 | { |
| 634 | // Remove innerB |
| 635 | // Need to update A's iterators if outerA == outerB |
| 636 | if (outerA == outerB) |
| 637 | { |
| 638 | // We know that aIdx < bIdx, so removing B won't change |
| 639 | // the position of A: |
| 640 | size_t aIdx = innerA - outerA->begin(); |
| 641 | innerB = outerB->erase(innerB); |
| 642 | innerBEnd = outerB->end(); |
| 643 | innerA = outerA->begin() + aIdx; |
| 644 | innerAEnd = outerA->end(); |
| 645 | } |
| 646 | else |
| 647 | { |
| 648 | innerB = outerB->erase(innerB); |
| 649 | innerBEnd = outerB->end(); |
| 650 | } |
| 651 | removedB = true; |
| 652 | } |
| 653 | } |