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


Boost.Geometry是一个强大的C++,用于处理几何形状的操作,如点、线、面等。它并不像某些软件包那样直接通过包管理器安装,因为它是Boost的一部分,而Boost是一个源码,需要手动下载并构建。 以下是安装步骤: 1. **获取源码**: - 访问Boost官网(https://www.boost.org/),找到“Download”选项,选择最新稳定版本,然后进入Geometry所在的子目录(例如`libs/geometry`)。 2. **下载源码**: 下载对应平台的源文件,通常有`.tar.gz`或`.zip`格式。 3. **解压和配置**: 解压缩下载的文件,并创建一个构建目录(比如`boost_1_76_0`,假设你下载的是1.76版本)。然后,进入该目录运行命令`bootstrap.sh`(Linux/Mac)或`bootstrap.bat`(Windows)来进行预配置。 4. **自定义配置**: 进入`bjam`目录(`tools/build/v2`下的`jamroot.jam`所在目录),可以编辑`user-config.jam`文件来设置特定于你的项目的编译选项。例如,添加`using gcc : : : <variant>release ;`来指定GCC编译器和编译模式。 5. **构建和安装**: 使用`bjam`编译,命令通常是`bjam install`。这个过程可能会花费一些时间,取决于你的系统性能。完成后,Boost Geometry就会安装到你的系统路径下,通常在`include/boost`和`lib`目录中。 6. **链接**: 编译你的项目时,记得链接相应的Boost,例如`-I/path/to/boost/include` 和 `lboost_geometry`(或者依赖于你的编译器语法)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值