#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