Программный продукт "Графический редактор учебно-методических материалов"

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



к и вычисленного значения функции к значениям пикселей экрана. А, следовательно, задача сводится к построению графика функции одной переменной по пикселям экрана. Решение данной проблемы состоит в использовании следующих функций преобразования значений функции из одной системы координат в другую:

,(9)

где X, Y - координаты точки графика функции в системе экранной системе координат, CX, CY - координаты центра экранной системы координат, X1, Y1 - координаты точки графика в исходной системе координат заданной пользователем, deltaX, deltaY - коэффициенты сжатия/растяжения исходной системы координат.

Коэффициенты сжатия/растяжения вычисляются по следующим формулам:

,(10)

где Xmax, Xmin - максимальное и минимальное значения интервала рассмотрения функции; Ymax, Ymin - максимальное и минимальное значение интервала отрисовки по оси ординат; W, H - ширина и высота экрана соответственно.

Для хранения полученных точек используется специализированный динамический массив длинной равной значению количества пикселей OpenGL сцены, в который помещаются, по мере вычисления, значения преобразованных координат. Если в ходе вычисления значения функции происходит переполнение, например при делении на ноль, то в качестве значения функции и её аргумента ставиться точка со значениями (-100000, -100000). Такая точка при рисовании не будет учитываться.

Процедура рисования состоит из цикла, позволяющего пройти по всем значениям вычисленных ранее точек. Рисование только точки не позволяет добиться непрерывной функции, что связано с неточностью округления значений, поэтому для рисования используется константа OpenGL с именем GL_LINES, при этом на каждом этапе строится прямая соединяющая две соседние точки массива. Такой подход позволяет создавать видимость непрерывного графика функции.

Таким образом, работа модуля по построению графика функции сводится к выполнению двух процедур: определения значений графика функции и рисования полученных значений функции на экране. Блок-схема алгоритма вычисления, в соответствии с описанным выше, представлена на рисунке 3.6.

На данной блок схеме в начале вычисления производится инициализация переменных используемых в дальнейшем при вычислении, так устанавливается начальное значение curX, хранящее значение текущего для вычисления аргумента, а также вычисляются ранее описанные переменные CX, CY, deltaX, deltaY. Следующим этапом является организация цикла по всем элементами массива, количество значений в котором характеризуется ранее описанной переменной W. В цикле для вычисления значения функции fvalue используется специальная процедура, в которую подается вершина бинарного дерева, текущее значение аргумента curX и флаг, указывающий на возможные ошибки вычисления. Далее если значение флага после вычисление истина, значит, в ходе вычисления произошла ошибка переполнения, в противном случае процедура возвращает значение введенной функции от заданного аргумента. В случае отсутствия ошибки вычисления полученное значение функции и аргумента преобразовывается в экранные координаты и заносится в массив, в противном случае устанавливаются значения, указывающие на точку разрыва первого или второго рода. Следующий блок позволяет изменить значение текущего аргумента на шаг, и если не достигнуто вычисление массива, то процедура продолжает вычислять значения функции на интервале. В конце вычислительной процедуры получаем массив, заполненный значениями функции, при этом каждому значению функции соответствует некоторое значение аргумента. Данный массив подается в функцию рисования, где, проходя последовательно каждый его элемент, производится рисование полученных точек, соединенных линиями на экране.

3.3.2.6 Заливка примитивов

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

Суть метода состоит в следующем: экземпляр класса вызывает метод pointInPoligon, с указанием точки, которую выбрал пользователь для установки заливки. Процедура создает специализированный регион типа HRGN и при помощи стандартных средств проверяет, попадает ли данная точка в регион заданный точками многоугольника. В случае, когда точка принадлежит замкнутому региону, производится установка свойства fcolor, хранящего значение цвета для заполнения.

При вызове метода Draw для реализации заливки по точкам строится с помощью использования константы GL_POLYGON заданной в библиотеке OpenGL замкнутый многоугольник, с применением цвета заливки fcolor. Так как при отображении в сцене объекты могут перекрывать друг друга, то после построения залитого многоугольника необходимо построить замкнутую линию для отображения границы замкнутого многоугольника. Таким образом, основным методом в реализации заливки является метод проверки попадания точки в замкнутый регион.

Проверка попадания точки в замкнутый регион требует выполнения следующей последовательности шагов: построение региона для проверки попадания точки, проверка попадания точки в регион, установка цвета заполнения.

Построение региона реализуется в цикле путем создания массива точек типа P

Copyright © 2008-2014 geum.ru   рубрикатор по предметам  рубрикатор по типам работ  пользовательское соглашение