52 , m_xOrig { extent.getMinX() }
53 , m_yOrig { extent.getMaxY() }
54 , m_num_rows{ 2 * extent_tag::padding + (extent.getMaxY() > extent.getMinY() ? static_cast<size_t>(std::round(extent.getHeight() / dy)) : 0) }
55 , m_num_cols{ 2 * extent_tag::padding + (extent.getMaxX() > extent.getMinX() ? static_cast<size_t>(std::round(extent.getWidth() / dx)) : 0) } {
56 static_assert(std::is_same_v<extent_tag, bounded_extent>);
66 , m_xOrig { extent.getMinX() }
67 , m_yOrig { extent.getMaxY() }
68 , m_num_rows{ 2 * extent_tag::padding + (extent.getMaxY() > extent.getMinY() ? static_cast<size_t>(std::round(extent.getHeight() / dy)) : 0) }
69 , m_num_cols{ 2 * extent_tag::padding + (extent.getMaxX() > extent.getMinX() ? static_cast<size_t>(std::round(extent.getWidth() / dx)) : 0) }
71 static_assert(std::is_same_v<extent_tag, infinite_extent>);
80 return Grid({ 0, 0, 0, 0 }, 0, 0, geom::Envelope());
200 if (b.
getMinX() < m_extent.getMinX() || b.
getMinY() < m_extent.getMinY() || b.
getMaxX() > m_extent.getMaxX() || b.
getMaxY() > m_extent.getMaxY()) {
201 throw std::range_error(
"Cannot shrink extent to bounds larger than original.");
208 double snapped_xmin = m_extent.getMinX() +
static_cast<double>(col0 - extent_tag::padding) * m_dx;
209 double snapped_ymax = m_extent.getMaxY() -
static_cast<double>(row1 - extent_tag::padding) * m_dy;
213 if (b.
getMinX() < snapped_xmin) {
214 snapped_xmin -= m_dx;
218 if (b.
getMaxY() > snapped_ymax) {
219 snapped_ymax += m_dy;
226 size_t num_rows = 1 + (row0 - row1);
227 size_t num_cols = 1 + (col1 - col0);
234 if (num_rows > 2 && (snapped_ymax -
static_cast<double>(num_rows - 1) * m_dy <= b.
getMinY())) {
237 if (num_cols > 2 && (snapped_xmin +
static_cast<double>(num_cols - 1) * m_dx >= b.
getMaxX())) {
241 const double snapped_xmax = m_extent.getMinX() +
static_cast<double>(col0 + num_cols - extent_tag::padding) * m_dx;
242 const double snapped_ymin = m_extent.getMaxY() -
static_cast<double>(row1 + num_rows - extent_tag::padding) * m_dy;
250 calcExtentFromNewGrid ? std::max(snapped_xmin +
static_cast<double>(num_cols) * m_dx, b.
getMaxX()) : snapped_xmax,
251 calcExtentFromNewGrid ? std::min(snapped_ymax -
static_cast<double>(num_rows) * m_dy, b.
getMinY()) : snapped_ymin,
257 if (reduced_box.
getMaxX() > m_extent.getMaxX()) {
258 if (std::round(reduced_box.
getWidth() / m_dx) ==
259 std::round((m_extent.getMaxX() - reduced_box.
getMinX()) / m_dx)) {
262 throw std::runtime_error(
"Shrink operation failed.");
265 if (reduced_box.
getMinY() < m_extent.getMinY()) {
266 if (std::round(reduced_box.
getHeight() / m_dy) ==
267 std::round((reduced_box.
getMaxY() - m_extent.getMinY()) / m_dy)) {
270 throw std::runtime_error(
"Shrink operation failed.");
274 if constexpr (std::is_same_v<extent_tag, bounded_extent>) {
277 if (!calcExtentFromNewGrid) {
278 reduced.m_xOrig = m_xOrig;
279 reduced.m_yOrig = m_yOrig;
282 }
else if (!reduced.getExtent().
contains(b)) {
283 throw std::runtime_error(
"Shrink operation failed.");
289 if (!calcExtentFromNewGrid) {
290 reduced.m_xOrig = m_xOrig;
291 reduced.m_yOrig = m_yOrig;
294 }
else if (!reduced.getExtent().
contains(b)) {
295 throw std::runtime_error(
"Shrink operation failed.");