УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра Информатики «ТЕХНОЛОГИЯ ВИЗУАЛИЗАЦИЯ И ГРАФИЧЕСКОЕ МОДЕЛИРОВАНИЕ ОТС» Лабораторная работа «Моделирование и простейшая визуализация параметрически заданных поверхностей» Уфа 2019 Содержание Содержание. ........................................................................................................................................ 2 Постановка задачи .............................................................................................................................. 4 Структура решения ............................................................................................................................ 5 Обзор и анализ методов решения ..................................................................................................... 6 1. Моделирование поверхности ................................................................................................. 6 2. Геометрические преобразования ............................................................................................. 8 3. Определение цвета. .................................................................................................................. 12 4. Проецирование. ..................................................................................................................... 16 5. Визуализация. ........................................................................................................................ 16 Описание реализации применяемых методов. .............................................................................. 18 1. Укрупненный алгоритм. ....................................................................................................... 18 2. Детализированный алгоритм. .............................................................................................. 22 Руководство программиста (примерный вариант)........................................................................ 25 Функциональная схема. ............................................................................................................... 27 Руководство пользователя. .............................................................................................................. 29 Краткая теоретическая справка При решении многих задач вычислительной геометрии часто для задания точки используется следующая запись: - для 3D-пространства - для 2D-пространства Запишем уравнение плоскости: Ax + By + Cz +D = 0; (общий вид) (векторный вид) Запись типа - вектор-строка может рассматриваться, как частный случай записи ,где числа x, y, wназываются однородными координатами. Эти три числа однородных координат применяются для обозначения точки в двумерном пространстве. Для определения термина “однородная” воспользуемся уравнением aX + bY + c = 0, описывающем прямую линию в двумерном пространстве. Заменяем X, Yна и и получим: a*x + b*y + c*w = 0 (1) Уравнение (1) принято называть однородным, поскольку оно имеет одинаковую структуру в терминах a*x, b*y, c*w. Соответственно, закономерно отсюда числа x, y, wназовем однородными координатами точки (x, y). Постановка задачи Смоделировать и визуализировать трехмерную каркасную модель и модель с равномерной закраской (flat-закраской) параметрически заданной поверхности с возможностью изменения параметров, цвета закраски, количества сегментов и с возможностью вращения. Дано: 1. Параметрическое уравнения поверхности , 2. Источник света, совмещенный с наблюдателем, находящимся в точке с координатами (0, 0,1,0). Требуется: 1. Смоделировать и отобразить поверхность в виде каркасной модели и с заполнением сегментов по алгоритму flat-закраски. 2. Реализовать возможность изменения ориентации модели поверхности в пространстве с помощью поворота фигуры вокруг осей Ox, Oy, Oz; 3. Реализовать возможность изменения цветов сторон поверхности. 4. Реализовать возможность изменения геометрических параметров поверхности: переменных(u,v) и констант в параметрических выражениях. 5. Реализовать возможность изменения параметров разбиения модели поверхности на сегменты. 6. Реализовать возможность переключения моделей с каркасной на модель с flatзакраской. Структура решения Операции в 3D: 1. Моделирование поверхности. 2. Геометрические преобразования. 3. Определение цвета поверхности. Переход из 3D в 2D: 4. Проецирование. Операция в 2D: 5. Визуализация. Обзор и анализ методов решения 1. Моделирование поверхности В зависимости от способа задания поверхности, можно выделить следующие способы построения геометрической модели поверхности: 1. Явное задание - z = F (x, y) Поверхность описывается с помощью уравнения явного вида z = F (x, y) , где x, y, zсоответствующие координаты точки. Преимуществом данного метода является простота описания. Но данный метод подходит только в тех случаях, когда каждой паре x и y соответствует 1 значение z. Следовательно, использование явного задания лишает возможности строить замкнутые выпуклые фигуры, а также появляются проблемы при вычислениях для участков с касательными, приближающимися к вертикальным. 2. Неявное задание - F (x, y, z)= 0 . Для получения точек поверхности нужно каждую интересующую нас точку пространства (x, y, z) подставить в уравнение и проверить его выполнимость. Недостатком данного метода является неочевидность зависимости между переменными и, следовательно, сложность программной реализации. Как явное, так и неявное представления являются зависимыми от выбора системы координат. 3. Параметрическое задание S=S(u,v) или покординатно: Параметрическое задание поверхности содержит уравнения вида S=S(u,v), где u, v параметры, изменяющиеся в заданных пределах. Для одной пары значений u, v можно вычислить положение одной точки поверхности. Такой подход дает возможность избежать проблем, которые могут возникнуть, когда требуется задать замкнутые кривые и кривые с вертикальной касательной. Так как отсутствует необходимость определения зависимости между переменными и каждая переменная имеет свое уравнение, этот подход более подходящий для реализации на ЭВМ. Однако, необходимы дополнительные параметры – интервалы изменения параметров u, v . В лабораторной работе будем использовать параметрическое задание поверхностей. Программное представление поверхности: а) Вычисление точек. Вычислять точки поверхности в общем случае нецелесообразно, т.к. во-первых, это очень ресурсоемко, а во-вторых, мы ограничены разрешающей способностью экрана. Т.е., в общем случае для произвольной точки поверхности координаты не целые, а вещественные, и зачастую у нас может возникнуть ситуация, что в одном пикселе будут находиться несколько различных точек. Поэтому нам следует заменить поверхность некоторым приближением. Удобным приближением является полигональное представление поверхности. б) Приближенное описание. Разбиение на треугольники. Точное описание поверхности заменяется приближенным описанием, в котором поверхность составлена из соединенных вместе плоских многоугольников. Чем более мелкие многоугольники используются, т.е. чем ближе вершины каждого многоугольника друг к другу, тем точнее представляется поверхность. В пределе мы получаем точное описание поверхности, т.к. этот способ вырождается в перечисление всех точек поверхности. Обычно для разбиения используются треугольники, четырехугольники и т. д. Полигональное представление очень удобно для компьютерной обработки. Т.к. поверхность представляется списком точек пространства, а существует удобный математический аппарат позволяющий, выполнять различные преобразования над точками (поворачивать, проецировать), и вычислять характеристики многоугольников (например нормали). К тому же обработка точек поверхности, требует относительно небольших вычислительных затрат. Хранение всех вершин полигона требует также относительно небольшого количества памяти. На практике наиболее часто производится разбиение изображений на треугольники. Это объясняется следующими причинами: треугольник является простейшим полигоном, вершины которого однозначно задают грань; любую область можно гарантировано разбить на треугольники; вычислительная сложность алгоритмов разбиения на треугольники существенно меньше, чем при использовании других многоугольников; треугольник очень удобен для определения нормали плоскости. для треугольника легко определить три его ближайших соседа, имеющих с ним общие грани. Определим интервалы изменения параметров u, v: [u min , u max ] и [vmin , vmax ] . Будем изменять значения u,v с шагом du, dv в пределах заданных интервалов и при каждом значении находить соответствующие значения x,y,z. Т.к. у нас задано количество разбиений по u, v - N1 и N2, то величина шага будет определять следующим образом: u max u min du ; N1 . v max v min dv N2 Изменяя поочередно u,v, получим сетку, каждому узлу которой будет соответствовать точка с координатами x, y, z, найденными подстановкой значений u,v в параметрические уравнения. Всего таких узлов будет (N1+1)*(N2+1), т.к. точек по одному параметру будет на одну больше, чем количество разбиений N(N1 или N2). Далее необходимо распределить узлы каждого четырехугольного сегмента по двум треугольникам. Так для первого четырехугольника (см. рис.): 1 треугольник: (Umin, Vmin), (Umin+du, Vmin), (Umin, Vmin+dv); 2 треугольник: (Umin+du, Vmin+dv), (Umin+du, Vmin), (Umin, Vmin+dv); Таким образом получим N1*N2 четырехугольных сегментов и, соответственно, 2*N1* N2 треугольников. Распределив узлы сетки по треугольникам, одновременно распределили реальные точки поверхности, соответствующие узлам, по треугольникам, т .е. в итоге получили приближенное представление поверхности. Сохранить информацию о том, какая точка вершиной какого треугольника является можно двумя способами. Первый способ предполагает сохранение координат вершин отдельно для каждого треугольника. Недостатком такого способа является то, что «внутренние» точки сетки поверхности будут сохранены шесть раз (например точка (Umin+du, Vmin+dv) на рис.). В этом случае любые действия, например геометрические преобразования (повороты, сдвиги и т.д.) будут повторяться шесть раз для одной и той же точки. Следовательно, это будут лишние затраты времени. Второй способ сохранения соответствия между треугольниками и точками заключается в хранении для каждого треугольника индексов элементов сетки (массива в простейшем случае), точек поверхности, в которых находятся значения координат вершин треугольника. В этом случае каждая точка будет сохранена единожды и операции над точкой будут выполняться один раз. Обобщенный алгоритм моделирования [u , u ] [v , v ] Определить интервалы изменения параметров u,v: min max и min max . Определить N1 и N2 - количества значений из соответствующего интервала. Найти величину шага: du, dv. В циклах (по точкам по U и V) по узлам сетки для каждого узла сетки определить по параметрическим уравнениям значение координат (x, y, z) точки. 5. В циклах (по количеству разбиений по U и V) пройти по сегментам, координаты точек которых были определены на предыдущем шаге, и сформировать набор треугольников (по два треугольника для каждого сегмента). 1. 2. 3. 4. 2. Геометрические преобразования Переход из одной прямолинейной координатной системы в трѐхмерном пространстве к другой описывается в общем случае следующим образом: Или в матричном виде: Все преобразования системы координат являются либо базовыми, либо сложными (состоящими из последовательности базовых преобразований). Перечислим все базовые преобразования точек и матрицы, соответствующие им: 1. Повороты вокруг осей a) Вокруг оси Oxна угол φ против часовой стрелки (если смотреть из точки, расположенной в бесконечности на оси Ox, в направлении начала координат): Матрица 1.a b) Вокруг оси Oyна угол ψпротив часовой стрелки (если смотреть из точки, расположенной в бесконечности на оси Oy, в направлении начала координат): Матрица 1.b c) Вокруг оси Ozна угол χпротив часовой стрелки (если смотреть из точки, расположенной в бесконечности на оси Oz, в направлении начала координат): Матрица 1.c 2. Растяжение (сжатие) Матрица 2 Если Если , то сжатие; >1, то растяжение. 3. Отражение (зеркалирование) a) Относительно плоскости YOZ: Матрица 3.a b) Относительно плоскости XOZ: Матрица 3.b c) Относительно плоскости XOY: Матрица 3.c 4. Перенос (сдвиг, перемещение) на вектор (λ, μ, ν) Матрица 4 5. Проецирование на плоскость a) На плоскость YOZ (при расположении наблюдателя, смотрящего в направлении начала координат, в бесконечности на оси Ox (в точке (1,0,0,0))): Матрица 5.a b) На плоскость XOZ (при расположении наблюдателя, смотрящего в направлении начала координат, в бесконечности на оси Oy (в точке (0,1,0,0))): Матрица 5.b c) На плоскость XOY (при расположении наблюдателя, смотрящего в направлении начала координат, в бесконечности на оси Oz (в точке (0,0,1,0))): Матрица 5.c 6. Перспективное преобразование a) При расположении наблюдателяна оси Ox, в точке (c, 0, 0, 1): Матрица 6.a b) При расположении наблюдателя на оси Oy в точке (0, c, 0, 1): Матрица 6.b c) При расположении наблюдателя на оси Oz в точке (0, 0, c, 1): Матрица 6.c Рассмотренные выше геометрические преобразования относятся к базовым (элементарным) геометрическим преобразованиям, все остальные являются сложными, которые реализуются как комбинация базовых, осуществляемых в строго определенном порядке, так как в общем случае, геометрические преобразования некоммутативны. В качестве сложных геометрических преобразований всегда рассматриваются какие-то аналоги базовых, но реализуемых относительно нестандартных расположений тех геометрических объектов, относительно которых производятся соответствующие действия. Также стоит сказать про относительность базовых геометрических преобразований. Базовое геометрическое преобразование точки (с сохранением расположения исходной системы координат) соответствует выполнению обратной операции по отношению к преобразованию системы координат. Например, поворот точкивокруг оси Ox (Oy, Oz) на некоторый уголφ (ψ,χ)по часовой стрелкесоответствует повороту системы координатвокруг оси Ox (Oy, Oz) на некоторый уголφ (ψ,χ) против часовой стрелки. В данной лабораторной работе нам понадобятся матрицы поворота вокруг каждой оси, матрица параллельного переноса. Особенностью данной работы является возможность изменения фигуры. Т.е. когда изменяются параметры поверхности, положение поверхности в пространстве не должно меняться. Произведение матриц некоммутативно. Следовательно, важна последовательность поворотов. Эту проблему можно решить 2 способами: сохранять матрицу поворотов перед тем, как начать пересчет координат с новыми параметрами поверхности. рассчитывать матрицу поворота заново по сохраненной последовательности значений углов поворотов, после пересчета координат точек поверхности с новыми значениями параметров. Для реализации в рамках данной лабораторной работы выбран первый способ. Обобщенный алгоритм геометрического преобразования. General – единичная матрица. Rx – матрица поворота вокруг оси X. Ry – матрица поворота вокруг оси Y. Rz - матрица поворота вокруг оси Z. 1. Если поворот поверхности в пространстве относительно оси X, то General=General*Rx. 2. Если поворот поверхности в пространстве относительно оси Y, то General=General* Ry. 3. Если поворот поверхности в пространстве относительно оси Z, то General=General* Rz. 4. Если изменились параметры поверхности, Перемоделировать поверхность 5. В цикле по точкам умножить матрицу поворотов на вектор координат каждой точки из массива точек поверхности. 3. Определение цвета. Задача заключается в закраске поверхности, заданной аналитически. Для решения поставленной задаче сначала рассмотрим определение цвета точки. 3.а Определение цвета точки. Определение цвета Один из простейших способов определения цвета (интенсивности) точки поверхности заключается в том, что он считается пропорционально косинусу угла, образованного между нормалью к данной точке и направлением на источник света. В данном случае наблюдатель и источник света совмещены и находятся в т.(0, 0, 1, 0). Чем меньше угол между нормалью и вектором к точке [0,0,1,0] , тем больше косинус этого угла, и соответственно тем больше интенсивность данного сегмента. Где I-итоговая интенсивность сегмента; -угол между вектором нормали к данному сегменту и вектором к точке наблюдения (освещения) - [0,0,1,0]; При положительном косинусе полигон принадлежит одной стороне и -интенсивность первой стороны, при отрицательном косинусе полигон принадлежит другой стороне, и -интенсивность другой стороны. Цвет точки получается в результате комбинирования значения компонент, определенных цветовой моделью. Существуют различные цветовые модели: RGB (RED, GREEN, BLUE); Цвет определяется значением компонент. Значения лежат в интервале от 0 до 250. "Насыщенный" красный будет выглядеть так: R - 255 G-0 B-0 Чѐрный: R-0 G-0 B-0 Желтый цвет будет иметь следующий вид: R - 255 G - 255 B-0 CMYK Цветовая модель CMY основана на том, что сам по себе лист бумаги белый, то есть отражает практически весь спектр RGB, а краски, наносимые на нее, выступают в качестве фильтров, каждый из которых "ворует" свой цвет (либо red, либо green, либо blue). Таким образом цвета этих красок определяются вычитанием из белого по одному цветов RGB. Получаются цвета Cyan (что-то вроде голубого), Magenta (можно сказать, розовый), Yellow (желтый). В цветовой модели CMYK у каждого цвета основным значением является "непрозрачность" (количество краски) и определяется процентами от 0% до 100%. В данной лабораторной работе будем использовать цветовую модель RGB. Следовательно, цвет каждой точки будет определяться компонентами R,G,B, умноженными на косинус. Определение нормали в точке. Нормаль поверхности в точке – это прямая, ортогональная касательной плоскости, проведенной в этой точке поверхности. Уравнения нормали поверхности в точке с криволинейными координатами (u0, v0) и декартовыми координатами (x0, y0, z0) при параметрическом задании могут быть вычислены по формулам: Откуда находим X, Y, Z. Также существует аналитический способ определение нормали к плоскости. n u v Касательный вектор параметрической кривой r = r(u, v0), где v0 – константа, кратен вектору Подобным же образом касательный вектор кривой r = r(u0, v) кратен вектору Плоскость, касательная к этим кривым в точках их пересечения r = r(u0, v0), содержит оба указанных выше касательных вектора и, следовательно, нормаль к рассмотренной поверхности кратна векторному произведению этих векторов. Единичный нормальный вектор n определяется по формуле: r r u v n r r u v где произведение вычисляется в точках u = u0, v = v0. Ориентацию вектора нормали (+ или -) будем выбирать, исходя из того, с какой стороны плоскости лежит нормаль. Выбираем «+», если нормаль лежит по одну сторону поверхности. Выбираем «-», если нормаль лежит по другую сторону поверхности. Определение значения косинуса. В общем случае косинус угла между произвольными векторами A( x A , y A , z A ) и B( x B , y B , z B ) находится по формуле: По условию, источник света и наблюдатель находятся в точке с координатами (0,0,1,0). Пусть вектор нормали N имеет координаты (Nx, Ny, Nz). Источник света S имеет координаты (0,0,1,0). Тогда формула примет вид: N x * 0 N y * 0 N z *1 Nz cos (*) N x2 N y2 N z2 * 1 N x2 N y2 N z2 Если косинус положительный, то будем предполагать, что нормаль лежит по одну сторону плоскости. Если косинус отрицательный, то будем предполагать, что нормаль лежит по другую сторону плоскости. Разные стороны плоскости закрашиваются разными цветами. 3.б Определение цвета полигона. Заданная аналитически поверхность разбивается на множество полигонов. И задача закраски поверхности, в этом случае, оказывается задачей равномерной закраски каждого полигона определенным цветом. Такой тип закраски еще называют flat-закраской. Разница между операциями определения цвета точки и цвета полигона заключается в нахождении нормали. В первом случае находится нормаль параметрически заданно поверхности в точке, во втором – нормаль к полигону. Нормаль полигона можно найти двумя способами: векторное произведение и метод Ньюэла. Но так как в данной работе в качестве полигонов используются треугольники, то векторное произведение и метод Ньюэла оказываются одним и тем же. Метод Ньюэла Данный метод заключается в нахождении коэффициентов (a, b, c , d) плоскости, заданной n вершинами, в общем случае, не лежащих на одной плоскости) . Если плоскость представляется в виде уравнения Ax + By + Cz + D = 0, то согласно этому методу: (1) Где если i=n, то j=1, иначе j=i+1, а вычисляется с помощью любой точки на плоскости D = – ( Axi+ Byi+ Czi). В данной работе xi , yi, zi определяются системой параметрических уравнений. xi = x(u,v) yi = y(u,v) zi = z(u,v) При определении методом Ньюэла (суть которого – усреднение векторных произведений рѐбер, исходящих из вершин многоугольника) мы в зависимости от последовательности обхода точек контура многоугольника можем получить одну и ту же плоскость, но нормаль у неѐ может быть направлена в две противоположные стороны. Чтобы избежать такой ситуации надо при вычислении нормалей треугольников обходить их в одном направлении. Косинус для треугольника и цвет треугольника определяются аналогично определению косинуса и цвета для точки. Обобщенный алгоритм определения цвета треугольника. Внешним цветом назовем цвет одной стороны поверхности, внутренним цветом назовем цвет другой стороны поверхности. В цикле по списку треугольников для каждого треугольника : 1. Определить нормаль к плоскости. n Nx yi y j * zi zj zi z j * xi xj xi x j * yi yj i 1 n Ny i 1 n Nz i 1 2. Найти косинус угла между нормалью и вектором, направленным на источник света. N x * 0 N y * 0 N z *1 Nz cos N x2 N y2 N z2 * 1 N x2 N y2 N z2 0, 3. Если cos то умножить все компоненты внешнего цвета (R,G, B) на найденный косинус, иначе умножить компоненты внутреннего цвета (R,G, B) на найденный косинус. 4. Сохранить полученный цвет. 4. Проецирование. Так как данный этап был описан в разделе «Геометрические преобразования», то рассмотрим только обобщенный алгоритм. Обобщенный алгоритм проецирования 1. В цикле пройти по массиву точек и спроецировать каждую точку на плоскость XoY. 2. В цикле пройти по массиву спроецированных точек, координаты которых были определены на предыдущем шаге, сдвинуть каждую точку по оси X на половину ширины экрана и по оси Y на половину высоты экрана. 5. Визуализация. В данной работе нужно будет осуществлять 2 вида визуализации изображения: визуализация каркаса и визуализация с flat-закраской. Визуализация каркаса представляет собой тривиальную задачу: имеется набор точек, соединенных ребрами, известны экранные координаты точек, необходимо выполнить визуализацию этих ребер. Такая задача уже неоднократно решалась нами. При визуализации с применением flat-сглаживания необходимо закрашивать каждый треугольник поверхности соответствующим ему цветом. Задача закрашивания области не является тривиальной, и существует множество алгоритмов ее решения. Однако, можно обойтись и стандартными функциями, выполняющими данное действие. Такие функции наряду с функциями для визуализации графических примитивов входят в состав базовых библиотек если не всех, то большинства языков программирования. Поскольку в данной работе используется flat-метод сглаживания, при котором каждый треугольник закрашивается однородно одним цветом, то использование таких стандартных функций является оптимальным решением. 1.Платформа .NET В Платформа .NET д ля каркасной модели можно либо использовать функцию DrawLine, либо функцию DrawPolygon(Pen, Point[] points). Для flat-закраски используется метод FillPolygon. Все выше перечисленные методы описаны в библиотеке System.Drawing. 2. Java Для отрисовки каркасной модели имеется функция drawPolygon. Для flat-закраски имеется метод fillPolygon. Все выше описанные методы для данной платформы имеются в библиотеке java.awt.Graphics. 3. Borland Функция Polygon() – метод класса Canvas предназначена для закраски треугольника. 4. WinAPI Функция Polygon(HDC, Point *, int); где HDC – контекст рисования. Обобщенный алгоритм визуализации { для всех сегментов поверхности если способ визуализации == Каркас нарисовать многоугольник(вершины сегмента) иначе закрасить многоугольник сохраненном на этапе «Определение цвета» цветом } Описание реализации применяемых методов. Поверхность задана следующей системой параметрических уравнений: x r * sin v * cos v * sin u; R,r – константы для поверхности. y r * sin v * cos u; z R * cos u. 1. Укрупненный алгоритм. Укрупненный алгоритм для моделирования поверхности. (цикл по точкам) [u , u ] [v , v ] Определить интервалы изменения параметров u,v: min max и min max . [u , u ] Определить uN - количество значений из интервала min max . [v , v ] Определить vN - количество значений из интервала min max . u max u min du ; uN Найти величину шага: v max v min dv vN triangles – массив треугольников, на которые разбита поверхность. triangles[t].point – массив индексов вершин данного треугольника triangles[t].point[k].i – значение строки в массиве точек поверхности, в которой хранится вершина k данного треугольника triangles[t].point[k].j– значение столбца в массиве точек поверхности, в которой хранится вершина k данного треугольника Определить значение констант R,r. u=Umin. v=Vmin. для i от 0 до uN делать для j от 0 до vN делать points [i][j].x= r * sin v * cos v * sin u points [i][j].y= r * sin v * cos u points [i][j].z= R * cos u v=v+dv u=u+du t=0 для i от 0 до uN -1 делать для i от 0 до vN -1 делать triangles[t].point[0].i=i triangles[t].point[0].j=j triangles[t].point[1].i=i triangles[t].point[1].j=j+1 triangles[t].point[2].i=i+1 triangles[t].point[2].j=j triangles[t+1].point[0].i=i+1 triangles[t+1].point[0].j=j+1 triangles[t+1].point[1].i=i triangles[t+1].point[1].j=j+1 triangles[t+1].point[2].i=i+1 triangles[t+1].point[2].j=j t=t+2 Примечание: 1. Очевидно, что в массиве points точки хранятся в порядке возрастания значения параметра u по строкам и в порядке возрастания значения v по столбцам. 2. Данный алгоритм применим к параметрически заданным поверхностям, отличным от использованной в данной работе. Укрупненный алгоритм геометрических преобразований. (цикл по точкам) матрица general – поле статического класса матрица points – массив точек поверхности размером [uN][vN]. матрица Rotatedpoints – массив точек поверхности размером uN* vN после поворота Rx – матрица поворота вокруг оси X. Ry – матрица поворота вокруг оси Y. Rz – матрица поворота вокруг оси Z. Если изменился угол поворота вокруг оси X пересчитать матрицу поворота Rx 1 0 0 0 0 cos( ) sin( ) 0 0 sin( ) cos( ) 0 0 0 0 1 general = general *Rx Если изменился угол поворота вокруг оси Y пересчитать матрицу поворота Ry cos( ) 0 sin( ) 0 0 1 0 0 sin( ) 0 cos( ) 0 0 0 0 1 general = general * Ry Если изменился угол поворота вокруг оси Z пересчитать матрицу поворота Rz cos( ) sin( ) 0 0 sin( ) cos( ) 0 0 0 0 1 0 0 0 0 1 general = general * Rz Если изменилось положение ползунка на одной из полос прокрутки для параметров поверхности(количество треугольников разбиения, R,r, ограничения для u,v) Смоделировать поверхность с новыми значениями параметров для i от 0 до uN делать для i от 0 до vN делать Rotatedpoints [i][j]=general*point[i][j] Укрупненный алгоритм для определения цвета закраски треугольника. (цикл по треугольникам) triangles – список треугольников длиной 2*(uN-1)* (vN-1). triangles[t].points – массив индексов вершин треугольника triangles[t].fillcolor – цвет треугольника out_color – цвет одной стороны поверхности in_color – цвет другой стороны поверхности матрица points – массив точек поверхности размером uN* vN. Для каждого t от 0 до 2*(uN-1)* (vN-1) метод Ньюэла (points [triangles[t].points[0].i][ triangles[t].points[0].j], points [triangles[t].points[1].i][ triangles[t].points[1].j], points [triangles[t].points[2].i][ triangles[t].points[2].j]). Вычислить косинус между нормалью и направлением к источнику света Nz (*) cos 2 N x N y2 N z2 Если cos 0, то triangles[t].fillcolor.R= out_color.R *| cos triangles[t].fillcolor.G= out_color.G *| cos triangles[t].fillcolor.B= out_color.B *| cos Иначе triangles[t].fillcolor.R= in_color.R *| cos triangles[t].fillcolor.G= in_color.G *| cos triangles[t].fillcolor.B= in_color.B *| cos |. |. |. |. |. |. Укрупненный алгоритм проецирования. (цикл по точкам) матрица points – массив точек поверхности, над которыми были выполнены геометрические преобразования размером [uN][ vN]. матрица screenpoints – массив точек поверхности с экранными координатами размером [uN] [vN] dx, dy – величина сдвигов по осям X,Y соответственною Вычислить матрицу проецирования Pxoy 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 для i от 0 до uN делать для j от 0 до vN делать screenpoints [i][j]= Pxoy * points[i][j] для i от 0 до uN делать для j от 0 до vN делать screenpoints [i][j].x = pointsF[i][j].x+dx screenpoints [i][j].y = pointsF[i][j].y+dy Укрупненный алгоритм визуализации. (цикл по треугольникам) матрица screenpoints – массив спроецированных точек поверхности размером [uN][ vN]. triangles – список треугольников длиной 2*(uN-1)* (vN-1). triangles[t].point – массив индексов вершин данного треугольника triangles[t].point[k].i – значение строки в массиве точек поверхности, в которой хранится вершина k данного треугольника triangles[t].point[k].j– значение столбца в массиве точек поверхности, в которой хранится вершина k данного треугольника triangles[t].fillcolor – цвет заполнения треугольника для t от 0 до 2*(uN-1)* (vN-1). если способ визуализации является Каркас Нарисовать (screenpoints [triangles[t].point[0].i] screenpoints [triangles[t].point[1].i] screenpoints [triangles[t].point[2].i] иначе Заполнить (screenpoints [triangles[t].point[0].i] screenpoints [triangles[t].point[1].i] screenpoints [triangles[t].point[2].i] triangles[t].fillcolor) [ triangles[t].point[0].j], [ triangles[t].point[1].j], [ triangles[t].point[2].j],) [ triangles[t].point[0].j], [ triangles[t].point[1].j], [ triangles[t].point[2].j], 2. Детализированный алгоритм. Детализированный алгоритм для моделирования поверхности. (цикл по точкам) triangles – список треугольников 2*(uN-1)* (vN-1). points – массив точек поверхности размером [uN] [vN]. Функция “Model(R, u, v, Un, Vn )” нач [u , u ] [v , v ] Определить интервалы изменения параметров u,v: min max и min max . [u , u ] Определить uN - количество значений из интервала min max . [v , v ] Определить vN - количество значений из интервала min max . u max u min du ; uN Найти величину шага: v max v min dv vN Определить значение констант R,r. u=Umin. v=Vmin. для i от 0 до uN делать очистить v_list для j от 0 до vN делать points [i][j].x= r * sin v * cos v * sin u points [i][j].y= r * sin v * cos u points [i][j].z= R * cos u v=v+dv конец цикла u=u+du конец цикла t=0 для i от 0 до uN -1 делать для i от 0 до vN -1 делать triangles[t].point[0].i=i triangles[t].point[0].j=j triangles[t].point[1].i=i triangles[t].point[1].j=j+1 triangles[t].point[2].i=i+1 triangles[t].point[2].j=j triangles[t+1].point[0].i=i+1 triangles[t+1].point[0].j=j+1 triangles[t+1].point[1].i=i triangles[t+1].point[1].j=j+1 triangles[t+1].point[2].i=i+1 triangles[t+1].point[2].j=j t=t+1 конец цикла конец цикла кон Детализированный алгоритм геометрических преобразований. (цикл по точкам) матрица general – поле статического класса матрица points – массив точек поверхности размером uN* vN. матрица Rotatedpoints – массив точек поверхности размером uN* vN после поворота/ нач Если изменилось положение ползунка на одной из полос прокрутки для изменения углов поворота вокруг осей пересчитываем матрицу поворота Rx 1 0 0 0 0 cos( ) sin( ) 0 0 sin( ) cos( ) 0 0 0 0 1 пересчитываем матрицу поворота Ry cos( ) 0 sin( ) 0 0 1 0 0 sin( ) 0 cos( ) 0 0 0 0 1 пересчитываем матрицу поворота Rz cos( ) sin( ) 0 0 sin( ) cos( ) 0 0 0 0 1 0 0 0 0 1 general = general * Rx general = general * Ry general = general * Rz Если изменилось положение ползунка на одной из полос прокрутки для параметров Model(R, u, v, Un, Vn) для i от 0 до uN делать для j от 0 до vN делать Rotatedpoints [i][j]=General*points[i][j] конец цикла кон Детализированный алгоритм для определения цвета закраски треугольника. (цикл по треугольникам) triangles – список треугольников длиной 2*(uN-1)* (vN-1). метод_Ньюэла – функция, вычисляющая вектор нормали заданного треугольника. cos(A,B) – функция, вычисляющая значение косинуса угла между векторами A, B. S = [0, 0, 1]. нач для i от 0 до triangles.length делать вектор N=метод_Ньюэла(points [triangles[t].points[0].i][ triangles[t].points[0].j], points [triangles[t].points[1].i][ triangles[t].points[1].j], points [triangles[t].points[2].i][ triangles[t].points[2].j]). cos_alfa = cos(N,S) если cos_alfa 0 triangles [i].цвет=внешний цвет; иначе triangles [i].цвет=внутренний цвет; triangles [i].цвет.R= triangles [i].цвет.R* cos ; triangles [i].цвет.G= triangles [i].цвет.G* cos ; triangles [i].цвет.B= triangles [i].цвет.B* cos ; конец цикла кон Детализированный алгоритм проецирования. (цикл по точкам) screenpoints – массив точек поверхности с экранными координатами размером [uN] [vN] dx, dy – величина сдвигов по осям X,Y соответственною нач 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 для i от 0 до uN делать для j от 0 до vN делать screenpoints[i][j]=Pxoy* Rotatedpoints [i][j] для i от 0 до uN делать для j от 0 до vN делать screenpoints[i][j].x = screenpoints[i][j].x + dx screenpoints[i][j].y = screenpoints[i][j].y + dy конец цикла кон Детализированный алгоритм визуализации. triangles – triangles – список треугольников длиной 2*(uN-1)* (vN-1). нач для i от 0 до длины списка triangles если способ визуализации==Каркас Draw (screenpoints [triangles[t].point[0].i] [ triangles[t].point[0].j], screenpoints [triangles[t].point[1].i] [ triangles[t].point[1].j], screenpoints [triangles[t].point[2].i] [ triangles[t].point[2].j]) иначе FillDraw (screenpoints [triangles[t].point[0].i] [ triangles[t].point[0].j], screenpoints [triangles[t].point[1].i] [ triangles[t].point[1].j], screenpoints [triangles[t].point[2].i] [ triangles[t].point[2].j], triangles[t].fillcolor) конец цикла кон Руководство программиста (примерный вариант) Статический класс RotMatrix. Метод/свойство/функция matrix Rx(double angle) Описание Задает матрицу поворота вокруг оси х matrix Ry(double angle) Задает матрицу поворота вокруг оси y matrix Rz(double angle) Задает матрицу поворота вокруг оси z matrix Mx() Задает матрицу зеркального отображения matrix Pxoy() Задает матрицу проецирования на плоскость XOY matrix T(int dx, int dy) Задает матрицу переноса Статический класс Equations содержит параметрическое уравнение выбранной поверхности. Метод/свойство Описание Point3D[][] Equation(double R, double r, int По заданным параметрам и постоянным u_count, int v_count, double limit_u, double рассчитывает точки инкапсулированной в методе limit_v) поверхности. Статический класс GraphicsEngine – вспомогательный класс, содержащий некоторые методы, используемые для выполнения геометрических преобразований. Метод/свойство Описание matrix General Поле, хранящее матрицу поворотов. matrix ReCountGeneralMatrix(double angleX, Создает матрицу поворотов double angleY, double angleZ) Point3D Rotate(Point3D point, matrix General) void ReCountScreen(Point3D point, double dx, double dy, out double x, out double y) Производит поворот переданных в качестве входного параметра точек трехмерного пространства. Перенос отдельной точки трехмерного пространства double DegreeToRadian(int x) Переводит градусы в радианы double[] Newell(Point3D[] points) Возвращает вектор нормали к плоскости. Класс Surface– представляет полигонально заданную поверхность. Метод/свойство Описание Point3D[][] m_Points; Исходные трехмерные координаты поверхности Point3D[][] m_RotatedPoints; Повернутые трехмерные координаты поверхности PointF[][] m_ScreenPoints; Экранные координаты m_Polygons Поле, хранящее массив треугольников поверхности InColor Свойство, хранящее внутренний цвет заливки поверхности OutColor Свойство, хранящее внешний цвет заливки поверхности Surface(Point3D[][] points, Color outer, Color Конструктор класса. Разбивает заданный массив inner) void ReCount(double x_angle, double y_angle, double z_angle, double ox, double oy) Fill DrawCarcas SetColorPolygons() Draw PointF getPointF_by_index(int i,int j) Point3D getPoint3D_by_index(int i,int j) трехмерных точек на треугольники. Получившиеся треугольники сохраняет в поле m_Polygons. Метод, инициирующий вычисление всеми треугольниками их новое положения при вращении вокруг осей и переносе Инициирует соответствующую функцию визуализации треугольников. Инициирует соответствующую функцию визуализации треугольников. Устанавливает треугольникам поверхности внешний и внутренний цвет. Визуализирует поверхность. В зависимости от модели вызывает методы DrawCarcas или Fill. Возвращает экранные координаты точки по заданными индексам Возвращает трехмерные координаты точки по заданными индексам Класс Polygon. Экземпляр класса представляет собой отдельный треугольник поверхности Метод/свойство Описание Int [][] Points; Поле хранит массив индексов точек, соответствующих треугольнику, в массиве точек поверхности. Surface parent Поля для хранения указателя на родителя (поверхность) полигона Polygon Конструктор класса ReCountColor Рассчитывает цвета закраски треугольника Fill Выполняет закраску треугольника Draw Метод, выполняющий визуализацию каркаса треугольника Класс Point3D. Метод/свойство X Y Z Point3D Описание Свойство, хранящее координату X точки Свойство, хранящее координату Y точки Свойство, хранящее координату Z точки Конструктор класса Класс matrix. Экземпляр представляет собой матрицу размера 4x4. Метод/свойство Описание double[][] content; Поле хранит массив данных. matrix() Конструктор. double[] Multy(double[] right) Умножает матрицу на вектор. Матрица – слева, вектор – справа. Умножает матрицу на матрицу. matrix MultyMatrix(matrix right) Функциональная схема. При запуске программы вызываются: 1. статический метод класса Equations, рассчитывающие точки поверхности по параметрически заданному представлению поверхности; 2. конструктор класса Surface, который из массива точек формирует массив полигонов; 3. статический метод класса GraphicEngine ReCountGeneralMatrix, который пересчитывает матрицу поворотов поверхности. Для перерасчета он вызывает методы, формирующие матрицы поворотов вокруг осей: Rx, Ry, Rz. 4. метод класса Surface Recount(), который умножает каждую точку поверхности на матрицу поворотов General, используя метод Rotate(), и, применяя к каждому статический метод класса GraphicEngine ReCountScreen, проецирует и сдвигает каждую точку поверхности. 5. инициация обновления экрана, в обработчике которого вызывается метод Draw класса Surface для визуализации поверхности. При изменении положения ползунков на полосах прокрутки, соответствующих параметрам поверхности u,v и при изменении радиусов вызываются: 1. статический метод класса Equations; 2. метод класса Surface Recount() Rotate() GraphicEngine.ReCountScreen 3. метод Draw класса Surface. При изменении положения ползунков на полосах прокрутки, соответствующих параметрам разбиения поверхности на полигоны вызываются: 1. статический метод класса Equations; 2. конструктор класса Surface; 3. метод класса Surface Recount() Rotate() GraphicEngine.ReCountScreen 4. метод Draw класса Surface. В обработчиках событий изменения положения ползунка для полос прокрутки, отвечающих за изменение углов поворотов вокруг осей, вызывается: 1. статический метод класса GraphicEngine ReCountGeneralMatrix; Rx; Ry; Rz; 2. метод класса Surface Recount() Rotate() GraphicEngine.ReCountScreen 3. метод Draw класса Surface. При изменении положения ползунков на полосах прокрутки, соответствующих параметрам закраски поверхности, вызывается процедура ReCountColor(), в которой устанавливаются соответствующие значения полей внешнего и внутреннего цвета экземпляра класса Surface и каждый полигон, используя функции для метода Ньюэлла и для определения косинус угла, определяет свой цвет. Далее вызывается метод класса Surface Draw(). В этом методе Draw() класса Surface для каждого полигона вызываются методы Draw или Fill в зависимости от режима визуализации. Описание интерфейса. Руководство пользователя. С помощью полос прокрутки X, Y, Z пользователь может вращать поверхность вокруг соответствующих осей координат. Полосы прокрутки на панели «Изменение количество сегментов» позволяют изменить количество сегментов, на которое разбивается поверхность. Полосы прокрутки на панели «Изменение ограничений» позволяют изменить ограничение для параметров в уравнениях параметрического задания. С помощью панели «Изменение радиусов» пользователь может изменять значения постоянных в уравнениях параметрического задания. Панель «Изменение цвета» предоставляет пользователю возможность, изменяя значения компонент RGB модели, изменить внешний и внутренний цвета поверхность. С панели «Модель» пользователь поменять каркасное изображение поверхности на равномерно закрашенное.