Mercurial > hg > orthanc-stone
comparison OrthancStone/UnitTestsSources/ComputationalGeometryTests.cpp @ 1906:925aaf49150c
minor fix in UnionOfRectangles
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 31 Jan 2022 22:32:31 +0100 |
parents | 3716d72161d2 |
children | 07964689cb0b |
comparison
equal
deleted
inserted
replaced
1905:e318b524ad3f | 1906:925aaf49150c |
---|---|
559 fprintf(fp, "</marker>\n"); | 559 fprintf(fp, "</marker>\n"); |
560 fprintf(fp, "</defs>\n"); | 560 fprintf(fp, "</defs>\n"); |
561 | 561 |
562 fprintf(fp, "<rect fill=\"#fff\" stroke=\"#000\" x=\"0\" y=\"0\" width=\"%f\" height=\"%f\"/>\n", ww, hh); | 562 fprintf(fp, "<rect fill=\"#fff\" stroke=\"#000\" x=\"0\" y=\"0\" width=\"%f\" height=\"%f\"/>\n", ww, hh); |
563 | 563 |
564 unsigned int count = 0; | |
565 | |
564 for (std::list< std::vector<OrthancStone::ScenePoint2D> >::const_iterator | 566 for (std::list< std::vector<OrthancStone::ScenePoint2D> >::const_iterator |
565 it = contours.begin(); it != contours.end(); ++it) | 567 it = contours.begin(); it != contours.end(); ++it, count++) |
566 { | 568 { |
569 std::string color; | |
570 if (count == 0) | |
571 { | |
572 color = "blue"; | |
573 } | |
574 else if (count == 1) | |
575 { | |
576 color = "red"; | |
577 } | |
578 else if (count == 2) | |
579 { | |
580 color = "green"; | |
581 } | |
582 else if (count == 3) | |
583 { | |
584 color = "orange"; | |
585 } | |
586 else | |
587 { | |
588 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
589 } | |
590 | |
567 for (size_t i = 0; i + 1 < it->size(); i++) | 591 for (size_t i = 0; i + 1 < it->size(); i++) |
568 { | 592 { |
569 float x1 = (*it)[i].GetX(); | 593 float x1 = (*it)[i].GetX(); |
570 float x2 = (*it)[i + 1].GetX(); | 594 float x2 = (*it)[i + 1].GetX(); |
571 float y1 = (*it)[i].GetY(); | 595 float y1 = (*it)[i].GetY(); |
572 float y2 = (*it)[i + 1].GetY(); | 596 float y2 = (*it)[i + 1].GetY(); |
573 | 597 |
574 fprintf(fp, "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"blue\" stroke-width=\"0.05\" marker-end=\"url(#arrowhead)\"/>\n", x1, y1, x2, y2); | 598 fprintf(fp, "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"%s\" stroke-width=\"0.05\" marker-end=\"url(#arrowhead)\"/>\n", x1, y1, x2, y2, color.c_str()); |
575 } | 599 } |
576 } | 600 } |
577 fprintf(fp, "</svg>\n"); | 601 fprintf(fp, "</svg>\n"); |
578 | 602 |
579 fclose(fp); | 603 fclose(fp); |
651 rectangles.push_back(OrthancStone::Extent2D(7, 4, 10, 6)); | 675 rectangles.push_back(OrthancStone::Extent2D(7, 4, 10, 6)); |
652 | 676 |
653 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; | 677 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; |
654 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); | 678 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); |
655 | 679 |
656 ASSERT_EQ(1u, contours.size()); | 680 ASSERT_EQ(2u, contours.size()); |
657 ASSERT_EQ(17u, contours.front().size()); | 681 |
682 ASSERT_EQ(9u, contours.front().size()); | |
658 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(4, 8))); | 683 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(4, 8))); |
659 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(7, 8))); | 684 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(7, 8))); |
660 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(7, 6))); | 685 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(7, 6))); |
661 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(10, 6))); | 686 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(10, 6))); |
662 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(10, 4))); | 687 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(10, 4))); |
663 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(7, 4))); | 688 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(7, 4))); |
664 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(7, 2))); | 689 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(7, 6))); |
665 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(4, 2))); | 690 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(4, 6))); |
666 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(4, 4))); | 691 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(4, 8))); |
667 ASSERT_TRUE(contours.front()[9].IsEqual(OrthancStone::ScenePoint2D(7, 4))); | 692 |
668 ASSERT_TRUE(contours.front()[10].IsEqual(OrthancStone::ScenePoint2D(7, 6))); | 693 ASSERT_EQ(9u, contours.back().size()); |
669 ASSERT_TRUE(contours.front()[11].IsEqual(OrthancStone::ScenePoint2D(4, 6))); | 694 ASSERT_TRUE(contours.back()[0].IsEqual(OrthancStone::ScenePoint2D(1, 6))); |
670 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D(4, 4))); | 695 ASSERT_TRUE(contours.back()[1].IsEqual(OrthancStone::ScenePoint2D(4, 6))); |
671 ASSERT_TRUE(contours.front()[13].IsEqual(OrthancStone::ScenePoint2D(1, 4))); | 696 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(4, 4))); |
672 ASSERT_TRUE(contours.front()[14].IsEqual(OrthancStone::ScenePoint2D(1, 6))); | 697 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(7, 4))); |
673 ASSERT_TRUE(contours.front()[15].IsEqual(OrthancStone::ScenePoint2D(4, 6))); | 698 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(7, 2))); |
674 ASSERT_TRUE(contours.front()[16].IsEqual(OrthancStone::ScenePoint2D(4, 8))); | 699 ASSERT_TRUE(contours.back()[5].IsEqual(OrthancStone::ScenePoint2D(4, 2))); |
700 ASSERT_TRUE(contours.back()[6].IsEqual(OrthancStone::ScenePoint2D(4, 4))); | |
701 ASSERT_TRUE(contours.back()[7].IsEqual(OrthancStone::ScenePoint2D(1, 4))); | |
702 ASSERT_TRUE(contours.back()[8].IsEqual(OrthancStone::ScenePoint2D(1, 6))); | |
675 } | 703 } |
676 | 704 |
677 { | 705 { |
678 std::list<OrthancStone::Extent2D> rectangles; | 706 std::list<OrthancStone::Extent2D> rectangles; |
679 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); | 707 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); |
734 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2))); | 762 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2))); |
735 } | 763 } |
736 | 764 |
737 { | 765 { |
738 std::list<OrthancStone::Extent2D> rectangles; | 766 std::list<OrthancStone::Extent2D> rectangles; |
739 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); | 767 rectangles.push_back(OrthancStone::Extent2D(1, 4, 5, 6)); |
740 rectangles.push_back(OrthancStone::Extent2D(6, 4, 9, 6)); | 768 rectangles.push_back(OrthancStone::Extent2D(6, 4, 9, 6)); |
741 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); | 769 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); |
742 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6)); | 770 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6)); |
743 | 771 |
744 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; | 772 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; |
761 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D(4, 8))); | 789 ASSERT_TRUE(contours.front()[12].IsEqual(OrthancStone::ScenePoint2D(4, 8))); |
762 } | 790 } |
763 | 791 |
764 { | 792 { |
765 std::list<OrthancStone::Extent2D> rectangles; | 793 std::list<OrthancStone::Extent2D> rectangles; |
766 rectangles.push_back(OrthancStone::Extent2D(1, 4, 4, 6)); | 794 rectangles.push_back(OrthancStone::Extent2D(1, 4, 5, 6)); |
767 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); | 795 rectangles.push_back(OrthancStone::Extent2D(4, 6, 7, 8)); |
768 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6)); | 796 rectangles.push_back(OrthancStone::Extent2D(4, 2, 7, 6)); |
769 | 797 |
770 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; | 798 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; |
771 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); | 799 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); |
894 rectangles.push_back(OrthancStone::Extent2D(3, 3, 4, 4)); | 922 rectangles.push_back(OrthancStone::Extent2D(3, 3, 4, 4)); |
895 | 923 |
896 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; | 924 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; |
897 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); | 925 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); |
898 | 926 |
899 ASSERT_EQ(1u, contours.size()); | 927 ASSERT_EQ(2u, contours.size()); |
900 ASSERT_EQ(9u, contours.front().size()); | 928 |
929 ASSERT_EQ(5u, contours.front().size()); | |
901 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(3, 4))); | 930 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(3, 4))); |
902 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(4, 4))); | 931 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(4, 4))); |
903 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(4, 3))); | 932 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(4, 3))); |
904 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(3, 3))); | 933 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(3, 3))); |
905 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(3, 2))); | 934 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(3, 4))); |
906 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(2, 2))); | 935 |
907 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(2, 3))); | 936 ASSERT_EQ(5u, contours.back().size()); |
908 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(3, 3))); | 937 ASSERT_TRUE(contours.back()[0].IsEqual(OrthancStone::ScenePoint2D(2, 3))); |
909 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(3, 4))); | 938 ASSERT_TRUE(contours.back()[1].IsEqual(OrthancStone::ScenePoint2D(3, 3))); |
939 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(3, 2))); | |
940 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(2, 2))); | |
941 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(2, 3))); | |
910 } | 942 } |
911 | 943 |
912 { | 944 { |
913 std::list<OrthancStone::Extent2D> rectangles; | 945 std::list<OrthancStone::Extent2D> rectangles; |
914 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3)); | 946 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 3)); |
936 rectangles.push_back(OrthancStone::Extent2D(1, 1, 2, 2)); | 968 rectangles.push_back(OrthancStone::Extent2D(1, 1, 2, 2)); |
937 | 969 |
938 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; | 970 std::list< std::vector<OrthancStone::ScenePoint2D> > contours; |
939 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); | 971 OrthancStone::UnionOfRectangles::Apply(contours, rectangles); |
940 | 972 |
941 ASSERT_EQ(1u, contours.size()); | 973 ASSERT_EQ(2u, contours.size()); |
942 ASSERT_EQ(9u, contours.front().size()); | 974 |
975 ASSERT_EQ(5u, contours.front().size()); | |
943 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 3))); | 976 ASSERT_TRUE(contours.front()[0].IsEqual(OrthancStone::ScenePoint2D(2, 3))); |
944 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 3))); | 977 ASSERT_TRUE(contours.front()[1].IsEqual(OrthancStone::ScenePoint2D(3, 3))); |
945 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 2))); | 978 ASSERT_TRUE(contours.front()[2].IsEqual(OrthancStone::ScenePoint2D(3, 2))); |
946 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(2, 2))); | 979 ASSERT_TRUE(contours.front()[3].IsEqual(OrthancStone::ScenePoint2D(2, 2))); |
947 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(2, 1))); | 980 ASSERT_TRUE(contours.front()[4].IsEqual(OrthancStone::ScenePoint2D(2, 3))); |
948 ASSERT_TRUE(contours.front()[5].IsEqual(OrthancStone::ScenePoint2D(1, 1))); | 981 |
949 ASSERT_TRUE(contours.front()[6].IsEqual(OrthancStone::ScenePoint2D(1, 2))); | 982 ASSERT_EQ(5u, contours.back().size()); |
950 ASSERT_TRUE(contours.front()[7].IsEqual(OrthancStone::ScenePoint2D(2, 2))); | 983 ASSERT_TRUE(contours.back()[0].IsEqual(OrthancStone::ScenePoint2D(1, 2))); |
951 ASSERT_TRUE(contours.front()[8].IsEqual(OrthancStone::ScenePoint2D(2, 3))); | 984 ASSERT_TRUE(contours.back()[1].IsEqual(OrthancStone::ScenePoint2D(2, 2))); |
985 ASSERT_TRUE(contours.back()[2].IsEqual(OrthancStone::ScenePoint2D(2, 1))); | |
986 ASSERT_TRUE(contours.back()[3].IsEqual(OrthancStone::ScenePoint2D(1, 1))); | |
987 ASSERT_TRUE(contours.back()[4].IsEqual(OrthancStone::ScenePoint2D(1, 2))); | |
952 } | 988 } |
953 | 989 |
954 { | 990 { |
955 std::list<OrthancStone::Extent2D> rectangles; | 991 std::list<OrthancStone::Extent2D> rectangles; |
956 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 5)); | 992 rectangles.push_back(OrthancStone::Extent2D(2, 2, 3, 5)); |