Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

C #. Програма малювання графіка функції двох змінних z = f (x, y)

  1. z = f (x, y)
  2. z = sin (x) + cos (y)
  3. зміст
  4. 4. Введення внутрішніх змінних в форму Form2.
  5. 11. Запуск програми.

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

z = f (x, y)

Як приклад, використовувати функцію

z = sin (x) + cos (y)

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

зміст

Умова задачі

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

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

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

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

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

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

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

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

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

За цією формулою буде відбуватися перетворення системи координат і масштабування (рисунок 1) За цією формулою буде відбуватися перетворення системи координат і масштабування (рисунок 1).

За цією формулою буде відбуватися перетворення системи координат і масштабування (рисунок 1)

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

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

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

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

виконання

1. Створення проекту як Windows Forms Application

Створити проект. Докладний приклад створення проекту за шаблоном Windows Forms Application описується тут . Автоматично створюється головна форма програми. Ім'я вихідного модуля головної форми «Form1.cs«.

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

Створити форму за зразком, як показано на малюнку 2.

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

Налаштувати такі властивості компонент і форми:

  • в формі Form1 властивість Text = "Графік функції двох змінних«;
  • в формі Form1 властивість MaximizeBox = False;
  • в формі Form1 властивість StartPosition = «CenterScreen«;
  • в компоненті button1 властивість Text = "Показати графік функції ...«.

3. Створення форми Form2.

Створити нову форму. Докладний процес створення нової форми описується тут .

Імена файлів форми «Form2.cs» і «Form2.Designer.cs«.

Розмістити на формі чотири компонента типу Button. Автоматично створюється чотири об'єкти з іменами button1, button2, button3, button4.

Налаштувати властивості компонент і форми наступним чином:

  • в формі Form2 властивість StartPosition = «CenterScreen»;
  • в формі Form2 властивість Text = "Графік функції z = f (x, y)«;
  • в компоненті button1 властивість Text = "^«;
  • в компоненті button2 властивість Text = "v";
  • в компоненті button3 властивість Text = "<«;
  • в компоненті button4 властивість Text = ">«.

Приблизний вигляд форми Form2 зображений на малюнку 3.

Мал Мал. 3. Форма Form2 додатки

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

Всі внутрішні змінні, що використовуються для організації виведення графіка, розміщуються в класі форми Form2. Тому, спочатку треба активізувати модуль «Form2.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 має вигляд:

... public partial class Form2: Form {private int xx1, xx2, yy1, yy2; private int [] xx = new int [4]; private int [] yy = new int [4]; public int left; public int top; public int width; public int height; public double X_min, Y_min, X_max, Y_max; public double alfa, beta; public double x0, y0, z0; public double A; public bool f_show; public Form2 () {InitializeComponent (); }} ...

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

5. Програмування внутрішніх методів в формі Form2.

У текст класу Form2 вводяться три додаткових методу:

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

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

private void Zoom_XY (double x, double y, double z, out int xx, out int yy) {double xn, yn, zn; double tx, ty, tz; tx = (x - x0) * Math .Cos (alfa) - (y - y0) * Math .Sin (alfa); ty = ((x - x0) * Math .Sin (alfa) + (y - y0) * Math .Cos (alfa)) * Math .Cos (beta) - (z - z0) * Math .Sin (beta); tz = ((x - x0) * Math .Sin (alfa) + (y - y0) * Math .Cos (alfa)) * Math .Sin (beta) + (z - z0) * Math .Cos (beta); xn = tx / (tz / A + 1); yn = ty / (ty / A + 1); xx = (int) (width * (xn - X_min) / (X_max - X_min)); yy = (int) (height * (yn - Y_max) / (Y_min - Y_max)); }

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

private double func (double x, double y) {double res; res = Math .Sin (x) + Math .Cos (y); return res; }

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

res = Math .Sin (x) + Math .Cos (y);

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

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

