Шрифт:
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 {
// центр, минимальное и максимальное расстояние от центра