Presentatie titel

52

description

Computer Graphics. Presentatie titel. Technische Informatica www.hogeschool-rotterdam.nl/cmi. Rotterdam, 00 januari 2007. Les 2. Les 2 gaat over de hoofdstukken: 3.1 Scan-conversie van een punt 3.2 Scan-conversie van een lijn 3.3 Scan-conversie van een cirkel - PowerPoint PPT Presentation

Transcript of Presentatie titel

Page 1: Presentatie titel
Page 2: Presentatie titel

Presentatie titel

Rotterdam, 00 januari 2007

Computer Graphics

Technische Informatica

www.hogeschool-rotterdam.nl/cmi

Page 3: Presentatie titel

Les 2 • Les 2 gaat over de hoofdstukken:• 3.1 Scan-conversie van een punt• 3.2 Scan-conversie van een lijn • 3.3 Scan-conversie van een cirkel• 3.4 Scan-conversie van een ellips• 3.5 Scan-conversie van een bogen en

sectoren• 3.6 Scan-conversie van een rechhoek• 3.7 Opvullen van een gebied• 3.8 Scan-conversie van een karakter

Page 4: Presentatie titel

Inleiding • Veel figuren bestaan uit primitieven (punt,lijn,..enz)• Deze zijn gedefinieerd in de continue ruimte i.p.v.

pixels in de discrete beeld ruimte• Bijv. een lijn heeft vergelijking door 2 eindpunten• Het grafische systeem moet die vergelijking

converteren naar de beeldruimte. Dit heet scan-conversie of rastering

• Dit hoofdstuk gaat over wiskundige en algoritmische apecten van scan-conversie

• Primitieven zoals punt,lijn,cirkel,ellips,..enz.

Page 5: Presentatie titel

Scan-conversie: punt• Een wiskundig punt (float x,float y) moet

geconverteerd worden naar een pixel op lokatie (x’,y’)

• Dit kan op 2 manieren;1. Door (x’,y’) gelijk te maken aan het integer

gedeelte van (x,y) (het gehele getal)• Dit kan met de Floor functie • x’= Floor(x) , y’=Floor(y)• Deze levert de grootste waarde af die ≤

argument

Page 6: Presentatie titel

Scan-conversie: punt• Alle punten die voldoen aan: • x’≤ x<x’+1 en y’≤y<y’+1 worden afgebeeld op

pixel (x’,y’)• Het plaats de oorsprong in de linkerhoek van

het pixel (zie fig 3-1a)

Page 7: Presentatie titel

Scan-conversie: punt • Voorbeeld:• P1(1.7,0.8) pixel (1,0)• P2(2.2,1.3) pixel (2,1)• P2(2.8,1.9) pixel (2,1)

2. De Floor functie kan ook anders ingevuld worden:

• x’= Floor(x+0,5) , y’=Floor(y+0,5)• Alle punten die voldoen aan: • x’-0,5 ≤ x< x’+0,5 en y’+0,5 ≤y<y’+0,5 worden

afgebeeld op pixel (x’,y’)

Page 8: Presentatie titel

Scan-conversie: punt • Het plaats de oorsprong in het centrum van

het pixel (zie fig 3-1b)• Voorbeeld:• P1(1.7,0.8) pixel (2,1)• P2(2.2,1.3) pixel (2,1)• P2(2.8,1.9) pixel (3,2)• De 2e benadering wordt gebruikt• Andere voorbeelden van afrondfuncties:• Floor(4.8) 4 Floor(4.1) 4• Ceil(4.8) 5 Ceil(4.1) 5• Round(4.8) 5 Round(4.1) 4

Page 9: Presentatie titel

Scan-conversie: lijn • Een lijn wordt bepaald door 2 eindpunten P1 en

P2 ( zie fig 3-2)

• De vergelijking van de lijn is y=mx+b• m=helling; b=snijpunt y-as• Men kiest m ≥ 1 ( rest wordt afgeleid)• m=∞, horizontaal,vertikaal worden apart

berekend

Page 10: Presentatie titel

Scan-conversie: lijn • Directe berekening:• P1en P2 converteren naar pixel P1’(x1’,y1’) en

P2’(x2’,y2’)

• De helling wordt dan:

