如何使用Boost获得2D点的凸包面积?

Posted

技术标签:

【中文标题】如何使用Boost获得2D点的凸包面积?【英文标题】:How to get area of convex hull of 2D points using Boost? 【发布时间】:2020-05-22 16:24:24 【问题描述】:

我是 boost 新手,我尝试的所有操作都会导致屏幕出现编译器错误。这是我最近的尝试:

#include <boost/geometry/algorithm/convex_hull.hpp>
#include <boost/geometry/algorithm/area.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/multi_point.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/boost_tuple.hpp>

namespace bg = boost::geometry
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)

double getHullArea(std::vector<double> x, std::vector<double> y) 
  typedef boost::tuple<double,double> point;
  typedef bg::model::multi_point<point> points;
  points p;
  for (size_t i=0; i<x.size(); i++) 
    bg::append(p, point(x[i],y[i]));
  
  bg::model::polygon hull;
  bg::convex_hull(p, hull);
  return bg::area(hull);

我知道有一些巧妙的方法可以避免多点,但我想了解我在使用这种基本方法时做错了什么。错误出现在 convex_hull 调用中,可能与我定义 hull 的方式有关。

编辑:添加了我在收到错误时使用的包含。

【问题讨论】:

有什么错误? 没有什么对我有意义或指向任何具体的东西。它返回到 boost hpp 文件。示例:“在 'struct::boost::geometry::strategy::not_implemented 中没有名为 'point_type' 的类型”。它在另一台机器上,所以我不能全部粘贴进去。 这可能对您没有意义,但不应忽略错误消息,请将它们包含在问题中 代码在非联网机器上。如果可以的话,我会粘贴它们。底线错误指向convex_hull_concept.hpp,第42、45和48行。它们都以我之前的评论“未实现”结尾。 当我为polygon 添加模板参数时没有错误:godbolt.org/z/gNGc_5。您需要包含错误,否则我们无法知道您得到了什么错误 【参考方案1】:

问题在于包含。 &lt;boost/geometry.hhp&gt; 必须包含在内。这有效:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/multi_point.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/boost_tuple.hpp>

namespace bg = boost::geometry
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)

double getHullArea(std::vector<double> x, std::vector<double> y) 
  typedef boost::tuple<double,double> point;
  typedef bg::model::multi_point<point> points;
  points p;
  for (size_t i=0; i<x.size(); i++) 
    bg::append(p, point(x[i],y[i]));
  
  bg::model::polygon hull;
  bg::convex_hull(p, hull);
  return bg::area(hull);

【讨论】:

以上是关于如何使用Boost获得2D点的凸包面积?的主要内容,如果未能解决你的问题,请参考以下文章

1254C

如何获得特定点的核密度估计值?

如何通过 Boost.MPI 发送 2d Boost.MultiArray 的子数组?

计算几何

如何获得世界空间中二维点的射线方程

[2018.3.26集训]yja-伪模拟退火