520 likes | 754 Views
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
E N D
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 • 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
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.
Scan-conversie: punt • Eenwiskundig punt (float x,float y) moetgeconverteerdwordennaareen pixel op lokatie (x’,y’) • Ditkan op 2 manieren; • Door (x’,y’) gelijktemakenaanhet integer gedeelte van (x,y) (hetgehelegetal) • Ditkan met de Floor functie • x’= Floor(x) , y’=Floor(y) • Dezelevert de grootstewaardeaf die ≤ argument
Scan-conversie: punt • Allepunten die voldoenaan: • x’≤ x<x’+1 en y’≤y<y’+1 wordenafgebeeld op pixel (x’,y’) • Hetplaats de oorsprong in de linkerhoek van het pixel (zie fig 3-1a)
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) • De Floor functiekanookandersingevuldworden: • x’= Floor(x+0,5) , y’=Floor(y+0,5) • Allepunten die voldoenaan: • x’-0,5 ≤ x< x’+0,5 en y’+0,5 ≤y<y’+0,5 wordenafgebeeld op pixel (x’,y’)
Scan-conversie: punt • Hetplaats de oorsprong in hetcentrum 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 benaderingwordtgebruikt • Anderevoorbeelden 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
Scan-conversie: lijn • Eenlijnwordtbepaald 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 wordtafgeleid) • m=∞, horizontaal,vertikaalworden apart berekend
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
Scan-conversie: lijn • DDA algoritme: (Digital Differential Algoritme) • Dit is een incrementelescan-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
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 • Ditgaat 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 • Ditgaat door tot x=x2’ • Allepuntenzijndan pixels • DDA is snelleromdatergeen floating point vermenigvuldigingenzijn • Weleen floating point optelling (1/m eenmaligberekend)
Scan-conversie: lijn • Bresenhamalgoritme: • Dit is eenefficienteincrementelemethodeom scan-conversie van eenlijnuittevoeren • Het gebruiktalleen integer optelling ,aftrekken en vermenigvuldigen met 2 (schuif-operatie) • In fig 3-3 is eenlijngetekendvoor 0<m<1 • Om eenvolgend punt tevindenmoetgekozenwordenvoor S of T (naaropzij of naarbeneden) • Zonderafleidingwordt het resultaat:
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); • }
Scan-conversie: cirkel • Erzijnverschillendemanierenomeencirkelteberekenen • Eencirkel is symmetrisch • Door 1 punt teberekenkunnen 8 punteningevuldworden ( zie fig 3-4) • De puntenzijn: • P1=(x,y) P5=(-x,-y) • P2=(y,x) P6=(-y,-x) • P3=(-y,x) P7=(y,-x) • P4=(-x,y) P8=(x,-y)
Scan-conversie: cirkel • Er zijn 2 definities voor een cirkel: • 2e orde polynoom(2egraads 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)
Scan-conversie: cirkel • Goniometrischefunctie(zie fig 3-6) • x=rcosθ y=rsinθ • x= x-coordinaat • y= y-coordinaat • R= cirkelstraal • Θ = 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
Scan-conversie: cirkel • Bresenhamalgoritme: • Dit is eenefficienteincrementelemethodeom scan-conversie van eencirkeluittevoeren • Hetgebruiktalleen integer optelling ,aftrekken en vermenigvuldigen met 2 (schuif-operatie) • Alleen de berekening van 900-450 is nodig (zie fig 3-7 • De bestebenadering van de echtecirkelzijnpunten in het raster ,die erdichtbijzijn door: • Beweeg in de x-richting 1 stap • Beweeg in de x-richting 1 stap en de negatieve y-as 1 stap
Scan-conversie: cirkel • Eenkeuze van 1 van de 2 dienttewordengemaakt • Neemaandat (xi,yi) de coordinatenzijn van hetlaatstgeconverteerde punt nastapi (zie fig 3-8)
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 + yi2 – r2 • Stel D(S)= (xi+1)2 + (yi-1)2 – r2 • D geeft de relatieveafstand van eenpixelcentrum tot de echtecirkel • D(T) is altijdpositief (buiten de cirkel) • D(S) is altijdnegatief (binnen de cirkel)
Scan-conversie: cirkel • Eenbeslississingsvariabeledi is alsvolgtgedefinieerd: • di = D(T) + D(S) • di = 2(xi+1)2 +yi2 +(yi-1)2 – 2r2 • Alsdi <0 dan is |D(T)| < |D(S)| en wordt pixel T gekozen • Alsdi ≥0 dan is |D(T)| ≥ |D(S)| en wordt pixel S gekozen • Nu de beslissingsvariable di+1bepalenvoor de volgendestap:
Scan-conversie: cirkel • di+1 = 2(xi+1+1)2 +yi+12 +(yi+1-1)2 - 2r2 • Nu is: • di+1-di = 2(xi+1+1)2 +yi+12 +(yi+1-1)2 - 2r2 -2(xi+1)2 -yi2 -(yi-1)2 + 2r2 • = 2(xi+1+1)2 +yi+12 +(yi+1-1)2 -2(xi+1)2 -yi2 -(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-yi2-(yi-1)2
Scan-conversie: cirkel • di+1=di+ 2xi2 + 8xi+ 8+ yi+12+ yi+12 - 2 yi+1 +1 - 2xi2 - 4xi -2 - yi2 - yi2 + 2yi - 1 • di+1=di+ 4xi+ 2( yi+12- yi2 ) -2( yi+1 - yi) +6 • Als T hetgekozen pixel is(di<0) dan is yi+1=yi di+1=di+ 4xi+ 6 • Als S hetgekozen pixel is(di≥0) dan is yi+1=yi-1 di+1=di+ 4xi+ 2( yi-1)2- 2yi2 -2( yi-1 - yi) +6
Scan-conversie: cirkel di+1=di+ 4xi+ 2yi2- 4yi+2- 2yi2 +2+6 di+1=di+ 4xi - 4yi+10 di+1=di+ 4(xi - yi)+10 • Conclusie: di+1=di+ 4xi+ 6 alsdi<0 di+1=di+ 4(xi - yi)+10 als di≥0 • Alsstartpuntkiezen 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
Scan-conversie: cirkel d1=2 + r2 +r 2 -2r +1-2r2 = 2 - 2r +1 = 3-2r • Voor 900 < θ <450 geldtdan: 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 alleenschuiven (vermenigvuldigen met 4) en optellen
Scan-conversie: ellips • De ellipsheeftevenals de cirkelsymmetrie (4 keeri.p.v. 8 keer) • Er zijn 2 definities voor een ellips: • 2e orde polynoom(2egraads vergelijking) (zie fig. 3-9) • Hierin is: • (h,k)= centrum van de ellips • a= lengte van de lange as • b=lengte van korte as
Scan-conversie: ellips • De waarde van x wordtverhoogd van h tot a • Vooriederestapmoet y berekendworden met:
Scan-conversie: cirkel • Dezemethode is zeer inefficient. • De kwadraten, floating point, wortels ,enz • Goniometrischefunctie(zie fig 3-10)
Scan-conversie: ellips • De vergelijkingenzijn: • x=a cos(θ)+h en y=bsin(θ)+k • Met (x,y) de coordinaten • a=lengte van de lange as • b=lengtekorte as • (h,k)= middelpuntellips • 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
Scan-conversie: ellips • Midpoint algorime: • Dit is eenefficienteincrementelemethodeom scan-conversie van eenellipsuittevoeren • Hetgebruiktalleen integer optelling ,aftrekken en vermenigvuldigen met 2 (schuif-operatie)
Scan-conversie: boog • Eenboog (fig 3-13a) kanwordengegenereerd met polynomen of goniometrischefuncties
Scan-conversie: boog • Als de goniometrischefunctiegebruiktwordt: • De startwaarde is θ1 en de eindwaardeθ2 (ziefig 3-13 a en b) • De rest van de stappenzijnidentiekalsbijeencirkel • Als de polynoommethodegebruiktwordtdanvarieert de waarde van x1 en x2 (zie fig 3-14) • De waarde van y wordtberekenduit • Bresenhamwordtnietgebruiktomdat de eindpuntenmoeilijkteberekenenzijn
Scan-conversie: sector • Een sector wordtgeconverteerd door scan-conversievooreenbooguittevoeren en • Daarna de scan-conversievoor de 2 lijnenvanuithetcentrum • Stelsectorcentrum (h,k) • Eerst scan-conversie van eenboog van θ1 tot θ2 • Daarnaeenlijn van (h,k) tot (rcos(θ1)+h,rsin(θ1)+k ) • Daarnaeenlijn van (h,k) tot (rcos(θ2)+h,rsin(θ2)+k )
Scan-conversie: rechthoek • Eenrechthoekwaarvan de assenevenwijdigzijnaan de coordinaatassen is bepaaldalser 2 hoekpuntenbekendzijn (zie fig 3-16a) • De overgeblevenhoekpuntenkunnenwordenafgeleid (zie fig 3-16b)
Scan-conversie: rechthoek • Als de hoekpuntenbekendzijn, worden de coordinatendoorgegevenaan de lijnroutine en scan-conversie van de rechthoekvindtplaats • De volgendelijnenwordengetekend: • 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)
Opvullen van een gebied • Hetopvullen van eengebied is hetkleuren van eengedeelte van eengebied • Gebiedenkunnengedefinieerdworden op pixel of meetkundigniveau • Op pixel niveaubeschrijven we hetgebied in termen van de grens pixels (zie fig 3-17a) of de totale pixels die hetgebiedomvat (zie fig 3-17b) • Voor (a) wordt boundary-fill algoritmegebruikt • Voor (b) wordt flood-fill algoritmegebruikt
Opvullen van een gebied • Op meetkundigniveau is eengebiedgedefinieerd met lijnen en krommen (bijv. eenpolygoon)
Opvullen van een gebied • Boundary-fill • Dit is eenrecursiefalgoritmedatbegint met eenstartpixelbinnenhetgebied ( seed) • Hetalgoritmekijkt of dit pixel a) eengrenspixel is of b) dathet al gevuld is • Alshetantwoord nee is wordthet pixel gevuld en roeptzichzelfweeraan en eenbuurpixelwordtgebruiktalsnieuw seed • Alshetantwoordja is , wordtteruggekeerdnaarzijnoorspronkelijkeoproep
Opvullen van een gebied • Flood-fill • Ditalgoritmebegint met eenstartpixel (seed) binnenhetgebied. Hetkijkt of het pixel de orginelekleurheeft van hetgebied. • Alshetantwoordja is , wordthet pixel gevuld met eennieuwekleur en gebruikteenbuurpixelalsnieuw seed wordtopnieuwopgeroepen (recursief) • Alshetantwoord nee is , wordtteruggekeerdnaarzijnoorspronkelijkeoproep • Dezemethode is bruikbaaralsergeen uniform gekleurdegrens is
Scan-lijn algoritme • In plaats van op pixel niveaukanookeenpolygoonopgevuldworden (gebieden die meetkundiggedefinieerdzijn met coordinaten) • Dit is eensnelleremethodedan boundary fill • We hebbeneengebied met hoekpunten V1,V2, V3,.. , die verbondenzijn met lijnen E1,E2, E3, … , (zie fig 3-19) • We nemenaandatiederhoekpunt al eenconversieheeftondergaannaar integer coordinaten (xi,yi)
Scan-lijn algoritme • Hetalgoritmebegint met de eerstescanlijn van de polygoon en vervolgt tot de laatstescanlijn • Vooriederescanlijnberekendhethetsnijpunt met de polygoon • Bijv: scanlijn y snijdt de lijnen E1,E7,E6 en E4 in de puntena,b,c,d • De snijpuntenwordengesorteerdnaar de x-coordinaat en gegroepeerdalsparen, bijv (a,b) en (c,d) • Daarnawordteenlijngetekend van het 1e punt naarhet 2e punt van elk paar
Scan-lijn algoritme • Horizontalelijnenwordengenegeerd ,want die wordenautomatischgevuld met de juistekleurtijdens de scan conversie • Bijv: lijn E5 wordtgetekendals de scan lijngeconverteerdwordt
Scan-conversie: karakter • Karakters , zoals letters en cijferszijn de bouwblokken van tekst • Zewordengepresenteerd in verschillendestijlen en groottes. De ontwerpstijl van eenverzamelingkaraktersheetlettertype of font • Gewone fonts zijn Arial, Century, Courrier, enz • Zevarieren in verschijning: zwart, schuin, onderstreept, enz • Karaktergroottewordtgemeten in inches en pica’s (punten)
Scan-conversie: karakter • 2 basis benaderingen: • Raster of bitmap font. • Iederkarakter is eenverzameling pixels in eenbilevel raster patroon (bitmap) zie fig 3-20 • Dit is eenvoudig , iederkarakter is al geconverteerd en kanzoingevoegdworden op eenlocatie in de bitmap.
Scan-conversie: karakter • Erzijnaparte bitmaps nodigvoorzwart, schuin, enz. • Bovendienzijnschuine bitmaps overlappend in eenbeeld ( zie fig 3-21) • Verder is de grootte van een bitmap afhankelijk van de resolutie.