• Het snijpunt y-as b = y1’ - m.x1’

• Het nadeel hiervan is dat er floating point berekeningen zijn

m=y2

' -y1'

x2' -x1

'

Page 11: Presentatie titel

Scan-conversie: lijn • DDA algoritme:

(Digital Differential Algoritme)• Dit is een incrementele scan-conversie

methode• Na iedere stap i wordt opnieuw xi+1 en yi+1

berekend• Als (xi,yi) berekend is als een punt op de lijn ,

dan moet het volgende punt (xi+1,yi+1) voldoen aan ∆x/∆y=m

• Hierbij is ∆y= yi+1-yi en ∆x=xi+1-xi

• Nu is yi+1=yi + ∆x.m

Page 12: Presentatie titel

Scan-conversie: lijn • Als |m| ≤ 1 starten we met x=x’en y=y’en

maken ∆x=1• De y-coordinaat wordt dan yi+1=yi+m

• Dit gaat door tot y=y2’• Als |m| > 1 starten we met x=x’en y=y’en

maken ∆y = 1• De x-coordinaat wordt dan xi+1,= xi+1/m

• Dit gaat door tot x=x2’ • Alle punten zijn dan pixels• DDA is sneller omdat er geen floating point

vermenigvuldigingen zijn • Wel een floating point optelling

(1/m eenmalig berekend)

Page 13: Presentatie titel

Scan-conversie: lijn • Bresenham algoritme:• Dit is een efficiente incrementele methode om

scan-conversie van een lijn uit te voeren• Het gebruikt alleen integer optelling ,aftrekken

en vermenigvuldigen met 2 (schuif-operatie)• In fig 3-3 is een lijn getekend voor 0<m<1• Om een volgend punt te vinden moet gekozen

worden voor S of T (naar opzij of naar beneden)

• Zonder afleiding wordt het resultaat:

Page 14: Presentatie titel

Scan-conversie: lijn

Page 15: Presentatie titel

Scan-conversie: lijn• int x=x’, y=y’;• int dx=x2’- x1’ , dy = y2’-y1’ ;• int dT=2(dy-dx) , dS= 2dy;• int d=2dy-dx;• setPixel(x,y);• while( x < x2’ ) • { x++;• if (d <0) d=d +dS;• else { y++; d= d+dT;}• }• setPixel(x,y);• }

Page 16: Presentatie titel

Scan-conversie: cirkel• Er zijn verschillende manieren om een cirkel te

berekenen• Een cirkel is symmetrisch • Door 1 punt te bereken kunnen 8 punten

ingevuld worden ( zie fig 3-4)• De punten zijn:• P1=(x,y) P5=(-x,-y)

• P2=(y,x) P6=(-y,-x)

• P3=(-y,x) P7=(y,-x)

• P4=(-x,y) P8=(x,-y)

Page 17: Presentatie titel

Scan-conversie: cirkel

Page 18: Presentatie titel

Scan-conversie: cirkel• Er zijn 2 definities voor een cirkel:1. 2e orde polynoom (2e graads vergelijking)• y2=r2 –x2 zie fig. 3-5

• Hierin is:• x=x-coordinaat• y=y-coordinaat• r= straal• Inefficient algoritme vanwege de vele

berekeningen (wortel, kwadraat,enz)

Page 19: Presentatie titel

Scan-conversie: cirkel2. Goniometrische functie (zie fig 3-6)• x=rcosθ y=rsinθ• x= x-coordinaat• y= y-coordinaat• R= cirkel straal• Θ = hoek• Bij deze methode gaat

θ van 0 tot π/4 en x en y worden berekend

• Dit kost nog meer rekentijd om sin en cos te berekenen dan de 1e methode

Page 20: Presentatie titel

Scan-conversie: cirkel• Bresenham algoritme:• Dit is een efficiente incrementele methode om

scan-conversie van een cirkel uit te voeren• Het gebruikt alleen integer optelling ,aftrekken

