【问题标题】:Using boost geometry to find intersection of line segments使用 boost 几何找到线段的交点
【发布时间】:2020-07-27 13:17:52
【问题描述】:

我正在尝试将 boost 几何方法 intersects 与我自己的点类一起使用,成功注册到 boost 几何库。

boost 文档 (https://www.boost.org/doc/libs/1_73_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection/intersection_3.html) 说我可以使用点向量作为输出参数。所以我写了这个:

#include <iostream>
#include <deque>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>

namespace bg = boost::geometry;
using namespace std;

class cxy
{
public:
    double x;
    double y;
    cxy( double X, double Y )
        : x( X )
        , y( Y )
    {

    }
    /// boost geometry insists on a default constructor
    cxy()
        : cxy(0,0)
    {

    }
};

BOOST_GEOMETRY_REGISTER_POINT_2D( cxy, double, bg::cs::cartesian, x, y )
typedef bg::model::segment<cxy> segment_t;

int main()
{
    cxy a(0,0);
    cxy b(1,1);
    cxy c(1,0);
    cxy d(0,1) ;

    std::vector<cxy> out;

    //////////////// this compiles

    bg::intersection(segment_t{a, b}, segment_t{c, d}, out);

    //////////////// this does not!!!

    segment_t ab( a, b );
    segment_t cd( c, d );
    bg::intersects( ab, cd, out );

    return 0;
}

要明确:我的问题是我在 intersectionintersects 之间感到困惑

以下代码编译并产生预期的结果:

#include <iostream>
#include <deque>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>

namespace bg = boost::geometry;
using namespace std;

class cxy
{
public:
    double x;
    double y;
    cxy( double X, double Y )
        : x( X )
        , y( Y )
    {

    }
    /// boost geometry insists on a default constructor
    cxy()
        : cxy(0,0)
    {

    }
};

BOOST_GEOMETRY_REGISTER_POINT_2D( cxy, double, bg::cs::cartesian, x, y )
typedef bg::model::segment<cxy> segment_t;

int main()
{
    cxy a(0,0);
    cxy b(1,1);
    cxy c(1,0);
    cxy d(0,1) ;

    segment_t ab( a, b );
    segment_t cd( c, d );
    std::vector<cxy> out;
    if( ! bg::intersection( ab, cd, out ) ) {
       std::cout << "no intersection\n";
       return 1;
    }
    std::cout << "intersection at " << out[0].x <<" " << out[0].y << "\n";

    return 0;
}

【问题讨论】:

    标签: c++ boost-geometry


    【解决方案1】:

    你在问“intersectsb 是否”。

    但是,您的第三个论点表明您想改为询问“intersection”:

    Live On Coliru

    #include <boost/geometry.hpp>
    #include <boost/geometry/geometries/register/point.hpp>
    #include <boost/geometry/geometries/segment.hpp>
    #include <iostream>
    
    namespace bg = boost::geometry;
    using namespace std;
    
    struct cxy {
        double x = 0;
        double y = 0;
        cxy(double X, double Y) : x(X), y(Y) {}
        cxy() = default;
    };
    
    BOOST_GEOMETRY_REGISTER_POINT_2D(cxy, double, bg::cs::cartesian, x, y)
    using segment_t = bg::model::segment<cxy>;
    using points_t = bg::model::multi_point<cxy>;
    
    int main() {
        cxy a{0, 0}, b{1, 1}, c{1, 0}, d{0, 1};
        std::vector<cxy> out;
        bg::intersection(segment_t{a, b}, segment_t{c, d}, out);
    
        // for output, use a multipoint model or register your vector as one
        points_t pts;
        bg::intersection(segment_t{a, b}, segment_t{c, d}, pts);
        std::cout << bg::wkt(pts) << "\n";
    }
    

    打印

    MULTIPOINT((0.5 0.5))
    

    【讨论】:

    • 多么奇怪啊!如果段是在参数列表中构造的,它会编译,但如果它们是在调用之前构造的,则不会编译。你能解释一下发生了什么吗? (我已经编辑了我的问题以显示奇怪)
    • 仔细阅读。我把它拼出来了。带有超链接:)
    • 抱歉,我之前时间不够用:intersects != intersection。 (您的out 参数被意外解释为a strategy for the intersects predicate
    • 哦哦!很简单!。我错过了答案,因为被所有其他细节分心。我的错,但一条线就可以做到“你应该叫 Intersection not intersects”
    • (另外,我花了几分钟才发现,所以不要难过)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2017-09-26
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多