Программирование. Принципы и практика использования C++ Исправленное издание, стр. 171

Программирование. Принципы и практика использования C++ Исправленное издание - _106.png

Как видим, параметр

Axis::x
задает горизонтальную линию. Кроме того, ось имеет десять делений и метку “
x axis
”. Как правило, метка объясняет, что представляет собой ось и ее деления. Естественно, ось х следует выбирать где-то ближе к нижнему краю окна. В реальной программе мы обозначили бы ширину и высоту какими-нибудь символическими константами, чтобы придать фразе “где-то ближе к нижнему краю окна” конкретный смысл, например, выраженный в виде инструкции
y_max-bottom_margin
, и не использовали бы “магические константы”, такие как 300 (см. раздел 4.3.1, раздел 15.6.2).

Для того чтобы идентифицировать результаты, мы изменили метку экрана на строку "

Canvas #2
" с помощью функции-члена
set_label()
класса
Window
.

Теперь добавим ось

y
.

Axis ya(Axis::y, Point(20,300), 280, 10, "y axis");

ya.set_color(Color::cyan);           // выбираем цвет

ya.label.set_color(Color::dark_red); // выбираем цвет текста

win.attach(ya);

win.set_label("Canvas #3");

win.wait_for_button();               // изобразить!

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

y
в голубой цвет (cyan), а метку сделали темно-красной.

Программирование. Принципы и практика использования C++ Исправленное издание - _107.png

На самом деле мы не считаем удачной идею присваивать разные цвета осям x и y. Мы просто хотели показать, как можно задать цвет фигуры и ее отдельных элементов. Использование большого количества цветов не всегда оправдано. В частности, новички часто злоупотребляют раскраской графиков, демонстрируя избыток энтузиазма и недостаток вкуса. 

12.7.4. График функции

Что дальше? Теперь у нас есть окно с координатными осями, и кажется естественным нарисовать на нем график функции. Создадим фигуру, представляющую график синуса, и свяжем ее с окном.

Function sine(sin,0,100,Point(20,150),1000,50,50); // график синуса

  // рисуем sin() в диапазоне [0:100) от (0,0) до (20,150),

  // используя 1000 точек; для масштабирования координаты

  // умножаются на 50

win.attach(sine);

win.set_label("Canvas #4");

win.wait_for_button();

Здесь объект класса

Function
с именем
sine
рисует график синуса, используя стандартную библиотечную функцию
sin()
. Детали построения графиков функций излагаются в разделе 15.3. А пока отметим, что для построения такого графика необходимо выбрать отправную точку (объект класса
Point
), диапазон изменения входных значений, а также указать некоторую информацию, чтобы график поместился в окне (масштабирование).

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

Программирование. Принципы и практика использования C++ Исправленное издание - _108.png

12.7.5. Многоугольники

График функции является примером представления данных. Подробно эта тема исследуется в главе 15. Однако в окне можно рисовать и другие объекты, например геометрические фигуры. Эти фигуры используются для создания графических иллюстраций, рисования элементов пользовательского интерфейса (например, кнопок) и просто для украшения результатов работы программы. Объект класса

Polygon
задается последовательностью точек, соединенных линиями. Первая линия соединяет первую точку со второй, вторая линия соединяет вторую точку с третьей, а последняя линия соединяет последнюю точку с первой.

sine.set_color(Color::blue);   // мы изменили цвет графика синуса

Polygon poly;   // класс Polygon - это разновидность класса Shape

poly.add(Point(300,200));      // три точки образуют треугольник

poly.add(Point(350,100));

poly.add(Point(400,200));

poly.set_color(Color::red);

poly.set_style(Line_style::dash);

win.attach(poly);

win.set_label("Canvas #5");

win.wait_for_button();

На этот раз мы изменили цвет графика синуса (

sine
) просто для того, чтобы показать, как это делается. Затем мы добавили треугольник, так же как в первом примере из раздела 12.3, представляющий собой разновидность многоугольника. Здесь мы также задали цвет и стиль. Линии в классе
Polygon
имеют стиль. По умолчанию они сплошные, но их можно сделать пунктирными, точечными и т.п. (подробнее об этом — в разделе 13.5). Итак, мы получаем следующий результат.

Программирование. Принципы и практика использования C++ Исправленное издание - _109.png

12.7.6. Прямоугольник

Экран — это прямоугольник, окно — это прямоугольник и лист бумаги — это прямоугольник. Фактически огромное количество фигур являются прямоугольниками (или прямоугольниками с закругленными углами), потому что это простейшая фигура. Например, его легко описать (координаты левого верхнего угла, ширина и высота, или координаты левого верхнего и правого нижнего углов), как в нем, так и за его пределами легко задать местоположение точки. Кроме того, его можно легко и быстро нарисовать на экране. По этой причине большинство высокоуровневых графических библиотек эффективнее работают с прямоугольниками, чем с любыми другими замкнутыми фигурами. Следовательно, целесообразно описать прямоугольник с помощью отдельного класса

Rectangle
, отделив его от класса
Polygon
. Класс
Rectangle
характеризуется координатами верхнего левого угла, шириной и высотой.

Rectangle r(Point(200,200), 100, 50); // левый верхний угол,

                                      // ширина, высота