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

на главную - закладки

Жанры

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

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

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Сердце Дракона. Том 9

Клеванский Кирилл Сергеевич
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Сердце Дракона. Том 9

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Системный Нуб 4

Тактарин Ринат
4. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб 4

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Сотник

Ланцов Михаил Алексеевич
4. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Сотник

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Не грози Дубровскому! Том II

Панарин Антон
2. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том II

Огни Эйнара. Долгожданная

Макушева Магда
1. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Эйнара. Долгожданная

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

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

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