Введение
Рассматривается полная система уравнений Навье Стокса, решения которой описывают течения сжимаемого вязкого теплопроводного идеального газа [1]. Система дифференциальных уравнений для переменных и программа их вычисления содержатся в работе [4]. Результатом работы программы являются массивы, записываемые в файлы данных[2]. Эти массивы содержат значения давления, удельного объема и скоростей. Файлы открываются в ППП MathCAD (MatLab) и произвести анимацию процессов протекающих в течении газа[3].
Однако, использование программ MathCAD’а не позволяет преобразование системы координат в процессе анимации, что является существенным недостатком. Так, например, если необходимо повернуть график или изменить масштаб, то нужно заново войти в ППП, внести изменения в настройки и провести анимацию, сохраняя в виде видеоролика.
В дальнейшем планируется построить программу для прямой анимации графика векторного поля скоростей.
Постановка задачи
Разработать приложение, которое выводит на экран монитора график поверхности с возможностью поворачивать график, выводить оси координат OX, OY, OZ и легко перемещаться в разные моменты моделируемого времени
Математическая постановка задачи
Рис. 1. Поворот и параллельный сдвиг системы координат.
График поверхности будет строиться в параллелепипеде с размерами (xx1,xx2), (yy1,yy2), (zz1,zz2). Для поворота системы координат введем понятие точки с координатами (x0,y0,z0), а также углов относительно которых будет осуществляться поворот всей системы, – относительно оси OZ и – относительно оси OX.
Для решения данной задачи воспользуемся формулами для вычисления (1). Сдвиг в точку с учетом углов α и β описывается матрицами преобразования координат
(1)
После перемножения матриц получим формулу для вычисления .
Обозначим, что в плоскости монитора лежат оси OX и OY, а ось OZ перпендикулярна экрану. Пусть переменные xx и yy обозначают точку на экране монитора, тогда (xx, yy) искомые точки графика будут найдены по формуле (2)
(2)
– коэффициенты перспективы, находятся экспериментально.
Написание программы
Создадим форму и расположим на ней элементы, показанные на рисунке 2. На форме главным образом располагаются поля для ввода размеров слоя (N, M), время моделирования (TK), и частота кадров (FPS). После открытия файла данные поля отключаются, а вкладки активируются, на них можно менять область определения графика поверхности, регулировать масштабы осей и регулировать подписи[6].
Для работы с графиком поверхности объявим переменные, показанные на листинге 1. Переменные , , , , обозначают область определения графика поверхности, значения из массива равномерно заполняют поверхность с шагом и , где ; . (4)
Рис. 2. Главное окно программы.
Пользователь должен вводить размеры моделируемой области (N,M), время моделирования (TK), область определения графика поверхности по осям OX, OY, OZ, и масштабирования графика в целом, так и по осям.
Листинг 1. Объявление переменных
В программе обьявляются функции, перечислим основные из них:
Функция для преобразования координат и масштабирования
Функция для рисования графика поверхности.
Функция чтения данных из файла
Функция анимирования графика поверхности
Переменным N, M присваиваем значения с формы. Количество кадров (переменная C) определяется TK x FPS (время моделирования умножить на колличество кадров в секунду). Этих данных достаточно для загрузки массива в память.
На листинге 2 показан отрывок из функции заполнения массива данными из файла. Обратим внимание что изначально файл можно представить как одномерный массив, наша задача конвертировать его в трехмерный с индексами , где индекс номер кадра, индексы и соответствуют элементу слоя.
Листинг 2. Фрагмент функции импорта даных.
Теперь массив находится в памяти. Следующим шагом будет написание функции преобразования координат графика поверхности(x,y,z) в каординаты точки на мониторе(xx,yy). Функция приведена полностью на листинге 3. Переменные xx и yy являются глобальными, после вызова функции Zoom_xyz() считываем с них значение.
Листинг 3. Преобразование координат.
И последняя основная функция приведена на листинге 4. В ней отрисовывается график поверхности. Весь слой делится на прямоугольники которые будут выводиться на экран по отдельности, ширина и длина прямоугольников определяется по формуле (4). Так же в этой функции отрисовываются оси, выводится надписи и тд..
Листинг 4. Отрывок функции вывода графика поверхности на экран
Функция pictureBox_Paint() является методом события Paint, обьекта PictureBox, расположенного на форме. Это нужно для того чтобы изображение не исчезало при перекрытии другми оконами или изменении размеров.
Теперь наш график ввыводится на экран однако нам нужно его поворачивать перемещать и масштабировать. Для этого настроим перемещение на правую кнопку мыши, поворот на левую, а масштабирование на колесико мыши. В событиях на обьекте PictureBox добавим метод MouseMove(перемещение мыши по обьекту). В нем определяем какая кнопка мыши нажата. На листинге 5 приведен отрывок кода для поворота системы координат, перемещение осуществляется подобным образом.
Листинг 5. Отрывок функции обработки поворота и перемещения графика.
Для того что бы настроить колесико мыши на масштабирование графика поверхности необходимо определить метод для события MouseWheel. Делается это в функции инициализации компонентов
Листинг 6. Добавление метода прокрутки колесика мыши.
И последнее что нужно сделать для анимации - добавить таймер, в нем изменять номер слоя и обновлять изображение (листинг 7).
Листинг 7. Таймер анимации
Теперь можно запустить приложение на выполнение и протестовать его работу (рисунок 3).
Рис. 3 Результата работы программы.