(рис. 2)
Не все отрезки проходят через точки растра. Подобная ситуация иллюстрируется на рис. 3, где отрезок с тангенсом угла наклона 3/8 сначала проходит через точку растра (0, 0) и последовательно пересекает три пикселя. Также иллюстрируется вычисление ошибки при представлении отрезка дискретными пикселями. Так как желательно проверять только знак ошибки, то она первоначально устанавливается равной -1/2. Таким образом, если угловой коэффициент отрезка больше или равен 1/2, то величина ошибки в следующей точке растра с координатами (1, 0) может быть вычислена как
e = e + m,
где m — угловой коэффициент. В нашем случае при начальном значении ошибки -1/2 e = -1/2 + 3/8 = -1/8.
(рис. 3)
Так как e отрицательно, отрезок пройдет ниже середины пикселя. Следовательно, пиксель на том же самом горизонтальном уровне лучше аппроксимирует положение отрезка, поэтому у не увеличивается. Аналогично вычисляем ошибку e = -1/8 + 3/8 = 1/4 в следующей точке растра (2, 0). Теперь e положительно, а значит, отрезок пройдет выше средней точки. Растровый элемент (2, 1) со следующей по величине координатой y лучше аппроксимирует положение отрезка. Следовательно, y увеличивается на единицу. Прежде чем рассматривать следующий пиксель, необходимо откорректировать ошибку вычитанием из нее единицы. Имеем e = 1/4 - 1 = -3/4.
Заметим, что пересечение вертикальной прямой x = 2 с заданным отрезком лежит на 1/4 ниже прямой y = 1. Если же перенести отрезок 1/2 вниз, мы получим как раз величину -3/4. Продолжение вычислений для следующего пикселя дает e = -3/4 + 3/8 = -3/8.
Так как e отрицательно, то y не увеличивается. Из всего сказанного следует, что ошибка — это интервал, отсекаемый по оси y рассматриваемым отрезком в каждом растровом элементе (относительно -1/2).
В общем случае чтобы обрабатывать отрезки во всех октантах. Необходимо учитывать в алгоритме номер квадранта, в котором лежит отрезок и его угловой коэффициент. Когда абсолютная величина углового коэффициента больше 1, y постоянно изменяется на единицу, а критерий ошибки Брезенхема используется для принятия решения об изменении величины x. Выбор постоянно изменяющейся (на +1 или -1) координаты зависит от квадранта.
(рис. 4)
Функция –Sign возвращает -1, 0, 1 для отрицательного, нулевого и положительного аргумента соответственно, предназначена для того чтобы учитывать номер квадранта.
Функция Line аппроксимирует отрезок с начальными координатами X1, Y1 и конечными координатами X2, Y2 по общему алгоритму Брезенхема.
Функция Triang объединяет три матрицы с координатами точек каждой стороны треугольника.
Далее выводим средствами Mathcad результат работы функции Triang для заданных координат вершин треугольника:
Додекаэдр – наиболее сложное платоново тело. Оптимальный метод его построения заключается в предварительном создании икосаэдра и соединении центров его смежных граней ребрами.
Икосаэдр конструируется по следующему алгоритму.
(рис. 5)
В окружностях сечений
цилиндра единичного радиуса строятся правильные пятиугольники 1-3-5-7-9-1 и 2-4-6-8-10-2 с координатами вершин xi=cos(36°i), zi=sin(36°i), yi=(-1)i+1h при i=1..10.Соединяя вершины 1-2-3-4-5-6-7-8-9-10-1, получим десять средних треугольных граней икосаэдра с длиной горизонтальных ребер
Так как у нас нет смещения по х и по у то
и , а поэтому получимИз условия получения равносторонних треугольников. Найдем высоту h, для этого распишем длину ребер d через координаты 1 и 10 вершины.
Так как
то получимВычислим радиус описанной сферы
(рис. 6)
Функция K формирует матрицу координат вершин икосаэдра.
Q – матрица координат вершин икосаэдра.
G - матрица номеров вершин образующих одну грань икосаэдра.
Функция VV формирует матрицу координат вершин додекаэдра. Для этого из матрицы Q берем координатные столбцы вершин, образующих одну грань, усредняем их и получаем соответствующий координатный столбец матрицы Q12.
Q12– матрица координат вершин додекаэдра.
В матрицы G12 задаем обход додекаэдра (рис. 7) для прорисовки.
(рис. 7)
Результатом работы функции V(Q, G) является блочная матрица, элементы которой содержат соответственно только координаты X, Y и Z начальных и конечных вершин всех ребер, входящих в матрицу G12.
Далее средствами Mathcad по результатам работы функции V(Q12,G12) строим график поверхности додекаэдра:
В данной курсовой работе я разработал и реализовал с помощью процедур и функций встроенного языка системы MathCAD программу на основе алгоритма Брезенхема, обеспечивающую генерацию стандартных графических примитивов в соответствии с вариантом задания, а именно генерацию треугольника. Также я разработал алгоритм построения модели додекаэдра. Успешно построил его по разработанному алгоритму с использованием системы программирования MathCAD. Тем самым закрепил, углубил и расширил теоретические знания в области методов моделирования объектов, укрепил свои практические умения и навыки программной реализации методов.