| lang | ru |
|---|---|
| header-includes | \newfontfamily{\cyrillicfont}{CMU Serif} \usepackage{titlesec} \newcommand{\sectionbreak}{\clearpage} \newfontfamily{\cyrillicfontrm}{CMU Serif} \newfontfamily{\cyrillicfonttt}{CMU Serif} \newfontfamily{\cyrillicfontsf}{CMU Serif} \makeatletter \def\@makefnmark{\hbox{(\@textsuperscript{\normalfont\@thefnmark})}} \makeatother |
Содержит 5 поверхностей, заданных параметрической функцией:
- Спиральная поверхность
- Поверхность Мёбиуса
- Тор с изменяемой формой
- Винтовая поверхность
- Поверхность "ракушка"
Графический интерфейс лабораторной работы был написан с использованием набора инструментов Tk, его биндингов для ЯП Python (tkinter)
В качестве абстракции вывода двумерных примитивов был использован виджет Canvas, его встроенные методы:
create_lineдля вывода линийcreate_polygonдля вывода закрашенных многоугольников
Положение камеры можно изменять вдаль-вблизь (клавиши W-S), вертеть вокруг осей OX (стрелочки влево-вправо), OY (стрелочки вверх-вниз). Это реализовано с помощью матрицы линейных преобразований: поворота и увеличения. Заметим, что эту матрицу нужно посчитать единожды для фиксированного положения камеры, это помогает минимизировать количество вычислений тригонометрических функций.
В зависимости от параметра PRECISION в коде программы, выбирается количество параметров u, v, используемых для получения точек параметрического уравнения плоскости. Далее по соседним точкам строится треугольник или четырёхугольник (см. torrus-quad.py), заносится в список.
Сначала полигоны сортируются от наиболее дальних от камеры к ближайшим, затем рисуются двумерные примитивы с точки зрения "наблюдателя", Z-координата просто игнорируется, ведь высчитанная матрица линейных преобразований перемещает точки нужным образом.
Освещённость полигона определяется на основании его отдалённости от "наблюдателя": после домножения на матрицу преобразования берётся значение координаты Z. С ней производится следующие манипуляции: домножается на параметр интенсивности освещения, переводится в целое число, берётся абсолютное значение, если оно больше 255, то значение игнорируется. В некоторых случаях более целесообразно оказалось взять не абсолютное значение, а учитывать только "положительно" отдалённые полигоны. Интенсивность заливки цвета определяется по отдалённости от "камеры", что есть Z-координата одной из вершин полигона после его линейного преобразования.
Матрица камеры по-умолчанию1
Поворот вокруг оси OX2
Поворот вокруг оси OY
Поворот вокруг оси OZ
Приближение/отдаление камеры
Проецирование полигона (треугольника)