en vermenigvuldigen met 2 (schuif-operatie)• Alleen de berekening van 900-450 is nodig (zie

fig 3-7• De beste benadering van de echte cirkel zijn

punten in het raster ,die er dicht bij zijn door:1. Beweeg in de x-richting 1 stap2. Beweeg in de x-richting 1 stap en

de negatieve y-as 1 stap

Page 21: Presentatie titel

Scan-conversie: cirkel

• Een keuze van 1 van de 2 dient te worden gemaakt

• Neem aan dat (xi,yi) de coordinaten zijn van het laatst geconverteerde punt na stap i (zie fig 3-8)

Page 22: Presentatie titel

Scan-conversie: cirkel

Page 23: Presentatie titel

Scan-conversie: cirkel• Dan is pixel P=(xi,yi)

• Dan is pixel T=(xi+1,yi)

• Dan is pixel S=(xi+1,yi-1)• • • • Stel D(T)= (xi+1)2 + yi

2 – r2

• Stel D(S)= (xi+1)2 + (yi-1)2 – r2

• D geeft de relatieve afstand van een pixelcentrum tot de echte cirkel

• D(T) is altijd positief (buiten de cirkel)• D(S) is altijd negatief (binnen de cirkel)

Page 24: Presentatie titel

Scan-conversie: cirkel• Een beslississingsvariabele di is als volgt

gedefinieerd:• di = D(T) + D(S)

• di = 2(xi+1)2 +yi2 +(yi-1)2 – 2r2

• Als di <0 dan is |D(T)| < |D(S)| en wordt pixel T gekozen

• Als di ≥0 dan is |D(T)| ≥ |D(S)| en wordt pixel S gekozen

• Nu de beslissingsvariable di+1 bepalen voor de volgende stap:

Page 25: Presentatie titel

Scan-conversie: cirkel• di+1 = 2(xi+1+1)2 +yi+1

2 +(yi+1-1)2 - 2r2 • Nu is:• di+1-di = 2(xi+1+1)2 +yi+1

2 +(yi+1-1)2 - 2r2 -2(xi+1)2 -yi

2 -(yi-1)2 + 2r2

• = 2(xi+1+1)2 +yi+12 +(yi+1-1)2 -2(xi+1)2 -yi

2 -(yi-1)2

• Daar xi+1= xi +1

• di+1=di+2(xi+2)2 +yi+12+(yi+1-1)2-2(xi+1)2-yi

2-(yi-1)2

Page 26: Presentatie titel

Scan-conversie: cirkel• di+1=di + 2xi

2 + 8xi+ 8+ yi+12+ yi+1

2 - 2 yi+1 +1 - 2xi2 -

4xi -2 - yi2 - yi

2 + 2yi - 1

• di+1=di + 4xi+ 2( yi+12- yi

2 ) -2( yi+1 - yi ) +6

• Als T het gekozen pixel is(di<0) dan is yi+1=yi

di+1=di + 4xi+ 6

• Als S het gekozen pixel is(di≥0) dan is yi+1=yi-1 di+1=di + 4xi+ 2( yi-1)2- 2yi

2 -2( yi-1 - yi ) +6

Page 27: Presentatie titel

Scan-conversie: cirkel di+1=di + 4xi+ 2yi

2- 4yi+2- 2yi2 +2+6

di+1=di + 4xi - 4yi+10 di+1=di + 4(xi - yi)+10• Conclusie: di+1=di + 4xi+ 6 als di<0 di+1=di + 4(xi - yi)+10 als di≥0

• Als startpunt kiezen we (xi, yi)=(0,r)

• Gegeven was di = 2(xi+1)2 +yi2 +(yi-1)2 – 2r2

• d1=2(0+1)2 + r2 +(r-1) 2 -2r2

Page 28: Presentatie titel

Scan-conversie: cirkel d1=2 + r2 +r 2 -2r +1-2r2 = 2 - 2r +1 = 3-2r• Voor 900 < θ <450 geldt dan:

int x =0, y=r, d=3-2r;while ( x <= y) { setPixel (x,y) if (d <0) d= d+4x+ 6; else { d=d+4(x-y) +10; y--; } x++;

}• Er is alleen schuiven (vermenigvuldigen

met 4) en optellen

Page 29: Presentatie titel

Scan-conversie: ellips• De ellips heeft evenals de cirkel symmetrie (4

keer i.p.v. 8 keer)• Er zijn 2 definities voor een ellips:1. 2e orde polynoom (2e graads vergelijking) (zie fig. 3-9)

• Hierin is:• (h,k)= centrum van de ellips• a= lengte van de lange as• b=lengte van korte as

Page 30: Presentatie titel

Scan-conversie: ellips

• De waarde van x wordt verhoogd van h tot a • Voor iedere stap moet y berekend worden met:

Page 31: Presentatie titel

Scan-conversie: cirkel• Deze methode is zeer inefficient. • De kwadraten, floating point, wortels ,enz2. Goniometrische functie (zie fig 3-10)

Page 32: Presentatie titel

Scan-conversie: ellips• De vergelijkingen zijn:• x=a cos(θ)+h en y=bsin(θ)+k• Met (x,y) de coordinaten• a=lengte van de lange as• b=lengte korte as• (h,k)= middelpunt ellips• De waarde van θ loopt van 0 tot π/2 radialen• De overige posities met symmetrie bepalen• De methode is niet efficient• Met veel geheugen en lookup tabellen van

sinus en cosinus te versnellen

Page 33: Presentatie titel

Scan-conversie: ellips• Midpoint algorime:• Dit is een efficiente incrementele methode om

scan-conversie van een ellips uit te voeren• Het gebruikt alleen integer optelling ,aftrekken

en vermenigvuldigen met 2 (schuif-operatie)

Page 34: Presentatie titel

Scan-conversie: boog • Een boog (fig 3-13a) kan worden gegenereerd

met polynomen of goniometrische functies

Page 35: Presentatie titel

Scan-conversie: boog• Als de goniometrische functie gebruikt wordt:• De startwaarde is θ1 en de eindwaarde θ2

(zie fig 3-13 a en b)• De rest van de stappen zijn identiek als bij een

cirkel• Als de polynoommethode gebruikt wordt dan

varieert de waarde van x1 en x2 (zie fig 3-14)• De waarde van y wordt berekend uit

• Bresenham wordt niet gebruikt omdat de eindpunten moeilijk te berekenen zijn

Page 36: Presentatie titel

Scan-conversie: boog

Page 37: Presentatie titel

Scan-conversie: sector• Een sector wordt geconverteerd door scan-

conversie voor een boog uit te voeren en• Daarna de scan-conversie voor de 2 lijnen

vanuit het centrum• Stel sectorcentrum (h,k)• Eerst scan-conversie van een boog van θ1 tot

θ2

• Daarna een lijn van (h,k) tot (rcos (θ1)+h,rsin (θ1)+k )

• Daarna een lijn van (h,k) tot (rcos (θ2)+h,rsin (θ2)+k )

Page 38: Presentatie titel

Scan-conversie: rechthoek• Een rechthoek waarvan de assen evenwijdig

zijn aan de coordinaatassen is bepaald als er 2 hoekpunten bekend zijn (zie fig 3-16a)

• De overgebleven hoekpunten kunnen worden afgeleid (zie fig 3-16b)

Page 39: Presentatie titel

Scan-conversie: rechthoek• Als de hoekpunten bekend zijn, worden de

coordinaten doorgegeven aan de lijnroutine en scan-conversie van de rechthoek vindt plaats

• De volgende lijnen worden getekend:• De lijn (x1,y1) naar (x1,y2)

• De lijn (x1,y2) naar (x2,y2)

• De lijn (x2,y2) naar (x2,y1)

• De lijn (x2,y1) naar (x1,y1)

Page 40: Presentatie titel

Opvullen van een gebied• Het opvullen van een gebied is het kleuren van

een gedeelte van een gebied• Gebieden kunnen gedefinieerd worden op

pixel of meetkundig niveau• Op pixel niveau beschrijven we het gebied in

termen van de grens pixels (zie fig 3-17a) of de totale pixels die het gebied omvat (zie fig 3-17b)

• Voor (a) wordt boundary-fill algoritme gebruikt• Voor (b) wordt flood-fill algoritme gebruikt

Page 41: Presentatie titel

Opvullen van een gebied

• Op meetkundig niveau is een gebied gedefinieerd met lijnen en krommen (bijv. een polygoon)

Page 42: Presentatie titel

Opvullen van een gebied• Boundary-fill• Dit is een recursief algoritme dat begint met

een startpixel binnen het gebied ( seed)• Het algoritme kijkt of dit pixel a) een grenspixel

