void set_radius(int rr) { r=rr; }
private:
int r;
};
Использовать класс Circle
Circle c1(Point(100,200),50);
Circle c2(Point(150,200),100);
Circle c3(Point(200,200),150);
Эти инструкции рисуют три окружности разных радиусов, центры которых лежат на горизонтальной линии.
Основной особенностью реализации класса Circle
Circle::Circle(Point p, int rr) // центр и радиус
:r(rr)
{
add(Point(p.x–r,p.y–r)); // хранит левый верхний угол
}
Point Circle::center() const
{
return Point(point(0).x+r, point(0).y+r);
}
void Circle::draw_lines() const
{
if (color().visibility())
fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);
}
Обратите внимание на использование функции fl_arc()
fl_arc()
можно нарисовать только часть окружности (и часть эллипса); см. упр. 1. 13.13. Класс Ellipse
Эллипс похож на окружность, но он определяется большой и малой осями, а не радиусом. Иначе говоря, для того чтобы определить эллипс, мы должны задать координаты центра, а также расстояние от центра до точки на оси
struct Ellipse:Shape {
// центр, минимальное и максимальное расстояние от центра
Ellipse(Point p, int w, int h);
void draw_lines() const;
Point center() const;
Point focus1() const;
Point focus2() const;
void set_major(int ww) { w=ww; }
int major() const { return w; }
void set_minor(int hh) { h=hh; }
int minor() const { return h; }
private:
int w;
int h;
};
Класс Ellipse
Ellipse e1(Point(200,200),50,50);
Ellipse e2(Point(200,200),100,50);
Ellipse e3(Point(200,200),100,150);
Этот фрагмент программы рисует три эллипса с общим центром и разными осями.
Объект класса Ellipse
major()==minor()
, выглядит как окружность. Эллипс можно также задать с помощью двух фокусов и суммы расстояний от точки до фокусов. Имея объект класса Ellipse
, можем вычислить фокус. Рассмотрим пример.Point Ellipse::focus1() const
{
return Point(center().x+sqrt(double(w*w–h*h)),center().y);
}