// из двух объектов класса Points
};
Класс Line — это разновидность класса Shape. Именно это означает строка “:Shape”. Класс Shape называют Line. В принципе класс Shape содержит возможности, чтобы упростить определение класса Line. Как только мы столкнемся с конкретными фигурами, например Line или Open_polyline, то увидим, что это значит (см. главу 14).
Класс Line определяется двумя объектами класса Point. Оставляя в стороне “леса” (директивы #include и прочие детали, описанные в разделе 12.3), мы можем создать линию и нарисовать ее на экране.
// рисуем две линии
Simple_window win1(Point(100,100),600,400,"Two lines");
Line horizontal(Point(100,100),Point(200,100)); // горизонтальная
// линия
Line vertical(Point(150,50),Point(150,150)); // вертикальная
// линия
win1.attach(horizontal); // связываем их
// с экраном
win1.attach(vertical);
win1.wait_for_button(); // изобразить!
Выполнив этот фрагмент кода, получим на экране следующее изображение.
Пользовательский интерфейс предназначен для того, чтобы упростить работу, и класс Line довольно неплохо справляется с этим заданием. Не нужно быть Эйнштейном, чтобы понять, что инструкция
Line vertical(Point(150,50),Point(150,150));
создает (вертикальную) линию, соединяющую точки (150,50) и (150,150). Разумеется, существуют детали реализации, но вам необязательно знать их, чтобы создавать линии. Реализация конструктора класса Line довольно проста.
Line::Line(Point p1, Point p2) // создаем линию по двум точкам
{
add(p1); // добавляем точку p1
add(p2); // добавляем точку p2
}
Иначе говоря, конструктор просто добавляет две точки. Добавляет куда? И как объект класса Line рисуется в окне? Ответ кроется в классе Shape. Как будет описано в главе 14, класс Shape может хранить точки, определяющие линии, знает, как рисовать линии, определенные парами точек, и имеет функцию add(), позволяющую добавлять объекты в объекты класса Point. Основной момент здесь заключается в том, что определение класса Line тривиально. Большая часть работы по реализации выполняется системой, поэтому программист может сосредоточиться на создании простых классов, которые легко использовать.
С этого момента оставим в стороне определение класса Simple_window и вызовы функции attach(). Они не более чем “леса”, необходимые для завершения программы, но ничего не добавляющие к специфике объектов класса Shape.
13.3. Класс Lines
Оказывается, что мы редко рисуем отдельную линию. Как правило, мы представляем себе объекты, состоящие из многих линий, например треугольники, многоугольники, графы, лабиринты, сетки, диаграммы, графики математических функций и т.д. Одним из простейших компонентов этих составных графических объектов являются объекты класса Lines.
struct Lines:Shape { // связанные друг с другом линии
void draw_lines() const;
void add(Point p1, Point p2); // добавляем линию, заданную
// двумя точками
};
Объект класса Lines представляет собой коллекцию линий, каждая из которых определена парой объектов класса Point. Например, если бы мы рассматривали две линии из примера в разделе 13.2 как часть отдельного графического объекта, то могли бы дать такое определение:
Lines x;
x.add(Point(100,100), Point(200,100)); // первая линия: горизонтальная
x.add(Point(150,50), Point(150,150)); // вторая линия: вертикальная
В этом случае мы получили бы совершенно такой же результат (вплоть до последнего пикселя), как и в варианте с классом Line.
Единственный способ, который позволяет различить эти варианты, — создать отдельное окно и приписать ему другую метку.