【问题标题】:Initializing a polygon in boost::geometry在 boost::geometry 中初始化多边形
【发布时间】:2010-11-29 06:32:05
【问题描述】:

我是建议包含在 boost 中的通用几何库的新手:

http://geometrylibrary.geodan.nl/

我有两个向量 vector<int> Xb, Yb 我正在尝试从中创建一个多边形。我正在尝试按照以下代码 sn-p 获得一些东西:

 polygon_2d P;

 vector<double>::const_iterator xi;
 vector<double>::const_iterator yi;

 for (xi=Xb.begin(), yi=Yb.begin(); xi!=Xb.end(); ++xi, ++yi)
  P.push_back (make<point_2d>(*xi, *yi));

上面的代码不起作用,抱怨P没有push_back成员函数。如何从坐标为vector&lt;int&gt; Xb,vector&lt;int&gt; Yb 的点初始化多边形?

【问题讨论】:

  • 快速说明一下,您提到的特定库很可能会在审查过程中幸存下来。你今天最好的选择是为通用多边形裁剪器库编写一个轻量级的 C++ 包装器,因为提出的 2D 多边形操作提交中没有一个能达到 GPC 提供的性能。
  • 感谢您的建议,Beh。 GPC 似乎是一个不错的库,但它似乎缺少一个对我来说很重要的功能——即计算多边形面积的能力。
  • Dzhelil,幸运的是,面积算法自己实现很简单。 alienryderflex.com/polygon_area
  • @Beh Tou Cheh - 供您和其他人参考,它幸存下来并成为 Boost C++ 库的一部分。
  • 现在它已作为 Boost.geometry 包含在 Boost 中

标签: c++ boost polygon boost-geometry


【解决方案1】:
append(P, make<point_2d>(*xi, *yi));

【讨论】:

  • 谢谢,这解决了上面的问题。但是,现在我遇到了另一个。尝试将一个 polygon_2d 与另一个 polygon_2d 相交会返回错误。这些示例仅显示了如何在 box_2d 和 polygon_2d 之间进行交集。多边形之间是否可能相交?
【解决方案2】:

这是您在基里尔的回答下方作为评论提出的原始问题的扩展示例:多边形之间是否可能相交?

是的,Boost.Geometry (aka GGL) 支持多边形-多边形相交

#include <iostream>
#include <vector>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/cartesian2d.hpp>
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>

using namespace boost::geometry;

int main(void)
{
    // Define a polygons and fill the outer rings.
    polygon_2d a;
    {
        const double c[][2] = {
            {160, 330}, {60, 260}, {20, 150}, {60, 40}, {190, 20}, {270, 130}, {260, 250}, {160, 330}
        };
        assign(a, c);
    }
    correct(a);
    std::cout << "A: " << dsv(a) << std::endl;

    polygon_2d b;
    {
        const double c[][3] = {
            {300, 330}, {190, 270}, {150, 170}, {150, 110}, {250, 30}, {380, 50}, {380, 250}, {300, 330}
        };
        assign(b, c);
    }
    correct(b);
    std::cout << "B: " << dsv(b) << std::endl;

    // Calculate interesection
    typedef std::vector<polygon_2d > polygon_list;
    polygon_list v;

    intersection_inserter<polygon_2d>(a, b, std::back_inserter(v));
    std::cout << "Intersection of polygons A and B" << std::endl;
    for (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << dsv(*it) << std::endl;
    }

    return 0;
}

Here 是结果(相交的多边形向南移动以获得更好的可见性):

我希望它对你有用。

【讨论】:

    【解决方案3】:

    你也可以使用元组来初始化多边形

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

    boost::geometry::assign_points(
        polygon, boost::assign::tuple_list_of
            (300, 330) (190, 270) (150, 170) (150, 110) (250, 30) (380, 50)
            (380, 250) (300, 330)
    );
    

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多