![](/user_photo/2706_HbeT2.jpg)
- •Содержательная и формальная постановки задачи
- •Структура решения
- •Моделирование поверхности
- •Программное представление поверхности:
- •Геометрические преобразования
- •Определение цвета точек поверхности
- •Вычисление нормали поверхности в данной точке
- •Определение косинуса угла между направлением нормали и направлением на источник света (наблюдателя)
- •Определение косинуса угла между нормалью и векторов источника света
- •Определение цвета точки
- •Подсчёт нормалей можно осуществить с помощью 2 способов:
- •Определение цвета сегмента
- •Проецирование
- •Визуализация
- •1.Платформа .Net
- •Описание реализации применяемых методов
- •Моделирование поверхности в исходном положении
- •Геометрические преобразования
- •Определение цвета сегмента поверхности
- •Визуализация
- •Проецирование.
- •Визуализация.
- •Руководство пользователя
- •Результаты
Моделирование поверхности в исходном положении
алг Полигональное моделирование
уравнение_поверхности(u, v);
шагов_по_U;
шагов_по_V;
ограничение_по_U;
ограничение_по_V;
нач
P[шагов_по_U][шагов_по_V];
шаг_по_U=ограничение_по_u/шагов_по_U;
шаг_по_V=ограничение_по_V/шагов_по_V;
U=0; V=0;
цикл i от 0 до шаг_по_U
нц
цикл j от 0 до шаг_по_V
нц
P[i][j]=уравнение_плоскости(U, V);
V=V+шаг_по_V;
кц
U=U+шаг_по_U;
кц
Сформировать_полигоны(P);
кон
алг Сформировать_полигоны(P[n][m])
нач
цикл i от 0 до n
нц
цикл j от 0 до m
нц
треугольник1=создать_ треугольник (P[i][j], P[i+1][j], P[i][j+1]);
список_ треугольников.Добавить(треугольник1);
полигон2=создать_ треугольник (P[i+1][j+1],P[i+1][j],P[i][j+1])
список_ треугольников.Добавить(треугольник2);
кц
кц
кон
Геометрические преобразования
алг
нач
если поворот вокруг оси Ox
вычисляем матрицу поворота Rx;
результирующая матрица (Result) = Result * Rx;
иначе
если поворот вокруг оси Oy
вычисляем матрицу поворота Ry;
Result = Result * Ry;
иначе
если поворот вокруг оси Oz
вычисляем матрицу поворота Rz;
Result = Result * Rz;
если изменится параметр
Вызывается метод Rebuild перепостроения поверхности
цикл от 0 до количества треугольников
нц
треугольник [i].A = треугольник [i].A * Result;
треугольник [i].B = треугольник [i].B * Result;
треугольник [i].C = треугольник [i].C * Result;
кц
кон
Определение цвета сегмента поверхности
алг Определить цвета треугольников (сегментов)
N; //количество треугольников
нач
цикл i от 0 до N
нц
нормаль=метод_Ньюэлла(треугольник[i].точки);
косинус=вычислить_косинус_угла(нормаль, [0 0 1 0]);
если косинус>0
сегмент[i].цвет=внешний цвет;
иначе
сегмент[i].цвет=внутренний цвет;
интенсивность=|косинус|;
треугольник[i].цвет.R= треугольник[i].цвет.R*интенсивность;
треугольник[i].цвет.G= треугольник[i].цвет.G*интенсивность;
треугольник[i].цвет.B= треугольник[i].цвет.B*интенсивность;
кц
кон
Проецирование
алг Проецирование
нач
Вычисляем матрицу проецирования
цикл i от 0 до N
{
треугольник [i].A = треугольник [i].A * Матрица проецирования;
треугольник [i].B = треугольник [i].B * Матрица проецирования;
треугольник [i].C = треугольник [i].C * Матрица проецирования;
кон
Визуализация
алг Визуализация
нач
цикл i от 0 до Количество_ треугольников
если способ визуализации==Каркас
нарисовать треугольник(экранные координаты вершин треугольника, цвет рисования);
иначе
закрасить треугольник(экранные координаты вершин треугольника, цвет закраски треугольника);
кон
Описание программного обеспечения (руководство программиста)
Приложение было написано в среде Visual Studio 2008 на языке программирования C# с использованием библиотек .Net Framework 2.0
В программе при перемещении ползунка xTrackBar осуществляется поворот фигуры вокруг оси х, при этом используются следующие основные функции и методы: класс Library функции XRotateMatrix(), YRotateMatrix(), ZRotateMatrix(), OrthogonalProj_XOY – матрицы поворота вокруг осей х у z и матрица проецирования соответственно, они, в свою очередь, используются в классе GraphicsHelper в функции Rotate()-выполняющая геометрические преобразования, и в ProjectXY() этого же класса, которые используются в классе Poligon в функции Calculate()-выполняющая геометрические преобразования точек вершин полигона и считающая их экранные координаты, то есть совершает этап проецирования и поворота. Также используется функция Draw()-рисования.
При перемещении ползунка yTrackBar и zTrackBar осуществляется поворот фигуры вокруг осей y и z соответственно. Функции и методы те же, что и при повороте вокруг оси х.
При перемещении ползунков LimitTrackBar1, LimitTrackBar2, SegmentTrackBar1, SegmentTrackBar2, paramLabel1, paramLabel2 осуществляется изменение параметров поверхности при этом вызывается функция Rebuild()-метод, выполняющий перепостроение поверхности на основании ее новых параметров. Она содержит функцию FromArgb()-функция определение цвета по RGB, функцию Figura(Equations.Helicoid, outer, inner) - принимает в качестве параметра массив точек поверхности, и выполняет построение полигонов на этих точках- класса Figure, где функция Helicoid() класса Equations инкапсулирует параметрическое уравнение поверхности «Геликоид», а outer и inner соответственно определяют внешний и внутренний цвет, который отображается в Color1PictureBox и Color2PictureBox. Также как и при поворотах вызывается функция Calculate() - выполняющая геометрические преобразования точек вершин полигона и считающая их экранные координаты. Вызывается функция Draw()-рисования, причем в ней содержатся следующие функции класса Figure – Stroke() и Fill(),где Stroke() - метод, выполняющий визуализацию каркаса поверхности, если нажат StructureRadioButton, если же выбран FlatRadioButton, то вызов Fill() - метод, выполняющий визуализацию поверхности, при этом выполняется заполнение полигонов с использованием flat-сглаживания. В Stroke() находится DrawPolygon(m_StrokePen, ScreenPoints)-эта функция рисует многоугольник, определяемый массивом структур определенным цветом (в нашем случае черным). В Fill() находится функции класса Poligon: CalculateColor() и FillPolygon(). CalculateColor() - метод, выполняющий вычисление цвета закраски полигона, в нем есть следующие функции класса Library: NewellMethod() - функция, считающая нормаль сегмента, ScalarMult() - функция, считающая скалярное произведение двух векторов, VectorLen()-функция, вычисляющая длину вектора, последние две функции необходимы для подсчета косинуса.
Диаграмма классов разработанного приложения выглядит следующим образом:
Класс
точка Point3D |
X Y Z |
Point3D |
Класс Figure |
m_Polygons |
InnerColor OuterColor Calculate 1 Figure Fill Stroke |
![](/html/2706/288/html_2LoJtixyPv.INye/img-nweEfl.png)
![](/html/2706/288/html_2LoJtixyPv.INye/img-YowOWQ.png)
![](/html/2706/288/html_2LoJtixyPv.INye/img-9_aB18.png)
Класс Library |
|
NewellMethod OrthogonalProj_XOY ScalarMult VectorLen XRotateMatrix YRotateMatrix ZRotateMatrix |
Класс Equation |
double
u; double v; limit1 limit2 u_count v_count |
Helicoid() |
Класс Poligon |
Points ScreenPoints |
Calculate CalculateColor Fill Polygon Stroke |
КлассGraphicsHelper |
BaseMatrix |
CalculateScreen Позунковые переключатели 4 ProjectXY Rotate 2 ![]() |
TTrackBar *Color1RTrackBar Color1GTrackBar Color1BTrackBar Color2RTrackBar Color2GTrackBar Color2BTrackBar XTrackBar YTrackBar ZTrackBar LimitTrackBar1 LimitTrackBar2 SegmentTrackBar1 ParamTrackBar1 SegmentTrackBar2 ParamTrackBar2 |
|
|
Метки
3
![](/html/2706/288/html_2LoJtixyPv.INye/img-21QuUH.png)
TLabel
*Xlabel Ylabel Zlabel
Limitlabel1 Limitlabel2 segmentlabel1 segmentlabel2 paramlabel1 paramlabel1 |
|
|
Класс
MainForm |
|
ChangeColor DegreeToRadian Draw() FigureChanged Rebuild() |
5
Взаимозависимые переключатели
![](/html/2706/288/html_2LoJtixyPv.INye/img-DjSdRY.png)
TRadoiButton *structureRadoiButton flatRadoiButton |
|
|
TGroupBox *GroupBox1 GroupBox2 GroupBox3 GroupBox4 GroupBox5 GroupBox6 |
|
|
поле вывода изображения
![](/html/2706/288/html_2LoJtixyPv.INye/img-zo4Yeb.png)
PictureBox * Color1PictureBox Color2PictureBox PictureBox1 |
|
|
TButton *ButtonClose |
|
|
Кнопка «Выход»