Boost::geometry::intersection 与 C++

Posted

技术标签:

【中文标题】Boost::geometry::intersection 与 C++【英文标题】:Boost::geometry::intersection with C++ 【发布时间】:2017-09-07 20:31:35 【问题描述】:

我是土木工程专业的博士生,最近开始用 C++ 编写代码,基本上我对获得两个多边形的重叠或相交区域感兴趣,这两个多边形代表两个土壤颗粒的投影。

我进行了很多搜索,发现 boost geometry 对我来说是最好的解决方案。我也对我面临的具体问题进行了大量搜索,但我无法解决我的问题。

问题来了,我用的软件叫PFC3D(粒子流代码)。我必须使用 microsoft visual studio 2010 与该软件交互并编译 DLL 文件以在 PFC 中运行它。

我的代码运行良好,没有重叠区域。这是代码:

// Includes for overlapping
#include <boost/geometry.hpp>
#include <boost/geometry/core/point_type.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/register/point.hpp>enter code here
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon;
polygon poly1, poly2;
poly1 0.0,  0.0, 0.0, 1.0, 1.0, 1.0, 1.0,  0.0, 0.05,  0.0;
poly2 0.5, -0.5, 0.5, 0.5, 1.5, 0.5, 1.5, -0.5,  0.5, -0.5;
std::deque<polygon> output;
boost::geometry::intersection(poly1, poly2, output);
double area = boost::geometry::area(output);

我得到的错误是在分配 poly1 和 poly2 坐标。 希望你能在这方面有所帮助。谢谢!

【问题讨论】:

你使用的是什么版本的 boost? 感谢您的回复。我正在使用 boost_1_65_0 【参考方案1】:

嗯。 identifier 仅在 identifier 是类型名时才有效。

如果你想要统一初始化,你可以使用 开始构造函数参数列表,并将每个参数环包装在一组额外的 中:

polygon poly1    0.0, 0.0 ,  0.0, 1.0 ,  1.0, 1.0 ,  1.0, 0.0 ,  0.05, 0.0    ;
polygon poly2    0.5, -0.5 ,  0.5, 0.5 ,  1.5, 0.5 ,  1.5, -0.5 ,  0.5, -0.5    ;

接下来,area 不期望是多面体,所以写一个循环:

double area = 0;
for (auto& p : output)
    area += boost::geometry::area(p);

我是否可以建议查看 dsv 解析输入:

polygon poly1, poly2;
bg::read<bg::format_wkt>(poly1, "POLYGON((0 0,0 1,1 1,1 0,0.05 0,0 0))");
bg::read<bg::format_wkt>(poly2, "POLYGON((0.5 -0.5,0.5 0.5,1.5 0.5,1.5 -0.5,0.5 -0.5))");

现场演示:Live On Coliru

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/algorithms/area.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

namespace bg = boost::geometry;
namespace bgm = bg::model;
typedef bgm::polygon<bgm::d2::point_xy<double> > polygon;

int main() 
    polygon poly1, poly2;
    bg::read<bg::format_wkt>(poly1, "POLYGON((0 0,0 1,1 1,1 0,0.05 0,0 0))");
    bg::read<bg::format_wkt>(poly2, "POLYGON((0.5 -0.5,0.5 0.5,1.5 0.5,1.5 -0.5,0.5 -0.5))");

    std::cout << bg::wkt(poly1) << "\n";
    std::cout << bg::wkt(poly2) << "\n";
    std::deque<polygon> output;
    bg::intersection(poly1, poly2, output);


    double area = 0;
    for (auto& p : output)
        area += bg::area(p);

【讨论】:

谢赫...感谢您提供这些重要信息。在定义多边形的点时,例如: bg::read<:format_wkt>(poly1, "POLYGON((0 0,0 1,1 1,1 0,0.05 0,0 0))") ... ...在我看来,多边形顶点的输入是字符串,这意味着我们无法更新它们。我的代码需要在每个周期更新每个多边形顶点。我的意思是我需要将多边形初始化为可以修改的点。 .....我尝试使用第一种方法,polygon poly1 0.0, 0.0 , 0.0, 1.0 , 1.0, 1.0 , 1.0, 0.0 , 0.05, 0.0 ,但是它也没有工作 当然是first approach works。您使用的是 C++11 编译器吗?顺便说一句,“更新要点”的需要是完全为什么我建议从某个地方阅读它们。我的意思是,在您的代码中,您必须重新编译以“更新一个点”。 哦,嘿,Coliru 不再编译太慢了:same 我正在使用 Microsoft Visual Studio 2010 来编译我的代码。不知道2010版是否支持C++11编译器 哦,好吧。我及时赶火车给你做这个:rextester.com/ENSD31608。顺便说一句,更有理由从代码之外的其他东西中获取您的输入。

以上是关于Boost::geometry::intersection 与 C++的主要内容,如果未能解决你的问题,请参考以下文章