014 - Розробка програми малювання графіка функції двох змінних z = f (x, y)

  1. зміст
  2. Математична постановка задачі
  3. виконання
  4. 2. Створення головної форми Form1
  5. 3. Створення другорядною форми Form2
  6. 4. Введення внутрішніх змінних в Form2
  7. 5. Введення внутрішніх методів в текст модуля «Unit2.pas»
  8. 6. Програмування обробників подій кліка на кнопках повороту графіка в формі Form2
  9. 7. Програмування обробника події активізації форми Form2
  10. 8. Програмування обробників подій обертання графіка за допомогою мишки
  11. 9. Програмування події кліка на кнопці «Показати графік ...» з форми Form1
  12. 10. Запуск програми на виконання

У даній роботі описується як в окремій формі реалізувати графік функції двох змінних

z = f (x, y)

або іншими словами графік функції в тривимірному просторі (3D).

Як приклад вибрано

z = sin (x) + cos (y)

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

зміст

Умова задачі

Дана формула функції двох змінних z = sin (x) + cos (y). Розробити додаток, що малює графік функції в окремій формі.

Додатково реалізувати поворот графіка вліво, вправо, вгору, вниз. Також потрібно виводити осі OX, OY, OZ.

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

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

Графік функції двох змінних z (x, y) будується в паралелепіпеді з розмірами (xx1, xx2), (yy1, yy2), (zz1, zz2).

Для використання повороту системи в тривимірному просторі виникає поняття точки (x0, y0, z0), щодо якої відбувається поворот системи.

Також виникає поняття кутів:

Зрушення в точку (x0, y0, z0) з урахуванням повороту на кути Зрушення в точку (x0, y0, z0) з урахуванням повороту на кути   і   описується відомими співвідношеннями і описується відомими співвідношеннями

Після перемноження матриць отримуємо формулу для обчислення:

Мал Мал. 1. Зрушення і поворот системи координат

Необхідно визначитися, в якій площині монітора будуть лежати вісі координат OX, OY, OZ. Приймаємо, що в площині монітора лежать осі OX і OY. А вісь OZ перпендикулярна екрану.

Координати розрахункової точки (x, y) притискаються до точки (0, 0) за формулами:

де A, a - коефіцієнти перспективи, які підбираються експериментально в залежності від функції де A, a - коефіцієнти перспективи, які підбираються експериментально в залежності від функції.

виконання

1. Запустити Delphi. Створити додаток за шаблоном VCL Forms Application

Докладний приклад створення програми за шаблоном VCL Forms Application описується тут . Зберегти проект під будь-яким ім'ям. В результаті буде створена головна форма програми з ім'ям Form1. Файл головної форми має ім'я «Unit1.pas».

2. Створення головної форми Form1

Створити головну форму, як зображено на малюнку 2.

Мал Мал. 2. Форма головної форми Form1

На формі розміщується компонент типу TButton, призначений для виклику обробника події відображення графіка функції. В результаті виходить об'єкт з ім'ям Button1.

За допомогою Object Inspector в компоненті Button1 потрібно налаштувати властивість Caption в значення «Показати графік ...».

3. Створення другорядною форми Form2

Створити форму Form2 як зображено на малюнку 3. Ця форма буде відображати графік функції. Приклад створення нової форми в Delphi описується тут .

Форма Form2 розміщується в модулі "Unit2.pas".

Мал Мал. 3. Форма Form2 виведення графіка функції

З палітри Tool Palette на формі розміщуються компоненти наступних типів:

  • з вкладки Standard чотири компонента типу TButton, які представляють стрілки напрямків повороту графіка функції. В результаті виходить чотири об'єкти-змінні з іменами Button1, Button2, Button3, Button4;
  • з вкладки Additional компонент типу TImage, в якому буде відображатися графік функції. Створюється об'єкт з ім'ям Image1.

За допомогою Object Inspector налаштовуються наступні компоненти:

  • в компоненті Button1 властивість Caption = "^";
  • в компоненті Button2 властивість Caption = "v»;
  • в компоненті Button3 властивість Caption = "<<»;
  • в компоненті Button4 властивість Caption = ">>».

4. Введення внутрішніх змінних в Form2

Всі внутрішні змінні, що використовуються для організації виведення графіка, розміщуються в формі Form2. Тому, спочатку треба активувати модуль «Unit2.pas».

В модуль форми Form2 в розділі private вводяться наступні внутрішні змінні:

  • xx1, xx2, yy1, yy2 - відповідають координатам точок, що відображаються на екрані монітора;
  • масиви xx і yy які призначені для виведення площині з 4-х точок. Область визначення функції z = f (x, y) розбивається на прямокутники, на будь-якому з яких функція екстраполюється ребрами чотирикутника.

У розділі public вводяться:

  • змінні X_min, Y_min, X_max, Y_max дійсного типу, відповідні реальним координатам паралелепіпеда, в якому виводиться графік функції. Ці змінні заповнюються з головної форми Form1 експериментальним шляхом;
  • змінні alfa, beta дійсного типу, що відображають кути спостереження за графіком функції. Заповнюються з головної форми Form1;
  • змінні x0, y0, z0 дійсного типу. Відображають величини з головної формули обчислення (див. Математичну постановку задачі);
  • змінна A дійсного типу - є коефіцієнтом перспективи і підбирається експериментально;
  • змінна f_show логічного типу використовується для вказівки того, що потрібно перемалювати графік, в разі зміни положення кутів alfa і beta.

Після введення змінних в текст програми, фрагмент класу форми Form2 має вигляд:

type

TForm2 = class (TForm) ... private {Private declarations} xx1, xx2, yy1, yy2: integer; xx, yy: array [0 .. 3] of integer; public {Public declarations} // Дані, які заповнюються з форми Form1 X_min, Y_min, X_max, Y_max: real; alfa, beta: real; x0, y0, z0: real; A: real; f_show: boolean; ... end;

Змінні з розділу public заповнюються з форми Form1.

5. Введення внутрішніх методів в текст модуля «Unit2.pas»

У текст класу форми Form2 потрібно ввести три додаткові методи:

  • процедуру перетворення системи координат і масштабування Zoom_XY ();
  • функцію func () для якої виводиться графік;
  • процедуру малювання графіка функції Show_Graphic.

Після введення внутрішніх методів, фрагмент лістингу класу Form2 наступний:

type

TForm2 = class (TForm) ... private {Private declarations} xx1, xx2, yy1, yy2: integer; xx, yy: array [0 .. 3] of integer; // внутрішні методи procedure Zoom_XY (x, y, z: real; var xx, yy: integer); procedure Show_Graphic; function func (x, y: real): real; public {Public declarations} // Дані, які заповнюються з форми Form1 X_min, Y_min, X_max, Y_max: real; alfa, beta: real; x0, y0, z0: real; A: real; f_show: boolean; end; ...

Лістинг процедури перетворення системи координат наступний:

// процедура перетворення системи координат і масштабуванняprocedure

TForm2.Zoom_XY (x: Real; y: Real; z: Real; var xx: Integer; var yy: Integer); var tx, ty, tz: real; xn, yn, zn: real; begin tx: = (x-x0) * cos (alfa) - (y-y0) * sin (alfa); ty: = ((x-x0) * sin (alfa) + (y-y0) * cos (alfa)) * cos (beta) - (z-z0) * sin (beta); tz: = ((x-x0) * sin (alfa) + (y-y0) * cos (alfa)) * sin (beta) + (z-z0) * cos (beta); xn: = tx / (tz / A + 1); yn: = ty / (tz / A + 1); xx: = Trunc (Image1.Width * (xn-X_min) / (X_max-X_min)); yy: = Trunc (Image1.Height * (yn-Y_max) / (Y_min-Y_max)); end;

Безпосередній висновок графіка функції реалізований в процедурі Show_Graphic. Лістинг процедури Show_Graphic наступний.

procedure

TForm2.Show_Graphic; const h = 0.1; h0 = 0; var i, j: integer; canv: TCanvas; begin canv: = Image1.Canvas; // полотно для малювання // очищення полотна (канви) canv.Rectangle (-1, -1, Image1.Width, Image1.Height); // малювання осей Zoom_XY (0, 0, 0, xx1, yy1); Zoom_XY (1.2, 0, 0, xx2, yy2); canv.MoveTo (xx1, yy1); canv.LineTo (xx2, yy2); canv.TextOut (xx2 + 3, yy2, 'X'); Zoom_XY (0, 0, 0, xx1, yy1); Zoom_XY (0, 1.2, 0, xx2, yy2); canv.MoveTo (xx1, yy1); canv.LineTo (xx2, yy2); canv.TextOut (xx2 + 3, yy2, 'Y'); Zoom_XY (0, 0, 0, xx1, yy1); Zoom_XY (0, 0, 1.2, xx2, yy2); canv.MoveTo (xx1, yy1); canv.LineTo (xx2, yy2); canv.TextOut (xx2 + 3, yy2- 3, 'Z'); // малювання поверхні for j: = 0 to 9 do for i: = 0 to 9 do begin Zoom_XY (h0 + h * i, h0 + h * j, func (h0 + h * i, h0 + h * j), xx [0], yy [0]); Zoom_XY (h0 + h * i, h + h * j, func (h0 + h * i, h + h * j), xx [1], yy [1]); Zoom_XY (h + h * i, h + h * j, func (h + h * i, h + h * j), xx [2], yy [2]); Zoom_XY (h + h * i, h0 + h * j, func (h + h * i, h0 + h * j), xx [3], yy [3]); canv.Polygon ([Point (xx [0], yy [0]), Point (xx [1], yy [1]), Point (xx [2], yy [2]), Point (xx [3] , yy [3])]); end; end;

Пояснимо деякі фрагменти коду в процедурі Show_Graphic.

Область визначення функції z = f (x, y) розбивається на прямокутники, на будь-якому з яких функція екстраполюється ребрами чотирикутника. Побудова чотирикутників на екрані реалізується за допомогою методу Polygon ().

Після очищення канви відбувається малювання осей координат і методом Polygon () виводяться фрагменти поверхні.

При малюванні поверхні, з процедури Show_Graphic зголоситься процедура Zoom_XY (), яка здійснює перетворення і масштабування з реальних координат в екранні координати.

Лістинг методу func () наступний.

function

TForm2.func (x: Real; y: Real): real; begin func: = sin (x) + cos (y); end;

У цьому методі замість рядка

func: = sin (x) + cos (y);

можна зробити вставку власної функції.

6. Програмування обробників подій кліка на кнопках повороту графіка в формі Form2

Поворот графіка відбувається в момент, коли користувач робить клік на одній з кнопок, розміщених на формі Form2 (компоненти Button1, Button2, Button3, Button4).

Відображення графіка залежить від внутрішніх змінних alfa і beta. Мінлива alfa містить кут повороту щодо осі OZ. Мінлива beta містить значення кута повороту навколо осі OX.

Тому, в обробниках подій відбувається зміна значень alfa і beta на деяку величину. За бажанням, можна встановити власну величину зміни alfa і beta.

Лістинг обробників подій наступний.

procedure

TForm2.Button1Click (Sender: TObject); begin beta: = beta + 0.1; Show_Graphic; end; procedure TForm2.Button2Click (Sender: TObject); begin beta: = beta - 0.1; Show_Graphic; end; procedure TForm2.Button3Click (Sender: TObject); begin alfa: = alfa + 0.1; Show_Graphic; end; procedure TForm2.Button4Click (Sender: TObject); begin alfa: = alfa - 0.1; Show_Graphic; end;

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

У момент виклику форми Form2 може виводитися графік функції. Тому в обробнику події OnActivate форми Form2 викликається метод Show_Graphic.

procedure

TForm2.FormActivate (Sender: TObject); begin Show_Graphic; end;

8. Програмування обробників подій обертання графіка за допомогою мишки

Для здійснення обертання графіка за допомогою мишки потрібно запрограмувати відповідні обробники подій компонента Image1.

Якщо натиснути клавішу миші і тримайте її довше над компонентом Image1, а потім відпустити, то генеруються наступні події (рисунок 4):

  • OnMouseDown - генерується, якщо користувач робить клік мишкою на компоненті Image1;
  • OnMouseMove - генерується, якщо користувач переміщує мишку над компонентом Image1 (не залежно, натиснута чи одна з кнопок мишки);
  • OnMouseUp - генерується, якщо користувач відпускає кнопку мишки після натискання.

Мал Мал. 4. Події OnMouseDown, OnMouseMove, OnMouseUp компонента Image1

Переміщення мишки, утримуючи по компоненту Image1 призводить до зміни кутів alfa і beta. Мінлива f_show використовується для вказівки оброблювачу події OnMouseMove, що потрібно змінити змінні alfa і beta і перемалювати графік.

Лістинг обробників подій OnMouseDown, OnMouseMove і OnMouseUp наступний.

procedure

TForm2.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f_show: = true; end; procedure TForm2.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); var a, b: real; begin if f_show then begin a: = x - Width div 2; b: = y - Height div 2; if a <> 0 then alfa: = arctan (b / a) else alfa: = Pi / 2; beta: = sqrt (sqr (a / 10) + sqr (b / 10)); Show_Graphic; end; end; procedure TForm2.Image1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f_show: = false; end;

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

При кліці на кнопці Button1 з форми Form1 може виводитися графік функції.

Обробник події кліка на кнопці Button1 наступний.

procedure

TForm1.Button1Click (Sender: TObject); begin Form2.f_show: = false; Form2.x0: = 0; Form2.y0: = 0; Form2.z0: = 0; Form2.A: = -8; Form2.alfa: = 10; Form2.beta: = 12; Form2.X_min: = -3; Form2.X_max: = 3; Form2.Y_min: = -3; Form2.Y_max: = 3; Form2.ShowModal; end;

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

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

Тепер можна запустити додаток на виконання і протестувати його роботу (малюнок 5).

Мал Мал. 5. Виконання програми