Algorithms for Rasterizing Graphical Primitives: Line and Circle, Essays (university) of Computer Graphics

The outline of lectures on algorithms for rasterizing graphical primitives, specifically lines and circles. It covers topics such as representing primitives as matrices, drawing lines using different algorithms, and the midpoint algorithm for circle drawing. The document also includes sample code in pascal.

Typology: Essays (university)

2016/2017

Uploaded on 06/11/2017

alpha_netjerikhet
alpha_netjerikhet 🇭🇺

2 documents

1 / 7

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
1
o
lgozás és Számítógépes Grafika Tanszék
K
épfeld
o
2. ELŐADÁS
Algoritmusok grafikai primitívek raszteres megjelenítésére
62
o
lgozás és Számítógépes Grafika Tanszék
Algoritmusok raszteres
grafikához
Feladat
grafikai primitíveket (pl. vonalat, síkidomot)
ábrázolni kép-mátrixszal, meghatározni azokat a
képpontokat, amelyek a primitív pontjai, vagy
közel vannak a primitívhez
K
épfeld
o
közel
vannak
a
primitívhez
Modell
képpont (= körlap), amely a
négyzetháló csúcspontjaiban
helyezhető el
a koordináták egész számok
63
o
lgozás és Számítógépes Grafika Tanszék
Egyenes rajzolása
Tegyük fel, hogy
"vékony" egyenes:
y= mx+b
A meredeksége:
0 < m< 1
K
épfeld
o
•(m= 0,1,... triviális
speciális esetek)
más esetekben
visszavezetjük az
0 < m < 1 esetre
Legyen:
x0< x1, y0< y1
64
o
lgozás és Számítógépes Grafika Tanszék
Alap inkrementális algoritmus
Haladjunk Δx= 1 növekménnyel balról jobbra,
válasszuk a legközelebbi képpontot:
(xi, [yi+0.5]) = (xi, [mxi+b+0.5])
K
épfeld
o
A szorzás kiküszöbölhető inkrementálással:
yi+1=mxi+1+b=m(xi+Δx)+b=yi+m·Δx=yi+m
65
o
lgozás és Számítógépes Grafika Tanszék
Program
(ha |m|>1, akkor x-et cseréljük y-nal)
procedure Line(x0,y0, x1,y1, value: integer);
var x : integer;
dy,dx,y,m : real;
begin
K
épfeld
o
dy := y1-y0; dx := x1-x0;
m := dy/dx; y := y0;
for x := x0 to x1 do
begin
WritePixel(x, Round(y), value);
y := y+m
end
end; {Line}
66
o
lgozás és Számítógépes Grafika Tanszék
Felezőpont algoritmus
egyenesre
Egész aritmetika
elegendő (Bresenham)
Elv: Azt a képpontot
válasszuk NE és E
közül, amelyik
közelebb van a Q
K
épfeld
o
metszésponthoz
Másképp: az döntsön a
választásban, hogy Q
az M felezőpont melyik
oldalán van
Tegyük fel, hogy:
x0< x1, y0< y1
67
pf3
pf4
pf5

Partial preview of the text

Download Algorithms for Rasterizing Graphical Primitives: Line and Circle and more Essays (university) Computer Graphics in PDF only on Docsity!

olgozás és Számítógépes Grafika Tanszék

K

épfeldo

2. ELŐADÁS

Algoritmusok grafikai primitívek raszteres megjelenítésére

62

olgozás és Számítógépes Grafika Tanszék

Algoritmusok raszteres

grafikához

  • Feladat
    • grafikai primitíveket (pl. vonalat, síkidomot)

ábrázolni kép-mátrixszal, meghatározni azokat a

képpontokat, amelyek a primitív pontjai, vagy

közel vannak a primitívhez

K

épfeldo

közel vannak a primitívhez

  • Modell
    • képpont (= körlap), amely a

négyzetháló csúcspontjaiban

helyezhető el

  • a koordináták egész számok

63

olgozás és Számítógépes Grafika Tanszék

Egyenes rajzolása

  • Tegyük fel, hogy

"vékony" egyenes:

y = mx + b

  • A meredeksége:

0 < m < 1

K

épfeldo

  • ( m = 0,1,... triviális

speciális esetek)

  • más esetekben

visszavezetjük az

0 < m < 1 esetre

  • Legyen:

x 0 < x 1 , y 0 < y 1

64

olgozás és Számítógépes Grafika Tanszék

Alap inkrementális algoritmus

  • Haladjunk Δ x = 1 növekménnyel balról jobbra,

válasszuk a legközelebbi képpontot:

( x i , [ y i +0.5]) = ( x i , [ mx i + b +0.5])

K

épfeldo

  • A szorzás kiküszöbölhető inkrementálással:

y i +1 = mx i +1 + b = m ( x i +Δ x )+ b = y i + m ·Δ x = y i + m

65

olgozás és Számítógépes Grafika Tanszék

Program

(ha |m|>1, akkor x-et cseréljük y-nal)

procedure Line(x0,y0, x1,y1, value: integer); var x : integer; dy,dx,y,m : real; begin

