comparison UnitTestsSources/ComputationalGeometryTests.cpp @ 1876:b1f510e601d2

more unit tests
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 Jan 2022 21:26:47 +0100
parents b896f20d24ca
children
comparison
equal deleted inserted replaced
1875:b896f20d24ca 1876:b1f510e601d2
575 fclose(fp); 575 fclose(fp);
576 } 576 }
577 #endif 577 #endif
578 578
579 579
580 TEST(UnionOfRectangles, Complex) 580 TEST(UnionOfRectangles, EdgeCases)
581 { 581 {
582 {
583 std::list<OrthancStone::Extent2D> rectangles;
584
585 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
586 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
587
588 ASSERT_EQ(0u, contours.size());
589 }
590
591 {
592 std::list<OrthancStone::Extent2D> rectangles;
593 rectangles.push_back(OrthancStone::Extent2D(3, 3, 4, 3)); // empty rectangle
594
595 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
596 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
597
598 ASSERT_EQ(0u, contours.size());
599 }
600
601 {
602 std::list<OrthancStone::Extent2D> rectangles;
603 rectangles.push_back(OrthancStone::Extent2D(1, 1, 2, 2));
604
605 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
606 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
607
608 ASSERT_EQ(1u, contours.size());
609 ASSERT_EQ(5u, contours.front().size());
610 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
611 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
612 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(2, 1)));
613 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(1, 1)));
614 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
615 }
616
617 {
618 std::list<OrthancStone::Extent2D> rectangles;
619 rectangles.push_back(OrthancStone::Extent2D(1, 1, 2, 2));
620 rectangles.push_back(OrthancStone::Extent2D(1, 3, 2, 4));
621
622 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
623 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
624
625 ASSERT_EQ(2u, contours.size());
626
627 ASSERT_EQ(5u, contours.front().size());
628 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
629 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
630 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
631 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(1, 3)));
632 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
633
634 ASSERT_EQ(5u, contours.back().size());
635 ASSERT_TRUE(contours.back()[0].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
636 ASSERT_TRUE(contours.back()[1].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
637 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(2, 1)));
638 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(1, 1)));
639 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
640 }
641
582 { 642 {
583 std::list<OrthancStone::Extent2D> rectangles; 643 std::list<OrthancStone::Extent2D> rectangles;
584 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); 644 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6));
585 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); 645 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8));
586 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 4)); 646 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 4));
668 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(2, 1))); 728 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(2, 1)));
669 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(1, 1))); 729 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(1, 1)));
670 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2))); 730 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
671 } 731 }
672 732
673 #if 0
674 { 733 {
675 std::list<OrthancStone::Extent2D> rectangles; 734 std::list<OrthancStone::Extent2D> rectangles;
676 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); 735 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6));
677 rectangles.push_back(OrthancStone::Extent2D(6, 4, 9, 6)); 736 rectangles.push_back(OrthancStone::Extent2D(6, 4, 9, 6));
678 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); 737 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8));
679 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6)); 738 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6));
680 739
681 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; 740 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
682 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); 741 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
683 742
684 SaveSvg(contours);
685
686 ASSERT_EQ(1u, contours.size()); 743 ASSERT_EQ(1u, contours.size());
687 ASSERT_EQ(13u, contours.front().size()); 744 ASSERT_EQ(13u, contours.front().size());
688 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(4, 8))); 745 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(4, 8)));
689 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(7, 8))); 746 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(7, 8)));
690 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(7, 6))); 747 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(7, 6)));
691 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(9, 6))); 748 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(9, 6)));
692 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(7, 6))); 749 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(9, 4)));
693 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(4, 4))); 750 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(7, 4)));
694 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(1, 4))); 751 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(7, 2)));
695 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D())); 752 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
696 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D())); 753 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
697 ASSERT_TRUE(contours.front()[9].IsEqual(OrthancStone::ScenePoint2D())); 754 ASSERT_TRUE(contours.front()[9].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
698 ASSERT_TRUE(contours.front()[10].IsEqual(OrthancStone::ScenePoint2D())); 755 ASSERT_TRUE(contours.front()[10].IsEqual(OrthancStone::ScenePoint2D(1, 6)));
699 ASSERT_TRUE(contours.front()[11].IsEqual(OrthancStone::ScenePoint2D())); 756 ASSERT_TRUE(contours.front()[11].IsEqual(OrthancStone::ScenePoint2D(4, 6)));
700 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D())); 757 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D(4, 8)));
701 } 758 }
702 #endif 759
703 } 760 {
761 std::list<OrthancStone::Extent2D> rectangles;
762 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6));
763 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8));
764 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6));
765
766 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
767 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
768
769 ASSERT_EQ(1u, contours.size());
770 ASSERT_EQ(9u, contours.front().size());
771 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(4, 8)));
772 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(7, 8)));
773 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(7, 2)));
774 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
775 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
776 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
777 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(1, 6)));
778 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(4, 6)));
779 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(4, 8)));
780 }
781
782 {
783 std::list<OrthancStone::Extent2D> rectangles;
784 rectangles.push_back(OrthancStone::Extent2D(2, 2, 4, 4));
785 rectangles.push_back(OrthancStone::Extent2D(3, 3, 5, 5));
786
787 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
788 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
789
790 ASSERT_EQ(1u, contours.size());
791 ASSERT_EQ(9u, contours.front().size());
792 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(3, 5)));
793 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(5, 5)));
794 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(5, 3)));
795 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(4, 3)));
796 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
797 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
798 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
799 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(3, 4)));
800 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(3, 5)));
801 }
802
803 {
804 std::list<OrthancStone::Extent2D> rectangles;
805 rectangles.push_back(OrthancStone::Extent2D(2, 2, 4, 4));
806 rectangles.push_back(OrthancStone::Extent2D(3, 1, 5, 3));
807
808 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
809 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
810
811 ASSERT_EQ(1u, contours.size());
812 ASSERT_EQ(9u, contours.front().size());
813 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
814 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
815 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(4, 3)));
816 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(5, 3)));
817 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(5, 1)));
818 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(3, 1)));
819 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
820 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
821 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
822 }
823
824 {
825 std::list<OrthancStone::Extent2D> rectangles;
826 rectangles.push_back(OrthancStone::Extent2D(2, 2, 4, 4));
827 rectangles.push_back(OrthancStone::Extent2D(1, 1, 3, 3));
828
829 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
830 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
831
832 ASSERT_EQ(1u, contours.size());
833 ASSERT_EQ(9u, contours.front().size());
834 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
835 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
836 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
837 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
838 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(3, 1)));
839 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(1, 1)));
840 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(1, 3)));
841 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
842 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
843 }
844
845 {
846 std::list<OrthancStone::Extent2D> rectangles;
847 rectangles.push_back(OrthancStone::Extent2D(2, 2, 4, 4));
848 rectangles.push_back(OrthancStone::Extent2D(1, 3, 3, 5));
849
850 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
851 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
852
853 ASSERT_EQ(1u, contours.size());
854 ASSERT_EQ(9u, contours.front().size());
855 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(1, 5)));
856 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 5)));
857 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 4)));
858 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
859 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
860 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
861 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
862 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(1, 3)));
863 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(1, 5)));
864 }
865
866 {
867 std::list<OrthancStone::Extent2D> rectangles;
868 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3));
869 rectangles.push_back(OrthancStone::Extent2D(3, 1, 4, 2));
870
871 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
872 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
873
874 ASSERT_EQ(1u, contours.size());
875 ASSERT_EQ(9u, contours.front().size());
876 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
877 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
878 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
879 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(4, 2)));
880 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(4, 1)));
881 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(3, 1)));
882 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
883 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
884 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
885 }
886
887 {
888 std::list<OrthancStone::Extent2D> rectangles;
889 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3));
890 rectangles.push_back(OrthancStone::Extent2D(3, 3, 4, 4));
891
892 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
893 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
894
895 ASSERT_EQ(1u, contours.size());
896 ASSERT_EQ(9u, contours.front().size());
897 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(3, 4)));
898 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
899 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(4, 3)));
900 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
901 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
902 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
903 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
904 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
905 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(3, 4)));
906 }
907
908 {
909 std::list<OrthancStone::Extent2D> rectangles;
910 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3));
911 rectangles.push_back(OrthancStone::Extent2D(1, 3, 2, 4));
912
913 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
914 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
915
916 ASSERT_EQ(1u, contours.size());
917 ASSERT_EQ(9u, contours.front().size());
918 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
919 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
920 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
921 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
922 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
923 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
924 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
925 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(1, 3)));
926 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
927 }
928
929 {
930 std::list<OrthancStone::Extent2D> rectangles;
931 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3));
932 rectangles.push_back(OrthancStone::Extent2D(1, 1, 2, 2));
933
934 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
935 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
936
937 ASSERT_EQ(1u, contours.size());
938 ASSERT_EQ(9u, contours.front().size());
939 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
940 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
941 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
942 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
943 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(2, 1)));
944 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(1, 1)));
945 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(1, 2)));
946 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
947 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
948 }
949
950 {
951 std::list<OrthancStone::Extent2D> rectangles;
952 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 5));
953 rectangles.push_back(OrthancStone::Extent2D(1, 3, 4, 4));
954
955 std::list< std::vector<OrthancStone::ScenePoint2D> > contours;
956 OrthancStone::UnionOfRectangles::Apply(contours, rectangles);
957
958 ASSERT_EQ(1u, contours.size());
959 ASSERT_EQ(13u, contours.front().size());
960 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 5)));
961 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 5)));
962 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 4)));
963 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(4, 4)));
964 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(4, 3)));
965 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(3, 3)));
966 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(3, 2)));
967 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 2)));
968 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 3)));
969 ASSERT_TRUE(contours.front()[9].IsEqual(OrthancStone::ScenePoint2D(1, 3)));
970 ASSERT_TRUE(contours.front()[10].IsEqual(OrthancStone::ScenePoint2D(1, 4)));
971 ASSERT_TRUE(contours.front()[11].IsEqual(OrthancStone::ScenePoint2D(2, 4)));
972 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D(2, 5)));
973 }
974 }