C ++. Створення програми малювання графіка функції однієї змінної

  1. Умова задачі
  2. Математична постановка задачі
  3. Рішення
  4. 2. Створення основної форми.
  5. 3. Налаштування форми.
  6. 4. Налаштування властивостей і розмірів компонент, розміщених на формі.
  7. 5. Програмування події активізації форми Form1.
  8. 6. Створення нової форми виведення графіка функції.
  9. 7. Програмування додаткових функцій масштабування і обчислення sin (x).
  10. 7.2. Додавання функцій перетворення і функції обчислення sin (x) в клас TForm2.
  11. 8. Програмування події активізації форми Form2.
  12. 9. Програмування події кліка на кнопці «Вивести графік ...» форми Form1.
  13. 9.1. Підключення форми Form2 до форми Form1.
  14. 9.2. Програмування події кліка на кнопці «Вивести графік ...«.
  15. 10. Запуск програми на виконання.

Наводиться приклад малювання на канві графіка функції однієї змінної y = f (x).

Функція задається формулою

Умова задачі

Розробити додаток, в якому будується графік функції

y = sin (x)

Графік функції повинен виводитися в окремій формі.

Математична постановка задачі

Для побудови будь-якого графіка функції y = f (x) потрібно задати прямокутну область екрана, в якій цей графік функції буде виводитися.

Прямокутна ділянка екрану задається координатами крайніх точок (рис. 1):

- (x1; y1) - лівий верхній кут екрану;

- (x2; y2) - правий нижній кут екрану.

Мал Мал. 1. Прямокутна область екрану

При побудові графіків функцій на екрані монітора потрібно реалізувати масштабування прямокутника з координатами (x1; y1), (x2; y2) в прямокутник з координатами екрану (xx1; yy1), (xx2; yy2) як зображено на малюнку 2.

Мал Мал. 2. Масштабування координат

Масштабування по осях OX та OY реалізується за допомогою лінійних залежностей:

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

Рішення

1. Завантажити Borland C ++ Builder .

Створити проект як «VCL Form Application» . Автоматично створюється основна форма додатка з ім'ям Form1.

зберегти проект .

2. Створення основної форми.

Розмістити на формі компоненти таких типів:

- п'ять компонент типу TLabel. Створюються об'єкти з іменами Label1, Label2, Label3, Label4, Label5;

- п'ять компонент типу TEdit. Створюються об'єкти з іменами Edit1, Edit2, Edit3, Edit4, Edit5;

- один компонент типу TButton. Створюється об'єкт з ім'ям Button1.

Відкоригувати позиції компонент на формі як показано на малюнку 3.

Мал Мал. 3. Розміщення компонент на формі Form1

3. Налаштування форми.

Щоб форма Form1 мала коректний вид, в Object Inspector потрібно зробити наступне:

- з вкладки Action встановити властивість Caption = «Графік функції однієї змінної» (заголовок форми);

- з вкладки Visual встановити властивість BorderStyle = «bsDialog» (рис. 4). В результаті зникнуть кнопки управління формою;

- з вкладки Miscellaneous встановити властивість Position = «poScreenCenter» (рис. 5). Ця дія відобразить форму в центрі екрану під час виконання програми.

Мал Мал. 4. Властивість BorderStyle форми Form1

Мал Мал. 5. Властивість Position

4. Налаштування властивостей і розмірів компонент, розміщених на формі.

Потрібно встановити такі властивості компонентів:

- в компоненті Label1 властивість Caption = "К-сть точок по горизонталі, n =«;

- в компоненті Label2 властивість Caption = «Ліва межа, x1 =«;

- в компоненті Label3 властивість Caption = "Права межа, x2 =«;

- в компоненті Label4 властивість Caption = «Верхня межа, y1 =«;

- в компоненті Label5 властивість Caption = "Нижня межа, y2 =«;

- в компоненті Button1 властивість Caption = "Вивести графік ...«.

Також потрібно змінити розмір і позицію компонента Button1 на формі. Приблизний вигляд форми з розміщеними компонентами зображений на малюнку 6.

Приблизний вигляд форми з розміщеними компонентами зображений на малюнку 6

Мал. 6. Загальний вигляд форми Form1

5. Програмування події активізації форми Form1.

Під час запуску програми на виконання необхідно запрограмувати подія OnActivate активізації основної форми програми.

Приклад програмування події в C ++ Builder описаний тут .

Лістинг обробника події OnActivate має наступний вигляд:

void__fastcall

TForm2 :: FormActivate (TObject * Sender) {Edit1-> Text = "30"; Edit2-> Text = "-5"; Edit3-> Text = "5"; Edit4-> Text = "-2"; Edit5-> Text = "2"; Edit1-> SetFocus (); // встановити фокус введення в Edit1}

У обробнику події заповнюються значення полів, які є координатами прямокутної області, в якій виводиться графік. Прямокутна область задається координатами лівого верхнього кута (x1; y1) і правого нижнього кута (x2; y2).

6. Створення нової форми виведення графіка функції.

Створити форму з ім'ям «Form2» за зразком, як показано на малюнку 7. Приклад створення нової форми в C ++ Builder наведено тут .

Форма Form2 описується в файлах «Unit2.h» і «Unit2.cpp«.

Розмістити на формі компоненти наступних типів:

- компонент типу TButton (кнопка). Автоматично створюється об'єкт з ім'ям Button1;

- компонент типу TImage. Створюється об'єкт з ім'ям Image1. У цьому компоненті буде виводитися графік функції sin (x).

Мал. 7. Форма Form2 виведення графіка функції sin (x)

За допомогою Object Inspector здійснити настройку основних властивостей компонент:

- в компоненті Button1 властивість Caption = "OK";

- в компоненті Button1 властивість ModalResult = «mrOk». Це означає, що під час кліка на кнопці Button1 форма буде закриватися з кодом повернення mrOk.

За допомогою Object Inspector здійснити настройку властивостей форми Form2:

- з вкладки Action встановити властивість Caption = «Графік функції sin (x)«;

- з вкладки Visual властивість BorderStyle = «bsDialog». Це означає, що вікно форми набуде вигляду діалогового вікна;

- з вкладки Miscellaneous властивість Position = «poScreenCenter». В результаті форма буде виводитися по центру екрана.

Також потрібно відкоригувати розміри і позиції компонентів Button1 і Image1.

В результаті виконаних дій, форма Form2 матиме вигляд, як зображено на малюнку 8.

Мал Мал. 8. Форма Form2

7. Програмування додаткових функцій масштабування і обчислення sin (x).
7.1. Введення внутрішніх змінних в модуль форми Form2.

Потрібно ввести такі внутрішні змінні в текст файлу «Unit2.h» (рис. 9).

Для цього виконується наступна послідовність дій.

  1. Перейти в заголовки «Unit2.h» (рис. 9).
  1. У розділі private класу TForm2 ввести чотири змінні:
int

xx1, xx2, yy1, yy2;

Ці змінні відповідають екранним координатами (див. Рис. 2 б).

  1. У розділі public класу TForm2 ввести п'ять змінних:
float

x1, x2, y1, y2; int n;

Ці змінні відповідають фактичним координатами (рис. 2 а) прямокутної області, в якій виводиться графік. Мінлива n задає кількість точок, які будуть з'єднані лініями. Чим більше значення n, тим більше плавно виглядає графік на екрані.

Значення цих змінних заповнюється з основної форми Form1. Тому вони розміщуються в розділі public.

Мал Мал. 9. Вид файлу модуля «Unit2.h«

Поки що лістинг файлу «Unit2.h» наступний:

// ------------------------------------------------ #ifndef Unit2H #define Unit2H // ------------------------------------------ ------ #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> // ------- ----------------------------------------- class TForm2: public TForm {__published: / / IDE-managed Components TImage * Image1; TButton * Button1; private: // User declarations int xx1, xx2, yy1, yy2; public: // User declarations __fastcall TForm2 (TComponent * Owner); float x1, x2, y1, y2; // фактичні координати прямокутної області int n; // кількість точок, які з'єднуються лініями}; // ------------------------------------------------ - extern PACKAGE TForm2 * Form2; // ------------------------------------------------ - #endif

7.2. Додавання функцій перетворення і функції обчислення sin (x) в клас TForm2.

У модулі форми Form2 потрібно створити дві функції перетворення фактичних координат в екранні координати. Функції мають імена ZoomX () і ZoomY ().

Також потрібно додати функцію обчислення sin (x). Ім'я цієї функції func ().

Спочатку в файл «Unit2.h» додається опис функцій. Опис додається в розділ public.

Фрагмент лістингу файлу «Unit2.h» матиме такий вигляд:

... class TForm2: public TForm {__published: // IDE-managed Components TImage * Image1; TButton * Button1; private: // User declarations int xx1, xx2, yy1, yy2; public: // User declarations __fastcall TForm2 (TComponent * Owner); float x1, x2, y1, y2; int n; int ZoomX (float x); int ZoomY (float y); float func (float x); }; ...

Наступним кроком потрібно перейти в файл «Unit2.cpp» (рис. 10). У цьому файлі описується реалізація класу TForm2.

В кінець файлу додається наступний програмний код:

int

TForm2 :: ZoomX (float x) {int ret; ret = xx1 + (int) ((xx1) * (xx2-xx1) / (x2-x1)); return ret; } Int TForm2 :: ZoomY (float y) {int ret; ret = yy2 + (int) ((yy1) * (yy1-yy2) / (y2-y1)); return ret; } Float TForm2 :: func (float x) {float ret; ret = sin (x); // функція, для якої будується графік return ret; }

У наведеному вище лістингу функції ZoomX () і ZoomY () отримують вхідними параметрами відповідно значення x і y, які є фактичними координатами. Потім здійснюється перетворення за формулами, які наведені в математичній постановці завдання.

Функція func () отримує вхідним параметром значення в локальній змінній x. У тілі функції обчислюється значення sin (x). У це місце можна вставити будь-яку іншу власну функцію.

Мал Мал. 10. Файл «Unit2.cpp» з введеними функціями ZoomX (), ZoomY () і func ()

На даний момент лістинг файлу Unit2.cpp наступний:

// ------------------------------------------------ ------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include <math.h> // ----------------- -------------------------------------- #pragma package (smart_init) #pragma resource "*. dfm "TForm2 * Form2; // ------------------------------------------------ ------- __fastcall TForm2 :: TForm2 (TComponent * Owner): TForm (Owner) {} // ------------------------ ------------------------------- int TForm2 :: ZoomX (float x) {int ret; ret = xx1 + (int) ((xx1) * (xx2-xx1) / (x2-x1)); return ret; } Int TForm2 :: ZoomY (float y) {int ret; ret = yy2 + (int) ((yy1) * (yy1-yy2) / (y2-y1)); return ret; } Float TForm2 :: func (float x) {float ret; ret = sin (x); return ret; }

Щоб використовувати функцію sin (x), у файлі (модулі) «Unit2.cpp» додається рядок

#include <math.h>

У цьому рядку підключається бібліотека стандартних математичних функцій. У цій бібліотеці є функція обчислення sin (x).

8. Програмування події активізації форми Form2.

Графік функції виводиться в формі Form2 відразу після кліка на кнопці «Вивести графік ...» форми Form1. Тому, доцільно запрограмувати висновок графіка в подію OnActivate форми Form2. Обробник події реалізований у файлі «Unit2.cpp».

Лістинг обробника події OnActivate форми Form2 наступний:

void __fastcall

TForm2 :: FormActivate (TObject * Sender) {TCanvas * canv; // додаткова змінна int tx, ty; int i; float x, y, h; canv = Image1-> Canvas; // 1. Встановлення меж екранних координат xx1 = 0; yy1 = 0; xx2 = Image1-> Width; yy2 = Image1-> Height; // 2. Малювання графіка canv-> Pen-> Color = clBlue; canv-> Brush-> Color = clWhite; canv-> Rectangle (0, 0, Image1-> Width, Image1-> Height); // 2.1. Малювання осей координат canv-> Pen-> Color = clBlack; // 2.2. Взяти екранну точку початку координат X tx = ZoomX (0); ty = ZoomY (y1); canv-> MoveTo (tx, ty); // провести лінію осі координат X tx = ZoomX (0); ty = ZoomY (y2); canv-> LineTo (tx, ty); // 2.3. Точка початку координат Y canv-> Pen-> Color = clBlack; tx = ZoomX (x1); ty = ZoomY (0); canv-> MoveTo (tx, ty); // намалювати вісь Y tx = ZoomX (x2); ty = ZoomY (0); canv-> LineTo (tx, ty); // 3. Малювання графіка функції canv-> Pen-> Color = clRed; // колір canv-> Pen-> Width = 2; // товщина лінії // координати першої точки x = x1; y = func (x); h = (x2-x1) / n; tx = ZoomX (x); ty = ZoomY (y); canv-> MoveTo (tx, ty); // цикл перебору точок і малювання з'єднувальних ліній for (i = 0; i <n; i ++) {x = x + h; y = func (x); tx = ZoomX (x); ty = ZoomY (y); canv-> LineTo (tx, ty); }}

В скороченому вигляді файл «Unit2.cpp» має вигляд:

#include

<vcl.h> #pragma hdrstop #include "Unit2.h" #include <math.h> // ------------------------ ----------------------------------- #pragma package (smart_init) #pragma resource "* .dfm" TForm2 * Form2; // ------------------------------------------------ ----------- __fastcall TForm2 :: TForm2 (TComponent * Owner): TForm (Owner) {} // -------------------- -------------------------------------- int TForm2 :: ZoomX (float x) {.. .} int TForm2 :: ZoomY (float y) {...} float TForm2 :: func (float x) {...} void __fastcall TForm2 :: FormActivate (TObject * Sender) {...} // - -------------------------------------------------- ----------

9. Програмування події кліка на кнопці «Вивести графік ...» форми Form1.

Останнім етапом є програмування події кліка на кнопці виведення графіка.

Для цього потрібно виконати наступні дії.

9.1. Підключення форми Form2 до форми Form1.

Приклад створення нової форми і виклику її з основної форми програми детально описується тут .

Щоб підключити форму Form2 до форми Form1 потрібно у верхній частині файлу «Unit1.cpp» додати рядок:

#include "Unit2.h"

Після цього методи класу TForm2 стають доступними з форми Form1.

Поки що лістинг файлу «Unit2.cpp» наступний:

#include

<vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" // ------------------------ --------------------------------------- #pragma package (smart_init) #pragma resource "* .dfm "TForm1 * Form1; // ------------------------------------------------ --------------- __fastcall TForm1 :: TForm1 (TComponent * Owner): TForm (Owner) {} // ---------------- ----------------------------------------------- void __fastcall TForm1 :: FormActivate (TObject * Sender) {Edit1-> Text = "30"; Edit2-> Text = "-5"; Edit3-> Text = "5"; Edit4-> Text = "-2"; Edit5-> Text = "2"; Edit1-> SetFocus (); // встановити фокус введення в Edit1} // ---------------------------------------- -----------------------

9.2. Програмування події кліка на кнопці «Вивести графік ...«.

Обробник події Button1Click () кліка на кнопці «Вивести графік ...» наступний:

void __fastcall

TForm1 :: Button1Click (TObject * Sender) {Form2-> n = StrToInt (Edit1-> Text); Form2-> x1 = StrToFloat (Edit2-> Text); Form2-> x2 = StrToFloat (Edit3-> Text); Form2-> y1 = StrToFloat (Edit4-> Text); Form2-> y2 = StrToFloat (Edit5-> Text); Form2-> ShowModal (); }

У обробнику формуються змінні n, x1, x2, y1, y2.

10. Запуск програми на виконання.

Після цього можна запускати додаток на виконання (рис. 11).

Мал Мал. 11. Виконання програми, вікно виведення графіка функції