Читаем Программирование полностью

  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 является то, что в нем хранится не центр, а левая верхняя точка угла квадрата, окаймляющего окружность. Можно было бы хранить и центр окружности, но мы выбрали вариант, позволяющий библиотеке FLTK оптимизировать процесс рисования окружности. Это еще один пример того, как с помощью класса можно создать другое (предположительно, более точное) представление понятия, для реализации которого он предназначен.


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(), рисующей окружность. Первые два аргумента задают левый верхний угол, вторые два — ширину и высоту наименьшего прямоугольника, окаймляющего окружность, а последние два аргумента задают начальный и последний углы. Для того чтобы нарисовать окружность, нужно обойти вокруг ее центра все 360 градусов, но с помощью функции fl_arc() можно нарисовать только часть окружности (и часть эллипса); см. упр. 1. 

13.13. Класс Ellipse

Эллипс похож на окружность, но он определяется большой и малой осями, а не радиусом. Иначе говоря, для того чтобы определить эллипс, мы должны задать координаты центра, а также расстояние от центра до точки на оси x и расстояние от центра до точки на оси y.


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);

}


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже