簡體   English   中英

使用 boost 幾何找到線段的交點

[英]Using boost geometry to find intersection of line segments

我正在嘗試使用boost幾何方法與我自己的點class intersects ,成功注冊到boost幾何庫。

升壓文檔( https://www.boost.org/doc/libs/1_73_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection/intersection_3.html )說我可以使用點向量output 參數。 所以我寫了這個:

#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;
}

你在問“a是否與b 相交”。

但是,您的第三個論點表明您想改為詢問“ 交集”:

住在科利魯

#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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM