60 lines
2.2 KiB
C++
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
|