#pragma once #include #include #include namespace VofFlow { using extent_t = std::array; using bounds_t = std::array; using dim_t = std::array; using gridCoords_t = std::array; using posCoords_t = std::array; struct StructuredCoordinates { gridCoords_t cellCoords{}; posCoords_t relativeCoords{}; }; namespace Grid { inline bool isValidExtent(const extent_t& e) { return e[0] < e[1] && e[2] < e[3] && e[4] < e[5]; } inline bool isInExtent(const extent_t& e, const gridCoords_t& c) { return c[0] >= e[0] && c[0] < e[1] && c[1] >= e[2] && c[1] < e[3] && c[2] >= e[4] && c[2] < e[5]; } inline dim_t extentDimensions(const extent_t& e) { if (isValidExtent(e)) { return {e[1] - e[0], e[3] - e[2], e[5] - e[4]}; } return {0, 0, 0}; } inline int extentNumCells(const extent_t& e) { const auto& dim = extentDimensions(e); return dim[0] * dim[1] * dim[2]; } inline bool intersect(const extent_t& a, const extent_t& b) { // VTK extent upper border marks first cell after the grid extent. Therefore, use '<' instead of '<=' to // only detect actually overlapping grid extents and not just 'touching' extents. return a[0] < b[1] && a[1] > b[0] && a[2] < b[3] && a[3] > b[2] && a[4] < b[5] && a[5] > b[4]; } inline extent_t intersection(const extent_t& a, const extent_t& b) { return { std::max(a[0], b[0]), std::min(a[1], b[1]), std::max(a[2], b[2]), std::min(a[3], b[3]), std::max(a[4], b[4]), std::min(a[5], b[5]), }; } inline bool isInBounds(const bounds_t& b, const posCoords_t& p) { return p[0] >= b[0] && p[0] < b[1] && p[1] >= b[2] && p[1] < b[3] && p[2] >= b[4] && p[2] < b[5]; } inline int isOutOfBoundsDirection(const bounds_t& b, const posCoords_t& p) { if (p[0] < b[0]) { return 0; } if (p[0] >= b[1]) { return 1; } if (p[1] < b[2]) { return 2; } if (p[1] >= b[3]) { return 3; } if (p[2] < b[4]) { return 4; } if (p[2] >= b[5]) { return 5; } return -1; } template inline std::string toString(const std::array& a) { return std::to_string(a[0]) + " " + std::to_string(a[1]) + " " + std::to_string(a[2]) + " " + std::to_string(a[3]) + " " + std::to_string(a[4]) + " " + std::to_string(a[5]); } template inline std::string toString(const std::array& a) { return std::to_string(a[0]) + " " + std::to_string(a[1]) + " " + std::to_string(a[2]); } } // namespace Grid } // namespace VofFlow