基本几何对象(7)——Circle

定义Circle类,用圆心和半径表示圆。

下面给出Circle的声明。

class Circle : public Geometry
{
    private:
        Point _center;
        double _radius = 0;

    public:
        Circle() {};

        Circle(const double x, const double y, const double r);

        Circle(const Point &point, const double r);

        Circle(const Circle &circle);

        Circle &operator=(const Circle &circle);

        const Type type() const override;

        Point &center();

        const Point &center() const;

        double &radius();

        const double radius() const;

        const double area() const;

        const double length() const override;

        const bool empty() const override;

        void clear() override;

        Circle *clone() const override;

        void transform(const double a, const double b, const double c, const double d, const double e, const double f) override;

        void transform(const double mat[6]) override;

        void translate(const double tx, const double ty) override;

        void rotate(const double x, const double y, const double rad) override; // 弧度制

        void scale(const double x, const double y, const double k) override;

        AABBRect bounding_rect() const override;

        Polygon mini_bounding_rect() const override;

        Circle operator+(const Point &point) const;

        Circle operator-(const Point &point) const;

        void operator+=(const Point &point);

        void operator-=(const Point &point);
};

下面给出Circle的实现。

Circle::Circle(const double x, const double y, const double r)
    :_center(x, y)
    ,_radius(r)
{
    assert(r > 0);
}

Circle::Circle(const Point &point, const double r)
    :_center(point)
    ,_radius(r)
{
    assert(r > 0);
}

Circle::Circle(const Circle &circle)
    :Geometry(circle)
    ,_center(circle._center)
    ,_radius(circle._radius)
{}

Circle &Circle::operator=(const Circle &circle)
{
    if (this != &circle)
    {
        Geometry::operator=(circle);
        _center = circle._center;
        _radius = circle._radius;
    }
    return *this;
}

const Type Circle::type() const
{
    return Type::CIRCLE;
}

Point &Circle::center()
{
    return _center;
}

const Point &Circle::center() const
{
    return _center;
}

double &Circle::radius()
{
    return _radius;
}

const double Circle::radius() const
{
    return _radius;
}

const double Circle::area() const
{
    return Geo::PI * _radius * _radius;
}

const double Circle::length() const
{
    return 2.0 * Geo::PI * _radius;
}

const bool Circle::empty() const
{
    return _radius <= 0;
}

void Circle::clear()
{
    _radius = 0;
    _center.clear();
}

Circle *Circle::clone() const
{
    return new Circle(*this);
}

void Circle::transform(const double a, const double b, const double c, const double d, const double e, const double f)
{
    _center.transform(a,b,c,d,e,f);
    _radius *= std::abs(a);
}

void Circle::transform(const double mat[6])
{
    _center.transform(mat);
    _radius *= std::abs(mat[0]);
}

void Circle::translate(const double tx, const double ty)
{
   _center.translate(tx, ty);
}

void Circle::rotate(const double x, const double y, const double rad)
{
    _center.rotate(x, y, rad);
}

void Circle::scale(const double x, const double y, const double k)
{
    _center.scale(x, y, k);
    _radius *= k;
}

AABBRect Circle::bounding_rect() const
{
    if (_radius == 0)
    {
        return AABBRect();
    }
    else
    {
        return AABBRect(_center.x - _radius, _center.y + _radius, _center.x + _radius, _center.y - _radius);
    }
}

Polygon Circle::mini_bounding_rect() const
{
    if (_radius == 0)
    {
        return Polygon();
    }
    else
    {
        return AABBRect(_center.x - _radius, _center.y + _radius, _center.x + _radius, _center.y - _radius);
    }
}

Circle Circle::operator+(const Point &point) const
{
    return Circle(_center + point, _radius);
}

Circle Circle::operator-(const Point &point) const
{
    return Circle(_center - point, _radius);
}

void Circle::operator+=(const Point &point)
{
    _center += point;
}

void Circle::operator-=(const Point &point)
{
    _center -= point;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值