Чтение онлайн

на главную

Жанры

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

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

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
и не “знает” ничего о прямоугольниках. Проще всего это доказать, попытавшись добавить новую точку.

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6