background image

-DFHN /HELHG(
32/,7(&+1,.$ *'$6.$

:\G]LDá (OHNWURQLNL 7HOHNRPXQLNDFML L ,QIRUPDW\NL

Katedra Technik Programowania

p. 420 WETI          tel. (347-)20-96

GRAFIKA  KOMPUTEROWA

L

ITERATURA

:

1. R. A. Earnshaw (ed.): Fundamental Algorithms for Computer

Graphics. Springer, Berlin 1985.

2. J. D. Foley, A. van Dam, S. K. Feiner, J. F. Hughes, R. L. Phillips:

Wprowadzenie do grafiki komputerowej. WNT, Warszawa 1995.

3. J. D. Foley, A. van Dam, S. K. Feiner, J. F. Hughes: Computer Graphics:

Principles and Practice, Second Edition. Addison-Wesley, Reading 1990.

4. G. Hégron: Synthèse d’image: algorithmes élémentaires. Dunod

informatique, Paris 1985.

5. M. Jankowski: Elementy grafiki komputerowej. WNT, Warszawa 1990.
6. T. Pavlidis: Grafika i przetwarzanie obrazów. WNT, Warszawa 1987.
7. J. Zabrodzki (red.): Grafika komputerowa, metody i narz

dzia. WNT,

Warszawa 1994.

Gda

sk  2000

2

GRAFIKA, PRZETWARZANIE I ROZPOZNAWANIE OBRAZÓW

Obraz

Opis

Przetwarzanie obrazów

Rozpoznawanie obrazów

Grafika

Rys.

6FKHPDW LOXVWUXMF\

Z]DMHPQH ]DOH*QRFL

PL G]\ JUDILN
przetwarzaniem
obrazów i
rozpoznawaniem
obrazów.

GRAFIKA KOMPUTEROWA

.RPXQLNDFMD ] F]áRZLHNLHP

Obrazowanie schematów

3UH]HQWRZDQLH ]HVWDZLH

0RGHORZDQLH NV]WDáWyZ

.UHOHQLH U\VXQNyZ WHFKQLF]Q\FK

6NáDGDQLH SXEOLNDFML

S

SRU]G]DQLH PDS  NDUWRJUDILD

Synteza obrazów realistycznych

Wizualizacja modelowanych zjawisk

Animacja

Plastyka

PRZETWARZANIE OBRAZÓW

Dyskretyzacja obrazów

Polepszanie jako

FL REUD]yZ

Urealnianie obrazów

Rekonstrukcja obrazów

Kompresja obrazów

:\RGU EQLDQLH RELHNWyZ

8SUDV]F]DQLH NV]WDáWyZ

ROZPOZNAWANIE OBRAZÓW

Opis obiektów

Klasyfikacja obiektów

Porównywanie obrazów

Analiza struktury

background image

3

B

ARWA  

(

KOLOR

)

ZLDWáR  SURPLHQLRZDQLH HOHNWURPDJQHW\F]QH R GáXJRFL IDOL λ∈(380,780) nm.

Dwa rodzaje receptorów w ludzkim oku:

SU FLNL  UHDJXM MX* SU]\ QLVNLP SR]LRPLH RZLHWOHQLD EUDN ZUD*H
barwnych - widzenie skotopowe (nocne);

czopki

 UHDJXM GRSLHUR SU]\ Z\*V]\P SR]LRPLH RZLHWOHQLD ZUD*HQLH

barwy - widzenie fotopowe (dzienne).

Teoria Younga - Helmholtza

Z\MDQLDMFD PHFKDQL]P SRZVWDZDQLD

ZUD*HQLD EDUZ\ =DNáDGD RQD Z\VW SRZDQLH Z F]RSNDFK WU]HFK VXEVWDQFML

ZLDWáRF]Xá\FK F]Xá\FK RGSRZLHGQLR QD EDUZ\

QLHELHVN  F]XáRü β(λ),

]LHORQ  F]XáRü γ(λ),

SRPDUDF]RZRF]HUZRQ  F]XáRü ρ(λ).

3RVWU]HJDQD EDUZD Z\QLND ]H VWRVXQNX SREXG]H W\FK SRV]F]HJyOQ\FK

VXEVWDQFML 6XPD SREXG]H GHWHUPLQXMH RGELHUDQ MDVQRü

Zjawisko metameryzmu

 SURPLHQLRZDQLH R Uy*Q\P VNáDG]LH ZLGPRZ\P

PR*H GDZDü LGHQW\F]QH ZUD*HQLH EDUZ\  LGHQW\F]Q\ VWRVXQHN SREXG]H

WU]HFK VXEVWDQFML ZLDWáRF]Xá\FK Z F]RSNDFK 

Modele syntezy barw:

model RGB  ang. red + green + blue - czerwony + zielony + niebieski,
synteza addytywna, stosowany w monitorach kolorowych;

modele CMY i CMYK  ang. cyan + magenta + yellow (+ black) -

]LHORQRQLHELHVNL  NDUPD]\QRZ\  *yáW\   F]DUQ\ 
synteza subtraktywna, stosowane w poligrafii;

modele YUVYIQ i YC

b

C

r

  - luminancja + dwie chrominancje,

VWRVRZDQH Z WHOHZL]ML NRORURZHM  ]JRGQH ] WHOHZL]M F]DUQRELDá 

modele HSV i HLS  ang. hue + saturation + value (lightness) -

RGFLH QDV\FHQLH ZDUWRü  MDVQRü  RGFLH  DQJ hue  Z\UD*DQ\ NWHP

hue:

red

yellow

green

cyan

blue

magenta

NW

60°

120°

180°

240°

300°

VWRVRZDQH Z GLDORJX ] F]áRZLHNLHP ]JRGQH ] OXG]N LQWXLFM

model CIE XYZ  (franc. Commission Internationale de l'Eclairage),

PRGHO WHRUHW\F]Q\  DEVWUDNF\MQ\ XNáDG EDUZ RGQLHVLHQLD ; < =

modele CIE LUV i CIE LAB  - inne modele teoretyczne CIE;

model TekHVC  - model teoretyczny opracowany w firmie Tektronix,

RGOHJáRFL JHRPHWU\F]QH SURSRUFMRQDOQH GR Uy*QLF ZUD*H EDUZQ\FK

4

S

POSOBY PREZENTACJI OBRAZÓW W GRAFICE KOMPUTEROWEJ

:

GRAFIKA RASTROWA

3áDV]F]\]QD REUD]X MHVW SRG]LHORQD QD SURVWRNWQH HOHPHQW\ W]Z SLNVHOH
Tworzenie obrazu polega na wyznaczeniu kolorów poszczególnych pikseli
i naniesieniu tych kolorów w odpowiednich miejscach poleceniem write(c).

SU]\NáDG\ XU]G]H GUXNDUND LJáRZD VNDQHU

Sposoby reprezentacji obrazów:

tablice (mapy bitowe)

type Image = array [0..mx,0..my] of Color

drzewa czwórkowe

drzewa binarne

Kompresja:

metody bez utraty informacji:

PHWRG\ NRGyZ ]PLHQQHM GáXJRFL  +XIIPDQ

metody arytmetyczne

PHWRG\ VáRZQLNRZH  /HPSHO=LY:HOFK /=:

bezstratne metody kompresji danych graficznych,

QS NRGRZDQLH GáXJRFL VHNZHQFML  DQJ run length encoding RLE)

PHWRG\ ] XWUDW LQIRUPDFML

PHWRG\ EH]SRUHGQLH Z G]LHG]LQLH REUD]X PLQ PHWRG\ IDONRZH

metody transformat, np. JPEG (ang. Joint Photographic Experts Group)

metody fraktalne

Formy danych obrazowych:

obrazy kolorowe

type Color = record red, green, blue: integer end

obrazy szare (wielopoziomowe)

type Color = integer

REUD]\ F]DUQRELDáH  GZXSR]LRPRZH

type Color = Boolean

GRAFIKA WEKTOROWA

2EUD] VNáDGD VL  ] WDNLFK RELHNWyZ MDN RGFLQHN OXE SXQNW
Tworzenie obrazu polega na narysowaniu poszczególnych obiektów

VNáDGRZ\FK SROHFHQLDPL plot(x,y,c)vector(x

1

,y

1

,x

2

,y

2

,c).

SU]\NáDG\ XU]G]H SORWHU WDEOHW

Sposoby reprezentacji obrazów:

zbiór linii

type Image = list of Line

Formy danych obrazowych:

REUD]\ VNáDGDMFH VL  ] OLQLL FLJá\FK

type Line = record x,y:integer; c:Color; chain: list of 0..7 end

REUD]\ VNáDGDMFH VL  ] RGFLQNyZ

type Line = list of record x,y:integer; c:Color end

background image

5

Metody kompresji danych graficznych

.RGRZDQLH GáXJRFL VHNZHQFML (ang. run length encoding RLE)
: REUD]LH  ]OLQHDU\]RZDQ\P  Z\VW SXM F] VWR FLJL SLNVHOL R WDNLP VDP\P

NRORU]H &LJL WDNLH PR*QD NRGRZDü MDNR SDU\ OLF]ED SLNVHOL L LFK NRORU

Metody transformat

3RG]LDá REUD]X QD EORNL Um×m o rozmiarze m×m (dla JPEG: m=8).

Wykonanie zadanej transformacji T na poszczególnych blokach Um×m:
Vm×m=TUm×m (dla JPEG: DCT).

Dokonanie kwantyzacji K wyników transformacji Vm×m:
Wm×m=KVm×m (dla JPEG: wi,= [vi,j / qi,j ], gdzie wi,jvi,j, qi,V
elementami macierzy Wm×mVm×m i Qm×m, przy czym Qm×m jest

]DGDQ PDFLHU] NZDQW\]DFML 

Linearyzacja skwantowanych wyników transformacji Wm×m (dla JPEG:
metoda ZIGZAG).

.RPSUHVMD HIHNWyZ OLQHDU\]DFML MDN PHWRG EH] XWUDW\ LQIRUPDFML  GOD
JPEG: metoda Huffmana).

Rys. Kompr

HVMD PHWRG WUDQVIRUPDW

Dekompresja skwantowanych wyników transformacji Wm×X*\W GR

NRPSUHVML PHWRG EH] XWUDW\ LQIRUPDFML  GOD -3(* PHWRGD +XIIPDQD 

2GWZRU]HQLH SU]\EOL*RQ\FK Z\QLków transformacji Vm×m na podstawie
skwantowanych wyników transformacji Wm×m (dla JPEG:
vi,wi,j · qi,j, gdzie vi,jwi,j, qi,V HOHPHQWDPL PDFLHU]\ Vm×m,
Wm×m i Qm×m, przy czym Qm×MHVW ]DVWRVRZDQ SRGF]DV NRPSUHVML

PDFLHU] NZDQW\]DFML 

Wykonanie zadanej transformacji odwrotnej T-1 na poszczególnych

SU]\EOL*RQ\FK Z\QLNDFK WUDQVIRUPDFML Vm×mUm×m=T-1Vm×m (dla
JPEG: odwrotna DCT).

5\V 'HNRPSUHVMD PHWRG WUDQVIRUPDW

16

11

10

16

24

40

51

61

17

18

24

47

66

99

99

99

12

12

14

19

26

58

60

55

18

21

26

66

99

99

99

99

14

13

16

24

40

57

69

56

24

26

56

99

99

99

99

99

14

17

22

29

51

87

80

62

47

69

99

99

99

99

99

99

18

22

37

56

68

109 103

77

99

99

99

99

99

99

99

99

24

35

55

64

81

104 113

92

99

99

99

99

99

99

99

99

49

64

78

87

103 121 120 101

99

99

99

99

99

99

99

99

72

92

95

98

112 100 103

99

99

99

99

99

99

99

99

99

Rys.  Macierze kwantyzacji Q

8×8

 dla luminancji i dla chrominancji.

Rys. Linearyzacja metod

 =,*=$*  GOD m=8).

6

Metody falkowe

 

:\NRU]\VW\ZDQH WX V GZD ILOWU\ MHGQRZ\PLDURZH ILOWU GROQRprzepustowy L
i lustrzany do niego filtr górnoprzepustowy H.

 

7ZRU]RQ\ MHVW FLJ REUD]yZ Î

1

+

Î

1

Î

1

|

Î

2

+

Î

2

Î

2

|

, ..., Î

n

+

Î

n

Î

n

|

I

n

.

 

Kompresja polega tu na skwantowaniu kolorów pikseli obrazów

XWZRU]RQHJR FLJX L ]DNRGRZDQLX LFK PHWRG EH] XWUDW\ LQIRUPDFML

 

 

Metody fraktalne

Fraktalem

QD]\ZDP\ SRG]ELyU SáDV]F]\]Q\  OXE LQQHM SU]HVWU]HQL

PHWU\F]QHM  NWyUHJR IUDJPHQW\ V SRGREQH Z MDNLP VHQVLH GR FDáRFL

0DWHPDW\F]QLH SRGRELHVWZR WR RSLVXMH VL  Z IRUPLH SU]HNV]WDáFHQLD

RGZ]RURZXMFHJR FDá\ IUDNWDO QD MHJR F] ü =HVSyá WDNLFK SU]HNV]WDáFH

RGSRZLDGDMF\FK SRGRELHVWZX SRV]F]HJyOQ\FK F] FL GR FDáRFL RNUHOD

VL  PLDQHP LWHUDF\MQHJR XNáDGX IXQNFML  DQJ iterated function system).

= ND*G\P IUDNWDOHP PR*QD ]DWHP VNRMDU]\ü LWHUDF\MQ\ XNáDG IXQNFML

PHWRG\ NROD*X  ,)6  DQJ iterated function system)

 NRGRZDQLH SRGRELHVWZ JHRPHWU\F]Q\FK  NV]WDáWyZ 

PHWRG\ SDF]áRUNX  3,)6  DQJ partitioned iterated function system)

 NRGRZDQLH SRGRELHVWZ Z G]LHG]LQLH NRORUyZ

a)

b)

x' = 0.85· x + 0.04· y + 0
y' = – 0.04· x + 0.85· y + 1.6

x' = 0.2· x – 0.26· y + 0
y' = 0.23· x + 0.22· y + 1.6

x' = – 0.15· x + 0.28· y + 0
y' = 0.26· x + 0.24· y + 0.44

x' = 0· x + 0· y + 0
y' = 0· x + 0.16· y + 0

5\V )UDNWDOQ\ OLü SDSURFL  D  L MHJR LWHUDF\MQ\ XNáDG IXQNFML  E 

I

i

I

i+1

Î

i+1

+

Î

i+1

|

Î

i+1

H

L

2:1

2:1

H

L

H

L

2:1

2:1

2:1

2:1

wiersze

kolumny

background image

7

Dyskretyzacja obrazów rzeczywistych

Próbkowanie - wybór dyskretnej siatki (rastra) do przedstawienia obrazu.

=DOH*QRü HIHNWyZ SUyENRZDQLD RG SRáR*HQLD VLDWNL SUyENRZDQLD

=PLDQD NV]WDáWX REV]DUX SR SUyENRZDQLX

:DUXQHN ]JRGQRFL ]H VWDá α GOD REV]DUX  SRG]ELRUX SáDV]F]\]Q\  Ω      

i kwadratowej siatki próbkowania (rastra) o boku h:

(

)

(

)

(

)

(

)

∃ >

∀ ∈

⊂ ′

r

h

r

r

r

r

α

    

    

     

k

    

k

P

Q

P

Q

Q

P

Q

1

1

Fr

k

,

Fr

,

&

k

,

Fr

,

2

2

,

gdzie

Fr

 - brzeg obszaru 

Ω,

Fr

Ω Ω Ω

= ∩ ′

 ,

 GRPNQL FLH REV]DUX Ω,

Ω Ω

= ∪ Fr

,

 GRSHáQLHQLH REV]DUX Ω,

{

}

′ =

P

,

(

)

k

,

r

 NRáR R URGNX Z SXQNFLH Q i o promieniu r.

Stwierdzenie 1:

-HOL REV]DU Ω i kwadratowa siatka próbkowania (raster) o boku h

VSHáQLDM ZDUXQHN ]JRGQRFL ]H VWDá

α = 2

2

, wówczas próbkowanie

]DFKRZD WRSRORJL   NV]WDáW  REV]DUX

Stwierdzenie 2:

-HOL REV]DU Ω i kwadratowa siatka próbkowania (raster) o boku h

VSHáQLDM ZDUXQHN ]JRGQRFL ]H VWDá

α = 10

2

, wówczas próbkowanie

]DFKRZD WRSRORJL   NV]WDáW  ZQ WU]D REV]DUX D NRQWXU E G]LH VL  VNáDGDü
] NU]\Z\FK ]DPNQL W\FK

Kwantowanie - odwzorowanie kolorów w zbiór dyskretny.

Z\PDJDQD MDNRü

dobra

UHGQLD

OLF]ED SR]LRPyZ MDVQRFL

256

64

obrazy szare

8 b/piksel

6 b/piksel

obrazy kolorowe

24 b/piksel

18 b/piksel

: Z\QLNX NZDQWRZDQLD REUD]X PRJ SRMDZLü VL  QLHSR*GDQH NUDZ G]LH

:SURZDG]HQLH QLHZLHONLHJR ORVRZHJR ]DEXU]HQLD ZDUWRFL SR]LRPyZ

MDVQRFL  W]Z GU*HQLH, ang. dither  XVXZD  UR]P\ZD  WH NUDZ G]LH

8

G

EOMETRIA  

D

YSKRETNA

QVVLDG

piksela

P

EVVLDG

piksela

P

QVVLDG

piksela

P

EVVLDG

piksela

P

piksel P

EVVLDG

piksela

P

5\V 6VLHG]L SLNVHOD P.

QVVLDG

piksela

P

EVVLDG

piksela

P

QVVLDG

piksela

P

'HILQLFMH VVLHG]WZD

