Brezenhamov linijski algoritam

Brezenhamov linijski algoritam je algoritam računarske grafike koji se koristi za rasterizaciju linije tj. crtanje linije u rasterskom obliku. To podrazumeva da je za liniju zadatu sa dve tačke početnom (x0, y0) i krajnjom (x1, y1) potrebno odrediti skup piksela koje treba obojiti tako da taj skup piksela predstavlja što bolju aprokcimaciju linije.

Algoritam je razvio Džek Elton Brezenham 1962. u IBM-u. Bio je to jedan od najranijih algoritama računarske grafike. Pošto je linija objekat od izuzetnog značaja za grafiku i često je potrebno vršiti iscrtavanje ogromnog broja linija algoritam za cilj ima efikasnost. Efikasnost se postiže korišćenjem isključivo celobrojne aritmetike čije operacije su znatno jeftinije od operacija u pokretnom zarezu.

Jednostavnost i brzina algoritma čine da je on i danas u širokoj upotrebi. Jednostavnost algoritma omogućava čak i hardversku implementaciju.

Algoritam uredi

Najpre će biti opisan osnovni algoritam za crtanje linija a zatim postepeno uvođena poboljšanja koja vode ka izvođenju Brezenhamovog algoritma.

Podrazumeva se da je linija zadata sa dve tačke, početnom (x0, y0) i krajnjom (x1, y1) i da važi x0 < x1. Takođe, podrazumeva se da je potrebno nacrtati liniju debljine jednog piksela i da je funkcija za crtanje piksela data. Algoritam će biti izložen samo za linije prvog kvadranta za koje važi:   tj. da im je koeficient pravca veći od 0 a manji ili jednak 1. Ovaj prostor će biti nazivan prvim oktantom. Ostalih sedam slučajeva obrađuje se simetrično.

Ono što treba naglasiti je da je za linije za koje važi   u svakoj koloni tj. za svako   treba označiti tačno jedan piksel. Za ostale linije je potrebno označiti tačno jedan piksel u vrsti.

Algoritam grube sile uredi

Algoritam grube sile za crtanje linije zasniva se na primeni jednačine prave. Jednačina prave kroz dve tačke je:

 

Za svako   računamo vrednost   i tada je potrebno obojiti piksel  .

Ovaj pristup nije dobar jer se vrednost y uvek iznova računa i zbog korišćenja aritmetičkih operacija u pokretnom zarezu.

Inkrementalni algoritam uredi

Vrednost y je moguće računati na osnovu prethodno izračunatih vrednosti.

 , gde je B slobodan član
 
 

Za svako   računamo vrednost   i tada je potrebno obojiti piksel  .

Ovaj pristup je dobar jer eliminiše množenje i računanje iz početka vrednosti za y. Međutim, opet je problem rad sa operacijama u pokretnom zarezu pošto je vrednost m realna.

Brezenhamov algoritam uredi

Dosadašnje probleme rešava Brezenhamov algoritam.

Pikseli se sada posmatraju kao čvorovi kvadratne mreže.

Jednačina prave u implicitnom obliku, zapisana kao funkcija od (x,y), je:

 , gde su konstante  

Za tačke na liniji je f(x,y) = 0, za tačke ispod linije je f(x,y) > 0, za tačke iznad linije je f(x,y) < 0.

Pretpostavimo da smo dosli do tačke i koja se nalazi na liniji. Pošto smo u ovom trenutku ograničeni na linije iz prvog oktanka sledeći piksel koji posmatramo će imati x koordinatu xi+1. Pošto je koeficijent pravca prvog u prvom oktantu veći od 0 a manji od 1 y koordinata sledećeg piksela će biti ili yi ili yi+1. Dakle, imamo dve tačke koje su kandidati za odabir i treba da odaberemo onu koja najbolje aproksimira liniju tj. onu koja je najbliža liniji. Tačku sa koordinatama (xi+1, yi) označavaćemo kao tačku E (east), a tačku sa koordinatama (xi+1, yi+1) kao tačku NE (northeast).

Koju od ove dve tačke treba odabrati određujemo korišćenjem središnje tačke M (midpoint) koja ima koordinate (xi+1, yi+½). Ove koordinate uvrštavamo u jednačinu prave:

 

Ovo je takozvana promenljiva odlučivanja jer na osnovu njenog znaka određujemo koji piksel biramo. Ako je vrednost d manja od 0 znači da je tačka M iznad prave tj. da je prava bliža tački E tako da u tom slučaju bojimo piksel E. Ako je vrednost d veća od nule to znači da je tačka M ispod prave tj. da je prava bliža tački NE i u tom slučaju bojimo piksel NE.

Vrednost promenljive odlučivanja može se računati inkrementalno.

  • Ako je u prethodnom koraku odabrana tačka E koordinate sledeće središnje tačke su   i kada se te koordinate uvrste u jednačinu prave dobijamo novu vrednost funkcije odlučivanja:
 
 
  • Ako je u prethodnom koraku odabrana tačka NE koordinate sledeće središnje tačke su   i kada se te koordinate uvrste u jednačinu prave dobijamo novu vrednost funkcije odlučivanja:
 
 

Polazni piksel je tačka (x0, y0) i on se svakako nalazi na liniji. Početna vrednost promenljive odlučivanja je:

 

Pošto želimo da radimo isključivo sa celim brojevima a za odlučivanje nam je bitan samo znak promenljive odlučivanja ovu vrednost možemo pomnožiti sa 2 pa dobijamo:  

Zbog toga se i sve ostale vrednosti množe sa 2:

  • ako je odabrana tačka E u prethodnom koraku  
  • ako je odabrana tačka NE  

Ovako je ponovo uvedeno množenje, ali pošto je ovo množenje sa 2 ono može biti izvršeno kao šiftovanje ulevo za jednu poziciju tako da ne utiče značajno na smanjenje efikasnosti algoritma. Ovako dobijamo algoritam koji koristi isključivo sabiranje, oduzimanje i šiftovanje.

Implementacija uredi

Prikazana je implementacija u programskom jeziku C[1]. U prvom delu se umesto zamena mesta koordinatama radi pokrivanja svih osam slučajeva vrši određivanje za koje će vrednosti biti menjane koordinate i inicijalizacija promenljive odlučivanja.

void line(int x0, int y0, int x1, int y1) {
 
  int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
  int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1; 
  int err = (dx>dy ? dx : -dy) << 1, e2;
 
  for(;;){
    setPixel(x0,y0);
    if (x0==x1 && y0==y1) break;
    e2 = err;
    if (e2 >-dx) { err -= dy; x0 += sx; }
    if (e2 < dy) { err += dx; y0 += sy; }
  }
}

Vidi još uredi

Literatura uredi

Reference uredi