Mercurial > hg > orthanc
diff OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp @ 4875:5dae41084ab7
fix filling polygons
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 18 Jan 2022 15:04:04 +0100 |
parents | b1556cefa5c6 |
children | 664e383b68ad |
line wrap: on
line diff
--- a/OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp Tue Jan 18 13:04:47 2022 +0100 +++ b/OrthancFramework/UnitTestsSources/ImageProcessingTests.cpp Tue Jan 18 15:04:04 2022 +0100 @@ -196,8 +196,6 @@ } -#include "../Sources/Images/PngWriter.h" - TYPED_TEST(TestIntegerImageTraits, FillPolygon) { ImageAccessor& image = this->GetImage(); @@ -212,9 +210,6 @@ ImageProcessing::FillPolygon(image, points, 255); - Orthanc::PngWriter writer; - Orthanc::IImageWriter::WriteToFile(writer, "tutu.png", image); - // outside polygon ASSERT_FLOAT_EQ(128, TestFixture::ImageTraits::GetFloatPixel(image, 0, 0)); ASSERT_FLOAT_EQ(128, TestFixture::ImageTraits::GetFloatPixel(image, 0, 6)); @@ -311,9 +306,9 @@ } static void SetSignedGrayscale16Pixel(ImageAccessor& image, - unsigned int x, - unsigned int y, - int16_t value) + unsigned int x, + unsigned int y, + int16_t value) { ImageTraits<PixelFormat_SignedGrayscale16>::SetPixel(image, value, x, y); } @@ -1096,3 +1091,136 @@ } } } + + +namespace +{ + class PolygonSegments : public ImageProcessing::IPolygonFiller + { + private: + std::vector<int> y_, x1_, x2_; + + public: + virtual void Fill(int y, + int x1, + int x2) ORTHANC_OVERRIDE + { + assert(x1 <= x2); + y_.push_back(y); + x1_.push_back(x1); + x2_.push_back(x2); + } + + size_t GetSize() const + { + return y_.size(); + } + + int GetY(size_t i) const + { + return y_[i]; + } + + int GetX1(size_t i) const + { + return x1_[i]; + } + + int GetX2(size_t i) const + { + return x2_[i]; + } + }; +} + + +TEST(ImageProcessing, FillPolygon) +{ + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(0u, segments.GetSize()); + } + + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(288, 208)); + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(0u, segments.GetSize()); + } + + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(10, 100)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(50, 100)); + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(1u, segments.GetSize()); + ASSERT_EQ(100, segments.GetY(0)); + ASSERT_EQ(10, segments.GetX1(0)); + ASSERT_EQ(50, segments.GetX2(0)); + } + + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(10, 100)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(10, 101)); + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(2u, segments.GetSize()); + ASSERT_EQ(100, segments.GetY(0)); + ASSERT_EQ(10, segments.GetX1(0)); + ASSERT_EQ(10, segments.GetX2(0)); + ASSERT_EQ(101, segments.GetY(1)); + ASSERT_EQ(10, segments.GetX1(1)); + ASSERT_EQ(10, segments.GetX2(1)); + } + + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(10, 100)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(11, 101)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(13, 103)); + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(4u, segments.GetSize()); + ASSERT_EQ(100, segments.GetY(0)); + ASSERT_EQ(10, segments.GetX1(0)); + ASSERT_EQ(10, segments.GetX2(0)); + ASSERT_EQ(101, segments.GetY(1)); + ASSERT_EQ(11, segments.GetX1(1)); + ASSERT_EQ(11, segments.GetX2(1)); + ASSERT_EQ(102, segments.GetY(2)); + ASSERT_EQ(12, segments.GetX1(2)); + ASSERT_EQ(12, segments.GetX2(2)); + ASSERT_EQ(103, segments.GetY(3)); + ASSERT_EQ(13, segments.GetX1(3)); + ASSERT_EQ(13, segments.GetX2(3)); + } + + { + std::vector<Orthanc::ImageProcessing::ImagePoint> polygon; + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(5, 5)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(7, 7)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(9, 5)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(9, 8)); + polygon.push_back(Orthanc::ImageProcessing::ImagePoint(5, 8)); + + PolygonSegments segments; + Orthanc::ImageProcessing::FillPolygon(segments, polygon); + ASSERT_EQ(6u, segments.GetSize()); + ASSERT_EQ(5, segments.GetY(0)); ASSERT_EQ(5, segments.GetX1(0)); ASSERT_EQ(5, segments.GetX2(0)); + ASSERT_EQ(5, segments.GetY(1)); ASSERT_EQ(9, segments.GetX1(1)); ASSERT_EQ(9, segments.GetX2(1)); + ASSERT_EQ(6, segments.GetY(2)); ASSERT_EQ(5, segments.GetX1(2)); ASSERT_EQ(6, segments.GetX2(2)); + ASSERT_EQ(6, segments.GetY(3)); ASSERT_EQ(8, segments.GetX1(3)); ASSERT_EQ(9, segments.GetX2(3)); + ASSERT_EQ(7, segments.GetY(4)); ASSERT_EQ(5, segments.GetX1(4)); ASSERT_EQ(9, segments.GetX2(4)); + ASSERT_EQ(8, segments.GetY(5)); ASSERT_EQ(5, segments.GetX1(5)); ASSERT_EQ(9, segments.GetX2(5)); + } +}