K

épfeldo

dy := y1-y0; dx := x1-x0; m := dy/dx; y := y0; for x := x0 to x1 do begin WritePixel(x, Round(y), value); y := y+m end end; {Line}

66

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus

egyenesre

  • Egész aritmetika

elegendő (Bresenham)

  • Elv: Azt a képpontot

válasszuk NE és E

közül, amelyik

közelebb van a Q

K

épfeldo

metszésponthoz

  • Másképp: az döntsön a

választásban, hogy Q

az M felezőpont melyik

oldalán van

  • Tegyük fel, hogy:

x 0 < x 1 , y 0 < y 1

67

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus

egyenesre

  • Az ( x 0 , y 0 ) és ( x 1 , y 1 ) ponton átmenő egyenes egyenlete: ( xx 0 ) / ( yy 0 ) = ( x 1 – x 0 ) / ( y 1 – y 0 )
  • Legyen dx = x 1 – x 0 ( > 0), dy = y 1 – y 0 ( > 0),
  • akkor:

K

épfeldo

(^) • akkor:

x dyy dx + y 0 dxx 0 dy = 0

  • Legyen: F ( x , y ) = x dyy dx + y 0 dxx 0 dy

0, ha az egyenes ( x , y ) fölött fut, F ( x , y ) = 0, ha ( x , y ) az egyenesen van, < 0, ha az egyenes ( x , y ) alatt fut.

