53
Cuprins Not ¸iuni generale Algoritm scan line de umplere Filling - Umplerea poligoanelor Marian Ioan MUNTEANU Al.I.Cuza University of Iasi, Romania webpage: http://www.math.uaic.ro/munteanu 12 Noiembrie 2012

Filling - Umplerea poligoanelormunteanu/cursuri/Curs_06_an3.pdf · 2012-11-11 · pixeli pe un monitor CRT) - ochiul va putea s a le perceap a ca pe un singur obiect. O mult˘ime

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Cuprins Notiuni generale Algoritm scan line de umplere

Filling - Umplerea poligoanelor

Marian Ioan MUNTEANU

Al.I.Cuza University of Iasi, Romaniawebpage: http://www.math.uaic.ro/∼munteanu

12 Noiembrie 2012

Cuprins Notiuni generale Algoritm scan line de umplere

Cuprins

1 Notiuni generale

2 Algoritm scan line de umplere

Cuprins Notiuni generale Algoritm scan line de umplere

O caracteristica importanta a graficii raster fata de graficavectoriala este posibilitatea utilizarii elementelor grafice pline, adicasolide.

Procesul se bazeaza pe o carenta a sistemului vizual uman sianume: integrarea spatiala ıntre obiecte pe care ochiul nu este ınstare sa le distinga din cauza absentei rezolutiei.

Numarul receptorilor vizuali fiind limitat, daca se deseneazaelemente grafice distincte dar suficient de aproape (cum ar fi doipixeli pe un monitor CRT) - ochiul va putea sa le perceapa ca peun singur obiect.

O multime de pixeli de aceeasi culoare, unul langa altul, va fiasadar vazuta, de catre ochiul uman, ca o singura figura coloratauniform.

Cuprins Notiuni generale Algoritm scan line de umplere

O caracteristica importanta a graficii raster fata de graficavectoriala este posibilitatea utilizarii elementelor grafice pline, adicasolide.

Procesul se bazeaza pe o carenta a sistemului vizual uman sianume: integrarea spatiala ıntre obiecte pe care ochiul nu este ınstare sa le distinga din cauza absentei rezolutiei.

Numarul receptorilor vizuali fiind limitat, daca se deseneazaelemente grafice distincte dar suficient de aproape (cum ar fi doipixeli pe un monitor CRT) - ochiul va putea sa le perceapa ca peun singur obiect.

O multime de pixeli de aceeasi culoare, unul langa altul, va fiasadar vazuta, de catre ochiul uman, ca o singura figura coloratauniform.

Cuprins Notiuni generale Algoritm scan line de umplere

O caracteristica importanta a graficii raster fata de graficavectoriala este posibilitatea utilizarii elementelor grafice pline, adicasolide.

Procesul se bazeaza pe o carenta a sistemului vizual uman sianume: integrarea spatiala ıntre obiecte pe care ochiul nu este ınstare sa le distinga din cauza absentei rezolutiei.

Numarul receptorilor vizuali fiind limitat, daca se deseneazaelemente grafice distincte dar suficient de aproape (cum ar fi doipixeli pe un monitor CRT) - ochiul va putea sa le perceapa ca peun singur obiect.

O multime de pixeli de aceeasi culoare, unul langa altul, va fiasadar vazuta, de catre ochiul uman, ca o singura figura coloratauniform.

Cuprins Notiuni generale Algoritm scan line de umplere

O caracteristica importanta a graficii raster fata de graficavectoriala este posibilitatea utilizarii elementelor grafice pline, adicasolide.

Procesul se bazeaza pe o carenta a sistemului vizual uman sianume: integrarea spatiala ıntre obiecte pe care ochiul nu este ınstare sa le distinga din cauza absentei rezolutiei.

Numarul receptorilor vizuali fiind limitat, daca se deseneazaelemente grafice distincte dar suficient de aproape (cum ar fi doipixeli pe un monitor CRT) - ochiul va putea sa le perceapa ca peun singur obiect.

O multime de pixeli de aceeasi culoare, unul langa altul, va fiasadar vazuta, de catre ochiul uman, ca o singura figura coloratauniform.

Cuprins Notiuni generale Algoritm scan line de umplere

Problema

Se considera un poligon dat prin intermediul varfurilor sale.Sa se deseneze pixelii care apartin acestuia.

Va trebui sa individualizam secventele orizontale de pixeli continuteın primitiva, algoritm numit de scan-line. Ideea este de a ”misca” olinie orizontala din pozitia cea mai de jos care intersecteazapoligonul catre pozitia cea mai de sus (cu o unitate la fiecare pas)si de a aplica un algoritm de scan-conversion pe linie, de fiecaredata.

Cuprins Notiuni generale Algoritm scan line de umplere

Problema

Se considera un poligon dat prin intermediul varfurilor sale.Sa se deseneze pixelii care apartin acestuia.

Va trebui sa individualizam secventele orizontale de pixeli continuteın primitiva, algoritm numit de scan-line. Ideea este de a ”misca” olinie orizontala din pozitia cea mai de jos care intersecteazapoligonul catre pozitia cea mai de sus (cu o unitate la fiecare pas)si de a aplica un algoritm de scan-conversion pe linie, de fiecaredata.

Cuprins Notiuni generale Algoritm scan line de umplere

Exemplu

Pentru a desena un dreptunghi plin, cu laturile paralele cu axele decoordonate, vor trebui iluminati pixelii interiori dreptunghiului

for y from ymin to ymax of the rectangle (y scan-line)for x from xmin to xmax (pixel cu pixel ın span)

putpixel (x , y , color)

Cuprins Notiuni generale Algoritm scan line de umplere

Exemplu

Pentru a desena un dreptunghi plin, cu laturile paralele cu axele decoordonate, vor trebui iluminati pixelii interiori dreptunghiului

for y from ymin to ymax of the rectangle (y scan-line)for x from xmin to xmax (pixel cu pixel ın span)

putpixel (x , y , color)

Cuprins Notiuni generale Algoritm scan line de umplere

Problema generala

Scopul nostru este de a construi un algoritm generic capabil safaca ”filling” pentru poligoane de orice tip: concave, convexe, culaturi care se intersecteaza:

Cuprins Notiuni generale Algoritm scan line de umplere

Regula par – impar

Se afla un punct ın interiorul unui poligon?• dintr-un punct arbitrar P se deseneaza o semidreapta• se numara intersectiile cu laturile• punctul P este interior daca numarul de intersectii este impar.

Cuprins Notiuni generale Algoritm scan line de umplere

Regula par – impar

Se afla un punct ın interiorul unui poligon?• dintr-un punct arbitrar P se deseneaza o semidreapta• se numara intersectiile cu laturile• punctul P este interior daca numarul de intersectii este impar.

Cuprins Notiuni generale Algoritm scan line de umplere

Regula par – impar

Se afla un punct ın interiorul unui poligon?• dintr-un punct arbitrar P se deseneaza o semidreapta• se numara intersectiile cu laturile• punctul P este interior daca numarul de intersectii este impar.

Cuprins Notiuni generale Algoritm scan line de umplere

Regula par – impar

Se afla un punct ın interiorul unui poligon?• dintr-un punct arbitrar P se deseneaza o semidreapta• se numara intersectiile cu laturile• punctul P este interior daca numarul de intersectii este impar.

Cuprins Notiuni generale Algoritm scan line de umplere

Regula par – impar

Se afla un punct ın interiorul unui poligon?• dintr-un punct arbitrar P se deseneaza o semidreapta• se numara intersectiile cu laturile• punctul P este interior daca numarul de intersectii este impar.

Cuprins Notiuni generale Algoritm scan line de umplere

Exemplu:

Cuprins Notiuni generale Algoritm scan line de umplere

Modalitatea cea mai la ındemana de a calcula intersectiile este sase utilizeze scan-conversion pentru liniile corespunzatoare fiecareilaturi a poligonului.

Aceasta aproximatie poate sa produca rezultate incorecte deoarecealgoritmul de rasterizare pentru linii nu are notiunea conceptului deınauntru (interior) si ın afara (exterior) si astfel pot fi selectionatipixeli care se afle ın afara poligonului.

Aceasta este ın particular de nedorit cand avem de convertitpoligoane de culori diferite cu laturi comune: ın acesta maniera vorexista pixeli ai unui poligon care ”invadeaza” alt poligon generandastfel un efect vizual incorect.

Cuprins Notiuni generale Algoritm scan line de umplere

Modalitatea cea mai la ındemana de a calcula intersectiile este sase utilizeze scan-conversion pentru liniile corespunzatoare fiecareilaturi a poligonului.

Aceasta aproximatie poate sa produca rezultate incorecte deoarecealgoritmul de rasterizare pentru linii nu are notiunea conceptului deınauntru (interior) si ın afara (exterior) si astfel pot fi selectionatipixeli care se afle ın afara poligonului.

Aceasta este ın particular de nedorit cand avem de convertitpoligoane de culori diferite cu laturi comune: ın acesta maniera vorexista pixeli ai unui poligon care ”invadeaza” alt poligon generandastfel un efect vizual incorect.

Cuprins Notiuni generale Algoritm scan line de umplere

Modalitatea cea mai la ındemana de a calcula intersectiile este sase utilizeze scan-conversion pentru liniile corespunzatoare fiecareilaturi a poligonului.

Aceasta aproximatie poate sa produca rezultate incorecte deoarecealgoritmul de rasterizare pentru linii nu are notiunea conceptului deınauntru (interior) si ın afara (exterior) si astfel pot fi selectionatipixeli care se afle ın afara poligonului.

Aceasta este ın particular de nedorit cand avem de convertitpoligoane de culori diferite cu laturi comune: ın acesta maniera vorexista pixeli ai unui poligon care ”invadeaza” alt poligon generandastfel un efect vizual incorect.

Cuprins Notiuni generale Algoritm scan line de umplere

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;

c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;

d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Descrierea algoritmului

Operatia de filling pentru o singura scan-line consta ın 3 pasi:

1. Se calculeaza intersectiile dintre scan-line si toate laturilepoligonului.2. Se ordoneaza intersectiile dupa abscisa x.3. Se aprind pixelii ıntre perechi de intersectii care sunt interioarepoligonului, utilizand, pentru a determina care pixel este interior,asa-numita regula odd-parity care spune:

a) paritatea initiala este para;b) fiecare intersectie schimba paritatea;c) se deseneaza pixelii cand paritatea este impara;d) nu se deseneaza nimic cand paritatea este para.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

Inainte de a analiza problemele de intersectie si sorting, sa vedemcum se defineste, ın diferite situatii, daca un pixel este interior saunu poligonului.

Va trebui sa raspundem la cateva ıntrebari:

A. Daca o intersectie cu o valoare generica a lui x esterationala, cum determinam care dintre cei doi pixeli de peorizontala (care ıncadreaza punctul ideal) este cel cautat?• daca ıntalnim o intersectie cand venim din interiorul

poligonului (paritatea - parity bit - este impara) rotunjim laıntregul mai mic pentru a ramane tot ınauntru;• daca venim din afara (exteriorul) poligonului (paritatea este

para), rotunjim la ıntregul urmator pentru a intra ınauntru.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

Inainte de a analiza problemele de intersectie si sorting, sa vedemcum se defineste, ın diferite situatii, daca un pixel este interior saunu poligonului.

Va trebui sa raspundem la cateva ıntrebari:

A. Daca o intersectie cu o valoare generica a lui x esterationala, cum determinam care dintre cei doi pixeli de peorizontala (care ıncadreaza punctul ideal) este cel cautat?• daca ıntalnim o intersectie cand venim din interiorul

poligonului (paritatea - parity bit - este impara) rotunjim laıntregul mai mic pentru a ramane tot ınauntru;• daca venim din afara (exteriorul) poligonului (paritatea este

para), rotunjim la ıntregul urmator pentru a intra ınauntru.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

Inainte de a analiza problemele de intersectie si sorting, sa vedemcum se defineste, ın diferite situatii, daca un pixel este interior saunu poligonului.

Va trebui sa raspundem la cateva ıntrebari:

A. Daca o intersectie cu o valoare generica a lui x esterationala, cum determinam care dintre cei doi pixeli de peorizontala (care ıncadreaza punctul ideal) este cel cautat?• daca ıntalnim o intersectie cand venim din interiorul

