定义基础的Geometry类,作为所有几何类的基类,方便用Geometry指针进行统一操作:长度、空判别、清空、克隆、变换、旋转、平移、缩放、凸包、外接AABB矩形、最小外界矩形。
Geometry定义了type()虚函数,返回一个枚举值,表示Geometry指针所指向对象的实际类型,下面给出枚举值的定义。
enum Type {GEOMETRY, POINT, POLYLINE, AABBRECT, POLYGON, TRIANGLE, CIRCLE, LINE, BEZIER};
另外,在计算时还依赖如圆周率这样的常数,下面列出所有用到的常数。
const static double PI = 3.14159265358979323846;
const static double EPSILON = 1e-10;
下面给出Geometry的声明。
class Geometry
{
public:
Geometry() {};
Geometry(const Geometry &geo);
virtual ~Geometry() {};
Geometry &operator=(const Geometry &geo);
virtual const Type type() const;
virtual const double length() const;
virtual const bool empty() const;
virtual void clear();
virtual Geo::Geometry *clone() const;
virtual void transform(const double a, const double b, const double c, const double d, const double e, const double f);
virtual void transform(const double mat[6]);
virtual void translate(const double tx, const double ty);
virtual void rotate(const double x, const double y, const double rad); // 弧度制
virtual void scale(const double x, const double y, const double k);
// 凸包
virtual Polygon convex_hull() const;
// 外接AABB矩形
virtual AABBRect bounding_rect() const;
// 最小外接矩形
virtual Polygon mini_bounding_rect() const;
};
下面给出Geometry的实现。
Geometry::Geometry(const Geometry &geo) {}
Geometry &Geometry::operator=(const Geometry &geo)
{
if (this != &geo)
{
shape_fixed = geo.shape_fixed;
is_selected = geo.is_selected;
point_index = geo.point_index;
point_count = geo.point_count;
}
return *this;
}
const Type Geometry::type() const
{
return Type::GEOMETRY;
}
const double Geometry::length() const
{
return 0;
}
const bool Geometry::empty() const
{
return true;
}
void Geometry::clear(){}
Geometry *Geometry::clone() const
{
return new Geometry(*this);
}
void Geometry::transform(const double a, const double b, const double c, const double d, const double e, const double f){}
void Geometry::transform(const double mat[6]){}
void Geometry::translate(const double tx, const double ty){}
void Geometry::rotate(const double x, const double y, const double rad){}
void Geometry::scale(const double x, const double y, const double k){}
Polygon Geometry::convex_hull() const { return Polygon(); }
AABBRect Geometry::bounding_rect() const { return AABBRect(); }
Polygon Geometry::mini_bounding_rect() const { return Polygon(); }