【轉】boost庫之geometry


#include <boost/assign.hpp>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/geometries/polygon.hpp>
namespace bg = boost::geometry;
typedef bg::model::d2::point_xy<double> DPoint;
typedef bg::model::segment<DPoint> DSegment;
typedef bg::model::linestring<DPoint> DLineString;
typedef bg::model::box<DPoint> DBox;
//這里的ring就是我們通常說的多邊形閉合區域(內部不存在縷空),模板參數為true,表示順時針存儲點,為false,表示逆時針存儲點,由於MM_TEXT坐標系與傳統上的坐標系的Y軸方向是相反的,所以最后為false,將TopLeft、TopRight、BottomRight、BottomLeft、TopLeft以此存儲到ring中,以便能正確計算
typedef bg::model::ring<DPoint, false> DRing;
//polygon模板參數false,也是由上面相同的原因得出來的
typedef bg::model::polygon<DPoint, false> DPolygon;

int _tmain(int argc, _TCHAR* argv[])
{
    DPoint pt0(100, 100);
    DPoint pt1(200, 200);
    DSegment sg0(pt0, pt1);

    double dDistance = 0;
    
    //1、點到點的距離
    dDistance = bg::distance(pt0, pt1);
    //2、點到線段的距離,如果點到直線的垂足不在線段上,所計算的距離為(點到直線的距離、線段到垂足延長的距離之和)
    dDistance = bg::distance(DPoint(200, 100), sg0);
    dDistance = bg::distance(DPoint(100, 0), sg0);

    //3、判斷線段是否相交
    DSegment sg1(DPoint(0, 100), DPoint(100, 0));
    DSegment sg2(DPoint(100, 200), DPoint(200, 100));
    bool bIntersect = false;
    bIntersect = bg::intersects(sg0, sg1);
    bIntersect = bg::intersects(sg0, sg2);

    //4、求線段與線段的交點
    std::list<DPoint> lstPoints;
    bg::intersection(sg0, sg1, lstPoints);
    lstPoints.clear();
    bg::intersection(sg0, sg2, lstPoints);

    DBox rc2(DPoint(0, 0), DPoint(0, 0));

    //5、判斷box是否相交
    DBox rc(DPoint(0, 0), DPoint(200, 200));
    DBox rc0(DPoint(250, 250), DPoint(450, 450));
    DBox rc1(DPoint(100, 100), DPoint(300, 300));

    bIntersect = bg::intersects(rc, rc0);
    bIntersect = bg::intersects(rc, rc1);
    //bg::intersection(rc, rc0, container);//error

    //6、判斷box是否與LineString相交
    DLineString line0;

    line0.push_back(DPoint(10, 250));
    line0.push_back(DPoint(100, 100));
    line0.push_back(DPoint(120, -10));
    line0.push_back(DPoint(210, 200));
    bIntersect = bg::intersects(rc, line0);
    bIntersect = bg::intersects(rc0, line0);

    //7、求box與linestring的交點
    std::list<DLineString> lstLines;
    bg::intersection(rc, line0, lstLines);

    //8、點是否在box內
    DBox rc7(DPoint(0, 0), DPoint(100, 100));
    bool bInside = false;
    bInside = bg::within(DPoint(50, 50), rc7);
    bInside = bg::within(DPoint(0, 0), rc7);

    //9、判斷LineString與LineString是否相交
    DLineString line1, line2, line3;

    line1.push_back(DPoint(50, 50));
    line1.push_back(DPoint(150, 50));
    line1.push_back(DPoint(50, 200));
    line1.push_back(DPoint(150, 200));
    line2.push_back(DPoint(100, 0));
    line2.push_back(DPoint(70, 100));
    line2.push_back(DPoint(150, 210));
    line3.push_back(DPoint(200, 0));
    line3.push_back(DPoint(200, 200));

    bIntersect = bg::intersects(line1, line2);
    bIntersect = bg::intersects(line1, line3);

    //10、求LineString與LineString的交點
    lstPoints.clear();
    bg::intersection(line1, line2, lstPoints);
    lstPoints.clear();
    bg::intersection(line1, line3, lstPoints);


    //11、判斷ring與ring是否相交
    DPoint arDPoint0[6] = {DPoint(0, 0), DPoint(100, 0), DPoint(200, 100), DPoint(100, 200), DPoint(0, 200), DPoint(0, 0)};
    DPoint arDPoint1[6] = {DPoint(100, 100), DPoint(200, 0), DPoint(300, 0), DPoint(300, 200), DPoint(200, 200), DPoint(100, 100)};
    DRing r0(arDPoint0, arDPoint0 + 6);
    DRing r1(arDPoint1, arDPoint1 + 6);
    bIntersect = bg::intersects(r0, r1);

    //12、求ring與ring的交點
    lstPoints.clear();
    bg::intersection(r0, r1, lstPoints);

    DPolygon poly1;
    DPolygon poly2;
    DPolygon poly3;

    auto lstOf = boost::assign::list_of(DPoint(0, 0))(DPoint(200, 0))(DPoint(200, 200))(DPoint(0, 200))(DPoint(0, 0));
    poly1.outer().assign(lstOf.begin(), lstOf.end());
    lstOf = boost::assign::list_of(DPoint(50, 50))(DPoint(150, 50))(DPoint(150, 150))(DPoint(50, 150))(DPoint(50, 50));
    poly1.inners().push_back(lstOf);
    lstOf = boost::assign::list_of(DPoint(100, 0))(DPoint(120, 0))(DPoint(120, 200))(DPoint(100, 200))(DPoint(100, 0));
    poly2.outer().assign(lstOf.begin(), lstOf.end());
    lstOf = boost::assign::list_of(DPoint(100, 60))(DPoint(120, 60))(DPoint(120, 140))(DPoint(100, 140))(DPoint(100, 60));
    poly3.outer().assign(lstOf.begin(), lstOf.end());

    //13、判斷polygon與polygon是否相交
    bIntersect = bg::intersects(poly1, poly2);
    bIntersect = bg::intersects(poly1, poly3);

    //14、求polygon與polygon相交的區域
    std::list<DPolygon> lstPolygon;

    bg::intersection(poly1, poly2, lstPolygon);
    lstPolygon.clear();
    bg::intersection(poly1, poly3, lstPolygon);

    //15、判斷點是否在polygon內
    bInside = bg::within(DPoint(100, 100), poly1);
    bInside = bg::within(DPoint(25, 25), poly1);

    return 0;
}

轉自:http://blog.csdn.net/dc2010_/article/details/23132521


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM