Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

class Font { // шрифт символа

public:

enum Font_type {

helvetica=FL_HELVETICA,

helvetica_bold=FL_HELVETICA_BOLD,

helvetica_italic=FL_HELVETICA_ITALIC,

helvetica_bold_italic=FL_HELVETICA_BOLD_ITALIC,

courier=FL_COURIER,

courier_bold=FL_COURIER_BOLD,

courier_italic=FL_COURIER_ITALIC,

courier_bold_italic=FL_COURIER_BOLD_ITALIC,

times=FL_TIMES,

times_bold=FL_TIMES_BOLD,

times_italic=FL_TIMES_ITALIC,

times_bold_italic=FL_TIMES_BOLD_ITALIC,

symbol=FL_SYMBOL,

screen=FL_SCREEN,

screen_bold=FL_SCREEN_BOLD,

zapf_dingbats=FL_ZAPF_DINGBATS

};

Font(Font_type ff):f(ff) { }

Font(int ff) :f(ff) { }

int as_int const { return f; }

private:

int f;

};

Стиль определения класса

Font
совпадает со стилями определения классов
Color
(см. раздел 13.4) и
Line_style
(см. раздел 13.5).

13.12. Класс Circle

Просто для того чтобы показать, что не все фигуры в мире являются прямоугольными, мы создали классы

Circle
и
Ellipse
. Объект класса
Circle
определяется центром и радиусом.

struct Circle:Shape {

Circle(Point p, int rr); // центр и радиус

void draw_lines const;

Point center const;

int radius const { return r; }

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 {

// центр, минимальное и максимальное расстояние от центра

  • Читать дальше
  • 1
  • ...
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: