📄 rectangle.h
字号:
//-< RECTANGLE.H >---------------------------------------------------*--------*
// FastDB Version 1.0 (c) 1999 GARRET * ? *
// (Post Relational Database Management System) * /\| *
// * / \ *
// Created: 26-Nov-2001 K.A. Knizhnik * / [] \ *
// Last update: 26-Nov-2001 K.A. Knizhnik * GARRET *
//-------------------------------------------------------------------*--------*
// Rectangle class
//-------------------------------------------------------------------*--------*
#ifndef __RECTANGLE_H__
#define __RECTANGLE_H__
BEGIN_FASTDB_NAMESPACE
#ifndef RECTANGLE_DIMENSION
#define RECTANGLE_DIMENSION 2
#endif
#ifndef RECTANGLE_COORDINATE_TYPE
#define RECTANGLE_COORDINATE_TYPE int4
#define RECTANGLE_AREA_TYPE int8
#endif
typedef RECTANGLE_COORDINATE_TYPE coord_t;
typedef RECTANGLE_AREA_TYPE area_t;
/**
* Multidimensional rectangle
*/
class FASTDB_DLL_ENTRY rectangle
{
public:
enum { dim = RECTANGLE_DIMENSION };
/**
* Boundary array contains coordinates of two vertices specifying rectangle
* of "dim" dimmension. First vertex has coordinaes (boundary[0], ..., boundary[dim])
* Second vertext has coordinates (boundary[dim], ..., boundary[dim*2-1])
* Precondition: for i = 0, dim : boundary[i] <= boundary[dim+i]
*/
coord_t boundary[dim*2];
/**
* Calculate distance between two rectangles
*/
friend coord_t FASTDB_DLL_ENTRY distance(rectangle const& r, rectangle const& q);
/**
* Caclulate area of rectangle
*/
friend area_t area(rectangle const& r) {
area_t area = 1;
for (int i = dim; --i >= 0; area *= r.boundary[i+dim] - r.boundary[i]);
return area;
}
/**
* Join two rectangles: construct enveloping rectangle
*/
void operator +=(rectangle const& r) {
int i = dim;
while (--i >= 0) {
boundary[i] = (boundary[i] <= r.boundary[i])
? boundary[i] : r.boundary[i];
boundary[i+dim] = (boundary[i+dim] >= r.boundary[i+dim])
? boundary[i+dim] : r.boundary[i+dim];
}
}
/**
* Join two rectangles: construct enveloping rectangle
*/
rectangle operator + (rectangle const& r) const {
rectangle res;
int i = dim;
while (--i >= 0) {
res.boundary[i] = (boundary[i] <= r.boundary[i])
? boundary[i] : r.boundary[i];
res.boundary[i+dim] = (boundary[i+dim] >= r.boundary[i+dim])
? boundary[i+dim] : r.boundary[i+dim];
}
return res;
}
/**
* Intersect two rectangles
*/
bool operator & (rectangle const& r) const {
int i = dim;
while (--i >= 0) {
if (boundary[i] > r.boundary[i+dim] ||
r.boundary[i] > boundary[i+dim])
{
return false;
}
}
return true;
}
/**
* Check if rectangle is part of other rectanle
* @return <code>true</code> if this rectangle is part of rectangle <code>r</code>
*/
bool operator <= (rectangle const& r) const {
int i = dim;
while (--i >= 0) {
if (boundary[i] < r.boundary[i] ||
boundary[i+dim] > r.boundary[i+dim])
{
return false;
}
}
return true;
}
/**
* Check if rectangle is part of other rectanle
* @return <code>true</code> if this rectangle contains rectangle <code>r</code>
*/
bool operator >= (rectangle const& r) const {
int i = dim;
while (--i >= 0) {
if (r.boundary[i] < boundary[i] ||
r.boundary[i+dim] > boundary[i+dim])
{
return false;
}
}
return true;
}
/**
* Check if rectangle is strict subpart of other rectanle
* @return <code>true</code> if this rectangle is part of rectangle <code>r</code> and not the same
*/
bool operator < (rectangle const& r) const {
return *this <= r && *this != r;
}
/**
* Check if rectangle is strict subpart of other rectanle
* @return <code>true</code> if this rectangle contains rectangle <code>r</code> and not the same
*/
bool operator > (rectangle const& r) const {
return *this >= r && *this != r;
}
/**
* Check if two rectangle are the same
*/
bool operator == (rectangle const& r) const {
int i = dim*2;
while (--i >= 0) {
if (boundary[i] != r.boundary[i]) {
return false;
}
}
return true;
}
/**
* Check if two rectangle are not the same
*/
bool operator != (rectangle const& r) const {
int i = dim*2;
while (--i >= 0) {
if (boundary[i] != r.boundary[i]) {
return true;
}
}
return false;
}
typedef bool (rectangle::*comparator)(rectangle const& r) const;
};
END_FASTDB_NAMESPACE
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -