TU-Programmieren_2/exercise5/task2.test.cpp
2025-04-09 10:22:44 +02:00

87 lines
2.3 KiB
C++

/// @file
/// @brief Task2: tests
#include "task2.hpp" // task2::select, task2::select_union
#include "iue-rnd/random.hpp" // iue::rnd::UniformValue
#include <algorithm> // std::sort
#include <array> // std::array
#include <cassert> // assert
#include <cmath> // std::sqrt
#include <iostream> // std::cout, std::endl
#include <numbers> // std::numbers::pi
int main() {
using namespace task2;
std::vector<Vec2d> vertices;
// upper diagonal halfspace region
auto upper_diagonal_halfspace = [](const Vec2d& coord) -> bool {
auto [x, y] = coord;
if (y > x && std::abs(x - y) > 1e-9)
return true;
return false;
};
{ // adding random vertices in upper diagonal halfspace
auto gen = iue::rnd::UniformValue(-1.0, 1.0);
for (int n = 0; n != 1e2; ++n) {
std::array<double, 2> xy{gen(), gen()};
std::ranges::sort(xy);
vertices.push_back({xy});
}
}
// testing task::select
{
auto subset = task2::select(vertices, upper_diagonal_halfspace, false);
assert(subset.size() == vertices.size());
}
{
auto subset = task2::select(vertices, upper_diagonal_halfspace, true);
assert(subset.size() == 0);
}
// testing task::select_union
// circular region around center(1,1) with radius 1
Circle circle = {{1, 1}, 1};
auto circle_c11_r1 = [&circle](const Vec2d& coord) -> bool {
auto [c, r] = circle;
auto [cx, cy] = c;
auto [x, y] = coord;
return std::sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) < r ? true : false;
};
{ // adding random vertices inside the circle
auto [center, r] = circle;
auto gen_angle = iue::rnd::UniformValue(0, std::numbers::pi * 2);
auto gen_radius = iue::rnd::UniformValue(0, r - 1e-9);
for (int n = 0; n != 1e3; ++n) {
double angle = gen_angle();
double radius = gen_radius();
std::array<double, 2> xy{center[0] + std::sin(angle) * radius, center[1] + std::cos(angle) * radius};
vertices.push_back({xy});
}
}
{
auto subset = task2::select_union(vertices, {upper_diagonal_halfspace, circle_c11_r1}, false);
assert(subset.size() == vertices.size());
}
{
auto subset = task2::select_union(vertices, {upper_diagonal_halfspace, circle_c11_r1}, true);
assert(subset.size() == 0);
}
std::cout << "task2.test.cpp: all asserts passed" << std::endl;
return 0;
}