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));