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

60 lines
2.2 KiB
C++

/// @file
/// @brief Task2: member function definitions/implementations
#include "task2.hpp" // task2::select, task2::select_union
#include <array> // std::array
#include <functional> // std::function
#include <unordered_set> // std::unordered_set
#include <vector> // std::vector
#include <algorithm>
namespace task2 {
/// @brief Selects the subset of vertices for which a boolean function evaluates to true
/// @param vertices Two-dimensional vertices to select from
/// @param region Boolean function to evaluate if a vertex is selected
/// @param invert Inverts the selection process if set to true
/// @return Indices of the selected vertices
std::unordered_set<size_t> select(const std::vector<Vec2d>& vertices, const Region& region, bool invert) {
std::unordered_set<size_t> selected_indices;
for (size_t i = 0; i < vertices.size(); ++i) {
const bool isSelected = region(vertices[i]);
if ((isSelected && !invert) || (!isSelected && invert)) {
selected_indices.insert(i);
}
}
return selected_indices;
}
/// @brief Selects the subset of vertices for which ANY of a sequence of boolean functions evaluates to true
/// @param vertices Two-dimensional vertices to select from
/// @param regions Sequence of boolean functions to evaluate
/// @param invert Inverts the selection process if set to 'true'
/// @return Indices of the selected vertices
std::unordered_set<size_t> select_union(const std::vector<Vec2d>& vertices, const std::vector<Region>& regions, bool invert) {
std::unordered_set<size_t> selected_indices;
for (size_t i = 0; i < vertices.size(); ++i) {
bool isSelected = false;
// Check if any region function evaluates to true
for (const Region& region : regions) {
isSelected = isSelected || region(vertices[i]);
if (isSelected && !invert) {
// Exit inner loop if selected and not inverting
break;
}
}
if (isSelected && invert) {
// Add to selected set only if inverting and not already selected
} else {
// Add to selected set for normal selection or inverted with not yet selected
selected_indices.insert(i);
}
}
return selected_indices;
}
} // namespace task2