Визуализация инженерных и научных расчетов
· Терминология программы
· Формат файла со служебной информацией (pre-файла).
· Команды программы
· Скриптовый режим программы
· Запуска программы.
Терминология программы.
Прежде чем приступить к описанию работы с программой, необходимо пояснить несколько терминов, которые будут использоваться.
· k - шаг моделирования. Т.е. если у вас прибор промоделирован в нескольких режимах (например, при разных потенциалах на контактах полупроводника), то число k отражает номер этого режима.
· pre-файл - файл со служебной информацией (например, размерности массива)
· скрипт - последовательность команд (сценарий), записанных в текстовый файл, которые программа может интерпретировать.
· i - переменная в трехмерном массиве TDMas. Ее аналог - координата y
· j - переменная в трехмерном массиве TDMas. Ее аналог - координата x.
· Формат данных - формат по которому записываются данные в файл.
Формат pre-файла.
Pre-файл (от preset - предварительные установки)- это файл с установками, необходимыми для работы программы, а также с оформлением шкал.
Минимальная длина этого файла в строках - три, максимальная не ограничена, но читаться будут только первые восемь. Итак построчно:
1. Максимальное значение k. Формат: I2 (integer, две цифры)
2. Максимальное значение i. Формат: I2
3. Максимальное значение j. Формат: I2
Очень важно! Эти три строки обязательно должны быть в файле, иначе работа программы завершится с ошибкой. К тому же их нужно обязательно правильно и точно указать. Согласно этим параметрам формируются внутренние массивы программы и потом заполняются данными. Ошибка может повлечь за собой потерю данных или их искажение.
4. Коэффициент по оси X (j). Это позволяет отобразить данные не с теми координатами, которые предлагает AV, а с необходимыми вам. Т.е. индексы массива будут переведены, например, в микроны. По умолчанию равен 1 (т.е. на шкале отображаются индексы массива). Формат: E4.2 (т.е. вещественный, две цифры после запятой. Например, 0.50)
5. Коэффициент по оси Y (i). По умолчанию равен 1. Формат: E4.2
6. Имя оси X. Это имя отображается как имя заданной оси. Длина - не более 20 символов. По умолчанию : `X'.
7. Имя оси Y. Не более 20 символов. По умолчанию: `Y'.
8. Имя оси Z. (ось результатов). Не более 20 символов. По умолчанию: `Z'
Далее можно вставлять свои комментарии и пояснения. Программой они не учитываются.
Команды программы.
К сожалению язык Fortran не предоставляет достаточно мощных подпрограмм обработки строк. Поэтому все команды имеют вид не команда операнды, а просто команда. Далее, при необходимости, программа требует ввод дополнительных данных, обычно - координат, но помимо этого и различных значений. Внимание: все команды должны быть набраны в нижнем регистре.
Команды можно разделить на четыре группы:
1. Команды помощи
2. Виды отображения
3. Анимация
4. Служебные
Рассмотрим все команды (включая их дополнительный ввод) по их видам:
Команды помощи:
· help - эта команда выводит информацию о программе, ее версии и список всех доступных команд. Упоминание о ней есть в строке приглашения к вводу (Enter comand (help for comand list)>).
· status - эта команда выводит сообщение о текущих установках: максимальное и минимальное i, максимальное и минимальное j, максимальное k, текущее k, значение delay.
Виды отображения:
· visual - эта команда включает 3D-вид отображения. При запуске программы включается именно он. Она не требует дополнительного ввода.
· plain3d - эта команда включает отображение в виде растровой карты (контрастной заливки). В этом виде нельзя проводить анимацию. Не имеет дополнительного ввода.
· plainx - эта команда переключает в режим отображения одномерных массивов. Она позволяет отобразить сечение по Y. (Т.е. будет отображаться массив с изменяющейся координатой X и постоянной координатой Y). Требует ввод i.
· plainy - эта команда также переключает в режим отображения одномерных массивов. Она позволяет отобразить сечение по X. (Т.е. будет отображаться массив с изменяющейся координатой Y и постоянной координатой X). Требует ввод j.
Анимация.
· anim - эта команда позволяет провести анимацию при выбранном типе отображения (кроме контрастной заливки). При 3D -виде (команда visual) она требует только ввода начального значения k (k1) и конечного значения k (k2). При сечении по Y (команда plainx) она требует ввода координаты i, при каком значении этой переменной будет происходить анимация. При сечении по X (команда plainy) она требует ввода координаты j, при каком значении этой переменной будет происходить анимация. По окончании анимации текущее k принимает значение k2.
Служебные команды.
· k - эта команда позволяет изменить текущее значение k. При наборе k<0 k становится равным 1. При наборе k>max k, k становится равным max k.
· delay - эта команда позволяет изменить значение переменной delay, которая определяет задержку между кадрами анимации. Это значение нисколько не указывает на количество секунд или миллисекунд, на которые происходит задержка. При равных значениях переменной delay, более быстрые компьютеры будут давать более маленькую задержку. Начальное значение - 80.
· pause - эта команда предназначена для скриптового режима работы. Она позволяет приостановить программу. Требует дополнительного ввода количества задержек.
newfile - эта команда позволяет загрузить новые файлы. Она перебрасывает в начало работы с программой.
· exit - выход из программы.
Скриптовый режим программы.
Наличие этого режима - прямое следствие консольного интерфейса программы. Т.е. для создания такой возможности не было необходимости в дополнительных затратах.
Скрипт (сценарий) состоит из команд программы и требуемого для них дополнительного ввода. Кроме этого, первые две строки скрипта это имена pre-файла и файла данных соответственно. Приведем простой пример скрипта:
out.pre
out.txt
plainx
20
delay
50
anim
2
12
20
pause
2
exit
Его работа заключается в следующем:
· Считывается pre-файл out.pre из директории где находится программа console.
· Считывается файл данных out.txt из директории где находится программа console.
· Выполняется команда plainx (сечение по Y) с координатой i=20. Координата задается в следующей строке после команды. Любой дополнительный ввод начинается с новой строки скрипта.
· Замена стандартного значения задержки (80) на новое - 50.
· Далее выполняется анимация этого вида. После команды anim следуют три строки с ее параметрами - начальное k (2), конечное k (12) и координата i (20), по которой будет происходить сечение.
· Потом выполняется команда pause с параметром 2. Это дает двойную задержку перед выполнением следующей команды.
· Далее идет команда exit, закрывающая экземпляр AV и программу console.
Заметим, что построение командного интерпретатора позволяет после первых двух строк вставлять любые комментарии. Эти комментарии программа попытается обработать как команды, но не найдя таких команд в своем списке просто их проигнорирует. Однако очень важно помнить, что первые две строки сценария - это обязательно имена pre-файла и файла данных.
Запуск программы console.
Как видно из предыдущих подразделов программу можно запустить в двух режимах: командном и скриптовом.
· Запуск в командном режиме: при запуске в командном режиме сначала выводится список всех команд, затем запрашивается имя файла со служебной информацией (pre-файла), затем имя файла с данными (результатами расчетов).
· Запуск в скриптовом режиме: это можно осуществить только при помощи сеанса MS-DOS (Windows 95/98) или программ-оболочек с командной строкой DOS (например Far, Dos Navigator, Norton Commander). Скриптовый режим обеспечивается при помощи перенаправления ввода. Т.е. в командной строке указывается имя программы, потом символ перенаправления `<, затем имя файла со скриптом. Пример командной строки: console.exe < in.txt. При выполнении этой команды весь ввод будет браться из файла скрипта in.txt.
1.6 Описание интерфейса между программой визуализации и прикладной инженерной программой.
Инженер, собирающийся воспользоваться программой console должен организовать в своей программе вывод результатов в текстовый файл. Каждое новое число с новой строки. Приведем примеры вывода результатов в файл для Fortran- и C-программ.
Fortran.
Формат выводимых чисел для языка Fortran - E12.5. Т.е. в текстовом файле будет число в виде 1.23456E+02 с пробелом в начале если число положительное и знаком ` - ` если отрицательное. Пример кода:
Допустим у нас есть массив, объявленный как
Real(4) M(lbi:ubi, lbj:ubj)
Тогда записывать его значения в файл out.txt мы будем следующим образом.
Объявим формат E12.5:
90 FORMAT (E12.5)
Сначала открываем файл:
open (3,FILE='out.txt', STATUS='UNKNOWN')
Далее на каждом шаге моделирования записываем в него информацию из массива следующим образом:
do i=lbi,ubi
do j=lbj,ubj
write(3,90) M(i, j)
end do
end do
После того как пройдены все шаги моделирования, файл необходимо закрыть:
close (3)
Таким образом мы можем записать все шаги моделирования в файл данных, чтобы впоследствии им воспользоваться для работы с программой console.
C/C++
Для С/С++ программ необходим формат “%12.5E”. Все числа необходимо приводить в строки. Напомним, что файл должен быть текстовым.
Пример кода с пояснениями.
Для начала объявим переменные массива, файла и вспомогательную строку:
float M[UBI][UBJ];
FILE* f;
char str[12];
Далее в программе необходимо открыть файл:
f=fopen(“out.txt”,”wt”);
Далее на каждом шаге моделирования записываем в него информацию из массива следующим образом:
for (i=0;i<UBI;i++)
for (j=0;j<UBJ;j++) {
sprintf(str, "%12.5E", M[i][j]);
fputs(str,f);
fprintf(f,”\n”);
}
После того как пройдены все шаги моделирования, файл необходимо закрыть:
fclose(f);
Обратите внимание на использование функции sprintf. Это наиболее простой способ привести float-числа к нужному виду, идентичному с форматом E12.5 используемому в программе console для считывания данных.
1.7 Тестирование программы и результаты тестовых расчетов
Проведем тестирование программы на файлах данных созданных Fortran и C++ программами.
Приведем листинг Fortran-программы:
program Sample
IMPLICIT NONE
real(4), allocatable :: M(:,:)
integer(1), parameter :: lbi=1, ubi=20, lbj=1, ubj=20
integer(1) :: i,j
allocate (M(lbi:ubi,lbj:ubj))
do i=lbi,ubi
do j=lbj,ubj
M(i,j)=sin(real(i))+sin(real(j))
end do
end do
90 FORMAT (E12.5)
open (3,FILE='out.txt',STATUS='UNKNOWN')
do i=lbi,ubi
do j=lbj,ubj
write(3,90) M(i,j)
end do
end do
close(3)
end program Sample
Как видим здесь формируется двумерный массив M(1:20,1:20) который заполняется значениями M(i,j)=sin(i)+sin(j). Составим pre-файл для него (out.pre):
1
20
20
1.00
1.00
X-scale
Y-scale
Function
Результаты вывода программы:
рис 5.
1. 3D-вид (visual) (рис 5
2. Контрастная заливка (рис 6):
рис 6.
3. Сечение по X (команда plainy с параметром 20) (рис7):
рис 7.
1-30.
Проверим теперь взаимодействие с C++ программой:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define UBI 20
#define UBJ 20
FILE* f;
char str[12];
float M[UBI][UBJ];
int i,j;
void main()
{
for (i=0;i<UBI;i++)
for (j=0;j<UBJ;j++)
if (i<19) M[i][j]=(float)i+sin((float)j)
else M[i][j]=0;
f=fopen("out.txt","w+t");
for (i=0;i<UBI;i++)
for (j=0;j<UBJ;j++) {
sprintf(str, "%12.5E", M[i][j]);
fputs(str,f);
fprintf(f,”\n”);
}
fclose(f);
}
Здесь формируется массив M[20]][20] (необходимо помнить, что в C массивы начинаются с 0) и заполняется функцией M[i][j]=i+sin(j). Pre-файл для него такой же как и в предыдущем примере.
Результаты вывода программы console:
1. 3D-вид (рис 8):
рис 8.
2. Контрастная заливка (рис 9):
рис 9.
3. Сечение по X (команда plainy) (рис 10):
рис 10.
Мы рассмотрели все виды и варианты работы программы, протестировали ее во всех режимах. Программа прекрасно согласуется как с Fortran-программами, так и с C/C++ программами. Помимо этих тестов программа была протестирована на результатах вычисления параметров полупроводниковых приборов и показала хорошие результаты.
Системные требования.
Работа программы тестировалась на системах Windows 98, Windows 2000 и Windows XP. Минимальные системные требования - Pentium 166 MMX, 32Mb RAM, 1Mb Video. Как видим поддержка OpenGL не обязательна, хотя желательна. Размер программы, вместе с пакетом Compaq Array Visualizer v1.5 - 16Mb.
Заключение
Разработанная программа, использующая AV, является своеобразным гейтвеем (от англ. gateway) с командной оболочкой, позволяющим передавать данные из рассчитывающей программы инженера в пакет графического отображения информации. Она предоставляет более простой интерфейс для передачи данных. К тому же данные сохраняются в файл и нет необходимости в переносе программы, достаточно переносить только результаты.
Помимо этого, за счет скриптового режима программа позволяет устраивать презентации и показы. Несложная командная система не требует длительного изучения и освоения. Программу можно освоить за 30-40 минут.
Разработанную программу можно использовать на лабораторных работах студентов, для отображения полученных ими результатов. Она может использоваться сотрудниками институтов или предприятий для отображения результатов моделирования как в процессе программирования и отладки моделирующей программы, так и в процессе демонстрации результатов. Таким образом программа console имеет университетский уровень.
Раздел 2.
Технология разработки программного обеспечения для визуализации инженерных расчетов
Введение
Десять - пятнадцать лет назад ЭВМ либо не имели возможности графического вывода, либо графические дисплеи были очень слабы и не подходили для качественного вывода информации. Печатающие устройства существовали только для символьного вывода. Поэтому все результаты расчетов выводились в виде числовых распечаток, по которым проводился анализ, строились графики и т.д. Пять - десять лет назад графические системы позволяли выводить графики с приемлемым качеством изображения, но только для одномерных случаев. Вывод двухмерных случаев в виде поверхностей требовал огромных вычислительных затрат, с которыми не справлялись процессоры тех лет.
В наше время, когда высокого быстродействия достигли не только ЦП и математические сопроцессоры, но и графические сопроцессоры вывод результатов в графическом виде ускорился в сотни раз, построение трехмерных изображений и их преобразование заметно упростилось. Поэтому для всех современных САПР и инженерных программ необходимо представление результатов в виде графиков, поверхностей и т.д. Как и всякий процесс, написание программ обработки результатов для последующего графического вывода и вывод имеет свою технологию. В данном разделе и будет рассмотрена такая технология.
2.1 Этапы разработки программного обеспечения для визуализации инженерных расчетов.
Для начала выделим основные этапы создания ПО для визуализации инженерных расчетов (далее просто ПО).
1. Постановка задачи. Формирование требований к выводимой информации.
2. Создание структуры данных и интерфейса с рассчитывающими программами.
3. Построение математической модели отображаемой информации (2 подхода):
Использование готовых библиотек OpenGL или DirectX, а также готовых компонент ActiveX.
Построение собственных математических моделей.
4. Создание интерфейса пользователя.
Итак, мы видим пять основных этапов, различных по сложности и объему работ. К тому же, благодаря большому количеству разработчиков библиотек для графического вывода у нас есть два качественно разных подхода.
Рассмотрим каждый этап в отдельности более подробно.
2.2 Постановка задачи
Очень важно правильно сформулировать задачу и требования к ПО. Это поможет избежать лишних затрат на создание ненужных подпрограмм вывода, либо переделки готовых программ для дополнения необходимого. Так же при постановке задачи необходимо решить стоит ли использовать подход с построением собственных математических моделей, или достаточно ограничиться уже готовыми библиотеками и компонентами, пусть и платными. В дополнении необходимо учесть необходимость вывода числовой информации, а так же создание “твердой копии”, т. е. распечатки на принтере.
При определении вида графической информации, нужно решить для каких случаев она будет выводиться - двумерных или же только одномерных. При выборе двумерных случаев у нас тоже есть выбор: можно выводить в виде поверхностей, либо в виде “контрастной заливки”, или же оба этих случая. При постановке задачи на вывод надо учитывать собственные вычислительные ресурсы и необходимую скорость создания приложения.
При определении подхода к построению математической модели вышеуказанные два фактора так же играют главную роль. Собственная модель может обойтись дороже, так как на ее создание уйдет время и, к тому же, как правило, такие модели не задействуют вообще или не на полную мощность возможности графического сопроцессора, а это шаг назад. В связи с этим в последнее время создание собственных математических моделей становится все менее целесообразным и экономически выгодным.
2.3 Создание структуры данных и интерфейса с расчетной программой
Этот этап очень важен. От структуры данных зависит быстродействие создаваемого ПО, компактность кода и файлов, в которых хранятся результаты расчетов.
Интерфейс с рассчитывающей программой может быть совершенно различным. Информация может передаваться через оперативную память (ОЗУ), через файловую систему в виде бинарных файлов или, более объемных, текстовых файлов. Файлы могут быть компрессированы или нет. Какой из способов выбирать зависит от нескольких факторов:
1. Скорость выполнения расчета - если рассчитывающая программа проводит быстрый анализ, то, возможно, целесообразнее не создавать лишних файлов на внешнем носителе и использовать ОЗУ.
2. Частота изменения входных данных - при частой смене входных данных для расчетов намного эффективнее будет применение передачи результатов через ОЗУ, с вызовом программы визуализации как подпрограммы.
По этим двум факторам можно сказать еще следующее: если программа выполняет расчеты долго, или входные данные не меняются (используется итеративный процесс) целесообразней будет использование файловой системы для долгосрочного хранения.
3. Объем передаваемой информации - если объем очень большой, то эффективнее будет хранить его в виде файла.
Выбор вида файла (бинарный или текстовый) зависит от языка программирования. Однако следует учесть, что бинарный файл меньше по объему.
Компрессировать или нет файл с результатами определяется следующим фактором: если вы пишете ПО для большой САПР и программисты, принимающие участие в этом проекте используют одну и ту же подпрограмму компрессии, то в этом случае следует выбрать сжатый файл. Если же вы пишите университетскую программу или программу для предприятия, на которой будут смотреть результаты своих программ инженеры вашего коллектива, то в этом случае, для упрощения процесса написания рассчитывающих программ следует выбрать не сжатые файлы.
В структуру данных также включается управляющая информация для ПО. Она может включать в себя различные параметры как-то: границы массивов данных, значения или шаги по осям, виды представления. При выборе файлового интерфейса ее можно хранить либо отдельно от основных данных, либо вместе с ними. Это уже зависит от вкуса программиста.
2.4 Построение математической модели отображаемой информации.
2.4.1 Использование готовых библиотек
В наше время, как отмечалось выше, большинство разработчиков программного обеспечения, связанного с графикой, используют стандартные библиотеки от крупных производителей программ (Microsoft, Silicon Graphics, 3Dfx). Этими библиотеками являются: OpenGL, DirectX, Direct Draw. Их использование ускоряет процесс разработки программы, к тому же они в полной мере задействуют графический и математический сопроцессоры, что увеличивает производительность. Эти библиотеки включают в себя и аппроксимацию и методы работы с двухмерными и трехмерными объектами, такие как аффинные преобразования и методы скрытия невидимых линий, т. е. Так же исчезает необходимость в затратах на сложный процесс математического моделирования.
Помимо этого, некоторые производители компиляторов поставляют пакеты обработки результатов математического анализа для отображения в графическом виде. Обычно эти пакеты поставляются в виде компонентов ActiveX (для Windows-платформ). Реже поставляются готовые универсальные оболочки. Программы, написанные для них не нуждаются в разработке интерфейса пользователя большой сложности, что, например, для языка Visual Fortran, использующего только WIN32 API, заметно сокращает время и затраты на создание ПО для визуализации. Частным примером такого пакета является рассматриваемый в данной дипломной работе Compaq Array Visualizer (версия 1.5), включающий в себя компоненты ActiveX: Avis2D (для отображения двумерных массивов данных) и AvisGrid (для отображения числовых данных в виде таблицы).
Использование таких компонент и пакетов еще больше ускоряет процесс разработки (хотя, вследствие дороговизны пакетов не дает более экономически выгодных результатов). К преимуществам разработки на готовых универсальных оболочках является стандартизация, т.е. пользователю или инженеру нет необходимости изучать новые программы и их системы интерфейсов и меню. Таким образом, недостающего экономического эффекта можно достигать путем сокращения расходов на обучение персонала.
Негативная сторона заключается в затратах на обучение программистов, а так же в затратах на оболочки визуализации. Помимо этого библиотеки, а тем более оболочки, могут не иметь нужных вам функций (например: неудобно выводить данные в логарифмическом масштабе при использовании Avis2D). Кроме того, для использования данного подхода, так как в этом случае крупные производители ПО не применяют технологию “открытого кода”, практически невозможно учесть ошибки, содержащиеся в коде скомпилированных библиотек и оболочек. Такие ошибки обнаруживаются только в процессе использования программы. Но, по сравнению с исправлением программы с собственной математической моделью, это занимает гораздо меньшее время, так как там ошибки могут содержаться не только в коде, но и в модели.
2.5 Построение собственных математических моделей
При разработке своей математической модели (далее: модели) необходимо учитывать быстродействие машин, на которых должна исполнятся программа. Таким образом можно пропустить некоторые из описанных ниже математических и алгоритмических методов.
Интерполяция.
Результаты вычисляемые рассчитывающей программой представлены в табличном виде. Для сглаживания графиков и поверхностей необходима интерполяция данных. Существует множество алгоритмов и методов интерполяции. Наиболее быстрым и часто применяемым методом является сплайн-интерполяция, которую мы рассмотрим более подробно.
Кусочно-полиномиальная интерполяция заключается в том, что между любыми соседними узлами сетки функция интерполируется кубическим полиномом (кубическая сплайн-интерполяция). Его коэффициенты на каждом интервале определяются из условий сопряжения в узлах:
fi=yi
f'(xi-0)=f'(xi+0)
f''(xi-0)=f''(xi+0)
Кроме того, на границе, при x=x0 и x=xn ставятся условия:
f''(x0)=0 и f``(xn)=0 (1)
Будем искать кубический полином в виде:
f(x)=ai+bi(x --xi-1)+ci(x-xi-1)2+di(x-xi-1)3, (2)
Из условия fi=yi имеем:
f(xi-1)=ai=yi-1
f(xi)=ai+bihi+ciIi2+dihi3=yi. (3)
hi=xi-xi-1, i=1,2,…,n-1
Вычислим производные:
f'(x)=bi+2ci(x-xi-1)+3di(x-xi-1),
f''(x)=2ci+6di(x-xi-1),
И потребуем их непрерывности при x=xi:
bi+1=bi+2cihi+3dihi2,
ci+1=ci+3dihi, i=1,2,…,n-1 (4)
Общее число неизвестных коэффициентов, очевидно, равно 4n, число уравнений (3) и (4) равно 4n-2. Недостающие два уравнения получаем из условий (1) при x=x0 и x=xn;
ci=0, cn+3dnhn=0.
Выражая из (4) di=(ci+1-ci)/3hi, подставляя это значение в (3) и исключая
ai=yi-1, получим:
i=1,2,…,n-1,
Подставив теперь выражения для bi, bi+1 и di в первую формулу (4),
после несложных преобразований получаем для определения ci разностное уравнение второго порядка.
i=1,2,…,n-1. (5)
C краевыми условиями:
c1=0, cn+1=0. (6)
Условие cn+1=0 эквивалентно условию cn+3dnhn=0 и уравнению ci+1=ci+dihi. Разностное уравнение (5) с условиями (6) решается методом прогонки.
Можно ввести понятие сплайна порядка m как функции, которая является полиномом степени m на каждом их отрезков сетки и во всех внутренних узлах сетки удовлетворяет условиям непрерывности функции и производной порядка m-1 включительно. Обычно для интерполяции используются случаи m=3 (рассмотренный выше кубический сплайн) и m=1 (линейный сплайн, соответствующий аппроксимации графика функции y(x) ломаной, проходящей через точки (xi,yi)).
Работа с трехмерными изображениями.
После проведения интерполяции уже можно построить графики для одномерных случаев. Но двумерные случаи (поверхности) требуют дополнительных математических и алгоритмических методов.
Изображение пространственных объектов на экранной плоскости не возможно без операции проектирования. Видов такого проектирования существует довольно много. Мы остановимся на описании проектирования пучком прямолинейных лучей. Различают два типа таких пучков: пучок лучей, исходящих из одной точки и пучок лучей, параллельный заданному направлению. Для получения проекции заданного объекта на плоскость необходимо провести через каждую его точку прямую из проектирующего пучка и затем найти координаты точек пересечения этих прямых с плоскостью изображения.
В зависимости от взаимного расположения плоскости изображения и направления пучка параллельных прямых, осуществляющих проектирование, различают несколько случаев. Самым простым является тот, когда прямые перпендикулярны плоскости изображения, а сама эта плоскость является одной из координатных плоскостей или параллельна ей.
Для описания преобразований проектирования также удобно пользоваться матрицами. Например, матрица проектирования на плоскость
0yz вдоль оси 0x имеет следующий вид:
Если M(x,y,z) - заданная точка, то соответствующая ей точка на плоскости изображения находится так:v
Таким образом, точка M проектируется в точку M*(0,y,z).
В случае, если плоскость проектирования параллельна координатной
плоскости 0yz, матрица несколько изменяется:
Аналогично записываются матрицы проектирования на две другие координатные плоскости вдоль соответствующих координатных осей:
Матрицы, соответствующие другим случаям взаимного расположения проектирующего пучка параллельных лучей и координатной системы, разумеется, также существуют. Рассмотрим, например, случай косоугольного проектирования, при котором пучок прямых пересекает координатную плоскость 0xy по углом 45o (кабинетная проекция). Тогда соответствующая матрица будет иметь следующий вид:
Для просмотра построенной поверхности необходимо включить операции вращения 3D-объекта и, иногда увеличения. Увеличение целесообразно делать по полученным после процесса интерполяции данным, т.е. пересчитывать функцию снова. А вот вращение, перемещение а также зеркальное отображение необходимо делать при помощи общего аффинного преобразования:
x*=a1x+b1y+c1z+d1,
y*=a2x+b2y+c2z+d2,
z*=a3x+b3y+c3z+d3.
Любое изменение координат, описываемое этими формулами, можно представить посредством комбинации (последовательного выполнения) простейших операций: параллельного переноса, поворота, зеркального отражения и растяжения (сжатия).
Следует, однако, заметить, что при составлении программ приведенная выше покоординатная формула записи простейших преобразований, как правило, не используется. Ее заменяют другой, более удобной матричной записью:
Рассмотрим частный случай для вращения:
- матрица поворота вокруг оси 0x.
- матрица поворота вокруг оси 0y.
- матрица поворота вокруг оси 0z
Операцию параллельного переноса нельзя записать при помощи матрицы используемого размера 3 на 3. Тем не менее, единая матричная запись всех упомянутых преобразований возможно, если формально ввести еще одну дополнительную координату:
Для построения качественного изображения желательно удалить те линии, которые при проектировании на плоскость экрана оказываются невидимыми. Для этого можно использовать различные алгоритмы как-то: алгоритм плавающего горизонта, алгоритм использующий список приоритетов, алгоритм использующий трассировку лучей, алгоритм использующий z-буфер. Последний, наиболее простой разберем подробно.
Это один из простейших алгоритмов удаления невидимых поверхностей. Работает этот алгоритм в пространстве изображения. Идея z-буфера является простым обобщением идеи о буфере кадра. Буфер кадра используется для запоминания атрибутов (интенсивности) каждого пиксела в пространстве изображения, z-буфер - это отдельный буфер глубины, используемый для запоминания координаты z или глубины каждого видимого пиксела в пространстве изображения. В процессе работы глубина или значение z каждого нового пиксела, который нужно занести в буфер кадра, сравнивается с глубиной того пиксела, который уже занесен в z-буфер. Если это сравнение показывает, что новый пиксел расположен впереди пиксела, находящегося в буфере кадра, то новый пиксел заносится в этот буфер и, кроме того, производится корректировка z-буфера новым значением z. Если же сравнение дает противоположный результат, то никаких действий не производится. По сути, алгоритм является поиском по х и у наибольшего значения функции z (х, у).
Главное преимущество алгоритма - его простота. Кроме того, этот алгоритм решает задачу об удалении невидимых поверхностей и делает тривиальной визуализацию пересечений сложных поверхностей. Сцены могут быть любой сложности. Поскольку габариты пространства изображения фиксированы, оценка вычислительной трудоемкости алгоритма не более чем линейна. Поскольку элементы сцены или картинки можно заносить в буфер кадра или в z-буфер в произвольном порядке, их не нужно предварительно сортировать по приоритету глубины. Поэтому экономится вычислительное время, затрачиваемое на сортировку по глубине.
Основной недостаток алгоритма - большой объем требуемой памяти. Если сцена подвергается видовому преобразованию и отсекается до фиксированного диапазона координат z значений, то можно использовать z-буфер с фиксированной точностью. Информацию о глубине нужно обрабатывать с большей точностью, чем координатную информацию на плоскости (х, y); обычно бывает достаточно 20 бит. Буфер кадра размером 512х512х24 бит в комбинации с z-буфером размером 512х512х20 бит требует почти 1.5 мегабайт памяти. Однако снижение цен на память делает экономически оправданным создание специализированных запоминающих устройств для z-буфера и связанной с ним аппаратуры.
Альтернативой созданию специальной памяти для z-буфера является использование для этой цели оперативной или массовой памяти. Уменьшение требуемой памяти достигается разбиением пространства изображения на 4, 16 или больше квадратов или полос. В предельном варианте можно использовать г-буфер размером в одну строку развертки. Для последнего случая имеется интересный алгоритм построчного сканирования. Поскольку каждый элемент сцены обрабатывается много раз, то сегментирование z-буфера, вообще говоря, приводит к увеличению времени, необходимого для обработки сцены. Однако сортировка на плоскости, позволяющая не обрабатывать все многоугольники в каждом из квадратов или полос, может значительно сократить этот рост.
Другой недостаток алгоритма z-буфера состоит в трудоемкости и высокой стоимости устранения лестничного эффекта, а также реализации эффектов прозрачности и просвечивания. Поскольку алгоритм заносит пикселы в буфер кадра в произвольном порядке, то нелегко получить информацию, необходимую для методов устранения лестничного эффекта, основывающихся на предварительной фильтрации. При реализации эффектов прозрачности и просвечивания, пикселы могут заноситься в буфер кадра в некорректном порядке, что ведет к локальным ошибкам.
Хотя реализация методов устранения лестничного эффекта, основывающихся на префильтрации, в принципе возможна, практически это сделать трудно. Однако относительно легко реализуются методы постфильтрации (усреднение подпикселов). Напомним, что в методах устранения лестничного эффекта, основывающихся на постфильтрации, сцена вычисляется в таком пространстве изображения, разрешающая способность которого выше, чем разрешающая способность экрана. Поэтому возможны два подхода к устранению лестничного эффекта на основе постфильтрации. В первом используется буфер кадра, заданный в пространстве изображения, разрешение которого выше, чем у экрана, и z-буфер, разрешение которого совпадает с разрешением экрана. Глубина изображения вычисляется только в центре той группы подпикселов, которая усредняется. Если для имитации расстояния от наблюдателя используется масштабирование интенсивности, то этот метод может оказаться неадекватным.
Во втором методе оба буфера, заданные в пространстве изображения, имеют повышенную разрешающую способность. При визуализации изображения.
Как мы видим построение собственных математических моделей - процесс трудоемкий и сложный. В моделях могут содержаться ошибки, которые исправить гораздо сложнее, чем ошибки в программах. К тому же использование аппаратных функций видеоадаптеров и графических ускорителей требует специальных знаний, на обучение которым тратится много времени. А без таких знаний выполнение графических программ заметно замедляется.
2.6 Создание интерфейса пользователя
Этот этап выделен как заключающий, потому что от вида интерфейса зависит только удобство работы с программой. Однако любой пользователь достаточно быстро привыкает к любому интерфейсу.
С другой стороны, создание хорошего интерфейса пользователя позволит ему быстрее освоить программу и эффективнее с ней работать.
На данный момент существует 2 вида интерфейса пользователя: интерфейс командной строки (называемый так же DOS-интерфейс, UNIX-интерфейс или консольный интерфейс) и графический интерфейс (называемый так же GUI - Graphics Users Interface (графическая среда пользователя) или оконный интерфейс).
Написание консольного интерфейса не трудоемко в плане написания программы, но весьма сложно в плане разработки системы команд. Если система команд разработана неправильно, то зачастую приходится много раз повторять один и тот же ввод, одни и те же команды, что заметно усложняет процесс работы с программой. Для создания программ с консольным интерфейсом достаточно знаний обработки строк и перевода данных из строкового типа в различные числовые.
Страницы: 1, 2, 3
|