Для того чтобы идентифицировать результаты, мы изменили метку экрана на строку "
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), а метку сделали темно-красной.
На самом деле мы не считаем удачной идею присваивать разные цвета осям 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
), диапазон изменения входных значений, а также указать некоторую информацию, чтобы график поместился в окне (масштабирование).
Теперь кривая будет заканчиваться на краю окна. Точки, изображенные за пределами окна, игнорируются системой графического пользовательского интерфейса и остаются невидимыми.
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). Итак, мы получаем следующий результат.
12.7.6. Прямоугольник
Экран — это прямоугольник, окно — это прямоугольник и лист бумаги — это прямоугольник. Фактически огромное количество фигур являются прямоугольниками (или прямоугольниками с закругленными углами), потому что это простейшая фигура. Например, его легко описать (координаты левого верхнего угла, ширина и высота, или координаты левого верхнего и правого нижнего углов), как в нем, так и за его пределами легко задать местоположение точки. Кроме того, его можно легко и быстро нарисовать на экране. По этой причине большинство высокоуровневых графических библиотек эффективнее работают с прямоугольниками, чем с любыми другими замкнутыми фигурами. Следовательно, целесообразно описать прямоугольник с помощью отдельного класса
Rectangle
, отделив его от класса
Polygon
. Класс
Rectangle
характеризуется координатами верхнего левого угла, шириной и высотой.
Rectangle r(Point(200,200), 100, 50); // левый верхний угол,
// ширина, высота
win.attach(r);
win.set_label("Canvas #6");
win.wait_for_button;
Этот фрагмент открывает на экране следующее окно.
Обратите, пожалуйста, внимание на то, что нарисовать ломаную, соединяющую четыре точки, для создания объекта класса
Rectangle
еще недостаточно. Легко можно создать объект класса
Closed_polyline
, который на экране выглядит как объект класса
Rectangle
(можно даже создать объект класса
Open_polyline
, который будет выглядеть точно так же).
Closed_polyline poly_rect;
poly_rect.add(Point(100,50));
poly_rect.add(Point(200,50));
poly_rect.add(Point(200,100));
poly_rect.add(Point(100,100));
win.attach(poly_rect);
Изображение (image) объекта
poly_rect
на экране действительно является прямоугольником. Однако объект класса
poly_rect
в памяти не является объектом класса
Rectangle
и не “знает” ничего о прямоугольниках. Проще всего это доказать, попытавшись добавить новую точку.