面对一些路径规划,矢量编辑和界面UI方面的项目时,平面几何的计算功能是非常常见的,也是必备的。本文介绍一个成名已久的开源库,Boost中Geometry,阅读之前,希望读者对C++模板编程有一定程序的了解,推荐大家先阅读博主写的函数模板和类模板。这样阅读本文知识来讲就不会有什么问题。学习Geometry前,读者可以在自己的VS上装上一个非常实用的插件GraphicalDebugging。只需要在VS工具菜单下,扩展与更新,联机,搜索GraphicalDebugging,下载安装,插件大概304k,很容易下载完成,安装后重启VS;然后在视图其它窗口中,就可以找到查看的Geometry Watch,Graphical Watch,Plot Watch三个窗口菜单。
在这里插入图片描述

1.创建多边形

  首先是给读者简单示范一下多边形的创建及插件的使用。代码如下:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/polygon.hpp>
int main()
{
	typedef boost::geometry::model::point<float, 2, boost::geometry::cs::cartesian> Point;
	typedef boost::geometry::model::polygon<Point, false, false> Polygon; // ccw, open polygon

	//创建多边形
	Polygon p;
	for (float a = 0; a < 6.28316f; a += 1.04720f)
	{
		float x = int(10 * ::cos(a))*0.1f;
		float y = int(10 * ::sin(a))*0.1f;
		p.outer().push_back(Point(x, y));
	}	
	return 0;
}

在这里插入图片描述
  调试时在左边下面表格中输入对应变量名称即可查看图形,预览图形。

2.常用类型的定义

  在几何图形计算中,有点,线,多边形等许多非常常见的概念,在使用这个几何库之前需要先做了解。一般定义代码如下:

#include <boost/geometry.hpp>
#include <boost/geometry/core/point_type.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,表示逆时针存储点,坐标系为正常向上向右为正的笛卡尔坐标系
typedef bg::model::ring<DPoint, false> DRing; //环
typedef bg::model::polygon<DPoint, false> DPolygon; //多边形
#define A_PI 3.141592653589793238462643383279502884197
int main()
{
	//创建点
	DPoint pt1(0, 0), pt2(10,10);

	//创建线段
	DSegment ds;
	ds.first = pt1;
	ds.second = pt2;

	//创建多段线
	DLineString dl;
	dl.push_back(DPoint(0, 0));
	dl.push_back(DPoint(15, 8));
	dl.push_back(DPoint(8, 13));
	dl.push_back(DPoint(13, 16));

	//创建矩形
	DBox db(pt1,pt2);

	//创建环
	DRing dr;
	dr.push_back(DPoint(0, 0));
	dr.push_back(DPoint(1, 2));
	dr.push_back(DPoint(3, 4));
	dr.push_back(DPoint(5, 6));	

	//创建多边形
	DPolygon p;
	for (double a = 0; a < 2*A_PI; a += 2*A_PI/18)
	{
		double x = ::cos(a)*10.0f;
		double y = ::sin(a)*10.0f;
		p.outer().push_back(DPoint(x, y));		
	}
	return 0;
}

  读者可以在插件里查看下对应图形。增强对基本几何元素的理解。后面一篇博文会正式介绍这个库的常用几何计算,感兴趣的读者可以去查阅一下。或者直接使用。

3.作者答疑

  如有疑问,请留言。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