Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IZVP_lab-novi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
16.14 Mб
Скачать

Котрольні питання

  1. Як оголосити програму у С++ Builder?

  2. Як заповнити масив значеннями?

  3. Як звернутись у програмі до елементу масиву?

  4. Як вивести зачення масиву у програмі?

Лабораторна робота №4

Тема: Робота з графікою C++ Builder

Мета: Навчитись використовувати методи для роботи з графікою у C++ Builder

Хід роботи

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

Основну роботу виконує функція Grafik

її оголошення треба помістити в розділ private оголошення форми в заголовному файлі програми:

TForm1 *Form1;

Grafik();.

Функція Grafik спочатку обчислює максимальне (у2) і мінімальне (yl) значення функції на відрізку [xl, х2]. Потім, використовуючи інформацію про ширину і висоту області висновку графіка, вона обчислює коефіцієнти масштабування по осях X і У. Після цього обчислює координату У горизонтальної осі, координату X вертикальної осі і викреслює координатні осі. Потім виконується безпосередня побудова графіка.

Виклик функції Grafik виконують функції обробки подій OnPaint і OnResize. Функція TForml:: FormPaint забезпечує викреслювання графіка після появи форми на екрані в результаті запуску програми, а також після появи форми під час роботи програми — наприклад, в результаті видалення або переміщення інших вікон, що повністю або частково перекривають вікно програми. Функція TForml::FormResize забезпечує викреслювання графіка після зміни розміру форми.

  1. Зформувати зображення двох літаків на фоні неба (завантажити з файлу), вивести їх на поверхню, застосувавши метод Draw до властивості Canvas.

Промальовування описати у обробнику події OnPaint.

C++ Builder дозволяє програмісту розробляти програми, які працюють з графікою.

Полотно

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

Наприклад, оператор

Forml->Canvas->Rectangle(10,10,50,50)

малює на поверхні форми прямокутник.

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

Метод

Дія

LineTo(х, в)

Rectangle(xl,yl, х2, у2)

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

Малює прямокутник, xl, yl і х2, у2 — координати лівого верхнього і правого нижнього кутів прямокутника. Колір межі і внутрішньої області прямокутника можуть бути різними

FillRect(xl,yl,х2,у2)

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

FrameRect(xl,yl,х2,у2)

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

RounRect(xl,yl,х2,у2,х3,у3)

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

Ellipse (xl, yl, х2, у2)

Малює еліпс або коло (круг), xl, yl, х2, у2 — координати прямокутника, всередині

якого викреслюється еліпс або, якщо квадрат, то коло

Polyline(points,n)

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

Методи виводу графічних примітивів розглядають властивість canvas як деяке абстрактне полотно, на якому вони можуть малювати. Полотно складається з окремих точок — пікселів. Положення пікселя на поверхні полотна характеризується горизонтальною (X) і вертикальною (Y) координатами. Координати зростають зверху вниз і зліва направо (мал. 3.1). Лівий верхній піксель поверхні форми (клієнтської області) має координати (0, 0), правий нижній — (clientwidth, ClientHeight). Доступ до окремого пікселя здійснюється через властивість Pixels, що є двовимірним масивом, елементи якого містять інформацію про колір точок полотна.

Слід звернути увагу на важливий момент. Зображення, сформоване на поверхні форми, може бути зіпсовано, наприклад, в результаті повного або часткового перекриття вікна програми іншим вікном. Тому програміст повинен поклопотатися про те, щоб у момент появи вікна програма перемальовувала зіпсоване зображення. На щастя, операційна система Windows інформує програму про необхідність перемальовування вікна, посилаючи їй відповідне повідомлення, в результаті пуску програми, коли вікно з'являється на екрані вперше. Таким чином, інструкції, що забезпечують вивід графіки на поверхню форми, треба помістити у функцію обробки події onPaint.

Лінія

Викреслювання прямої лінії виконує метод LineTo. Метод малює лінію з тієї точки, в якій в даний момент знаходиться олівець (ця точка називається поточною позицією олівця або просто "поточній"), в точку, координати якої вказані в інструкції виклику методу.

Початкову точку лінії можна задати, перемістивши олівець в потрібну точку графічної поверхні. Зробити це можна за допомогою методу MoveTo, вказавши як параметрів координати точки початку лінії. Наприклад, оператори

Canvas->MoveTo(10,10); // встановить! олівець в точку (10,10)

Canvas->LineTo(50,10) ; // лінія з точки (10,10) в точку (50,10)

малюють горизонтальну лінію з точки (10, 10) в точку (50, 10).

Точка

Поверхні, на яку програма може здійснювати висновок графіки, відповідає об'єкт canvas. Властивість pixels, що є двовимірним масивом типу TColor, містить інформацію про колір кожної точки графічної поверхні. Використовуючи властивість pixels, можна задати колір будь-якої точки графічної поверхні, тобто "намалювати" точку. Наприклад, інструкція

Canvas->Pixels[10][10] = clRed;

зафарбовує точку поверхні форми в червоний колір.

Розмірність масиву Pixels визначається реальним розміром графічної поверхні. Розмір графічної поверхні форми (робочої області, яку також називають клієнтською) визначають властивості clientwidth і clientHeight, а розмір графічної поверхні компоненту image -властивості width і Height. Лівій верхній точці робочої області форми відповідає елемент pixels [0] [0], а правій нижній —

Pixels [ClientWidth- 1] [ClientHeight-1].

Наступна програма (лістинг 3.1), використовуючи властивість pixels, будує графік функції в = 2 sin(х)e-v/5. Межі діапазону зміни аргументу функції є початковими даними. Діапазон зміни значення функції обчислюється під час роботи програми. На підставі цих даних програма обчислює масштаб, що дозволяє побудувати графік, так, щоб він займав всю область форми, призначену для висновку графіка. Для побудови графіка використовується вся доступна область форми, причому якщо під час роботи програми користувач змінить розмір вікна, то графік буде виведений наново з урахуванням реальних розмірів вікна.

Canvas->TextOutA(xO+5,b,FloatToStrF(yl,ffGeneral,6,3));

// побудова графіка

х = xl ; do {

В = f (х) ;

Canvas->Pixels [xO+х*mx] [yO-у*my] = clRed; х += dx, -}

while (х <=х2) ;

Основну роботу виконує функція Grafik (її оголошення треба помістити в розділ private оголошення форми в заголовному файлі програми). Функція Grafik спочатку обчислює максимальне (у2) і мінімальне (yl) значення функції на відрізку [xl, х2]. Потім, використовуючи інформацію про ширину і висоту області висновку графіка, вона обчислює коефіцієнти масштабування по осях X і В. Після цього обчислює координату В горизонтальної осі, координату X вертикальної осі і викреслює координатні осі. Потім виконується безпосередня побудова графіка (мал. 3.8).

Бітові образи

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

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

Картинку бітового образу (іноді говорять просто "бітовий образ") можна підготувати за допомогою графічного редактора або, якщо передбачається, що бітовий образ буде завантажений з ресурсу програми, — за допомогою редактора ресурсів (наприклад, Borland Resource Workshop). В останньому випадку треба створити файл ресурсів і помістити в нього бітовий образ. Файл ресурсів можна створити і за допомогою утиліти Image Editor.

В програмі бітовий образ — це об'єкт типу TBitmap.

Завантаження картинки з файла забезпечує метод LoadFromFile, якому як параметра передається ім'я bmp-файла. Наприклад, наступний фрагмент коду забезпечує створення і завантаження бітового образу з файла.

Graphics::TBitmap *Plane = new Graphics::TBitmap(); Plane->LoadFromFile("plane.bmp");

В результаті виконання приведеного вище фрагмента, бітовий образ Plane є зображенням літака (передбачається, що у файлі plane.bmp знаходиться зображення літака).

Після того, як бітовий образ сформований (завантажений з файла або з ресурсу), його можна вивести, наприклад, на поверхню форми або компоненту Image. Зробити це можна, Застосувавши метод Draw до властивості Canvas. Як параметри методу Draw треба передати координати точки, від якої буде виведений бітовий образ. Наприклад, оператор

Canvas->Draw(10,20,Plane);

виводить на поверхню форми бітовий образ Plane — зображення літака.

Якщо перед застосуванням методу Draw властивості Transparent бітового образу привласнити значення true, то фрагменти малюнка, колір яких співпадає з кольором лівої нижньої точки малюнка, не будуть виведені. Такий прийом використовується для створення ефекту прозорого фону. "Прозорий" колір можна задати і примусово, привласнивши відповідне значення властивості TransparentColor.

Приклад 1. Графік функції

#include "math.h"// для доступу до sin і exp

// функція, графік якої треба побудувати

float f (float x)

{

return 2*sin(x)*exp(x/5);

}

// обробка події OnPaint

void __fastcall TForm1::FormPaint(TObject *Sender)

{

Grafik();

}

// обробка події OnResize

void __fastcall TForm1::FormResize(TObject *Sender)

{

TRect rct = Rect (0, 0,ClientWidth, ClientHeight) ;

Canvas->FillRect(rct); // стерти Grafi

Grafik();

}

//Функція Grafik

Grafik()

{

float x1, x2; / / границі зміни аргументу функції

float y1, y2 // межі зміни значення функції

float x; // аргумент функції

float y; // значення функції в точці х

float dx; // приріст аргументу

int l, b; // лівий нижній кут, області виводу графіку

int w, h; // ширина і висота області виводу графіку

float mx, my; // масштаб по осях X і В

int x0, y0; // початок координат

// область виводу графіку

l = 10; // X - координата лівого верхнього кута

b = Form1->ClientHeight-20; // У - координата лівого нижнього кута

h = Form1->ClientHeight-40; // висота

w = Form1->Width - 20; // ширина

x1 = 0; // нижня межа діапазону аргументу

x2 = 25; // верхня межа діапазону аргументу

dx = 0.01; // крок аргументу

// знайдемо максимальне і мінімальне значення // функції на відрізку [xl,х2]

x = x1 ;

y1 = f(x); // висота

y2 = f(x) ; // ширина

do {

y = f(x);

if ( y < y1) y1 = y;

if ( y > y2) y2 = y;

x += dx; } while (x <= x2) ;

// обчислимо масштаб

my = (float) h/abs (y2-y1) //масштаб по осі У

mx = w/abs(x2-x1) ; // масштаб по осі X

x0 = l+abs(x1*mx);

y0 = b-abs (y1*my) ;

Form1->Canvas->MoveTo(x0,b); Form1->Canvas->LineTo(x0,b-h);

Form1->Canvas->MoveTo (l,y0);Form1->Canvas-> LineTo(l+w,y0);

Form1->Canvas->TextOutA(x0+5,b-h, FloatToStrF(y2,ffGeneral,6,3));

Form1->Canvas-> TextOutA(x0+5,b,FloatToStrF(y1,ffGeneral,6,3));

// функції на відрізку [xl,х2]

x = x1 ;

do {

y = f(x) ;

Form1->Canvas->Pixels [x0+x*mx] [y0-y*my] = clRed;

x += dx;

} while (x <=x2) ;

}

Приклад 2: Процедура виведення малюнків літаків на фоні неба.

void __fastcall TForm1::FormPaint(TObject *Sender)

{

// бітові образи: небо і літак

Graphics::TBitmap *sky = new Graphics::TBitmap();

Graphics::TBitmap *plane = new Graphics::TBitmap();

sky->LoadFromFile("sky.bmp");

plane->LoadFromFile("images.bmp");

Canvas->Draw(0,0,sky); // фон — небо

Canvas->Draw(20,100,plane); // лівий літак

plane->Transparent = true;

/* прозорість фону */

Canvas->Draw(300,120,plane); // правий літак

// знищення об’єктів

sky->Graphics ::~TBitmap ();

plane->Graphics::~TBitmap();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]