%H]SRUHGQLPL VVLDGDPL  EVVLDGDPL  QD]\ZDP\ GZD SLNVHOH PDMFH
wspólny bok.

1LHEH]SRUHGQLPL VVLDGDPL  QVVLDGDPL  V GZD SLNVHOH VW\NDMFH VL

]H VRE W\ONR QDUR*QLNDPL

6VLDGDPL ]ZLHP\ ]DUyZQR EVVLDGyZ MDN L QVVLDGyZ

Definicje linii:

%GURJ MHVW FLJ SLNVHOL P1, P2, ..., Pn WDNL *H ∀k∈{1, 2, .., n-1} piksele
Pk i Pk+1 V EVVLDGDPL

'URJ  QGURJ  MHVW FLJ SLNVHOL P1, P2, ..., Pn WDNL *H ∀k∈{1, 2, .., n-1}
piksele Pk i Pk+1 V VVLDGDPL

'URJ SURVW MHVW GURJD Z NWyUHM ZV]\VWNLH SLNVHOH FLJX VWDQRZLFHJR GURJ

V Uy*QH L *DGHQ ] QLFK QLH PD ZL FHM QL* GZyFK EVVLDGyZ Z W\P FLJX

'URJ ]DPNQL W MHVW GURJD Z NWyUHM SLHUZV]\ SLNVHO FLJX VWDQRZLFHJR

GURJ  MHVW VVLDGHP RVWDWQLHJR SLNVHOD WHJR FLJX

.U]\Z G\VNUHWQ QD]\ZDP\ ND*G\ VSyMQ\ ]ELyU SLNVHOL

QLH ]DZLHUDMF\ F]ZyUHN SLNVHOL WZRU]F\FK NZDGUDW R ERNX 

Definicje konturu:

B-konturem danego zbioru pikseli nazywamy zbiór wszystkich pikseli

QDOH*F\FK GR WHJR ]ELRUX L PDMF\FK SU]\QDMPQLHM MHGQHJR VVLDGD QLH

QDOH*FHJR GR WHJR ]ELRUX

Konturem (n-konturem) danego zbioru pikseli nazywamy zbiór

ZV]\VWNLFK SLNVHOL QDOH*F\FK GR WHJR ]ELRUX L PDMF\FK SU]\QDMPQLHM

MHGQHJR EVVLDGD QLH QDOH*FHJR GR WHJR ]ELRUX

'HILQLFMH VSyMQRFL

Zbiór pikseli jest spójny (n-spójny)

 MHOL GOD ND*GHM SDU\ SLNVHOL WHJR ]ELRUX

LVWQLHMH GURJD áF]FD WH SLNVHOH L ]DZLHUDMFD VL  Z W\P ]ELRU]H

Zbiór pikseli jest b-spójny

 MHOL GOD ND*GHM SDU\ SLNVHOL WHJR ]ELRUX LVWQLHMH

EGURJD áF]FD WH SLNVHOH L ]DZLHUDMFD VL  Z W\P ]ELRU]H

background image

9

Krzywe dyskretne

.U]\Z G\VNUHWQ QD]\ZDP\ ND*G\ VSyMQ\ ]ELyU SLNVHOL

QLH ]DZLHUDMF\ F]ZyUHN SLNVHOL WZRU]F\FK NZDGUDW R ERNX 

,QQH VSRW\NDQH Z OLWHUDWXU]H RNUHOHQLD NU]\ZHM G\VNUHtnej:

]ELyU E GF\ MHGQRF]HQLH VZRLP NRQWXUHP

]ELyU E GF\ GURJ SURVW

]ELyU Z NWyU\P LVWQLHMH W\ONR MHGQD GURJD PL G]\ GRZROQ SDU SLNVHOL

a)

d)

b)

×

c)

×

Rys.

 

3U]\NáDG\ UR]ELH*QRFL SU]\M WHM WX GHILQLFML NU]\ZHM ] LQQ\PL RNUHOHQLDPL

a)

]ELyU E GF\ VZRLP NRQWXUHP D QLH E GF\ NU]\Z

b)

]ELyU E GF\ GURJ SURVW  MHGQRF]HQLH VZRLP NRQWXUHP  D QLH E GF\ NU]\Z

c) krzywa, w której dla dwóch dowolnych pikse

OL OH*F\FK SR Uy*Q\FK VWURQDFK

]DáDPDQLD LVWQLHM GZLH GURJL  MHGQD ] SLNVHOHP QDUR*Q\P ×, druga bez);

d)

NU]\ZD QLH E GFD VZRLP NRQWXUHP  FHQWUDOQ\ SLNVHO ×  DQL GURJ SURVW Z

NWyUHM GOD GRZROQ\FK GZyFK SLNVHOL LVWQLHM SU]\QDMPQLHM GZLH GURJL áF]ce je.

Metody rysowania krzywych dyskretnych:

numeryczne

podstawowe, parametryczne.

 

Z\QLNDM EH]SRUHGQLR ]H Z]RUyZ DQDOLW\F]QHJR y

 

=

 

f(x) lub paramet-

rycznych x

 

=

 

x(t), y

 

=

 

y(t) wykorzystywanych w geometrii euklidesowej,

 

QDMF] FLHM Z\PDJDM REOLF]H ]PLHQQRSU]HFLQNRZ\FK

 

VWRVRZDQH ]ZáDV]F]D GOD ÄZ\UDILQRZDQ\FK´ NU]\Z\FK  QS %p]LHUD 

warunkowe

%UHVHQKDPD SXQNWX URGkowego (ang. midpoint), porównawcze Jordana.

 

Z\QLNDM EH]SRUHGQLR ] UyZQDQLD XZLNáDQHJR F(xy)

 

=

 

0

stosowanego do opisu krzywej w geometrii euklidesowej,

 

GOD V]HURNLHM NODV\ NU]\Z\FK Z\VWDUF]DM REOLF]HQLD FDáNRZLWROLF]ERZH

 

Z\NRU]\VW\ZDQH SRZV]HFKQLH GOD RGFLQNyZ L NU]\Z\FK VWR*NRZ\FK

strukturalne

áDFXFKRZH ]H ]PLHQQ GáXJRFL VHULL  DQJ run length slice).

 

Z\QLNDM EH]SRUHGQLR ] RSLVX VWUXNWXUDOQHJR NU]\ZHM G\VNUHWQHM

 

NRU]\VWDM MHG\QLH ] REOLF]H FDáNRZLWROLF]ERZ\FK

 

]QDQH MHG\QLH GOD RGFLQNyZ  L HZHQWXDOQLH RNU JyZ 

10

Odcinek dyskretny

'HILQLFMD GáXJRFL NU]\ZHM

'áXJRFL NU]\ZHM QD]\ZDü E G]LHP\ SRPQLHMV]RQ R MHGHQ

OLF]E  SLNVHOL ] NWyU\FK NU]\ZD WD VL  VNáDGD

Definicja odcinka:

Odcinkiem

R SRF]WNX Z SLNVHOX P1 L NRFX Z SLNVHOX P2

QD]\ZDP\ QDMPQLHMV]HM GáXJRFL NU]\Z áF]F WH SLNVHOH

Z NWyUHM QVVLHG]WZD L EVVLHG]WZD NROHMQ\FK SLNVHOL FLJX

VWDQRZLFHJR NU]\Z Z\VW SXM MDN QDMEDUG]LHM UyZQRPLHUQLH

5\V 'ZD Uy*QH RGFLQNL

áF]FH WH VDPH GZD SXQNW\

6WZLHUG]HQLD R F] FL ZVSyOQHM GZyFK RGFLQNyZ

'ZD NU]\*XMFH VL  RGFLQNL PRJ PLHü GRZROQ OLF]E  SXQNWyZ ZVSyOQ\FK
(0, 1, 2, ...).

&] ü ZVSyOQD RGFLQNyZ PR*H QLH E\ü VSyMQD

2GFLQHN NWyUHJR NUDFH QDOH* GR GUXJLHJR RGFLQND PR*H QLH ]DZLHUDü VL
w tym drugim odcinku.

    a)

    b)

    c)

E

    d)

A

    e)

Æ

E

E

A

E

Æ

A

E

A

E

A

E

A E

Æ

A

E

A

E

A

E

A E

A E

A E

A E

Æ

Æ

Æ

A E

Æ

Æ

A E

Æ

E A

E A

E

A

Æ

A

E A

E

A

E

A

Æ

A

E

A

E

A

A

E A

E

A

A

A

Æ

A

A

A

E A

A

A

A

E A

A

A

A

E

A

A

A

A

A

5\V 3U]\NáDG\ NU]\*RZDQLD VL  RGFLQNyZ G\VNUHWQ\FK

D  NU]\*XMFH VL  RGFLQNL A i QLH PDM F] FL ZVSyOQHM

E  NU]\*XMFH VL  RGFLQNL A i PDM MHGHQ ZVSyOQ\ SLNVHO

F  NU]\*XMFH VL  RGFLQNL A i PDM GZD ZVSyOQH SLNVHOH

G  ZVSyOQD F] ü NU]\*XMF\FK VL  RGFLQNyZ A i E nie jest spójna;
e) odcinek E

R NRFDFK OH*F\FK QD RGFLQNX QLH ]DZLHUD VL  Z QLP Z FDáRFL

background image

11

Algorytmy rysowania odcinków:

numeryczne
.ROHMQH SLNVHOH RGFLQND Z\]QDF]DQH V SU]H] SRGVWDZLDQLH ]PLHQLDQHM ]H

VWDá\P NURNLHP SHZQHM ]PLHQQHM GR Z]RUyZ JHRPHWULL HXNOLGHVRZHM L

]DRNUJODQLH RWU]\PDQ\FK Z WHQ VSRVyE ZVSyáU] GQ\FK

podstawowy

Uy*QLFRZ\  DQJ DDA - Digital Differential Analyser)

warunkowe
.ROHMQH SLNVHOH RGFLQND Z\]QDF]DQH V VSRUyG SLNVHOLNDQG\GDWyZ QD

SRGVWDZLH SRUyZQD Z G]LHG]LQLH OLF]E FDáNRZLW\FK

Bresenhama

SXQNWX URGNRZHJR  DQJ midpoint)

porównawczy Jordana

F]WHURNURNRZ\  Z RJyOQRFL ZLHlokrokowy) Gilla

strukturalne
.ROHMQH SLNVHOH RGFLQND Z\]QDF]DQH V QD SRGVWDZLH RSLVX VWUXNWXUDOQHJR

Metzgera-Bronsa

]H ]PLHQQ GáXJRFL VHULL  DQJ. run length slice)

$OJRU\WP\ U\VRZDQLD RGFLQNyZ ] Z\JáDG]DQLHP SR]LRPDPL MDVQRFL
(ang. antialiasing):

numeryczne – nie omawiane tutaj

warunkowe

z upr

RV]F]RQ\P Z\JáDG]DQLHP

Wu

VWUXNWXUDOQH  QLH QDGDM VL

Oznaczenia:     (xs , ys   SRF]WHN RGFLQND

xe , ye) - koniec odcinka.

12

Algorytm podstawowy

UyZQDQLH SURVWHM QD SáDV]F]\(QLH

y = b

m

 ZVSyáF]\QQLN NLHUXQNRZ\

b - wyraz wolny

dwa przypadki:

m

= -1

=1

|    | < 1

|    | < 1

|    | > 1

|    | > 1

 m

 m

 m

 m

α

5\V .W QDFK\OHQLD α rysowanego

RGFLQND Z ]DOH*QRFL RG

ZVSyáF]\QQLND NLHUXQNRZHJR m.

|m| > 1

zamiast równania  y = b

PR*HP\ UR]SDWU\ZDü UyZQDQLH x = m' * y + b',
gdzie  m' = 

1

m

,  b' = 

b

m

,  przy czym wówczas |m'

≤ 1,

ZL F SU]\SDGHN WHQ VSURZDG]D VL  GR GUXJLHJR SU]\SDGNX

|m

≤ 1

xe ≠ xs,

m

y

y

x

x

=


e

s

e

s

,      

b

y

m x

=

s

s

*

.

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  mb:real;  incdxdy:integer;  dx := xe-x;  dy := ye-y;

dla  |dx

≥ |dy| (czyli |m| ≤ 1):

m := dy/dx

 ^]Dá   `

b := y-m*x;
inc := sgn(dx);
while x 

≠ xe do

begin

plot(xy);
x := x+inc;
y := round(m*x+b)

end;

plot(xe,ye)

background image

13

$OJRU\WP Uy*QLFRZ\  DQJ DDA - Digital Differential Analyser)

dla |m|

≤ ]PLDQD ZVSyáU] GQHM x o ±1  ⇒ ]PLDQD ZVSyáU] GQHM y o ±m.

dla |m

_! ]PLDQD ZVSyáU] GQHM y o ±1  ⇒ ]PLDQD ZVSyáU] GQHM x o ±

1

m

.

 ∆

 ∆ y   m

x=1

=

Rys. Dla |m|

≤1 Zmiana

ZVSyáU] GQHM x o 1

SRZRGXMH ]PLDQ

ZVSyáU] GQHM y o m

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  zzinc:real;  incdxdy:integer;  dx := xe-x;  dy := ye-y;

dla  |dx

≥ |dy| (czyli |m| ≤ 1):

z := y;
inc := sgn(dx);
zinc := dy/|dx

_ ^]Dá   `

while x 

≠ xe do

begin

plot(xy);
x := x+inc;
z := z+zinc;
y := round(z)

end;

plot(xe,ye)

14

Algorytm Bresenhama

=DáR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
4

].

'OD WDNLHJR NWD QDFK\OHQLD α ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW

VVLDGHP SRSU]HGQLHJR Z NLHUXQNX Ò albo Î.

narysowany

piksel

ostatnio

dwa

piksele

kandydaci

d

d

 2

 1

odcinek
idealny

Rys. Kryterium wyboru

kolejnego piksela dla

UR]ZD*DQHJR SU]\SDGNX

d1>d2 ⇒ rysowany
górny piksel kandydat,

d1<d2 ⇒ rysowany
dolny piksel kandydat,

d1=d2 ⇒ rysowany
dowolny z pikseli
kandydatów.

3U]\MPLMP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD Z\QLRV

xi+1:= xi +1

przy wyborze dowolnego z pikseli kandydatów,

yi

yi

yi

+ =

+

1

1

:

przy wyborze górnego piksela kandydata,

przy wyborze dolnego piksela kandydata.

Wynik porównania d1>d2 decyduje o wyborze kolejnego piksela
do rysowania:

d1 = y-yi = m*(xi+1)+b-yi.
d2 = (yi+1)-y = (yi+1)-m*(xi+1)-b.

=DPLDVW QLHUyZQRFL d1>d2 PR*QD UR]ZD*Dü ]QDN Uy*QLF\ d1-d2.
d1-d2 = 2*m*(xi+1)+2*b-2*yi-1.

3RQLHZD* U\VRZDQ\ RGFLQHN QDFK\ORQ\ MHVW GR RVL 0X SRG NWHP α ∈ [0,

π
4

]

ZL F ∆x = xe-xs !  VWG VJQ d1-d2) = sgn(∆x*(d1-d2)).

Oznaczenie:

pi = ∆x*(d1-d2) =

= 2*∆x*m*(xi+1)+2*∆x*b-2*∆x*yi-∆x =
= 2*∆x*m*(xi+1)+2*∆x*ys-2*∆x*m*xs-2*∆x*yi-∆x =
= 2*∆y*(xi+1)+2*∆x*ys-2*∆y*xs-2*∆x*yi-∆x.

b = ys-m*xs

y = x*m

:DUWRü pi jest zawsze ZDUWRFL FDáNRZLW.

background image

15

d1>d2  ⇔  d1-d2>0  ⇔  pi>0  ⇒

wybór górnego piksela kandydata,

d1<d2  ⇔  d1-d2<0  ⇔  pi<0  ⇒

wybór dolnego piksela kandydata,

d1=d2  ⇔  d1-d2=0  ⇔  pi=0  ⇒

wybór dowolnego piksela kandydata,
w algorytmie przyj

WR Z\EyU JyUQHJR

3RF]WNRZD ZDUWRü pi:

p0 = 2*∆y*(x0+1)+2*∆x*ys-2*∆y*xs-2*∆x*y0-∆x =

= 2*∆y*xs+2*∆y+2*∆x*ys-2*∆y*xs-2*∆x*ys-∆x =

= 2*∆y-∆x.

x0=xs, y0=ys

Modyfikacja warto

FL pi:

pi+1-pi = 2*∆y*(xi+1-xi)-2*∆x*(yi+1-yi) =

= 2*∆y-2*∆x*(yi+1-yi) =
=

2

0

1

1

2

0

1

0

*

*

(

)

(

),

(

).

y

x

pi

yi

yi

y

pi

yi

yi

+ −

=

<

+ −

=

JG\

JG\

xi+1-xi = 1
yi+1-yi ∈ {0,1}

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  ppincpdecdxdy:integer;  dx := xe-x;  dy := ye-y;

dla  dx 

≥ dy ≥ 0:

p := 2*dy-dx;
pinc := 2*dy;
pdec := 2*(dy-dx);
while x 

≠ xe do

begin

plot(xy);
x := x+1;
if < 0 then  p := p+pinc

else  begin y := y+1; p := p+pdec end

end;

plot(xe,ye)

16

$OJRU\WP SXQNWX URGNRZHJR  DQJ midpoint)

=DáR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
4

].

'OD WDNLHJR NWD QDFK\OHQLD α ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW

VVLDGHP SRSU]HGQLHJR Z NLHUXQNX Ò albo Î.

narysowany

piksel

ostatnio

dwa

piksele

kandydaci

odcinek
idealny

Rys. Kryterium wyboru kolejnego

SLNVHOD GOD UR]ZD*DQHJR
przypadku:
o wyborze kolejnego piksela

GHF\GXMH ]QDN ZDUWRFL
funkcji F(x,y)= a*x+b*y+c

Z SXQNFLH URGNRZ\P

]D]QDF]RQ\P NU]\*\NLHP

SRPL G]\ SLNVHODPL
kandydatami.

3U]\MPLMP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD Z\QLRV

xi+1:= xi +1

przy wyborze dowolnego z pikseli kandydatów,

y

i

y

i

y

i

+ =

+

1

1

:

przy wyborze górnego piksela kandydata,

przy wyborze dolnego piksela kandydata.

Równanie ogólne prostej:  F(x,y)=0,  gdzie F(x,y)=a*x+b*y+c.

Dla dwóch punktów prostej:   a

c

y

y

x

y

x

y

=

*

*

*

(

)

V

H

H

V

V H

,    b

c

x

x

x

y

x

y

=

*

*

*

(

)

H

V

H

V

V H

.

3U]\MPXMF c = xe*ys - xs*ye RWU]\PXMH VL  a = ye - ys,   b = -(xe - xs).
:DUWRFL abPR*QD ZL F WDN GREUDü E\ E\á\ FDáNRZLWH.

3RQLHZD* SRF]WHN RGFLQND  xs , ys) i jego koniec (xe , ye  OH* QD SURVWHM
F(x,y

 ZL F

F(x0,y0) = F(xs,ys) = 0

oraz

F(xe,ye) = 0.

Oznaczenie:

fi   := [F(xi+1, yi+

1

2

)] = [a*(xi+1) + b*(yi+

1

2

) + c] =

a*xi + b*yi + + [

b

2

] = F(xi,yi) + a + [

b

2

].

:DUWRü fi jest zawsze ZDUWRFL FDáNRZLW.

background image

17

F(xi+1,yi+

1

2

) > 0

⇒ fi ≥ 0 ⇒ wybór górnego piksela kandydata,

F(xi+1,yi+

1

2

) < 0

⇒ fi < 0 ⇒ wybór dolnego piksela kandydata,

F(xi+1,yi+

1

2

) = 0

⇒ wybór dowolnego piksela kandydata,

przyj

WR Z\EyU JyUQHJR JG\* ZWHG\ fi = 0.

3RF]WNRZD ZDUWRü fi:

f0 = F(x0,y0) + a + [

b

2

] =

F(xs,ys) + a + [

b

2

] =

a + [

b

2

].

x0=xs, y0=ys

F(x0,y0) = F(xs,ys) = 0

0RG\ILNDFMD ZDUWRFL fi:

fi+1-fi F(xi+1,yi+1) - F(xi,yi) =

a*(xi+1-xi) + b*(yi+1-yi) =
a + b*(yi+1-yi) =

a

b

fi

yi

yi

a

fi

yi

yi



JG\

JG\

+ −

=

<

+ −

=

0

1

1

0

1

0

(

),

(

).

xi+1-xi = 1
yi+1-yi ∈ {0,1}

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  fdfdxdy:integer;

   dx := xe-x;  dy := ye-y;

dla  dx 

≥ dy ≥ 0:

df := dy-dx;
f := df+(dx div 2); 

{ f := dy-((dx+1) div 2);}

while x 

≠ xe do

begin

plot(xy);
x := x+1;
if  < 0 then  f := f+dy

else  begin y := y+1; f := f+df end

end;

plot(xe,ye)

18

Algorytm porównawczy Jordana

Za

áR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
2

].

'OD WDNLHJR NWD QDFK\OHQLD α ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW

VVLDGHP SRSU]HGQLHJR Z NLHUXQNX Ï, Ò albo Î.

narysowany

piksel

ostatnio

trzy

piksele

kandydaci

odcinek
idealny

Rys. Kryterium wyboru

kolejnego piksela dla

UR]ZD*DQHJR SU]\SDGNX
rysowany jest ten piksel,

NWyUHJR URGHN OH*\

QDMEOL*HM RGFLQND LGHDOQHJR

3U]\MPLMP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD PRJ Z\QLHü

1.

xi+1:= xi +1
yi+1:= yi

przy wyborze prawego piksela kandydata,

2.

xi+1:= xi
yi
+1:= yi +1

przy wyborze górnego piksela kandydata,

3.

xi+1:= xi +1
yi+1:= yi +1

przy wyborze prawego górnego piksela kandydata.

Równanie ogólne prostej:  F(x,y)=0,  gdzie F(x,y)=a*x+b*y+c.

Dla dwóch punktów prostej:   a

c

y

y

x

y

x

y

=

*

*

*

(

)

V

H

H

V

V H

,    b

c

x

x

x

y

x

y

=

*

*

*

(

)

H

V

H

V

V H

.

Przyjmuj

F c = - (xe*ys - xs*ye  RWU]\PXMH VL  b = xe - xs,   a = -(ye - ys).

:DUWRFL abPR*QD ZL F WDN GREUDü E\ E\á\ FDáNRZLWH.

Oznaczenia:

f := F(xi,yi),

F(x0,y0) = F(xs,ys) = 0,

f1 := F(xi+1,yi) = f+a,
f2 := F(xi,yi+1) = f+b,
f3 := F(xi+1,yi+1) = f+a+b.

background image

19

|f1|<|f2| & |f1|<|f3|   ⇒

wybór prawego piksela kandydata,

|f2|<|f1| & |f2|<|f3|   ⇒

wybór górnego piksela kandydata,

|f3|<|f1| & |f3|<|f2|   ⇒

wybór prawego górnego piksela kandydata,

|f1|<|f2| & |f1|=|f3|   ⇒

wybór prawego lub prawego górnego piksela,

|f2|<|f1| & |f2|=|f3|   ⇒

wybór górnego lub prawego górnego piksela,

Z DOJRU\WPLH SU]\M WR Z\EyU SUDZHJR JyUQHJR

3RQLHZD* f2 ≥ f3 ≥ f1 ZL F
|f1|<|f2| & |f1|<|f3|  ⇔  |f1|<|f3|   ⇒

wybór prawego piksela kandydata,

|f2|<|f1| & |f2|<|f3|  ⇔  |f2|<|f3|   ⇒

wybór górnego piksela kandydata,

Z SR]RVWDá\FK SU]\SDGNDFK Z\EyU SUDZHJR JyUQHJR SLNVHOD NDQG\GDWD

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  f1, f2, f3, dxdy:integer;  dx := xe-x;  dy := ye-y;

dla  dx 

≥ 0 & dy ≥ 0:

f1 := -dy;
while (x 

≠ xe) or (y ≠ ye) do

begin

plot(xy);
f3 := f1+dx;

f2 := f3+dy;

if |f1| < |f3| then  begin x := x+1; f1 := f1-dy end
else if |f2| < |f3| then  begin y := y+1; f1 := f2-dy end
else  begin x := x+1; y := y+1; f1 := f3-dy end

end;

plot(xe,ye)

3RQLHZD* f2 ≥ f3 ≥ f1 ZL F
|f1|<|f3|  ⇔  -f1<f3   ⇒ wybór prawego piksela kandydata,
|f2|<|f3|  ⇔  f2<-f3   ⇒ wybór górnego piksela kandydata,

Z SR]RVWDá\FK SU]\SDGNDFK Z\EyU SUDZHJR JyUQHJR SLNVHOD NDQG\GDWD

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  f1, f2, f3, dxdy:integer;  dx := xe-x;  dy := ye-y;

dla  dx 

≥ 0 & dy ≥ 0:

f1 := -dy;
while (x 

≠ xe) or (y ≠ ye) do

begin

plot(xy);
f3 := f1+dx;

f2 := f3+dy;

if f3 < -f1 then  begin y := y+1; f1 := f3 end;
if -f3 f2 then  begin x := x+1; f1 := f1-dy end

end;

plot(xe,ye)

20

$OJRU\WP F]WHURNURNRZ\  Z RJyOQRFL ZLHORNURNRZ\  *LOOD

=DPLDVW MHGQHJR SLNVHOD Z\]QDF]DP\ RG UD]X ZL FHM QS F]WHU\

=DáR*HQLH RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ (0, arctg

1

4

].

'OD WDNLHJR NWD QDFK\OHQLD α NROHMQH F]ZyUNL SLNVHOL PRJ SU]\MPRZDü

XZ]JO GQLDMF Z]DMHPQH VVLHG]WZR MDN L SRáR*HQLH Z]JO GHP SLNVHOD

SRSU]HG]DMFHJR  MHGQ ] SL FLX IRUP

0 0 0 0

0 0 0 1

0 0 1 0

0 1 0 0

1 0 0 0

5R]ZD*DMF F]WHU\ NURNL DOJRU\WPX %UHVHQKDPD RWU]\PXMHP\ GOD ND*GHM

F]ZyUNL SLNVHOL QDVW SXMFH ZDUXQNL

0000

0001

0010

0100

1000

pi<0

pi<0

pi<0

pi<0

pi≥0

pi+2∆y<0

pi+2∆y<0

pi+2∆y<0

pi+2∆y≥0

pi+2∆y-2∆x<0

pi+4∆y<0

pi+4∆y<0

pi+4∆y≥0

pi+4∆y-2∆x<0 pi+4∆y-2∆x<0

pi+6∆y<0

pi+6∆y≥0

pi+6∆y-2∆x<0 pi+6∆y-2∆x<0 pi+6∆y-2∆x<0

:DUXQNL WH GDM VL  XSURFLü GR SRQL*V]HM SRVWDFL

0000

0001

0010

0100

1000

   pi <

-6

≤ pi < -4∆≤ pi < -2∆≤ pi <

0

≤ pi

$QDOL]XMF GOD SRZ\*V]\FK F]ZyUHN SLNVHOL VSRVyE PRG\ILNDFML ZDUWRFL pi

Z DOJRU\WPLH %UHVHQKDPD PR*QD ]DXZD*\ü *H

pi

pi

y

y

x

pi

y

pi

y

+ −

=

< −
≥ −

4

8

8

2

6

6

*

*

*

*

*



JG\
JG\

W]Q F]ZyUND  
SR]RVWDá H F]ZyUNL 

'RGDWNRZH SU]\VSLHV]HQLH DOJRU\WPX PR*QD X]\VNDü XZ]JO GQLDMF

SUDZGRSRGRELHVWZD Z\VWSLHQLD NROHMQ\FK F]ZyUHN SR GDQHM F]ZyUFH

QL*V]H SR]\FMH Z WDEHOL RGSRZLDGDM PQLHMV]\P SUDZGRSRGRELHVWZRP 

0000

0001

0010

0100

1000

0000

0000

0000

0000

0000

1000

0001

0001

0010

0100

0100

0010

0100

1000

0010

0001

0010

0001

0001

background image

21

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  ppincpdecdxdym2m4m6xe2:integer;

dla  dx 

≥ 4*dy ≥ 0:

dx := xe-x;

dy := ye-y;

p := 2*dy-dx;

pinc := 8*dy;

pdec := 8*dy-2*dx;

m2 := -2*dy;

m4 := -4*dy;

m6 := -6*dy;

xe2 := xe-2;

while x < xe2 do

{rysowanie  (dx+1) div 4  czwórek}

begin

if p < m6  then

{0000}

begin

plot(xy); plot(x+1, y);
plot(x+2, y); plot(x+3, y);
p := p+pinc

end

else

begin

if m2  then

if p < m4  then

{0001}

begin

plot(xy); plot(x+1, y);
plot(x+2, y); plot(x+3, y); y := y+1

end

else

{0010}

begin

plot(xy); plot(x+1, y);
plot(x+2, y); y := y+1; plot(x+3, y)

end

else if p < 0  then

{0100}

begin

plot(xy); plot(x+1, y); y := y+1;
plot(x+2, y); plot(x+3, y)

end

else

{1000}

begin

plot(xy); y := y+1; plot(x+1, y);
plot(x+2, y); plot(x+3, y)

end;

p := p+pdec

end;

x := x+4

end;

if x 

≤ xe  then

{rysowanie  (dx+1) mod 4  pikseli}

begin

if x < xe  then

begin

if x 

≤ xe2  then

begin

plot(xy);

x := x+1;

if 

≥  0   then  y := y+1 

end;

plot(x,y)

end;

plot(xe,ye)

end

22

Algorytm strukturalny Metzgera-Bronsa

0

1

2

3

4

5

6

7

5\V .D*G\ SLNVHO RGFLQND  MDN L

GRZROQHM NU]\ZHM  PR*H E\ü
kodowany jako cyfra ósemkowa

R]QDF]DMFD QXPHU VVLDGD
jakim jest ten piksel dla
poprzedzajacego go piksela.

2GFLQHN G\VNUHWQ\  MDN L ND*G

NU]\Z  PR*QD ]DWHP RSLVDü

SU]\ SRPRF\ FLJX F\IU
ósemkowych zwanego kodem

áDFXFKRZ\P

3

1

Rys.

3U]\NáDGRZD NU]\ZD L MHM NRG áDFXFKRZ\

1

2

0170213

’ 0

7 0

3RVWXODW\ )UHHPDQD RGQRQLH NRGX áDFXFKRZHJR RSLVXMFHJR RGFLQHN

: NRG]LH áDFXFKRZ\P PRJ Z\VW SRZDü FR QDMZ\*HM GZLH F\IU\

RGSRZLDGDMFH VVLHGQLP NLHUXQNRP

7\ONR MHGQD ] F\IU Z\VW SXMF\FK Z NRG]LH áDFXFKRZ\P PR*H

VVLDGRZDü VDPD ]H VRE

6XNFHV\ZQH UR]PLHV]F]HQLH F\IU Z NRG]LH áDFXFKRZ\P SRZLQQR E\ü

WDN MHGQRURGQH MDN W\ONR MHVW WR PR*OLZH

=DáR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
4

].

'OD WDNLHJR NWD QDFK\OHQLD α ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW

VVLDGHP SRSU]HGQLHJR Z NLHUXQNX Ò albo Î : NRG]LH áDFXFKRZ\P

PRJ ZL F Z\VW SRZDü MHG\QLH F\IU\  L 
3RQLHZD* RGFLQHN MHVW QDMPQLHMV]HM GáXJRFL NU]\Z áF]F GZD SLNVHOH

ZL F Z NRG]LH áDFXFKRZ\P SRZLQQR VL  ]QDOH(ü GRNáDGQLH
 

y  jedynek  i  ∆x-∆y  zer  (∆y = ye-ys, ∆x = xe-xs).

Oznaczenia:

h ( )

1

2

u

u

= 





K2

2

( )

u

u

u

= − 





     lub     

K1

2

( )

u

u

u

= − 





K2

2

( )

u

u

= 





.

Podstawienie warto

FL SRF]WNRZ\FK i := 0,

a0 := ∆y

A0 := "1",

b0 := ∆x-∆y,

B0 := "0".

background image

23

1DOH*\ ]DWHP SU]HPLHV]Dü ai áDFXFKyZ Ai  z  bi áDFXFKDPL Bi.

Podstawienie:
ci := max(ai,bi), 

ci=ai  ⇒  Ci := Ai,   Di := Bi,

di := min(ai,bi),

ciai  ⇒  Ci := Bi,   Di := Ai,

ci ≥ di.

1D MHGHQ áDFXFK Di SU]\SDGD UHGQLR ri

ci

di

=

áDFXFKyZ Ci  (ri≥1).

ri  FDáNRZLWH ⇒

NRG áDFXFKRZ\ RGFLQND

i

d

i

r

i

C

i

D

i

r

i

C





)

(

)

(

1



K

K

.

-HOL ri QLH MHVW ZDUWRFL FDáNRZLW WR QDOH*\ SU]HPLHV]Dü ]H VRE
ai+1 := ci mod di

áDFXFKyZ

Ai

Ci

ri

DiCi

ri

+ =

+

+

1

1

1

1

:

([ ]

)

([ ]

)

h

h2

     i

bi+1 := di - (ci mod di

áDFXFKyZ

Bi

Ci

ri D

iCi

ri

+ =

1

1

:

([ ])

([ ])

h

h2

.

1DOH*\ ZL F SRZWyU]\ü SRZ\*V]H NURNL GOD i := i+1.

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  AB:string;  w:Boolean;  abdxdy:integer;  dx := xe-x;

dla  dx 

≥ dy ≥ 0:

      dy := ye-y;

a := dy;   b := dx-dy;   A := "1";   B := "0";
while a 

≠ 0 do

begin

w := false;   {true}
if b then  begin swap(a,b); swap(A,B) end;
repeat

if  w  then  B := A+B  else  B := B+A;
w := not w;
a := a-b

until a < b;
if  w  then  A := A+B  else  A := B+A;
b := b-a

end;

for i := 1 to b do

for  j := 1 to length(B) do

begin

plot(x,y);
x := x+1;   if  B[j] = '1'  then  y := y+1

end;

plot(xe,ye)

24

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  AB:string;  w:Boolean;  abdxdy:integer;  dx := xe-x;

dla  dx 

≥ dy ≥ 0:

      dy := ye-y;

a := dy;   b := dx-dy;   A := "1";   B := "0";
w := false;   {true}
while a 

≠ 0 do

begin

while a < b do

begin

if  w  then  A := A+B  else  A := B+A;
w := not w;
b := b-a

end;

repeat

if  w  then  B := A+B  else  B := B+A;
w := not w;
a := a-b

until a < b

end;

for i := 1 to b do

for  j := 1 to length(B) do

begin

plot(x,y);
x := x+1;   if B[j] = '1' then y := y+1

end;

plot(xe,ye)

background image

25

$OJRU\WP VWUXNWXUDOQ\ ]H ]PLHQQ GáXJRFL VHULL (ang. run length
slice
)

=DáR*HQLH RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP ϕ ∈ (0, arctg

1

2

].

'OD WDNLHJR NWD QDFK\OHQLD ϕ ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW

VVLDGHP SRSU]HGQLHJR Z NLHUXQNX Ò albo Î : NRG]LH áDFXFKRZ\P

PRJ ZL F Z\VW SRZDü MHG\QLH F\IU\  L  3RQDGWR ND*GD MHG\QND E G]LH Z

