diff --git a/Device/Mask/Rectangle.cpp b/Device/Mask/Rectangle.cpp index c457cf453e667d1fa3ea06668a65748398634e22..73ed150db205af2658a97ba4df56be9fbc8565bc 100644 --- a/Device/Mask/Rectangle.cpp +++ b/Device/Mask/Rectangle.cpp @@ -19,7 +19,8 @@ //! @param ylow y-coordinate of lower left corner //! @param xup x-coordinate of upper right corner //! @param yup y-coordinate of upper right corner -Rectangle::Rectangle(double xlow, double ylow, double xup, double yup) : IShape2D("Rectangle") +Rectangle::Rectangle(double xlow, double ylow, double xup, double yup, bool inverted) + : IShape2D("Rectangle"), m_inverted(inverted) { if (xup <= xlow) { std::ostringstream message; @@ -39,9 +40,15 @@ Rectangle::Rectangle(double xlow, double ylow, double xup, double yup) : IShape2 m_yup = yup; } +void Rectangle::setInverted(bool inverted /*= true*/) +{ + m_inverted = inverted; +} + bool Rectangle::contains(double x, double y) const { - return x <= m_xup && x >= m_xlow && y <= m_yup && y >= m_ylow; + const bool inRect = x <= m_xup && x >= m_xlow && y <= m_yup && y >= m_ylow; + return m_inverted ? !inRect : inRect; } bool Rectangle::contains(const Bin1D& binx, const Bin1D& biny) const diff --git a/Device/Mask/Rectangle.h b/Device/Mask/Rectangle.h index bf7b4da4af4349593d4bcae31ae3bc73665343d0..0140c3444b32c4f494829f657ac70a83bc047959 100644 --- a/Device/Mask/Rectangle.h +++ b/Device/Mask/Rectangle.h @@ -24,8 +24,10 @@ class Rectangle : public IShape2D { public: - Rectangle(double xlow, double ylow, double xup, double yup); - Rectangle* clone() const { return new Rectangle(m_xlow, m_ylow, m_xup, m_yup); } + Rectangle(double xlow, double ylow, double xup, double yup, bool inverted = false); + Rectangle* clone() const { return new Rectangle(m_xlow, m_ylow, m_xup, m_yup, m_inverted); } + + void setInverted(bool inverted = true); bool contains(double x, double y) const; bool contains(const Bin1D& binx, const Bin1D& biny) const; @@ -39,6 +41,7 @@ public: private: double m_xlow, m_ylow, m_xup, m_yup; + bool m_inverted; }; #endif // BORNAGAIN_DEVICE_MASK_RECTANGLE_H diff --git a/Tests/UnitTests/Core/Mask/Shape2DTest.cpp b/Tests/UnitTests/Core/Mask/Shape2DTest.cpp index 7213291b2249baa7be25083e596f803505bbab31..6037f7be5e03d5f2f4fe4836d7eae1c129a45891 100644 --- a/Tests/UnitTests/Core/Mask/Shape2DTest.cpp +++ b/Tests/UnitTests/Core/Mask/Shape2DTest.cpp @@ -41,6 +41,37 @@ TEST_F(Shape2DTest, Rectangle) EXPECT_FALSE(clone->contains(binx2, biny2)); } +TEST_F(Shape2DTest, Rectangle_inverted) +{ + Rectangle rect(-4.0, -2.0, 4.0, 2.0, true); + EXPECT_DOUBLE_EQ(32.0, rect.getArea()); + EXPECT_FALSE(rect.contains(0.0, 0.0)); + EXPECT_FALSE(rect.contains(4.0, 2.0)); + EXPECT_FALSE(rect.contains(-4.0, -2.0)); + EXPECT_FALSE(rect.contains(-4.0, -2.0)); + EXPECT_TRUE(rect.contains(0.0, 2.01)); + EXPECT_TRUE(rect.contains(4.0, -2.01)); + + Bin1D binx1(3.5, 4.5); + Bin1D biny1(1.5, 2.5); + EXPECT_FALSE(rect.contains(binx1, biny1)); + + Bin1D binx2(3.5, 4.6); + Bin1D biny2(1.5, 2.6); + EXPECT_TRUE(rect.contains(binx2, biny2)); + + std::unique_ptr<Rectangle> clone(rect.clone()); + EXPECT_DOUBLE_EQ(32.0, clone->getArea()); + EXPECT_FALSE(clone->contains(0.0, 0.0)); + EXPECT_FALSE(clone->contains(4.0, 2.0)); + EXPECT_FALSE(clone->contains(-4.0, -2.0)); + EXPECT_FALSE(clone->contains(-4.0, -2.0)); + EXPECT_TRUE(clone->contains(0.0, 2.01)); + EXPECT_TRUE(clone->contains(4.0, -2.01)); + EXPECT_FALSE(clone->contains(binx1, biny1)); + EXPECT_TRUE(clone->contains(binx2, biny2)); +} + TEST_F(Shape2DTest, Ellipse) { Ellipse ellipse(10.0, 1.0, 8.0, 4.0);