Программирование. Принципы и практика использования C++ Исправленное издание, стр. 175
• Продемонстрировать связь между кодом и создаваемыми рисунками.
• Научить вас читать программы и размышлять над тем, как они работают.
• Научить вас размышлять о проектировании программ, в частности о том, как выразить понятия в виде классов. Почему эти классы устроены так, а не иначе? Как еще их можно было бы написать? Вы можете принять много-много проектных решений, и в большинстве своем они будут отличаться от наших незначительно, а в некоторых случаях — кардинально.
Итак, пожалуйста, не торопитесь, иначе пропустите нечто важное и не сможете выполнить упражнения.
13.2. Классы Point и Line
Самой главной частью любой графической системы является точка. Определив это понятие, вы определите все ваше геометрическое пространство. В данной книге мы используем обычное, компьютерно-ориентированное двумерное представление точек в виде пары целочисленных координат (x, y). Как указано в разделе 12.5, координаты x изменяются от нуля (левого края экрана) до
x_max()y_max()Как определено в файле
Point.hPointintstruct Point { int x, y; Point(int xx, int yy):x(xx), y(yy) { } Point() :x(0), y(0) { }};bool operator==(Point a, Point b) { return a.x==b.x && a.y==b.y; }bool operator!=(Point a, Point b) { return !(a==b); }В файле
Graph.hShapeLinestruct Line:Shape { // класс Line — это класс Shape, // определенный двумя точкамиLine(Point p1, Point p2); // создаем объект класса Line // из двух объектов класса Points};Класс
LineShape“:Shape”ShapeLineShapeLineLineOpen_polylineКласс
LinePoint// рисуем две линии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}Иначе говоря, конструктор просто добавляет две точки. Добавляет куда? И как объект класса
LineShapeShapeadd()PointLineС этого момента оставим в стороне определение класса
Simple_windowattach()Shape13.3. Класс Lines
Оказывается, что мы редко рисуем отдельную линию. Как правило, мы представляем себе объекты, состоящие из многих линий, например треугольники, многоугольники, графы, лабиринты, сетки, диаграммы, графики математических функций и т.д. Одним из простейших компонентов этих составных графических объектов являются объекты класса
Linesstruct Lines:Shape { // связанные друг с другом линии