W\P NRG]LH áDFXFKRZ\P RWRF]RQD ]HUDPL JG\* ]HU MHVW ZL FHM
3RQLHZD* RGFLQHN MHVW QDMPQLHMV]HM GáXJRFL NU]\Z áF]F GZD SLNVHOH

ZL F Z NRG]LH áDFXFKRZ\P SRZLQQR VL  ]QDOH(ü GRNáDGQLH

β = ∆y  jedynek  i  α = ∆x-∆y  zer  (∆y = ye-ys, ∆x = xe-xs).

.RG áDFXFKRZ\ RGFLQND

 

   

0

1 0

2 1

2

1

i

i

i

=

α

α

β

,

gdzie

α

α

β

j

j

=

=

1

2

,

A

A

A

i

i

n

=

=

1

1

β

...

 ,

n

n

A

AA

A

...

=

7U]HFL SRVWXODW )UHHPDQD PyZL W\OH *H ZDUWRFL α

i

SRZLQQ\ E\ü MDN

QDMEOL*V]H VLHELH : SUDNW\FH R]QDF]D WR L* α

i

SU]\MPXMH MHGQ ] GZyFK

ZDUWRFL

α

β

2

 = 

α div (2β)   lub   

α

β

2

+1 = 

α div (2β)+1, przy czym

UR]NáDG W\FK ZDUWRFL SRZLQLHQ E\ü MDN QDMEDUG]LHM UyZQRPLHUQ\ :áDVQRü

W  ]DSHZQLD QDVW SXMF\ Z]yU LWHUDF\MQ\

α

α

α

β

j

k

k

j

j

=





=

round

2

1

1

lub

α

α

β α

β

j

k

k

j

j

=

+





=

2

1

1

 div (2

β).

2VWDWHF]QLH NRG áDFXFKRZ\ RGFLQND G\VNUHWQHJR MHVW QDVW SXMF\

 

   

0

1 0

2 1

2

1

i

i

i

=

α

α

β

,

gdzie

  

A

A

A

i

i

n

=

=

1

1

β

...

 ,

n

n

A

AA

A

...

=

,

 α div (2β)

dla   

λ

j

 + 

α mod (2β) < 2β,

]D α

j

=

 α div (2β) +1

dla  

λ

j

 + 

α mod (2β) ≥ 2β,

λ

j

 = (

α(j−1) +β) mod (2β),

czyli

λ

1

 = 

β,

 λ

j

 + 

α mod (2β)

dla   

λ

j

 + 

α mod (2β) < 2β,

λ

j+1

=

 λ

j

 + 

α mod (2β) − 2β

dla  

λ

j

 + 

α mod (2β) ≥ 2β,

26

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  aba2ba2Mba2Dlijdxdy:integer;

dx := xe-x;

dla  dx 

≥ 2*dy > 0:

dy := ye-y;

a := dy;   b := dx-dy;   l := a;
a2 := a+a;   ba2M := b mod a2;   ba2D := b div a2;
plot(x,y);
for i := 1 to a do

begin

for j := 1 to ba2D do  begin x := x+1; plot(x,y) end;
l := l+ba2M;
if l 

≥ a2 then begin l := l-a2x := x+1; plot(x,y) end;

x := x+1;   y := y+1;   plot(x,y);
for j := 1 to ba2D do  begin x := x+1; plot(x,y) end;
l := l+ba2M;
if l 

≥ a2 then begin l := l-a2x := x+1; plot(x,y) end

end

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  aba2baDbaM2ba2Mba2Dlijdxdy:integer;

dla  dx 

≥ 2*dy > 0:

dx := xe-xdy := ye-y;

a := dy;   b := dx-dy;   l := a;
a2 := a+a;   ba2M := b mod a2;   ba2D := b div a2;
baD := ba2D+ba2D;   baM2 := ba2M+ba2M;
if ba2M > a

then  begin  baD := baD+1;   baM2 := baM2-a2  end;

plot(x,y);
for j := 1 to ba2D do  begin  x := x+1;   plot(x,y)  end;
l := l+ba2M;
if  l 

≥ a2  then  begin  l := l-a2;   x := x+1;   plot(x,y)  end;

x := x+1;   y := y+1;   plot(x,y);
for i := 2 to a do

begin

for j := 1 to baD do  begin x := x+1; plot(x,y) end;
l := l+baM2;
if l 

≥ a2 then begin l := l-a2x := x+1; plot(x,y) end;

x := x+1;   y := y+1;   plot(x,y);

end;

for j := 1 to ba2D do  begin  x := x+1;   plot(x,y)  end;
if  l+ba2M 

≥ a2  then  begin  x := x+1;   plot(x,y)  end

background image

27

= EDWRü” odcinków dyskretnych (ang. aliasing)

5\V 2GFLQHN G\VNUHWQ\ ] Z\UD(QLH ZLGRF]Q\PL ] EDPL  VFKRGNDPL 

Metody usuwania „

] EDWRFL” odcinków

]ZL NV]HQLH UR]G]LHOF]RFL

5\V 2GFLQHN G\VNUHWQ\ Z ]ZL NV]RQHM UR]G]LHOF]RFL

Z\JáDG]DQLH RGFLQNyZ SR]LRPDPL MDVQRFL  DQJ antialiasing)

5\V :\JáDG]RQ\ RGFLQHN G\VNUHWQ\

Rys. Model odcinka

-DNR LGHDOQH SU]\EOL*HQLH RGFLQND G\VNUHWQHJR PR*QD SU]\Mü SURVWRNW R

V]HURNRFL  SLNVHOD : SU]\SDGNX RGFLQND XNRQHJR E G]LH RQ SRNU\ZDá

W\ONR IUDJPHQW\ SLNVHOL -DVQRü W\FK SLNVHOL SRZLQQD ZL F ]DOH*Hü RG

UR]PLDUyZ IUDJPHQWyZ SRNU\ZDQ\FK SU]H] WDNL SURVWRNW 8]\VNDQ\ Z WHQ

VSRVyE U\VXQHN RGFLQND GDMH ZUD*HQLH Z\JáDG]RQHJR  DQJ antialiased).

28

:\JáDG]DQLH RGFLQNyZ G\VNUHWQ\FK  DQJ antialiasing)

bezwagowe próbkowanie powierzchni

Rys. Bezwagowe próbkowanie powierzchni odpowiada

SURVWRSDGáRFLHQQHM IXQNFML ZDJRZHM

5\V %H]ZDJRZR Z\JáDG]RQ\ RGFLQHN G\VNUHWQ\  ZDJD SURVWRSDGáRFLHQQD 

wagowe próbkowanie powierzchni

5\V 2VWURVáXSRZD IXQNFMD ZDJRZD

5\V 6WR*NRZD IXQNFMD ZDJRZD

5\V :DJRZR Z\JáDG]RQ\ RGFLQHN G\VNUHWQ\  ZDJD RVWURVáXSRZD  X JyU\

L ZDJD VWR*NRZD  QD GROH 

background image

29

$OJRU\WP ] XSURV]F]RQ\P Z\JáDG]DQLHP  DQJ antialiasing)

=DáR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
4

].

narysowane

ostatnio

(dwie pary)

trzy piksele

odcinek
idealny

y

i

x

i

k

i

piksele

kandydaci

Piksele rysowane parami w pionie.

Rys. Kryterium wyboru kolejnych

pikseli:

k>0 

⇒ kolejne dwa piksele

rysowane w tych samych
wierszach (yiyi-1),

k<0 

⇒ kolejne dwa piksele

rysowane w wierszach o

SR]LRP Z\*HM  yi+1, yi),

k=0 

⇒ kolejny piksel (tylko

jeden) rysowany
w górnym wierszu (yi),

3U]\MPLMP\ *H JyUQ\ ] RVWDWQLR QDU\VRZDQ\FK SLNVHOL PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH JyUQHJR SLNVHOD NROHMQHM SDU\ Z\QLRV

xi+1:= xi +1

yi

yi

yi

+ =

+

1

1

:

dla  k<0,

dla  k

≥0.

,QWHQV\ZQRü JyUQHJR SLNVHOD MHVW ZSURVW SURSRUFMRQDOQD GR k,

LQWHQV\ZQRü GROQHJR SLNVHOD MHVW ZSURVW SURSRUFMRQDOQD GR k.

=DáR*HQLH SURFHGXUD SORW xycc

max

 QDGDMH SXQNWRZL R ZVSyáU] GQ\FK

xy

LQWHQV\ZQRü Z]JO GQ c / c

max

 (gdzie cc

max

 ZDUWRFL FDáNRZLWH 

Zami

DVW ZDUWRFL XáDPNRZHM OHSLHM MHVW UR]ZD*Dü ZDUWRü FDáNRZLW k

*

x.

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
zmienne procedury:  kdxdxdy:integer;

  dx := xe-x;  dy := ye-y;

dla  dx 

≥ dy ≥ 0:

kdx := 0;
while x 

≠ xe do

begin

plot(xydx-kdxdx);
if kdx 

≠ 0 then  plot(xy-1, kdxdx);

x := x+1;
kdx := kdx-dy;
if kdx < 0 then  begin y := y+1; kdx := kdx+dx end

end;

plot(xeye, 1, 1)

30

$OJRU\WP :X ] Z\JáDG]DQLHP  DQJ antialiasing)

=DáR*HQLH U\VRZDQ\ RGFLQHN QDFK\ORQ\ GR RVL 0X SRG NWHP α ∈ [0,

π
4

].

Piksele rysowane parami w pionie.

=DáR*HQLH 

m

GRVW SQ\FK SR]LRPyZ MDVQRFL

3U]\MPLMP\ *H GROQ\ ] RVWDWQLR QDU\VRZDQ\FK SLNVHOL PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH GROQHJR SLNVHOD NROHMQHM SDU\ Z\QLRV

xi+1:= xi +1

yi

yi

yi

+ =

+

1

1

:

dla  [a·(i+1)] > [a·i],       gdzie  a = tg

α,

dla  [a·(i+1)] = [a·i].

,QWHQV\ZQRü JyUQHJR SLNVHOD MHVW ZSURVW SURSRUFMRQDOQD GR a·(i+1)-[a·(i+1)],

LQWHQV\ZQRü GROQHJR SLNVHOD MHVW ZSURVW SURSRUFMRQDOQD GR  a·(i+1)+[a·(i+1)].

=DáR*HQLH SURFHGXUD SORW xycc

max

 QDGDMH SXQNWRZL R ZVSyáU] GQ\FK

xy

LQWHQV\ZQRü Z]JO GQ c / c

max

 (gdzie cc

max

 ZDUWRFL FDáNRZLWH 

FR ZL FHM c

max

MHVW SRPQLHMV]RQ R  SRW J OLF]E\ 

=DPLDVW ZDUWRFL XáDPNRZHM a·i-[a·i] OHSLHM MHVW UR]ZD*Dü ZDUWRü FDáNRZLW
([2

n

·a+0,5]·i) mod 2

n

.

=DáR*HQLH IXQNFMD RYHUIORZ d  ]ZUDFD ZDUWRü true tylko wtedy,
gdy poprzednia operacja na zmiennej d

]DNRF]\áD VL  SU]HSHáQLHQLHP

parametry procedury:  xyxeye:integer;  x := xs,  y := ys,  xe := xe,  ye := ye.
VWDáH SURFHGXU\ n {liczba bitów dla typu integer},

nm {n-m>0, gdzie 2

m

 

MHVW OLF]E SR]LRPyZ V]DURFL},

em {2

m

-1};

zmienne procedury:  dxdy, ddinc:integer;

  dx := xe-x;  dy := ye-y;

dla  dx 

≥ dy ≥ 0:

d := 0;
dinc := ((dy shl n)+(dx shr 1)) div dx;
while x 

≠ xe do

begin

plot(xyem - (d shr nm) , em);
if d 

≠ 0 then  plot(xy+1, d shr nmem);

x := x+1; d := d+dinc {mod 2

n

};

if overflow(d) then  y := y+1

end;

plot(xeyeemem)

background image

31

àXN RNU JX  HOLSV\

5\V 'ZLH RULHQWDFMH SU]\ U\VRZDQLX RNU JX

(orientacja ujemna - zgodnie z ruchem
wskazówek zegara, orientacja dodatnia -
przeciwnie do ruchu wskazówek zegara).

orientacja

ujemna

orientacja
dodatnia

$OJRU\WP\ U\VRZDQLD áXNyZ RNU JyZ  HOLSV :

zmiennoprzecinkowe

.ROHMQH SLNVHOH áXNX Z\]QDF]DQH V SU]H] SRGVWDZLDQLH ]PLHQLDQHM ]H

VWDá\P NURNLHP SHZQHM ]PLHQQHM GR Z]RUyZ JHRPHWULL HXNOLGHVRZHM

L ]DRNUJODQLH RWU]\PDQ\FK Z WHQ VSRVyE ZVSyáU] GQ\FK

podstawowy

parametryczny

+RQJD  VWDáRSU]HFLQNRZD ZHUVMD DOJRU\WPX SDUDPHWU\F]QHJR

warunkowe

.ROHMQH SLNVHOH áXNX Z\]QDF]DQH V VSRUyG SLNVHOLNDQG\GDWyZ QD

SRGVWDZLH SRUyZQD Z G]LHG]LQLH OLF]E FDáNRZLW\FK

Bresenhama

SXQNWX URGNRZHJR  DQJ midpoint)

porównawczy Jordana

C

S

E

5\V àXN RNU JX R URGNX Z SXQNFLH &

UR]SRF]\QDMF\ VL  Z SXQNFLH 6

NRF]F\ VL  QD SyáSURVWHM &(
wyznaczonej przez punkt E,
rysowany przy orientacji dodatniej.
Uwaga:

3RGDQH QL*HM DOJRU\WP\

U\VXM áXNL ZJ RULHQWDFML GRGDWQLHM

Oznaczenia: (xs , ys   SRF]WHN áXNX

(xe , ye   NRQLHF áXNX

(xc , yc   URGHN RNU JX

=DáR*HQLH

:VSyáF]\QQLN NV]WDáWX SLNVHOD  DQJ aspect ratio) wynosi 1.

5\V :VSyáF]\QQLN NV]WDáWX SLNVHOD UyZQ\ MHVW

u

v

.

u

v

piksel

Uwaga:

2NUJ R URGNX  xc , yc) i promieniu PR*QD RWU]\PDü ] RNU JX R

URGNX    L SURPLHQLX VWRVXMF SU]HVXQL FLH R ZHNWRU  xc , yc).

32

Oktanty (ósemki)

5\V 3RG]LDá RNU JX QD RNWDQW\  yVHPNL 

=D]QDF]RQD VWU]DáNDPL SU]\QDOH*QRü

GR RNWDQWX SyáSURVWHM UR]JUDQLF]DMFHM

]DOH*\ RG RULHQWDFML U\VRZDQLD

=DáR*HQLH (xc,yc) = (0,0)

1

2

3

4

5

6

7

8

dla orientacji

dodatniej

dla orientacji

ujemnej

$OJRU\WP Z\]QDF]DQLD QXPHUX RNWDQWX QD SRGVWDZLH ZVSyáU] GQ\FK SLNVHOD

if y > 0 then if x > 0 then if x > then  Octant := 1

else  Octant := 2

else if y > -then  Octant := 3

else  Octant := 4

else if x < 0 then if x < then  Octant := 5

else  Octant := 6

else if y < -then  Octant := 7

else if y 

≠ 0 then  Octant := 8

else if x 

≠ 0 then  Octant := 1

else  Octant := 0

Funkcja StartOctant(xs,ys,xe,ye) wykorzystuje ten algorytm do wyznaczenia

RNWDQWyZ SLNVHOD SRF]WNRZHJR  xs,ys  L NRFRZHJR  xe,ye). Funkcja ta

]ZUDFD QXPHU RNWDQWX SLNVHOD SRF]WNRZHJR áXNX ,QLFMDOL]XMH RQD SRQDGWR
pewne zmienne globalne dla potrzeb funkcji Octant.

Algorytm wyznaczania numeru oktantu na podstawie

ZVSyáU] GQ\FK SLNVHOD

SU]\ GRGDWNRZHM ]QDMRPRFL QXPHUX RNWDQWX SRSU]HG]DMFHJR JR SLNVHOD Z

áXNX RNU JX  R SURPLHQLX r > 1) rysowanym przy orientacji dodatniej:

case  Octant  of 1: if x > y

then  Octant := 1 else  Octant := 2;

2: if x > 0

then  Octant := 2 else  Octant := 3;

3: if y > -then  Octant := 3 else  Octant := 4;
4: if y > 0

then  Octant := 4 else  Octant := 5;

5: if x < y

then  Octant := 5 else  Octant := 6;

6: if x < 0

then  Octant := 6 else  Octant := 7;

7: if y < -then  Octant := 7 else  Octant := 8;
8: if y < 0

then  Octant := 8 else  Octant := 1  end

Funkcja Octant(x,y) wykorzystuje ten algorytm do wyznaczenia oktantu
piksela (x,y). Funkcja ta zwraca numer oktantu tego piksela lub zero, gdy

RVLJQL W\ ]RVWDá NRQLHF áXNX :\NRU]\VWXMH RQD SRQDGWR SHZQH ]PLHQQH

JOREDOQH ]DLQLFMDOL]RZDQH SU]H] IXQNFM  6WDUW2FWDQW

:DUXQHN VWZLHUG]DMF\ RVLJQL FLH NRFD áXNX  GOD RULHQWDFML GRGDWQLHM 

:DUXQHN WHQ QDOH*\ WHVWRZDü MHG\QLH Z RNWDQFLH SLNVHOD NRFRZHJR áXNX

y*xe  >  ye*x    ⇒ RVLJQL WR NRQLHF áXNX

background image

33

Algorytm podstawowy

Ogólna zasada:

3U]\ U\VRZDQLX NU]\ZHM SROHJDMF\P QD Z\]QDF]DQLX ZVSyáU] GQ\FK

