Upload
phungkien
View
226
Download
2
Embed Size (px)
Citation preview
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)
Osnovni algoritmi rasterske grafike zacrtanje 2D primitiva
2. dio kolegija Racunalna grafika
Nela Bosner
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)
DefinicijaScan convering je aproksimacija ili diskretizacijamatematickih primitiva, definiranih pomocu svojih vrhova ukartezijevim koordinatama, skupom pixel-a odredenogintenziteta sive ili neke druge boje.
Scan converting može biti implementiranhardware-skisoftware-ski unutar grafickog paketa
Algoritmi za scan converting se moraju izvršavati brzo. Onikoriste
inkrementalne metode da bi minimizirali broj operacija(narocito * i /)cjelobrojnu aritmetiku (zbog diskretnosti pixel-a)
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)
Reprezentacija pixel-a
Mi cemo reprezentirati pixel kaokružna tocka centrirana na pixel-ovim (x , y)koordinatama cjelobrojne mreže.
g g g g gg g g g gg g g g gg g g g g
Kod pravih zaslona razmak izmedu susjednih pixel-a moževarirati:
kod nekih sustava susjedni pixel-i se preklapajukod nekih postoji razmak izmedu pixel-aa kod nekih je razmak izmedu pixel-a uži u vodoravnomsmjeru nego u okomitom.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Scan converting za linije
Scan converting algoritam za linije racuna koordinate pixel-akoji leže na ili blizu idealne, infinitezimalno tanke ravne linijesmještene na 2D rasterskoj mreži.
Razmatramo 1 pixel debelu aproksimaciju linije. Svojstva:niz pixel-a koji leže što je bliže moguce linijii koji je što ravnijiza linije sa koeficijentom smjera k ∈ [−1,1], tocno 1pixel u svakom stupcu treba biti osvjetljenza linije sa koeficijentom smjera k /∈ [−1,1], tocno 1pixel u svakom retku treba biti osvjetljensve linije trebaju biti nacrtane sa konstantnom nijansomsive ili bojom,
neovisno o duljini i orijentacijišto je brže moguce
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Dodatna svojstva:mogucnost crtanja linija debljih od 1 pixel-a,razlicitih stilova linije (crtkano, tockasto, . . . )razlicitih oblika krajnjih tocakamogucnost korištenja antialiasing tehnika
Mi cemo razmatrati samo 1 pixel debele linije koje imajutocno jedan monokromatski pixel po stupcu (ili retku).
g g g g gg g g g gg g g g gg g g g g
�������
���
w w w w w
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Osnovni inkrementalni algoritam
Ulaz: (xl , yl), (xd , yd ) — krajnje tocke linijeDefiniramo: ∆x = xd − xl , ∆y = yd − yl
Izracunamo: k = ∆y/∆xU algoritmu osvijetlit cemo pixel sa koordinatama(xi ,Round(yi)):
xi , i = 0,1,2, . . . — cjelobrojne koordinatayi = kxi + lRound(yi ) = b0.5 + yic— cjelobrojna koordinata
Ovaj algoritam bira pixel-e najbliže liniji, alije neefikasan jer imamo *,+ i b cMnoženje možemo eliminirati ako primijetimo da za∆ix = xi+1 − xi
yi+1 = kxi+1 + l = k(xi + ∆ix) + l = yi + k∆ix .
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
S obzirom da mi crtamo pixel po pixel, za |k | ≤ 1uzimamo da je ∆ix = 1, pa slijedi
xi+1 = xi + 1,yi+1 = yi + k .
Time smo definirali inkrementalni algoritam.Inicijalizacija: za (x0, y0) uzmu se cjelobrojnekoordinate jedne od krajnjih tocaka.Za |k | > 1 zamijene se uloge od x i y :
yi+1 = yi + 1,xi+1 = xi + 1/k .
Ovaj algoritam se još naziva i digital differentialanalyzer (DDA).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
k k k kk k k kk k k k
������
������
����
{{ {
{
s s(xi , Round(yi ))
(xi , yi )
(xi + 1, Round(yi + k))
(xi + 1, yi + k)
��*
Hj
����
HHY
Slika: Inkrementalno racunanje za (xi , yi ).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Algoritam (Inkrementalni algoritam za scan converting linije)
void Linija( /* Pretpostavlja se |k| ≤ 1, xl < xd */
int xl, int yl, /* Lijeva krajnja tocka */
int xd, int yd, /* Desna krajnja tocka */
int v) /* Vrijednost smještena u pixel linije */
{int x; /* x ide od xl do xd jedinicnim korakom */
double dy = yd − yl;double dx = xd − xl;double k = dy/dx;double y = yl;for (x = xl ; x <= xd ; x + +){
NacrtajPixel(x,Round(y),v); /* Postavlja pixel na v */
y+ = k;}
}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
(Bresenhamov) Algoritam srednje tocke zaliniju
Nedostaci osnovnog inkrementalnog algoritma:zaokruživanje Round(y ) zahtijeva odredeno vrijemeza racunanje k potrebno je dijeljenje
Bresenham je razvio algoritam koji koristi samocjelobrojnu aritmetiku i inkrementalan je.Verzija ovog algoritma u aritmetici pomicnog zarezamože se primijeniti kod linija sa krajnjim tockama urealnim koordinatama.Pretpostavlja se da je koeficijent smjera linije k ∈ [0,1〉.Ostali koeficijenti smjera mogu se obraditi pogodnimzrcaljenjem oko glavnih osi.Donju–lijevu krajnju tocku oznacavamo sa (x0, y0), agornju–desnu sa (x1, y1).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
k k kk k kk k k
������������
{s
P = (xP , yP )
I
SI
M
Q
prijašnjipixel
izbor trenut-nog pixel-a
izbor sljede-ceg pixel-a
Slika: Mreža pixel-a za algoritam srednje tocke, sa oznaženomsrednjom tockom M, i pixel-ima I i SI izmedu kojih se bira sljedeciosvjetljeni pixel.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Pixel izabran u prijašnjem koraku oznacen je saP = (xP , yP).U tekucem koraku biramo izmedu dva pixel-a I i SI.Neka je Q tocka sjecišta linije koju obradujemo i linijemreže x = xp + 1.U Bresenhamovoj formulaciji
racuna se razlika okomitih udaljenosti d(I,Q) i d(SI,Q)predznak razlike se koristi za odredivanje pixel-a bližegtocki Q
U formulaciji srednje tockepromatra se na kojoj strani linije leži srednja tocka Mako M leži iznad linije, bira se pixel Iako M leži ispod linije, bira se pixel SI
Linija može prolaziti izmedu I i SI, ili oba pixel-a moguležati na jednoj strani.U oba slucaja test srednje tocke bira najbliži pixel.Greška je uvijek ≤ 1/2.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Za test srednje tocke reprezentirat cemo linijuimplicitnom funkcijom:
F (x , y) = ax + by + c = 0
Za dy = y1 − y0 i dx = x1 − x0 eksplicitni oblik linije je
y =dydx
x + l ,
odakle je
F (x , y) = dy · x − dx · y + l · dx = 0,
a = dy , b = −dx , c = l · dx .
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Za funkciju F (x , y) vrijedi:F (x , y) = 0 na linijiF (x , y) > 0 za tocke ispod linijeF (x , y) < 0 za tocke iznad linije
−20
−10
0
10
20
−20−10
010
20−100
−50
0
50
100
150
xy
z
Slika: Graf funkcije F (x , y).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Za primjenu testa srednje tocketrebamo izracunati F (M) = F (xP + 1, yP + 1
2) i provjeritinjezin predznakdefiniramo test varijablu d = F (xP + 1, yP + 1
2) za kojuje po definiciji
d = a(xP + 1) + b(
yP +12
)+ c
ako je d > 0 biramo pixel SIako je d < 0 biramo pixel Iako je d = 0 svejedno je, pa biramo I
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Promatramo lokaciju tocke M na sljedecoj liniji mreže:ovisi da li smo izabrali I ili SIako je izabran I, M se pomice jedan korak u smjeru x
dnovi = F(
xP + 2, yP +12
)= a(xP + 2) + b
(yP +
12
)+ c
= dstari + a∆I = a = dy
test varijabla se dobiva inkrementiranjem tekucevrijednosti za ∆I bez racunanja F (M).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
ako je izabran SI, M se pomice jedan korak u smjeru xi jedan u smjeru y
dnovi = F(
xP + 2, yP +32
)= a(xP + 2) + b
(yP +
32
)+ c
= dstari + a + b∆SI = a + b = dy − dx
test varijabla se dobiva inkrementiranjem tekucevrijednosti za ∆SI .
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Buduci da je prvi pixel linije prva krajnja tocka (x0, y0),prva srednja tocka je u (x0 + 1, y0 + 1
2).Za inicijalnu vrijednost od d vrijedi
F(
x0 + 1, y0 +12
)= a(x0 + 1) + b
(y0 +
12
)+ c
=ax0 + by0 + c + a +b2
=F (x0, y0) + a +b2
Ali, (x0, y0) je tocka na liniji, pa je F (x0, y0) = 0, i
dpocetni = a +b2
= dy − dx2.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Da bi izbjegli dijeljenje u dpocetni redefinirat cemofunkciju F (x , y):
F (x , y) = 2(ax + by + c).
Množenje cijele jednadžbe ne mijenja predznak testvarijable.Za racunanje dnovi potrebno je samo zbrajanje.
Napomena: Ova verzija algoritma vrijedi samo za one linijeciji je koeficijent smjera k ∈ [0,1〉.
ZadatakNapišite algoritam srednje tocke za scan converting linijekoji obraduje linije sa svim mogucim koeficijentima smjera.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Algoritam (Algoritam srednje tocke za scan converting linije)void SredtocLinija( /* Pretpostavlja se k ∈ [0, 1〉, x0 < x1 */
int x0, int y0, int x1, int y0, int v){
int dx = x1− x0;int dy = y1− y0;int d = 2 ∗ dy − dx; /* Inicijalna vrijednost od d */int deltaI = 2 ∗ dy; /* Korak za pomicanje do I */int deltaSI = 2 ∗ (dy − dx); /* Korak za pomicanje do SI */int x = x0;int y = y0;NacrtajPixel(x,y,v); /* Pocetni pixel */while(x < x1){
if(d <= 0){ /* Izaberi I */d+ = deltaI;x + +;
} else{ /* Izaberi SI */d+ = deltaSI;x + +;y + +;
}NacrtajPixel(x,y,v); /* Izabrani pixel najbliži liniji */
}}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Primjer
Želimo aproksimirati liniju zadanu krajnjim tockama (5,8) i(9,11).
Tok algoritma:
dx = 4, dy = 3, deltaI = 6, deltaSI = −2
1 x = 5, y = 8, d = 2, biram SI2 x = 6, y = 9, d = 0, biram I3 x = 7, y = 9, d = 6, biram SI4 x = 8, y = 10,d = 4, biram SI5 x = 9, y = 11, kraj
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
3 4 5 6 7 8 9 106
7
8
9
10
11
12
w w w w w
��������
Slika: Aproksimacija linije od (5,8) do (9,11) algoritmom srednjetocke.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
NapomenePoredak krajnjih tocaka: Treba se osigurati da selinija od P0 do P1 aproksimira istim skupom pixel-a kaoi linija od P1 do P0.
Jedino mjesto gdje izbor pixel-a ovisi o smjeru linije jekada linija prolazi kroz srednju tocku i d = 0.→ za k ∈ [0,1〉 u toj situaciji birali smo I.← za k ∈ [0,1〉 moramo birati JZ kako bismo dobili istirezultat.Slicne prilagodbe treba napraviti i za ostale koeficijentesmjera.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Kako zapoceti na rubu pravokutnika za obrezivanje:Algoritam bi trebao prihvatiti linije koje su analitickiobrezane (o tome kasnije).
Kada je linija odrezana kod lijevog ruba x = xminpravokutnika za obrezivanje.
Sjecište linije i ruba ima cjelobrojnu x koordinatu i realnuy koordinatu.Kao pocetni pixel uzimamo (xmin, Round(kxmin + l)) (istipixel kao i kod inkrementalnog algoritma).Test varijabla se inicijalizira sa F (M) na srednjoj tockiizmed I i SI u sljedecem stupcu.Ako se prvo odreže linija kod x = xmin, i onda primijenialgoritam srednje tocke od (xmin, Round(kxmin + l)) do(x1, y1) onda necemo dobiti korektan skup pixel-a —odrezana linija ima drugaciji koeficijent smjera.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
{ kk
������������������������
s(xmin, Round(kxmin + l))
(xmin, (kxmin + l))
I
SI
M
x = xmin
y = yminpravokutnik za obrezivanje
XXz
-
Slika: Aproksimacija linije od okomitog ruba pravokutnika zaobrezivanje.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
Kada je linija odrezana kod donjeg ruba y = yminpravokutnika za obrezivanje.
Za linije sa malim koeficijentom smjera postoji višepixel-a koji leže na pravcu y = ymin.Sve te tocke moraju ostati unutar pravokutnika.Zbog toga se prvo nade sjecište linije i pravcay = ymin − 1
2 , i zaokruži se x vrijednost.Prvi pixel odrezane linije je B = (Round(xymin− 1
2), ymin).
Ako samo nademo sjecište linije i pravca y = ymin, izaokružimo njegovu x koordinatu dobit cemo pixel A ane B.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinijeOsnovniinkrementalnialgoritam
Algoritam srednjetocke
Scanconverting zakružnice
Obrezivanje(clipping)
���������������������������
y y y yi i i i i i i ii i i i i i i i i i i iy y y y y y y ys s
x = xmin
y = yminB
A
y = ymin − 1
y = ymin − 12
Slika: Aproksimacija linije od vodoravnog ruba pravokutnika zaobrezivanje.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Scan converting za kružnice
Implicitna jednadžba kružnice sa središtem u ishodištu
x2 + y2 = R2.
Kružnice koje nemaju središte u ishodištu mogu setranslatirati u ishodište.
Korištenjem eksplicitne jednadžbe kružnice
y = ±√
R2 − x2
možemo nacrtati cetvrtinu kružnice za x ∈ [0,R] iy > 0, i koristiti simetriju. — NEEFIKASNO
koristi se * i √
kružnica ce imati velike razmake izmedu pixel-a za xblizu R, jer se nagib krivulje približava∞
Korištenjem parametarskog oblika (R cos θ,R sin θ) zaθ ∈ [0, π/2] — NEEFIKASNO
koriste se trigonometrijske funkcije
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Osmerostruka simetrija
-
6
������@
@@@@@
&%'$rrrrr r r r (y, x)
(x, y)(−x, y)
(−y, x)
(−y,−x)
(−x,−y)(x,−y)
(y,−x)
void TockeKruznice(int x,int y,int v){
NacrtajPixel(x,y,v);NacrtajPixel(y,x,v);NacrtajPixel(y,-x,v);NacrtajPixel(x,-y,v);NacrtajPixel(-x,-y,v);NacrtajPixel(-y,-x,v);NacrtajPixel(-y,x,v);NacrtajPixel(-x,y,v);
}
Treba se izracunati aproksimacija samo za odsjecakkružnice od 45◦.Za kružnice sa središtem u ishodištu, osam simetricnihtocaka mogu se prikazati procedurom TockeKruznice().Slucaj x = y se mora posebno riješiti.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
(Bresenhamov) Algoritam srednje tocke zakružnice
Bresenham je 1977 razvio inkrementalni generatorkružnica koji je efikasan.Podrazumijevamo da je središte kružnice u ishodištu.U obzir uzimamo samo 45◦ od kružice, drugi oktant zax ∈ [0,R/
√2〉 i y ∈ 〈R/
√2,R].
Koristimo proceduru TockeKuznice() za prikazivanjetocaka na cijeloj kružici.Strategija algoritma je odabir 1 od 2 pixel-a, i to onogkoji je bliži kružnici.Odabir se vrši izvrednjavanjem funkcije u srednjoj tockiizmedu ta 2 pixel-a.U drugom oktantu,
ako je pixel P = (xP , yP) bio prethodno izabran kaonajbliži kružniciizbor za sljedeci pixel je izmedu I i JI
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
{{{
{{{
kk
kkkP = (xP , yP ) I
JI
M MI
MJI
prijašnjipixel
izbor trenut-nog pixel-a
izbor sljede-ceg pixel-a
Slika: Mreža pixel-a za algoritam srednje tocke, sa oznaženomsrednjom tockom M, i pixel-ima I i JI izmedu kojih se bira sljedeciosvjetljeni pixel.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Definiramo funkciju F (x , y) = x2 + y2 − R2, i za njuvrijedi:
F (x , y) = 0 na kružniciF (x , y) > 0 izvan kružniceF (x , y) < 0 unutar kružnice
Može se pokazati daako je srednja tocka M izvan kružnice, tada je pixel JIbliži kružniciako je srednja tocka M unutar kružnice, tada je pixel Ibliži kružnici
Ponovo definiramo test varijablu d kao vrijednostfunkcije F (x , y) u srednjoj tocki:
dstari = F(
xP + 1, yP −12
)= (xP+1)2+
(yP −
12
)2
−R2.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Ako je dstari < 0, M se pomice jedan korak u smjeru x :
dnovi = F(
xP + 2, yP −12
)= (xP + 2)2 +
(yP −
12
)2
− R2
= dstari + (2xP + 3)
∆I = 2xP + 3
Ako je dstari ≥ 0, M se pomice jedan korak u smjeru x ijedan u smjeru −y :
dnovi = F(
xP + 2, yP −32
)= (xP + 2)2 +
(yP −
32
)2
− R2
= dstari + (2xP − 2yP + 5)
∆JI = 2xP − 2yP + 5
∆I i ∆JI ovise o xP i yP , zato se P zove tockaizvrednjavanja.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Algoritam cemo ograniciti na cjelobrojne radijuse.Za pocetne uvjete znamo da je prvi pixel na kružici u(0,R).Sljedeca srednja tocka leži u (1,R − 1
2), zato je
F(
1,R − 12
)= 1 +
(R2 − R +
14
)− R2 =
54− R.
Dalje implementiramo algoritam slicno algoritmusrednje tocke za linije.U ovom slucaju smo prinudeni koristiti realnu aritmetikuzbog razlomka u inicijalnoj vrijednosti od d .
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Algoritam (Algoritam srednje tocke za scan convertingkružnice)void SredtocKruznica(int r , int v) /* Pretpostavlja se da je središte kružnice u ishodištu */
{int x = 0;int y = r ;double d = 5.0/4.0− r ;TockeKruznice(x,y,v);while (y > x){
if (d < 0) /* Izaberi I */
d+ = 2.0 ∗ x + 3.0;else{ /* Izaberi JI */
d+ = 2.0 ∗ (x − y) + 5.0;y −−;
}x + +;TockeKruznice(x,y,v);
}}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Cjelobrojni algoritam
Kako bismo izbjegli realnu aritmetiku definiramo novutest varijablu
h = d − 14.
Tada inicijalizacija glasi h = 1− R,a test umjesto d < 0 glasi h < 1
4 .
Buduci da hna pocetku ima cjelobrojnu vrijednost,i da se inkremetira cjelobrojnim vrijednostima ∆I i ∆JI
test možemo promijeniti u
h < 0.
Ovime smo dobili cjelobrojni algoritam, u kojem cemo hopet promijeniti u d zbog konzistencije.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Algoritam (Cjelobrojni algoritam srednje tocke za scanconverting kružnice)void SredtocKruznica(int r , int v) /* Pretpostavlja se da je središte kružnice u ishodištu */
/* Samo cjelobrojna aritmetika */
{int x = 0;int y = r ;int d = 1− r ;TockeKruznice(x,y,v);while (y > x){
if (d < 0) /* Izaberi I */
d+ = 2 ∗ x + 3;else{ /* Izaberi JI */
d+ = 2 ∗ (x − y) + 5;y −−;
}x + +;TockeKruznice(x,y,v);
}}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Diferencije drugog reda
Algoritam ce biti efikasniji ako i korake ∆I i ∆JIracunamo inkrementalno.Ako u tekucem koraku izaberemo I:
odabrana tocka se pomice sa (xP , yP) na (xP + 1, yP)diferencija prvog reda u (xP , yP) je ∆Istari = 2xP + 3,zato je
u (xP + 1, yP) ∆Inovi = 2(xP + 1) + 3
diferencija drugog reda onda iznosi ∆Inovi −∆Istari = 2diferencija prvog reda u (xP , yP) je∆JIstari = 2xP − 2yP + 5, zato je
u (xP + 1, yP) ∆JInovi = 2(xP + 1)− 2yP + 5
diferencija drugog reda onda iznosi ∆JInovi −∆JIstari = 2
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Ako u tekucemo koraku izaberemo JI:odabrana tocka se pomice sa (xP , yP) na(xP + 1, yP − 1)diferencija prvog reda u (xP , yP) je ∆Istari = 2xP + 3,zato je
u (xP + 1, yP − 1) ∆Inovi = 2(xP + 1) + 3
diferencija drugog reda onda iznosi ∆Inovi −∆Istari = 2diferencija prvog reda u (xP , yP) je∆JIstari = 2xP − 2yP + 5, zato je
u (xP + 1, yP − 1) ∆JInovi = 2(xP + 1)− 2(yP − 1) + 5
diferencija drugog reda onda iznosi ∆JInovi −∆JIstari = 4
∆I i ∆JI se inicijaliziraju u pocetnom pixel-u (0,R).
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružniceOsmerostrukasimetrija
Algoritam srednjetocke
Obrezivanje(clipping)
Algoritam (Algoritam srednje tocke za scan convertingkružnice sa diferencijama drugog reda)void SredtocKruznica(int r , int v) /* Pretpostavlja se da je središte kružnice u ishodištu */
/* Koriste se diferencije drugog reda za racunanje inkrementa test varijable */{
int x = 0;int y = r ;int d = 1− r ;int deltaI = 3;int deltaJI = −2 ∗ r + 5;TockeKruznice(x,y,v);while (y > x){
if (d < 0) /* Izaberi I */d+ = deltaI;deltaI+ = 2;deltaJI+ = 2;
else{ /* Izaberi JI */d+ = deltaJI;deltaI+ = 2;deltaJI+ = 4;y −−;
}x + +;TockeKruznice(x,y,v);
}}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Obrezivanje (clipping)
Korisnik može interaktivno mijenjati položaj i velicinuprozora u kojem se prikazuje grafika.Zbog toga se cesto dogada da se slika u prozoru nemože u potpunosti prikazati, vec se vidi samo jedannjen dio.Zato se vrši obrezivanje (clipping) primitiva kako bi seprikazao samo onaj dio koji stane u prozor, tj. diounutar pravokutnika za obrezivanje.Važno je da se i scan converting i obrezivanje obavljašto je brže moguce.Obrezivanje se može vršiti:
analitickiistovremeno sa scan converting algoritmom
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Analiticko obrezivanje:najprije se izracunaju osnovni parametri obrezaneprimitive (kao npr. krajnje tocke linije), a nakon toga seprimijenjuje scan converting algoritam s novimparametrimaefikasno za realni koordinatni sustav — za cjelobrojnugrafiku treba još izvršiti dodatno rastersko obrezivanjejednostavno za obrezivanje linija i poligona — obratitiposebnu pažnju na inicijalizaciju test varijable
Obrezivanje istovremeno sa scan convertingalgoritmom
svaki pixel primitive se podvrgava testu da li se nalaziunutar pravokutnika za obrezivanjeprakticno za popunjene i debele primitive —provjeravaju se samo rubni pixel-iefikasno za slucajeve kada je prikaz primitive malo veciod pravokutnika za obrezivanje
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Obrezivanje linija
Linije se obrezuju analiticki.Algoritam za obrezivanje linija može se koristiti i zaobrezivanje poligona.Linija koje sijece pravokutnik za obrezivanje se ponovosvodi na jednu liniju:
ako linija leži unutar pravokutnika prikazuje se upotpunostiako sijece barem jedan rub pravokutnika prikazuje seobrezana linijaako linija leži na samoj granici pravokutnika prikazuje seako linija leži izvan pravokutnika ne prikazuje se
Za obrezivanje linije potrebno je provjeriti samo njenekrajnje tocke:
tocka (x , y) leži unutar pravokutnika omedenogkoordinatnim pravcima xmin i xmax , te ymin i ymax ako isamo ako
xmin ≤ x ≤ xmax , i ymin ≤ y ≤ ymax .
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
�������
s
s
���ss ����
ss
s�����
ss
ss
������
s
ss sA
B C
D
D′
E
F
G
H
G′
H′
I
J
K L
pravokutnikza obrezivanje
������
(a)
���ss ��ss���s
ss sA
B C
D′
G′
H′
K L
(b)
Slika: Slucajevi obrezivanja linija.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Cohen–Sutherlandov algoritam
Vrši se provjera krajnjih tocaka:1 trivijalno prihvacanje — obje krajnje tocke su unutar
pravokutnika za obrezivanje2 trivijalno odbijanje — obje krajnje tocke nalaze se u
vanjskoj poluravnini definiranoj jednim od rubovapravokutnika za obrezivanje
3 ako niti jedan uvjet nije zadovoljen — sjecište linije ipravca definiranog rubom pravokutnika dijeli liniju nadva segmenta, tako da se barem jedan segment možeodbaciti
segment se iterativno obrezuje, provjerom za trivijalnoprihvacanje ili odbijanjeako niti jedan uvjet nije zadovoljen segment se daljedijeli na podsegmenteto se radi tako dugo dok ono što ostane nije upotpunosti unutar pravokutnika, ili se može trivijalnoodbaciti
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Za provodenje provjere trivijalnog prihvacanja i odbijanjapromatramo pravce koji su definirani rubovimapravokutnika za obrezivanje — oni dijele ravninu u 9podrucjasvakom podrucju je dodijeljen 4-bitni kodkod je odreden položajem podrucja u odnosu navanjske poluravnine definirane rubovima pravokutnikasvaki bit koda postavljen je na 1 (istina) ili 0 (laž)4 bita u kodu zadovoljavaju sljedece uvjete:
1. bit vanjska poluravnina gornjeg ruba, iznad gornjeg ruba y > ymax
2. bit vanjska poluravnina donjeg ruba, ispod donjeg ruba y < ymin
3. bit vanjska poluravnina desnog ruba, desno od desnog ruba x > xmax
4. bit vanjska poluravnina lijevog ruba, lijevo od lijevog ruba x < xmin
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
0101 0100 0110
0001 0000 0010
1001 1000 1010
pravokutnikza obrezivanje
����
�1
Slika: Kodovi podrucja.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Detalji algoritma:Svakoj krajnjoj tocki linije pridružuje se kod podrucja ukojem leži.Ako su oba koda krajnjih tocaka jednaki nuli, tada linijau potpunosti leži unutar pravokutnika za obrezivanje —linija se trivijalno prihvaca.Ako oba koda imaju postavljenu 1 na istom bitu, tadalinija u potpunosti leži u vanjskoj poluravnini rubaodredenog tim bitom — linija se trivijalno odbija.Ako se linija ne može trivijalno prihvatiti niti odbiti,vršimo podjelu na 2 segmenta:
rub kojeg linija sijece dijeli liniju na dva dijeladio koji leži u vanjskoj poluravnini ruba se odbacujeporedak provjere rubova je proizvoljan — mi cemoprovjeravati
gornji donji desni lijevi
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
U slucaju da uvjeti prihvacanja i odbijanja nisu zadovoljeni,tada su osnovna svojstva koda pridruženog krajnjoj tocki:
bitovi koji su postavljeni na 1 odgovaraju rubovima kojelinija sijeceako jedna krajnja tocka leži u vanjskoj poluravnininekog ruba, tada druga krajnja tocka mora ležati uunutarnjoj poluravnini tog rubazbog toga linija mora sijeci taj rubalgoritam uvijek bira krajnju tocku koja leži izvanpravokutnika,
iz koda te krajnje tocke odreduje rub kojeg linija sijecetaj rub je prvi u zadanom poretku ciji je bit postavljen na1to je najljeviji bit u kodu postavljen na 1
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Sažetak algoritma:1 Izracunamo kodove od oba dvije krajnje tocke.2 Provjerimo uvjete za trivijalno prihvacanje i odbijanje.3 Ako obje provjere nisu zadovoljene, tada tražimo tocku
koja leži izvan pravokutnika.4 Provjeravamo kod vanjske tocke kako bi odredili rub
kojeg linija sijece.5 Nalazimo sjecište linije i tog ruba.6 Odrežimo segment od vanjske tocke do sjecišta, time
što cemo vanjsku krajnju tocku zamijeniti sjecištem.7 Izracunamo kod nove krajnje tocke, kako bismo se
pripremili za sljedecu iteraciju.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
HHHH
HHH
HHH
H
ssss
����������
s s ss
sA
B
C
D
E
F
G
H
I
pravokutnikza obrezivanje
������:
Slika: Ilustracija Cohen–Sutherlandovog obrezivanja linija.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Zbog toga što se provjera i obrezivanje vrši u fiksnomporetku, algoritam ce ponekad izvesti nepotrebnaobrezivanja.Nepotrebna obrezivanja se dogadaju kada se sjecištelinije i pravca odredenog rubom nalazi izvan samogpravokutnika za obrezivanje (tocka H u prethodnomprimjeru).Ovaj algoritam nije najefikasniji, ali je jednostavan inajviše se koristi.Lako ga je proširiti na 3D.
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Algoritam (Cohen–Sutherlandov algoritam za obrezivanjelinija)typedef unsigned int kodovi;enum { GORNJI = 0x1, DONJI = 0x2, DESNI = 0x4, LIJEVI = 0x8};
void CohenSutherlandAlg( /* Cohen–Sutherlandov algoritam za obrezivanje linije */double x0, double y0, double x1, double y1, /* od P0 = (x0, y0) do P1 = (x1, y1) i za pravokutnik */double xmin, double xmax, double ymin, /* za obrezivanje sa dijagonalom od (xmin, ymin) do */double ymax, int v) /* (xmax, ymax) */
{kodovi kod0, kod1, kodVan; /* Kodovi za P0, P1 i pomocnu vanjsku tocku */boolean prihvati = FALSE, gotovo = FALSE;kod0 = IzracunajKod(x0, y0, xmin, xmax, ymin, ymax);kod1 = IzracunajKod(x1, y1, xmin, xmax, ymin, ymax);do {
if (!(kod0 | kod1)){ /* Trivijalno prihvacanje i izlaz */prihvati = TRUE; gotovo = TRUE;
} else if (kod0 & kod1) /* Trivijalno odbijanje i izlaz */gotovo = TRUE;
else { /* Oba dva uvjeta nisu zadovoljena, izracunaj segment */double x,y; /* linije za odrezati: od vanjske tocke do sjecišta s rubom */kodVan = kod0 ? kod0 : kod1; /* Bar jedna krajnja tocka je izvan pravokutnika; odaberi ju *//* Sada nadi sjecište; koristi formule y = y0 + k ∗ (x − x0), x = x0 + (1/k) ∗ (y − y0). */if (kodVan & GORNJI){ /* Razdijeli liniju kod gornjeg ruba pravokutnika /*
x = x0 + (x1− x0) ∗ (ymax − y0)/(y1− y0);y = ymax;
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Algoritam (Cohen–Sutherlandov algoritam za obrezivanjelinija — nastavak)
} else if (kodVan & DONJI){ /* Razdijeli liniju kod donjeg ruba pravokutnika */x = x0 + (x1− x0) ∗ (ymin − y0)/(y1− y0);y = ymin;
} else if (kodVan & DESNI){ /* Razdijeli liniju kod desnog ruba pravokutnika */y = y0 + (y1− y0) ∗ (xmax − x0)/(x1− x0);x = xmax;
} else { /* Razdijeli liniju kod lijevog ruba pravokutnika */y = y0 + (y1− y0) ∗ (xmin − x0)/(x1− x0);x = xmin;
}/* Sada pomicemo vanjsku tocku do sjecišta i obrezujemo; pripremamo se za sljedecu iteraciju */if (kodVan == kod0){
x0 = x; y0 = y; kod0 = IzracunajKod(x0, y0, xmin, xmax, ymin, ymax);} else {
x1 = x; y1 = y; kod1 = IzracunajKod(x1, y1, xmin, xmax, ymin, ymax);}
}} while (gotovo == FALSE);if (prihvati)
SredtocLinijaReal(x0, y0, x1, y1, v); /* Verzija za double koordinate */}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Algoritam (Cohen–Sutherlandov algoritam za obrezivanjelinija — nastavak)kodovi IzracunajKod(
double x,double y,double xmin,double xmax,double ymin,double ymax){
kodovi kod = 0;if (y > ymax)
kod | = GORNJI;else if (y < ymin)
kod | = DONJI;if (x > xmax)
kod | = DESNI;else if (x < xmin)
kod | = LIJEVI;return kod;
}
Osnovnialgoritmirasterskegrafike zacrtanje 2Dprimitiva
Nela Bosner
Reprezentacijapixel-a
Scanconverting zalinije
Scanconverting zakružnice
Obrezivanje(clipping)Obrezivanje linija
Domaca zadacaNapišite program koji ucitava koordinate n tocaka, te xmin,xmax , ymin i ymax koordinate pravokutnika za obrezivanje.Program treba nacrtati poligon zadan tim tockama pomocualgoritma srednje tocke za linije, koji je pravilno obrezanzadanim pravokutnikom za obrezivanje.