Professional Documents
Culture Documents
LabOG 4 Brezenhem
LabOG 4 Brezenhem
Мета роботи.
Написати метод, який реалізовує узагальнений алгоритм Брезенхема, який проводить пряму
(відрізок) між будь-якими точками заданими координатами початку і кінця.
Теоретичні відомості:
Алгоритм побудований так, що потрібно перевірити лише знак цієї похибки. На рис. 1 це ілюструється
для відрізка в першому октанті, тобто для відрізка з кутовим коефіцієнтом, що лежить у діапазоні від
0 до 1. З малюнка можна помітити що, якщо кутовий коефіцієнт відрізка з точки (0,0) більший, ніж
1/2, то перетин з прямою x=1 буде розташований ближче до прямої y=1, ніж до прямої y=0. Отже,
точка растра (1,1) краще апроксимує хід відрізка, ніж точка (1,0). Якщо кутовий коефіцієнт менше 1/2,
то навпаки. для кутового коефіцієнта, рівного 1/2, немає кращого вибору. У даному випадку алгоритм
вибирає точку (1,1).
Тому бажано перевіряти тільки знак похибки. Вона спочатку встановлюється рівною -1/2. Таким
чином, якщо кутовий коефіцієнт відрізка дорівнює чи більший 1/2, то величина похибки в наступній
точці растра з координатами (1,0) може бути обчислена як e=e+m, де m – кутовий коефіцієнт.
Якщо похибка від’ємна e<0, тоді беремо лише наступний піксель X= X + 1, а У залишається таким як
був.
У випадку першого октанта (врахувати, що вісь У на формі напрямлена вниз) лінії побудовані за
алгоритмом Брезенхема та методом line() співпадають.
У випадку інших октантів зелена і червона лінія не співпадають. Зелена побудована за допомогою
line() - правильна, а червона за алгоритмом – залишиласьв першому октанті. Результат роботи
алгоритму -невірний.
Узагальнений алгоритм Брезенхема
Щоб реалізація алгоритму Брезенхема була повною необхідно розглянути відрізки у всіх октантах
рис.3.
Модифікацію легко зробити, враховуючи в алгоритмі номер квадранта, в якому лежить відрізок і його
кутовий коефіцієнт. Коли абсолютна величина кутового коефіцієнта більше 1, у постійно змінюється
на одиницю, а критерій похибки Брезенхема використовується для ухвалення рішення про зміну
величини x. Вибір постійно змінюваної координати (на +1 чи -1) залежить від квадранта (рис. 3.)
Таблиця 1.
Часто потрібно натиснути stop для того, щоб зупинити повторювальний цикл розрахунків.
Для перерахунку коефіцієнтів наприклад для відрізка з координатами (0,0) та (3,8), який лежить в
другому октанті розрахунок аналогічний, але треба врахувати, що тепер у змінюється на одиницю, а х
– перераховується і формула прямої може бути представлена х=3/8y
Завдання
1. За допомогою методу translate() перенести початок відліку на середину вікна для малювання.
2. Намалювати осі та чисельні відліки на них (…-20,-10,0,10,20…)
3. За допомогою методу line() намалювати чотири лінії так, щоб лінії повністю знаходились в
різних октаедрах або починались і закінчувались в різних октаедрах координатної площини.
Координати початку і кінця однієї з ліній задано у варіантах.
4. Написати метод line_brez(), який реалізовує узагальнений алгоритм Брезенхема.
5. Намалювати за допомогою алгоритму (метод line_brez()) лінії з координатами заданими для
ліній в п.3
6. Переконатись, що лінії співпадають. Тобто ліній намальовані методом line() і line_brez()
співпадають.
7. Обчислити за алгоритмом декілька (порядку 10) значень координат пікселів (точок растра), які
будуть зафарбовані, для однієї з заданих ліній по варіанту з таблиці. Обчислені значення і
процес розрахунку представити в таблиці аналогічно, як в таблиці 1. Порівняти з
координатами пікселів (точками растра) за якими обчислює алгоритм і виводить в консоль.
8. Намалювати фігуру лініями за допомогою методу line_brez(). Фігура у таблиці з варіантами.
9. В звіті представити код програми для алгоритму, розрахунки з п.7 , порівняння з
координатами зафарбованих пікселів, які алгоритм виводить в консоль, , та з реалізацією
фігури.
Варіанти Координати лінії для розрахунку Фігура для малювання лініями. Кожна
значень пікселів «в ручну» і порівняння лінія малюється методом за алгоритмом
з тими, що дає алгоритм Брезенхема
1 (2,3) (4,13)
2 (-3,4) (-6,14)
3 (-1,3) (-10,7)
4 (-3,2) (0,12)
5 (-12,1) (-2,8)
6 (-1,2) (-11,10)
7 (2,-6) (-3,5)
8 (-3,-4) (2,6)
9 (-5,-2) (-7,-12)
10 (3,-2) (13,-8)
11 (4,-1) (6,-11)
12 (5,-3) (15,-8)