NROHMQ\FK SLNVHOL SRSU]H] PRG\ILNDFM  MHGQHM ]H ZVSyáU] GQ\FK R  L

REOLF]DQLX GUXJLHM ZVSyáU] GQHM ]H Z]RUX DQDOLW\F]QHJR ZVSyáU] GQ

]PLHQLDQ R  SRZLQQD E\ü ZVSyáU] GQD GOD NWyUHM SU]\URVW\ V ZL NV]H

5yZQDQLH RNU JX R rodku (xc,yc) = (0,0) i promieniu r:

x2 + y2 = r2

1

2

3

4

5

6

7

8

5\V 3RG]LDá RNU JX QD RNWDQW\

Dla orientacji dodatniej i dla oktantów:

1, 8:  y

]ZL NV]DQH R 

x

r

y

: [

]

=

+

2

2

1
2

,

2, 3:  x zmniejszane o 1,  

y

r

x

: [

]

=

+

2

2

1
2

,

4, 5:  y zmniejszane o 1,  

x

r

y

:

[

]

= −

+

2

2

1
2

,

  [ ]ZL NV]DQH R 

y

r

x

:

[

]

= −

+

2

2

1
2

.

Uwaga:

'ZXEDMWRZ\ W\S LQWHJHU PR*H QLH Z\VWDUF]\ü GR SU]HFKRZDQLD

Z\QLNX PQR*HQLD  SRGQRV]HQLD GR NZDGUDWX  ZDUWRFL ZVSyáU] GQ\FK
(np. 200*   !   'ODWHJR WH* IXQNFMD SRGQRV]FD GR

NZDGUDWX SRZLQQD E\ü ]EXGRZDQD QDVW SXMFR
function sqr(u:integer):longint; begin sqr:=longint(u)*longint(u) end

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  rr:longint;

xe := xe-xc,  ye := ye-yc,

dla  oktantów nr 1 i 8:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye) in [1, 8]  then

begin

rr := sqr(x) + sqr(y);
repeat

plot(x+xcy+yc);
y := y+1;
x := round(sqrt(rr-sqr(y)))

until  not (Octant(x,y) in [1, 8])

end

34

Algorytm parametryczny

Równ

DQLH SDUDPHWU\F]QH RNU JX R URGNX  xc,yc) = (0,0) i promieniu r:

x = r*cosϕ,
y = r*sinϕ,

ϕ ∈ [0, 2*π)

=DáR*HQLH NROHMQH SLNVHOH Z\]QDF]DQH V SRSU]H] ]PLDQ  SDUDPHWUX ϕ  o

VWDá ZDUWRü ∆ϕ = const.

-H*HOL SLNVHO  xi,yi  PD ZVSyáU] GQH

xi = r*cosϕi,
yi = r*sinϕi,

WR SU]\ RULHQWDFML GRGDWQLHM QDVW SXMF\ SR QLP SLNVHO  xi+1,yi+1) ma

ZVSyáU] GQH

xi+1 = r*cosϕi+1 = r*cos(ϕi+∆ϕ) =

r*cosϕi*cos∆ϕ - r*sinϕi*sin∆ϕ =
xi*cos∆ϕ - yi*sin∆ϕ,

yi+1 = r*sinϕi+1 = r*sin(ϕi+∆ϕ) =

r*cosϕi*sin∆ϕ + r*sinϕi*cos∆ϕ =
xi*sin∆ϕ + yi*cos∆ϕ,

∆ϕ

∆ϕ∗   ≤1

r

r

r

5\V :DUWRü ∆ϕ SRZLQQD SRZRGRZDü ]PLDQ

ZDUWRFL ZVSyáU] GQ\FK QLH ZL FHM QL* R 
:DUWRü ∆ϕ ≤ 

1

r

]DSHZQLD ]PLDQ  ZDUWRFL

ZVSyáU] GQ\FK QLH ZL FHM QL* R 
1DOH*\ ]DWHP SU]\Mü ∆ϕ = 

1

r

.

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  csuv, z:real;

xe := xe-xc,  ye := ye-yc,

dla  wszystkich oktantów:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye

≠ 0  then

begin

u := 1.0 / sqrt(sqr(x) + sqr(y));   c := cos(u);   s := sin(u);
v := xz := y;
repeat

plot(x+xcy+yc);
u := v*c-z*s;   z := v*s+z*c;   v := u;
x := round(v);   y := round(z)

until  Octant(x,y) = 0

end

background image

35

Algorytm Honga

Dla algorytmu parametrycznego: xi+1 = xi*cos∆ϕ - yi*sin∆ϕ,      ∆ϕ ≤ 

1

r

yi+1 = xi*sin∆ϕ + yi*cos∆ϕ.

Oznaczenie:
k := [log

r

@   OLF]ED ELWyZ SRWU]HEQ\FK GR ]DSLVDQLD ZDUWRFL r.

2k-1 

≤ r < 2k  &  2-k < 

1

r

 

≤ 2-k+1 Z\JRGQLH ]DWHP SU]\Mü ∆ϕ =2-k < 

1

r

.

3RQLHZD* NW ∆ϕ MHVW PDá\ ZL F IXQNFMH WU\JRQRPHWU\F]QH WHJR NWD

Z\VW SXMFH Z SRZ\*V]\FK Z]RUDFK PR*QD GRü GREU]H SU]\EOL*\ü

SRF]WNRZ\PL Z\UD]DPL RGSRZLHGQLFK V]HUHJyZ 7D\ORUD

cosx

x

n x n

n

= −

+ + −

+

1

1

2

2

1

2

2

!

..

(

)

(

)!

...

*

*

    sinx

x

x

n x n

n

= −

+ + −

+

+

+

1

3

3

1

2

1

2

1

!

..

(

)

(

)!

...

*

*

3U]\MPXMF SU]\EOL*HQLH FRVx ≈ 1-

1

2

*x

2,  sinx 

≈ L XZ]JO GQLDMF ∆ϕ=2-k,

RWU]\PXMH VL  QDVW SXMFH Z]RU\

xi+1 = xi*(1-

1

2

*(∆ϕ)

2) - yi*∆ϕ = xi -xi*2-(2k+1) -yi*2-k,

yi+1 = xi*∆ϕ + yi*(1-

1

2

*(∆ϕ)

2) =  xi*2-k+yi-yi*2-(2k+1).

0QR*HQLH  G]LHOHQLH  SU]H] RGSRZLDGD SU]HVXQL FLX DU\WPHW\F]QHPX

=DáR*HQLH shr, shl - operacje przesuwania arytmetycznego w prawo i lewo.

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  kn:integer;   uv, z:longint;

xe := xe-xc,  ye := ye-yc,

dla  wszystkich oktantów:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye

≠ 0  then

begin

u := sqr(x) + sqr(y);   k := 0;
while  u 

≠ 0  do  begin  u := u shr 2;  k := k+1  end;

{k := trunc(log2(sqrt(sqr(x)+sqr(y))))+1;}
n := 2*k+1;   v := x;   z := y;   v := v shl n;   z := z shl n;
repeat

plot(x+xcy+yc);
u := v-x-(z shr k);   z := z-y+(v shr k);   v := u;
x := v shr n;   y := z shr n

until  Octant(x,y) = 0

end

36

Algorytm Bresenhama

=DáR*HQLH U\VRZDQ\ áXN RNU JX ] RNWDQWX QU 
'OD WDNLHJR áXNX ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW VVLDGHP
poprzedniego w kierunku 

Ï albo Ñ.

narysowany

piksel

ostatnio

dwa

piksele

kandydaci

áXN LGHDOQ\

d

d

2

1

Rys. Kryterium wyboru

kolejnego piksela dla

UR]ZD*DQHJR SU]\SDGNX

d1>d2 ⇒ rysowany
lewy piksel kandydat,

d1<d2 ⇒ rysowany
prawy piksel kandydat,

d1=d2 ⇒ rysowany
dowolny z pikseli
kandydatów

3U]\MPLMP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD Z\QLRV

x

i

x

i

x

i

+ =

1

1

:

przy wyborze lewego piksela kandydata,

przy wyborze prawego piksela kandydata.

yi+1:= yi +1

przy wyborze dowolnego z pikseli kandydatów,

Wynik porównania d1>d2 decyduje o wyborze kolejnego piksela

do rysowania:   d

xi

r

yi

1

2

1 2

=

+

(

) ,    d

r

yi

xi

2

2

1 2

1

=

+

(

)

(

) .

d1>d2 ⇔ xi

r

yi

r

yi

xi

+

>

+

2

1 2

2

1 2

1

(

)

(

)

(

)

⇔ 2

1

2

2

1 2

*

*

(

)

xi

r

yi

− >

+

⇔ (2*xi-1)2 > 4*(r2-(yi+1)2)
⇔ 4*xi2-4*xi+1 > 4*(r2-(yi+1)2)
⇔ 4*xi2-4*xi+2 > 4*(r2-(yi+1)2)
⇔ 2*xi2-2*xi+1 > 2*(r2-(yi+1)2)
⇔ xi2+xi2-2*xi+1 > 2*(r2-(yi+1)2)
⇔ xi2+(xi-1)2 > 2*(r2-(yi+1)2)
⇔ xi2+(yi+1)2-r2 > r2-(xi-1)2-(yi+1)2
⇔ F(xi,yi+1)+F(xi-1,yi+1) > 0

(...)2   (xi > 0)

OLF]E\ FDáNRZLWH 
/ 2

F(x,y) = x2+y2-r2

background image

37

Oznaczenie:

pi := F(xi,yi+1)+F(xi-1,yi+1).

:DUWRü pi jest zawsze ZDUWRFL FDáNRZLW.

d1>d2  ⇔  pi>0  ⇒ wybór lewego piksela kandydata,
d1<d2  ⇔  pi<0  ⇒ wybór prawego piksela kandydata,
d1=d2  ⇔  pi=0  ⇒ wybór dowolnego piksela kandydata,

w algorytmie 

SU]\M WR Z\EyU OHZHJR 

ten przypadek nigdy nie zajdzie.

3RF]WNRZD ZDUWRü pi:

p0 = F(x0,y0+1)+F(x0-1,y0+1) =

F(xs,ys+1)+F(xs-1,ys+1) =
xs2+(ys+1)2-r2+(xs-1)2+(ys+1)2-r2 =
xs2+ys2+2*ys+1-r2+xs2-2*xs+1+ys2+2*ys+1-r2 =
= 4*ys-2*xs+3.

x0=xs, y0=ys

2+2-2=0

0RG\ILNDFMD ZDUWRFL pi:
pi+1-pi F(xi+1,yi+1+1)+F(xi+1-1,yi+1+1)-F(xi,yi+1)-F(xi-1,yi+1) =

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

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

xi+12-xi2+(xi+1-1)2-(xi-1)2+2*((yi+1+1)2-(yi+1)2) =




xi2-xi2+(xi-1)2-(xi-1)2+2*((yi+2)2-(yi+1)2) =

= 4*yi+6              dla wyboru prawego piksela,

(xi-1)2-xi2+(xi-2)2-(xi-1)2+2*((yi+2)2-(yi+1)2) =

= 4*yi-4*xi+10    dla wyboru lewego piksela.

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  p:integer;

xe := xe-xc,  ye := ye-yc,

dla  oktantu nr 1:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye) = 1  then

begin

p := 4*y-2*x+3;
repeat

plot(x+xcy+yc);
if  p < 0 then  p := p+4*y+6

else begin p := p+4*(y-x)+10; x := x-1 end;

y := y+1

until  Octant(x,y

≠ 1

end

38

$OJRU\WP SXQNWX URGNRZHJR  DQJ midpoint)

=DáR*HQLH U\VRZDQ\ áXN RNU JX ] RNWDQWX QU 
'OD WDNLHJR áXNX ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW VVLDGHP
poprzedniego w kierunku 

Ï albo Ñ.

narysowany

piksel

ostatnio

dwa

piksele

kandydaci

áXN LGHDOQ\

Rys. Kryterium wyboru

kolejnego piksela dla

UR]ZD*DQHJR SU]\SDGNX
o wyborze kolejnego
piksela decyduje znak

ZDUWRFL IXQNFML
F(x,y)=x2+y2-r2

Z SXQNFLH URGNRZ\P

]D]QDF]RQ\P NU]\*\NLHP

SRPL G]\ SLNVHODPL
kandydatami.

Przyjmi

MP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD Z\QLRV

x

i

x

i

x

i

+ =

1

1

:

przy wyborze lewego piksela kandydata,

przy wyborze prawego piksela kandydata.

yi+1:= yi +1

przy wyborze dowolnego z pikseli kandydatów,

Oznaczenie:

fi := F(xi-

1

2

,yi+1)-

1

4

 = (xi-

1

2

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

1

4

 = xi2 -xi +yi2 +2*yi +1 -r2.

Uwaga:

:DUWRü fi := F(xi-

1

2

,yi+1) - 

1

4

MHVW ]DZV]H ZDUWRFL FDáNRZLW

Kryterium wyboru kolejnego piksela:

F(xi-

1

2

,yi+1)>0  ⇔ fi ≥ 0 ⇒   rysowany lewy piksel kandydat,

F(xi-

1

2

,yi+1)<0  ⇔ fi < 0 ⇒   rysowany prawy piksel kandydat,

F(xi-

1

2

,yi+1)=0  ⇒ rysowany dowolny z pikseli kandydatów -

ten przypadek nigdy nie zajdzie.

background image

39

Pocz

WNRZD ZDUWRü fi:

        

=

+

0

2

2

2

r

y

x

V

V

f0 := F(x0,y0)-

1

4

 = F(xs,ys)-

1

4

 = xs2 -xs +ys2 +2*ys +1 -r2 = 2*ys -xs +1.

0RG\ILNDFMD ZDUWRFL fi:
fi+1-fi := F(xi+1-

1

2

,yi+1+1) - 

1

4

 - F(xi-

1

2

,yi+1) + 

1

4

 =

xi+12 -xi+1 +yi+12 +2*yi+1 +1 -r2 -xi2 +xi -yi2 -2*yi -1 +r2 =

xi+12-xi2-xi+1+xi+yi+12-yi2+2*(yi+1-yi) =

= (xi+1+xi-1)*(xi+1-xi)+(yi+1+yi+2)*(yi+1-yi) =

= (xi+1+xi-1)*(xi+1-xi)+2*yi+3 =

=

+

+

2

3

2

2

5

*

*

*

yi

yi

xi

JG\ Z\EUDQR SUDZ\ SLNVHO
JG\ Z\EUDQR OHZ\ SLNVHO

=

+ +

+ −

+ +

2

1 1

2

1

2

1

1

*

*

*

yi

yi

xi

JG\ Z\EUDQR SUDZ\ SLNVHO
JG\ Z\EUDQR OHZ\ SLNVHO

yi+1 = yi+1
xi+1 = xi
xi
+1 = xi-1

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  f:integer;

xe := xe-xc,  ye := ye-yc,

dla  oktantu nr 1:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye) = 1  then

begin

f := 2*y-x+1;
repeat

plot(x+xcy+yc);
y := y+1;
if  f < 0 then  f := f+2*y+1

else begin x := x-1; f := f+2*(y-x)+1 end

until  Octant(x,y

≠ 1

end

40

Algorytm porównawczy Jordana

Za

áR*HQLH U\VRZDQ\ áXN RNU JX ] RNWDQWX QU  OXE 

'OD WDNLHJR áXNX ND*G\ NROHMQ\ SLNVHO U\VRZDQHJR RGFLQND MHVW VVLDGHP
poprzedniego w kierunku 

Ï, Ñ albo Í.

narysowany

piksel

ostatnio

trzy

piksele

kandydaci

áXN LGHDOQ\

Rys. Kryterium wyboru

kolejnego piksela dla

UR]ZD*DQHJR SU]\SDGNX
rysowany jest ten piksel,

GOD NWyUHJR ZDUWRü

EH]Z]JO GQD ] ZDUWRFL
funkcji F(x,y)=x2+y2-r2

Z URGNX WHJR SLNVHOD MHVW
najmniejsza.

3U]\MPLMP\ *H RVWDWQLR QDU\VRZDQ\ SLNVHO PD ZVSyáU] GQH xiyi.

:yZF]DV ZVSyáU] GQH NROHMQHJR SLNVHOD PRJ Z\QLHü

1.

xi+1:= xi - 1
yi+1:= yi

przy wyborze lewego piksela kandydata,

2.

xi+1:= xi
yi
+1:= yi +1

przy wyborze górnego piksela kandydata,

3.

xi+1:= xi - 1
yi+1:= yi +1

przy wyborze lewego górnego piksela kandydata.

Oznaczenia:

f := F(xi,yi),

F(x0,y0) = F(xs,ys) = 0,

f1 := F(xi-1,yi) = -2*xi +1,
f2 := F(xi,yi+1) = f +2*yi +1,
f3 := F(xi-1,yi+1) = f -2*xi +2*yi +2.

|f1|<|f2| & |f1|<|f3|   ⇒ wybór lewego piksela kandydata,
|f2|<|f1| & |f2|<|f3|   ⇒ wybór górnego piksela kandydata,
|f3|<|f1| & |f3|<|f2|   ⇒ wybór lewego górnego piksela kandydata,
|f1|<|f2| & |f1|=|f3|   ⇒ wybór lewego lub lewego górnego piksela,
|f2|<|f1| & |f2|=|f3|   ⇒ wybór górnego lub lewego górnego piksela,

w al

JRU\WPLH SU]\M WR Z\EyU OHZHJR JyUQHJR

background image

41

3RQLHZD* f2 ≥ f3 ≥ f1 ZL F
|f1|<|f2| & |f1|<|f3|  ⇔  |f1|<|f3|   ⇒

wybór lewego piksela kandydata,

|f2|<|f1| & |f2|<|f3|  ⇔  |f2|<|f3|   ⇒

