在GIS中,我们会经常碰到最小外包矩形,MBR。最小外包矩形就是包围图元,并且平行于X轴和Y轴的最小外界矩形。到底这个矩形有什么用,设想一下,一个几何体有很多顶点,我们要判断一个图形是否包含另一个图形,就要一个个点点判断,这样为大大延长处理的时间。那如果是针对矩形的判断将会见的很多。又比如在空间索引中,作为几何体图形的近似可以加快索引处理的时间。在空间查询中,例如要查找离我当前位置周围最近的几个餐厅。如果没有做空间所以,当然也行,暴力法一个个测试,直到找出所有符合条件的餐厅。有了这个MBR作为索引数据的近似,那么查询的速度也会加快,只不过在创建索引的时候要花一些时间而已。
既然这个MBR如此重要,本人在之前的代码上不断改进,终于拿出一个比较稳定的版本的最小外包矩形的代码。在此奉献给大家,希望各位也能提出代码中的问题。
头文件如下:
#include
#include
using namespace std;
class GEOMETRY_API GeoEnvelope
{
public:
//默认构造函数
GeoEnvelope();
//带参数的构造函数
GeoEnvelope(double minX,double maxX,double minY,double maxY);
//拷贝构造函数
GeoEnvelope(const GeoEnvelope& envelope);
//用两个坐标点初始化
GeoEnvelope(GeoCoordinate *coord1,GeoCoordinate *coord2);
virtual ~GeoEnvelope(void);
//判断两个最小外包矩形是否相交(计算出在内还在外)
int InterSects(const GeoEnvelope & otherEvp);
// 判断矩形是否为空
bool IsNull(void) const;
// 获取最小外包矩形的宽度
double GetWidth(void);
// 获取最小外界矩形的高度
double GetHeight(void);
// 获得矩形的中心点坐标
GeoCoordinate * Center() const;
//测试是否包含另一个MBR
bool Contains(const GeoEnvelope &env);
//判断一个点是否在该矩形中
bool Contains(const GeoCoordinate &pt);
//判断一个点是否在矩形内
bool IsPointInRect(double x,double y);
//计算两个矩形相交的部分
GeoEnvelope* Intersection(const GeoEnvelope& env);
//计算到另一个MBR的距离
double DistanceTo(GeoEnvelope &env);
//计算面积
double Area();
//计算周长
double Perimeter();
//是否包含这个点
bool Contains(double x, double y) const;
//静态函数
//判断p1,p2构成的矩形和q1,q2构成的矩形是否相交
static bool Intersects(G