Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота 10.doc
Скачиваний:
17
Добавлен:
27.11.2018
Размер:
230.91 Кб
Скачать

Лабораторна робота 10

Тема. Графіка в C++ Builder

Мета. Навчитись розробляти програми, які працюють з графікою; створювати картинки за допомогою графічних примітивів, або ілюстрацій, створених в графічному редакторі Завдання до роботи

Задача 1. Побудова графіка функції. Використовуючи властивість Pixels, побудувати графік функції у = 2 sin(x) e*/5. Границі діапазону зміни аргумента функції є вхідними даними. Діапазон зміни значень функції повинен обчислюватися під час роботи програми. На основі цих даних програма обчислює масштаб, який дозволяє побудувати графік таким чином, щоб він займав всю область форми, призначену для виведення графіка. Для побудови графіка використати всю доступну область форми, причому якщо під час работи програми користувач змінить размір вікна, то графік повинен виводитись заново з врахуванням реальних размірів вікна.

Задача 2. Вивести ілюстрацію, яка заходиться у файлі з розширенням bmp, jpg или ico, за допомогою компоненти image. Виконати масштабування ілюстрації у відповідності з реальними розмірами компоненти.

Задача 3.

Для формуровання складних зображень використовують бітові зображення. Бітові зображення — це, як правило, невелика картинка, якя заходиться в пам’яті комп’ютера.

Сформувати бітове зображення шляхом завантаження із bmp-файлу або із ресурсу, а також шляхом копіювання фрагменту із іншого бітового зображення, в тому числі і з поверхності форми.

Створити фоновий рисунок як багатократне виведення бітового зображення на поверхню форми.

Реалізувати програму «Політ над містом», у якій бітові зображення фону та об’єкта завантажуються із файлу. Картинки бітових зображень підготовити за допомогою графічного редактора.

Теоретічні відомості Графічні примітиви

Графічні зображення в C++ Builder можна виводити на поверхню форми (або компоненти image), якій відповідає властивість canvas. Для, того щоб на поверхні форми або компоненти image з'явилася лінія, коло, прямокутник або інший графічний елемент (примітив), необхідно для властивості Canvas застосувати відповідний метод (таблиця 1).

Наприклад, оператор Forml->Canvas->Rectangle(10,10,50,50); рисує на поверхні форми прямокутник.

Таблиця 1. Методи для рисування графічних примітивів

Метод

Опис

LineTo(x,y)

Малює лінію із поточної точки в точку із вказаними координатами

Rectangle (x1,y1,x2, y2)

Малює прямокутник, де x1, y1 і х2, у2 — координати лівого верхнього і правого нижнього кутів прямокутника. Колір межі і внутрішньої області прямокутника можуть бути різними. Замість четирьох параметрів — координат двох діагональних кутів прямокутника — методу Rectangle можно передавати один параметр — структуру типу TRect. Наступний фрагмент коду демонструє використання структури Trect:

TRect ret; // прямокутна область

ret.Top = 10;

ret.Left = 10;

ret.Bottom = 50;

ret.Right = 50;

Canvas->Rectangle(ret); // намалювати прямокуник

FillRect (x1,y1,x2,y2)

Малює зафарбований прямокутник, де x1, y1, х2, у2 — визначають координати діагональних кутів

FrameRect(x1,y1,x2,y2)

Малює контур прямокутника, x1, y1, х2, у2 — визначають координати діагональних кутів

RounRect (x1,y1,x2,y2,x3,y3)

Малює прямокутник із заокругленими кутами

Ellipse (x1,y1,x2,y2)

Малює еліпс або коло, де x1, y1, х2, у2 — координати прямокутника, всередині якого малюється еліпс або, якщо прямокутник є квадратом, коло

Polyline (points, n)

Малює ламану лінію, points— масив типу TPoint. Кожним елементом масиву є запис, полями якого є координати точки перегину ламаної; n — кількість ланок ламаної. Метод Polyline малює ламану лінію, послідовно сполучаючи прямими відрізками крапки, координати яких знаходяться в масиві: першу з другою, другу з третьою, третю з четвертою і так далі

MoveTo(х,y)

Переміщає карандаш в потрібну точку графічої поверхні

Polygon(p,n)

Малює багатокутник, де р — масив записів типу TPoint, який містить координати вершин багатокутника; n — кількість вершин.

Arc(xl,yl,х2,у2,х3,у3, х4,у4)

Метод рисує дугу — частину еліпса (кола). Параметри x1, y1, х2, у2 визначають еліпс (коло), частиною якого є дуга. Параметри х3 і у3 задають початкову, а х4 і у4 — кінцеву точку дуги. Початкова (концева) точка дуги — це точка перетину границі еліпса і прямої, проведеної із центру еліпса в точку з координатами х3 і у3(х4, у4). Метод малює дугу проти часової стрілки

Pie(x1,y1,х2,у2,х3,у3,х4,у4)

Малює сектор еліпса або круга. Параметри x1, y1, x2, y2 визначають еліпс (круг), частиною якого є сектор; х3, у3, х4 і у4 — прямі — границі сектора. Початкова точка границі співпадає з центром еліпса. Сектор вирізається проти часової стрілки віссю прямої, заданої точкою з координатами (х3, у3), до прямої, заданої точкою| з координатами (х4, у4)

Методи виводу графічних примітивів розглядають властивість canvas як деяке абстрактне полотно, на якому можна малювати (Canvas перекладається як "поверхня" для малювання). Полотно складається із окремих точок — пікселів. Положення піксел на поверхні форми характеризується горизонтальною (X) і вертикальною (Y) координатами (рис. 1).

Рис. 1. Координати точок поверхні форми

Методи рисування графічних примітивів забезпечують лише рисування. Вигляд графічного елементу визначає властивість Реn(карандаш) і Brush (пензель) тієї поверхні (Canvas), на якій рисує метод.

Олівець і пензель є властивостями об’єкта Canvas, в свою чергу є об’єктами Реn і Brush (таблиця 2, таблиця 3).

Таблиця 2. Властивості об’єкта Реn (олівець)

Властивість

Опис

Color

Колір лінії

Width

Товщину лінії (задається в пикселях)

Style

Вид лінії (psSolid—суцільна; psDash—пунктирна, довгі штрихи; psDot — пунктирна, короткі штрихи; psDashDot — пунктирна, чергування довгого і короткого штрихів; psDashDotDot — пунктирна, чергування одного довгого і двох коротких штрихів; psClear — лінія не відображується (використовується, якщо не треба зображати межу області — наприклад, прямокутника)

Таблиця 3. Властивості об’єекта Brush (кисть)

Властивість

Опис

Color

Колір зафарбовування замкнутої області

Style

Стиль заповнення області (bsSolid — суцільна заливка. Штрихування: bsHorizontal — горизонтальна; bsVertical — вертикальна; bsFDiagonal — діагональна з нахилом ліній вперед; bsBDiagonal — діагональна з нахилом ліній назад; bsCross — в клітинку; bsDiagCross — діагональна клітинка

Будь-яка картинка можуть розглядатися як сукупність графічни примітивів: точок, ліній, кіл, дуг і ін.

Текст

Виведення тексту на поверхню графічного об’єкта забезпечує метод TextOutA:

Canvas->TextOutA(x,y,TEКСТ)

Параметр ТЕКСТ задає текст. Параметри х і y визначають координати точки поверхні, в якій виконується виведення тексту.

Шрифт, який виводиться для виведення тексту, визначається значенням властивості Font відповідного об’єкта canvas. У таблиці 3 перераховані властивості об’єкта TFont.

Таблиця 3. Властивості об’єкта TFont

Властивість

Опис

Name

Назва шрифта (наприклад, Arial)

Size

Розмір шрифта в пунктах. Пункт— це одиниця вимірювання розміру шрифту, яка використовується в поліграфії. Один пункт рівний 1/72 дюйми

Style

Стиль зображення символів. Можливо: нормальним, напівжирним, курсивним, підкресленим, перекресленим. Стиль задається за допомогою наступних констант: fsBold (напівжирний), fsltalic (курсив), fsUnderline (підкреслений), fsStrikeOut (перекреслений). Властивість style є множиною, що дозволяє комбінувати необхідні стилі. Наприклад, напівжирний курсив виглядає так: Canvas->Font->Style = TFontStyles ( ) <<fsBold<<fsUnderline

Color

Колір символів. Як значення можна використовувати константу типу TColor

Textwidth, TextHeight

Задають ширину і висоту області виведення тексту

Інколи потрібно вивести будь-який текст після повідомлення, довжина якого під час розробки невідома. В цьому випадку необхідно знати координати правої границі області виведеного тексту. Координати правої границі тексту, який виводиться методом TextOutA, можна одержати за допомогою методу PenPos.

Наступний фрагмент коду демонструє можливість виведення тексту за допомогою двох конструкцій:

Canvas->TextOutA(10,10,"Borland");

Canvas->TextOutA(Canvas->PenPos.x, Canvas->PenPos.y, "C++Builder");