• boost库之geometry


    环境:win732位旗舰版、VS2010旗舰版、boost 1.55.0版本、坐标系为MM_TEXT

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


  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/dongc/p/5225126.html
Copyright © 2020-2023  润新知