Візуалізація графіка функції С# і OpenGL

Створення візуалізації анімованого графіка функції на C# та OpenGL

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

Це буде реалізовано наступним чином: за графіком рухається червона точка, що приймає значенняyдля заданогоxу нашому графіку (по всій видимій області). Крім цього, біля курсора візуалізуватимуться його координати (рис. 1).

функції
Малюнок 1. Візуалізація анімованого графіка функції. Створіть основу програми так, як це було описано вглаві 4.4. Тільки не додавайте кнопки «Візуалізувати» та «Закрити», обмежтеся елементомSimpleOpenGLControl.

Вікно повинне мати форму, як показано на малюнку 1.

Додайте в проект таймер, назвіть його (параметрnameу властивостях таймера)PointInGrapі встановіть у його властивості інтервал30мілісекунд. Після цього клацніть по ньому двічі, щоб створити функціюPointInGrap_Tick, що відповідає за обробку подіїontimer.

Тепер, коли створено основу програми, ми перейдемо до вихідного коду. Він буде заснований на7функціях, які ми зараз розглянемо, але спочатку перед кодом функції-конструктора класу додайте ініціалізацію наступних змінних:

Першою функцією є обробник події завантаження формиForm1_Load. Тут при завантаженні програми буде проведена ініціалізаціяOpenGLдля подальшої візуалізації.

ІніціалізаціюOpenGLз двовимірною проекцією ми розглянули в попереднійчастини глави, тому тут все має бути зрозуміло. Єдиною відмінністю є те, що код став трохи докладнішим. Код цієї функції:

Як бачите, майже нічого не змінилося. Тепер звернімося до функціїPointInGrap_Tick. Ця функція викликається із затримкою30мілісекунд.

У ній ми ведемо відлік того, з якого елементу масиву з координатами графіка ми зараз візьмемо координати, які використовуємо для малювання червоної точки. Звідси так само викликається функціяDraw, що відповідає за візуалізацію.

Код цієї функції:

Тепер перед тим як перейти до функцій, що відповідають за візуалізацію, ми розглянемо кілька невеликих допоміжних функцій.

Почтемо з функціїAnT_MouseMove. Ця функція додається створенням подіїMouseMoveдля елементаSimpleOpnGLControl(AnT). Подія створюється аналогічно до того, як ми її створювали вглаві 2.2. Тільки в цьому випадку ми переходимо до властивостей елементаAnTі вже в них переходимо у вкладкуEventі додаємо подіюMouseMove.

У цій функції ми виконуємо збереження поточних координат миші, щоб у майбутньому використовувати їх при візуалізації графіка, а також обчислюємо розміри ліній, які за нормалями з'єднують координати вказівника миші з координатними осями (дві червоні лінії на малюнку 1).

Код цієї функції виглядає так:

Тепер розглянемо функцію, яка здійснюватиме візуалізацію текстових рядків. Ця функція встановлює координати виведення растрових символів відповідно до координат, переданих у параметрахxтаy, а потім у циклі перебирає всі символи із зазначеного у параметрі рядка тексту. Кожен із символів візуалізується за допомогоюфункції. У цій функції вказується шрифт для виведення та змінна типуcharдля візуалізації.

Код функції виглядає так:

Наступна функція, яку ми торкнемося - це функція, що обчислює координати для побудови графіка. У ній ініціалізується масив координат і проводиться обчислення всіх координат графіка залежно від зазначеного діапазону значеньxта кроку збільшення цих значень.

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

Функція, що виконує візуалізацію графіка

Так як візуалізацію графіка можна віднести до конкретної підзадач функції візуалізації сцени (і щоб не захаращувати функцію візуалізації сцени), ми винесемо візуалізацію графіка в окрему функцію.

У цій функції спочатку буде перевірено прапор, що сигналізує про те, що координати графіка обчислені та занесені до масиву (зміннаnot_calculate). Якщо прапор вказує, що прорахунку значень ще не було, викликається функція, яка порахує значення координат точок графіка і заповнить ними масив.

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

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

Вихідний кодцієї функції:

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

Код цієї функції виглядає так: