You are on page 1of 7

Лабораторна робота № 4

Алгоритм Брезенхема для побудови прямої лінії (відрізка).

Мета роботи.

Написати метод, який реалізовує узагальнений алгоритм Брезенхема, який проводить пряму
(відрізок) між будь-якими точками заданими координатами початку і кінця.

Використовуючи метод намалювати фігуру за варіантом

Теоретичні відомості:

Алгоритм Брезенхема вибирає оптимальні растрові координати для представлення відрізка. У


процесі роботи одна з координат – або x, або y (в залежності від кутового коефіцієнта) – змінюється
на одиницю. Зміна іншої координати (на 0 чи 1) відбувається залежно від відстані між дійсним
положенням відрізка і найближчою координатою сітки. Таку відстань ми назвемо похибкою.

Алгоритм побудований так, що потрібно перевірити лише знак цієї похибки. На рис. 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, де відрізок з
тангенсом кута нахилу 3/8 спочатку проходить через точку растра (0,0) і послідовно перетинає три
пікселі. Також ілюструється обчислення похибки при представленні відрізка дискретними пікселями.

Рис.2 Графік похибки в алгоритмі Брезенхема

Тому бажано перевіряти тільки знак похибки. Вона спочатку встановлюється рівною -1/2. Таким
чином, якщо кутовий коефіцієнт відрізка дорівнює чи більший 1/2, то величина похибки в наступній
точці растра з координатами (1,0) може бути обчислена як e=e+m, де m – кутовий коефіцієнт.

Блок схема алгоритму в першому октанті.


Програма в processing, яка реалізує даний алгоритм побудови відрізка в першому октанті.

int x1=0,y1=0,x2=50,y2=55; // Опис та задання початкової та кінцевої точки відрізка


float X,Y,Px,Py,E,i; // Опис змінних для програми
void setup(){ // Блок функцій для налаштування вікна для графіки
size(120,120); // Розмір форми для графіки
noLoop(); // Відключення циклу для функції draw()
}
void draw(){ // Функція для малювання на формі
translate(60,60); // Перенесення початку координат в центр форми
stroke(0,255,0); // Червоний колір лінії
line(x1,y1,x2,y2); // Побудова червоної лінії за допомогою граф.примітиву line
stroke(255,0,0); // Червоний колір лінії побудованої за алгоритмом Брезенхема
X= x1; // X та Y - нові біжучі координати відрізка
Y= y1; //Відрізок починається у заданій точці х1 та y1.
Px= x2 - x1; //Приріст відрізка по х – довжина відрізка по х
Py= y2 - y1; // Приріст відрізка по y – довжина відрізка по у
E= -1/2; // Ініціалізація похибки
for(i=0;i<Px;i++){ //На кожному кроці збільшуємо і на 1 піксель, аж поки і не стане рівне Px.
E= E + Py/Px; //На кожному кроці додаємо до похибки кутовий коефіцієнт нахилу прямої
if (E >= 0) {
X= X + 1;
Y= Y + 1;
E= E -1;
} else{
X= X + 1;
}
point(X, Y);
}
}
Якщо похибка додатня e>0, тоді беремо наступний піксель X= X + 1; та збільшуємо У на 1, а також
робимо поправку на -1 для похибки.

Якщо похибка від’ємна e<0, тоді беремо лише наступний піксель X= X + 1, а У залишається таким як
був.

На кожному кроці ставимо точку з координатами обчислених пар Х,У.

В результаті виконання програми отримуємо:

У випадку першого октанта (врахувати, що вісь У на формі напрямлена вниз) лінії побудовані за
алгоритмом Брезенхема та методом line() співпадають.

У випадку інших октантів зелена і червона лінія не співпадають. Зелена побудована за допомогою
line() - правильна, а червона за алгоритмом – залишиласьв першому октанті. Результат роботи
алгоритму -невірний.
Узагальнений алгоритм Брезенхема

Щоб реалізація алгоритму Брезенхема була повною необхідно розглянути відрізки у всіх октантах
рис.3.

Модифікацію легко зробити, враховуючи в алгоритмі номер квадранта, в якому лежить відрізок і його
кутовий коефіцієнт. Коли абсолютна величина кутового коефіцієнта більше 1, у постійно змінюється
на одиницю, а критерій похибки Брезенхема використовується для ухвалення рішення про зміну
величини x. Вибір постійно змінюваної координати (на +1 чи -1) залежить від квадранта (рис. 3.)

Рис.3 Розгляд випадків для узагальненого алгоритму Брезенхема

На рис.3 показано 8 октаедрів, на які розбивається координатна площина в узагальненому методі


Брезенхема. В кожному октаедрі зафарбовування пікселів прямої відбувається відповідно до формул
на рис.3.

В таблиці 1 наведено приклад розрахунку координат X та Y зафарбованих пікселів для відрізка з


координатами (0,0) (8,3)

Таблиця 1.

Піксель Похибка e Знак X зафарбованого У зафарбованого Корекція


похибки пікселя пікселя
0 e = -1/2 - 0 0
1 -1/2+3/8=-1/8 - 1 0
2 -1/8+3/8=2/8 + 2 1 2/8-1=-6/8
3 -6/8+3/8=-3/8 - 3 1
4 -3/8+3/8=0 0- 4 1
5 0+3/8=3/8 + 5 2 3/8-1=-5/8
6 -5/8+3/8=-2/8 - 6 2
7 -2/8+3/8=1/8 + 7 3 1/8-1=-7/8
8 -7/8+3/8=-4/8 - 8 3
Обчислення цієї ж задачі програмно з виведенням результатів у консоль

Часто потрібно натиснути 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)

You might also like