private void Show_Graphic (PaintEventArgs e) {const double h = 0.1; const double h0 = 0; int i, j; Rectangle r1 = new Rectangle (left, top, left + width, top + height); Pen p = new Pen (Color .Black); e.Graphics.DrawRectangle (p, r1); // Створити шрифт Font font = new Font ( "Courier New", 12, FontStyle .Bold); SolidBrush b = new SolidBrush (Color .Blue); // малювання осей // вісь X Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (1.2, 0, 0, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "X", font, b, xx2 + 3, yy2); // вісь Y Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (0, 1.2, 0, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "Y", font, b, xx2 + 3, yy2); // вісь Z Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (0, 0, 1.2, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "Z", font, b, xx2 + 3, yy2 - 3); // малювання поверхні p.Color = Color .Red; p.Width = 1; for (j = 0; j <= 9; j ++) for (i = 0; i <= 9; i ++) {Zoom_XY (h0 + h * i, h0 + h * j, func (h0 + h * i, h0 + h * j), out xx [0], out yy [0]); Zoom_XY (h0 + h * i, h + h * j, func (h0 + h * i, h + h * j), out xx [1], out yy [1]); Zoom_XY (h + h * i, h + h * j, func (h + h * i, h + h * j), out xx [2], out yy [2]); Zoom_XY (h + h * i, h0 + h * j, func (h + h * i, h0 + h * j), out xx [3], out yy [3]); e.Graphics.DrawLine (p, xx [0], yy [0], xx [1], yy [1]); e.Graphics.DrawLine (p, xx [1], yy [1], xx [2], yy [2]); e.Graphics.DrawLine (p, xx [2], yy [2], xx [3], yy [3]); e.Graphics.DrawLine (p, xx [3], yy [3], xx [0], yy [0]); }}

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

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

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

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

6. Програмування події Paint форми Form2.

Щоб отримати об'єкт Graphics, потрібно запрограмувати подія Paint форми Form2. Приклад програмування події в MS Visual Studio - C # описується тут детально.

Обробник події Form2_Paint () отримує два параметри. Перший параметр типу System.Object, другий параметр типу PaintEventArgs.

Параметр типу PaintEventArgs містить об'єкт Graphics, необхідний для малювання на поверхні форми.

Подія Paint виникає, якщо вікно стає «брудним» (dirty) - тобто, якщо змінюється його розмір, якщо воно перестає закривати (частково або повністю) інше вікно або якщо воно було згорнуто а потім розгорнуто. У всіх цих випадках - тобто якщо форму необхідно перемалювати, платформа .NET автоматично викличе подія Paint.

Лістинг обробника події Form2_Paint () наступний.

private void Form2_Paint (object sender, PaintEventArgs e) {Show_Graphic (e); }

7. Програмування обробників подій кліка на кнопках button1, button2, button3, button4.

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

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

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

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

private void button1_Click (object sender, EventArgs e) {beta = beta + 0.1; Invalidate (); } Private void button2_Click (object sender, EventArgs e) {beta = beta - 0.1; Invalidate (); } Private void button3_Click (object sender, EventArgs e) {alfa = alfa + 0.1; Invalidate (); } Private void button4_Click (object sender, EventArgs e) {alfa = alfa - 0.1; Invalidate (); }

У вищенаведених обробниках подій, подія Paint генерується явно за допомогою успадкованого методу Invalidate (). Цей метод робить перемальовування всієї клієнтської області програмним шляхом.

Метод Invalidate () має кілька перевантажених варіантів. Наприклад, якщо потрібно оновити заданий прямокутник, то потрібно створити такий код:

Rectangle r = new Rectangle (0, 0, 50, 50); Invalidate (r);

8. Програмування обробників подій MouseDown, MouseMove і MouseUp.

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

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

  • MouseDown - генерується, якщо користувач робить клік мишкою на формі Form2;
  • MouseMove - генерується, якщо користувач переміщує мишку над формою Form2 (незалежно, чи натиснута одна з кнопок мишки);
  • MouseUp - генерується, якщо користувач відпускає кнопку мишки після натискання.

Мал Мал. 4. Події MouseDown, MouseMove, MouseUp

private void Form2_MouseDown (object sender, MouseEventArgs e) {f_show = true; } Private void Form2_MouseUp (object sender, MouseEventArgs e) {f_show = false; } Private void Form2_MouseMove (object sender, MouseEventArgs e) {double a, b; if (f_show) {a = eX - (int) (width / 2); b = eY - (int) (height / 2); if (a! = 0) alfa = Math .Atan (b / a); else alfa = Math .PI / 2; beta = Math .Sqrt (Math.Pow (a / 10, 2) + Math.Pow (b / 10, 2)); Invalidate (); }}

9. Лістинг модуля «Form2.cs».

Нижче наведено повний текст файлу "Form2.cs", який відповідає формі Form2.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 {public partial class Form2: Form {private int xx1, xx2, yy1, yy2; private int [] xx = new int [4]; private int [] yy = new int [4]; public int left; public int top; public int width; public int height; public double X_min, Y_min, X_max, Y_max; public double alfa, beta; public double x0, y0, z0; public double A; public bool f_show; public Form2 () {InitializeComponent (); } Private void Zoom_XY (double x, double y, double z, out int xx, out int yy) {double xn, yn, zn; double tx, ty, tz; tx = (x - x0) * Math .Cos (alfa) - (y - y0) * Math .Sin (alfa); ty = ((x - x0) * Math .Sin (alfa) + (y - y0) * Math .Cos (alfa)) * Math .Cos (beta) - (z - z0) * Math .Sin (beta); tz = ((x - x0) * Math .Sin (alfa) + (y - y0) * Math .Cos (alfa)) * Math .Sin (beta) + (z - z0) * Math .Cos (beta); xn = tx / (tz / A + 1); yn = ty / (ty / A + 1); xx = (int) (width * (xn - X_min) / (X_max - X_min)); yy = (int) (height * (yn - Y_max) / (Y_min - Y_max)); } Private double func (double x, double y) {double res; res = Math .Sin (x) + Math .Cos (y); return res; } Private void Show_Graphic (PaintEventArgs e) {const double h = 0.1; const double h0 = 0; int i, j; Rectangle r1 = new Rectangle (left, top, left + width, top + height); Pen p = new Pen (Color .Black); e.Graphics.DrawRectangle (p, r1); // Створити шрифт Font font = new Font ( "Courier New", 12, FontStyle .Bold); SolidBrush b = new SolidBrush (Color .Blue); // малювання осей // вісь X Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (1.2, 0, 0, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "X", font, b, xx2 + 3, yy2); // вісь Y Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (0, 1.2, 0, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "Y", font, b, xx2 + 3, yy2); // вісь Z Zoom_XY (0, 0, 0, out xx1, out yy1); Zoom_XY (0, 0, 1.2, out xx2, out yy2); e.Graphics.DrawLine (p, xx1, yy1, xx2, yy2); e.Graphics.DrawString ( "Z", font, b, xx2 + 3, yy2 - 3); // малювання поверхні p.Color = Color .Red; p.Width = 1; for (j = 0; j <= 9; j ++) for (i = 0; i <= 9; i ++) {Zoom_XY (h0 + h * i, h0 + h * j, func (h0 + h * i, h0 + h * j), out xx [0], out yy [0]); Zoom_XY (h0 + h * i, h + h * j, func (h0 + h * i, h + h * j), out xx [1], out yy [1]); Zoom_XY (h + h * i, h + h * j, func (h + h * i, h + h * j), out xx [2], out yy [2]); Zoom_XY (h + h * i, h0 + h * j, func (h + h * i, h0 + h * j), out xx [3], out yy [3]); e.Graphics.DrawLine (p, xx [0], yy [0], xx [1], yy [1]); e.Graphics.DrawLine (p, xx [1], yy [1], xx [2], yy [2]); e.Graphics.DrawLine (p, xx [2], yy [2], xx [3], yy [3]); e.Graphics.DrawLine (p, xx [3], yy [3], xx [0], yy [0]); }} Private void Form2_Paint (object sender, PaintEventArgs e) {Show_Graphic (e); } Private void button1_Click (object sender, EventArgs e) {beta = beta + 0.1; Invalidate (); } Private void button2_Click (object sender, EventArgs e) {beta = beta - 0.1; Invalidate (); } Private void button3_Click (object sender, EventArgs e) {alfa = alfa + 0.1; Invalidate (); } Private void button4_Click (object sender, EventArgs e) {alfa = alfa - 0.1; Invalidate (); } Private void Form2_MouseDown (object sender, MouseEventArgs e) {f_show = true; } Private void Form2_MouseUp (object sender, MouseEventArgs e) {f_show = false; } Private void Form2_MouseMove (object sender, MouseEventArgs e) {double a, b; if (f_show) {a = eX - (int) (width / 2); b = eY - (int) (height / 2); if (a! = 0) alfa = Math .Atan (b / a); else alfa = Math .PI / 2; beta = Math .Sqrt (Math .Pow (a / 10, 2) + Math .Pow (b / 10, 2)); Invalidate (); }}}}

10. Програмування події кліка на кнопці button1 форми Form1 (виклик форми малювання графіка функції).

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

Обробник події кліка на кнопці Button1 має вигляд.

private void button1_Click (object sender, EventArgs e) {Form2 form2 = new Form2 (); // Прямокутник, в якому буде виведений графік функції form2.left = 20; form2.top = 20; form2.width = 300; form2.height = 300; 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.ShowDialog (); }

11. Запуск програми.

Після запуску програми на виконання, форма графіка функції зображена на малюнку 5.

Мал Мал. 5. Результат виконання програми

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.