cc: add adjecent squares calc

I'm sure it'll come handy soon
This commit is contained in:
Crypto City 2019-12-19 16:59:52 +00:00
parent a6b50d309c
commit b9146035de
3 changed files with 74 additions and 0 deletions

View File

@ -204,4 +204,24 @@ uint32_t calculate_influence(uint8_t role, const uint32_t cumulative_influence[N
return score;
}
// assumes non intersection
uint32_t connection_squares(uint32_t ax0, uint32_t ay0, uint32_t ax1, uint32_t ay1, uint32_t bx0, uint32_t by0, uint32_t bx1, uint32_t by1)
{
// left or right
if (ax1 + 1 == bx0 || bx1 + 1 == ax0)
{
const uint32_t maxy = std::min(ay1, by1);
const uint32_t miny = std::max(ay0, by0);
return maxy >= miny ? maxy - miny + 1 : 0;
}
// top or bottom
if (by1 + 1 == ay0 || ay1 + 1 == by0)
{
const uint32_t maxx = std::min(ax1, bx1);
const uint32_t minx = std::max(ax0, bx0);
return maxx >= minx ? maxx - minx + 1 : 0;
}
return 0;
}
}

View File

@ -84,4 +84,6 @@ namespace cc
else
return 0;
}
uint32_t connection_squares(uint32_t ax0, uint32_t ay0, uint32_t ax1, uint32_t ay1, uint32_t bx0, uint32_t by0, uint32_t bx1, uint32_t by1);
}

View File

@ -2321,6 +2321,58 @@ TEST(cc, distance_percentage)
ASSERT_EQ(221, cc::get_distance_percentage(2210, 1000));
}
TEST(cc, connection_squares)
{
// disjoint
ASSERT_EQ(cc::connection_squares(0, 0, 0, 0, 2, 2, 2, 2), 0);
// corners
ASSERT_EQ(cc::connection_squares(1, 1, 1, 1, 2, 2, 2, 2), 0);
ASSERT_EQ(cc::connection_squares(1, 1, 1, 1, 2, 2, 2, 2), 0);
ASSERT_EQ(cc::connection_squares(2, 1, 2, 1, 1, 2, 1, 2), 0);
ASSERT_EQ(cc::connection_squares(1, 2, 1, 2, 2, 1, 2, 1), 0);
// full tile
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 2, 1, 2), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 2, 1, 2, 1), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 2, 3, 2, 3), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 3, 2, 3, 2), 1);
// one tile in the middle
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 1, 1, 3), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 1, 3, 1), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 1, 3, 3, 3), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 2, 2, 3, 1, 3, 3), 1);
// 0 1 2 3 4 5
// . . . . . . 0
// . . . . . . 1
// . . x x . . 2
// . . x x . . 3
// . . . . . . 4
// . . . . . . 5
// one tile, corners
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 1, 2), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 2, 1), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 3, 0, 5, 1), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 0, 5, 2), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 3, 1, 5), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 4, 2, 5), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 3, 4, 5, 5), 1);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 3, 5, 5), 1);
// full 2
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 1, 5), 2);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 0, 5, 1), 2);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 4, 0, 5, 5), 2);
ASSERT_EQ(cc::connection_squares(2, 2, 3, 3, 0, 4, 5, 5), 2);
ASSERT_EQ(cc::connection_squares(0, 0, 1, 5, 2, 2, 3, 3), 2);
ASSERT_EQ(cc::connection_squares(0, 0, 5, 1, 2, 2, 3, 3), 2);
ASSERT_EQ(cc::connection_squares(4, 0, 5, 5, 2, 2, 3, 3), 2);
ASSERT_EQ(cc::connection_squares(0, 4, 5, 5, 2, 2, 3, 3), 2);
}
TEST(cc_influence, monotonic)
{
static const uint8_t potential[] = {0, 80, 105, 180, 255};