wybór górnego piksela kandydata,

Z SR]RVWDá\FK SU]\SDGNDFK Z\EyU OHZHJR JyUQHJR SLNVHOD NDQG\GDWD

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  f1, f2, f3:integer;

xe := xe-xc,  ye := ye-yc,

dla  oktantu nr 1 lub 2:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye) in [1, 2]  then

begin

f1 := -2*x+1;
repeat

plot(x+xcy+yc);
f3 := f1+2*y+1;

f2 := f3+2*x-1;

if |f1| < |f3| then  begin x := x-1; f1 := f1-2*x+1 end
else if |f2| < |f3| then  begin y := y+1; f1 := f2-2*x+1 end
else  begin x := x-1; y := y+1; f1 := f3-2*x+1 end

until  not (Octant(x,y) in [1, 2])

end

3RQLHZD* f2 ≥ f3 ≥ f1 ZL F
|f1|<|f3|  ⇔  -f1<f3   ⇒ wybór lewego piksela kandydata,
|f2|<|f3|  ⇔  f2<-f3   ⇒ wybór górnego piksela kandydata,

Z SR]RVWDá\FK SU]\SDGNDFK Z\EyU OHZHJR JyUQHJR SLNVHOD NDQG\GDWD

parametry procedury:  xyxeyexcyc:integer;

x := xs-xc,  y := ys-yc,

zmienne procedury:  f1, f2, f3:integer;

xe := xe-xc,  ye := ye-yc,

dla  oktantu nr 1 lub 2:

xc := xc,  yc := yc.

if  StartOctant(x,y,xe,ye) in [1, 2]  then

begin

f1 := -2*x+1;
repeat

plot(x+xcy+yc);
f3 := f1+2*y+1;

f2 := f3+2*x-1;

if f3 < -f1 then  begin y := y+1; f1 := f3 end;
if -f3 f2 then  begin x := x-1; f1 := f1-2*x+1 end

until  not (Octant(x,y) in [1, 2])

end

42

2NUJ

$E\ QDU\VRZDü SHáHQ RNUJ R URGNX  xc,yc) i
promieniu r

Z\VWDUF]\ GRNRQDü REOLF]H MHG\QLH GOD

jednego oktantu (np. nr 1). Otrzymane dla tego

RNWDQWX ZVSyáU] GQH xSR]ZDODM Z\]QDF]\ü

SLNVHOH RNU JX ]H ZV]\VWNLFK RPLX RNWDQWyZ (x,y),
(y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y).

1

2

3

4

5

6

7

8

Elipsa

$E\ QDU\VRZDü SHáQ HOLSV  R URGNX  xc,yc) i

SyáRVLDFK p i Z\VWDUF]\ GRNRQDü REOLF]H GOD

MHGQHM üZLDUWNL F]\OL GOD GZyFK RNWDQWyZ  QS QU

 L   2WU]\PDQH GOD WHM üZLDUWNL ZVSyáU] GQH x,
y

SR]ZDODM Z\]QDF]\ü SLNVHOH HOLSV\ ]H

ZV]\VWNLFK üZLDUWHN (x,y), (-x,y), (-x,-y), (x,-y).

1

2

3

4

5

6

7

8

3U]\NáDGRZ\ DOJRU\WP U\VRZDQLD HOLSV\  DOJRU\WP .DSSHOD

procedure Ellipse(xcycpq: integer);
var xy: integer;  ppqqpp2, qq2, ffxfy: longint;
begin

x := p;

y := 0;

pp := p*p;

qq := q*q;

pp2 := 2*pp;

qq2 := 2*qq;

f := pp - p*qq + qq div 4;

fx := qq2*p;

fy := 0;

while  fx > fy  do

{oktant nr 1 (oraz nr 4, 5, 8)}

begin

plot(x+xcy+yc);

plot(-x+xcy+yc);

plot(-x+xc, -y+yc); plot(x+xc, -y+yc);
y := y+1;

fy := fy+pp2;

if  f < 0  then  f := f+fy+pp
else  begin  x := x-1;  fx := fx-qq2;  f := f-fx+fy+pp  end

end;

f := f - (fx+fy) div 2 + qq - pp - (qq-pp) div 4;
repeat

{oktant nr 2 (oraz nr 3, 6, 7)}

plot(x+xcy+yc);

plot(-x+xcy+yc);

plot(-x+xc, -y+yc); plot(x+xc, -y+yc);
x := x-1;

fx := fx-qq2;

if  f > 0  then  f := f-fx+qq
else  begin  := y+1;  fy := fy+pp2;  f := f-fx+fy+qq  end

until  x < 0

end

background image

43

Znajdowanie konturu

Konturem danego zbioru pikseli nazywamy zbiór wszystkich pikseli

QDOH*F\FK GR WHJR ]ELRUX L PDMF\FK SU]\QDMPQLHM MHGQHJR EVVLDGD QLH

QDOH*FHJR GR WHJR ]ELRUX

Znajdowanie wszystkich konturów dowolnego zbioru pikseli:
procedura AllContourTracing.

:\V]XNDQLH VSRUyG ZV]\VWNLFK SLNVHOL ]ELRUX W\FK NWyUH PDM

SU]\QDMPQLHM MHGQHJR EVVLDGD QLH QDOH*FHJR GR WHJR ]ELRUX

Znajdowanie pojedynczego konturu spójnego podzbioru zbioru pikseli:
procedura ContourTracing.

6WRSQLRZH Z\V]XNLZDQLH  SRF]ZV]\ RG ZVND]DQHJR SLNVHOD  SLNVHOL

NRQWXUX SRSU]H] DQDOL]  VVLHG]WZD NROHMQR ]QDMGRZDQ\FK SLNVHOL NRQWXUX

piksel

konturu

piksel

spoza

zbioru

1

2

3

4

5

6

7

5\V 3U]\NáDGRZ\ ]ELyU

pikseli i jego kontur.

5\V .ROHMQRü SU]HJOGDQLD VVLDGyZ SLNVHOD

NRQWXUX Z FHOX ]QDOH]LHQLD QDVW SQHJR
piksela konturu.

44

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour); }

procedure AllContourTracing;
var x,y: coordinate;
begin

for x:=minx to maxx do

for y:=miny to maxy do

if  pixel[x,y]

HPSW\ then

if (pixel[x–1,y]=empty) or

(pixel[x+1,y]=empty) or
(pixel[x,y–1]=empty) or
(pixel[x,y+1]=empty) then  pixel[x,y]:=contour

end;

procedure neighbour(var nx,ny:coordinate; x,y:coordinate; s:direction);
begin

case s of

0: begin  nx:=x+1;  ny:=y

 end;

1: begin  nx:=x+1;  ny:=y–1   end;
2: begin  nx:=x;

 ny:=y–1   end;

3: begin  nx:=x–1;  ny:=y–1   end;
4: begin  nx:=x–1;  ny:=y

 end;

5: begin  nx:=x–1;  ny:=y+1  end;
6: begin  nx:=x;

 ny:=y+1  end;

7: begin  nx:=x+1;  ny:=y+1  end

end

end;

background image

45

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour); }

procedure ContourTracing(bx,by:coordinate; bs:direction);
varx,y,nx,ny: coordinate;

s: direction;

begin

^ NRQWUROD Z\PDJD VWDZLDQ\FK SU]HG GDQ\PL SRF]WNRZ\PL `
if pixel[bx,by]

LQWHULRU then exit; { punkt (bx,by  QLH QDOH*\ GR ]ELRUX `

bs:= bs mod 8 - bs mod 2;
neighbour(nx,ny,bx,by,bs);
if pixel[nx,ny]

HPSW\ then exit ^ VVLDG SXQNWX  bx,by  QDOH*\ GR ]ELRUX `

^ Z\]QDF]HQLH NRFRZHJR NLHUXQNX EVVLDGD  SR REHMFLX NRQWXUX  `
s:=bs;
repeat

bs:= (bs+7) mod 8;
if bs=s then

begin

pixel[bx,by]:=contour;
exit

^ QLH PD VVLDGyZ QDOH*F\FK GR ]ELRUX  ]ELyU MHGQRSXQNWRZ\ `

end;

neighbour(nx,ny,bx,by,bs)

until pixel[nx,ny]

HPSW\

if  odd(bs)  then  bs:= (bs+1) mod 8  else  bs:= (bs+2) mod 8;

{ znajdowanie konturu }
x:=bx;  y:=by;
repeat

pixel[x,y]:=contour;
repeat

s:= (s+1) mod 8;
neighbour(nx,ny,x,y,s)

until pixel[nx,ny]

HPSW\

x:=nx;  y:=ny;
if  odd(s)  then  s:= (s+5) mod 8  else  s:= (s+6) mod 8

until (x=bx) and (y=by) and (s=bs)

end;

46

:\SHáQLDQLH NRQWXUX

0HWRG\ Z\SHáQLDQLD NRQWXUX

0HWRGD Z\SHáQLDQLD NRQWXUX ] NRQWURO SDU]\VWRFL -

Z\SHáQLDQLH ZV]\VWNLFK NRQWXUyZ SURFHGXUD $OO&RQWRXU)LOOLQJ

3U]HJOGDQLH ZV]\VWNLFK SLNVHOL REUD]X NROHMQ\PL OLQLDmi poziomymi.

:\NU\FLH QLHSDU]\VWHM OLF]E\ SU]HFL ü NRQWXUX ] ]DGDQ OLQL SR]LRP

QD OHZR RG GDQHJR SLNVHOD R]QDF]D *H QDOH*\ RQ GR ZQ WU]D ]ELRUX

$E\ Z\NU\ü IUDJPHQW\ NRQWXUX VW\F]QH GR OLQLL SR]LRP\FK QDOH*\ GOD

ND*GHM OLQLL SR]LRPHM SU]HDQDOL]RZDü OLQLH GR QLHM VVLHGQLH -HOL Z

MHGQHM ] OLQLL VVLHGQLFK  JyUQHM DOER GROQHM  Z VVLHG]WZLH Z\NU\WHJR

IUDJPHQWX NRQWXUX QLH PD *DGQHJR SLNVHOD NRQWXUX WR MHVW WR IUDJPHQW
konturu styczny do linii poziomej.

5\V 3U]\NáDGRZ\

kontur. Fragmenty
konturu styczne do
linii poziomych nie

SRZLQQ\ E\ü
traktowane jako

SU]HFL FLD NRQWXUX ]
liniami poziomymi.

5\V 3U]\NáDGRZ\ NRQWXU

dla którego
procedura
AllContourFilling

]DV\JQDOL]XMH EáG

'RSLHUR XVXQL FLH
z tego konturu
pikseli oznaczonych

NU]\*\NDPL

XPR*OLZL

SUDZLGáRZH Z\NR
nanie tej procedury.

background image

47

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour); }

procedure AllContourFilling;
var x,y: coordinate; above,below: integer; oddintsect: Boolean;
begin

for y:=miny to maxy do

begin

oddintsect:=false;
x:=minx;
while x

”maxx do

if pixel[x,y]

FRQWRXU

then

begin

if oddintsect then pixel[x,y]:=interior;
x:=x+1

end

else

begin

if (pixel[x-1,y-1]=contour) or (pixel[x,y-1]=contour)

then  above:=1 else  above:=0;

if (pixel[x-1,y+1]=contour) or (pixel[x,y+1]=contour)

then  below:=1 else  below:=0;

repeat

if (pixel[x+1,y-1]=contour) and (pixel[x,y-1]

FRQWRXU

then  above:=above+1;

if (pixel[x+1,y+1]=contour) and (pixel[x,y+1]

FRQWRXU

then  below:=below+1;

x:=x+1;

until (pixel[x,y]

FRQWRXU  or (x•maxx);

if odd(above) and odd(below)  then oddintsect:= not oddintsect;
if odd(above

 RGG below) then HUURU ^ Eá GQD V\WXDFMD `

end

end

end;

48

0HWRGD Z\SHáQLDQLD NRQWXUX SU]H] VSyMQRü (przez sianie) -

Z\SHáQLDQLH ]DGDQHJR NRQWXUX SURFHGXU\ )LOO L &RQWRXU)LOOLQJ

3U]HJOGDQLH ZH ZV]\VWNLFK NLHUXQNDFK SRF]ZV]\ RG ]DGDQHJR SLNVHOD

W]Z ]LDUQD  NROHMQ\FK EVVLDGyZ D* GR RVLJQL FLD NRQWXUX

procedure Fill(xy: Integer); { xy

 ZVSyáU] GQH ]LDUQD `

begin

if  pixel[x,y] = empty  then

begin

pixel[x,y] := interior;
Fill(x+1,y);   Fill(x,y-1);   Fill(x-1,y);   Fill(x,y+1)

end

end

0

1

2

3

4

5

6

7

8

9

10

11

0

1

2

3

2

3

4

5

6

6

7

8

x

y

3URFHGXUD )LOO QLH MHVW HIHNW\ZQD JG\* GOD ND*GHJR SLNVHOD MHVW

Z\NRQ\ZDQH RVREQH Z\ZRáDQLH SU]H] FR V]\ENR URQLH SR]LRP

UHNXUHQFML  SURZDG]F Z SUDNW\FH GR SU]HSHáQLHQLD VWRVX 

2 ZLHOH U]DG]LHM GR UHNXUHQFML RGZRáXMH VL  SURFHGXUD &RQWRXU)LOOLQJ

2

3

10 11

8

7

6

1

4

0

5

9

0

0

0

0

1

1

1

1

1

0

0

1

x

y

5\V :\SHáQLHQLH

SU]\NáDGRZHJR NRQ

WXUX Z\ZRáDQLHP
procedury Fill(x,y)

ELDáH OLF]E\

R]QDF]DM NROHMQRü
czarne cyfry - poziom
rekurencji).

5\V :\SHáQLHQLH

SU]\NáDGRZHJR NRQ

WXUX Z\ZRáDQLHP
procedury
ContourFilling(x,y)

ELDáH OLF]E\

R]QDF]DM NROHMQRü
czarne cyfry - poziom
rekurencji).

background image

49

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour); }

procedure ContourFilling(x,y: coordinate);

procedure filling(x,y: coordinate; dy: integer);
var ax,ay,bx,by: coordinate; afind,bfind: Boolean;
begin

if pixel[x,y]=empty  then

repeat

ax:=x;  ay:=y+dy;
bx:=x;  by:=y-dy;
while pixel[ax,ay]=empty do ax:=ax-1;
if ax

x then ax:=ax+1;

while pixel[bx,by]=empty do bx:=bx-1;
if bx

x then bx:=bx+1;

afind:=pixel[ax,ay]=empty;
bfind:=pixel[bx,by]=empty;
pixel[x,y]:=interior;
x:=x+1;
while pixel[x,y]=empty do

begin pixel[x,y]:=interior;

if (pixel[x,ay]=empty) and (pixel[x-1,ay]

HPSW\

then

begin if afind

then filling(ax,ay,dy)
else afind:=true;

ax:=x

end;

if (pixel[x,by]=empty) and (pixel[x-1,by]

HPSW\

then

begin if bfind

then filling(bx,by,-dy)
else bfind:=true;

bx:=x

end;

x:=x+1

end;

if afind and bfind then filling(ax,ay,dy);
if bfind

 then begin x:=bxy:=bydy:=-dy end
 else begin x:=axy:=ay end

until not (afind or bfind)

end;

begin

if pixel[x,y]

HPSW\ then exit;

repeat x:=x-1 until pixel[x,y]

HPSW\

x:=x+1;
filling(x,y,1)

end;

50

FLHQLDQLH NV]WDáWyZ

1D SáDV]F]\(QLH HXNOLGHVRZHM
Definicja:

Szkieletem Sk

Ω zbioru Ω QD]\ZDP\ ]ELyU SXQNWyZ R QDVW SXMFHM

ZáDVQRFL

P

P

A

B

A

B

AP

BP

C

CP

AP

∃ ∈

∃ ∈


=

∀ ∈

Sk

Fr

Fr

Fr


1D SáDV]F]\(QLH G\VNUHWQHM
Definicja:

Piksel konturu nazywamy powtarzalnym

 JG\ VSHáQLD RQ SU]\QDMPQLHM

jeden z trzech warunków:

1.

Z\VW SXMH FR QDMPQLHM GZXNURWQLH Z GURJDFK RSLVXMF\FK NRQWXU

2.

QLH PD VVLDGyZ ZHZQWU] REV]DUX RWRF]RQHJR NRQWXUHP

3.

PD FR QDMPQLHM MHGQHJR EVVLDGD ] NRQWXUX NWyU\ QLH VVLDGXMH ] QLP

Z FLJX SLNVHOL VWDQRZLF\P GURJ  RSLVXMF NRQWXU

Definicja:

Szkieletem danego zbioru pikseli jest zbiór pikseli, otrzymany w wyniku

F\NOLF]QHJR RGU]XFDQLD SLNVHOL NRQWXUX QLH E GF\FK SLNVHODPL SRZWDU]DOQ\PL

Szkieletem jest zatem zbiór otrzymany w wyniku wykonania algorytmu:

repeat

]QDOH]LHQLH NRQWXUX L XVXQL FLH ]H ]ELRUX W\FK SLNVHOL NRQWXUX

NWyUH QLH V SLNVHODPL SRZWDU]DOQ\PL

until

QLH XVXQL WR *DGQHJR SLNVHOD

:DUXQNL Z\VW SXMFH Z GHILQLFML SLNVHOL SRZWDU]DOQ\FK NRQWXUX PR*QD

RSLVDü Z]RUFDPL VVLHG]WZ

A A A

A A A

5\V :]RUFH RGSRZLDGDMFH

A A C

X

A X

pierwszemu (

Å) i trzeciemu

*)

X K

B B B

A

B

(

Æ) warunkowi.

B B C

0

°

 90

°

0

°

 90

°

 180

°

 270

°

 JG\ QLH V VSHáQLRQH SR]RVWDáH ZDUXQNL

0

°

 90

°

 180

°

 270

°

X - piksel powtarzalny konturu;

K - piksel konturu;

A, B, C - grupa pik

VHOL R]QDF]RQ\FK W VDP OLWHU PD W  ZáDVQRü L* FR

QDMPQLHM MHGHQ ] QLFK QDOH*\ GR ]ELRUX MHOL RED SLNVHOH & QDOH* GR

]ELRUX  RVWDWQL Z]RU]HF  WR SU]\QDOH*QRü SLNVHOL $ L % MHVW GRZROQD

%DGDQLH SRZWDU]DOQRFL Z\Paga zatem jedynie sprawdzenia

QDMEOL*V]HJR VVLHG]WZD SLNVHOD NRQWXUX

3RGHMFLH ZJ GHILQLFML  DOJRU\WP FLHQLDQLD SURFHGXUD 'HI7KLQQLQJ

3RGHMFLH XSURV]F]RQH  DOJRU\WP NODV\F]Q\ FLeniania: procedura Thinning.

background image

51

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour, skeleton); }

procedure DefThinning;

^ FLHQLDQLH QD SRGVWDZLH GHILQLFML V]NLHOHWX `

