Boost库-功能介绍-Geometry-图形开发库-计算几何-常用功能封装-GraphicalDebugging(一)
文章目录1.创建多边形2.常用类型的定义3.作者答疑 面对一些路径规划,矢量编辑和界面UI方面的项目时,平面几何的计算功能是非常常见的,也是必备的。本文介绍一个成名已久的开源库,Boost中Geometry,阅读之前,希望读者对C++模板编程有一定程序的了解,推荐大家先阅读博主写的函数模板和类模板。这样阅读本文知识来讲就不会有什么问题。学习Geometry前,读者可以在自己的VS上装上一个非常实
·
面对一些路径规划,矢量编辑和界面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.作者答疑
如有疑问,请留言。
更多推荐
所有评论(0)