is of b) dat het al gevuld is• Als het antwoord nee is wordt het pixel gevuld

en roept zichzelf weer aan en een buurpixel wordt gebruikt als nieuw seed

• Als het antwoord ja is , wordt teruggekeerd naar zijn oorspronkelijke oproep

Page 43: Presentatie titel

Opvullen van een gebied• Flood-fill• Dit algoritme begint met een startpixel (seed)

binnen het gebied. Het kijkt of het pixel de orginele kleur heeft van het gebied.

• Als het antwoord ja is , wordt het pixel gevuld met een nieuwe kleur en gebruikt een buurpixel als nieuw seed wordt opnieuw opgeroepen (recursief)

• Als het antwoord nee is , wordt teruggekeerd naar zijn oorspronkelijke oproep

• Deze methode is bruikbaar als er geen uniform gekleurde grens is

Page 44: Presentatie titel

Scan-lijn algoritme• In plaats van op pixel niveau kan ook een

polygoon opgevuld worden (gebieden die meetkundig gedefinieerd zijn met coordinaten)

• Dit is een snellere methode dan boundary fill• We hebben een gebied met hoekpunten V1,V2,

V3,.. , die verbonden zijn met lijnen E1,E2, E3, … , (zie fig 3-19)

• We nemen aan dat ieder hoekpunt al een conversie heeft ondergaan naar integer coordinaten (xi,yi)

Page 45: Presentatie titel

Scan-lijn algoritme

Page 46: Presentatie titel

Scan-lijn algoritme• Het algoritme begint met de eerste scanlijn van

de polygoon en vervolgt tot de laatste scanlijn• Voor iedere scanlijn berekend het het snijpunt

met de polygoon• Bijv: scanlijn y snijdt de lijnen E1,E7,E6 en E4

in de punten a,b,c,d• De snijpunten worden gesorteerd naar de x-

coordinaat en gegroepeerd als paren, bijv (a,b) en (c,d)

• Daarna wordt een lijn getekend van het 1e punt naar het 2e punt van elk paar

Page 47: Presentatie titel

Scan-lijn algoritme• Horizontale lijnen worden genegeerd ,want die

worden automatisch gevuld met de juiste kleur tijdens de scan conversie

• Bijv: lijn E5 wordt getekend als de scan lijn geconverteerd wordt

Page 48: Presentatie titel

Scan-conversie: karakter• Karakters , zoals letters en cijfers zijn de

bouwblokken van tekst• Ze worden gepresenteerd in verschillende

stijlen en groottes. De ontwerpstijl van een verzameling karakters heet lettertype of font

• Gewone fonts zijn Arial, Century, Courrier, enz• Ze varieren in verschijning: zwart, schuin,

onderstreept, enz• Karaktergrootte wordt gemeten in inches en

pica’s (punten)

Page 49: Presentatie titel

Scan-conversie: karakter• 2 basis benaderingen:1. Raster of bitmap font.• Ieder karakter is een verzameling pixels in een

bilevel raster patroon (bitmap) zie fig 3-20

• Dit is eenvoudig , ieder karakter is al geconverteerd en kan zo ingevoegd worden op een locatie in de bitmap.

Page 50: Presentatie titel

Scan-conversie: karakter• Er zijn aparte bitmaps nodig voor zwart, schuin,

enz.• Bovendien zijn schuine bitmaps overlappend in

een beeld ( zie fig 3-21)

• Verder is de grootte van een bitmap afhankelijk van de resolutie.

Page 51: Presentatie titel

Scan-conversie: karakter2. Vector of omtrek font• Hierbij worden grafische primitieven zoals lijnen

en bogen gebruikt om de omtrek van het karakter te maken (zie fig 3-22)

• Het is minder compact, en kost veel executietijd voor scan-conversie

Page 52: Presentatie titel

Scan-conversie: karakter• Echter de vector font kan karakters maken van

variable grootte, verschijning en orientatie• De getransformeerde primitieven kunnen direct

met scan-conversie bewerkt worden , zoals opvullen

• Of ze kunnen equivalente bitmaps produceren zoals bij 1)

• Dit verkort de executie tijd bij meerdere aanroepen