{

68

olgozás és Számítógépes Grafika Tanszék

Felezőpont kritérium

az egyenes választás:

> 0, M fölött, NE

d = F ( M ) = F ( x p+1,y p+½ ) = 0, M -en át, NE vagy E

( d : döntési változó) < 0, M alatt E

fut

A következő pontnál:

{

K

épfeldo

A következő pontnál:

ha E -t választottuk, akkor

Δ E = dúj – drégi = F ( x (^) p+2,y (^) p+½ ) – F ( x (^) p+1,y (^) p+½ ) = dy,

ha NE -t választottuk, akkor

Δ NE = F ( x (^) p+2,y (^) p+3/2 ) – F ( x (^) p+1,y (^) p+½ ) = dy – dx

69

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus

egyenesre

  • Kezdés:

d start = F ( x 0 +1, y 0 +½) = F ( x 0 , y 0 )+ dy – dx /

= dy – dx /

K

épfeldo

  • Azért, hogy egész aritmetikával számolhassunk, használjuk inkább az alábbi függvényt

F ( x , y ) = 2·( x · dy – y · dx + y 0 · dx – x 0 · dy )

70

olgozás és Számítógépes Grafika Tanszék

Program

procedure MidpointLine (x0,y0,x1,y1,value: integer); var dx,dy,incrE,incrNE,d,x,y : integer; begin dx := x1-x0; dy := y1-y0; d := 2dy-dx; incrE := 2dy; incrNE := 2(dy-dx); x := x0; y := y0; WritePixel(x,y,value); while x < x1 do begin*

K

épfeldo

if d <= 0 then begin x := x + 1; d := d + incrE; end else begin x := x + 1; y := y + 1; d := d + incrNE; end; WritePixel(x,y,value) end {while} end; {MidpointLine}

71

olgozás és Számítógépes Grafika Tanszék

Tulajdonságok

  • csak összeadás és kivonás
  • általánosítható körre, ellipszisre

K

épfeldo

72

olgozás és Számítógépes Grafika Tanszék

  1. probléma
  • Különböző pontsorozat lesz az eredmény ha balról jobbra, vagy ha jobbról balra haladunk.
  • Legyen a választás:

K

épfeldo^ • balról jobbra: d = 0^ →^ E-t választani

  • jobbról balra: d = 0 → SW-t választani
  • Megjegyzés:
  • Nem mindig lehet csak balról jobbra haladva

rajzolni az egyeneseket.

Pl. szaggatott vonallal rajzolt zárt poligon

73

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus körre

  • A következő pontnál:
    • ha E-t választottuk, akkor

ΔE = d (^) új – d (^) régi = F(x +2 y ½) F(x +1 y ½) =

K

épfeldo

F(xp +2,yp –½) – F(xp +1,yp –½) =

= 2xp +

  • ha SE-t választottuk, akkor

ΔSE = F(x (^) p +2,yp –3/2) – F(x (^) p +1,yp –½) =

= 2xp –2yp +

80

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus körre

  • Az iterációs lépések:
    • a döntési változó előjele alapján kiválasztjuk

a következő képpontot

d = d + ΔSE vagy d + ΔE

(a választástól függően)

K

épfeldo

(^ gg^ )

  • Figyeljük meg: d értéke egész számmal változik!
  • Kezdés:

kezdőpont: (0, R)

felezőpont: (1, R – 1/2)

d = F(1, R – 1/2) = 5/4 – R

81

olgozás és Számítógépes Grafika Tanszék

Program

procedure MidpointCircle (radius, value : integer); var x, y : integer; d: real; begin x := 0; y := radius; d := 5/4-radius; CirclePoints (x,y,value); while y>x do begin if d<0 then begin x := x+1;

K

épfeldo

d := d+2x+3; end else begin x := x+1; y := y-1; d := d+2(x-y)+5; end; CirclePoints (x,y,value) end {while} end; {MidpointCircle}**

82

olgozás és Számítógépes Grafika Tanszék

Felezőpont algoritmus körre

  • Nem egész aritmetika, ezért legyen h új

döntési változó:

h = d – ¼

h+¼ = d < 0

  • Ekkor kezdéskor

K

épfeldo

Ekkor kezdéskor

h = 1 – R

  • Kezdetben és a későbbiek során is h egész

szám!

  • Igaz, hogy d < 0 helyett h < ¼ -et kellene

vizsgálni, de ez h egész volta miatt ekvivalens

h < 0 -val, tehát egész aritmetika használható.

83

olgozás és Számítógépes Grafika Tanszék

Program

procedure MidpointCircle (radius, value : integer); var x,y,d : integer; begin x := 0; y := radius; h := 1-radius; CirclePoints (x,y,value); while y>x do begin if h<0 then begin x := x+1;

K

épfeldo

h := h+2x+3; end else begin x := x+1; y := y-1; h := h+2(x-y)+5; end; CirclePoints (x,y,value) end {while} end; {MidpointCircle}**

84

olgozás és Számítógépes Grafika Tanszék

Másodrendű differenciák

  • Stratégia:
    • egy függvény értéke becsülhető két

pontban felvett értékei különbségét

használva (ami polinomok esetében

K

épfeldo

( p

alacsonyabb fokszámú lesz)

  • használjunk első- és másodrendű

parciális differenciákat

85

olgozás és Számítógépes Grafika Tanszék

Kör rajzolása

  • tudjuk, hogy

ΔE (xp ,yp ) = 2·xp + ΔSE (xp ,yp ) = 2·xp -2·yp +5,

K

épfeldo

  • ha E-t választottuk (xp ,yp ) → (xp +1,yp ),

ΔE új - ΔE régi = 2, ΔSE új - ΔSE régi = 2

  • ha SE-t választottuk (xp ,yp ) → (xp +1,yp -1)

ΔE új - ΔE régi = 2, ΔSE új - ΔSE régi = 4

86

olgozás és Számítógépes Grafika Tanszék

Kör rajzolása

  • tehát az iterációs lépések:
    • d előjele alapján a következő képpont

kiválasztása

  • d = d+Δ (a választástól függően ΔE vagy

K

épfeldo

d = d+Δ (a választástól függően ΔE vagy

ΔSE)

  • ΔE és ΔSE módosítása (a választástól

függően)

87

olgozás és Számítógépes Grafika Tanszék

Program

procedure MidpointCircle (radius,value : integer); var x,y,d,deltaE,deltaSE : integer; begin x := 0; y := radius; d := 1-radius; deltaE := 3; deltaSE := -2radius+5; CirclePoints(x,y,value); while y>x do begin if d<0 then begin d := d+deltaE;*

K

épfeldo

(^) deltaE:=deltaE+2; deltaSE:=deltaSE+2; x := x+ end else begin d := d+deltaSE; deltaE:=deltaE+2; deltaSE:=deltaSE+4; x := x+1; y := y- end; CirclePoints(x,y,value) end {while} end; {MidpointCircle}

88

olgozás és Számítógépes Grafika Tanszék

Ellipszis rajzolása

  • F(x,y) =

b²x² + a²y² – a²b²

  • a,b egész
  • Szimmetria miatt:

K

épfeldo

Szimmetria miatt:

elég az első

síknegyedben

megrajzolni

89

olgozás és Számítógépes Grafika Tanszék

Ellipszis rajzolása

  • Da Silva algoritmusa (felezőpont módszer)
  • Bontsuk a negyedet két tartományra

A 1 t t á b

K

épfeldo

  • Az 1. tartományban:

a² (yp – ½) > b² (xp+1)

90

olgozás és Számítógépes Grafika Tanszék

Da Silva algoritmusa

Az 1. tartományban:

≥ 0 SE -t választjuk

d 1 = F ( x p +1,y p – ½ )

{ < 0 E -t választjuk

K{

épfeldo

d régi – d új = F ( xp +1,y p – ½ ) – F ( xp +2,y p – 3/2 )

d régi – d új = F ( x p +1,y p – ½ ) – F ( x p +2,y p – ½ )

Δ SE = b² ( 2x p +3 ) + a² ( – 2y p +2 )

Δ E = b² ( 2x p +3 )

{

{

91

olgozás és Számítógépes Grafika Tanszék

Vonal „szaggatás”

  • glEnable(GL_LINE_STIPPLE)
  • glDisable (GL_LINE_STIPPLE)
  • void glLineStipple(GLint factor, GLushort pattern)

K

épfeldo

  • pattern
    • 16 bit-es érték
    • 0-s bit a legkisebb helyiértékű
  • factor
    • a minta szélességét adja meg
    • pl. 5 esetén mindegyik bit a mintában 5 pixel-t jelent

98