poligonului (paritatea - parity bit - este impara) rotunjim laıntregul mai mic pentru a ramane tot ınauntru;• daca venim din afara (exteriorul) poligonului (paritatea este

para), rotunjim la ıntregul urmator pentru a intra ınauntru.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

Inainte de a analiza problemele de intersectie si sorting, sa vedemcum se defineste, ın diferite situatii, daca un pixel este interior saunu poligonului.

Va trebui sa raspundem la cateva ıntrebari:

A. Daca o intersectie cu o valoare generica a lui x esterationala, cum determinam care dintre cei doi pixeli de peorizontala (care ıncadreaza punctul ideal) este cel cautat?• daca ıntalnim o intersectie cand venim din interiorul

poligonului (paritatea - parity bit - este impara) rotunjim laıntregul mai mic pentru a ramane tot ınauntru;• daca venim din afara (exteriorul) poligonului (paritatea este

para), rotunjim la ıntregul urmator pentru a intra ınauntru.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

B. Cum se trateaza cazul special al unei intersectii cucoordonate ıntregi? Pentru a evita conflicte de atributie pentrulaturi adiacente se defineste ca o intersectie cu coordonate ıntregila limita din stanga pentru span de pixeli este interna poligonului,iar la limita din dreapta este externa.

C. Si daca intersectia cu coordonate ıntregi se refera la unvarf? In calculul paritatii se va considera doar varful ymin nu siymax al unei laturi.

D. Cum se trateaza cazul special al varfurilor care definesclaturi orizontale? Este de ajuns sa consideram ca varfurile uneilinii orizontale nu influenteaza calculul paritatii si se obtineautomat ca laturile orizontale de jos vor fi desenate, cele de sus nu.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

B. Cum se trateaza cazul special al unei intersectii cucoordonate ıntregi? Pentru a evita conflicte de atributie pentrulaturi adiacente se defineste ca o intersectie cu coordonate ıntregila limita din stanga pentru span de pixeli este interna poligonului,iar la limita din dreapta este externa.

C. Si daca intersectia cu coordonate ıntregi se refera la unvarf? In calculul paritatii se va considera doar varful ymin nu siymax al unei laturi.

D. Cum se trateaza cazul special al varfurilor care definesclaturi orizontale? Este de ajuns sa consideram ca varfurile uneilinii orizontale nu influenteaza calculul paritatii si se obtineautomat ca laturile orizontale de jos vor fi desenate, cele de sus nu.

Cuprins Notiuni generale Algoritm scan line de umplere

Probleme care apar

B. Cum se trateaza cazul special al unei intersectii cucoordonate ıntregi? Pentru a evita conflicte de atributie pentrulaturi adiacente se defineste ca o intersectie cu coordonate ıntregila limita din stanga pentru span de pixeli este interna poligonului,iar la limita din dreapta este externa.

C. Si daca intersectia cu coordonate ıntregi se refera la unvarf? In calculul paritatii se va considera doar varful ymin nu siymax al unei laturi.

D. Cum se trateaza cazul special al varfurilor care definesclaturi orizontale? Este de ajuns sa consideram ca varfurile uneilinii orizontale nu influenteaza calculul paritatii si se obtineautomat ca laturile orizontale de jos vor fi desenate, cele de sus nu.

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

In figura considerata, la scan-line 6 avem urmatoarea situatie:

Initial paritatea este para. Cand ajungem ın punctul (2, 6) avemintersectie la limita din stanga, deci paritatea se schimba si devineimpara. Se ıncepe aprinderea pixelilor. Ajungem ın F care esteymin pentru (FG ) si (EF ) deci paritatea se schimba de doua ori siastfel ramane impara. Se continua aprinderea pixelilor. Ajungemın C care este maxim pentru (BC ) (nu influenteaza paritatea), iarlatura (CD) fiind orizontala, din nou nu schimb paritatea.

Continuam desenarea pixelilor.Ajung ın D care este minim pentru(DE ), astfel paritatea devine para.Se ınceteaza desenarea pixelilor.(Asadar, pe segmentul orizontal(CD) paritatea este impara si prinurmare, segmentul se traseaza.)

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

Fie x [k], y [k] coordonatele varfului Pk al poligonului si n numarulde laturi. Fie nr int numarul de intersectii pe o anumita scan line.