var x,y,nx,ny: coordinate;  e,i,m: byte;  s: direction;  finishpattern: Boolean;
begin

repeat

finish:=true;
AllContourTracing;
for y:=miny to maxy do  for x:=minx to maxx do  if pixel[x,y]=contour then

begin

e:=0;  i:=0;  m:=0;
for s:=0 to 7 do

{ konstrukcja wzorców }

begin

e:=e shl 1;  i:=i shl 1;  m:=m shl 1;
neighbour(nx,ny,x,y,s);
if pixel[nx,ny]=empty

then  e:=e or 1
else

begin i:=i or 1;

if pixel[nx,ny]

LQWHULRU then  m:=m or 1

end

end;

{

Ë NRQWUROD  ZDUXQNX SRZWDU]DOQRFL `

pattern:=(i=m) or {

È NRQWUROD  ZDUXQNX SRZWDU]DOQRFL `

(((i and $70)

  and ((i and $07)  and ((e and $88)=$88)) or

(((i and $1C)

  and ((i and $C1)  and ((e and $22)=$22)) or

(((i and $01)

  and ((i and $7C)  and ((e and $82)=$82)) or

(((i and $40)

  and ((i and $1F)  and ((e and $A0)=$A0)) or

(((i and $10)

  and ((i and $C7)  and ((e and $28)=$28)) or

(((i and $04)

  and ((i and $F1)  and ((e and $0A)=$0A)) or

{

È NRQWUROD  ZDUXQNX SRZWDU]DOQRFL `

(((i and $41)

  and ((m and $80)  and ((e and $08)  and

 (((e and $41)=0) or (((i and $30)

  and ((i and $06)  or

(((i and $05)

  and ((m and $02)  and ((e and $20)  and

 (((e and $05)=0) or (((i and $C0)

  and ((i and $18)  or

(((i and $14)

  and ((m and $08)  and ((e and $80)  and

 (((e and $14)=0) or (((i and $03)

  and ((i and $60)  or

(((i and $50)

  and ((m and $20)  and ((e and $02)  and

 (((e and $50)=0) or (((i and $0C)

  and ((i and $81) 

if pattern  then pixel[x,y]:=skeleton  else finish:=false

end;

for y:=miny to maxy do  for x:=minx to maxx do

if pixel[x,y]=contour  then pixel[x,y]:=empty
else  if not finish and (pixel[x,y]=skeleton)  then pixel[x,y]:=interior

until finish;
for y:=miny to maxy do  for x:=minx to maxx do

if pixel[x,y]=interior  then pixel[x,y]:=skeleton

end;

52

{ var pixel: array[minx..maxxminy..maxy] of (empty, interior, contour, skeleton); }
procedure Thinning;
var x,y,nx,ny: coordinate; q,r,s: direction; finishpatternfirstsecond: Boolean;
begin

repeat

finish:=true;  s:=0;
repeat

for y:=miny to maxy do  for x:=minx to maxx do

if pixel[x,y]=interior  then

begin neighbour(nx,ny,x,y,s);

if pixel[nx,ny]=empty  then

begin pattern:=false;

r:=(s+2) mod 8;
repeat

neighbour(nx,ny,x,y,r);
if pixel[nx,ny]=empty  then

begin first:=false;  second:=false;

q:=(s+1) mod 8;
repeat

neighbour(nx,ny,x,y,q);
if pixel[nx,ny]

HPSW\ then first:=true;

q:=(q+1) mod 8

until (q=r) or first;
q:=(r+1) mod 8;
repeat

neighbour(nx,ny,x,y,q);
if pixel[nx,ny]

HPSW\ then second:=true;

q:=(q+1) mod 8

until (q=s) or second;
pattern:= first and second

end;

r:=(r+2) mod 8

until (r=s) or pattern;
if pattern  then pixel[x,y]:=skeleton

 else pixel[x,y]:=contour

end

end;

for y:=miny to maxy do  for x:=minx to maxx do

if pixel[x,y]=contour  then

begin pixel[x,y]:=empty;

finish:=false

end;

s:=(s+2) mod 8

until s=0

until finish

end;

background image

53

12

12

12

13

123

2

2

2

3 3

1

1

2

2

3

12

23

5\V 3U]\NáDGRZD ILJXUD L SLNVHOH MHM

konturu z zaznaczonymi
pikselami powtarzalnymi.

&\IU\ ZVND]XM ZDUXQHN
definicji, z którego wynika

SRZWDU]DOQRü SLNVHOD NRQWXUX

2

- piksel figury

- piksel konturu

- piksel powtarzalny konturu

1 1 1
1 2 2 1

1 2

3 3

2 1

1 2

3

2

3

2 1

1

2 2

1 2

3

2 1

1

2 2

1

1

2 2

1

1

2

1

1

2 2

1

1

2 2

1

1

2 2

1

1

2 2

1

1

2

1

1 2

3 3

2 1 1 1 1

2 3

2 1

5\V 3U]\NáDGRZD ILJXUD L HIHNW MHM

FLHQLHQLD  V]NLHOHW  MDNR ]ELyU
otrzymany w wyniku cyklicznego
odrzucania punktów konturu nie

E GF\FK SXQNWDPL SRZWDU]DO
nymi (wg definicji szkieletu) –
procedura DefThinning. Cyfry

ZVND]XM HWDS\ SRGF]DV NWyU\FK

GDQ\ SLNVHO QDOH*\ GR NRQWXUX

1 2

3

2

2 2 2 2 2 2 3

2 1

1

2 2

1 1 1 1 1 1 1

2 2

1

1

2 2

1

1

2

1

- piksele figury

1

2 2

1

1

2 2

1

1 1 1

1 1 1

- piksele szkieletu

3 4 1
3 5 4 1

3 4

7

5 4 1

3 4

6

6

6

5 1

3

5

2 2 3

5

4 1

3

4

2 1

2 3

5

1

3

5

1

3

5

4 1

3 4

5

1

2 3

5

1

3

7

5 1

3

5

1

3 4

7

5 4 4 4 4 4 4

5

4 1

5\V 3U]\NáDGRZD ILJXUD L HIHNW MHM

FLHQLHQLD  V]NLHOHW  MDNR ]ELyU
otrzymany w wyniku wykonania

DOJRU\WPX NODV\F]QHJR FLHQLDQLD

D ZL F QLH ZJ GHILQLFML V]NLHOHWX
– procedura Thinning. Cyfry

ZVND]XM NROHMQRü DQDOL]\
pikseli jako konturu.

3

7

6

6 6 6 6 6 6 6 6

5 1

3

5

2 2 2 2 2 2 2 2 3

5

1

3 4

5

1

3 5 1

- piksele figury

3 5 2 1

2 3 4 1

2 2 1

2 2 1

- piksele szkieletu

54

Filtracja

Filtry liniowe  -

RSLV\ZDQH PDFLHU]DPL RNUHODMF\PL ZSá\Z SLNVHOD L MHJR

 

VVLDGyZ QD QRZ ZDUWRü  F]\OL NRORU  SLNVHOD

)LOWU\ GROQRSU]HSXVWRZH ± XVXZDQLH V]F]HJyáyZ UR]P\ZDQLH REUD]X

H

I

H

I

H

I

H

I

G 1 1 1 G

G 1 1 1 G

G 1 2 1 G

G 1 1 1 G

G 1 1 1 G

G 1 2 1 G

G 2 4 2 G

G 1 0 1 G

G 1 1 1 G

G 1 1 1 G

G 1 2 1 G

G 1 1 1 G

J

K

J

K

J

K

J

K

Filtry górnoprzepustowe – w

\NU\ZDQLH NUDZ G]L Z\RVWU]DQLH REUD]X

 

H

I

 

H

I

 

G   0   0   0 G

 

G   0   0   0 G

gradient Robertsa

 

G -1  0  0 G

 

G   0   0 -1 G

 

G   0   1   0 G

 

G   0   1   0 G

 

J

K

 

J

K

 

H

I

 

H

I

 

G -1 -1 -1 G

 

G -1  0  1 G

maska Prewitta

 

G   0   0   0 G

 

G -1  0  1 G

 

G   1   1   1 G

 

G -1  0  1 G

 

J

K

 

J

K

 

H

I

 

H

I

 

H

I

 

G -1 -2 -1 G

 

G -1  0  1 G

 

G -2 -1  0 G

maska Sobela

 

G   0   0   0 G

 

G -2  0  2 G

 

G -1  0  1 G

 

G   1   2   1 G

 

G -1  0  1 G

 

G   0   1   2 G

 

J

K

 

J

K

 

J

K

 

H

I

 

H

I

 

H

I

 

G -1 -1  1 G

 

G -1  1  1 G

 

G -5 -5  3 G

wykrywanie

 

G -1 -2  1 G

 

G -1 -2  1 G

 

G -5  0  3 G

QDUR*QLNyZ

 

G   1   1   1 G

 

G -1  1  1 G

 

G   3   3   3 G

 

J

K

 

J

K

 

J

K

 

H

I

 

H

I

 

H

I

 

G   0 -1   0 G

 

G -1 -1 -1 G

 

G   1 -2   1 G

laplasjan

 

G -1  4 -1 G

 

G -1  8 -1 G

 

G -2  4 -2 G

 

G   0 -1   0 G

 

G -1 -1 -1 G

 

G   1 -2   1 G

 

J

K

 

J

K

 

J

K

Filtry nieliniowe

NRPELQRZDQH Z\NU\ZDMFH NUDZ G]LH
(np. pierwiastek sumy kwadratów pionowej i poziomej maski Prewitta)

medianowy, maksymalny, minimalny

operacje logiczne

adaptacyjne

3U]HNV]WDáFHQLD PRUIRORJLF]QH

(UR]MD ± RGU]XFHQLH SLNVHOL ]ELRUX VVLDGXMF\FK ] SLNVHODPL spoza zbioru.

'\ODWDFMD ± GRGDQLH SLNVHOL VSR]D ]ELRUX VVLDGXMDF\FK ] SLNVHODPL ]ELRUX

background image

55

3U]HNV]WDáFHQLD Z SU]HVWU]HQL GZXZ\PLDURZHM

8NáDG\ ZVSyáU] GQ\FK

GZXZ\PLDURZH NDUWH]MDVNL x,y i biegunowy r3

y

x

X

Y

y

x

X

Y

r

ϕ

r

ϕ

x   r

y   r

  =     cos

  =     sin

*

*

ϕ

ϕ

5\V 3UDZRVNU WQ\ L OHZRVNU WQ\ GZXZ\PLDURZ\ XNáDG ZVSyáU] GQ\FK

3RGVWDZRZH SU]HNV]WDáFHQLD OLQLRZH Z SU]HVWU]HQL
dwuwymiarowej:

SU]HVXQL FLH  WUDQVODFMD  R ZHNWRU b:

p' = I * p + b

gdzie 

=

1

0

0

1

I

REUyW ZRNyá SXQNWX R NW 3

p' = D * p + (I - D) * q

gdzie 

ϕ

ϕ

ϕ

ϕ

=

cos

sin

sin

cos

D

MHGQRNáDGQRü R VNDOL Z]JO GHP SXQNWX qp' = k * I * p + (1 - k) * q

V\PHWULD URGNRZD Z]JO GHP SXQNWX q:

p' = -I * p + 2 * q

V\PHWULD RVLRZD Z]JO GHP SURVWHM q

1

q

2

:

p' = G * p + h

+

=

2

1

2

2

1

2

1

2

*

1

2

*

1

2

*

1

2

*

2

1

2

2

1

2

2

1

2

2

1

2

)

(

)

(

)

(

)

(

2

)

(

)

(

2

)

(

)

(

)

(

)

(

1

x

x

y

y

y

y

x

x

y

y

x

x

y

y

x

x

y

y

x

x

G

,

=

=

+

=

2

2

2

1

1

1

1

2

1

2

2

1

2

2

1

2

2

*

1

1

*

2

*

 ,

  

czym

przy 

   

,

)

(

)

(

)

(

)

(

2

y

x

y

x

x

x

y

y

y

y

x

x

y

x

y

x

q

q

h

;

dla osi x=a

=

−

=

0

2

 

,

1

0

0

1

*

a

h

G

;  dla osi y=b

=

=

b

*

2

0

 

,

1

0

0

1

h

G

=

=

y

x

y

x

p

p

 

,

'

'

'

56

3U]HNV]WDáFHQLD Z SU]HVWU]HQL WUyMZ\PLDURZHM

8NáDG\ ZVSyáU] GQ\FK

WUyMZ\PLDURZH NDUWH]MDVNL x,y,z; sferyczny R3, L F\OLQGU\F]Q\ r3z.

y

x

X

Y

y

x

X

Y

r

ϕ

r

ϕ

x   r

y   r

  =     cos

  =     sin

*

*

ϕ

ϕ

Z

Θ

R

Θ

R

Z

z

z

x   R

  =     cos     sin

 *

ϕ

y   R

  =     sin      sin

 *

ϕ

z   R

  =     cos

 *

Θ

Θ
Θ

 *

 *

5\V 3UDZRVNU WQ\ L OHZRVNU WQ\ WUyMZ\PLDURZ\ XNáDG ZVSyáU] GQ\FK

3RGVWDZRZH SU]HNV]WDáFHQLD OLQLRZH Z SU]HVWU]HQL WUyMZ\PLDURZHM

SU]HVXQL FLH  WUDQVODFMD  R ZHNWRU b:

p' = I * p + b

gdzie 

=

1

0

0

0

1

0

0

0

1

I

=

=

z

y

x

z

y

x

p

p

 

,

'

'

'

'

REUyW ZRNyá SXQNWX q:

p' = D * p + (I - D) * q

gdzie 

=

zz

zy

zx

yz

yy

yx

xz

xy

xx

d

d

d

d

d

d

d

d

d

D

MHGQRNáDGQRü R VNDOL Z]JO GHP SXQNWX qp' = k * I * p + (1 - k) * q

U]XW RUWRJRQDOQ\ QD SáDV]F]\]Q  z=a:

p' = F * p + h

gdzie 

=

=

a

0

0

   

,

0

0

0

0

1

0

0

0

1

h

F

=

0

0

0

z

y

x

q

3U]\NáDG SU]HNV]WDáFHQLD QLHOLQLRZHJR Z SU]HVWU]HQL WUyMZ\PLDURZHM

rzut perspektywiczny z punktu q

QD SáDV]F]\]Q  z=a:

przy czym:  d

uv

 FRV .

uv

 ,

.

uv

 NW SRPL G]\ REUD]HP RVL L RVL v

h

q

q

p

F

p

+





+

=

)

(

'

*

0

0

*

z

z

a

z

background image

57

3RáR*HQLH RELHNWyZ JHRPHWU\F]Q\FK Z]JO GHP VLHELH

F

ij

(x,y) := (y

i

-y

j

)*x - (x

i

-x

j

)*y + x

i

*y

j

 - x

j

*y

i

,

P

k

 := (x

k

,y

k

).

UyZQDQLH SURVWHM SU]HFKRG]FHM SU]H] SXQNW\ P

1

P

2

: F

12

(x,y) = 0.

GOD SXQNWyZ SR SUDZHM VWURQLH SURVWHM  SDWU]F ] SXQNWX P

1

Z VWURQ  SXQNWX

P

2

): F

12

(x,y) < 0, dla punktów po lewej stronie: F

12

(x,y) > 0.

UyZQDQLH SURVWHM SURVWRSDGáHM SU]HFKRG]FHM SU]H] SXQNW P

0

:

(x

1

-x

2

)*x + (y

1

-y

2

)*y - (x

1

-x

2

)*x

0

 - (y

1

-y

2

)*y

0

 = 0.

dwa odcinki  P

1

P

2

  i  P

3

P

4

SU]HFLQDM VL  ⇔

sgn(F

12

(x

3

,y

3

)) 

≠ sgn(F

12

(x

4

,y

4

))    &    sgn(F

34

(x

1

,y

1

)) 

≠ sgn(F

34

(x

2

,y

2

)).

SRáR*HQLH SXQNWX Q = (x,y  Z]JO GHP ZLHORNWD

SURVWRNW R ERNDFK UyZQROHJá\FK GR RVL x

min

xx

max

  &  y

min

yy

max

.

ZLHORNW Z\SXNá\ R ZLHU]FKRáNDFK XSRU]GNRZDQ\FK ]JRGQLH ] UXFKHP
wskazówek zegara P

1

P

2

,... P

n

:   

i∈{1,2,..n}   F

i(i mod n + 1)

(x,y) < 0.

ZLHORNW GRZROQ\ R ZLHU]FKRáNDFK XSRU]GNRZanych zgodnie z ruchem
wskazówek zegara P

1

P

2

,... P

n

:

SRG]LDá QD ZLHORNW\ Z\SXNáH

NRQWUROD SDU]\VWRFL OLF]E\ SU]HFL ü GRZROQHM SyáSURVWHM Z\FKRG]FHM
z punktu Q  

] ERNDPL ZLHORNWD

REOLF]HQLH VXP\ NWyZ σ := ∑

i=1..

P

i

QP

(i mod n + 1)

    (

σ = 360°  

⇔  QDOH*\ GR ZLHORNWD σ = 0°  ⇔  QLH QDOH*\ GR ZLHORNWD 

SRáR*HQLH RGFLQND Q

1

Q

2

Z]JO GHP ZLHORNWD

SURVWRNW R ERNDFK UyZQROHJá\FK GR RVL

ZLHORNW Z\SXNá\  FR QDMZ\*HM GZD SU]HFL FLD ] ERNDPL ZLHORNWD

SRáR*HQLH ZLHORNWD Z]JO GHP LQQHJR ZLHORNWD  F] ü ZVSyOQD

Definicja:

Punkt P=(x

p

,y

p

SU]HVáDQLD RGFLQHN  SURVW  l MHOL SyáSURVWD SR]LRPD

Z\FKRG]FD ] Z OHZ VWURQ   W]Q y = y

p

x < x

p

) przetnie l.

Definicja:

Odcinek a 

SU]HVáDQLD odcinek b MHOL FR QDMPQLHM MHGHQ ] SXQNWyZ RGFLQND

a

SU]HVáDQLD RGFLQHN L RED RGFLQNL VL  QLH SU]HFLQDM

x

P

P'

l

a

b

c

y

y

x

Rys. Ilustracja

definicji

SU]HVáDQLDQLD

58

Obrazy trójwymiarowe

5HSUH]HQWDFMD RELHNWyZ JUDILF]Q\FK  EU\á L ILJXU 

DQDOLW\F]QD  UyZQRFL QLHUyZQRFL  QS ≤x≤2 &
0

y≤2 & 0≤z≤2 ∨ 0≤x≤1 & 0≤y≤1 & 2≤z≤3.

szkieletow

D  EU\áD  ZLHORFLDQ ILJXUD  ZLHORNW 

QS ZLHU]FKRáNL $   %   &  
D(2,0,0), E(1,1,2), F(0,1,2), G(0,2,2), H(2,2,2), I(2,0,2), J(1,0,2),

.   /   0   1   FLDQ\ $'&% &',+ %&+*
EFGHIJ, EJNM, EMLF, KLMN, ABGFLK, AKNJID.

konstruktywna (ang. constructive solid geometry) (obiekty elementarne +

RSHUDFMH VNáDGDQLD  QS SU]HVNDORZDQ\ R   MHGQRNáDGQRü  V]HFLDQ
jednostkowy (tzn. 0

x≤1 & 0≤y≤1 & 0≤z≤1)  ∪ SU]HVXQL W\  WUDQVODFMD

R ZHNWRU    V]HFLDQ MHGQRVWNRZ\

]D SRPRF GU]HZD yVHPNRZHJR  EU\á\  OXE
czwórkowego (figury); np. dla 0

x≤4 & 0≤y≤4

& 0

z≤4: (0,0,0,0,(0,0,0,0,0,0,1,0),0,1,0).

:LGRF]QRü FLDQ  SRZLHU]FKQLH ]DVáRQL WH

DOJRU\WP\ RSHUXMFH QD SU]HVWU]HQL GDQ\FK

analiza zwrotów wektorów normalnych dla wie

ORFLDQX Z\SXNáHJR

NRQWUROD XSRU]GNRZDQLD ZLHU]FKRáNyZ GOD ZLHORFLDQX Z\SXNáHJR

algorytm Ricciego;

algorytm Appela;

DOJRU\WP\ RSHUXMFH QD SU]HVWU]HQL REUD]X

DOJRU\WP GOD SRZLHU]FKQL ]DGDQHM IXQNFM GZyFK ]PLHQQ\FK

DOJRU\WP ] EXIRUHP Já ERNRFL

DOJRU\WP SU]HJOGDQLD OLQLDPL SR]LRP\PL

5\V 3U]HJOGDQLH U]XWyZ FLDQ OLQLDPL

poziomymi.

DOJRU\WP ] X*\FLHP GU]HZD F]ZyUNRZHJR  ÄG]LHO L ]Z\FL *DM´ 

a)

b)

c)

d)

5\V 0R*OLZH SRáR*HQLD U]XWX FLDQ\ Z]JO GHP SURVWRNWQHJR NDGUX

x

y

z

a)

b)

c)

5\V 3U]HVáDQLDQLH

FLDQ QLH MHVW

UHODFM SU]HFKR

GQL  D E  DQL

DQW\V\PHWU\F]Q
(c).

background image

59

(OLPLQDFMD SRZLHU]FKQL ]DVáRQL W\FK ] X*\FLHP GU]HZD F]ZyUNRZHJR

a)

b)

c)

d)

5\V 0R*OLZH SRáR*HQLD SURVWRNWQHJR NDGUX Z]JO GHP U]XWX FLDQ\

=DáR*HQLD

FLDQ\ SRVRUWRZDQH RG QDMEOL*V]HM GR QDMGDOV]HM Z WDEOLF\ face:
const n

 ^ PDNV\PDOQD OLF]ED FLDQ `

type

SRO\JRQV ^ RSLV NV]WDáWX FLDQ\ `

type faces = array [1..n] of record colour:integer; polygon:polygons end;
var background

 LQWHJHU ^ NRORU WáD `

var face: faces;

7\S Z\OLF]HQLRZ\  PR*OLZH SRáR*HQLD NDGUX Z]JO GHP U]XWX FLDQ\
type location = (outside {a}, inside {b}, other {c,d});

Funkc

MD VSUDZG]DMFD SRáR*HQLH NDGUX Z]JO GHP U]XWX FLDQ\

function Position(x1,y1,x2,y2: integer; var polygon: polygons): location;

3URFHGXUD Z\SHáQLDMFD NDGU GDQ\P NRORUHP
procedure Rectangle(x1, y1, x2, y2, colour: integer);

3URFHGXUD HOLPLQDFML SRZLHU]FKQL ]DVáRQL W\FK

procedure HiddenFace(x1, y1, x2, y2, firstlast: integer; var face: faces);
var  xyi: integer;
begin

if  first < 1  then  first := 1;       if  last > n  then  last := n;
for  i := first  to  last  do

case  Position(x1, y1, x2, y2, face[i].polygon)  of

outside: begin  { nic nie rób }  end;
inside:

begin  { kadr w kolorze i

WHM FLDQ\ `

Rectangle(x1, y1, x2, y2, face[i].colour);
exit {procedure}

end;

other:

begin

^ GDOV]\ SRG]LDá `

x := (x1+x2) div 2;       y := (y1+y2) div 2;
HiddenFace(x1, y1, xyilastface);
HiddenFace(x1, y+1, xy2, ilastface);
HiddenFace(x+1, y1, x2, yilastface);
HiddenFace(x+1, y+1, x2, y2, ilastface);
exit {procedure}

end

end; {case}

Rectangle(x1, y1, x2, y2, background)

end; {procedure}

60

Wyznaczanie cieni

Rys. Wyznaczanie cieni.

dwukrotne
rozstrzyganie
problemu

]DVáDQLDQLD

0RGHORZDQLH RZLHWOHQLD

(UyGáD ZLDWáD SXQNWRZH OLQLRZH SRZLHU]FKQLRZH

odbicia:

Io  QDW *HQLH RZLHWOHQLD >O[@

Rys. Zjawisko odbicia.

n - wersor normalny do powierzchni
l - wersor kierunku padania promieni
z - wersor kierunku odbicia zwierciadlanego
e

 ZHUVRU NLHUXQNX SRáR*HQLD REVHUZDWRUD

rozproszone:

kr*Io*FRV3   kr*Io*(n°l)

zwierciadlane:

kz*Io*cosm.   kz*Io*(z°e)m

m

∈[1,200]

WáR RZLHWOHQLRZH

kt*Io

FDáNRZLWH QDW *HQLH ZLDWáD RGELMDQHJR
I = (kt + kr*(n°l) + kz*(z°e)m) * Io,

Eo  ZLDWáRü *UyGáD ZLDWáD >FG@
r

 RGOHJáRü RG (UyGáD ZLDWáD

&LHQLRZDQLH SRZLHU]FKQL EU\á ZLHORFLHQQ\FK

brak cieniowania

 VWDáD LQWHQV\ZQRü RZLHWOHQLD FLDQ\

HIHNW 0DFKD  VNRNL RZLHWOHQLD QD NUDZ G]LDFK

metoda Gourauda

 LQWHUSRODFMD ZDUWRFL QDW *HQLD ZLDWáD RGELWHJR

Z ZLHU]FKRáNDFK ZLHORFLDQX  ZHUVRU QRUPDOQ\ MHVW UHGQL

DU\WPHW\F]Q ZHUVRUyZ QRUPDOQ\FK FLDQ ]DZLHUDMF\FK ZLHU]FKRáHN

