“Язык, не изменяющий ваш образ мышления,
изучать не стоит”.
Расхожее мнение
В главе 12 описано, что можно сделать с помощью графики и набора простых интерфейсных классов и как это сделать. В этой главе рассматриваются многие из этих классов. Она посвящена проектированию, использованию и реализации индивидуальных интерфейсных классов, таких как Point
Color
, Polygon
и Open_polyline
, а также методам их использования. В следующей главе будут изложены идеи, связанные с проектированием связанных классов, а также описаны другие их методы реализации.13.1. Обзор графических классов
Библиотеки графики и графического пользовательского интерфейса предоставляют множество возможностей. Слово “множество” означает сотни классов, часто содержащих десятки функций. Их описания, справочные руководства и документация напоминают учебники по ботанике, в которых перечислены тысячи растений, упорядоченных в соответствии с устаревшей классификацией. Это обескураживает! Обзор возможностей совершенных библиотек графики и графического пользовательского интерфейса может быть увлекательным занятием. Он может вызвать у читателей ощущения ребенка, попавшего в кондитерскую лавку и не понимающего, с чего начать и понравится ли ему то, что он выберет.
Цель нашей интерфейсной библиотеки — компенсировать шок, вызванный сложностью библиотек графики и графического пользовательского интерфейса. Мы опишем только два десятка классов с немногими операциями. Тем не менее они позволяют создавать полезные графические приложения. Кроме того, эти классы позволяют ввести ключевые понятия графики и графического пользовательского интерфейса. С их помощью читатели уже могут представлять результаты своей работы в виде простых графиков. Прочитав эту главу, вы сможете расширить спектр своих приложений и удовлетворить больше требований. Прочитав к тому же главу 14, вы освоите основные идеи и методы проектирования, которые позволят вам глубже разобраться в графических библиотеках и создать еще более сложные приложения. Этого можно достичь либо включив в свои программы описанные здесь классы, либо адаптировав другие библиотеки графики и графического пользовательского интерфейса.
Основные интерфейсные классы перечислены в следующей таблице.
Классы Function
Axis
описываются в главе 15. В главе 16 рассматриваются основные интерфейсные классы.Исходный код состоит из следующих файлов.
Кроме графических файлов, мы опишем класс, который может оказаться полезным для создания коллекций объектов класса Shape
Widget
.Читая следующие разделы, не торопитесь, пожалуйста. Они не содержат ничего такого, что не было бы совершенно очевидным, но цель этой главы — не просто продемонстрировать несколько красивых рисунков — на экране своего компьютера или телевизора вы каждый день можете увидеть более красивые изображения. Основные цели этой главы перечислены ниже.
• Продемонстрировать связь между кодом и создаваемыми рисунками.
• Научить вас читать программы и размышлять над тем, как они работают.
• Научить вас размышлять о проектировании программ, в частности о том, как выразить понятия в виде классов. Почему эти классы устроены так, а не иначе? Как еще их можно было бы написать? Вы можете принять много-много проектных решений, и в большинстве своем они будут отличаться от наших незначительно, а в некоторых случаях — кардинально.
Итак, пожалуйста, не торопитесь, иначе пропустите нечто важное и не сможете выполнить упражнения.
13.2. Классы Point и Line
Самой главной частью любой графической системы является точка. Определив это понятие, вы определите все ваше геометрическое пространство. В данной книге мы используем обычное, компьютерно-ориентированное двумерное представление точек в виде пары целочисленных координат (
x_max()
(правого края экрана); координаты y изменяются от нуля (верхнего края экрана) до y_max()
(нижнего края экрана).Как определено в файле Point.h
Point
— это просто пара чисел типа int
(координаты).struct 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.h
Shape
, подробно описанный в главе 14, и класс Line
.struct Line:Shape { // класс Line — это класс Shape,
// определенный двумя точками
Line(Point p1, Point p2); // создаем объект класса Line