Автор работы: Пользователь скрыл имя, 17 Октября 2014 в 11:25, курсовая работа
Геометрическое моделирование изучает методы построения математической модели, описывающей геометрические свойства предметов окружающего мира.
Инструментом для геометрического моделирования служат математические методы решения тех или иных задач. Используемые методы позволяют описать геометрические свойства предметов, создавать их математические модели и исследовать их путем проведения различных расчетов и численных экспериментов, а также, при необходимости, редактировать моделируемые объекты и строить их графические отображения.
ВВЕДЕНИЕ 3
1. СОЗДАНИЕ МАТЕМАТИЧЕСКОЙ МОДЕЛИ ОБЪЕКТА 4
1.1 Преобразования координат. 4
1.2 Создание трехмерной модели 6
2 АЛГОРИТМ ИЗМЕНЕНИЯ ПОЛОЖЕНИЯ 3D ОБЪЕКТА В ПРОСТРАНСТВЕ 8
2.1 Динамическое изменение точки наблюдения. 8
2.2 Обработка нажатия клавиши. 8
Листинг 3. 8
Листинг 4. 9
3 АЛГОРИТМ ЗАКРАШИВАНИЯ ПОЛИГОНА. АЛГОРИТМ, ОПРЕДЕЛЯЮЩИЙ ВИДИМЫЕ И НЕВИДИМЫЕ ЛИНИИ. 10
3.1 Нахождение нормали по трем точкам 10
3.2 Определение невидимости граней 11
3.3 Закраска методом Гуро 12
4 ТЕСТИРОВАНИЕ 14
Министерство образования и науки Российской Федерации
федеральное государственное автономное образовательное учреждение
высшего профессионального образования
«Северный (Арктический) федеральный университет имени М.В. Ломоносова»
Кафедра информационной безопасности |
||||||||||||||||||||
(наименование кафедры) |
||||||||||||||||||||
Таран Игорь Александрович |
||||||||||||||||||||
(фамилия, имя, отчество студента) |
||||||||||||||||||||
Институт |
МИКТ |
курс |
2 |
группа |
22 |
|||||||||||||||
|
||||||||||||||||||||
РАСЧЁТНО-ГРАФИЧЕСКАЯ РАБОТА |
||||||||||||||||||||
По дисциплине |
Компьютерная геометрия |
|||||||||||||||||||
На тему |
Моделирование геометрических объектов |
|||||||||||||||||||
(наименование темы) |
||||||||||||||||||||
Отметка о зачёте |
||||||||||||||||||||
(дата) |
||||||||||||||||||||
Руководитель |
Старший преподаватель |
В.А.Колесов |
||||||||||||||||||
(должность) |
(подпись) |
(и.о. фамилия) |
||||||||||||||||||
(дата) |
||||||||||||||||||||
|
||||||||||||||||||||
Архангельск |
||||||||||||||||||||
2014 |
Содержание
Геометрическое моделирование изучает методы построения математической модели, описывающей геометрические свойства предметов окружающего мира.
Инструментом для геометрического моделирования служат математические методы решения тех или иных задач. Используемые методы позволяют описать геометрические свойства предметов, создавать их математические модели и исследовать их путем проведения различных расчетов и численных экспериментов, а также, при необходимости, редактировать моделируемые объекты и строить их графические отображения.
Для описания геометрических свойств окружающих предметов строят твердые тела. Тело описывается точками, линиями и поверхностями. Все они обладают определенными общими свойствами, поэтому ими можно оперировать как объектами. Точки, линии, поверхности и тела называются геометрическими объектами.
Геометрические объекты будут служить основными элементами математической модели геометрии реальных или воображаемых объектов. Будем строить их в трехмерном евклидовом пространстве, считая их неименными во времени.
1.1 Преобразования координат.
Рассмотрим способ получения перспективных изображений на основе аналитической геометрии. Точки в двухмерном и трехмерном пространстве представляются их координатами (X, Y) и (х, у, z) соответственно. При необходимости получения перспективной проекции задается большое количество точек P(x, у, z), принадлежащих объекту, для которых предстоит вычислить координаты точек изображения Р'(Х, Y) на картинке. Для этого нужно только преобразовать координаты точки Р из так называемых мировых координат (х, у, z) в экранные координаты (X, Y) ее центральной проекции Р'. Будем предполагать, что экран расположен между объектом и глазом Е. Для каждой точки Р объекта прямая линия РЕ пересекает экран в точке Р'.
Это отображение удобно выполнять в два этапа. Первый этап назовем видовым преобразованием - точка Р остается на своем месте, но система мировых координат переходит в систему видовых координат. Второй этап называется перспективным преобразованием. Это точное преобразование точки Р в точку Р' объединенное с переходом из системы трехмерных видовых координат в систему двухмерных экранных координат:
Для выполнения видовых преобразований должны быть заданы точка наблюдения и объект. Будет удобно, если начало системы мировых координатрасполагается вблизи центра объекта, поскольку объект наблюдается в направлении отЕ к О(рис.1). Пусть точка наблюденияЕ будет задана в сферических координатах f , q, r по отношению к мировым координатам. То есть мировые координаты (точки Е) могут быть вычислены по формулам:
xe= r sin f cos q
ye= r sin f sin q
ze= r cos f .
Обозначения сферических координат схематически изображены на рис.1.
Рис. 1. Сферические координаты точки наблюдения Е
Видовое преобразование может быть записано в форме
[хe ye ze 1]=[хw уw zw 1]V,
где V - матрица видового преобразования размерами 4х4.
Матрица V, полученная в процессе видового преобразования, выглядит следующим образом:
.
Для получения ортогональной проекции можно использовать видовые координаты хe и уe, просто игнорируя координату ze. Каждая точка Р объекта проецируется в точку Р' проведением прямой линии из точки Р перпендикулярно плоскости, определяемой осями х и у. Эту проекцию можно также считать перспективной картинкой, которая была бы получена при удалении точки наблюдения в бесконечность. Параллельные линии остаются параллельными и на картинке, полученной при ортогональном проецировании.
1.2 Создание трехмерной модели
Для построения модели трехмерного объекта (например, куба) необходимо задать координаты его вершин в мировой системе координат, а затем получить из них видовые (и экранные для ортогональной проекции) координаты. Это можно сделать, описав координаты в массивах типа T3DPoint (запись, содержащая три координаты точки) и TPoint (запись, содержащая две координаты точки).
var
//мировые (world) координаты вершин
w: array [1..8] of T3DPoint;
//видовые (view) координаты вершин
v: array [1..8] of TPoint;
Для примера зададим координаты вершин куба с центром в начале координат:
w[1].x := -50; w[5].x := -50;
w[1].y := -50; w[5].y := -50;
w[1].z := -50; w[5].z := 50;
w[2].x := 50; w[6].x := 50;
w[2].y := -50; w[6].y := -50;
w[2].z := -50; w[6].z := 50;
w[3].x := 50; w[7].x := 50;
w[3].y := 50; w[7].y := 50;
w[3].z := -50; w[7].z := 50;
w[4].x := -50; w[8].x := -50;
w[4].y := 50; w[8].y := 50;
w[4].z := -50; w[8].z := 50;
Далее необходимо перевести координаты в видовую систему координат, воспользовавшись матрицей V. Подобная процедура может выглядеть следующим образом:
procedure ViewTransformation;
begin
for i := 1 to 8 Do
begin
v[i].x := Round(w[i].x*(-sin(teta)) +
w[i].y*( cos(teta))) +
Form1.ClientWidth div 2;
v[i].y := Round(w[i].x*(-cos(phi) * cos(teta)) –
w[i].y*( cos(phi) * sin(teta)) +
w[i].z*( sin(phi))) +
Form1.ClientHeight div 2;
end;
end;
Процедура отображения граней куба состоит в соединении между собой соответствующих вершин ребрами. Строить куб необходимо по видовым координатам, которые определены в процедуре ViewTransformation. Например:
procedure DrawCube;
begin
Line(v[1],v[2]);
Line(v[2],v[3]);
Line(v[4],v[1]);
Line(v[3],v[4]);
Line(v[5],v[6]);
Line(v[6],v[7]);
Line(v[7],v[8]);
Line(v[8],v[5]);
Line(v[1],v[5]);
Line(v[2],v[6]);
Line(v[3],v[7]);
Line(v[4],v[8]);
end;
На этом этапе можно вызвать процедуры ViewTransformation и DrawCube, например, из метода OnCreate, чтобы нарисовать куб. При этом необходимо проинициализировать начальные значения углов phi и teta.
2.1 Динамическое изменение точки наблюдения.
Изменение расположения точки наблюдения приводит к изменению отображения объекта на экране (анимации). Для того чтобы добиться корректной анимации созданного трехмерного объекта, необходимо выполнить следующие шаги:
- Удалить объект из предыдущей позиции;
- Рассчитать новые координаты объекта;
- Нарисовать объект с новыми координатами.
2.2 Обработка нажатия клавиши.
Получить скан-код клавиши, нажатой пользователем, а позволяет процедура FormKeyDown. В переменной Key передаётся код нажатой клавиши, который необходимо сравнить с кодами клавиш управления курсором. Для большей наглядности определены специальные константы: UP, DOWN, LEFT, RIGHT. В зависимости от нажатой клавиши изменяем углы phi и teta.
Перед изменением угла предстоит удалить старый рисунок. Это можно сделать с помощью закрашивания формы целиком цветомфона.
Листинг 3.Key.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left) teta -= Math.PI / 32;
if (e.KeyCode == Keys.Right) teta += Math.PI / 32;
if (e.KeyCode == Keys.Up) phi += Math.PI / 32;
if (e.KeyCode == Keys.Down) phi -= Math.PI / 32;
Repaint();
}
Обработка сообщений мыши
Если мы хотим изменять положение объекта с помощью мыши, мы обрабатываем сообщения MouseDown (нажатие на левую или правую кнопку мыши) или сообщение MouseMove (движение мыши, в этом случае можно проверять, в какую сторону происходит движение и в ту же сторону вращать фигуру).
Листинг 4.Mouse.
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
xc = e.X;
yc = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.
{
int dx = e.X - xc;
intdy = e.Y - yc;
teta += dx * Math.PI / 128;
phi -= dy * Math.PI / 128;
xc = e.X;
yc = e.Y;
Repaint();
}
,,,
3.1 Нахождение нормали по трем точкам
Пусть заданы три точки (т.к. через любые три точки можно провести плоскость), например A, B, C. Уравнение плоскости задается в виде:
nx × x + ny × y + nz × z + d=0, (9)
где (nx, ny, nz) – координаты нормали к плоскости.
Получим систему уравнений:
nx×x + ny×y + nz×z + d = 0
nx×A.x + ny×A.y + nz×A.z + d = 0
nx×B.x + ny×B.y + nz×B.z + d = 0 (5)
nx×C.x + ny×C.y + nz×C.z + d = 0
В виде матрицы такая система запишется как:
|| xyz 1 ||
|| A.xA.yA.z 1 ||
|| B.xB.yB.z 1 || = 0 (6)
|| C.xC.yC.z 1 ||
Определитель будет равен (относительно первой строки):
|A.yA.z 1| |A.xA.z 1| |A.xA.y 1| |A.xA.y 1|
x |B.yB.z 1| - y |B.xB.z 1| + z |B.xB.y 1| - |B.xB.y 1|
|C.yC.z 1| |C.xC.z 1| |C.xC.y 1| |C.xC.y 1|
А так как через три точки всегда можно провести плоскость (притом только одну) и число уравнений данной системы равно числу неизвестных, следовательно, система имеет нетривиальное решение (кроме очевидногоnx=ny=nz=d=0). Следовательно, определитель данной матрицы равен нулю.
Получаем:
|A.yA.z 1|
nx = |B.yB.z 1|, (7)
|C.yC.z 1|
|A.xA.z 1|
ny = |B.xB.z 1|, (8)
|C.xC.z 1|
|A.xA.y 1|
nx = |B.xB.y 1|. (9)
|C.xC.y 1|
Значение d для определения координат вектора не нужно.
Рассмотрим нахождение значения nx (остальные координаты получаются аналогично):
nx = A.y |B.z 1| - A.z |B.y 1| + |B.yB.z| =
|C.z 1| |C.y 1| |C.yC.z|
= A.y×(B.z – C.z) – A.z×(B.y – C.y) + (B.y×C.z – B.z×C.y) =
= A.y×(B.z – C.z) + B.y×(C.z – A.z) + C.y×(A.z – B.z)
Итак, координаты вектора нормали:
nx = A.y×(B.z - C.z) + B.y×(C.z - A.z) + C.y×(A.z - B.z)
ny = A.z×(B.x - C.x) + B.z×(C.x - A.x) + C.z×(A.x - B.x) (10)
nz = A.x×(B.y - C.y) + B.x×(C.y - A.y) + C.x×(A.y - B.y)
Для каждой грани при инициализации объекта нужно посчитать вектор нормали, привести к единичной длине и сохранить его координаты в структуре соответствующей грани. Кроме того, при каждом повороте сцены векторы нормали нужно тоже пересчитывать (но перспективную проекцию находить не следует).
3.2 Определение невидимости граней
По углу между направлением взгляда и нормалью можно определить расположение грани (к нам или от нас). Если направление взгляда совпадает с вектором (0, 0, 1), то косинус угла между векторами равен nz, и если nz < 0 – грань видна. Стоит отметить, что направление нормали зависит от направления обхода точек полигона – по часовой стрелке или против – и поэтому для получения единой картины все полигоны сцены следует задавать одинаково, иначе возможны неприятные артефакты, например «выпадение» отдельных полигонов.