QD NUDZ G]LDFK  OLQLRZD LQWHUSRODFMD QDW *HQLD QD SRGVWDZLH MHJR

ZDUWRFL Z ZLHU]FKRáNDFK E GF\FK NUDFDPL GDQHM NUDZ G]L

ZHZQWU] FLDQ\  OLQLRZD LQWHUSRODFMD QDW *HQLD QD SRGVWDZLH MHJR

ZDUWRFL Z QDMEOL*V]\FK ] ND*GHM VWURQ\ SXQNWDFK NUDZ G]L OH*F\FK QD
tej samej linii poziomej co dany punkt.

metoda Phonga - interpolacja wersorów normalnych;

Z ZLHU]FKRáNDFK ZLHORFLDQX  ZHUVRU QRUPDOQ\ MHVW UHGQL

DU\WPHW\F]Q ZHUVRUyZ QRUPDOQ\FK FLDQ ]DZLHUDMF\FK ZLHU]FKRáHN

QD NUDZ G]LDFK  OLQLRZD LQWHUSRODFMD ZHUVRUyZ QRUPDOQ\Fh na

SRGVWDZLH W\FK*H Z ZLHU]FKRáNDFK E GF\FK NUDFDPL GDQHM NUDZ G]L

ZHZQWU] FLDQ\  OLQLRZD LQWHUSRODFMD ZHUVRUyZ QRUPDOQ\FK QD

SRGVWDZLH W\FK*H Z QDMEOL*V]\FK ] ND*GHM VWURQ\ SXQNWDFK NUDZ G]L

OH*F\FK QD WHM VDPHM OLQLL SR]LRPHM FR GDQ\ SXQNW

OHG]HQLH SURPLHQL  RGWZRU]HQLH GURJL ZV]\VWNLFK SURPLHQL ZLHWOQ\FK

SDGDMF\FK QD GDQ\ SLNVHO

ekran

(UyGáR

ZLDWáD

e

z

n

l

α ϕ ϕ

gdzie 

2

o

o

r

E

I

=

background image

61

Modelowanie krzywych i powierzchni

Modelowanie krzywych:

krzywe Béziera:
pi - punkty kontrolne.

ZáDVQRFL NU]\ZHM

NUDFH Z SXQNWDFK p

0

p

n

:

p

0,n

(0) = p

0

,     p

0,n

(1) = p

n

.

styczna w punkcie p

0

 do odcinka p

0

p

1

:

p'

0,n

(0) = n

*

(p

1

-p

0

).

styczna w punkcie p

n

 do odcinka p

n-1

p

n

p'

0,n

(1) = n

*

(p

n

-p

n-1

).

mie

FL VL  Z XZ\SXNOHQLX SXQNWyZ NRQWUROQ\FK

VSHáQLD ]DOH*QRü p

0,n

(t) = (1-t)

*

p

0,n-1

(t) + t

*

p

1,n

(t).

).

(

f

)

(

b

   

,

1

..

0

dla 

   

)

(

f

)

(

f

)

(

b

,

..

1

dla 

   

  

,

  

,

..

0

dla 

   

0

,

..

1

dla 

   

)

1

(

1

)

(

f

   

,

1

)

(

f

,

..

0

dla 

   

)

(

b

)

(

f

   

,

0

)

(

f

)

(

,

..

0

dla 

   

)

1

(

)

(

b

   

,

0

)

(

b

)

(

:

)

(

f

 

 Fergusona

i

 

)

(

b

teina 

iany Berns

    wielom

,

,

1

,

,

,

1

0

0

*

*

*

,

0

,

,

,

*

,

,

0

*

*

,

*

,

,

0

,

,

t

t

n

i

t

t

t

n

i

n

i

i

k

n

i

n

i

k

k

t

i

k

i

k

k

k

n

t

t

n

i

n

i

k

t

t

n

i

t

t

n

i

i

n

t

i

t

i

n

t

n

i

t

t

t

t

n

n

n

n

i

n

i

n

i

n

i

i

i

k

i

i

n

n

k

n

i

n

i

i

n

n

i

n

i

i

n

n

i

n

i

n

=

=

=

=

=

=

=

=

=

=

=

+









=

=

=

=

=

=

=

=





=

=

=

+

p

p

q

p

q

q

p

q

p

p

p

wyznaczanie punktów krzywej:

algorytm de Casteljau:
for  i := 0  to  n  do  r

i

 := p

i

;

for  j := 1  to  n  do

for  i := 0  to  n-j  do  r

i

 := r

i

 + t 

*

 (r

i+1

 - r

i

);

p

0,n

(t) := r

0

.

algorytm Hornera:  

(t < 0,5)

l := 1;   k := 1;
c := t / (1-t);   s := p

n

;

for  i := 1  to  n  do

begin  l := l

*

(1-t);  k := k

*

(n-i+1)/i;  s := 

*

 s + k 

*

 p

n-i

  end;

p

0,n

(t) := 

*

 s.

algorytm Hornera:  

(t > 0,5)

l := 1;   k := 1;
c := (1-t) / t;   s := p

0

;

for  i := 1  to  n  do

begin  l := l

*

t;  k := k

*

(n-i+1)/i;  s := 

*

 s + k 

*

 p

i

  end;

p

0,n

(t) := 

*

 s.

]

1

,

0

[

dla 

   

0

)

1

(

)

(

*

*

*

,

0

=





=

t

n

i

i

n

t

i

t

i

n

t

i

n

p

p

,

p

0,n

(t) = (1-t)

*

p

0,n-1

(t) + t

*

p

1,n

(t)

=





=

n

i

i

t

t

i

n

n

t

t

i

n

0

1

)

1

(

)

(

 

*

*

*

,

0

p

p

=

 −





=

n

i

i

t

t

i

n

n

t

t

i

n

n

0

1

)

(

 

*

*

*

,

0

p

p

62

NU]\ZH VNOHMDQH  NU]\ZH JL WH DQJ splines)

funkcja sklejana

IXQNFMD JL WD  VWRSQLD MHVW WR IXQNFMD SRNU\ZDMFD

VL  SU]HG]LDáDPL ]  Uy*Q\PL  ZLHORPLDQDPL VWRSQLD p, przy czym funkcja
ta, jak i jej p

 SLHUZV]\FK SRFKRGQ\FK V FLJáH

funkcje B-sklejane  m

n,    t

0

≤ t

1

≤...≤ t

m

≤...≤ t

n

≤ t

n+1

≤...≤ t

n+m+1

m

k

k

m

n

i

t

i

k

i

t

i

k

t

t

i

k

t

t

i

k

i

t

i

k

t

i

t

t

t

i

k

m

n

i

i

t

i

t

t

i

t

i

t

t

t

i

..

0

..

0

 

),

(

1

,

1

n

1

1

1

)

(

,

1

n

)

(

,

n

..

0

   

],

1

,

[

dla 

0

],

1

,

[

dla 

1

)

(

,

0

n

*

*

=

=

+

+

+

+

+

+

+

+

=

+

=

+

+

=

+

funkcje B-sklejane n

m,i

 (i=0..n)

VWDQRZL ED]  GOD IXQNFML
sklejanych stopnia m

RNUHORQ\FK Z SU]HG]LDOH
[t

m

t

n+1

] i „sklejanych” dla

ZDUWRFL SDUDPHWUyZ t

m+1

,.., t

n

:

ZáDVQRFL

RJUDQLF]RQ\ L ]ZDUW\ QRQLN

ZDUWRFL QLHXMHPQH

unormowanie:

krzywe sklejane
krzywe opisane parametrycznie funkcjami sklejanymi, przy czym

ÄVNOHMHQLD´ ZLHORPLDQyZ QDVW SXM GOD W\FK VDP\FK ZDUWRFL SDUDPHWUX

krzywe B-sklejane:   q

p

p

( )

n

( )

[

,

],

,

*

t

t

t

t

t

m i

i

i

n

m

n

i

=

=

+

0

1

,      

- punkty kontrolne.

zmiana punktu pRGNV]WDáFD NU]\Z ORNDOQLH W\ONR GOD t∈[t

i

t

i+m+1

].

wyznaczanie punktów krzywej:

algorytm de Boora-Coxa dla t

∈(t

k

t

k+1

):

for  i := 0  to  m  do  r

i

 := p

k-m+i

;

for  j := 1  to  m  do

for  i := 0  to  m-j  do  r

i

 := r

i

 + (t-t

i+j

)/(t

i+m+1

-t

i+j

*

 (r

i+1

 - r

i

);

q(t) := r

0

.

q( )

n

( ).

n

( )

[ ,

],

n

( )

,

n

( )

[

,

].

*

,

,

,

,

t

a

t

t

t

t t

t

t

t

t

t

t

i

m i

i

n

m i

i

i m

m i

m i

i

n

m

n

=

=

=

=

+ +

=

+

0

1

0

1

0

0

1

   dla 

   dla dowolnego 

   dla 

q

p

p

( )

n

( )

n

( )

(

,

)

,

*

,

*

t

t

t

t

t

t

m i

i

i

n

m i

i

i k m

k

k

k

=

=

=

= −

+

0

1

   dla