Fie de asemenea x int[k] abscisa intersectiei k cu scan line.

int x[100], y[100]; // coordonatele varfurilorfloat x int[100]; // coordonata x a intersectiilorint u, k, n, nr int, ymin, ymax;

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

/* functie de calcul a marginii din stanga */int stg(float z){ /* daca z este intreg, il returneaza

daca z este rational, il rotunjeste la intregul urmator */if (z == int (z)) return z;

else return int (z) + 1;}

/* functie de calcul a marginii din dreapta */int dr(float z){ /* daca z este intreg, returneaza z-1

daca z este rational, il rotunjeste la intregul precedent */if (z == int (z)) return z-1;

else return int (z);}

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

/* functie de sortare */float *qsort (float *a, int L, int R){

int h, j;float temp;for(h=L; h<=R-1; h++)

for(j=h+1; j<=R; j++)if (a[h]>a[j]){

temp=a[h];a[h]=a[j];a[j]=temp;}

return a;}

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

/* algoritmul de fill pe scan line */void scanline(int y0){int i;nr int= 0;for (i=1; i <=n; i++){

if ((y [i + 1]− y0) ∗ (y0− y [i ]) > 0)/* linia scan taie interiorul segmentului */

{nr int++;x int[nr

int]=(y0−y[i])∗float((x[i+1]−x[i]))/float((y[i+1]−y[i]))+x[i];}

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

else if (y[i]==y0)/* linia scan trece printr-un varf al poligonului */

if ((y[i-1]>y0) && (y[i+1]>y0)){ /* avem situatia \/ pentru varfuri */

nr int+=2; /* consider varful Pi de doua ori */x int[nr int-1]=x[i];x int[nr int]=x[i];}else if ((y[i-1]−y0)∗(y[i+1]−y0)< 0)

/* avem situatia laturilor una in continuarea celeilalte */{

nr int ++;x int[nr int]=x[i];}

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

else if (y[i+1]==y0) /* avem latura orizontala */if ((y[i+2]>y0) && (y[i-1]>y0)){ /* avem situatia \ / */

nr int +=2;x int[nr int-1]=x[i];x int[nr int]=x[i+1];} else

if ((y[i+2]<y0)&&(y[i-1]>y0)){ /* avem cazul y[i]=y[i+1] intre y[i-1] > y[i+2] */

nr int++;x int[nr int]=x[i];} else

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

if ((y[i+2]>y0)&&(y[i-1]<y0)){ /* avem cazul y[i]=y[i+1] intre y[i-1] < y[i+2] */

nr int++;x int[nr int]=x[i+1];}

} //end for

/* reamintim ca liniile orizontale se deseneaza daca sunt inferioare

si nu se deseneaza daca sunt linii orizontale superioare */

qsort(x int, 1, nr int);// se sorteaza crescator abscisele intersectiilor

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

k=1;while (k < nr int){

delay(10);line(stg(x int[k]), y0, dr(x int[k+1]), y0);k +=2;

}} // end functie scanline

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

void main ( ) {clrscr( );cout<<”Introduceti numarul de laturi:”<<endl;cout<<”n=”;cin>>n;cout<<”Introduceti coordonatele varfurilor:”<<endl;for(k=1; k<=n; k++){cout<<”x[”<<k<<”]=”; cin>>x[k];cout<<”y[”<<k<<”]=”; cin>>y[k];cout<<endl;}

x[0]=x[n]; y[0]=y[n];x[n+1]=x[1]; y[n+1]=y[1];x[n+2]=x[2]; y[n+2]=y[2];

Cuprins Notiuni generale Algoritm scan line de umplere

Algoritmul

for(k=1; k<=n; k++)line(x[k], y[k], x[k+1], y[k+1]);

/* aflarea minimului si maximului pentru scan line */ymin=x[1]; ymax=y[1];for (k=1; k<=n; k++) if (y[k] > ymax) ymax=y[k];for (k=1; k<=n; k++) if (y[k] < ymin) ymin=y[k];

/* fill pe scan line de la ymin la ymax */for (u=ymin; u <= ymax; u++){

setcolor(u%5+1); // umplerea se face cu 5 culoriscanline(u);}