如何找到包含所有给定盒子的盒子
How can I find a box that encompasses all given boxes?
我有一系列增强几何框类型,并希望找到包含所有这些对象的框的尺寸。
我注意到提升几何提供了包含函数,它似乎可以满足我对一般几何概念的要求,但我不知道如何为一系列盒子执行此操作。
基本上我只需要自己滚动,但我想知道是否可以简单地将一系列盒子变成"几何体",以便我可以简单地应用 envelope
函数。这是我目前写的:
// elsewhere in my code:
using Location = boost::geometry::model::d2::point_xy<double>;
using Box = boost::geometry::model::box<Location>;
// calculate the smallest box that fully encompasses all provided boxes
template <template <typename...> class IterableContainer>
Box Envelope(const IterableContainer<Box>& sequence)
{
Location minCorner(
std::numeric_limits<double>::max(),
std::numeric_limits<double>::max());
Location maxCorner(
std::numeric_limits<double>::lowest(),
std::numeric_limits<double>::lowest());
for (auto& box : sequence)
{
if (box.min_corner().x() < minCorner.x())
minCorner.x() == box.min_corner().x();
if (box.min_corner().y() < minCorner.y())
minCorner.y() == box.min_corner().y();
if (box.max_corner().x() > maxCorner.x())
maxCorner.x() == box.max_corner().x();
if (box.max_corner().y() > maxCorner.y())
maxCorner.y() == box.max_corner().y();
}
return Box(minCorner, maxCorner);
}
您要查找的函数称为 std::accumulate
。你需要给它一个盒子联合函数。
using Location = boost::geometry::model::d2::point_xy<double>;
using Box = boost::geometry::model::box<Location>;
double pinfi = std::numeric_limits<double>::max();
double ninfi = std::numeric_limits<double>::lowest();
Box u = std::accumulate(container.begin(), container.end(),
Box(Location(pinfi,pinfi), Location(ninfi,ninfi)),
[](const Box& a, const Box& b) {
return Box(
Location(
std::min(a.min_corner().x(),b.min_corner().x()),
std::min(a.min_corner().y(),b.min_corner().y())),
Location(
std::max(a.max_corner().x(),b.max_corner().x()),
std::min(a.max_corner().y(),b.max_corner().y())));
});
更新:此函数的构建块已经存在于 boost::geometry 中。以下是完整的测试代码:
template <typename T>
Box box_encompass (T beg, T end)
{
return std::accumulate(beg, end, boost::geometry::make_inverse<Box>(),
[](Box a, const Box& b) -> Box {
boost::geometry::expand(a,b);
return a;
});
}
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 找不到QtResource文件中的文件
- Python中的for循环与C++有何不同
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",