15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
31 template <std::
size_t W, std::
size_t H>
34 using index_type = std::pair<std::size_t, std::size_t>;
35 using value_type = uint8_t;
39 explicit Image(std::array<std::array<value_type, W>, H> data) : data_(
std::move(data)) {}
41 [[nodiscard]] index_type index_at(
int xi,
int yi)
const {
42 return index_type{
static_cast<std::size_t
>(xi),
static_cast<std::size_t
>(yi)};
45 [[nodiscard]] index_type index_at(
const Eigen::Vector2i& pi)
const {
return index_at(pi.x(), pi.y()); }
49 [[nodiscard]] std::optional<value_type>
data_at(
const index_type& index)
const {
50 return index.first < W && index.second < H ? std::make_optional(data_[index.first][index.second]) :
std::
nullopt;
53 [[nodiscard]] std::size_t width()
const {
return W; }
54 [[nodiscard]] std::size_t height()
const {
return H; }
55 [[nodiscard]]
double resolution()
const {
return 1.; }
58 std::array<std::array<value_type, W>, H> data_;
61 TEST(DenseGrid2, Limits) {
62 const auto grid = Image<5, 5>{};
64 EXPECT_TRUE(grid.contains(0, 0));
65 EXPECT_FALSE(grid.contains(-1, 0));
66 EXPECT_FALSE(grid.contains(0, -1));
67 EXPECT_TRUE(grid.contains(2, 2));
68 EXPECT_FALSE(grid.contains(5, 0));
69 EXPECT_FALSE(grid.contains(0, 5));
71 EXPECT_TRUE(grid.contains(Eigen::Vector2i(0, 0)));
72 EXPECT_FALSE(grid.contains(Eigen::Vector2i(-1, 0)));
73 EXPECT_FALSE(grid.contains(Eigen::Vector2i(0, -1)));
74 EXPECT_TRUE(grid.contains(Eigen::Vector2i(2, 2)));
75 EXPECT_FALSE(grid.contains(Eigen::Vector2i(5, 0)));
76 EXPECT_FALSE(grid.contains(Eigen::Vector2i(0, 5)));
79 TEST(DenseGrid2, Data) {
81 Image<5, 5>({{{0, 0, 0, 0, 0}, {0, 1, 1, 1, 0}, {0, 1, 2, 1, 0}, {0, 1, 1, 1, 0}, {0, 0, 0, 0, 0}}});
83 EXPECT_EQ(grid.data_at(Eigen::Vector2i(0, 0)), 0);
84 EXPECT_EQ(grid.data_at(Eigen::Vector2i(2, 2)), 2);
85 EXPECT_EQ(grid.data_at(Eigen::Vector2i(3, 1)), 1);
86 EXPECT_EQ(grid.data_at(Eigen::Vector2i(-1, 0)), std::nullopt);
87 EXPECT_EQ(grid.data_at(Eigen::Vector2i(0, -1)), std::nullopt);
88 EXPECT_EQ(grid.data_at(Eigen::Vector2i(5, 0)), std::nullopt);
89 EXPECT_EQ(grid.data_at(Eigen::Vector2i(0, 5)), std::nullopt);
92 TEST(DenseGrid2, NearestData) {
94 Image<5, 5>({{{0, 0, 0, 0, 0}, {0, 1, 1, 1, 0}, {0, 1, 2, 1, 0}, {0, 1, 1, 1, 0}, {0, 0, 0, 0, 0}}});
96 EXPECT_EQ(grid.data_near(0.8, 0.2), 0);
97 EXPECT_EQ(grid.data_near(2.1, 2.9), 2);
98 EXPECT_EQ(grid.data_near(3.5, 1.5), 1);
99 EXPECT_EQ(grid.data_near(-0.1, 0), std::nullopt);
100 EXPECT_EQ(grid.data_near(0, -0.1), std::nullopt);
101 EXPECT_EQ(grid.data_near(5.25, 0), std::nullopt);
102 EXPECT_EQ(grid.data_near(0, 5.25), std::nullopt);
104 EXPECT_EQ(grid.data_near(Eigen::Vector2d(0.8, 0.2)), 0);
105 EXPECT_EQ(grid.data_near(Eigen::Vector2d(2.1, 2.9)), 2);
106 EXPECT_EQ(grid.data_near(Eigen::Vector2d(3.5, 1.5)), 1);
107 EXPECT_EQ(grid.data_near(Eigen::Vector2d(-0.1, 0)), std::nullopt);
108 EXPECT_EQ(grid.data_near(Eigen::Vector2d(0, -0.1)), std::nullopt);
109 EXPECT_EQ(grid.data_near(Eigen::Vector2d(5.25, 0)), std::nullopt);
110 EXPECT_EQ(grid.data_near(Eigen::Vector2d(0, 5.25)), std::nullopt);
113 TEST(DenseGrid2, Neighborhood4) {
114 const auto grid = Image<5, 5>{};
117 const auto expected_neighborhood =
118 std::vector{Eigen::Vector2i{3, 2}, Eigen::Vector2i{2, 3}, Eigen::Vector2i{1, 2}, Eigen::Vector2i{2, 1}};
119 ASSERT_THAT(grid.neighborhood4(2, 2), testing::Pointwise(testing::Eq(), expected_neighborhood));
120 ASSERT_THAT(grid.neighborhood4(Eigen::Vector2i(2, 2)), testing::Pointwise(testing::Eq(), expected_neighborhood));
124 const auto expected_neighborhood = std::vector{Eigen::Vector2i{1, 0}, Eigen::Vector2i{0, 1}};
125 ASSERT_THAT(grid.neighborhood4(0, 0), testing::Pointwise(testing::Eq(), expected_neighborhood));
126 ASSERT_THAT(grid.neighborhood4(Eigen::Vector2i(0, 0)), testing::Pointwise(testing::Eq(), expected_neighborhood));
130 const auto expected_neighborhood = std::vector{Eigen::Vector2i{3, 4}, Eigen::Vector2i{4, 3}};
131 ASSERT_THAT(grid.neighborhood4(4, 4), testing::Pointwise(testing::Eq(), expected_neighborhood));
132 ASSERT_THAT(grid.neighborhood4(Eigen::Vector2i(4, 4)), testing::Pointwise(testing::Eq(), expected_neighborhood));