Sunteți pe pagina 1din 313

i

\m
Uvy
Severin BUMBARU
Este profesor universitar n cadrul
Catedrei de Calculatoare i nformatic
Aplicat a Universitii "Dunrea de Jos"
din Galai.
Este conductor de doctorat n domeniul
Stiina Calculatoarelor.
Este titularul disciplinelor: Tehnici de
programare, Programare n limbajul Java,
Structuri de date i algoritmi.
Printre domeniile de interes se numr
limbaje de programare orientate obiect,
algoritmi i tehnici de programare,
inteligena artificial.
Ciprian-Daniel NEAGU
A absolvit Facultatea de Automatic din cadrul
nstitutului Politehnic "Gheorghe Asachfdin lai
n 1990.
Este doctor inginer n Stiina Calculatoarelor din
septembrie 2000.
Este ef de lucrri n cadrul Catedrei de
Calculatoare i nformatic Aplicat a
Universitii "Dunrea de Jos" din Galai.
Este titularul disciplinelor: Sisteme grafice,
Multimedia i Hypermedia, Grafic pe
calculator.
Printre domeniile de interes se numr
proiectarea site-urilor web, grafica pe
calculator, inteligena artificial, reelele
neuro-fuzzy.
Ciprian-Daniel NEAGU Severin BUMBARU
S I S T E ME MU LT I ME D I A
GRAFICA PE CALCULATOR
MAT R I X RQM
BUCURETI 2!
MATRIX ROM
CP. 16 - 162
77500 - BUCURETI
tel. 01.4113617, fax
01.4114280
e-mail: matix!fx."
ISBN 973 - 685 - 315 - 2
Sisteme multimedia. Grafic pe calculator
Cuvnt nainte
Sisteme Multimedia. Grafic pe calculator : o introducere concis
n universul multimedia, focalizat apoi pe subiectul graficii pe
calculator. Definete sugestiv, clar i cu exemple la obiect
noiunile de care un utilizator are nevoie pentru a ptrunde n
domeniul dinamic al aplicaiilor sistemelor de calcul.
Cartea este format din patru pri. Ciprian-Daniel Neagu i
Severin Bumbaru ncep prin a defini i caracteriza componentele
multimedia, exemplificat i bogat ilustrat. Muli cititori vor fi plcut
impresionai de comentariile practice, adugiri care, n doar
cteva cuvinte, clarific noiuni ,tabu", altfel considerate extrem
de specializate: multimedia, dispozitive grafice, rezoluie, tehnici
de compresie, digital audio, fiiere grafice. Totul prezentat n
fraze clare, fr exprimri nclcite. Noiunile introduse sunt
urmate de descrieri ale standardelor sau aplicaiilor
caracteristice n domeniu. De cele mai multe ori reconsiderate n
exemple. Aplicaiile, bine alese, construite n cod Java, fac
legtura ntre trei zone altfel considerate eclectice: dispozitivele
multimedia, programarea Java i grafica computaional. La
sfritul primului capitol, avem ansa de a ne fi construit o opinie
unitar despre gama actual de dispozitive multimedia, dar i
despre metodele de procesare a sunetelor i imaginii. Aceste
informaii ne dau o ans n plus s lum hotrri bine
fundamentate n cazul n care am dori, spre exemplu, s alegem
singuri un sistem multimedia modern.
Trecerea n revist a bibliotecilor Java specializate n
prelucrarea grafic este un capitol de referin pentru orice
programator care dorete s se specializeze n tehnicile
moderne de programare pentru grafica pe calculator. Capitolul al
doilea este un tutorial care ne introduce, pas cu pas, n domeniul
programrii Java, pentru scrierea aplicaiilor de prelucrare a
textului, imaginilor, culorilor i a altor resurse multimedia.
Exemplele sunt simple i de efect, atrgnd cititorul s parcurg
ct se poate de direct un domeniu att de bogat n nouti i
informaii. Aceast caracteristic propune volumul de fa ca o
bun alegere att pentru utilizarea n coal, ct i pentru un
cititor independent curios i dornic de cunoatere.
Aplicaiile Java de anvergur din partea a treia sunt la obiect,
propunnd cititorului, prin subiecte i soluii, o viziune asupra
cunoscutelor noiuni matematice cu aplicaii n grafica pe
calculator. Un capitol n care sunt prezentate noiunile de baz i
este introdus vocabularul caracteristic, bogat ilustrat grafic i
matematic. Sisteme de coordonate, algoritmi de reprezentare a
figurilor geometrice de baz, conversii i relaii matematice sunt
introduse clar i exemplificate n Java.
Capitolul patru, mult mai dens, este dedicat geometriei
computaionale. Conceptele, mai dificile, legate de transformri
geometrice, scalari, rotaii, simetrii, transformri afine,
transformri compuse 2D i 3D, metodologia reprezentrii pe
magicul ecran de calculator a universului virtual 3D, sunt
prezentate, definite i exemplificate. Algoritmii propui i
demonstreaz utilitatea n exemplele Java, de data aceasta de
amploare.
Cartea este bogat ilustrat; n plus, putem parcurge o bogat
list de aplicaii i coduri surs, ca i de tabele. Una din virtuile
majore ale volumului de fa este domeniul extrem de larg
abordat i clarificat prin exemple. Este scris folosind un stil vioi,
informativ, cu o clar dorin de aplicaie.
Rmne doar ntrebarea: ,Ct de repede i de mult trebuie s
scrii pentru a ine pasul cu domeniul exploziv al aplicaiilor
multimedia n general, i al graficii n special". ndiferent de
rspuns, rmne dorina de a pstra i a puncta istoria, prospt
dar att de bogat, a epocii calculatoarelor.
Conf. dr. mg. Vasile Palade
Computing Laboratory, Oxford University

Sisteme multimedia. Grafic pe calculator


NTRODUCERE
Astzi, toi suntem familiarizai cu produsele multimedia, cu
grafica pe calculator, n sensul c suntem asaltai zilnic de
produse digitale la televizor, n filme, n cri, reviste, n
magazine sau pe ecranul calculatoarelor. Chiar n aceste
condiii, cei mai muli dintre noi cunosc puin despre acest
domeniu. Ce sunt aceste produse? Cum pot fi create? Cum pot
fi folosite? De ce s le folosim? Chiar i unii specialiti n
utilizarea aplicaiilor multimedia nu sunt cteodat capabili s
defineasc natura elementelor pe care le folosesc. Spre
exemplu, dac ar fi s considerm doar natura elementelor
grafice att de des utilizate, de ce redimensionarea unui desen
poate conduce la distorsionarea sau degradarea imaginii
oferite... sau cum s crem i s manipulm efectele de
imagine puse la dispoziie de aplicaiile multimedia
contemporane?
Acest volum ncearc s rspund unor astfel de ntrebri i s
propun cititorului o introducere documentat i exemplificat n
acest domeniu, cu scopul de a prezenta noiunile legate de
multimedia i grafica pe calculator i de a le folosi efectiv. De
aceea, acest demers nu este destinat programatorilor avansai,
interesai, spre exemplu, de algoritmi specializai de
decodificare a fiierelor GF, sau de curbele Bezier. Este ns
destinat cititorului familiarizat, cu noiuni de baz de tehnologia
informaiei i de programare. nformaia pus la dispoziia
cititorului este ndreptat spre practic, astfel nct, odat
parcurs un capitol, cititorul s poat aplica informaia
acumulat. n acest scop, noiunile sunt introduse teoretic
(putnd fi aplicate indiferent de mediul de dezvoltare preferat de
cititor). n marea majoritate sunt particularizate i exemplificate
prin aplicaii Java cu scopul de a oferi finalitate. n acest scop,
un capitol este dedicat abordrii graficii pe calculator i
tehnicilor multimedia n mediul Java. Astfel, soluiile propuse
cititorului sunt aplicabile indiferent de platforma utilizat.
Capitolul !" Si#$e%e %&l$i%e'ia (Ciprian-Daniel Neagu, pag.
1-54), se refer la prezentarea ansamblului tehnicilor digitale de
prelucrare a informaiei, un domeniu dinamic i variat. Sunt
explorate componente i concepte multimedia - n particular
audio i video - pentru care sunt propuse definiii, clasificri,
caracterizri ale dispozitivelor i aplicaiilor. n cazul
componentelor grafice, sunt discutate att cele dou modaliti
de reprezentare a informaiei - bitmap i vectorial - ct i tehnici
de compresie i formate de fiiere. Anumite concepte (rezoluie,
tehnici de compresie, codificarea culorii, paleta de culori) sunt
exemplificate prin aplicaii Java.
Capitolul 2, In$r('&)ere *n +ra,i)a -ava (Severin Bumbaru,
pag. 55-106), propune o prezentare la obiect a componentelor
limbajului Java care permit att scrierea unor aplicaii grafice,
ct i publicarea acestora pe nternet, sub form de applet-uri.
Fiecare noiune sau clas introdus este exemplificat prin cod
Java de dimensiuni reduse i comentat.
Capitolul 3, N(.i&ni %a$e%a$i)e ,(l(#i$e *n apli)a.ii 'e +ra,i)/
pe )al)&la$(r
(Ciprian-Daniel. Neagu, pag. 107-118), face o introducere a
elementelor matematice, n special de geometrie i
trigonometrie, necesare n cazul n care dorim s elaborm
aplicaii n grafica pe calculator. Noiunile teoretice sunt nsoite
de reprezentri grafice i exemplificri dezvoltate n limbajul
Java.
v
Ciprian-Daniel NEAGU, Severin BUMBARU
Capitolul 4, Tran#,(r%/ri +e(%e$ri)e (Ciprian-Daniel Neagu,
pag. 119-159), propune att o trecere n revist a noiunilor
teoretice, ct i algoritmi i exemple de reprezentare a
obiectelor bidimensionale i tridimensionale pe calculator.
Transformrile prin care obiectele ajung s fie prelucrate sunt
abordate succint i exemplificate prin aplicaii Java.
La sfritul lucrrii sunr ataate trei anexe (Ciprian-Daniel
Neagu, pag. 160-199), n care sunt completate aplicaiile de
amploare prezentate n capitolele anterioare. Coduri surs
complete, detalii i actualizri pot fi obinute i de pe pagina
web a autorilor (http://www.cs.ugal.ro/dneagu). n final, un index
bibliografic este propus cititorului care dorete s ptrund mai
adnc n alte capitole specifice ale domeniilor multimedia i
graficii pe calculator.
Sperm c efortul depus va conduce la posibilitatea unei lecturi
utile.
Autorii.
Sisteme multimedia. Grafic pe calculator
Cuprins
1. Sisteme multimedia..................................................................1
1.1.......................................................................................................
ntroducere
1
1.2.......................................................................................................T
ermenul Multimedia
2
1.3. storia sistemelor multimedia
2
1.4. Definiia termenului multimedia
3
1.3.
Componentele unui sistem multimedia
4
1.5. Cerine hardware minime pentru un sistem multimedia
4
1.6. Dispozitive de intrare pentru sisteme multimedia
5
1.7. Procesarea sunetului: dispozitive digital audio
8
1.8. Procesarea imaginilor: dispozitive grafice
11
1.9. Reprezentarea culorii
18
1.10................................................................................................S
tandarde ale adaptoarelor grafice
25
1.11................................................................................................D
ispozitive de trasare
27
1.12................................................................................................A
plicaii grafice
30
1.4.
Formatele fiierelor de grafic
32
1.13................................................................................................M
odele de reprezentare
32
1.14................................................................................................M
odul bitmap (hri de bii)
32
1.15................................................................................................C
ompresia imaginii n fiiere bitmap
36
1.16................................................................................................M
odul vectorial
53
2. ntroducere n grafica Java....................................................55
2.1.
nterfeele utilizator grafice n Java
55
1.17................................................................................................n
terfeele grafice AWT
55
1.18................................................................................................n
terfeele grafice Swing
56
2.2.
Componente grafice i containere
56
1.19................................................................................................Cl
asa Component
56
1.20................................................................................................Cl
asa Applet
57
2.3.
Culori i fonturi
59
1.21................................................................................................Cl
asa Color
59
1.22................................................................................................Cl
asa Font
60
1.23...................................................................................................D
esenarea n Java AWT...........................................................62
1.24...................................................................................................D
esenarea folosind contextul grafic dat de clasa Graphics......63
1.25................................................................................................Si
stemul de coordonate
63
1.26................................................................................................M
etodele clasei Graphics....,
64
1.27................................................................................................E
xemple de utilizare a clasei Graphics
65
2.6.
Desenarea folosind contextul grafic dat de clasa
Graphics2D.............................................................................70
1.28................................................................................................C
rearea instanei contextului grafic Graphics2D
70
1.29................................................................................................Si
stemul de coordonate
71
1.30................................................................................................M
etodele clasei Graphics2D
71
1.31................................................................................................C
rearea i utilizarea formelor
72
1.32................................................................................................n
terfaa Shape
73
1.33................................................................................................C
aracteristicile formelor primitive
73
1.34................................................................................................F
orme generale
77
1.35................................................................................................St
iluri de linii
80
1.36................................................................................................U
mplerea formelor
83
1.37. Transformri ale sistemului de coordonate al
contextului grafic
87
1.38. Decuparea unei zone a desenului
92
1.39. Transformarea textului n form
92
1.40. Crearea i compunerea ariilor
94
1.41...................................................................................................Pr
ogramarea orientat pe evenimente......................................96
1.42...................................................................................................Pr
oiectarea unei aplicaii cu interfa utilizator grafic...............98
1.43................................................................................................Cl
asele Frame i JFrame
99
1.44..............................................................................................Ale
gerea componentelor atomice
101
1.45..............................................................................................Fol
osirea containerelor auxiliare
104
1.46..............................................................................................Ad
ugarea componentelor la fereastra principal
106
3. Noiuni matematice folosite n aplicaii de grafic pe calculator
107
1.47.................................................................................................Sis
teme de coordonate. Coordonate carteziene
107
1.48.................................................................................................Co
ordonate polare
107
L
Ciprian-Daniel NEAGU, Severin BUMBARU
1.49.........................................................................................Conver
sia ntre sistemele de coordonate carteziene i polare (n
spaiul bidimensional, 2D)..............................................'.
108
1.50..............................................................................................Linii
...109
1.51...............................................................................................E
cuaia parametric a unei drepte
109
1.52...............................................................................................E
cuaia parametric a unei drepte ntr-un sistem cartezian 3D
109
1.53...............................................................................................Al
goritm de determinare a distanei dintre un punct i o
dreapt ntr-un sistem cartezian de coordonate 2D
110
1.54...............................................................................................D
eterminarea interseciei a dou drepte
111
1.55...............................................................................................Al
goritm de determinare a apartenenei unui punct de pe o
linie dat la un segment dat
111
1.56.................................................................................................Se
ciuni conice
111
1.57.................................................................................................Ce
rcul
112
3.7.
Poligoane
116
3.7.1. Convexitatea i concavitatea poligoanelor
............................................................................................,11
6
3.8.
Plane
117
1.58............................................................................................Alg
oritm de caracterizare a unui vector normal la plan
....117
1.59...............................................................................................nt
ersecii
118
1.60...............................................................................................Po
ziii relative la un plan dat
118
1.61...............................................................................................Se
miplane
118
4.Transformri geometrice......................................................119
4.1.
Transformri bidimensionale (2D)
119
1.62...............................................................................................Tr
anslaia
119
1.63...............................................................................................Sc
alarea
122
1.64...............................................................................................Ro
taia
122
4.2.
Transformri afine. Transformri compuse
129
1.65...............................................................................................Tr
ansformarea de rotaie
130
1.6
6.
nc
lin
ar
ea
fa

de
o
ax

13
1
1.6
7.
Sc
ala
re
a
du
p
o
ax

13
1
1.6
8.
Re
fle
xia
13
1
1.6
9.
Ca
zu
ri
pa
rtic
ula
re
13
7
1.7
0.
Tr
an
sfo
rm
ri
afi
ne
inv
er
se
13
8
1.71.
Sist
eme
cart
ezie
ne
de
refer
in
138
1.72.................................................................................................Tra
nsformri tridimensionale
141
1.73...............................................................................................Tr
anslaia. Rotaia. Simetrii. nclinri
141
1.74...............................................................................................Pr
oiecii
147
1.75..............................................................................................Tr
ansformri proiective
151
1.76..............................................................................................Str
ucturi de date pentru reprezentarea obiectelor n spaiul
tridimensional
153
1.77..............................................................................................Co
ncluzii privind procesarea obiectelor n spaiul tridimensional
154
1.78...................................................................................................An
exa : sursele aplicaiei RGB (capitolul )................................160
1.79...................................................................................................An
exa : sursele aplicaiilor privind transformrile 2D (capitolul V)
171
1.80...................................................................................................An
exa : sursele aplicaiilor privind transformrile 3D (capitolul V)
182
1.81...............................BBLOGRAFE.....................................'.
199
Sisteme multimedia. Grafic pe calculator
ndexul figurilor
Figura 1-1. Dispozitive alternative de introducere a informaiei
multimedia: (a) mouse; (b) track
ball; (c) track ball incorporat (sisteme portabile); (d) touch
pad
...............................................................................................
5
Figura 1-2. Dispozitive alternative de introducere a informaiei
multimedia: (a) light pen; (b)
joystick; (c) scanner
...............................................................................................
7
Figura 1-3. Aplicaia Macromedia Soundedit: lista de opiuni de
meniu Effects, fereastra
principal i fereastra de control
...............................................................................................
9
Figura 1-4. Fereastra Cubase Transport Bar-emuleaz o
interfa Tape Recorder
....................................................................................................
10
Figura 1-5. Fereastra Cubase Arrange pentru aranjamente
muzicale
....................................................................................................
10
Figura 1-6. Fereastra Cubase Audio Editing cu lista de funcii
Edit
....................................................................................................
10
Figura 1-7. Cubase Score Notation Sheets Editing
....................................................................................................
11
Figura 1-8. Configuraia unui sistem de afiare a imaginii: (a)
arhitectura standard; (b)
arhitectur cu accelerator grafic
..............................................................................................
12
Figura 1-9. Rezoluia i dependena de numrul de bii pe pixel,
culoare i dimensiune: (a)
imagine colorat, rezoluie mare, 8b culoare; (b) imagine
colorat, rezoluie mic, 4b
culoare; (c) imagine gri, rezoluie medie, 8b nuane de gri;
(d) imagine alb/negru,
rezoluie mic, 1b culoare
..............................................................................................
13
Figura 1-10. Arhitectura acceleratorului grafic
...................................................................................................
18
Figura 1-11. Cubul culorilor: (a) codificarea RGB n domeniul
[0,1]; (b) codificarea CMY n
domeniul [0,1]
..............................................................................................
20
Figura 1-12. Applet RGB pentru exemplificarea modelului RGB
de codificare a culorilor
...................................................................................................
20
Figura 1-13. Tehnologia de transmitere a semnalului de
imprimare ctre dispozitivul de
imprimare pentru imprimante (a) laser; (b) LED
..............................................................................................
28
Figura 1-14. Tehnologii de imprimare cu cerneal: (a) imprimare
piezoelectric; (b) imprimare
termic.....................:
.................................29
Figura 1-15. Rularea i stabilirea caracteristicilor unui fiier GF
animat folosind aplicaia MS
GF Animator
..............................................................................................
33
Figura 1-16. Modelul zigzag aplicat unui fiier JPG
...................................................................................................
34
Figura 1-17. Algoritmul Shannon-Fano aplicat irului ABCDE
...................................................................................................
37
Figura 1-18. Algoritmul Huffman aplicat irului ABCDE
...................................................................................................
38
Figura 1-19. Un arbore Huffman
...................................................................................................
38
Figura 1-20. Arborele Huffman dup o schimbare de nod (A
incrementat de dou ori)
...................................................................................................
39
Figura 1-21. Arborele Huffman dup o nou schimbare de nod
(A reincrementat)
...................................................................................................
39
Figura 1-22. Un exemplu de imagine supus codificrii DE.....41
Figura 1-23. Codorul DPCM......................................................42
Figura 1-24. O seciune din harta de bii pentru modelul de
codificare DPCM........................................................................42
Figura 1-25. Decodor DPCM.....................................................43
Figura 1-26. Codor DM
...................................................................................................
43
Figura 1-27. Applet-ul Compress pentru exemplificarea a cinci
algoritmi de compresie a
informaiei grafice: DPCM, Delta, RLE, Zero supression si
Huffman................................................................................46
Figura 2-1. Vizualizarea appletului Exemplul
...................................................................................................
67
Figura 2-2. Vizualizarea appletului Exemplu2
...................................................................................................
68
Figura 2-3. Vizualizarea appletului Exemplu3
...................................................................................................
70
Figura 2-4. Aspectul formelor primitive rectangulare
...................................................................................................
74
Figura 2-5. Forme primitive rectangulare n Java2D
...................................................................................................
75
Figura 2-6. O curb patratic i cele trei puncte caracteristice. 76
Figura 2-7. Dou curbe cubice: cu punct de inflexiune (stnga)
i fr (dreapta). B i C sunt
punctele de control...............................................................76
Figura 2-8. Situaie n care curba cubic se autointersecteaz 77
Figura 2-9. Forme realizate folosind clasa GeneralPath...........80
Figura 2-10. Capete i mbinri de linii......................................81
Figura 2-11. Diferite stiluri de linii...............................................82
Figura 2-12. Umplerea figurilor cu culoare uniform, cu gradient
aciclic i cu gradient ciclic. ..84
Figura 2-13. Un dreptunghi i o elips umplute cu textur........85
Figura 2-14. O figur obinut prin rotaie.................................87
Figura 2-15. Translaii i schimbri de scar.............................89
Figura 2-16. nclinarea axelor de coordonate: nainte (linii
subiri) i dup transformare (linii
groase).................................................................................90
IX
Ciprian-Daniel NEAGU, Severin BUMBARU
Figura 2-17. Efectul nclinrii axelor: forma iniial (stnga) i
cea obinut dup transformare
(dreapta)
..............................................................................................
90
Figura 2-18. Un exemplu de text transformat ntr-o form
....................................................................................................
93
Figura 2-19. Compunerea ariilor: a - reuniune (add), b -
diferen (subtract), c -intersecie
(intersect), d - sau exclusiv (exclusiveOr)
..............................................................................................
95
Figura 2-20. Transmiterea evenimentelor de la surse la
asculttori
....................................................................................................
97
Figura 2-21. Fereastra principal a unei aplicaii, realizat prin
extinderea clasei Frame. 1 -
pictograma; 2 - bara de titlu; 3 - buton de minimizare; 4 -
buton de
maximizare/restaurare; 5 - buton de nchidere; 6 - bordura;
7 - cmpul ferestrei
..............................................................................................
99
Figura 2-22. erarhia claselor de butoane
..................................................................................................
102
Figura 3-1. Sistem de coordonate carteziene 2D
..................................................................................................
107
Figura 3-2. Sistem de coordonate polare 2D
..................................................................................................
107
Figura 3-3. Determinarea coordonatelor carteziene ale unui
punct caracterizat prin coordonate
polare
.............................................................................................
108
Figura 3-4. mprirea unei grile bidimensionale n cadrane i
octante
..................................................................................................
108
Figura 3-5. Caracterizarea unei linii ntr-un sistem cartezian 2D
..................................................................................................
109
Figura 3-6. Distana dintre dou puncte ntr-un sistem de
coordonate carteziene 2D
..................................................................................................
110
Figura 3-7. Distana dintre un punct i o dreapt ntr-un sistem
cartezian de coordonate 2D.
............................................................................................
110
Figura 3-8. ntersecia unui con cu un plan:(a) cerc; (b) elips;
(c) parabol; (d) hiperbol. ...112 Figura 3-9. Descrierea
cercului cu centrul n originea unui sistem de coordonate: (a)
carteziene; (b) polare
.............................................................................................
112
Figura 3-10. Trasarea sectoarelor de cerc n coordonate
carteziene
..................................................................................................
113
Figura 3-11. Polilinii: (a) polilinie inchis; (b) polilinie simpl
..................................................................................................
116
Figura 3-12. Tipuri de poligon: (a) convex; (b) concav; (c)
poligon ce se autointersecteaz. .117
Figura 4-1. Translaia unui obiect bidimensional
..................................................................................................
119
Figura 4-2. Applet-ul Translation: un exemplu de translaie a
dou puncte n sistemul de
coordonate 2D: (a) modul 0 - translaie; (b) modul 1 -
modificarea vectorului de
translaie
............................................................................................
120
Figura 4-3. Rotaia unui obiect fa de originea sistemului de
coordonate
..................................................................................................
122
Figura 4-4. Applet-ul Rotation: un exemplu de rotaie a
obiectelor n sistemul de coordonate
2D
............................................................................................
123
Figura 4-5. Combinaii afine
..................................................................................................
129
Figura 4-6. Scalarea dup o ax: (a) figura iniial; (b) figura
scalat dup axa Y; (c) figura
scalat dup axa X
............................................................................................
131
Figura 4-7. Applet-ul Reflection: un exemplu de rotaie a
obiectelor n sistemul de coordonate
2D
............................................................................................
132
Figura 4-8. Caracterizarea unei ferestre de vizualizare in WCS
..................................................................................................
139
Figura 4-9. Transferul unei imagini din coordonate WCS n
coordonate DCS
..................................................................................................
140
Figura 4-10. Un caz particular de transfer din WCS n DCS
..................................................................................................
140
Figura 4-11. Rezultatul applet-ului Rotation: (a,b) secvene de
rotaie 3D; (c,d) obiectul scalat
3D i rotit 3D
............................................................................................
142
Figura 4-12. Proiecie perspectiv a segmentului relativ la
centrul de proiecie
..................................................................................................
147
Figura 4-13. Proiecie paralel a segmentului relativ la direcia
de proiecie
..................................................................................................
147
Figura 4-14. Proiecii perspective
..................................................................................................
148
Figura 4-15. Suprafaa de trasare pentru proiecia: (a) oblic; (b)
izometric
..................................................................................................
150
Figura 4-16. Proiecie perspectiv avnd centrul de proiecie n
originea sistemului de
coordonate
............................................................................................
151
Figura 4-17. Proiecie perspectiv avnd planul de proiecie xOy
..................................................................................................
151
Figura 4-18. Cubul unitate
..................................................................................................
153
Figura 4-19. Transformri 3D cu surs de lumin aplicate unui
cub
..................................................................................................
155
Figura 4-20. Transformri 3D cu surs de lumin aplicate unei
piramide
..................................................................................................
155
Figura 4-21. Transformri 3D cu surs de lumin aplicate unei
prisme
..................................................................................................
155
ndexul tabelelor
Tabelul 1-1 Criteriul de alegere: rata de remprosptarea
imaginii
....................................................................................................
26
Tabelul 1-2. Criteriul de alegere: memoria video
....................................................................................................
26
Tabelul 1-3. Principalele formate de fiiere bitmap
....................................................................................................
32
Tabelul 1-4. Structura formatului bitmap pentru sistemele
Windows
....................................................................................................
35
Tabelul 1-5. Algoritmul Shannon-Fano aplicat irului ABCDE
....................................................................................................
37
Sisteme multimedia. Grafic pe calculator
Tabelul 1-6. Algoritmul Huffman aplicat irului ABCDE
....................................................................................................
37
Tabelul 1-7. Exemplu de aplicare a algoritmului de compresie
LZW
....................................................................................................
40
Tabelul 1-8. Exemplu de aplicare a algoritmului de decompresie
LZW
....................................................................................................
41
Tabelul 1-9. Definiia codurilor escape pentru compresie 4b RLE
....................................................................................................
45
Tabelul 1-10. Exemple de secvene codificate 4b RLE
....................................................................................................
45
Tabelul 1-11. Exemple de secvene codificate 8b RLE
....................................................................................................
45
Tabelul 1-12. Principalele formate de fiiere vectoriale
....................................................................................................
54
ndexul aplicaiilor
Appiet 1-1. mageres.java
....................................................................................................
14
Appiet 1-2. Aplicaia RGB: rgbChooser.java
....................................................................................................
21
Appiet 1-3. Compress.java: exemplificarea a cinci algoritmi de
compresie a informaiei grafice:
DPCM, Delta, RLE, Zero supression si Huffman
..............................................................................................
46
Appiet 2-1. CeFonturi.java: numele fonturilor disponibile pe
sistemul gazd
....................................................................................................
61
Appiet 2-2. Exemplul java: un exemplu de suprafa de desen
....................................................................................................
65
Appiet 2-3. Exemplu2.java: exemplificarea influenei modificrii
opacitii culorii
....................................................................................................
67
Appiet 2-4. Exemplu3.java: afiarea imaginilor importate
....................................................................................................
68
Appiet 2-5. FormeRectang.java: desenarea i umplerea
formelor primitive
....................................................................................................
75
Appiet 2-6. Curbalnscrisa.java: utilizarea clasei GeneralPath
....................................................................................................
78
Appiet 2-7. StiluriLinii.java: stiluri de linii utilizate pentru trasare
....................................................................................................
82
Appiet 2-8. Umplere.java: Umplerea figurilor folosind culoare
uniform i gradient
....................................................................................................
84
Appiet 2-9. Textura.java: exemplificarea tehnicilor de obinere i
utilizare a texturii
....................................................................................................
86
Appiet 2-10. Rotiri.java: rotirea unei figuri n jurul unui punct fix
....................................................................................................
88
Appiet 2-11. Scara.java: schimbri de scar i translaii
....................................................................................................
89
Appiet 2-12. nclinare.java: efectul nclinrii axelor asupra unei
forme geometrice
....................................................................................................
90
Appiet 2-13. TextForma.java: transformarea unui ir de
caractere ntr-o form
....................................................................................................9
3
Appiet 2-14. AriiCompuse.java: operaii de compunere a dou
cercuri
....................................................................................................
95
Appiet 2-15. OAplicatie.java: fereastra principal a unei aplicaii
..................................................................................................,.9
9
Appiet 3-1. ArcTest.java: trasarea sectoarelor de cerc n
coordonate carteziene
..................................................................................................
113
Appiet 4-1. Clasa Translation (fiierul Translation.java) pentru
implementarea moduritor de
control al caracteristicilor de translaie 2D
............................................................................................
120
Appiet 4-2. Clasa RotationD (fiierul RotationD.java) pentru
implementarea modurilor de
control al caracteristicilor de rotaie 2D
............................................................................................
124
Appiet 4-3. Clasa ReflectionD (fiierul ReflectionD.java) pentru
implementarea modurilor de
control al caracteristicilor de reflexie 2D
............................................................................................
133
Appiet 4-4. Rotation.java: scalari i rotaii 3Dale unui obiect
..................................................................................................
143
Appiet 4-5. ViewFrame.java: obiect 3D n micare, sub o surs
de lumin
..................................................................................................
156
Appiet 5-1. Fiierul finalColor.java: aplicaia RGB
..................................................................................................
160
Appiet 5-2. Fiierul axis.java: aplicaia RGB
..................................................................................................
161
Appiet 5-3. Fiierul Chooser.java: aplicaia RGB
..................................................................................................
163
Appiet 5-4. Fiierul ColorSplatch.java: aplicaia RGB
..................................................................................................
163
Appiet 5-5. Fiierul matcher.java: aplicaia RGB
..................................................................................................
163
Appiet 5-6. Fiierul matchHolder.java: aplicaia RGB
..................................................................................................
166
Appiet 5-7. Fiierul NoFlickerAppet.java: aplicaia RGB
..................................................................................................
167
Appiet 5-8. Fiierul picker.java: aplicaia RGB
..................................................................................................
167
Appiet 5-9. Fiierul urLabel.java: aplicaia RGB
...................................................................................................17
0
Appiet 6-1. Fiierul Translation.java: aplicaia Transformations
..................................................................................................
171
Appiet 6-2. Fiierul MyMath.java: aplicaia Transformations
..................................................................................................
178
Appiet 6-3. Fiierul Picture.java: aplicaia Transformations
..................................................................................................
179
Appiet 7-1. Fiierul Face.java: aplicaia ViewFrame
..................................................................................................
183
Appiet 7-2. Fiierul FileFormatException.java: aplicaia
ViewFrame
..................................................................................................
183
Appiet 7-3. Fiierul Line.java: aplicaia ViewFrame
..................................................................................................
183
Appiet 7-4. Fiierul Matrix.java: aplicaia ViewFrame
..................................................................................................
183
Appiet 7-5. Fiierul Object3D.java:aplicaia ViewFrame
..................................................................................................
186
Appiet 7-6. Fiierul SurfaceFrame.java: aplicaia ViewFrame
..................................................................................................
189
Appiet 7-7. Fiierul Vector java: aplicaia ViewFrame
..................................................................................................
197
Appiet 7-8. Fiierul Vertex.java: aplicaia ViewFrame
..................................................................................................
198
1. SSTEME MULTMEDA
1.1. ntroducere
Aprute n anii '80, calculatoarele personale (Personal
Computers, PC) au cunoscut o dezvoltare deosebit att n
ceea ce privete partea hardware ct i n programe (software).
De la nceput s-a constatat c prezentarea grafic a rezultatelor
programelor prezint avantaje: nelegere rapid, form
atractiv de prezentare, personalizarea interfeei. Aceasta a
condus la creterea eforturilor pentru realizarea i dezvoltarea
adaptoarelor grafice i a dispozitivelor periferice grafice. Din
punct de vedere tradiional, PC-urile erau folosite pentru
gestionarea textelor i cifrelor. Odat cu dezvoltarea erei
informaionale, sunt capabile s combine sunete, secvene
video, imagini grafice, animaie provenite de pe CD-ROM,
magnetoscop, camer video, DVD, microfon etc. Astzi, PC-
urile sunt dotate cu plci sonore i cititoare CD-ROM/ DVD
pentru difuzarea sunetelor, muzicii, imaginilor, exploatrii marilor
baze de date (enciclopedii, bnci de date incluznd fotografii
pentru CAD, secvene audio i video pentru publicistic sau
reclam).
Deoarece performanele aplicaiilor grafice (vitez, rezoluie,
numr de culori) sunt strns legate de performanele sistemului
folosit precum i a dispozitivelor periferice, vom prezenta att o
trecere n revist a noiunilor de multimedia hardware
(echipamente i arhitecturi multimedia, n special dispozitivele
de vizualizare i interaciune grafic), ct i a informaiilor legate
de software multimedia (formate de fiiere folosite n grafic,
programare i aplicaii grafice, biblioteci grafice specializate).
Multe dintre caracteristicile multimedia vor fi exemplificate n
continuare prin mini-aplicaii Java (applet-uri).
Sistemele multimedia n general, componenta grafic pe
calculator n special, au cunoscut practic o extindere exhaustiv
a domeniilor de aplicaie. Putem enumera:
- educaie (la distan): informaia vizual reprezint peste
75% din informaia procesat de creier, cu un impact
deosebit asupra persoanei receptoare;
- cercetare tiinific: simulri i reprezentarea datelor
experimentale;
- inginerie: aplicaii CAD (Computer Aided Design - proiectare
asistat de calculator), CAM (Computer Aided Manufacturing
- fabricaie asistat de calculator), CAE (Computer Aided
Engineering - inginerie asistat de calculator), comanda i
urmrirea proceselor automate;
- cartografie, metrolologie i prospectarea resurselor folosind
GS (Geographic nformation Systems);
- economie i conducere economic;
- simulatoare (pilotare) pentru antrenarea piloilor n
aeronautic, dar i n colile de oferi;
- art vizual, comer i reclam, jocuri video.
Tendinele de dezvoltare sunt axate pe integrarea tratrii
imaginii i sunetului n produsele software (ajungnd pn la
proiectata "excludere" a dispozitivelor tradiionale de intrare:
tastatur i mouse), utilizarea extensiv a CD-ROM i
1
Ciprian-Daniel NEAGU, Severin BUMBARU
____________________________________________________
DVD, dezvoltarea aplicaiilor pentru videoconferinte. Toate
acestea au devenit posibile datorit impunerii standardelor
pentru comunicaii i comprimarea datelor, integrrii funciilor
audio i video n procesoare, serviciilor de telecomunicaii prin
satelit i cablu i a dezvoltrii autostrzilor informaionale.
1.2. Termenul Multimedia
7.2.1 Istoria sistemelor multimedia
Din punct de vedere istoric, ziarele pot fi considerate primele
medii de comunicare n mas din perioada modern care au
folosit (i folosesc) atribute multimedia: text, desene, imagini.
n 1895, Gugliemo Marconi a realizat prima transmisie radio la
Pontecchio, talia. Civa ani mai trziu (n 1901), el
recepioneaz primele unde radio transmise peste Oceanul
Atlantic. nventat iniial pentru telegraf, radioul a devenit n scurt
timp un mijloc major pentru transmisii audio.
Televiziunea a fost noul mijloc de comunicare n mas introdus
n secolul 20. Aceasta include componenta video (imaginea),
revoluionnd universul comunicrilor n mas.
O list extrem de srac a evenimentelor caracteristice
multimedia n domeniul T ar putea cuprinde:
- 1967 - Negroponte formeaz Architecture Machine Group la
MT (Massachusetts nstitute of Technology);
- 1969 - este promovat editorul hypertext propus de Nelson i
Van Dam;
- anii 1970 - naterea nternet-ului;
- 1971-E-mail;
- 1976 - Architecture Machine Group propune n cadrul
DARPA (Defense Advanced Research Projects Agency,
SUA) proiectul Multiple Media;
- 1980 - Lippman i Mohl dezvolt la MT, n cadrul nstitute of
Technology Media Laboratory, sistemul hypertext Aspen
Movie Map, ce incorpoeaz grafic, animaie i video;
- 1985 - Negroponte i Wiesner deschid Media Lab n cadrul
MT;
- 1989 - Tim Berners-Lee propune conceptul World Wide Web
la CERN (European Council for Nuclear Research);
- 1990 - Apple Multimedia Laboratory, proaspt deschis,
reunete 100 specialiti n multimedia focalizat n educaie,
urmnd ca n 1991 s apar sub copyright Apple Multimedia
Lab, Visual Almanac i Classroom MM Kiosk;
- 1992 - primul M-bone audio multicast n nternet;
- 1993 - University of llinois National Center for
Supercomputing Applications propune browser-ul NCSA
Mosaic;
- 1994 - Jim Clark i Marc Andreesen lanseaz Netscape;
- 1995 - este lansat mediul JAVA pentru dezvoltarea aplicaiilor
independente de platform;
1996 - este lansat Microsoft nternet Explorer.
2
Sisteme multimedia
1... !efini"ia termenului multimedia
Etimologic, cuvntul %&l$i%e'ia este format prin alipirea
prefixului mul"i (mai mult dect unul, mai multe) la media
(pluralul! termenului medium # cu sensul de mijloc, intermediar,
menire). Prin urmare, o traducere brut este aceea de mi$loa%e
multiple.
Este necesar de subliniat c termenul media este o form de
plural, form utilizat i n alte contexte: massmedia (mijloace
de comunicare n mas), communication media (mijloace de
comunicare), computer storage media (mijloace de stocare a
informaiei procesate de calculator), presentation-media
(mijloace de prezentare).
n domeniul tehnologiei informaiei (nformation Technology, T),
termenul multimedia este focalizat pe metodele de tratare a
informaiei: stocare, procesare, producere, distribuire,
transmitere, prezentare si percepie.
Putem deci propune ca o prim definiie a termenului:
Definiia 1: %&l$i%e'ia reprezint existena mai multor
intermediari ntre sursa informaiei i destinaia ei.
Particulariznd, putem propune:
Definiia 2: %&l$i%e'ia reprezint mijloace multiple de
stocare, transmitere, prezentare si percepie a
informaiei.
Deoarece discutm de domeniul T, ne referim practic la
termenul digital multimedia, pentru care este propus definiia:
Definiia 3: 'i+i$al %&l$i%e'ia este domeniul referitor
la integrarea (controlat de calculator) a textului,
graficii, imaginilor statice i n micare, animaiei,
sunetelor, a oricror alte mijloace de reprezentare,
stocare, transmitere i procesare digital a informaiei.
Din definiie putem evidenia i diferitele tipuri de informaie
procesate de sistemele multimedia: text, desene, imagini
statice, imagini n micare, animaie, film, sunete. Evident,
termenul multimedia se extinde att in categoria captrii
informaiei, ct i a tratrii acesteia.
Un #i#$e% %&l$i%e'ia poate fi considerat aadar un sistem de
calcul care conine dispozitive hardware i este capabil din
punct de vedere software s integreze text, grafic, imagini
statice i n micare, animaie, sunete, alte mijloace de
reprezentare, stocare, transmitere, procesare digital a
informaiei.
O apli)a.ie %&l$i%e'ia este definit ca o component software
ce se caracterizeaz prin procesarea, stocarea, generarea,
manipularea informaiei multimedia (text, grafic, imagini,
sunet/audio, animaie, video.
n acest context, merit s subliniem c termenul 01per$e2$ se
refer la informaia digital sub form text care conine legturi
ctre alte documente text (cu alte cuvinte, are caracteristici
neliniare, spre deosebire de documentele text obinuite,
liniare). Extensia natural este adus de termenul 01per%e'ia"
care nglobeaz cele dou noiuni definite anterior, hypertext i
multimedia.
n concluzie, un sistem multimedia este un sistem de calcul
care apeleaz un set de tehnologii ce fac posibil existena
aplicaiilor de tip multimedia, cum ar fi: grafic PC, imagini i
animaie 2D i 3D, video, redarea imaginilor
3
L
Ciprian-Daniel NEAGU, Severin BUMBARU
nregistrate i comprimate, aplicaiile legate de sunet
(nregistrarea i redarea sunetului, sinteza vorbirii) .a. Alturi
de acestea trebuie amintite tehnologii suport pentru multimedia,
cum ar fi CD-ROM/DVD, reele locale i tehnologii de
comprimare/ decomprimare a datelor. Acest domeniu se
dezvolt odat cu creterea performanelor sistemelor de calcul
de a prelucra n timp real fluxul de date din astfel de aplicaii.
1.3. Componentele unui sistem multimedia
1.&.1. Cerin"e 'ard(are minime pentru un sistem multimedia
Sistemele multimedia se caracterizeaz prin faptul c sunt
sisteme de calcul ce integreaz dispozitive multimedia,
proceseaz informaie reprezentat digital i folosesc interfee
multimedia interactive. n consecin, sistemele multimedia
trebuie s dovedeasc o mare putere de procesare (pentru a
putea prelucra n timp real cantiti mari de informaie digital),
s se bazeze pe un sistem de operare compatibil multimedia
(pentru interpretarea informaiei multimedia prin
compresie/decompresie n timp real, transfer direct pe disc,
scheduling, l/O streaming), s aib l/O eficiente i rapide
(pentru nregistrri i redri n timp real), capacitate de stocare
i memorare mare (evident, n termeni relativi, spre exemplu
peste 50 -100 GB spaiu de stocare i peste 50 -100 MB
memorie, memorie cache suficient), acces la reele de date
(inclusiv nternet), instrumente software dedicate, user-friendly,
pentru manipularea informaiei multimedia, proiectarea,
dezvoltarea i furnizarea acesteia.
Pentru o relativ standardizare au fost propuse normele
Multimedia Personal Computer (MPC) Marketing Council,
MPC2" care se dovedesc din ce n ce mai depite pentru a
defini un sistem multimedia: un procesor cel puin 66MHz
486DX2, 8MB memorie RAM: i 540MB hard drive, CD-ROM
double-speed cu timp de acces cel mult 280ms, o plac de
sunet16-bit i un video adapter care suport culori minim
reprezentate n 16-bit.
Un sistem multimedia poate cuprinde:
- dispozitive de achiziie (camer video, Video Recorder,
microfon, tastatur, mouse, tablet grafic, dispozitive de
intrare 3D, senzori tactili, dispozitive de intrare Virtual Reality,
dispozitive de digitizare);
- dispozitive de stocare a informaiei multimedia (Hard disk-uri,
CD-ROM, Jaz/Zip drives, DVD etc);
- dispozitive de conectare la reele de calculatoare (Ethernet,
Token Ring, FDD, ATM, ntranets, nternets);
- sisteme de calcul (sisteme Multimedia Desktop,
Workstations, hardware MPEGA/DEO/DSP);
- dispozitive de ieire/ afiare (cti CD-quality, digital High
Definition TeleVision HDTV, Super Video Graphics Adapter
SVGA, monitor Hi-Res, imprimant color, fax incorporat etc).
n general, tehnologia multimedia lucreaz cu volum mare de
date. Prin urmare, ca mediu ideal de stocare n acest domeniu
s-a impus de la nceput CD-ROM (vezi specificaiile MPC2) cu
capacitatea de peste 600MB. n urma evoluiei tehnologiilor n
domeniul stocrii optice (laser) a informaiilor au aprut abordri
noi. Este cazul DVD (Digital Versatile Disc), cu capaciti de
4
Sisteme multimedia
4GB sau 8GB (dar standardele nu sunt nc unitare i acceptate
de toi productorii). Diferena notabil adus de DVD fa de
CD se refer la capacitatea de stocare, mrit semnificativ att
prin faptul c pot folosi pentru scriere ambele fee ale discului,
ct i prin posibilitatea de nregistrare a informaiei pe dou
nivele de adncime, ceea ce dubleaz capacitatea iniial de
stocare.
n ce privete comunicarea ntre sisteme multimedia, s-a pus
problema transmisiilor digitale pentru utilizatorii obinuii. Astzi,
acestea se realizeaz n mod curent cu echipamente numite
MODEM-uri (Modulation - DEModulation) care folosesc tehnica
digital pentru transmiterea datelor pe liniile de comunicaie
obinuite (analogice). Datorit faptului c reelele telefonice
curente (numite i reele comutate) limiteaz viteza de transfer
a datelor la valori care nu fac posibil transmisii multimedia de
calitate, atenia s-a ndreptat spre echipamente cu fibre optice,
satelii sau reele locale rapide (care permit un flux crescut de
date).
Tendinele n domeniul multimedia includ World Wide Web
MBone (Multicast Backbone, echivalent radioului i televiziunii
convenionale, dar transmise prin nternet), tehnologiile de
integrare i implementare a cerinelor multimedia. Carrier,
Switching, protocoale, aplicaii, algoritmi de
codificare/compresie, baze de date). Se sper c viitorul va
aparine autostrzilor multimedia, pe care vor fi vehiculate filme
sau muzic la cerere.
1.&.. !ispo)itive de intrare pentru sisteme multimedia
Dispozitivele de comunicare cu calculatorul au evoluat i s-au
specializat odat cu creterea complexitii aplicaiilor
multimedia. Unui sistem modern i se pot ataa diferite
dispozitive de intrare. n principiu, se consider c orice
dispozitiv de introducere date, altul dect tastatura, face parte
din categoria dispozitivelor alternative de intrare.
Mouse (figura 1-1 a) este un dispozitiv introdus de Xerox
Corporation i rspndit pe desk-top computers de Apple
Computer. Este o cutie mic din plastic dotat cu dou sau trei
butoane identificate prin L(left), R(right) i/sau M(middle).
Butoanele pot fi apsate independent n timp ce mouse-ul este
deplasat pe o suprafa plan (mouse-pad). Prin intermediul
unei aplicaii driver, deplasarea se traduce prin asocierea pe
ecranul monitorului a unui indicator (avnd forma dictat de
programul ce sesizeaz driver-ul mouse). Starea butoanelor
este controlat de minim 70 ori/sec.
(a) (b) (c) (d)
Figura 1#1. !ispo)itive alternative de introdu%ere a
informa"iei multimedia. *a+ mouse, *b+ tra%- ball, *%+
tra%- ball in%orporat *sisteme portabile+, *d+
tou%' pad.
5
Ciprian-Daniel NEAGU, Severin BUMBARU
Utilizarea aplicaiilor grafice este un non-sens fr existena
unui dispozitiv compatibil mouse pentru acionarea
pictogramelor disponibile. Poate fi conectat prin dou tipuri de
conectori: PS/2 (rotund), respectiv priza serie COM father cu 9
ace, sau poate fi fr cablu (cordless mouse). Ultimul tip
comunic prin intermediul undelor radio sau infraroii. Din
punctul de vedere al digitizrii deplasrii, poate fi de tip mecanic
(o bil de cauciuc, aflat n partea inferioar, transfer
deplasarea ctre poteniometre (X,Y)), optomecanic (deplasarea
mingii este detectat prin senzori optici) i optic (fr
componente mecanice, bila de cauciuc este nlocuit cu un
dispozitiv optic de citire a unor linii aflate pe un pad de
construcie special).
Tra)3 4all (figura 1-1b) este un dispozitiv de intrare similar ca i
comportament i construcie mouse-ului, cu singura deosebire
c mecanismul de micare se bazeaz pe acionarea direct,
cu mna, a bilei de cauciuc (n unele cazuri este incorporat
direct n tastatur. Variantele au fost implementate iniial pe
sisteme Macintosh i, datorit economiei de spaiu, sunt
preferate pe sistemele portabile (figura 1-1c).
T(&)0 pa' (figura 1-1 d) este o suprafa mic, sensibil la
atingere i presiune (pentru direcie i sens), folosit ca
alternativ la track ball pe sisteme portabile.
Ta4le$a 'i+i$i5(are este un dispozitiv de intrare ce const dintr-
un stilou (numit i puck) i un pad (de fapt o tablet electronic).
maginile desenate pe pad sunt convertite n cod procesat i
afiat pe ecran. Este livrat cu instrumente software specifice
prin care tableta electronic devine foaia de desen de pe ecran
iar stiloul (ce poate servi i la alegerea liniilor, caracterelor i
culorilor), devine o pensul sau un creion de haurare. Poate fi
insoit de o folie transparent de plastic ce se suprapune peste
pad astfel nct pe tablet se pot aeza desene sau fotografii
care s fie reproduse prin trasare pe ecran. Difer de mouse
prin faptul c toate deplasrile sunt relative la poziia curent a
cursorului. Variantele actuale furnizeaz i un mod emulat
mouse, n care stiloul acioneaz ca un mouse.
T(&)0 #)reen este un dispozitiv de intrare care permite
alegerea comenzilor ctre calculator prin simpla atingere a
ecranului. ntrodus odat cu Hewlett Packard HP-150, lucreaz
pe principiul emiterii unei reele de raze infraroii n vecintatea
ecranului. Dac reeaua este ntrerupt ntr-un punct, se
genereaz o valoare unic a poziiei, ce se transmite
calculatorului. Aceasta nseamn c poziionarea ctre un
command box aflat n colul stnga-jos al ecranului (originea
sistemului de coordonate al reelei) conduce la ntreruperea
reelei la coordonatele (0,0).
Crei(n&l (p$i) (light pen, figura 1-2a) este o combinaie ntre
touch screen i tableta digitizoare, prin care pad-ul optic devine
touch screen iar activrile coordonatelor de ecran (spre
exemplu, selectarea unor obiecte) i, implicit, apelul funciilor
pictogramelor, sunt realizate prin transformarea stiloului n
creion optic. Monitorul are incorporat un detector sensibil la
lumin care s permit selectarea poziiilor de pe ecran.
6
(a) (b) (c)
.igura 1#. !ispo)itive alternative de introdu%ere a
informa"iei multimedia/ *a+ lig't pen, *b+
$oysti%-, *%+ s%anner.
-(1#$i)3 (figura 1-2b) este un dispozitiv de intrare folosit n
special n aciuni de control de timp real pe ecran. Majoritatea
acestora lucreaz n modul similar tastelor autorepetitive de pe
tastatur. Manipulatorul (stick) este acionat ca un simplu
mecanism bazat pe nchiderea unuia din cele patru circuite
(N,S,E,V). nformaia este interpretat n mod uzual ca un cod
caracter specific i calculatorul execut instruciunea prin apelul
unei anumite funcii componente a programului de interaciune
grafic (spre exemplu, deplasarea unui obiect ntr-o anumit
direcie). La un moment dat, un singur buton este acionat (dar
i joystick-ul este n acelai timp poziionat n spaiu). Poate
avea i dou butoane numite triggers. Este utilizat n
simulatoare (inclusiv jocuri), n sisteme CAD/CAM, n general n
programe interactive de poziionare a cursorului pe ecran sau
generarea n timp real pe ecran a imaginilor grafice.
S)anner (figura 1-2c) este un dispozitiv destinat prelurii
imaginilor de pe fotografii. maginile, rasterizate la o rezoluie
care depinde de calitatea scannerului, sunt introduse n fiiere
ce pot fi apoi prelucrate de diverse aplicaii multimedia.
maginile obinute pot fi transferate pe ecran sau la imprimant.
Marea majoritate a scanner-elor au o rezoluie de 300 dpi,
diferena ntre ele fiind dat de viteza de parcurgere a imaginii.
O pagin 27x20 cm este parcurs, n medie, n 30 secunde.
Constructiv, scanner-ele prezint dou modele. Scanner-ul cu
pad fix i cititor mobil este similar ca form mouse-ului (figura 1-
2c), practic, dar cu probleme la digitizarea imaginii. Calitatea
imaginii preluate depinde de pstrarea constant a vitezei de
parcurgere, dependent de micarea minii, existnd
posibilitatea "alunecrii" unor poriuni ale imaginii. Scanner-ul
cu cititor fix i pad mobil are viteza de citire constant, dar este
o idee ceva mai rigid n manipulare.
Scanner-ele sunt nsoite de programe de recunoatere a
caracterelor digitizate obinute din prelucrarea imaginilor text i
de convertire a acestora n fiiere document (bazate pe tehnici
OCR - Optical Character Recognition).
7
Sisteme multimedia
Ciprian-Daniel NEAGU, Severin BUMBARU
1.&.&. Pro%esarea sunetului/ dispo)itive digital audio
Dup cum se tie, sunetul reprezint o oscilaie care variaz
continuu n amplitudine - ceea ce determin nivelul sonor - sau
n frecven - ceea ce determin tonul sunetului. Sunetul n
general, muzica n special, sunt procesate pe sisteme
multimedia pa baza dispozitivelor de achiziie, a dispozitivelor
de redare, a dispozitivului de procesare digital a sunetului
(placa de sunet) i, nu n ultimul rnd, a aplicaiilor dedicate
pentru procesarea sunetelor.
Pla)a 'e #&ne$ (sound crd) este actorul principal, dispozitiv
care permite nu numai intermedierea dar preia o mare parte din
efortul de codificare/ compresie pentru a permite sistemului
multimedia s lucreze n timp real. Caracteristici: reprezentarea
sunetului pe minim 16b, procesarea sunetului n banda 44 MHz,
raportul semnal/zgomot trebuie s fie inferior cititorului CD-
ROM). Pentru gama de jocuri pe calculator (i nu numai) s-a
impus condiia compatibilitii cu standardul Sound Blaster. Este
util n aplicaii de convertirea sunetului nregistrat n format
digital/analog, sonorizarea sistemului multimedia (asocierea
unor secvene de sunete evenimentelor sistem), montaje audio
(realizarea mixajelor i a efectelor speciale), includerea
efectelor sonore n jocuri pe calculator i pagini web, sinteza
vocal.
Prima plac de sunet a fost creat de firma CREATVE LABS
fiind cunoscut i cu numele de 0ound1laster. Pe o plac de
sunet observm un bloc MXER care poate accepta intrri
analogice de la microfon, linie audio sau difuzor PC i care pot
fi controlate individual. n plus, blocul MD (Musical nstrument
Digital nterface) primete comenzi pentru selectarea unor
instrumente sau efecte audio.
Odat ce sunetul a fost convertit n form digital, poate fi
prelucrat pentru a crea efecte ca reverberaii, ecouri, distorsiuni
controlate etc. Calculele necesare acestora sunt realizate de
procesoare specializate numite DSP (Digital Signal Processing)
Tot acestea pot asigura i sinteza sunetului sau a muzicii
precum i funciile de comprimare i decomprimare. Cercetrile
fcute n domeniul sintezei sunetelor au permis generarea
acestora din nsumarea mai multor semnale sinusoidale cu
frecvene diferite. Un capitol special din matematic se ocup
cu analiza armonic a semnalelor. Folosind rezultatele acestor
analize, s-a reuit sinteza sunetului prin modularea de
frecven (Frequency Mode, FM).
n scopul asigurrii suportului pentru ca sistemele multimedia,
instrumentele muzicale, sintetizatoarele s poat transfera date
referitoare la sunete, a fost implemetat un set de reguli numit
MD (Musical nstrument Digital nterface). MD permite
muzicienilor s foloseasc un sistem de calcul pentru a realiza,
nregistra i edita muzic. O plac de sunet comptibil MD
este o garanie c sistemul de calcul multimedia utilizat poate
genera sunetele regsite, spre exemplu, n jocurile pe
calculator, digital CD-ROM, i pachetele de promovare/
prezentare multimedia.
Pentru ca sunetul s poat fi preluat de placa de sunet, n cazul
n care se doresc nregistrri personalizate, se poate utiliza
microfonul ca dispozitiv de intrare ctre placa de sunet.
Utilizarea microfonului permite inserarea secvenelor sonore n
fiiere, precum i nregistrarea vocii i inserarea adnotrilor
vocale n cadrul documentului.
8
Sisteme multimedia
nstrumentele compatibile MD (claviaturi, sintetizatoare)
permit, cu condiia asigurrii compatibilitii de plac,
compunerea melodiilor (nregistrare, acompaniament/ baterie
pe mai multe canale), editarea partiturilor (afiarea notelor pe
portativ cu semnele muzicale specifice).
n ceea ce privete aplicaiile de prelucrare a sunetului n format
digital, acestea pot fi privite att din punctul de vedere al
fabricrii sunetului, ct i al utilizrii acestuia. Din ultima
categorie pot fi amintite plug-ins, aplicaii speciale care permit
audierea documentelor hypermedia cu informaie sonor
nglobat (spre exemplu, aplicaiile real-player, audio-player
etc). Pentru prelucrarea sunetului, aplicaiile proceseaz
informaia digital, acionnd asupra unei game variate de
parametri ai sunetului, salvai n diferite formate de fiiere.
Data audio este caracterizat de parametri ca: frecvena (spre
exemplu, frecvena telefonic standard, 8000 Hz, sau frecvena
uzual pentru nregistrrile CD-ROM, 44100 Hz), numrul de
bii folosii pentru codificare (spre exemplu, 8 sau 16) i numrul
de canale (1 pentru mono, 2 pentru stereo etc). nformaia
despre sunet este salvat n fiiere care stocheaz nu numai
cantitativ parametrii sunetului, dar realizeaz diferite prelucrri
(n general algoritmi de compresie).
Printre tipurile de fiiere de sunet mai cunoscute pot fi
enumerate: .wav, WAVE (proprietar Microsoft i BM, include ca
parametri frecvena, numrul de canale, limea de band, alte
informaii), .voc (proprietar Soundblaster, include frecvena, 8b/
1 canal, compresie prin tergerea sunetului alb), .aif(f), AFF
(proprietar Apple, SG, include ca parametri frecvena, numrul
de canale, limea de band, alte informaii), .au sau .snd
(proprietar NeXT, Sun, include ca parametri frecvena, numrul
de canale, codificare, ir info).
Pentru prima categorie de aplicaii de prelucrare a sunetului, un
exemplu este Macromedia Soundedit (figura 1-3).
.igura 1#&. Apli%a"ia 2a%romedia 0oundedit/ lista de
op"iuni de meniu 3ffe%ts, fereastra prin%ipal4 5i
fereastra de %ontrol.
O categorie de aplicaii specializate, adresate muzicienilor,
permit nu numai prelucrarea benzii sonore, dar i prelucrarea
secvenelor i notaiilor mizicale. n general, acestea suport
standardul MD, furnizeaz diferite tipuri de
9
nsert Modify
Ciprian-Daniel NEAGU, Severin BUMBARU
interfee (staff, piano roii, lista evenimentelor), chiar i un pian
virtual, pot insera fiiere WAV i comenzi de sistem (animaie i
video) n nregistrri.
.igura 1#6. .ereastra Cubase 7ransport 1ar# emulea)4 o
interfa"4 7ape
8e%order.
U66666666 6 Anan7"!!- -L8-ni&7all7niai-$7%i$i
66666666666667 7 BB
.igura 1#9. .ereastra Cubase Arrange pentru
aran$amente mu)i%ale.
Un exemplu de astfel de aplicaie de aranjament muzical este
Cubase, care beneficiaz de o interfa intuitiv pentru
aranjamente i interpretri muzicale (figurile 1-4 i 1-5), ca i o
palet larg de instrumente de editare, printre care prelucrarea
parametrilor sunetului (figura 1-6) i editarea partiturilor
muzicale (figura 1-7).
.igura 1#:. .ereastra Cubase Audio 3diting %u lista de
fun%"ii 3dit.
10
Sisteme multimedia
.igura 1#;. Cubase 0%ore <otation 0'eets 3diting.
1.&.6. Pro%esarea imaginilor/ dispo)itive grafi%e
Odat cu inventarea filmului, fiecare consumator de imagine a
devenit atras de abilitatea de a putea participa sau crea o
replic virtual a lumii reale. Astzi, filmul, televiziunea i video
sunt rspndite peste tot n lume. n consecin, consumatorul
de imagine a nceput s considere multimedia, componenta
vizual n special (receptor video), ca o prezen subneleas
n cadrul sistemului multimedia.
Prelucrarea semnalelor video preluate de camere digitale sau
semnalul TV urmeaz aceleai principii ca i cele de prelucrare
a sunetului, dar la o alt scar. Semnalul video transformat n
semnal digital poate fi comprimat pentru ca s ocupe un spaiu
mai mic la stocare sau n procesul de transmitere. La redare se
apeleaz procesele inverse.
n plus, apar unele elemente noi, specifice informaiei vizuale.
Astfel, s-au proiectat metode specifice de comprimare care in
cont de faptul c imaginea, de la un cadru la altul, se schimb
foarte puin, transmindu-se eventual numai schimbrile
survenite, pstrnd ca baz un cadru iniial. Este vorba de
rezultatul aplicrii metodelor cunoscute sub numele de MPEG,
pe baza plcilor de decompresie video, pentru micorarea
efortului de calcul al sistemului multimedia. Pentru imagini
statice sunt cunoscute fiierele cu extensia JPG, ce provin din
folosirea metodei JPEG de comprimare a imaginilor (detalii
despre formatele fiierelor grafice vor fi date n seciunile
urmtoare). Astfel de operaii sunt realizate de plci de achiziie
video, respectiv de decompresie video. Achiziia video
realizeaz digitizarea semnalelor video de la
magnetoscop/camera video i are ca rezultat montarea
prezentrilor video i a filmelor prin tratarea secvenelor video.
Sateliii de comunicaii destinai transmisiilor TV digitale
folosesc tehnici proprii semnalelor digitale pentru codare i
compresie.
11
Ciprian-Daniel NEAGU, Severin BUMBARU
maginile afiate pe ecranul unui monitor ("raster images")
folosesc o suprafa dreptunghiular de celule luminoase
numite pi2eli (denumire provenind de la o prescurtare a
expresiei "picture elements"). Aceste imagini se mai numesc i
hri de pixeli. Cel mai simplu exemplu de astfel de imagine
este o suprafa format din pixeli de culoare alb i neagr
(pentru care sunt necesare doar valorile binare 0 i 1 pentru
codificare). Aceast imagine este numit hart de bii =bitmap+.
Prin extensie, imaginile afiate de calculator n nuane de gri vor
reprezenta pixelii prin atribuirea unei valori din intervalul 0-255
(cu alte cuvinte, 256 nuane de gri de la negru la alb,
reprezentate pe 8 bii). n practic exist mai multe posibiliti
de codificare a imaginilor colorate. Le vom discuta i
exemplifica n seciunile urmtoare. Pixelul este caracterizat de
dimensiune i de distana dintre punctele adiacente.
Dimensiunea pixelului este dat de diametrul punctului luminos
i depinde de caracteristici tehnice (fascicolul focalizat al tunului
de electroni, calitatea ecranului i a substanelor
fotoluminiscente folosite). Distana dintre dou puncte
luminoase adiacente trebuie s fie mai mic dect diametrul
pixelului.
Evoluia dispozitivelor grafice de afiare nu este la fel de
spectaculoas ca a procesoarelor, neputnd viza
miniaturizarea. Cum imaginea se adreseaz ochiului uman,
productorii sunt obligai s respecte limitrile fiziologice ale
acestuia. Cele mai folosite sunt cele avnd diagonala de 14",
15", 17", 21". Dispozitivele grafice de afiare (numite i "raster
display") constau dintr-o suprafa bi-dimensional format din
pixeli. Tehnologic, sunt uzuale dou tipuri de dispozitive de
afiare: video display i display cu cristale lichide.
CPU
1/0 Devices
!
j% System bus
System
Memory
53
O DeviccS / System bus
12
.igura 1#> Configura"ia unui sistem de afi5are a imaginii/
*a+ ar'ite%tura standard, *b+ ar'ite%tur4 %u
a%%elerator grafi%.
Sisteme multimedia
9i'e( 'i#pla1 este un ecran cu o pelicul foto-luminiscent pe
baz de fosfor, care permite fiecrui pixel al su s fie luminos
doar cnd este lovit de un fascicol de electroni. Un pixel poate,
prin urmare, s fie luminos (alb) sau nu (negru). Nivelul de
intensitate poate fi modificat pentru a obine diferite nuane de
gri. Deoarece pelicula fosforescent i pierde luminozitatea,
imaginea trebuie rescanat repetat, cu o frecven de cel puin
60 ori pe secund.
M REZOL BrTSfP MOD REZOL BrTS
( * 9 a ( C r e
T C r : C Gri r 0 4
C r ! < r $
B'rTES BYTES
sta Applel
MOD REZOL BTS/P MOD REZOL BTS/P
C r (S 8 (S *0 r 8
( ?0 r 4 T Ori r r ;
r
80x70
r t r
80x70
0 t
B'rTES BYTES:
aj3oie Applet
(c) (d)
.igura 1#@. 8e)olu"ia 5i dependen"a de num4rul de bi"i pe
pixel, %uloare 5i
dimensiune/ *a+ imagine %olorat4, re)olu"ie mare, >b
%uloare, *b+ imagine
%olorat4, re)olu"ie mi%4, 6b %uloare, *%+ imagine gri,
re)olu"ie medie, >b
nuan"e de gri, *d+ imagine albAnegru, re)olu"ie mi%4, 1b
%uloare.
13
AM^lOl*) AppW
Ciprian-Daniel NEAGU, Severin BUMBARU
A,i<a=&l )& )ri#$ale li)0i'e (Liquid Crystal Display, LCD) este
un dispozitiv care folosete un cmp electric pentru a modifica
polarizarea celulelor cristaline la nivelul fiecrui pixel. Fiecare
astfel de celul este caracterizat de strlucire: prin schimbarea
polarizrii pe pixel, se modific nivelul strlucirii, deci
intensitatea afirii pixelului.
Afiarea la ecran (indiferent de tip) poate fi fcut esenial n
dou moduri: n regim text i n regim grafic, sub controlul
a'ap$(r&l&i +ra,i)7 Adaptoarele grafice reprezint dispozitivele
care permit unui PC s transmit semnale spre dispozitivele de
afiare. Adaptoarele grafice mai sunt numite de diveri
productori: video cards, video boards, video display boards,
video controllere, graphics cards sau graphics adapters (figura
1-8).
n regim grafic, ecranul este considerat format din pixeli. Fiecare
pixel poate fi aprins sau stins de spotul electronic, independent
de ceilali. Pixelii ecranului sunt pui n coresponden
biunivoc cu biii din memoria video (video buffer), aflat, n
general, n blocurile 10 i 11 ale memoriei interne. Aceast
memorie este controlat, bit cu bit, de un numr de ori pe
secund (min. 60), coninutul 0/1 determinnd
aprinderea/stingerea pixelului corespunztor. Orice scriere n
aceast zon de memorie are efect instantaneu pe ecran.
Re5(l&.ia dispozitivului grafic reprezint produsul dintre
numrul de pixeli pe linie i coloan. Rezoluia definete
dimensiunea (exprimat n pixeli) a dreptunghiului n care
imaginea este practic reprezentat (fereastra de vizualizare).
Pentru a exemplifica conceptul de rezoluie, ca i dimensiunea
unei hri de bii, n strns legtur cu paleta de culori i
adncimea de culoare (numrul de bii utilizai pe pixel),
propunem applet-ul de mai jos (mageRes.java):
Rezultatul aplicaiei este dat n figura 1-9(a-d).
Applet 1#1. Imageres.$ava.
/* ###################################################
- Imageres.j ava
- Modificat si adaptat: 2001 Dan Neagu
- Copyright (c 2 000 !art "erhoeven and
#.$.%euven&
- 'II (ights
(eserved. )
import
*ava.app+et.),
import j
ava.a-t.), import
java.net.),
import
java.+ang.),
pu.+ic c+ass Image(es e/tends
'pp+et 0 Image12 data,
Media3rac4er trac4er 5 ne-
Media3rac4er(this , Chec4.o/6roup
co+or7group, Chec4.o/12 co+or,
Chec4.o/6roup reso+ution7group,
Chec4.o/12 reso+ution, Chec4.o/6roup
.its7group, Chec4.o/ 12 .its,
18
Sisteme multimedia
int co+or7nr 5 9,
int reso+ution7nr 5 9,
int .its7nr 5 9,
3e/t:ie+d .ytes 5 ne- 3e/t:ie+d(10,
pu.+ic void init( 0
set+mages(,
set%ayout(ne- !order%ayout( ,
;ane+ p 5 ne- ;ane+(,
p.set%ayout(ne- 6rid!ag%ayout( ,
constrain(p&ne-
%a.ei(<M9D<&java.a-t.%a.ei.C=N3=(
&0&0&ne- Insets(2&2&2&2,
constrain(p&ne-
%a.ei(<(=>9%$?I=<&java.a-t.%a.ei.C=N3=(
&1&0&ne- Insets(2&2&2&2,
constrain(p&ne- %a.ei(<!I3@A;IB=%<&j
ava.a-t.%a.ei.C=N3=(&2&0&ne-
Insets(2&2&2&2 ,
co+or7group 5 ne- Chec4.o/6roup (,
co+or 5 ne- Chec4.o/122,
co+or102 5 ne-
Chec4.o/(<Co+orat<&co+or7group&true,
co+or1+2 5 ne-
Chec4.o/(<6ri<&co+or7group&fa+se,
constrain(p&co+or102&0&1&ne-
Insets(2&2&2&2,
constrain(p&co+or112&0&2&ne- Insets
(2&2&2&2,
reso+ution7group 5 ne- Chec4.o/6roup(,
reso+ution 5 ne- Chec4.o/1*2,
reso+ution102 5 ne-
Chec4.o/(<800/*00<&reso+ution7grou
p&true,
reso+ution112 5 ne-
Chec4.o/(<1C0/180<&reso+ution7grou
p&fa+se,
reso+ution122 5 ne-
Chec4.o/(<D0/E0<&reso+ution7group&
fa+se,
constrain(p&reso+ution102&1&1&ne-
Insets(2&2&2&2,
constrain(p&reso+ution112&1&2&ne-
Insets(2&2&2&2,
constrain(p&reso+ution122&1&*&ne-
Insets(2&2&2&2,
.its7group 5 ne- Chec4.o/6roup(,
.its 5 ne- Chec4.o/ 1*2 ,
.its102 5 ne- Chec4.o/(<D<&.its7group&true,
.its1+2 5 ne- Chec4.o/ (<8 <& .its7group&
fa+se &F
.its 122 5 ne-
Chec4.o/(<1<&.its7group&fa+se ,
constrain(p&.its102&2&1&ne-
Insets(2&2&2&2,
constrain(p&.its 112 &2&2&ne-
Insets(2&2&2&2,
constrain (p& .its 122 &2& * & ne- Insets
(2&2&2&2 &F
.ytes.set=dita.+e(fa+se,
;ane+ pane+ 5 ne- ;ane+(,
pane+.set%ayout(ne- :+o-%ayout(,
pane+.add(ne- %a.ei(<!G3=@:
<&java.a-t.%a.ei.C=N3=(,
pane+. add (.ytes &F
constrain(p&pane+&1&8&ne- Insets(2&2&2&2&H
add(<@outh<&p,
1I
Ciprian-Daniel NEAGU, Severin BUMBARU
>
private void set+mages9 0 data 5
ne- Image 1*)*)*2 , for (int
i5+,iJ52,iKK for (int j5+,jJ5*,jK
K for (int 45+,4J5*,4KK 0 @tring
name5iK<<K<<KjK<<K4K<.gif<,
@ystem.out.print+n(name, try 0
Image image 5 get+mageLne-
java.net.$(%(getCode!ase(&name,
int ID5(((iF+)*KjF
+)*K4F+,
trac4er.add+mage(image&
ID, data1ID25image,
@ystem.out.print+n(<o4<
,
M
catch (java.net.Ma+formed$(%=/ception
e 0
@ystem.out.print+n(<canNt get image <
K name, M
M
try 0 trac4er.-ait:or+D(9, M
catch (Interrupted=/ception e 0
@ystem.out.print+n(<canNt get image<,
M
M
pu.+ic void paint
(6raphics g 0 for (int
i50,iJ2,iKK
if (co+or1i2.get@tate(
co+or7nr 5 i, for (int
i50,iJ*,iKK
if (reso+ution1i2 .get@tate (
reso+ution7nr 5 i, for (int i50,iJ*,iK
K
if (.its 1i2 .get@tate( .its7nr 5
i, int
ID5(co+or7nr)*Kreso+ution7nr)*K.its
7nr,
.ytes.set3e/t(@tring.va+ue9f(ca+c.yt
es(, if (Itrac4er.chec4+DOD
try
(trac4er.-ait:or+D(ID,M
catch
(Interrupted=/ception e 0
sho-@tatus(<;+ease -ait -hi+e
+oading ...<,
M
g.d!"#$!g%&d!'!(I)*+0+0+',-./0
>
pu.+ic .oo+ean action(=vent e& 9.ject o
0 if (e.target instanceof Chec4.o/
(repaint(,M return super.action(e& o,
M
private void constrain(Container
container& Component component&int grid/& int
gridy& Insets insets 0
1C
Sisteme multimedia
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
c.grid/ 5 grid/,
c.gridy 5 gridy,
c.insets 5 insets,
( (6rid!ag%ayoutcontainer.get%ayout(
.setConstraints(comp onent&c,
container.add(compon
ent, M
pu.+ic int
ca+c.ytes9 0 int t ,
s-itch
(reso+ution7nr 0
case 0:t5800)*00,.rea4,
case +:t51C0)180,.rea4,
defau+t:t5D0)E0,.rea4,
M
s-itch (.its7nr 0
case 0:.rea4,
case 1:tA52,.rea4,
defau+t:tA5D,.rea
4, M return t, M
Rap(r$&l a#pe)$&al (aspect ratio) reprezint raportul dintre
numrul de puncte pe vertical, respectiv pe orizontal,
necesare pentru a produce linii de lungime egal n ambele
direcii ale ecranului. Spre exemplu, raportul aspectual
&
A indic
faptul c o linie vertical compus din trei pixeli are aceeai
lungime cu linia orizontal de patru pixeli.
n regimul text, ecranul este considerat mprit n 25 linii de 80
coloane fiecare; n fiecare zon fiind afiate diferite caractere
grafice (litere, cifre, simboluri etc). Si n aceast regiune,
ecranul este pus n coresponden biunivoc cu o parte a
memoriei din blocurile 10 i 11, de data aceasta zonele de
ecran fiind asociate cu octeii ce definesc caracterele text.
ndiferent de tipul dispozitivului de afiare, pentru ca imaginea
s fie afiat, memoria video (frame buffer) este citit de un
dispozitiv hardware, numit plac video (video controller sau
adaptor grafic). Schema din figura 1-8a prezint o seciune a
configuraiei unui sistem pentru afiarea imaginii.
n cazul n care se dorete o cretere a calitii i vitezei de
afiare n mod grafic, adaptorul grafic este "nzestrat" cu
memorie video suplimentar i cu dispozitive de procesare
grafic (coprocesor grafic), care preiau o mare parte din
sarcina de procesare grafic realizat prin software de unitatea
central de prelucrare (Central Processing Unit, CPU). Acestea
se numesc (figura 1-8b) a))elera$(are ?pl/)i@ +ra,i)e (pentru
deintorii de PC).
n figura 1-10 este descris arhitectura unui accelerator grafic.
Astfel de arhitecturi devin din ce n ce mai complexe, pe
msur ce cresc cerinele de procesare a imaginilor i
elementelor de grafic.
17
Ciprian-Daniel NEAGU" Severin BUMBARU
(.irapliicspon
S1ne0r(n(&#
DRAM or
douWe ikiia
r.ite %)%(r1
.igura 1#1B. Ar'ite%tura a%%eleratorului grafi%.
Acceleratorul grafic preia, practic, realizarea urmtoarelor
operaii:
- transformri (rotaii i scalari, v. capitolul 4), aprute n
reprezentarea obiectelor n micare sau a modificrii poziiei
observatorului;
- decupaje, ce provin din deplasarea obiectelor n afara
ferestrei de vizualizare;
- proiecii, pentru redarea imaginilor folosind transformrile
prospective;
- texture mapping: colorarea obiectelor i umplerea
suprafeelor;
- eliminarea suprafeelor ascunse, prin determinarea acelor
obiecte care se proiecteaz n acelai pixel i sunt mai
apropiate de observator, pentru a putea fi afiate.
1.&.9. 8epre)entarea %ulorii
Metoda de reprezentare a culorii depinde de caracteristicile
tehnice ale dispozitivului grafic de ieire (n general de tip aditiv
pentru adaptoarele grafice) i de numrul de bii asociai unui
pixel (atribut numit adncimea de culoare, pixel depth). Spre
exemplu, metoda cea mai utilizat att pentru afiarea video ct
i LCD este reprezentarea aditiv (un exemplu este
reprezentarea RGB n 24 bii), n timp ce pentru imprimare,
metoda de reprezentare cea mai folosit este metoda
extractiv. .Un model extractiv de culoare (spre exemplu,
reprezentarea CMYK n 32 bii) creaz culoarea prin extragerea
lungimilor de und (nuanelor) ale razelor reflectate de obiectul
considerat. Spre exemplu, cerneala este albastr dac
absoarbe toate culorile, cu excepia albstruiul
8159
18
Sisteme multimedia
maginea (hart de bii sau vectorial) este reprezentat de un
ansamblu de puncte, caracterizate prin codificarea culorii,
astfel:
- pentru imagine alb/negru este suficient codificarea unui
pixel cu 1 b (2 valori, 0/1);
- pentru imagine n patru culori (alb, gri deschis, gri nchis,
negru), informaia este codificat pe 2b (4 valori, 0-5-3);
- pentru imagine pe 16 niveluri gri se folosete codificarea pe
4b (16 valori, 0+2
4
);
- pentru imagine fotografic alb/negru se folosete
codificarea pe 8b (2
16
=256 niveluri de gri);
- pentru imagine fotografic n culori uor distinctive, 256
culori sunt suficiente (codificarea pe 8b din paleta de culori);
- pentru imagini fotografice TrueColor, se folosete codificare
RGB pe 24b (2
24
=16,7 milioane culori).
RGB (Red, Green, Blue) desemneaz un principiu de codificare
a unei culori n domeniul prelucrrii imaginilor. Din fizic se tie
c o culoare este constituit din asocierea a trei culori de baz.
Pentru a cuantifica o culoare, aceasta se descompune n
componentele rou, verde, albastru, nainte de a msura cota
de participare a fiecreia dintre ele. Prin urmare, fiecare pixel
este reprezentat ca o combinaie de nuane rou, verde,
albastru, fiecare dintre ele reprezentate fizic pe 8 bii (0 pentru
negru i 255 pentru nuana cea mai luminoas
corespunztoare). Prin urmare, o codificare RGB pe 24 bii
poate permite reprezentarea a 256x256x256= 16777216 culori,
deci peste 16,7 milioane culori, conducnd la obinerea
imaginilor TrueColor (un degrade continuu pe toate spectrele de
culoare).
Un alt model pe 24 bii utilizat n sistemele de imprimare grafic
este CMA (Cyan, Magenta, Yellow, figura 1-11b). Modelul CMY
este inversul modului RGB, cu valorile de culoare variind n
acelai domeniu 0..255.
n multe sisteme grafice este uzual utilizarea unei a patra
componente (numit A - alpha). Aceasta este folosit n
reprezentarea unor efecte speciale variate, cea mai des
ntlnit fiind opa%itatea %ulorii.
Un alt principiu de reprezentare a culorii des ntlnit este CMAB
(Cyan Magenta Yellow blacK). n modul CMYK, valorile de
culoare se exprim ca procente, valoarea 100 pentru oricare
component corespunde aplicrii acesteia la valoarea maxim
(saturare). Acest model de reprezentare a culorilor este ntlnit
n special la dispozitivele de imprimare, codificarea fiind
principial similar modelului CMY. Adugarea componentei K
(blacK) permite obinerea culorii negre prin definiie, i nu ca o
combinaie de culori, prin urmare i acoperirea natural a
ntregului spectru de culori.
Vom exemplifica prin cteva modele de codificare a culorii
utilizate, n aplicaia Java urmtoare, prelucrat dup sursa
original (vezi clasele de mai jos; codul complet i copyright
sunt adugate n Anexa ). Aplicaia afieaz cteva informaiii
legate de modul de codificare, ca i un desen sugestiv privind
realizarea codificrii, astfel nct utilizatorul s i poat da
seama unde se afl n spaiul culorilor. Cele trei bare de defilare
orizontale permit controlul celor trei parametri ai spaiului
culorilor (Red, Green, Blue). La dreapta fiecrei bare
19
Ciprian-Daniel NEAGU, Severin BUMBARU
de defilare este dat valoarea n domeniul normalizat [0,1] a
parametrului. Dreptunghiul din partea inferioar a appiet-ului
afieaz valoarea curent obinut de utilizator prin modificarea
valorilor celor trei parametri.
B#1%
+5-
R%d
M!g%2'
!
:C
AC-----------\y
* f Dr
\
Z~7
s#-----------ED
F / \
F 1 A
M!g%2'
!
R%d B#1%
B#!34
&0+0+0/
$a%
W,-'% &1+1+1/W,-'% &0+0+0/
$&%
B#!34
&1+1+1/
.igura 1#11. Cubul %ulorilor/ *a+ %odifi%area 8G1 Hn
domeniul IB,1J, *b+ %odifi%area C2K Hn
domeniul IB,1J.
U'.Apple$ 9i$DEerF
,inalC(l(r7)la##
Apple$
.Jsl*]
Click fiere for more nformation.
5%3--
B#1%
Red
M!g%2'!
20
6!2
Applet started
.igura 1#1. Applet 8G1 pentru exemplifi%area
modelului 8G1 de %odifi%are a
%ulorilor.
Sisteme multimedia
Desenul din partea superioar a appiet-ului reprezint cubul
RGB (n vedere de-a lungul unei diagonale a cubului, de la
vrful alb (1,1,1) ctre vrful negru (0,0,0), liniile punctate
semnaliznd muchiile nevizibile, figura 1-11a). Pe msur ce
utilizatorul modific parametrii RGB, punctual albastru se
deplaseaz n interiorul cubului, semnaliznd poziia culorii
curente.
Cele dou grafice din centrul appiet-ului afieaz dou rampe
de culoare: cel din stnga folosete, n sistem de coordonate
2D, axele Green pe vertical i Red pe orizontal (deci planul
de culoare Blue=0.0, faa de jos a cubului RGB); cel din dreapta
are axa Red pe vertical i axa Blue pe orizontal (planul
Green=0.0). n interiorul acestora, punctul alb semnalizeaz
poziia relativ a culorii alese n planul specific. Culoarea poate
fi controlat de utilizator prin barele de defilare sau prin
%li%-ldrag n interiorul suprafeelor respective.
Rezultatul aplicaiei este redat n figura 1-12.
Applet 1#. Apli%a"ia 8G1/ rgbC'ooser.$ava.
I* ##################################################
- rg.Chooser.j ava
- Co+or @pace app+ets P support
programs )
import
java.app+et.),
import j
ava.a-t.), import
java.+ang.),
import j
ava.net.),
pu.+ic c+ass rg.Chooser e/tends Chooser 0
Co+or@p+atch cs,
pu.+ic @cro++.ar r@cro++,
pu.+ic @cro++.ar .@cro++,
pu.+ic @cro++.ar g@cro++,AAscro++.ars pt r&g&.
%a.ei r%a.e+,
%a.ei g%a.e+,
AA+a.e+s pt r&g&. scro++.ars
;ane+ rg.@cro++;ane+,AApane+ pt r&g&.
scro++.arsA+a.e+s Image imge, AA imaginea
cu.u+ui rg. Canvas canv, rg.Cu.e pic, !utton
.utt, 'pp+et ca++er, a/is rg'/is&.r'/is,
pu.+ic Insets insets9 0return ne-
Insets(8&8&I&I,M
pu.+ic void init(0myinit(this,M
pu.+ic void myinit ('pp+et a
0 ca++er 5 a,
AAiniLia+iQare
r&g&. r 5 1.0, g
5 1.0,
2
1
Ciprian-Daniel NEAGU, Severin BUMBARU
. 5 1.0,
6rid!ag%ayout grid.ag 5 ne-
6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set:ont(ne- :ont(<Re+vetica<& :ont.;%'IN&
18,
set%ayout(grid.ag,
.utt 5 ne- !utton(<C+ic4 here for more
information.< ,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.gridheight 5 1,
c.fi++ 5 6rid!agConstraints.R9(I>9N3'%,
grid.ag.setConstraints(.utt& c ,
add(.utt,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.gridheight 5 2,
c.-eighty 5 1,
c.-eight/ 5 1,
c.fi++ 5 6rid!agConstraints.R9(I>9N3'%,
pic 5 ne- rg.Cu.e9,
grid.ag.setConstraints(pic&c,
add(pic,
pic.myinit(a,
pic.set(6!(r&g&.,
rg'/is 5 ne- a/is9 ,
rg'/is.myinit(a&r&g&<red<&<green<&<(6!rg.gi
f<&
0.0&1.0&0.0&1
.0, .r'/is 5 ne- a/is(,
.r'/is.myinit(a&.&r&<.+ue<&<r
ed<&
<(6!.r.gif<&0.0&1.0&0.0&1
.0 , c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
c.gridheight 5 1, c.-eighty 5 1,
c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
grid.ag.setConstraints(rg'/is&c
, add(rg'/is,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.gridheight 5 1, c.-eighty 5 1,
c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
grid.ag.setConstraints(.r'/is& c ,
add(.r'/is, AAConstruire scro++.ars
rg.@cro++;ane+ 5 ne- ;ane+(, AA
'daug pane+ pentru rg. scro++.ars
c.grid-idth 5
6rid!agConstraints.(=M'IND=(, c.fi++
5 6rid!agConstraints.!93R,
c.gridheight 5 *,
grid.ag.setConstraints(rg.@cro++;a
ne+& c, add(rg.@cro++;ane+,
AA rg.grid.ag pentru scro++.ars P a+.
6rid!ag%ayout rg.grid.ag 5 ne-
6rid!ag%ayout(,
rg.@cro++;ane+.set%ayout(rg.grid.ag ,
c.gridheight 5 1,
AA adaug rg. scro++.ars P +a.e+s pe
pane+ r@cro++ 5 ne-
@cro++.ar(@cro++.ar.R9(I>9N3'%&
1000& I0& 0& 1000 ,
r@cro++. set!ac4ground(ne- Co+or
(2II&0&0 &Fc.-eighty 5 1.0,
c.-eight/ 5 1.0,
c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
rg.grid.ag.setConstraints(r@cro++&
c, rg.@cro+1;ane+.add(r@cro++,
r%a.e+5 ne- %a.ei(<(: 1.0<&
%a.ei.C=N3=(, c.grid-idth 5
6rid!agConstraints.(=M'IND=(, c.fi++
5 6rid!agConstraints.R9(I>9N3'%,
rg.grid.ag.setConstraints(r%a.e+&
c, rg.@cro+1;ane+.add(r%a.e+ ,
g@cro++ 5 ne-
@cro++.ar(@cro++.ar.R9(I>9N3'%&
1000& I0& 0& 1000
, g@cro++.set!ac4ground(ne-
Co+or(0&2II&0, c.-eighty 5 1.0,
c.-eight/ 5 1.0,
c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
rg.grid.ag.setConstraints(g@cro++&
c, rg.@cro++;ane+.add(g@cro++,
g%a.e+5 ne- %a.ei(<6: 1.0<&
%a.ei.C=N3=(, c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
rg.grid.ag.setConstraints(g%a.e+&
c, rg.@cro++;ane+.add(g%a.e+ ,
.@cro++ 5 ne-
@cro++.ar(@cro++.ar.R9(I>9N3'%&
1000& I0& 0&
1000 , .@cro++.set!ac4ground(ne-
Co+or(0&0&2II, c.-eighty 5 1.0,
c.-eight/ 5 1.0,
c.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
rg.grid.ag.setConstraints(.@cro++&
c, rg.@cro++;ane+ .add
(.@cro++ &F.%a.e+5 ne- %a.ei (<!:
1.0<& %a.ei. C=N3=( &Fc.fi++ 5
6rid!agConstraints.R9(I>9N3'%,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
rg.grid.ag.setConstraints(.%a.e+&
c, rg.@cro++;ane+.add(.%a.e+,
c.fi++ 5 6rid!agConstraints.!93R,
cs 5 ne- Co+or@p+atch(ne-
Dimension(80&80,
cs.set!ac4Co+or(r&g&.,
grid.ag.setConstraints(cs&c,
add(cs, repaint (,
Ciprian-Daniel NEAGU, Severin BUMBARU
pu.+ic .oo+ean
hand+e=vent(=vent evt 0
@tring s 5 ne- @tringL,
if ((evt.target 5 5.utt PP
(evt.id55=vent.'C3I9N7="=N3 0 try
0 ca++er.get'pp+etConte/t(.sho-Document(
ne-
$(%(ca++er.getCode!ase(&<inforg..htm+<
,
M
catch (=/ception e 0
@ystem.out.print+n(<=rror +oading
$(%<, M
M
e+se if (evt.target 55
r 5 ((dou.+e r@cro++.
r%a.e+.set3e/t(<(:< K
cs.set!ac4Co+or(r&g&.
pic.set(6!(r&g&.,
rg'/is.set"a+s(r&g,
.r'/is.set"a+s(.&r,
repaint(,
M
e+se if (evt.target 55
g 5 ((dou.+e g@cro++.
g%a.e+.set3e/t(<6:< K
cs.set!ac4Co+or(r&g&.
rg'/is.set"a+s(r&g,
.r'/is.set"a+s(.&r,
pic.set(6!(r&g&.,
repaint(,
M
e+se if (evt.target 55
. 5 ((dou.+e .@cro++.
.%a.e+.set3e/t(<!:< K
cs . set!ac4Co+or
(r&g&. &F
rg'/is.set"a+s(r&g,
.r'/is.set"a+s(.&r,
pic.set(6!(r&g&.,
repaint(,
M
e+se if (evt.target 55 rg'/is 0
r 5 rg'/is./,
g 5 rg'/is.y,
g%a.e+.set3e/t(<6:< K
r%a.e+.set3e/t(<(:< K
r@cro++.set"a+ue((int
g@cro++.set"a+ue((int
cs.set!ac4Co+or(r&g&.
.r'/is.set"a+s(.&r,
pic.set(6!(r&g&.,
repaint(,
e+se if (evt.target
r@cro++ 0
get"a+ue9 A
1000.0
s.va+ue9f(r,
g@cro++ 0
get"a+ue9 A
1000.0,
s.va+ue9f(g,
.@cro++ 0
get"a+ue9 A
1000.0,
s.va+ue9f(.,
s.va+ue9f(g
,
s.va+ue9f(r
,
(r )
.r'/is 0
Sisteme multimedia
. 5 .r'/is./,
r 5 .r'/is.y,
.%a.e+.set3e/t(<!:< K s.va+ue9f(.,
r%a.e+.set3e/t(<(:< K s.va+ue9f(r,
r@cro++.set"a+ue((int (r ) 1000.0,
.@cro++.set"a+ue((int (. ) 1000.0,
rg'/is.set"a+s(r&g,
cs.set!ac4Co+or(r&g&.,
pic.set(6!(r&g&.,
repaint ( ,
M return
fa+se,
M
pu.+ic void set"a+ues(dou.+e nr&dou.+e ng&
dou.+e n. 0
@tring st 5 ne- @tring9 ,
r 5 nr ,
g 5 ng,
. 5 n.,
r%a.e+.set3e/t(<(:< K st.va+ue9f(r,
g%a.e+.set3e/t(<6:< K st.va+ue9f(g,
.%a.e+.set3e/t(<!:< K st.va+ue9f(.,
r@cro++.set"a+ue((int (r ) 1000.0,
g@cro++.set"a+ue((int (g ) 1000.0,
.@cro++.set"a+ue((int (. ) 1000.0,
cs.set!ac4Co+or(r&g&.,
rg'/is.set"a+s(r&g,
.r'/is.set"a+s(.&r,
pic.set(6!(r&g&. ,
repaint(
, M
pu.+ic .oo+ean isItMe(=vent
evt0 return ((evt.target 55
r@cro++ S S
(evt.target 55 g@cro++ S S
(evt.target 55 .@cro++ S S
(evt.target 55 rg'/is S S
(evt.target 55
.r'/is, M M
1.&.:. 0tandarde ale adaptoarelor grafi%e
Aprut la BM n 1984, primul adaptor grafic impus ca standard
a fost CGA (Color Graphics Adapter), avnd o rezoluie de 320
x 200 pixeli n 4 culori sau 640 x 200 pixeli n 2 culori. De ce
aceste variante pentru acelai dispozitiv? datorit dimensiunii
memoriei video a adaptorului grafic i a modului de
reprezentare a culorii.
Revenind la standardul CGA, cele dou variante de rezoluie
provin din faptul c plaga grafic CGA era nzestrat cu o
memorie video dat, de: 320x200x2b=640x200x1b (deoarece 4
culori se codific folosind 2 bii, iar 2
25
Ciprian-Daniel NEAGU" Severin BUMBARU
culori se codific pe un singur bit). Cu alte cuvinte, dimensiunea
memoriei video necesare este volumul unui paralelipiped avnd
baza caracterizat de numrul de pixeli pe orizontal i
vertical, iar nlimea dat de numrul de bii folosii n
codificarea culorilor.
Urmtoarele adaptoare grafice sunt impuse ca standarde:
- EGA (Enhanced Graphics Adapter) - 640x350 pixeli, 16/64
culori;
- VGA (Video Graphics Array) - 640x480 pixeli, 16/256 culori;
- XGA (Extended Graphics Array) -1024x768 pixeli, 2
4
..2
10

culori;
- Hercules - 720x348 pixeli, 16/64 culori; fiind dedicat
terminalelor n mod text, extinde codul ASC prin definirea a
3072 caractere utilizator:
- SVGA (Super VGA) - setul de standarde grafice cel mai
rspndit n acest moment, ofer o rezoluie superioar
calitativ standardului VGA: 800x600 pixeli, 1024 by 768
pixeli, 1280x1024 pixeli, 1600x1200 pixeli. Toate variantele
SVGA suport 16 milioane (2 ) culori, dar n practic aceasta
depinde de memoria video instalat pe placa grafic i de
rezoluia aleas de utilizator, conform relaiei:
(1-1) rezoluiex x rezoluiey x z bii < dim VRAM, pentru 2
Z

culori.
Standardele SVGA sunt actualmente dezvoltate de un consoriu
format din productori de monitoare i adaptoare grafice, numit
VESA (Video Electronics Standards Association).
Dei aceste adaptoare grafice reprezint salturi calitative
remarcabile comparativ cu CGA, nici ele nu sunt la nivelul cerut
de aplicaii grafice rezonabile, unde fidelitatea imaginii este
foarte important (procesare de imagini i simulri de procese
complexe). Pentru acestea, BM a dezvoltat n continuare
adaptoarele grafice (spre exemplu, AGA Advanced Graphics
Adapter:1024 x 768 pixeli rezoluie). Pentru aplicaii grafice
complexe s-au realizat adaptoare grafice dedicate cu o rezoluie
excepional (cele mai bune rezoluii ntlnite depind nivelul
de 4096 x 4096 pixeli).
Monitor folosit 14" 15" 17" 21"
Rezolu ia recomandat 640x480 _____800x600___1024x768
_________________________1280x1084
Frecventa de linie a 38 42 48 56 64 84 80
88
monitorului_______KHz KHz KHz KHz KHz
KHz KHz KHz
Rata de remprosptare 72 Hz 84 Hz 72 Hz 84 Hz 80 Hz 100
72 Hz 80 Hz
dorit Hz
7abelul 1#1. Criteriul de alegere/ rata de reHmprosp4tare
a imaginii.
Monitor folosit 14" 15" 17" 21"
Rezoluia 640x480 800x600 1024x768
1280x1084
recomandat _________________________________________
Numr de 256 16,8 256 65536 16,8 256
65536 16,8 256 65536 16,8
culori dorit____M___________M___________M
_____________M_
Memoria 512 1 512 1 MB 2 1 2 MB
3-4 2 3-4 4
video KB MB KB___MB MB_____MB MB
MB MB
7abelul 1#. Criteriul de alegere/ memoria video.
n momentul alegerii plcii grafice i a monitorului, utilizatorul
trebuie s i pun problema performanei i ergonomiei. Un
sistem grafic adaptat armonios
26
Sisteme multimedia
poate conduce la satisfacia deplin a folosirii acestor
componente n contextul aplicaiilor grafice. Corelaia dintre
frecvena de remprosptare a imaginii i mrimea memoriei
video (ca termeni de alegere a plcii grafice) este prezentat n
tabelele 1-1 i 1-2.
Conform acestor clasificri, grupa 1 de dispozitive cuprinde
plci ce ofer 1-2 MB DRAM. Plcile se bazeaz pe
acceleratoare ieftine. Plcile grafice mai lente aduc rezoluii
suplimentare mai nalte numai plpind. Grupa a doua este
caracterizat de preuri medii, plci cu 2MB DRAMA/RAM. n
aceast clas pot apare acceleratoare video. Grupa 3-4 este
cea a dispozitivelor profesioniste (VRAM rapid, tehnic de vrf)
i, evident, extrem de scumpe.
13.7. !ispo)itive de trasare
I%pri%an$ele sunt dispozitive de imprimare a unor informaii
transmise de la calculator pe hrtie (sau alte suporturi: folii
transparente, plicuri etc). Sunt orientate pentru imprimare
text/grafic. Conin componente electronice (RAM, controler,
microprocesoare, plac de reea) care s permit preluarea din
sarcinile calculatorului utilizatorului i rezolvarea acestora n
timp real. Din punctul de vedere al modului de imprimare, pot fi:
imprimante text, respectiv imprimante grafice. Din punctul de
vedere al metodei de imprimare, putem identifica imprimantele
cu ace, imprimantele laser i imprimantele cu cerneal.
Caracteristic pentru i%pri%an$ele $e2$ ?%a$ri)eale@ sunt
seturile de caractere (litere, cifre i simboluri pe care
imprimanta este capabil s le imprime). mprimantele
matriceale (dot matrix) au setul de caractere standard ncrcat
n ROM (caractere standard i formele bold, subliniat sau
subscris).
Se bazeaz pe un mecanism de antrenare a hrtiei (tractor line
feed) i unul de poziionare pe orizontal a capului de scriere.
Cele mai folosite capuri de scriere sunt cu 9 ace (o imprimare
pe vertical a 9 puncte) sau cu 24 ace (imprimare pe vertical a
unei matrice 8x3) ce folosesc pentru imprimare ace metalice
comandate de interfa, ce lovesc o panglic din mtase
impregnat cu cerneal (ribbon). Sunt prezente n formate
dependente de dimensiunea maxim a colii de hrtie utilizate:
A3, A4. Pot fi alimentate cu hrtie pagin cu pagin sau sul,
format capsat pentru tractor.
mprimantele matriceale sunt definite de viteza de imprimare,
exprimat n caractere pe secund (cps). Aceasta poate varia
ntre 50 i 500 cps. Multe tipuri de imprimante matriceale ofer
practic viteze diferite de imprimare, n funcie de calitatea
cerut a imprimrii. O a doua caracteristic a imprimantelor
matriceale este calitatea imprimrii, dependent de numrul de
ace din capul de scriere, care variaz ntre 9 i 24. Un
dezavantaj major al acestui tip de imprimante este zgomotul,
care crete odat cu numrul de ace i cu calitatea imprimrii.
I%pri%an$ele +ra,i)e dezvoltate n ultima perioad au
ndeprtat acele ca mijloc de imprimare. Cele mai interesante i
performante tehnologii de imprimare sunt folosite de
imprimante laser fr emisie de ozon, respectiv de imprimante
LED (Light Emitting Diode). Deosebirea dintre imprimantele
laser i LED const n modul de impresionare a cilindrului
fotosensibil (figura 1-13). La imprimantele laser obinuite, o
singur diod laser special realizeaz raza laser i o dirijeaz
spre oglind. Aceasta se rotete cu cea 7600 rotaii/min.
Oglinda dirijeaz raza pe o in de reflexie care face ca raza
laser s ajung
27
Ciprian-Daniel NEAGU" Severin BUMBARU
pe cilindrul fotosensibil ncrcat negativ. Raza neutralizeaz
cilindrul ncrcat electric n punctele de inciden.
Tehnologia (relativ ncrcat) bazat pe laser i deviere se
nlocuiete pentru categoria imprimantelor LED cu un rnd
complet de diode luminiscente (LED-uri): 2500 dispuse pe dou
linii deasupra cilindrului fotosensibil (figura 1-13). Diodele sunt
comandate s se aprind/sting individual i conduc la o
rezoluie de pn la 600 dpi, rezultnd mai puine piese mobile,
compactitate.
(a) (b)
.igura 1#1&. 7e'nologia de transmitere a semnalului
de imprimare %4tre dispo)itivul de imprimare pentru
imprimante *a+ laser, *b+ L3!.
Tehnologiile laser i LED folosesc 6 etape n procesul de
imprimare: cilindrul fotosensibil se ncarc electric (negativ);
raza laser transfer imaginea de tiprit n puncte pe cilindru (n
punctele n care raza de lumin ntlnete cilindrul, ncrcarea
electric este neutralizat); tonerul incrcat negativ rmne
agat numai n zonele neutralizate ale cilindrului; cilindrul
transfer tonerul pe hrtie sub presiune (10g/cm) i temperatur
(150C); deoarece, dup transfer, pe cilindru rmn resturi de
toner, o lam le rzuie, resturile fiind plasate ntr-un recipient de
evacuare (Wastebox).
mprimantele laser/ LED sunt caracterizate de calitatea
imprimrii, exprimat n dpi (dots per inch). Rezoluiile
imprimantelor actuale variaz n intervalul 300 dpi - 1200 dpi,
valorile uzuale fiind 300 dpi i 600 dpi (prin comparaie,
imprimarea offset are valori ale rezoluiei ntre 1200 dpi i 2400
dpi). Unele imprimante din aceast categorie pot s permit o
rezoluie mrit prin folosirea unor tehnici speciale (resolution
enhancement) care se bazeaz pe dispozitive de recunoatere
a imaginilor (spre exemplu a liniilor curbe) ce folosesc algoritmi
inteligeni i pe modificarea dimensiunii punctului de imprimare
(dot). Acesta este motivul pentru care productorii de
imprimante grafice laser/LED propun n documentaia tehnic
dou valori caracteristice ale rezoluiei: rezoluia dispozitivului
de imprimare (engine resolution) i rezoluia efectiv (effective
resolution).
mprimantele laser/LED pot fi monocrome (imprimare
negru/nuane de gri) sau color. n ultimul caz folosesc patru
tonere pentru a imprima full color, ceea ce mrete proporional
preul pe pagina tiprit. Pentru a mri viteza de imprimare
(exprimat n pagini per minut, ppm), dispun de seturi de
caractere (internal/resident fonts). Viteza imprimantelor variaz
practic ntre 4 i 20 ppm, dac pagina este n general text. O
valoare tipic 6 ppm este echivalent cu 40 cps.
28
5
57
502
Sisteme multimedia
mprimantele laser/LED sunt cunoscute ca imprimante grafice.
n acest scop, sunt dotate cu memorie intern, necesar n
procesul de imprimare la o rezoluie acceptabil a unei imagini
de dimensiune A4 sau A3. Spre exemplu, pentru imprimarea
unei pagini A4 la rezoluie 300 dpi este necesar minim 1 MB de
memorie printerRAM. Evident, pentru o rezoluie 600 dpi,
necesarul de memorie printerRAM este de cel puin 4 MB.
mprimantele laser/LED sunt controlate prin intermediul unor
limbaje de descriere PDL (Page Description Language).
Standardele PDL actuale sunt PCL (Printer Control Language),
propus de Hewlett-Packard (HP) i PostScript (propus de Apple
Macintosh).
I%pri%an$ele )& )erneal/ propun cteva tehnologii de transfer
a informaiei ctre suportul de hrtie.
mprimantele termice cu cerneal (tehnologia BubbleJet/nkJet)
se bazeaz pe prezena n capul de imprimare a unui element
de nclzire (figura 1-14b). Din momentul alimentrii cu energie
electric, acesta se nclzete n 4-7 u.s la 400C, determinnd
apariia unei bule de gaz care se destinde, produce o
suprapresiune i preseaz o pictur minuscul de cerneal
prin duz spre exterior. Bula de gaz se formeaz din nou: n
capul de imprimare apare o depresiune care asigur transferul
cernelei din cartu. Cerneala care intr n cap rcete elementul
de nclzire. Aceste faze se repet pentru flecare punct de
tiprit. Aceast tehnologie prezint ca dezavantaj faptul c,
dup o utilizare ndelungat, pe elementul de nclzire se
formeaz un strat subire de resturi de cerneal care mpiedic
lucrul la parametri normali. Bulele de gaz devin mai mici i
picturile de cerneal mai slabe. Pentru evitarea acestui
comportament trebuie nlocuit nu numai cartuul ci i capul de
imprimare (aceasta se ntmpl n medie dup 10 reumpleri cu
cerneal).
mprimarea piezoelectric cu cerneal (Epson) nlocuiete bula
de gaz cu un element format din cristale piezoelectrice (figura
1-14a). Cnd elementul se ncarc electric, cristalele se lungesc
n 5u.s. Dup 5 (s de la ntreruperea alimentrii electrice,
circuitele revin la forma iniial. Piezoelementul nu este n
contact cu cerneala, ci se gsete n faa unei membrane. Prin
apsarea membranei se produce tensiune n duz, rezultnd o
pictur minuscul de cerneal. Pictura este foarte fin
(datorit frecvenei de max lO^s de generare) i fr picturi
satelit (ca n cazul elementelor termice). Prin comparaie,
aceast tehnologie are avantajul absenei fenomenelor de
uzur termic (deoarece capul de imprimare nu are elemente
supuse nclzirii).
4i'i.
()B*ii+, UI-
(a)
(b)
.igura 1#16. 7e'nologii de imprimare %u %erneal4/ *a+
imprimare pie)oele%tri%4, *b+ imprimare
termi%4.
G
HlIllLpJMl KG
-l
&i
Ciprian-Daniel NEAGU, Severin BUMBARU
mprimantele cu cerneal sunt caracterizate de o rezoluie de
minim 300 dpi i sunt mai ieftine dar i mai lente dect
imprimantele laser. Sunt des utilizate deoarece ofer un cost
mult mai redus dect imprimantele color laser pentru
imprimarea unei pagini color, ca i datorit dimensiunilor
reduse, ceea ce le caracterizeaz ca portabile.
Plotter-ele sunt dispozitive de ieire care creaz imagini
bidimensionale (spre exemplu grafice) pe hrtie. Se mpart n
dou categorii (din punct de vedere constructiv):
- drum plotter: mecanismul de trasare const ntr-un mecanism
de naintare a hrtiei, similar celui de la imprimant, i un
stilou (cap de scriere) ce se deplaseaz pe o dreapt de-a
latul hrtiei conform comenzilor primite de la interfa;
- flatbed plotter: mecanismul de trasare folosete un bra
mecanic ce manipuleaz un stilou (cap de scriere) peste o
hrtie ntins (pe baza unui mecanism de control pe axele
XY).
1.&.>. Apli%a"ii grafi%e
Cele mai multe aplicaii includ componente grafice, att datorit
sistemelor de operare, care prezint aceleai caracteristici, ct
i datorit cel puin dorinei de a oferi utilizatorului aplicaii user-
friendly. Aceasta presupune astzi folosirea interfeelor grafice
(GU, Graphical User nterface).
Spre exemplu, procesoarele de text utilizeaz componente
grafice deoarece pun la dispoziia utilizatorului opiuni de
desenare sau de import desene. Toate sistemele CAD/CAM
sunt, evident, aplicaii grafice. Multe sisteme de gestiune a
bazelor de date i aplicaii pentru foi de calcul sunt considerate
aplicaii grafice deoarece permit afiarea datelor sub form de
grafice sau diagrame. Astfel de aplicaii sunt considerate, la
modul general, software pentru grafic comercial (business
graphics).
Din categoria aplicaiilor grafice fac parte:
- Programele de desenare (paint programs): permit crearea
desenelor sub form de hri de bii;
- Programe pentru desen tehnic i artistic (draw programs):
furnizeaz funcii avansate de desenare, bazate n special
pe prelucrarea liniilor curbe. maginile sunt reprezentate n
formate vectoriale;
- Programe grafice de prelucrare a datelor tabelare (graphic
worksheet): sunt destinate aplicaiilor n domeniul financiar-
contabil. Cu ajutorul lor se editeaz tabele de profituri,
analize de tabele etc. Datele sunt introduse n celule (o
celul reprezint intersecia dintre o linie i o coloan ntr-un
tabel). Unele celule pot fi definite ca relaii ntre dou sau mai
multe celule introduse anterior. Aceste produse folosesc
grafica pentru prezentarea datelor din tabele n forme
atractive sau sintetice.
- Programe grafice de prezentare (slide show): permit crearea
diagramelor (dreptunghiulare sau circulare), graficelor, a altor
tipuri de imagini pentru prezentri i rapoarte, pun ia
dispoziia utilizatorului colecii de diverse scenarii de
reclam. Diagramele pot fi rezultatul prelucrrii i
reprezentrii datelor din aplicaii pentru foi de calcul;
30
Sisteme multimedia
- Programe pentru animaie: permit nlnuirea i secvenierea
seriilor de imagini pentru a simula micarea. Fiecare imagine
este considerat un cadru ntr-un film. Propun faciliti din
domeniul filmului (mixaje, selecie de secvene, modificri de
obiecte pentru obinerea efectelor de animaie);
- Programe CAD: aplicaii dedicate proiectrii, destinate
arhitecilor i inginerilor. Printre funciile cele mai cunoscute,
permit: trasare n 2D i 3D, numeroase sisteme de
coordonate i tipuri de proiecii; selectarea dintre numeroase
sisteme de msur a dimensiunilor paginii de desen,
localizarea obiectului prin referina la alte obiecte, mrirea
sau micorarea desenelor (zoom), editri de simboluri; tipuri
de linii de trasare i culori, scalari i rotaii de obiecte
selectate, compatibilitatea formatelor fiierelor, ce pot fi
importate sau exportate i de alte aplicaii, umplerea
poligoanelor n diverse stiluri (fiii), numeroase tipuri de
caractere text n alfabete latin, chirilic, grec, simboluri
matematice, meteorologice, astronomice, muzicale, facilitatea
de dispunere pe masa de desen, cotri automate a obiectelor
selectate, atribute de vizibilitate, prioritate, culoare, stil,
ataate obiectelor i posibilitatea editrii facile a acestor
atribute, introducerea posibilitii desenrii de mn cu
dispozitivul de intrare: mouse, tablet grafic, trasri de
curbe, suprafee, polilinii, faciliti de trasare n 3D (crearea
obiectelor 3D din 2D, eliminarea liniilor ascunse, simularea
fotografierii cu lentile de distan focal variabil, teleobiectiv,
cu specificarea uneia sau mai multor surse de lumin,
realism vizual, iluminri, umbriri, crearea unor
macroinstrunciuni cu AUTOLSP sau C;
- Editoare grafice (desktop publishing): sunt colecii de funcii
de procesare a textului, care permit controlul poziionrii
textului i imaginilor, astfel nct pot fi create reviste, ziare,
reclame, cri. Pun la dispoziia utilizatorului module pentru:
scrierea documentului cu procesorul de texte,
editarea/revizuirea textului pn la ajungerea n forma final
n modul WYSWYG (What You See s What You Get),
inserarea textului n pagin, innd cont de dimensiunea
literelor, tipul de text, numrul de coloane pe pagin,
lungimea coloanelor, ilustrarea prin crearea diagramelor,
graficelor, diverselor desene sau preluarea fotografiilor
(histograme, imagini scanate), revizuirea aspectului paginii,
machetarea, tiprirea n tirajul dorit;
- Aplicaii dedicate exploatrii suportului de informaie
multimedia (hrtie, film, band magnetic), respectiv
dispozitivelor multimedia (microfon, magnetoscop,
sintetizator). Sunt aplicaii care ofer utilitare de conversie,
de comprimare, funcii de arhivarea imaginilor, filmelor,
retuarea imaginilor video, recunoaterea caracterelor
documentelor imprimate, recunoaterea, procesarea i
arhivarea datelor sonore.
O categorie aparte a aplicaiilor dedicate prelucrrilor grafice o
reprezint bibliotecile grafice ale limbajelor de programare de
nivel nalt, care, practic, permit proiectarea aplicaiilor grafice
(vezi capitolul 2). Pe lng bibliotecile compilatoarelor s-au
realizat i biblioteci independente ale cror rutine pot fi apelate
din mai multe limbaje de programare de nivel nalt. Funciile
bibliotecilor grafice pot aparine urmtoarelor categorii:
- rutine de configurare (selectarea modului grafic dorit,
stabilirea zonelor de memorie pentru scrierea fiierelor de
imagini);
- rutine pentru stabilirea coordonatelor desenului i a zonei
active;
31
Ciprian-Daniel NEAGU, Severin BUMBARU
- rutine pentru stabilirea paletei de culori;
- rutine pentru stabilirea atributelor liniei: culoare de trasare,
stil, grosime;
- rutine pentru trasarea liniilor, arcelor, elipselor,
cercurilor, poliliniilor, umplerea contururilor;
- rutine pentru afiarea textului;
- drivere i rutine pentru copierea imaginilor grafice la
imprimant, rutine pentru gestiunea memoriei ecran.
1.4. Formatele fiierelor de grafic
1.6.1. 2odele de repre)entare
Optimizarea lucrrilor grafice i proiectarea aplicaiilor grafice
portabile necesit o bun alegere a formatului fiierului grafic.
Modelele de desenare tradiionale ce intervin asupra fonturilor
de caractere i asupra marginilor sunt: modul bitmap i modul
vectorial. Fiecare din aceste modele influeneaz crearea
imaginilor, modificrile ulterioare, facilitile de import/export
ntre aplicaii, calitatea imprimrii.
14.2. 2odul bitmap *'4r"i de bi"i+
maginile bitmap sunt stocate punct cu punct. Aplicaiile bitmap
construiesc imaginea prin umplerea fiecrui punct, ca un
mozaic, putnd fi uor editat folosind un instrument pensul
(Paintbrush). Modul bitmap este folosit de scanner pentru
analiza imaginii i este singurul mod de extragere pentru
periferice numerice.
J.!:i"n'!c modelului bitmap sunt date att de conservarea
definiiei imaginii de la creare la imprimare, leii ci ine cont de
rezoluia real a dispozitivelor de ieire (afiare sau imprimare),
rezultnd o redare neoptimi^aU a ;ma^
:

::
. -
a
* ~
:
de ocuparea
dezavantajoas a spaiului de memorie. Culoarea fiecrui punct
ce compune imaginea bitmap este reprezentat binar, de unde
i necesitatea unui spaiu de memorie foarte mare.
FORMAT .TF .GF TGA .BMP JPG
DOMEN
UL DE
APLCA|
schim
buri
de
schim
b de
fiiere
imagin
i de
sintez
format de
imagini n
Win i
video
MRME
A PE
DSC
185 KB sau
67 KB 17 MB
374
KB
17 MB 303
KB
MRMEA
FSERUL
U
17 MB 5,8 MB 17 MB 17 MB 17 MB
COMPRE posibil DA DA NU reglabi
SSTEME
DE
CODFC
8b,
24b,
32b
index pe
8b
8b,
16b,
24b,
4b, 8b,
24b
8b,
24b
NUM
R DE
max.1
6,7
mii
max. 256
max.1
6,7 .
max.16,7
mii
-
OBSERVA
|
forma
t
stand
ard
nerecom
andat
pentru
7abelul
1#&.
Prin%ipalele formate de fi5iere
bitmap.
32
Sisteme
multimedia
Avantajele modelului bitmap se refer la buna adaptare pentru
desenarea imaginilor complexe (fotografii), fiind folosit de
produse software de retuare a imaginii i prezentare asistat
de calculator
Aplicaiile care utilizeaz imagini n format hri de bii se
numesc aplicaii de pictur ?pain$ pr(+ra%#@7 Principalele
formate de fiiere bitmap sunt comparate n tabelul 1-3.
TIF (Tag mage File Format) este un format bitmap propus de
Aldus-Microsoft. Permite o codificare adaptat cel mai bine
schimbului de imagini ntre aplicaii i sisteme (cu condiia
folosirii n format necomprimat). n practic exist diferite tipuri
de format TF (prin deosebirea algoritmului de comprimare
facultativ), formatul fiind irecuperabil de la o aplicaie la alta.
Versiunea 6.0 a formatelor TF (ultima) permite salvarea n
standardul CMYK. Formatul permite codificarea imaginilor
monocrome, nuane de gri sau color (RGB pe 8b i pe 24b), cu
diferite rezoluii.
TGA (TarGA) este un format bitmap folosit n aplicaii de
prelucrare a imaginilor de gam nalt (imagini de sintez sau
pentru design industrial).
GIF (Graphics nterchange Format), format bitmap propus de
CompuServe, este folosit pentru schimbul de fiiere din reelele
publice (inclusive World Wide Web). Exist dou variante ale
standardului: GF87a i GF89a. Diferenele ntre cele dou
formate sunt minore. Are o rat de compresie ce permite
utilizarea extensiv, n special pentru scanarea fotografiilor.
Formatul GF folosete pentru comprimare algoritmul
Lempel-Ziv Welch (o variant a algoritmului de codificare
Huffman, vezi seciunea referitoare la compresii). Formatul
permite codificarea imaginilor monocrome, nuane de gri sau
color, cu diferite rezoluii. Este limitat la reprezentarea culorii pe
8 bii (256 culori) deci este folosit n special pentru imagini n
culori distinctive, dar i pentru codificarea imaginilor
transparente (culoare dominant neutr).
p|es|H|a|g| xNe|x|
g
,
n
| LFM |?l
Options
Animation j |
mage
Animation
V/idlh: 0
~zn
Anima
bon
Hetght
mage
Count
p
1
Looping
Repeat
Cotrtt: f~~
Repeat
Forever
Tia&ig
Comment:
"3
44
^J
6l
J
nu**/ r
.igura 1#19, 8ularea 5i stabilirea %ara%teristi%ilor unui
fi5ier GI. animat folosind apli%a"ia 20
GI. Animator.
Ciprian-Daniel NEAGU" Severin BUMBARU
Un fiier GF poate conine o secven de mai multe cadre
bitmap, care s constituie animaie. Cadrele sunt transmise la
ecran cu sau fr pauz ntre ele, fiind folosite n special de
proiectanii de pagini web (figura 1-15).
-PGL-PEG (Joint Photographic Experts Group) comprim
imaginile color prin eliminarea informaiilor superflue
(neperceptibile cu ochiul) pn la 5% din dimensiunea iniial
(tehnic denumit lossy compression), pe baza exploatrii
caracteristicilor anatomice de (in)sensibilitate a ochiului uman.
Din acelai motiv, acest format nu este recomandat
reprezentrilor crochiurilor, desenelor animate i imaginilor
mono-culoare. O imagine JPEG este decomprimat automat la
deschiderea fiierului. Pot apare probleme de compatibilitate la
recitirea fiierului JPEG cu alte aplicaii dect cea folosit la
crearea lor.
Algoritmul de compresie parcurge patru pai: crearea matricei
de pixeli (procesarea eantioanelor de 8x8 pixeli) i conversia
schemei de culoare (n general folosind spaii de culoare bazate
pe intensitate/ luminozitate i nu pe nuane RGB), procesarea
DCT (Discrete Cosine Conversion), cuantificare i codificri
suplimentare. Calculele adiionale urmresc transformarea ntr-
o structur unidimensional prin metoda modelului zig-zag
(figura 1-16), n vederea pregtirii transferului n format
secvenial i a mbuntirii ratei de compresie.
.igura 1#1:. 2odelul )ig)ag apli%at unui fi5ier DPG.
Spre deosebire de formatul GF, transparena este o mare
problem pentru formatul JPEG. Formatul GF utilizeaz o
culoare (nefolosit n desen) pentru a marca suprafaa imaginii
ce va deveni transparent. Formatul JPEG nu folosete ns
valori constante de culoare. Dup compresie, valoarea unei
celule este combinat cu valori ale celulelor apropiate i
rotunjit la cel mai apropiat ntreg. La fiecare compresie
valoarea se poate schimba, deci nu putem fi siguri ce culoare
(intensitate) va avea pixelul dup o nou decompresie. Acesta
este i motivul pentru care pictogramele i cursoarele sunt
realizate n format GF.
PNG (Portable Network Graphics) a fost proiectat pentru
mbuntirea i nlocuirea formatului comercial GF. Algoritmul
de compresie este LZ77 (folosit i n aplicaiile de arhivare zip,
gzip i pkzip). Formatul PNG este freeware (gratis) pentru uz
comercial i propune trei modele:
- PNG grayscale (nuane de gri, pixelii sunt reprezentai pe
16b valoare de iluminare, 0 = black, 256-1 - white);
34
Sisteme multimedia
- PNG true_color (pixelii sunt reprezentai folosind 24b valoare
RGB, fiecare component folosind 8b pentru specificarea
influenei n culoarea pixelului, 0 - fr influen, 2
8
-1 -
influen maxim);
- PNG palette_based (pixelii sunt reprezentai printr-un index
de culoare dintr-o palet de culori.
BMP (BitMaP) este un format de fiier legat de sistemul de
operare Windows i interfaa Presentation Manager OS/2. Este
recunoscut de Clipboard-ul celor dou medii grafice. Permite
deci schimb lejer ntre aplicaii diferite. Este un format grafic
independent de dispozitivul de ieire, n sensul c n momentul
n care este transferat la ieirea sistemului, driver-ul
dispozitivului de ieire (monitor, imprimanta) traduce culorile
specifice formatului de fiier n culorile curente ale dispozitivului.
.ormatul 12P
Exist dou versiuni ale formatului de fiier grafic BMP pentru
imagini Windows i dou pentru OS/2 (versiune veche/nou).
Versiunile Win/OS/2 vechi sunt identice, cele noi sunt diferite,
deci exist aplicaii care nu suport toate formatele BMP:
aplicaii Windows cu format BMP OS/2 sau invers, sau formatul
BMP conine altceva dect imagine (icoan sau cursor) sau
aplicaia veche conine doar versiunea veche BMP.
Formatul imagine BMP este proiectat pentru reprezentarea
imaginilor de orice dimensiuni folosind 1-24 bii pentru informaii
privind culoarea. Suport compresii RLE (Run-Length Encoded)
sub Windows i Huffman 1D sub OS/2 (vezi seciunea
referitoare la compresia imaginilor). maginea este stocat ca
linii scanate ordonate bottom-up, ceea ce creaz dificulti la
realizarea conversiilor de format sau la imprimarea imaginii la
imprimante matriceale.
Un fiier BMP conine, n ordine, elementele: header de fiier,
header bitmap, palet opional, bitmap propriu-zis. Variantele
de format depind de header bitmap i palet. Pentru versiunea
Windows, formatul este reprezentat de structurile:
Format vechi Format nou
BTMAPFLEHEAD
ER
BTMAPCOREHEA
DER
BTMAPCORENFO
BTMAPFLEH
EADER
BTMAPNFOH
EADER
7abelul 1#6. 0tru%tura formatului bitmap pentru sistemele
Nindo(s.
ntrrile pentru paleta de culori n versiunea veche a formatului
de fiier constau n 24b (intensitatea RGB). n versiunea nou
are 4B, astfel nct paleta de culori poate fi citit ca vector de
date tip long. maginea n fiierul BMP este organizat ca o
serie de linii scanate, prezentat ncepnd cu ultima linie ctre
prima. Liniile scanate sunt completate totdeauna astfel nct s
ocupe un numr par de cuvinte duble de 32 bii. Pentru o
imagine dat de n pixeli, fiecare pixel avnd o adncime de d
bii, numrul de octei pe linia scanat se calculeaz cu formula:
(1-2)NumrBytes/linie_scanat=((n*d+31)/32)*4.
Cmpurile nefolosite sau neimportante ale structurilor
trebuie setate la 0.
35
Ciprian-Daniel NEAGU, Severin BUMBARU
Elementele structurii de informaii BMP Windows sunt:
bfType (2B): validarea nceputului de fiier BMP, plus alte
indicaii despre coninut. Pentru un fiier imagine bitmap,
cmpul conine valoarea hexa 4D42 (n forma lowbyte-highbyte
rezultnd caracterele ASC BM (BitMap).
BfSize: dimensiunea necomprimat a fiierului n Bytes
BfOffBits: offsetul (deplasamentul) fa de nceputul fiierului, n
Bytes (deci de la nceputul structurii BTMAPFLEHEADER)
pn la nceputul imaginii (bitmap propriu-zis). Se folosete
pentru localizarea poziiei imaginii i pentru calculul numrului
de intrri ale paletei:
(1-3) ncolors=(offBits-file_hdr_size-
bitmap_hdr_size)/rgb_size.
BiSize: dimensiunea (n Bytes) a headerului bitmap, obinut
deci ca un apel de funcie Sizeof(BTMAPNFOHEADER). Se
folosesc pentru indicarea versiunii de format: 12 (veche
Win/OS/2), 40 (nou Win), 64 (nou OS/2), 12-64 (alt format nou).
BiWidth: limea imaginii n pixeli.
BiPlanes: numrul de plane de culori din bitmap.
BiBitCount: numrul de bii per pixel (1,4,8,24). Este informaia
care permite s aflm cte culori sunt folosite pentru
reprezentarea imaginii arhivate:
(1-4)nr_culori=2
BiBitCount
.
BiCompression: tipul de comprimare folosit de bitmap (pentru
comprimare imagine n fiier) n general este 0 (fr
comprimare) pentru fiiere BMP. Windows decodific automat
imaginea comprimat.
BiSizelmaqe: dimensiunea hrii de bii n octei (imagine).
BiCrlmportant: numrul de culori necesare pentru afiarea
imaginii. Fiecare element al tabelei de culori este o structur
RGBQuad:
typedef struct
tag(6!O$'D 0 !G3=
rg.!+ue,
!G3= rg.6reen,
!G3= rg.(ed,
B7T8
g9R%.%v%d0 :
R5B;UA)0
1.6.&. Compresia imaginii Hn fi5iere bitmap
Introdu%ere
Conform formulei lui Shannon, entropia unei surse de informaii
S se definete:
(1-5) O*0+ = y>,log2 ,
unde:
Pi
# pi este probabilitatea ca simbolul Si s apar n irul S;
1
- log2 reprezint cantitatea de informaie coninut de Si,
spre exemplu,
Pi numrul de bii necesari pentru
codificarea lui Sj.
3fi
Sisteme multimedia
Algoritmul 0'annon#.ano
Este o abordare a codificrii unui ir. S presupunem c avem
urmtoarea densitate de caractere ntr-un ir: A(15), B(7), C(6),
D(6), E(5) (tabelul 1-5).
Folosind o abordare top-down (figura 1-17), se parcurg
urmtorii pai:
1.82. Sortarea simbolurilor dup frecvena de apariie (pi), de
exemplu: ABCDE.
1.83. mprirea recursiv n dou pri cu aproximativ acelai
numr de apariii.
Simbol log( C Subtotal
A 1.38 0 30
B 7 2.48 0 14
C 6 2.70 1 12
D 6 2.70 11 18
E 5 2.96 11 15
TOTAL 89
7abelul 1#9. Algoritmul 0'annon#.ano apli%at 5irului
A1C!3.
.igura 1#1;. Algoritmul 0'annon#.ano apli%at
5irului A1C!3. Algoritmul Ouffman
Al+(ri$%&l 8&,,%an este o abordare bottom-up a codificrii
unui ir:
#1. niializare: adaug toate nodurile n lista OPEN" pstrat
ordonat (spre exemplu, ABCDE, v. tabelul 1-6);
#2. Repet pn cnd lista OPEN mai are doar un nod:
#2.1 Alege din OPEN dou noduri avnd cele mai mici
frecvene/probabiliti i creaz un nod printe al lor;
#2.2 Atribuie suma frecvenelor/probabilitilor descendenilor
nodului printe;
#2.1 Atribuie codurile 0/1 celor dou ramuri ale arborelui i
terge nodul descendent din OPEN (v figura 1-18).
Simbol log( C Subtotal
A 1.38 0 15
B 7 2.48 1 21
C 6 2.70 1 18
D 2.70 11 18
E 2.96 11 15
TOTAL 87
7abelul 1#:. Algoritmul Ouffman apli%at 5irului
A1C!3.
37
Ciprian-Daniel NEAGU, Severin BUMBARU
B&7/ 6&6/ )&6/ 8&5/
.igura 1#1>. Algoritmul Ouffman apli%at 5irului
A1C!3.
Pentru exemplul de mai sus:
H(S)=(15x1.38+7x2.48+6x2.7+6x2.7+5x2.96)/39=85.26/39=2.1
9.
Numrul de bii necesari pentru codificarea Huffman este:
87/39=2.23.
Astfel, algoritmul Huffman transform simboluri de lungime fix
n simboluri de lungime variabil, ajungnd la rezultate optime
doar dac probabilitile de apariie a simbolurilor sunt puteri ale
lui 2.
Codifi%area Ouffman adaptiv4
Algoritmii anteriori necesit date statistice (care, de obicei, nu
sunt disponibile, n cazul secvenelor audio sau video n timp
real), iar n cazurile n care datele sunt disponibile, procesul de
calcul este laborios, mai ales pentru noduri (secvene) cu
comportare similar (spre exemplu, prezena mpreun a
literelor "gh"). Din aceste motive, n practic se prefer
algoritmii adaptivi.
n cazul algoritmului adaptiv de codificare Huffman, ideea este
comun majoritii algoritmilor de compresie adaptiv. Condiia
este ca att codorul, ct i decodorul, s foloseasc exact
aceleai rutine de iniializare nitialize_model () i actualizare a
modelului updatemodel ().
9.W=17
38
#.W<#
2.W<2
3.W<2
4.W<2
.igura 1#1@. Un arbore Ouffman.
) B
#.W<2 2.W<2
.igura 1#1. Arborele Ouffman dup4 o nou4
s%'imbare de nod *A
rein%rementat+.
Rutina update_model realizeaz incrementarea contorului i
actualizarea arborelui Huffman. n timpul actualizrilor, arborele
Huffman trebuie s respecte (figura 1-19) condiiile de definire
(spre exemplu, nodurile, interne sau frunze, s fie aranjate n
ordinea cresctoare a ponderilor), mutarea unui nod implicnd
mutarea cu tot cu sub-arborele descendent (figura 1-20).
Arborele Huffman poate arta total diferit dup o schimbare de
nod: spre exemplu, n al treilea arbore, nodul A (figura 1-21)
devine nodul 5 i este codificat cu 2 bii.
=NC9D=( D=C9D=(
Initia+iQe7mode+ (, Initia+iQe7mode+ ( ,
-hi+e((c5getc(inputT5eof
-hi+e((c5decode(inputT5eof
0 0
encode(c&output, pute(c&output,
update7mode+(c, update7mode+(c ,
M M
Prin urmare, algoritmii adaptivi beneficiaz de avantajul de a nu
necesita estimarea a priori a probabilitilor, fiind folositori n
aplicaiile practice.
39
Sisteme multimedia ) B 6 A
#.W<2 2.W<2 3.W<2
.igura 1#B. Arborele Ouffman dup4 o s%'imbare de
nod *A in%rementat
9.W=21
Ciprian-Daniel NEAGU, Severin BUMBARU
Algoritmul Lempel#Piv#Nel%'
n cazul codificrii unei colecii extrem de mari de iruri, este
folosit soluia propus de Ziv i Lempel n 1977, mbuntit
de Terry Welch n 1984, sub numele de LMN )(%pre##i(nF
- 5 NI%,
-hi+e (read a character 4 0
if -4 e/ists in the dictionary
w = wk ; else add wk to the dictionary; output the code
for w; w = k; } Exemplu: dac irul de intrare este
"
A
WED
A
WE
A
WEE
A
WEB
A
WET", secvena de procesare este
descris n tabelul 1-7:
w k ie in sim
N A
A E A 25 AN
E E W 25 WE
E D E 25 ED
D A D 25 D
A
A E
AW E 25 26 AW
E A E 26 E
A
A E
AW E
A E 26 26 AW
E A
E E 26 26 E
A
W E
W B 25 26 WE
B A B 26 B
A
A W
AW E
A T 26 26 AW
T E T
7abelul 1#;. 3xemplu de apli%are a algoritmului de
%ompresie LPN.
Un ir de intrare compus din 19 simboluri a fost codificat prin
reducere la o ieire compus din 7 simboluri plus 5 coduri
(tabelul 1-7). Fiecare cod sau simbol necesit 9 bii. n mod
uzual, compresia nu funcioneaz pentru un numr mic de
octei citii la intrare.
Algoritmul LZW pentru decompresie:
read character 4,
output 4,
- 5 4,
-hi+e ( read a character 4 0 A) 4:
caracterAcod)A
entry 5 dictionary entry for 4,
output entry,
add - K entry 102 to dictionary,
80
Sisteme multimedia
w = entry; } Continund exemplul anterior (tabelul 1-
8), irul de intrare este acum:
"
A
WED<256>E<260><261><257>B<260>T".
w k ie in sim
A A
A E E 25 AW
E E E 25 WE
E D D 25 ED
D <2 A 25 D
A
<2 E E 26 AW
E <2 A 26 E
A
<2 <2 E
A
26 AW
<2 <2 W 26 E
A
<2 B B 26 WE
B <2 A 26 B
A
<2 T T 26 AW
7abelul 1#>. 3xemplu de apli%are a algoritmului de
de%ompresie LPN.
Codifi%area prin diferen"e *!3+
Metoda DE ?Di,,eren$ial En)('in+@ se bazeaz pe existena
pixelilor vecini cu valori foarte apropiate, astfel nct anumite
diferene s fie considerate neglijabile. Este, deci, o metod
care conduce la compresia sursei, deci la pierderi de informaii.
Se aplic irurilor de forma: S-i, S2, ..., Sn, cu valori diferite de
zero dar care nu difer prea mult ntre ele. Se aplic o secven
de calculare a diferenei fa de valoarea anterioar: Si, S2-
S1,...,Sn-sn-i-
0 0 0 0 0
0 255 250 253 251
0 255 251 254 255
0 0 0 0 0
.igura 1#. Un exemplu de imagine supus4
%odifi%4rii !3.
Fie imaginea prezentat n figura 1-22. Se pot calcula diferene
att ntre pixelii vecini ct i ntre grupuri de pixeli (n general
grupuri de 8x8). Secvena comprimat va fi: M5, 0, 255, -5, 3,
-2, 0, 255, -4, 3, 1, M5, unde irurile de zero pot fi comprimate
prin ali algoritmi (RLE).
Codifi%area !PC2
Metoda de compresie DPCM ?Di,,eren$ial P&i#e C('e
M('&la$i(n@ este una din metodele simple i rapide de
compresie a hrilor de bii, imagini rasterizate pentru care
fiecare pixel va fi reprezentat pe 8b, fr ns s fie transmis
nsi valoarea pixelului. Codificatorul face o predicie a valorii
probabile a pixelului, bazndu-se pe valorile pixelilor prelucrai
anterior. Eroarea prediciei dintre valoarea preconizat a
pixelului i actuala valoare este cifra cuantificat i transmis.
41
Ciprian-Daniel NEAGU, Severin BUMBARU
Metoda are o rat bun de comprimare datorit faptului c multe
imagini conin o cantitate semnificativ de redundan spaial,
pixelii vecini tinznd s aib valori apropiate, astfel nct
eroarea de predicie s fie mic. Metoda este utilizat i pentru
compresiile video, n care pixelii de pe aceleai poziii dovedesc
corelaie temporal (i modific lent valoarea n timp pentru
aceiai pixeli n cadre consecutive). Acest tip de compresii poate
fi mbuntit prin folosirea codurilor de lungime variabil.
Eficiena algoritmului depinde de acurateea prediciei. Cea mai
simpl variant predictiv este valoarea ultimului pixel transmis
(o combinaie cu algoritmul DE), dar aceasta conduce la o rat
slab de compresie. O valoare mai bun se obine prin media
valorilor pixelilor vecini, predicia fiind cu att mai bun cu ct
blocul de pixeli considerat este mai mare.
x, +
)
e
.
31!2'-=-3
!'>
e 3>d>
&%2'>p-
%/
e ,
)
1 +
p%d-3'>
% b a
.igura 1#&. Codorul !PC2. linia
-> direcia de
oixelul .igura 1#6. O se%"iune din
'arta de bi"i pentru modelul de %odifi%are
!PC2.Q
Pentru codorul din figura 1-23, s analizm varianta prediciei
valorii pixelului curent (figura 1-24) pe baza valorilor pixelilor
vecini cei mai apropiai:
(1-6)xs = a. (1-7) xs =
)ia R )b R )&%.
Pentru exemplul dat, xs este valoarea pixelului curent (a n
figura 1-24), xsse
calculeaz ca o expresie liniar (ponderat) a p pixeli anteriori
pixelului curent (n cazul nostru, doi pixeli, b i c), e este
imaginea derivat obinut ca diferena dintre pixelul nurs-if ji
r;i*siii anteriori. n procesuJ de predicie, imaginea original este
pierdut, n timpul procesrii putnd avea acces doa. la valoarea
calculat, xQs, a pixelului curent.
Eroarea de predicie poate fi (opional) cuantificat i utilizat n
calculul entropiei codorului. Practic, eroarea este mic (datorit
unei bune corelri spaiale).
n figurile 1-23 i 1-25, care prezint arhitectura unui codor,
respectiv decodor DPCM, sunt folosite urmtoarele simboluri:
42
K>
Sisteme multimedia
xs. semnalul eantionat de intrare;
e: diferena dintre valoarea curent i valoarea calculat;
e': eroare cuantificat de predicie;
xs; valoarea prediciei;
xs: valoarea reieit din calcul a semnalului eantionat;
ec: valoarea erorii dup codificarea DPCM (aceeai cu valoarea
de intrare pentru decodorul DPCM).
z-i, z2, z3: coeficieni de ponderare.
d%3>d> &%2'>p-%/
O
p%d-3'>
.igura 1#9. !e%odor !PC2.
Decodorul realizeaz operaia:
(1-8) %urent
S =predi%tor+ R e.
Utilizarea proprietilor predictor/imagine are un efect
semnificativ n creterea eficienei ratei de compresie. Expresia
predictor poate fi modificat adaptiv pentru a mbunti
rezultatele compresiei. Compresia obinut pentru acest
algoritm este ntre 4 i 8 ori pentru o imagine de calitate medie.
Algoritmul modulare !elta
Algoritmul modulare Delta ?Del$a %('&la$i(n" DM@ este o
particularizare a algoritmului DPCM, pentru care pasul de
predicie este de 1 bit. Acest tip de modulare este aplicat n
principiu pentru undele sonore, ieirea DM fiind 0 pentru pante
negative, respectiv 1 pentru pante pozitive ale undei de intrare.
Prin urmare, algoritmul DE codific semnul derivatei semnalului
(direcia amplitudinii semnalului) i nu valoarea diferenei (ca n
vzul DPCM). Schema bloc a modulatorului DM este
prezentat n figura 1-26.
R -2'%g!'>
/
0
e 31!2'-=-3
!'>
10
J w w
.- p1#.
.igura 1#:. Codor !2.
43
OP
Ciprian-Daniel NEAGU, Severin BUMBARU
Semnalul de intrare x0 este comparat cu ieirea integratoare 8,
semnalul delta e (diferena dintre semnalul de intrare i
semnalul puls) este transmis la cuantificator, care genereaz
ieirea n funcie de diferena dintre acestea. Dac diferena
este pozitiv, ieirea este un impuls pozitiv; dac ieirea este
negativ, cuantificatorul genereaz un semnal negativ.
Semnalul de ieire transmite un feed-back ctre intrare pentru o
nou comparaie, rezultatul fiind un aa numit semnal delta care
este din nou cuantificat. Prin urmare, semnalul de ieire conine
informaii despre semnul schimbrilor semnalului cu o perioad
de eantionare n urm.
Codifi%area 8L3
Metoda de codificare RLE ?R&n-Len+$0 En)('in+@ este o
metod de compresie ce se bazeaz pe identificarea prezenei
subirurilor cu aceeai form (numite run). Fiecare secven de
valori ce se repet este nlocuit cu numrul apariiilor i forma
subirului. Pentru a fi productiv, aceast metod se aplic pe
acele tipuri de fiiere care conin n numr mare secvene
consecutive ale aceluiai model: fiiere text care conin spaii
pentru identarea sau formatarea paragrafelor, tabelelor sau
diagramelor, semnale digitizate (care conin iruri neschimbate
de semnale). Un exemplu de astfel de semnal digitizat este
cazul imaginilor monocrome sau color, inclusiv a celor generate
pe calculator (n special pentru zonele de fundal).
RLE este o metod de compresie prin pierderea informaiei, nu
conduce la rezultate foarte bune, dar este uor de implementat
i rapid.
Exemplu:
- ?-1# d% -2'!%@ R T A A A A S ) 8 8 8 8 8
- dup compresia RLE: R T *4A S D *5E
- reprezint un caracter de control pentru semnalizarea
secvenei repetitive (run).
Procesul de codificare se realizeaz efectiv dac n irul de
intrare exist secvene repetate de patru sau mai multe
caractere, deoarece algoritmul RLE folosete minim trei
caractere (dou caractere repetate conduc la mrirea irului de
ieire, iar trei caractere conduc la un rezultat neutru). Procesul
de decodare: dac nu exist caractere de control, irul este
copiat, iar dac este identificat un astfel de caracter, atunci este
ndeprtat i secvena ce urmeaz este copiat de numrul de
ori semnalizat.
Exist diferite scheme de compresie RLE, implementarea
acestora depinznd n mare msur de tipul de date supuse
codificrii. Spre exemplu, standardul Windows propune dou
variante, pentru compresia imaginilor bitmap caracterizate de
adncimea de culoare n 4b i 8b.
C(%pre#ia 4b RLE consider secvena de ieire ca fiind
format din doi octei: primul (dac nu este zero) determin
numrul de pixeli care vor fi desenai. Al doilea specific dou
culori: primii patru bii codific prima culoare, urmtorii patru
reprezint a doua culoare (tabelul 1-10). Prin urmare, la
decomprimarea imaginii, pixelii de pe poziiile impare vor avea
culoarea dat de primul cod de 4b, iar pixelii de poziie impar
vor fi colorai cu al doilea cod. Dac primul octet este zero,
atunci al doilea octet va fi un cod escape (tabelul 1-9).
44
Sisteme multimedia
Al doilea octet_define te ________________________________
1.84. End-of-line.
1.85. End-of-RLE (bitmap).
1.86. Urmtorii doi octei reprezint deplasarea pe
direciile x i y (x - dreapta, y - sus). Pixelii peste
care se sare au culoarea zero.
>=3_________La decompresie, urm torii 4 bii sunt copiai. ____
7abelul 1#@. !efini"ia %odurilor es%ape pentru %ompresie
6b 8L3.
Sirul nformaia expandat
06 52 52 52 52
08 1B 1B1B 1B1B
00 06 83 83 14 34
00 02 09 Mut 9 poziii la dreapta i
00 00 End-of -line.
04 22 22 22
00 01 End-of-RLE (bitmap).
7abelul 1#1B. 3xemple de se%ven"e %odifi%ate 6b
8L3.
C(%pre#ia Q4 RLE consider secvena de compresie format
tot din 2 octei: primul octet (dac este nenul) reprezint
numrul de pixeli consecutivi de aceeai culoare, specificat de
al doilea octet (tabelul 1-11). Similar variantei anterioare, dac
primul octet este zero, atunci al doilea octet definete un cod
escape. Codurile escape 0, 1, 2 au aceeai semnificaie ca n
tabelul 1-9; dac valoarea codului escape >=3, atunci la
decompresie, urmtorii >=3 vor fi copiai din fiierul comprimat.
Sirul nformaia expandat
06 52 52 52 52 52 52 52
08 1B 1B1B1B1B1B 1B1B1B
00 03 83 83 14 34
00 02 09 Mut 9 poziii la dreapta
00 00 End-of -line.
04 2A 2A 2A 2A 2A
00 01 End-of-RLE (bitmap).
7abelul 1#11. 3xemple de se%ven"e %odifi%ate >b
8L3.
Vom exemplifica modelele de compresie a informaiei grafice
prin applet-ul Compress. Acesta prezint, n afara interfeei
caracteristice, algoritmii de codificare a informaiei de intrare
(ir numeric n baza 10) pentru modelele: DPCM, Delta, RLE,
Zero supression si Huffman.
45
Ciprian-Daniel NEAGU, Severin BUMBARU
KS Appiet Viewer:
Compress.class
A1E . EnExE
Appiet
8A%$p#-=-3!%! '%,2-3-#> d% 3>$p%.-%
ntroducei o secvena numerica
pentru evidenierea tehnicilor de
compresie...
S- d% -2'!%@
|1110000111 000011100001 Codifica
M%'>d!@
DPCM Delta
Modulation
Run Length
Zero Suppression
Huffman
S- d% -%?-%@
100-1000100-1000100-10001
100-1000100-1000100-10001
1110F41110F41110F41
111F4111F4111F41
1110000111000011100001
8e.iF DPCM Delta Run Length; Huffma
Run-length encoding a
- suprimarea secvenelor repetate
- si folosirea unor coduri escape
-=
=,
Butonul Run Length help apsat.
.igura 1#;. Appiet#ul Compress pentru exemplifi%area a
%in%i algoritmi de %ompresie a informa"iei grafi%e/
!PC2, !elta, 8L3, Pero supression si
Ouffman.
Appiet 1#&. Compress.$ava/ exemplifi%area a %in%i
algoritmi de %ompresie a informa"iei grafi%e/ !PC2,
!elta, 8L3, Pero supression si Ouffman.
/* BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- Compression app+ets: Compress.java)A
- Modificat si adaptat: 2001 Dan Neagu
- Copyright (c 1UUC !art "erhoeven and the
#.$. %euven& '++ (ights (eserved.)A
import java.io.),
import
java.appiet.),
8C
Sisteme multimedia
import j
ava.a-t.),
import
java.uti+.),
pu.+ic c+ass Compress e/tends
java.app+et.'pp+et 0
;retty;ane+ invoer& uitvoer& he+p,
!utton encode& dpcm& de+ta& run& Qero&
huffman,
3e/t'rea he+p'rea,
3e/t:ie+d encode:ie+d& dpctn:ie+d&
de+ta:ie+d& run:ie+d& Qero:ie+d& huffman:ie+d,
pu.+ic void init( 0
@tring s,
set%ayout(ne- !order%ayout( ,
;ane+ p 5 ne- ;ane+ (,
p.set%ayout(ne-
6rid%ayout(*&1,
invoer 5 ne-
;retty;ane+(true,
invoer.set%ayout(ne-
!order%ayout(,
;ane+ invoer; 5 ne- ;ane+(,
invoer;.set%ayout(ne-
6rid%ayout(C&1,
%a.ei 10 5 ne- %a.ei(<=/emp+ificarea
tehnici+or de compresie<&%a.ei.C=N3=(,
10.set:ont(ne-
:ont(<3imes(oman<&:ont.!9%D&20,
invoer;.add(10,
invoer;.add(ne- %a.ei(<IntroduceLi o
secvenLa numerica<&%a.ei.C=N3=( ,
invoer;.add(ne- %a.ei(<pentru evidenLierea
tehnici+or de<&%a.ei.C=N3=(,
invoer;.add(ne-
%a.ei(<compresie...<&%a.ei.C=N3=(,
%a.ei 11 5 ne- %a.e+CN@ir de intrare :<&
%a.ei. C=N3=( &F
11.set:ont(ne-
:ont(<3imes(oman<&:ont.!9%D&18,
invoer;.add(11,
encode 5 ne- !utton (<Codifica< &F
encode:ie+d 5 ne- 3e/t:ie+d(20,
;ane+ pp 5 ne- ;ane+(,
pp.add(encode:ie+d,
pp.add(encode,
invoer;.add(pp,
invoer.add(<Center<&invoer;,
p.add(invoer,
uitvoer 5 ne- ;retty;ane+(true,
uitvoer.set%ayout(ne- !order%ayout(,
;ane+ uitvoer; 5 ne- ;ane+ ( &F
uitvoer;.set%ayout(ne- 6rid%ayout(C&2,
%a.ei uitvoer%9 5 ne- %a.ei(<Metoda:
<&%a.ei.C=N3=(,
uitvoer%9.set:ont(ne-
:ont(<3imes(oman<&:ont.!9%D&18,
uitvoer;.add(uitvoer%9 ,
%a.ei uitvoer%+ 5 ne- %a.ei(<@ir de
ieVire: <&%a.ei.C=N3=(,
uitvoer%+.set:ont(ne-
:ont(<3imes(oman<&:ont.!9%D&18,
uitvoer;.add(uitvoer%+,
uitvoer;.add(ne- %a.ei(<D;CM<&%a.ei.C=N3=(,
dpcm:ie+d 5 ne- 3e/t:ie+d(20,
8E
Ciprian-Daniel NEAGU, Severin BUMBARU
dpcm:ie+d.set=dita.+e(fa+se,
uitvoer;.add(dpcm:ie+d,
uitvoer;.add(ne-
%a.ei(<De+ta
Modu+ation<&%a.ei.C=N3=(
,
de+ta:ie+d 5 ne- 3e/t:ie+d(20,
de+ta:ie+d.set=dita.+e(fa+se,
uitvoer;.add(de+ta:ie+d,
uitvoer;.add(ne- %a.ei(<(un
%ength<&%a.ei.C=N3=(,
run:ie+d 5 ne- 3e/t:ie+d(20,
run:ie+d.set=dita.+e (fa+se ,
uitvoer;.add(run:ie+d,
uitvoer;.add(ne-
%a.ei(<>ero
@uppression<&%a.ei.C=N3=(
,
Qero:ie+d 5 ne- 3e/t:ie+d(20,
Qero:ie+d.set=dita.+e(fa+se,
uitvoer;.add(Qero:ie+d,
uitvoer;.add(ne-
%a.ei(<Ruffman<&%a.ei.C=N3=(,
huffman:ie+d 5 ne- 3e/t:ie+d(20 &W
huffman:ie+d.set=dita.+e (fa+se,
uitvoer;.add(huffman:ie+d,
uitvoer.add(<Center<&uitvoer;,
p.add(uitvoer,
he+p 5 ne- ;retty;ane+(true,
he+p.set%ayout(ne- !order%ayout0 ,
;ane+ he+p; 5 ne- ;ane+(,
he+p;.set%ayout(ne- !order%ayout 0 ,
;ane+ ppp 5 ne- ;ane+(,
%a.ei he+p% 5 ne- %a.ei(<Re+p:
<&%a.ei.C=N3=(,
he+p%.set:ont(ne-
:ont(<3imes(oman<&:ont.!9%D& 18 ,
ppp.add(he+p%,
dpcm 5 ne- !utton(<D;CM<,
ppp.add(dpcm,
de+ta 5 ne- !utton(<De+ta<,
ppp.add(de+ta,
run 5 ne- !utton(<(un %ength<,
ppp.add(run,
Qero 5 ne- !utton (<>ero @uppression< &F
ppp.add(Qero, huffman 5 ne-
!utton(<Ruffman<,
ppp.add(huffman,
he+p;.add(<North<&ppp,
he+p'rea 5 ne- 3e/t'rea9,
he+p'rea.set=dita.+e(fa+se,
he+p;.add(<Center<&he+p'rea,
he+p.add(<Center<&he+p;,
p.add(he+p,
add(<Center<&p,
M
pu.+ic .oo+ean action(=vent ev&
9.ject o. 0 if (ev.target 55
encode 0
get'pp+etConte/t(.sho-@tatus(<!uton ed
codificare apXsat.< ,
8D
Sisteme multimedia
@tring string 5 encode:ie+d.get3e/t(,
if ( (string. trim9 . +ength ( T 5
0PPcontainsNo@paces(string.trim(PPisDigita+(
string.trim ( 0
dpcm:ie+d.set3e/t(differentia+;u+seCodeModu+ati
on(string
de+ta:ie+d.set3e/t(de+taModu+ation(st
ring,
run:ie+d.set3e/t(run%ength=ncoding(string&N:N
,
Qero:ie+d.set3e/t(Qero@uppression(string&N:N,
huffman:ie+d.set3e/t(huffman=ncoding(
string ,
M
e+se0
dpcm:ie+d.set3e/t(<<
,
de+ta:ie+d.set3e/t(<
<,
run:ie+d.set3e/t(<<
,
Qero:ie+d.set3e/t(<<
,
huffman:ie+d.set3e/t
(<<,
get'pp+etConte/t(.sho-@tatus(<@ecv
enLa de intrare tre.uie sa fie
numerica...<,
M
return true,
M
e+se if (ev.target 55 dpcm 0
get'pp+etConte/t(.sho-@tatus(<!uto
nu+ D;CM he+p apXsat. < &F
@tring string 5 <Differentia+
;uise Code Modu+ationYnYn<,
string K5 <F
Differentia+A;redictive =ncodingYnYn<,
string K5 <<,
he+p'rea.set3e/t(string&F
return true, M
e+se if (ev.target 55
de+ta 0
get'pp+etConte/t(.sho-@tatus(<!utonu
+ De+ta modu+ation he+p apXsat.<,
@tring string 5 <De+ta
Modu+ationYnYn<,
string K5 <F
Differentia+A;redictive =ncodingYnYn<,
string K5 <F $n caQ particu+ar
D;CMYnYn<,
he+p'rea.set3e/t(string,
return true, M
e+se if (ev.target 55
run 0
get'pp+etConte/t(.sho-@tatus(<!uto
nu+ (un %ength he+p apXsat.<,
@tring string 5 <(unF+ength
encodingYnYn<,
string K5 <F suprimarea
secvenLe+or repetateYnYn<,
string K5 <F si fo+osirea unor
coduri escapeYnYn<,
he+p'rea.set3e/t(string,
return true,
8U
Ciprian-Daniel NEAGU, Severin BUMBARU
M e+se if (ev.target 55 Qero 0
get'pp+etConte/t(.sho-@tatus(<!utonu
+ >ero %ength he+p apXsat.<&F
@tring string 5 <>ero
@uppressionYnYn<,
string K5 <F @uprimarea secvenLe+or
repetate de QeroYnYn<,
he+p'rea.set3e/t(string,
return true, M e+se
if (ev.target 55 huffman 0
get'pp+etConte/t(.sho-@tatus(<!utonu
+ Ruffman he+p apXsat.<,
@tring string 5 <Ruffman
=ncodingYnYn< ,
string K5 <F @tatistica+
=ncodingYnYn<,
string K5 <F a+goritm .aQat pe
ar.ori si variante adaptiveYnYn<,
he+p'rea.set3e/t(string,
return
true, M
return fa+se,
M
private @tring
differentia+;u+seCodeModu+ation(@tring
to7compress 0 @tring compressed 5
to7compress.su.string(0&1, int
reference5Character.digit(to7compress.char't(0
&10, for (int j 5 +,j J
to7compress.+ength(,jKK 0 int i 5
Character.digit(to7compress.char't(j&10,
reference 5
Character.digit(to7compress.char't(jF1&10,
compressed K5 @tring.va+ue9f(i F reference,
M
return compressed,
M
private @tring de+taModu+ation(@tring
to7compress 0 @tring compressed 5 to7compress
. su.string (0 &1 &Fint
reference5Character.digit(to7compress.char't(0
&10, for (int j 5 +,j J
to7compress.+ength(,jKK 0
int i 5
Character.digit(to7compress.char't(j&10,
reference 5
Character.digit(to7compress.char't(jF1&10,
if (reference Z i compressed K5 <F1<,
if (reference 55 i compressed K5 <0<,
if (reference J i compressed K5 <1<,
M
return compressed,
M
private @tring run%ength=ncoding(@tring
to7compress& char
f+ag 0
@tring compressed 5 ne-
@tring (, int i 5 0,
-hi+e (i J
to7compress.+ength( 0
char c 5
to7compress.char't(i, int
j 5 count(to7compress&c& i
,
if (j Z5 8 0compressed 5 compressed K c K
f+ag K j,M e+se (compressed K5
to7compress.su.string(i&iKj,M
I0
Sisteme multimedia
i 5 i K j ,
M
return compressed,
M
private int count(@tring to7compress& char
character& int
inde/ 0
int i 5 inde/,
int counter 5 0,
-hi+e (i J to7compress.+ength( 0
if (to7compress.char't(i 55
character 0 counterKK, i K K, M
e+se 0i 5 to7compress.+ength(,M
M
return counter,
M
private @tring Qero@uppression(@tring
to7compress& char
f+ag 0
@tring compressed 5 ne-
@tring (, int i 5 0,
-hi+e (i J
to7compress.+ength(
0 char c 5
to7compress.char't(i,
if (c 55 N0N 0
int j 5 count(to7compress&c&i,
compressed 5 compressed K f+ag K j , i 5
i K j , M e+se 0
compressed 5 compressed K c,
iKK, M M return compressed,
M
pu.+ic @tring huffman=ncoding(@tring
to7compress 0 @tring compressed 5 ne-
@tring 9, int num.er 5 10,
int12 counter 5 ne- int1num.er2, int12 ordered
5 00&1&2&*&8&I&C&E&D&UM, for (int i 5 0,i J
to7compress.+ength(,iKK
0 counter1Character.digit(to7compress.char't(i
&102 K 5 1,M for (int i 5 0,i J num.er,iKK 0
int inde/ 5
greatest(ordered&i&counter, int
temp 5 ordered1i2, ordered1i2 5
ordered1inde/2, ordered1inde/2 5
temp,
M
=> &-2' - < 00- C 21$9%0-DD/
E 3>12'%(>d%%d(-** < - 0
:
=> &-2' - < 00- C '>B3>$p%...#%2g',&/0-DD/ E
51
Ciprian-Daniel NEAGU, Severin BUMBARU
3>$p%..%dD<I2'%g%.'>S'-2g&3>12'%(6,!!3'%.d-g-'&'>B3>
$p%...3,!A'&-/ +10/ * / 0
:
return compressed,
M
private int greatest(int12 ordered& int inde/&
int12
counter 0
int great 5
ordered1inde/2, int
great7inde/ 5 inde/,
for (int i 5 (inde/K+,i J
ordered.+ength,iKK 0 if
(counter1ordered 1i22 Z counter1great2
0 great 5 ordered1i2, great7inde/ 5 i, M
M return great7inde/,
M
pu.+ic .oo+ean containsNo@paces(@tring
to7compress 0
if (to7compress.inde/9f(N N T5 F1
0return fa+se,M
e+se return true,
M
pu.+ic .oo+ean isDigita+(@tring to7compress 0
char12 array 5 to7compress.toChar'rray(,
for (int i50,i J array.+ength,iKK 0
if (iCharacter.isDigit(array1i2
return fa+se,
M
return true,
M
c+ass ;retty;ane+ e/tends
;ane+ 0 Insets c[+nset,
.oo+ean high+ight, .oo+ean
threeD, pu.+ic ;retty;ane+(
0
c[+nset 5 ne-
Insets(E&E&E&E,
high+ight 5 fa+se, threeD
5 fa+se,
M
pu.+ic ;retty;ane+(.oo+ean threeD 0
high+ight 5 fa+se,
this.threeD 5 threeD,
if (threeD c[+nset 5 ne-
Insets(10&10&10&10,
e+se c[+nset 5 ne- Insets(E&E&E&E ,
M
pu.+ic void setRigh+ight(.oo+ean on
0this.high+ight5on,M
pu.+ic Insets insets( 0return c[+nset,M
pu.+ic void paint(6raphics g 0
Dimension d 5 siQe(,
Co+or .g 5 get!ac4ground(,
if (threeD g.setCo+or(.g,
I2
Sisteme multimedia
e+se
if (high+ight
g.setCo+or(Co+or.red , e+se
g.setCo+or(Co+or..+ue, if
(threeD 0
g.dra-*D(ect(0&0&d.-idth F +&d.height F
+&true, g.dra-*D(ect(*&*&d.-idth F E&d.height
F E&fa+se, M e+se g.dra-(ect(2& 2& d.-idth F
8& d.height F 8, M M
1.6.6. 2odul ve%torial
maginile vectoriale sunt stocate sub form de primitive grafice
sau de curbe Bezier. Desenul este considerat un vector.
Fiecare obiect grafic este creat pornind de la o definire
geometric a formelor componente, crora le sunt alocate
atribute (culoare, grosime .a.).
Aplicaiile grafice vectoriale creaz obiecte sau forme definite
prin formule matematice, conducnd la obiecte prezentate prin
curbe mai netede dect n abordarea bitmap, n cazul n care
se folosesc efecte de scal. Spre deosebire de modul bitmap,
un desen vectorial nu este legat de rezoluie, adaptndu-se
rezoluiei perifericului de ieire. n plus, stocheaz imagini n
fiiere mai puin voluminoase i le manevreaz mai uor dect
modul bitmap datorit descrierii matematice a imaginilor. Modul
vectorial este folosit n aplicaii de design, arhitectur, reclam.
Spre deosebire de aplicaiile de desenare ?pain$ pr(+ra%#@"
programele care utilizeaz imagini n format vectorial se
numesc aplicaii de trasare ?'raE pr(+ra%#@7 nformaiile
comune fiierelor grafice mod vectorial i bitmap sunt: rezoluia
original, dimensiunea imaginii, indicaii despre paleta de culori,
parametrii algoritmului de comprimare (care reprezint n
acelai timp obstacole n efortul de standardizare a formatelor
grafice).
Majoritatea sistemelor grafice sofisticate (inclusiv sisteme CAD
i aplicaii de animaie) folosesc grafica vectorial. n plus,
multe tipuri de imprimante (spre exemplu imprimantele
PostScript) folosesc grafica vectorial n timpul procesrii.
Caracterele (fonts) sunt reprezentate vectorial pentru a putea fi
reprezentate unitar fr s depind de dimensiune. Datorit
soluiei de reprezentare, se mai numesc i vector fonts,
caractere scalabile, sau orientate obiect.
Principalele formate de fiiere vectoriale sunt comparate n
tabelul 1-12.
P(#$S)rip$F limbaj de descriere a paginii care descompune
imaginea unei pagini prin coordonate absolute, independente
de caracterele fizice ale perifericului. Este un standard de
imprimare prezent pe diferite sisteme de operare (MS
DOSWindows, Mac, OS/2, UNX) i o gam larg de
imprimante.
EPS (Encapsulated PostScript) definete formatul rezultat din
combinarea codului PostScript ca o resurs (Pict pentru Mac,
Tiff pentru PC) corespunztoare descrierii imaginii de pe ecran.
La importul unui desen EPS n blocul imagine al unui software
de punere n pagin, acesta este de fapt resursa (Pict sau Tiff)
care se afieaz pe ecran, permind vizualizarea i
poziionarea precis pe monitor. n momentul imprimrii se
folosete fiierul
53
Ciprian-Daniel NEAGU" Severin BUMBARU
PostScript. Unele programe creaz fiiere EPS fr preview. n
acest caz, cadrul destinat pentru recepia imaginii rmne vid la
import, dar rezultatul imprimrii este corect.
DCS (DeskTop Color Separation) este o extensie a fiierului
EPS pentru schimbul unei imagini pentru care s-a realizat deja
separarea culorii (productor: Quark). Se compune din cinci
fiiere: unul pe baz de rezoluie Pict pentru plasarea n Xpress,
i patru fiiere de rezoluie ridicat reprezentnd patru culori de
imprimat ce sunt trimise automat la imprimant n momentul
imprimrii.
DXF (Drawing eXchange Format) este formatul de schimb creat
de Autodesk n cadrul software-ului AutoCad. A devenit
standard prin generalizarea utilizrii.
CDR (CorelDRAW!) este formatul nativ de prelucrare i
reprezentare vectorial creat de Corel Corporation n cadrul
software-ului CorelDRAW!
CGM (Computer Graphic MetaFile) reprezint formatul de fiier
standard recunoscut de trei organisme de
normalizare/standardizare (SO, ANS, AFNOR) ce permite
schimb de desene vectoriale ntre aplicaii grafice. Este un
format folosit n extensia pentru programele de desen vectorial.
GEM (Graphics Environment Manager) este o interfa grafic
utilizator dezvoltat de Digital Research pentru PC-urile
fabricate de firma Atari, ca i o interfa pentru unele programe
DOS. Ca i interfeele Macintosh i Microsoft Windows, GEM
furnizeaz un mediu bazat pe ferestre pentru aplicaiile n lucru.
n cadrul sistemului grafic dezvoltat, GEM este i formatul
fiierului grafic vectorial de reprezentare a informaiei n mediul
grafic GEM.
NMF (Windows MetaFile) este formatul compatibil CGM propriu
aplicaiilor executate sub MS Windows.
FORMAT .CDR .CGM .DXF . . .WMF
DOMEN
UL DE
ilustr
aii
schim
buri
schimbu
ri de
fiiere
PA
O
ilustr
aii
schim
buri
EXEMPLU
COMPARA
TV AL
MRM
58
KB
31 KB 382 KB
90
7
K
B
36
KB
42 KB
PRM
TVE
DA DA DA DA DA DA
ATRBUT
E DE
DA DA DA DA DA DA
CURBE DA NU, NU DA DA NU
MAGN DA DA NU DA DA DA
OBECTE - NU DA NU NU NU
COTAR - NU DA NU NU NU
7abelul 1#1. Prin%ipalele formate de fi5iere
ve%toriale.
54
2. NTRODUCERE N GRAFCA JAVA
2.1. nterfeele utilizator grafice n Java
nterfaa utilizator grafic (engl: GU - Grap'i%al User Interfa%e+
este o interfa om-main care permite comunicarea omului cu
calculatorul prin intermediul unor obiecte grafice, afiate pe
ecran. Toi utilizatorii de calculatoare sunt familiarizai in prezent
cu interfeele grafice care conin ferestre, butoane, casete de
validare, liste, meniuri, cmpuri de text etc. Cele mai rspndite
sunt cele din categoriile Windows (ale firmei Microsoft) i X-
Window (pentru diferite platforme Unix sau Linux). Cele mai
multe componente ale acestor interfee au reprezentri grafice
predefinite. Unele din acestea pot servi, ns, i drept suport
pentru reprezentri grafice programate n programele de
aplicaie.
Programatorii n limbajul Java dispun de dou familii de pachete
de clase pentru realizarea interfeelor utilizator grafice, prezente
n Java AP =Appli%ation Programming Interfa%e # interfaa
pentru programarea de aplicaii): AWT i Swing.
2.1.1. Interfe"ele grafi%e AN7
-ava ANT *Abstra%t Nindo(ing 7ool-it # setul de creare a
ferestrelor abstracte) este constituit din pachetele java.awt,
java.awt.event, java.awt.color, java.awt.font, java.awt.geom i
altele. Tot aici se poate ncadra i pachetul java.applet, destinat
realizrii de appleturi.
deea de baz care a stat la realizarea AWT este c, ntruct
limbajul Java trebuie s fie independent de platforma pe care se
execut programul, iar mijloacele concrete prin care se
realizeaz reprezentrile grafice difer de la o platform la alta,
programatorul n Java trebuie s creeze n aplicaiile sale nite
"ferestre abstracte", n care plaseaz nite "obiecte abstracte"
asupra crora va aciona utilizatorul n timpul executrii
programului. Aspectul grafic al jingstQr objfctf ahft
trar
fe este
dependent de platforma. De exemplu, un buton, o list sau o
caset de validare vor avea alt aspect pe ecran dac programul
este executat sub Windows, dect atunci cnd este executat sub
Linux sau sub alt sistem de operare. n schimb, pentru
programator i pentru utilizator este eseniala fun%"ionalitatea
obiectului grafic respectiv. De exemplu, pe orice platforma,
butonul este un obiect grafic care emite un semnal (mai exact
genereaz un anumit eveniment) atunci cnd este apsat cu
mouse-ul. .un%"ionalitatea obie%telor grafi%e din AN7 este
a%eea5i pe toate.platformele.
Principalul avantaj al AWT este c utilizeaz pentru
reprezentarea pe ecran i manipularea obiectelor interfeei
grafice resursele proprii ale platformei pe care se execut
programul. n consecin, timpul de calcul necesar pentru
aceste operaii la executarea programului este mic, fiind
optimizat de ctre realizatorii sistemului de operare al platformei
pe care se lucreaz. Pe de alta parte, programatorul n limbajul
Java nu trebuie s cunoasc particularitile programrii
interfeelor grafice pe diferitele platforme, ntruct el lucreaz
numai cu clasele de obiecte abstracte oferite de pachetele din
Java AWT.
Principalul dezavantaj al AWT este c autorii lui au fost nevoii
s ia n consideraie numai acele clase de obiecte grafice, care
exist ntr-o form sau alta pe toate platformele. Aceasta a fcut
ca numrul de clase de obiecte
55
Ciprian-Daniel NEAGU, Severin BUMBARU
grafice din Java AWT s fie destul de restrns, renunndu-se
la funcionalitile specifice numai anumitor platforme.
.1.. Interfe"ele grafi%e 0(ing
Pentru a se realiza interfee grafice mai bogate i mai
diversificate dect cele posibile n AWT, a fost creat o familie
de pachete de clase cunoscut sub numele de SEin+7 Din
aceasta familie fac parte pachetele javax.swing,
javax.swing.event i altele. Remarcm c Swing nu nlocuiete,
ci %ompletea)4 AWT cu noi pachete de clase. Multe din clasele
AWT sunt necesare i atunci cnd se lucreaz n Swing.
Obiectele grafice din Swing au nu numai aceeai funcionalitate,
ci i acelai aspect pe orice platforma. Mai mult, acest aspect
poate fi ales de programator dintre mai multe variante posibile.
Pentru a se realiza acest obiectiv, autorii Swing au renunat la
ideea de a folosi pentru reprezentrile grafice metodele native
de pe platformele pe care se execut aplicaia. Toate obiectele
grafice din Swing sunt reprezentate pe ecran i manipulate prin
metode scrise n limbajul Java. Aceasta confer interfeei
grafice independen total fa de platform i posibilitatea
diversificrii claselor de obiecte folosite, dar preul pltit este
creterea complexitii programelor i a timpului de calcul.
2.2. Componente grafice i containere
nterfeele grafice Java (att ANT" ct i Swing) se bazeaz pe
conceptul de component grafic. Se numete )(%p(nen$/
+ra,i)/ un obiect care are o reprezentare pe ecran i care
poate interaciona cu utilizatorul. Orice component ocup pe
ecran o arie de form dreptunghiular, cu baza orizontal. Este
posibil ca unele componente s acopere total sau parial alte
componente.
..1. Clasa Component
n limbajul Java, componentele grafice sunt instane ale unor
clase. Aceste clase formeaz o ierarhie, care are ca rdcina
clasa C(%p(nen$ din pachetul =ava7aE$7 Aceasta este o %lasa
abstra%t4, care ofer metodele care sunt prezente n toate
clasele de componente. Numrul acestor metode este mare
(peste 120) i sunt descrise in documentaia Java AP, astfel c
vom prezenta aici numai pe cele necesare n acest capitol:
public void setvisible (boolean b) - afieaz componenta pe
ecran, dac argumentul b este true, sau o ascunde dac acesta
este false;
public void #e$Ba)3+r(&n'(Color c) - seteaz culoarea de
fond a componentei;
public void #e$F(re+r(&n' (Color c) - seteaz culoarea de
prim plan a componentei (culoarea textului);
public void #e$F(n$ (Font f) - seteaz fontul (forma caracterelor
folosite n component);
public void setLocation?in$ x, int y) - deplaseaz componenta
ntr-o nou poziie, astfel nct colul din stnga-sus al acesteia
s fie situat n punctul de coordonate (x,y);
56
ntroducere n grafica Java
public void #e$Si5e?in$ width, int height) - S$a4ile<$e
dimensiunile componentei, respectiv limea i inlimea
acesteia;
public void paint (Graphics g) - traseaz pe aceast
component un desen, folosind contextul grafic g. Conceptul de
context grafic va fi tratat intr-o seciune special a acestui
capitol. Metoda paint () nu este invocat direct de ctre
programator, ci indirect, prin intermediul metodei repaint O ;
public void update (Graphics g) - actualizeaz desenul de pe
component, folosind contextul grafic g; este invocat
de metoda
%p!-2' &/ 0
p19#-3 v>-d e2ai3t $% - i34"56 met"7a 1pd!'% &/.
Componentele grafice pot fi %omponente atomi%e sau
%ontainere. Se numesc %ontainere acele componente, care pot
conine alte componente. Remarcm c, ntruct i containerul
este o component, un %ontainer poate %on"ine alte %ontainere.
n Java AWT i Swing, clasele de containere formeaz o
ierar'ie, a crei rdcin este clasa C(n$ainer" care extinde
clasa C(%p(nen$ i se gsete, de asemenea, n pachetul
=ava7aE$7
Cele mai frecvent utilizate clase de containere sunt:
- n AWT clasele Frame, Appiet, Panel i Dialog;
- n Swing clasele JFrame, JAppet, JPanel i JDialog.
Fereastra principal a oricrei aplicaii trebuie s aparin uneia
din clasele Frame sau JFrame, dup cum se lucreaz cu
componente AWT, respectiv Swing sau trebuie s fie o
subclas a uneia dintre acestea. n mod corespunztor, orice
clas appiet este derivat din una din clasele Appiet sau
JAppet.
2.2.2. Clasa Appiet
ntruct, n exemplele din seciunile urmtoare, vom folosi clasa
Appiet, facem aici o scurt prezentare a acestei clase.
Clasa =ava7appIe$7AppIe$ extinde )la#a =ava7aE$7Panel" care
are superclasa =ava7aE$7C(n$ainer7 Aceasta, la rndul ei, are
superclasa =ava7aE$7C(%p(nen$7 n consecin, clasa Appiet
motenete toate metodele acestor clase.
nstanele clasei Appiet i ale subclaselor sale sunt appleturi,
adic mici programe cu interfa grafic, ce pot fi transmise prin
reea i executate ntr-un browser de Web sau ntr-un
appletviewer.
Suprafaa applet-ului, vizibil n fereastra browserului, are
form dreptunghiular i nu are chenar, la fel ca n cazul unui
panou (Panel). Pe aceast suprafa se poate desena, sau se
pot reprezenta imagini.
Deasemenea, ntruct appletul este un container, se pot
aduga diferite componente grafice. Toate acestea se
realizeaz prin %rearea de subclase n care se extinde clasa
Appiet, redefinindu-i-se metodele. Putem spune, deci, c
aceast clas este doar un prototip, pe care programatorii l
extind pentru a deriva propriile lor clase de appleturi.
57
Ciprian-Daniel NEAGU, Severin BUMBARU
Principalele metode ale clasei Applet (n afar de cele motenite
de la superclasele sale) sunt urmtoarele:
public void init() - este invocat de ctre browser o singur dat,
atunci cnd este ncrcat appietul pentru a fi executat. Prin
redefinirea acestei metode, se prevd de ctre programator
toate operaiile care trebuie efectuate la iniializarea appletului:
desenare, importare de imagini, adugare de componente,
diferite calcule auxiliare.
public void start() - este invocat de ctre browser atunci cnd
appietul incepe s fie executat efectiv, adic atunci cnd este
afiat pe ecran pagina HTML n care se gsete appietul
respectiv. Dac appietul conine anumite operaii care nu este
necesar s fie efectuate atunci cnd pagina nu este vizibil (de
exemplu o animaie), se va redefini metoda stop() pentru a opri
executarea operaiilor respective i metoda start() pentru a le
reporni.
public void stop() - este invocat de ctre browser atunci cnd
nceteaz executarea appletului, adic atunci cnd se trece la
alt pagin HTML, dect cea care conine appietul respectiv.
public void destroyO - este invocat de browser pentru a
informa appietul c el urmeaz a fi distrus. Programatorul poate
redefini aceast metod pentru a efectua operaiile care se
execut nainte de distrugere, de exemplu, dac appietul
folosete fire de execuie, acestea vor fi create n metoda init ()
i vor fi distruse ("ucise") n metoda destroy ().
public image getlmage (URL uri) - aduce imaginea care se
gsete pe nternet la URL-ul dat ca argument, prezentnd-o ca
un obiect cu interfaa image. Acesta trebuie s fie un URL
absolut.
public mage +e$l%a+e?URL uri, String name) - a'&)e
i%a+inea care se gsete pe nternet la URL-ul primit ca prim
argument, completat cu irul primit ca al doilea argument.
maginea este pus sub forma unui obiect cu interfaa mage.
URL-ul trebuie s fie absolut, iar al doilea argument indic
locaia relativ a fiierului imagine fa de directorul indicat de
primul argument.
public AudioClip getAudioClip (URL uri) - aduce un clip audio de
la locaia de nternet primit ca argument sub form de URL
absolut.
public AudioClip +e$A&'i(Clip(URL uri, String name) - a'&)e
un clip audio de la locaia dat prin argumente. Primul argument
este un URL absolut, iar al doilea indic locaia relativa a
fiierului fa de directorul indicat de primul argument.
public void play(URL uri) - execut clipul audio situat pe nternet
la locaia dat de URL-ul absolut primit ca argument.
public void pla1?URL uri, String name) - e2e)&$/ )lip&l a&'i( a
crui locaie este dat prin argumente (primul este un URL
absolut iar al doilea este locaia relativ la directorul dat de
primul argument).
public URL getCodeBase () - ntoarce URL-ul la care se gsete
appietul.
public String +e$Para%e$er (String name) - *n$(ar)e valoarea
parametrului al crui nume este dat ca argument. Parametrii
appletului sunt cei
58
ntroducere n grafica Java
dai prin tagul <APPLET> din pagina HTML, fiecare parametru
avnd forma
FNUM8F < FGAHOAR8F.
2.3. Culori i fonturi
n AWT culorile i fonturile sunt obiecte, respectiv instane ale
claselor Color i Font.
2.3.1 Clasa Color
n AWT, culorile sunt obiecte ale clasei =ava7aE$7C(l(r7
nstanele acestei clase conin valorile celor trei componente ale
culorii, aplicnd sistemul RGB *8ed Green 1lue - rou, verde,
albastru). n acest sistem, fiecare culoare este descompus n
cele trei culori fundamentale, fiecare component fiind
reprezentat printr-un numr ntreg, n intervalul [0, 255].
Valoarea 0 reprezint lipsa componentei respective, iar
valoarea 255 reprezint intensitatea maxim. O a patra
component, alp'a, reprezint "opacitatea" culorii respective:
valoarea 0 nseamn transparen total, iar valoarea 255
corespunde opacitii totale.
Clasa Color are mai muli constructori, dintre care cei mai
folosii sunt urmtorii:
pu.+ic Color(int red& int green& int .+ue
pu.+ic Color(int red& int green& int .+ue& int
a+pha
pu.+ic Color(int rg.a
n care argumentele sunt valorile sub form de numere ntregi
n intervalul [0, 255] ale celor patru componente ale culorii.
Dac alp'a lipsete, se consider implicit c are valoarea
maxim. n ultimul constructor, ultimul argument de tip int
mpacheteaz toate cele patru componente, folosind pentru
fiecare un singur octet.
O dat cu trecerea de la contextul grafic Graphics la
Graphics2D, s-a introdus reprezentarea culorilor n sistemul
sRGB (standard RGB), care respect standardul adoptat de
International Color Consortium. Conform acestui standard,
componentele fundamentale RGB sunt reprezentate prin
numere reale n intervalul [0.0, 1.0]. Constructorii menionai
mai sus au fost meninui, dar au fost introdui n plus
constructorii
pu.+ic Color(f+oat red& f+oat green& f+oat
.+ue pu.+ic Color(f+oat red& f+oat green&
f+oat .+ue& f+oat a+pha.
Clasa Color conine, de asemenea cmpuri statice, care conin
instane ale clasei Color pentru culorile cele mai larg folosite.
Acestea sunt: E0i$e (alb), M+0$Gra1 (gri deschis), +ra1 (gri),
'ar3Gra1 (gri nchis), 4la)3 (negru), re' (rou), +reen (verde),
4l&e (albastru), pin3 (roz), (ran+e (portocaliu), 1ell(E
(galben), %a+en$a (violet), )1an (albastru deschis). ntruct
acestea sunt cmpuri statice, la utilizarea n program trebuie
calificate prin numele clasei. De exemplu, culoarea albastru va
fi scris sub forma C(l(r74l&e7
Pentru schimbarea culorii curente a contextului grafic se
folosete metoda setColor(Color c) a clasei Graphics, n care
argumentul este fie una din culorile predefinite specificate mai
sus, fie o instan a clasei Color creat de programator, ca n
exemplele urmtoare:
58
Ciprian-Daniel NEAGU, Severin BUMBARU
setCo+or(Co+or..+ue,
setCo+orCne- Co+or (12E& 20I& 1D8,
Clasa Color prezint i numeroase metode, prezentate n
documentaia Java AP, dintre care vom meniona aici pe
urmtoarele dou, care permit conversia culorilor din sistemul
HSB n sistemul RGB i invers:
public static int HSBtoRGB(float hue, float saturation, float
brightness) - ntoarce valoarea RGB (cu cele patru componente
mpachetate ntr-un int) a culorii date prin componentele sale n
sistemul HSB;
public static floatrj RGB$(8SB?in$ r, int g, int b, floatrj hsbvals) -
ntoarce un tablou cu valorile HSB ale componentelor culorii,
fiind dare ca argumente componentele n sistemul RGB. Al
patrulea argument este tabloul n care vor fi plasate rezultatele.
Dac acest argument este nuli, se ntoarce un tablou nou creat.
n sistemul HSB, componentele culorii sunt: hue (nuan),
saturation (saturaie) i brightness (strlucire). Toate sunt
reprezentate prin numere de tip float n intervalul [0.0, 1.0].
.&.. Clasa .ont
Se numete F(n$ un set de imagini care reprezint %ara%tere.
Toate caracterele unui font au anumite caracteristici comune,
cum sunt: aspectul caracterelor, stilul, mrimea, lat cteva
exemple de fonturi, indicndu-se pentru fiecare numele, stilul i
mrimea:
T-$%. R>$!2+ 2>$!#+ 12
T-$%. R>$!2+ 2>$!#+ 14
Time9 R"ma3, al7i3, 14
Times Roman, italic, 14 Times
Roman, italic aldin, 14
Times Roman, subliniat, 14
Arial, normal, 14 Arial,
itali%, 1
Courier& norma+& 18
Courier, italic, 14
Numele fontului se refer, n general, la aspectul acestuia.
Fonturile care au acelai aspect general, indiferent de stil i de
mrime formeaz o familie de fonturi. n prezent exist o mare
varietate de familii de fonturi utilizate n editoarele de texte i n
editoarele grafice. n principiu, n Java se poate utiliza orice
familie de fonturi disponibil n mediul cu care lucrm. Avnd
ns n vedere c se dorete ca programele Java s poat fi
executate pe orice platform, se garanteaz c vor exista,
ntotdeauna urmtoarele trei tipuri:
eri, - asemntor cu "Times Roman" din exemplul de mai sus,
n care caracterele conin serifuri, adic mici liniue cu care se
termin elementele acestora;
60
ntroducere n grafica Java
San#Seri, - asemntor cu "Arial" din exemplul de mai sus, n
care caracterele nu conin serifuri;
M(n(#pa)e' - asemntor cu "Courier" de mai sus, n care se
folosesc caractere de genul celor de la maina de scris.
Tipurile "Serif i "SansSerif se ncadreaz n categoria fonturilor
cu lime variabil a caracterelor. n astfel de fonturi, literele M
i , de exemplu, au limi diferite. Tipul "Monospaced" are toate
caracterele de aceeai lime, ntruct la mainile de scris
mecanice deplasarea carului este aceeai pentru toate literele.
n Java AWT, fonturile sunt instane ale clasei =ava7aE$7F(n$7
Principalul constructor din aceast clas este
public Font (String name, int style, int size) - n care cele trei
argumente indic respectiv numele, stilul i mrimea fontului.
Numele fontului poate fi cel al oricrui font disponibil pe
platforma pe care se execut programul. Dup cum am artat
deja, pentru a fi siguri c fontul respectiv exist pe orice
platform, este bine s folosim cele trei tipuri garantate: "Serif,
"SansSerif sau "Monospaced".
Stilul fontului poate fi ales dintre urmtoarele cmpuri statice ale
clasei Font:
Font.PLAN - caractere normale, drepte;
Font.BOLD - caractere aldine (ngroate);
Font.lTALC - caractere italice (cursive).
Ultimele stiluri se pot combina sub forma
Font.BOLD+Font.lTALC, care se refer la caractere aldine
italice (ngroate i cursive).
Mrimea fontului se exprim n puncte tipografice.
Putem afla numele familiilor de fonturi disponibile pe
calculatorul pe care lucrm folosind programul urmtor:
Applet #1. Ce.onturi.$ava/ numele fonturilor disponibile
pe sistemul
ga)d4.
A) @e cautX fonturi+e disponi.i+e in mediu+
grafic )A
import j
ava.a-t.), c+ass
Ce:onturi 0
pu.+ic static void main(@tring
args12 0 6raphics=nvironment
ge5
6raphics=nvironment.get%oca+6raphics=nvironm
ent(, @tring fami+ii
125ge.get'vai+a.+e:ont:ami+yNames(, for(int
i50, iJfami+ii.+ength, iKK
@ystem.out.prinL(fami+ii1i2K<& < , M M
Acest program invoc, nti, metoda static:
61
Ciprian-Daniel NEAGU, Severin BUMBARU
getLocalGraphicsEnvironment() din clasa
GraphicsEnvironment() pentru a obine o referin ctre mediul
grafic local (de pe calculatorul pe care ruleaz programul Java).
Se folosete apoi metoda:
getAvailableFontFamilyNames () pentru a obine un tablou de
iruri de caractere, care sunt numele familiilor de fonturi locale.
n fine, aceste nume de familii de fonturi se afieaz pe ecran.
Vom remarca faptul c, printre acestea, se regsesc i cele trei
nume de familii de fonturi menionate mai sus.
2.4. Desenarea n Java AWT
n principiu, desenarea se poate face pe suprafaa oricrei
componente grafice. Din aceasta cauz, in clasa C(%p(nen$
au fost prevzute metodele
paint, update si repaint prezentate n seciunea "Componente
grafice i containere".
n pachetul =ava7aE$ exist, totui, o clas de componente care
se folosesc exclusiv ca suprafee de desenare. Aceasta este
clasa Canva#7 nstanele clasei Canvas sunt nite simple
suprafee de form dreptunghiular, fara bordur, folosite pentru
desenare. n englez se numete %anvas pnza folosit de
pictor. Desenarea se poate face, ns i pe suprafaa unei
instane a claselor Panel, Applet, JPanel, JAppet sau a oricrei
alte componente.
Pentru a trasa desenul, n afar de suprafaa de desenare, este
necesar i un instrument (dispozitiv) de desenare. Tehnicile de
desenare folosite difer substanial de la o platform la alta,
depinznd att de echipamentele folosite pentru realizarea
desenului, ct i de programele folosite n acest scop. ntruct
se dorete ca programele scrise n Java s fie independente de
platform, a fost conceput un dispozitiv de desenare abstract,
numit )(n$e2$ +ra,i)7 ntr-o prim variant, contextul grafic a
fost specificat prin clasa abstract Grap0i)# din pachetul
=ava7aE$7 Aceasta clas ofer un set minimal de metode, care
pot fi utilizate pentru trasarea unor desene relativ simple.
Ca urmare a utilizrii din ce n ce mai ample a limbajului Java,
au crescut i preteniile fa de complexitatea desenelor care s
poat fi realizate n acest limbaj. Din aceast cauz, s-a simit
nevoia de a se crea un nou context grafic, (clasa Grap0i)#2D@"
care este o extindere a clasei Graphics. Exist Java 3D-AP,
care se gsete pe nternet la adresa:
http://java.sun.com/products/java-
media/3D/forDevelopers/j3dapi/index.html.
Programatorul care dorete s traseze un desen pe suprafaa
unei componente, trebuie s creeze o clas, care extinde clasa
componentei respective i n care este redefinit metoda paint
i, uneori, metoda update. Ambele metode primesc ca argument
contextul grafic Graphics g. Aa cum sunt ele definite n clasele
de componente din AWT i Swing, aceste metode nu fac nimic,
deci nu se traseaz un desen pe suprafaa componentei
respective. Dac programatorul dorete ca un asemenea desen
s fie trasat, el trebuie s redefineasca n mod corespunztor
aceste metode.
Metodele paint i update nu sunt invocate explicit n cadrul
aplicaiei. Metoda paint este invocat automat n urmtoarele
situaii: cnd componenta respectiv este afiat pe ecran, sau
cnd ea a fost parial distrus i trebuie restaurat. Metoda
update servete pentru actualizarea
62
ntroducere n grafica Java
desenului componentei. Ea este apelat de programator
indirect, prin invocarea metodei repaint. La fiecare invocare,
metoda update efectueaz urmtoarele operaii: terge
coninutul componentei prin umplerea ntregei suprafee cu
culoarea de fond, seteaz culoarea contextului grafic folosind
culoarea de prim-plan a componentei respective, dup care
invoc metoda paint, care face desenarea propriu-zis. n
consecin, n general este suficient ca programatorul s
redefineasc numai metoda paint.
2.5. Desenarea folosind contextul grafic dat de clasa Graphics
Pentru realizarea unor desene simple pe componente AWT sau
Swing este suficient s se foloseasc contextul grafic oferit de
clasa =ava7aE$7Grap0i)#7 Obiectele acestei clase nu sunt
instaniate explicit prin program, ci sunt furnizate automat de
maina virtual Java, atunci cnd este invocat metoda paint
sau update. S-a adoptat un astfel de procedeu, ntruct clasa
Graphics este abstract, deci nu poate fi instaniat prin
programul Java, obiectele din aceast clas fiind realizate prin
programe dependente de platforma pe care se execut aplicaia
respectiv.
Contextul grafic ncorporeaz informaia de stare necesar
desenrii, care const din: referina la componenta grafic pe
care se traseaz desenul; coordonatele originii sistemului de
coordonate curent, exprimate in sistemul de coordonate al
componentei pe care se face trasarea; decuparea curent
(dimensiunile dreptunghiului n care se face efectiv trasarea
desenului); culoarea curent; fontul curent; operaia logic pe
pixeli curent (XOR sau Paint); alternana curent de culori
pentru operaia XOR.
La utilizarea operaiei Paint, trasarea desenului se face cu
culoarea curent, indiferent de culoarea anterioara a pixelilor
respectivi. La trasarea prin tehnica XOR, se ine seama de
culoarea existent anterior a fiecrui pixel (punct grafic): pentru
fiecare pixel de pe linia care se traseaz, se nlocuiete
culoarea veche cu culoarea complementar. De exemplu, dac
se traseaz cu culoare neagr o curb care intersecteaz o
figur neagr deja existent, atunci n procedeul Paint noua
curb nu va fi vizibil pe poriunea care intersecteaz figura. n
schimb, dac se folosete tehnica de trasare XOR, ea va fi
vizibil i pe suprafaa figurii negre, fiind trasat acolo cu alb.
.9.1. 0istemul de %oordonate
n clasa Graphics, coordonatele se exprim prin numere ntregi,
unitatea fiind egal cu un pixel, adic are dimensiunile unui
punct grafic de pe ecran. n consecin, dimensiunile imaginii
exprimate n milimetri depind de rezoluia ecranului. Fiecare
component are un sistem local de coordonate, a crui origine
se gsete n colul din stnga-sus al componentei respective.
Axa Ox este orizontal i este orientat ctre dreapta, iar axa
Oy este vertical, orientat n jos.
Contextul grafic are sistemul propriu de coordonate, care difer
de cel al componentei pe care se face desenarea. n momentul
n care este creat i ataat componentei, contextul grafic are un
sistem de coordonate care se suprapune peste cel al
componentei respective. Pe parcurs ns, ca urmare a utilizrii
unor metode de transformare (translaie, rotaie) sistemul de
coordonate al contextului grafic devine diferit de cel al
componentei.
63
Ciprian-Daniel NEAGU, Severin BUMBARU
.9.. 2etodele %lasei Grap'i%s
Metodele clasei Graphics permit fie trasarea unor elemente de
desen, fie modificarea strii contextului grafic. Exist peste 40
de metode, dintre care le menionm aici pe cele mai frecvent
utilizate.
public abstract void translate (int x, int y) - produce O translaie
a sistemului local de coordonate al contextului grafic, fa de
sistemul de coordonate curent al aceluiai context. De exemplu,
translate(20,10) are ca efect mutarea originii sistemului de
coordonate al contextului grafic n punctul care are, n prezent,
coordonatele (20,10);
public abstract void setColor (Color c) - seteaz culoarea
contextului grafic. Din acest moment, trasarea desenului se va
face cu noua culoare;
public abstract void setPaintMode ( ) - produce trecerea la
modul de trasare Paint;
public abstract void setXORMode (Color ci) - produce trecerea
la modul de trasare XOR. Culorile pixelilor vor alterna ntre
culoarea curent a contextului grafic i cea indicat prin
argumentul c1;
public abstract void setFont(Font font) - seteaz fontul curent al
contextului grafic;
public abstract void setClipfint x, int y, int width, int height) -
seteaz noul dreptunghi de decupare (n interiorul cruia
desenul trasat este vizibil). Argumentele sunt coordonatele
colului din stnga-sus, limea i nlimea;
p19#-3 !9.'!3' v>-d 7a:;i3e&-2' A#+ -2' y#+ -2' A2+ -2'
y2) - traseaz un segment de dreapt cu capetele n punctele
de coordonate
(x1,y1)i(x2,y2);
pu.+ic a.stract void fillRect(int /& int y& int
-idth& int
height) - deseneaz un dreptunghi plin, cu colul din stnga-sus
n punctul
(x,y) i avnd limea i nlimea date;
public void drawRect (int x, int y, int width, int height) - traseaz
conturul unui dreptunghi, cu colul din stnga-sus n punctul
(x,y) i avnd limea i nlimea date;
public abstract void drawRoundRect(int x, int y, int width, int
height, int arcWidth, int arcHeight) - traseaz conturul unui
dreptunghi cu colurile rotunjite. Ultimele dou argumente indic
limea i nlimea arcului de rotunjire;
p19#-3 !9.'!3' v>-d fillR"'37Re5t&-2' A+ -2' y+ -2' "-d',+ -2' ,%-g,'+
-2' !3W-d',+ -2' !3I%-g,'/ -7e9e3ea<6 12 d%p'12g,- p#-2 31
3>#J1-#% >'12K-'%0
public abstract void drawOval(int x, int y, int width, int height) -
traseaz conturul unui oval, care este nscris ntr-un dreptunghi
(invizibil) cu colul din stnga-sus n punctul de coordonate (x,y)
i avnd limea i nlimea date;
64
ntroducere n grafica Java
p19#-3 !9.'!3' v>-d =-##Ov!#&-2' A+ -2' y+ -2' "-d',+ -2' ,%-g,'/ -
d%.%2%!LM 12 >v!# p#-20
p19#-3 !9.'!3' v>-d d!"A3&-2' A+ -2' y, -2' "-d',+ -2' ,%-g,'+ -2'
.'!'A2g#%+ -2' !3A2g#%/ - '!.%!LM 12 !3 d% %#-p.M.
Se consider c elipsa se ncadreaz n dreptunghiul de
coordonate i dimensiuni date ca argumente. Ultimele dou
argumente indic unghiul la care ncepe arcul (fa de centrul
elipsei) i respectiv unghiul pe care se extinde arcul;
public abstract void fillArc(int x, int y, int width, int height, int
startAngle, int arcAngle) - se deseneaz un sector de elips
plin, mrginit de arcul specificat prin argumente;
public abstract void drawPolyline(int [] xPoints, int[] yPoints, int
nPoints) - se traseaz o linie frnt (poligonal deschis), care
trece prin nPoints puncte; tablourile xPoints i yPoints conin
coordonatele (xi, yi) ale acestor puncte;
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int
nPoints) - traseaz conturul unui poligon cu nPoints vrfuri, fiind
date tablourile de coordonate ale vrfurilor;
public abstract void fillPolygonint[] xPoints, int [] yPoints, int
nPoints) - se deseneaz un poligon plin cu nPoints vrfuri de
coordonate date;
public abstract void drawString(String str, int x, int y) -se
afieaz irul str, folosind fontul curent. Trasarea ncepe din
punctul de coordonate (x,y);
public abstract boolean drawlmage(mage img, int x, int y,
mageobserver observer) - deseneaz imaginea img, plasnd-o
cu colul din stnga-sus n punctul de coordonate (x,y) i
folosind pentru conversie observatorul de imagine observer;
public abstract void disposeO - dispune distrugerea acestui
context grafic, elibernd resursele pe care le utilizeaz (n
primul rnd memoria ocupat).
.9.&. 3xemple de utili)are a %lasei Grap'i%s
3xemplul 1/ figuri simple 5i text pe suprafa"a unui applet
Dup cum tim, pentru a realiza un desen avem nevoie de o
suprafa suport i de un instrument de desenare. n acest
exemplu, ca suprafa suport folosim o instan a clasei
java.appet.Appet, iar ca instrument de desenare, contextul
grafic oferit de clasa java.awt.Graphics.
Fiierul surs Exemplul.java este reprodus n continuare.
Applet #. 3xemplul Dava/ un exemplu de suprafa"4 de
desen.
import j
ava.a-t.), import
java .app+et .) &F
CI
Ciprian-Daniel NEAGU, Severin BUMBARU
pu.+ic c+ass =/emp+u+ e/tends
'ppiet 0 pu.+ic void
paint(6raphics g 0
set!ac4ground(Co+or.-hite,
g.dra-(ect(10& 20& D0& 80,
g.fi++(ect(100& 20& D0& 80,
g.dra-(ound(ect(1U0& 20& D0& 80& 1I& 10,
g.dra-%ine(10I& 0& 1EI&
D0,
F F\g]setB9(Mode(Co+or.-hite
,
g.dra-%ine(10I& D0& 1EI& 0,
g.set:ont(ne- :ont(<^erif<& :ont.;%'IN&
20,
g.dra-@tring(<^erif& ;%'IN& 20& mod B9(<&
1I& I0,
g.set;aintMode( ,
g.set:ont(ne- :ont(<^erif<&
:ont.I3'%ICK:ont.!9%D& 20 ,
g.dra-@tringL<^erif& I3'%IC !9%D& 20<& 1I&
100,
g.set:ont(ne- :ont(<@ans@erif<& :ont.;%'IN&
20,
g.dra-@tringCN@ans@erif& ;%'IN& 20<& 1I&
1*0,
g.set:ont(ne- :ont(<Monospaced<& :ont.;%'IN&
20,
g.dra-@tringCNMonospaced& ;%'IN& 20<& 1I&
1I0,
M
M
Sunt importate pachetele java.awt i java.appiet. Primul conine
clasele necesare pentru desenare, iar al doilea conine clasa
Appiet, care este superclasa tuturor appleturilor.
Clasa Exemplul extinde clasa Appiet, deci este un appiet. Dar,
aa cum s-a artat mai sus, clasa =ava7appIe$7AppIe$ are
superclasa =ava7aE$7C(n$ainer" iar aceasta are superclasa
=ava7aE$7C(%p(nen$7 n consecin, clasa Exemplu, definit
aici, motenete metoda pain$ a clasei Component. n
programul nostru, aceast metod este redefinit4 pentru a trasa
pe suprafaa appletului desenul dorit.
Vizualizarea appletului se face cu un browser de Web sau cu
un appletviewer. n ambele cazuri, appletul trebuie s fie
ncadrat ntr-o pagin HTML. Cel mai simplu fiier HTML pentru
vizualizarea appletului nostru este urmtorul:
JR3M%Z
JR='D/3I3%=Z=/emp+u+
1JA3I3%=ZJAR='DZ J!9DGZ
J';;%=3 C9D=5=/emp+u+ _ID3R5*00
R=I6R351D0Z JA';;%=3Z JA!9DGZ JAR3M%Z
n figura 2-1 este dat imaginea obinut pe ecran la
vizualizarea acestui appiet cu un appletviewer.
66
ntroducere n
grafica Java
Apple$ 9ieEeiF E2e%pl&l jnm
Applet
S%-- N
=>?
d XOR
erif TA!C "O!#, $%
SansSerif, PLAN, 20
Monospaced& ;%'IN& 20
Apple$ #$ar$e'7
Figura 2-1. Vizualizarea appietului Exeplul.
Metoda paint a appietului este invocat de ctre appietviewer
sau de ctre browser atunci cnd appietul apare pe ecran,
furnizndu-i ca argument o referin la contextul grafic g, care
va fi folosit pentru desenare.
Urmrind simultan metoda paint a appietului Exemplul i
desenul din figura 2-1, putem vedea cu uurin efectul fiecrei
instruciuni. Pentru nceput, este invocat metoda
setBackground din clasa Component, pentru a stabili culoarea
de fond. Sunt invocate succesiv diferite metode ale clasei
Graphics pentru a trasa desene sau pentru a modifica starea
contextului grafic.
Se traseaz mai nti trei dreptunghiuri: unul gol, unul plin si
unul gol cu coluri rotunjite. Se traseaz apoi dou linii nclinate,
care intersecteaz dreptunghiul plin. Prima din ele este trasat
n modul implicit care este Paint. n consecin, aceast linie
este vizibil numai n afara dreptunghiului pe care l
intersecteaz. Se trece apoi la modul de trasare XOR i se
deseneaz a doua linie, care este acum vizibil pe toat
lungimea ei, datorit alternrii culorilor. Fr a schimba acest
mod de desenare, se invoc metoda setFont pentru a stabili
fontul contextului grafic i se scrie peste dreptunghiuri textul
"Serif, PLAN, 20". ntruct modul de desenare a rmas XOR,
textul este n ntregime vizibil, chiar i pe poriunea unde este
scris pe negru. Se trece apoi la modul Paint i se mai scriu trei
texte, cu diferite fonturi.
3xemplul / influen"a %omponentei alp'a a %ulorii
n appietul urmtor se demonstreaz influena modificrii
opacitii culorii, dat prin componenta alp'a din sistemul RGB.
Este scris mai nti un text direct pe suprafaa appietului, dup
care se aplic deasupra trei dreptunghiuri pline cu culori avnd
diferite valori ale componentei alp'a. Peste acestea, se scrie
apoi un nou text, mai jos dect cel anterior.
Applet #&. 3xemplu.$ava/ exemplifi%area influen"ei
modifi%4rii opa%it4"ii
%ulorii.
import j
ava.a-t.), import
java.app+et.),
pu.+ic c+ass =/emp+u2 e/tends
'pp+et pu.+ic void
paint(6raphics g 0
CE
Ciprian-Daniel NEAGU, Severin BUMBARU
M
set!ac4ground(Co+or.-hite,
g.set:ont(ne- :ont(<@ans@erif<&
:ont.!9%D& 1D
g.dra-@tring(<$n te/t scris pe funda+<&
20& 80
g.dra-(ect(10& 10& I0& D0,
g.dra-(ect(E0& 10& I0& D0,
g.dra-(ect(1*0& 10& I0& D0,
g.setCo+or(ne- Co+or(200& 200& 200&
100,
g.fi++(ect(10& 10& I0& D0,
g.setCo+or(ne- Co+or(200& 200& 200&
1I0,
g.fi++(ect(E0& 10& I0& D0,
g.setCo+or(ne- Co+or(200& 200& 200&
200,
g.fi++(ect(1*0& 10& I0& D0,
g.setCo+or(Co+or..+ac4,
g.dra-@tring(<$n te/t scris deasupra<&
20& E0,
maginea obinut pe ecran n urma vizualizrii acestui applet
cu un appietviewer este dat n figura 2-2. Se poate observa cu
uurin c, cu ct este mai mare valoarea componentei alpha
a culorii, cu att este mai puin vizibil textul de pe fundal, peste
care este aplicat dreptunghiul respectiv.
EApptet Viewer: Exemplu2
umm
Applet
Un tixt scrijs
Un t^xt scrijs deasip
Applet started.
.igura #. Vi)uali)area appletului 3xemplu.
3xemplul &/ imagini, poligoane, folosirea transla"iilor.
Appietul Exemplu3, a crui surs este reprodus mai jos,
servete pentru a demonstra modul n care se pot afia pe
suprafaa appletului imagini importate (date sub form de fiiere
n format gif sau jpeg) i cum se pot trasa poligoane goale sau
pline, ale cror coordonate ale vrfurilor sunt stabilite prin
calcul. Dac acelai poligon este trasat de mai multe ori n
poziii diferite, pentru a evita recalcularea tablourilor de
coordonate se face o translaie sistemului de coordonate al
contextului grafic.
hda
l
r
pe fu
Applet #6. 3xemplu&.$ava/ afi5area imaginilor
importate
import java.a-t.),
import
java.app+et.),
p19#-3 3#!.. 8A%$p#13 %A'%2d. App#%' E - 2' ( *
AS'%!<2%" - 2' ( 5* + yS'%!<2%" - 2' ( 5*
AS-2<2%" --' (61* + yS-2<2%" -2' (61* I$!g%
-$!g-2%0
68
ntroducere n
grafica Java
pu.+ic void init( 0
imagine 5 get+mage(getCode!ase( &
<.Ajava+ogoI2/DD.gif<,
AA 6enerarea v`rfuri+or ste+ei
dou.+e u52)Math.;IAI, for(int
i50, iJI, iKK 0
/@tea1i2 5 (int(*0)Math.sin(2)i)u
y@tea1i2 5 (int
(*0)Math.cos(2)i)u
M
AA 6enerarea graficu+ui funcLiei
Math.
dou.+e d/52)Math.;IAC0,
for(int i50, iJC1, iKK 0
/@in1i25i&F
y@infi2 5 (int (*0)(1F
Math.sin(i)d/ M M
pu.+ic void paint(6raphics g 0
set!ac4ground(Co+or.-hite, g.dra-(ect(I&
I& 2C0& 1I0, g.trans+ate(80& 80,
g.dra-;o+ygon(/@tea& y@tea& I,
g.trans+ate(E0& 0, g.fi++;o+ygonL/@tea&
y@tea& I, g.dra-+mage(imagine& D0& F20&
this, g.trans+ate(F100& 80,
g.dra-;o+ygon(/@in& y@in& C1,
g.trans+ate(E0& 0 , g.fi++;o+ygon(/@in&
y@in& C1, M M
.-2&A/
Pe suprafaa appletului se reprezint dou stele de form i
dimensiuni identice (una goal i alta plin), dou grafice ale
funciei sin(x) (unul gol i altul plin) i o figur, care reprezint
sigla platformei Java de la firma Sun Microsystems. Pentru
fiecare poligon se folosesc dou tablouri, din care unul pentru
coordonatele x, iar al doilea pentru coordonatele y ale vrfurilor.
n metoda init () se genereaz coordonatele vrfurilor att
pentru stea, ct i pentru graficul funciei sinusoidale. Tot n
aceast metod, se creaz obiectul care conine fiierul de
imagine. ntruct, n cazul de fa, fiierul de imagine
"javalogo52x88.gif" se gsete n acelai director cu cel al
appletului, pentru a determina URL-ul directorului n care se
gsete fiierul-imagine se folosete metoda getCodeBase O.
n consecin, la invocarea metodei getlmage () se dau doi
parametri: primul specific directorul n care se gsete
appletul, iar al doilea reprezint calea de la acest director ctre
fiierul de imagine.
La generarea coordonatelor vrfului stelei, s-a considerat c
originea sistemului de coordonate este n centrul acesteia. n
consecin, nainte de fiecare din cele dou trasri ale stelei, s-
a efectuat o translaie a axelor de
69
Ciprian-Daniel NEAGU, Severin BUMBARU
coordonate ale contextului grafic, astfel nct s se aduc
centrul stelei n poziia dorit.
Pentru reprezentarea funciei sinusoidale, intervalul [0.0,
2*Math.P] a fost mprit n 60 de subintervale, calculndu-se,
n mod corespunztor 61 perechi de coordonate. Acestea au
fost convertite n numere ntregi (dup nmulirea cu factorii de
scar corespunztori) i au fost memorate n tablourile xSin i
ySin. nainte de desenarea figurilor, s-au fcut iari translaiile
corespunztoare ale axelor de coordonate.
Rezultatul vizualizrii appletului n appletviewer este prezentat
n figura 2-3.
Applet started.
.igura #&. Vi)uali)area appletului 3xemplu&.
2.6. Desenarea folosind contextul grafic dat de clasa
Graphics2D
Clasa java.awt.Graphics2D extinde clasa java.awt.Graphics,
motenind toate metodele acesteia. Folosirea drept context
grafic a unei instane a clasei Graphics2D permite o flexibilitate
mult mai mare n reprezentarea desenelor, datorit facilitilor
suplimentare pe care le ofer aceast clas, cum sunt: trasarea
liniilor de diferite grosimi, folosirea gradientelor de culori (trecere
gradual dintr-o culoare n alta) i a texturilor, translatarea,
rotirea i transformarea de scar a figurilor, efectuarea de
transformri afine etc.
.:.1. Crearea instan"ei %ontextului grafi% Grap'i%s!
Metoda paint (Graphics g), care este redefinit de programator
pentru fiecare component pe suprafaa creia se deseneaz,
are ca argument o instan a clasei Graphics. n realitate, la
versiunile actuale ale mainilor virtuale Java, la invocarea
metodei paint i se transfer4 a%esteia o instan"4 a %ontextului
grafi% Grap'i%s!. Pentru compatibilitate cu versiunile
anterioare, semnturile metodelor paint i update au rmas
aceleai, deci ele au ca argument formal o instan a clasei
Graphics. Dac programatorul dorete s foloseasc metodele
clasei Graphics2D, trebuie s fac o conversie de la superclasa
Graphics la clasa Graphics2D. n consecin, redefinirea
metodei paint se va face sub forma:
pu.+ic void paint(6raphics
g 0 Graphics2D g2d =
(Graphics2D)g;
A) InstrucLiuni an care se fo+oseVte pentru
E0
ntroducere n grafica Java
desenare conte/tu+ grafic
g2d )A M
n mod similar se poate proceda i la redefinirea metodei
update.
.:.. 0istemul de %oordonate
Din motive de compatibilitate, caracteristicile de baz ale
sistemului de coordonate al contextului grafic Graphics au fost
meninute i n Graphics2D: originea sistemului se gsete
iniial n colul din stnga-sus al componentei pe care se
deseneaz, axa Ox este orientat ctre dreapta iar axa Oy este
orientat n jos. Deosebirea const n faptul c, n Graphics2D,
coordonatele nu se mai exprim prin numere ntregi, ci prin
numere reale. Fiecare clas de forme este definit n dou
variante: pentru coordonate float i double.
Explicaia este c contextul grafic Graphics2D a fost conceput
ca abstractizarea unei mari varieti de dispozitive fizice de
desenare, att vectoriale, ct i de tip rastru. Fiecare din aceste
dispozitive are propriul su sistem de coordonate i propria sa
rezoluie a redrii imaginii. Programatorul n Java2D are
posibilitatea s traseze o imagine de nalt precizie, ntr-un
sistem de coordonate abstract cu cordonate exprimate prin
numere reale, iar la desenarea efectiv se face trecerea
automat de la acest sistem abstract la cel al dispozitivului de
desenare fizic utilizat. Este evident c rezoluia efectiv a
desenului va fi cea a dispozitivului fizic. Trecerea de la un
sistemul de coordonate abstract la cel al dispozitivului se face
automat, fiind transparent pentru programatorul n Java.
.:.&. 2etodele %lasei Grap'i%s!
Clasa =ava7aE$7Grap0i)#2D extinde clasa =ava7aE$7Grap0i)#"
astfel c motenete toate cmpurile i metodele acesteia. n
plus, clasa Graphics2D ofer i metode specifice, dintre care le
menionm aici pe cele ce urmeaz:
p19#-3 !9.'!3' v>-d 7a:$9+a2e ./ - 7e9e3ea<6 f"ma 9@
p19#-3 !9.'!3' 9>>#%!2 7a:lmaAe&I$!g% -$g+
A=f-2%T!2.=>$ A=>$+ I$!g%O9.%v% >9./ - 9e 7e9e3ea<6 -$!g-2%!
im&, =>#>.-2d '!2.=>$!%! !=-2M 'form ?- >9.%v!'>1# d% -$!g-2%
o(s)
p19#-3 !9.'!3' v>-d = -## &S,!p% ./ - 1$p#% -2'%->1# =>$%- .0
public abstract boolean 0i$(Rectangle rect, Shape s, boolean
onStroke) - verific dac dreptunghiul re%t din spaiul
dispozitivului intersecteaz forma s. Al treilea argument indic
dac se vor lua sau nu n consideraie i punctele de pe
conturul figurii;
public abstract void #e$C(%p(#i$e(Composite comp) - #e$ea5/
modul Composite pentru contextul grafic; argumentul %omp este
un obiect cu interfaa Composite, care este folosit pentru
indicarea modului de compunere a desenelor sau imaginilor;
public abstract void #e$Pain$(Paint paint) - #e$ea5/ %('&l
Paint, care folosete la stabilirea culorilor cu care se traseaz
conturul i se umple interiorul figurilor;
71
Ciprian-Daniel NEAGU, Severin BUMBARU
p19#-3 !9.'!3' v>-d .%'.'>4% &S'>4% ./ - .%'%!LM .'-#1# #-2--#> 31
3!% .% '!.%!LM 3>2'11# =-g1-#>0
p19#-3 !9.'!3' v>-d '!2.#!'%&d>19#% 'A+ d>19#% 'y/ -
translateaz sistemul de coordonate, astfel c noua sa origine
trece n punctul
*tx, ty+,
p19#-3 !9.'!3' v>-d >'!'% &d>19#% ',%'!/ - >'%?'% .-.'%$1# d%
coordonate cu unghiul t'eta, exprimat n radiani;
pu.+ic a.stract void rotate(dou.+e theta&
dou.+e /& dou.+e
y) - translaie n punctul de coordonate *x,y+, urmat de o rotaie
cu unghiul
t'eta i de o translaie invers, n punctul iniial. Echivalent cu
urmtoarele
trei instruciuni: translate(x.y); rotate(theta); translate(-x,-y);
p19#-3 !9.'!3' v>-d 95ale&d>19#% .A+ d>19#% .y/ - =!3% O .3,-$9!% d%
.3!M+ 31 =!3'>-- d% .3!M p% 3%#% d>1M !A% %.p%3'-v s', sy)
p19#-3 !9.'!3' v>-d 9+ea&d>19#% .,A+ d>19#% .,y/ - .% p>d13% >
O23#-2!% ! !A%#> d% 3>>d>2!'%0 3>>d>2!'%#% A .% $1#'-p#-3M 31
.,APy + -! 3>>d>2!'%#% y .% $1#'-p#-3M 31 .,yPA0
p19#-3 !9.'!3' v>-d ta39f"m$-f=-2%T!2.=>$ TA/ - a2li56
'!2.=>$!%! !=-2M T', 3!% .% 31$1#%!LM 31 3%! d%K! %A-.'%2'M0
p19#-3 !9.'!3' v>-d 9etTa39f"m$-ff-2%T!2.=>$ TA/ -.%'%!LM
'!2.=>$!%! !=-2M p%2'1 3>2'%A'1# 5!p,-3.2)0
n cele ce urmeaz vom prezenta diferite aspecte ale utilizrii
acestor metode pentru realizarea de desene folosind contextul
Graphics2D.
.:.6. Crearea 5i utili)area formelor
O alt noutate introdus de contextul grafic Graphics2D este
utilizarea claselor de forme.
n clasa Graphics existau metode de trasare pentru un numr
restrns de figuri geometrice (dreapt, dreptunghi, oval, linie
poligonal, poligon). Orice alt form putea fi creat numai
folosind liniile poligonale i poligoanele. n clasa Grap0i)#2D s-
a introdus conceptul abstract de form geometric (englez:
s'ape+ reprezentat prin interfaa S0ape7 n pachetele =ava7aE$
<i =ava7aE$7+e(% exist, de asemenea, un set de clase de
forme predefinite care implementeaz interfaa Shape. n plus,
programatorul poate crea propriile lui clase de forme, care
implementeaz interfaa Shape. Dintre clasele de forme
predefinite care implementeaz interfaa Shape, menionm
aici:
- clasele abstracte Line2D, QuadCurve2D, CubicCurve2D,
RectangularShape, Arc2D, Ellipse2D, Rectangle2D,
RoundRectangle2D;
- clasele statice Line2D.Double, Line2D.Foat,
QuadCurve2D.Foat, QuadCurve2D.Double,
CubicCurve2D.Foat, CubicCurve2D. Double,
Arc2D.Double, Arc2D.Foat, Ellipse2D.Double,
Ellipse2D.Foat, Rectangle2D.Double, Rectangle2D.Foat,
RoundRectangle2D.Double, RoundRectangle2D.Foat;
- clasele Rectangle, Polygon, GeneralPath, Area.
Exist, de asemenea, dou familii de clase de forme care nu
implementeaz interfaa Shape:
72
ntroducere n grafica Java
- Point2D, Point2D.Foat, Point2D.Double, Point;
- Dimension2D, Dimension2D.Foat, Dimension2D.Double.
Cu aceste clase se pot construi orice alte forme 2D. Desenarea
efectiv a formelor se face folosind urmtoarele metode ale
clasei Graphics2D:
p19#-3 !9.'!3' v>-d d!"&S,!p% ./ - d%.%2%!LM 3>2'11# =>$%- .0
p19#-3 !9.'!3' v>-d =-##&S,!p% ./ - 1$p#% -2'%->1# =>$%- ..
.:.9. Interfa"a 0'ape
nterfaa java.awt.Shape este reprezentarea abstract a unei
forme geometrice oarecare. Pentru parcurgerea conturului
acestei forme, n interfaa Shape este folosit interfaa
Pathlterator care permite, de asemenea, s se determine dac
un punct oarecare este interior sau exterior formei.
Metodele interfeei Shape sunt urmtoarele:
public Rectangle getBoundsO - ntoarce dreptunghiul n care se
ncadreaz forma;
public Rectangle2D getBounds2D () - ntoarce dreptunghiul
care ncadreaz forma, cu precizie mai mare dect cel
precedent (folosind coordonate de tip double n loc de int);
public boolean contains (double x, double y) - ntoarce true
dac forma conine punctul de coordonate (x,y);
public boolean contains (Point2D p) - ntoarce true dac forma
conine punctul p;
public boolean intersects(double x, double y, double w, double
h) - ntoarce true dac forma intersecteaz dreptunghiul cu
colul stnga-sus n punctul (x,y), limea w i nlimea h;
public boolean intersects (Rectangle2D r) - ntoarce true dac
forma intersecteaz dreptunghiul r ;
public boolean contains(double x, double y, double w, double h)
- ntoarce true dac figura conine n ntregime dreptunghiul dat
prin argumente;
public boolean contains (Rectangle2D r) - ntoarce true dac
forma conine n ntregime dreptunghiul r ;
public Pathlterator getPathlterator(AffineTransform at) -ntoarce
un iterator al componentelor conturului formei. Dac se d ca
argument o transformare afin, coordonatele ntoarse la iterare
sunt transformate n acord cu aceasta
.:.:. Cara%teristi%ile formelor primitive
Numim forme primitive acele forme, pentru care exist clase
predefinite n Java2D (n pachetele java.awt sau
java.awt.geom).
.orme re%tangulare
Sunt considerate forme rectangulare, formele care se
ncadreaz ntr-un dreptunghi (figura 2-4).
73
Ciprian-Daniel NEAGU, Severin BUMBARU
Rectangle2D RoundRectangle2D Ellipse2D Arc2D
.igura #6. Aspe%tul formelor primitive
re%tangulare.
Constructorii claselor corespunztoare acestor figuri (n varianta
Double) sunt urmtorii:
public Rectangle2D.Double(double x, double y, double w,
double h) - construiete un dreptunghi cu colul stnga-sus n
punctul (x,z), limea w i nlimea h;
public RoundRectangle2D.Double(double x, double y, double w,
double h, double arcw, double arch) - construiete un
dreptunghi cu colurile rotunjite, ncadrat n dreptunghiul cu
colul stnga-sus n punctul (x,z), limea w i nlimea h, iar
arcele de rotunjire a colurilor au limea ar%( i nlimea ar%',
public Ellipse2D.Double(double x, double y, double w, double h)
- construiete o elips ncadrat n dreptunghiul cu colul
stnga-sus n punctul (x,z), limea w i nlimea h;
public Arc2D.Double(double x, double y, double w, double h,
double start, double extent, int type) - construiete un arc al
elipsei ncadrate n dreptunghiul cu colul stnga-sus n punctul
(x,z), limea w i nlimea h; arcul ncepe la unghiul start i se
extinde pe unghiul extent (n grade), iar tipul nchiderii arcului
este type,
public Arc2D.Double(Rectangle2D ellipseBounds, double start,
double extent, int type) - construiete un arc al elipsei ncadrate
n dreptunghiul ellipse1ounds, arcul ncepe la unghiul start i se
extinde pe unghiul extent (n grade), avnd tipul de nchidere
type.
Exist trei tipuri de nchidere a arcelor de elips:
Arc2D.OPEN - arcul este deschis;
Arc2D.CHORD - capetele arcului sunt unite printr-o coard
(se formeaz astfel un segment de elips);
Arc2D.PE - capetele arcului sunt unite cu centrul elipsei
prin dou segmente de dreapt (se formeaz astfel un
sector de elips).
Vom ilustra printr-un exemplu cum pot fi utilizate metodele draw
i fiii ale clasei Graphics2D pentru a desena forme (n particular
forme rectangulare).
Exemplu: n appletul FormeRectang, al crui program este
reprodus aici, se deseneaz cte un exemplar din fiecare form
primitiv, att sub form de contur (invocndu-se metoda draw),
ct i umplute cu culoarea Color.gray (invocndu-se metoda
fiii).
Appletul creat prin acest program conine desenul din figura 2-
5. mperfeciunea figurilor se datorete rezoluiei slabe a
ecranului folosit pentru redare.
74
ntroducere n grafica Java
.igura #9. .orme primitive re%tangulare in
Dava!. Appiet #9. .orme8e%tang.$ava/ desenarea 5i
umplerea formelor primitive.
:iVieru+ :orme(ectang.java
import j ava.a-t.),
import
java.appiet.),
import j
ava.a-t.geom.),
pu.+ic c+ass :orme(ectang e/tends 'ppiet 0
(ectang+e2D chenar5ne-
(ectang+e2D.Dou.+e(I& I& *C0& 1II&
dr+5ne- (ectang+e2D.Dou.+e(1I& 1I& C0&
I0, (ound(ectang+e2D dr25ne-
(ound(ectang+e2D.Dou.+e(100&
1I& D0& I0& *0& 20, =++ipse2D
e+ipsa5ne- =++ipse2D.Dou.+e(200& 1I& D0&
I0 , 'rc2D arc5ne- 'rc2D.Dou.+e(2C0&
1I& D0& I0& F20& 120&
'rc2D.;I=, pu.+ic void
paint(6raphics g
0 6raphics2D g2d 5
(6raphics2Dg,
g2d.dra-(chenar,
A) Desenarea forme+or su. forma de
contur)A g2d.dra-(dr+, g2d.dra-(dr2,
g2d.dra-(e+ipsa&Fg2d.dra-(arc&FA)
3rans+atarea a/e+or de coordonate si
schim.area
cu+orii)A g2d.trans+ate(0&D0,
g2d.setCo+or(Co+or.gray, A)
Desenarea forme+or ump+ute cu
cu+oarea
Co+or.gray . . H F
)A
g2d.fi++(dr+,
g2d.fi++(dr2,
g2d.fi++(e+ips
a,
g2d.fi++(arc,
M
Cipnan-Daniel NEAGU, Severin BUMBARU
Curbe patrati%e
Curbele patratice (englez: Tuadrati% %urves+ sunt forme care
au aspectul unor curbe generate de funcii de gradul doi. Ele
sunt realizate n Java2D prin clasa abstract Q&a'C&rve2D i
clasele imbricate statice Q&a'C&rve2D7FI(a$ <i
Q&a'C&rve2D7D(&4le" din pachetul =ava7aE$7+e(%7
O curb patratic este caracterizat prin trei puncte: cele dou
capete i un punct de control (figura 2-6). Se observ c prin
punctul de control C trec tangentele duse la curb n cele dou
puncte de capt A i 1.
.igura #:. O %urb4 patrati%4 5i %ele trei pun%te
%ara%teristi%e.
Constructorul curbei patratice, n varianta Double, este
urmtorul: public Q&a'C&rve2D7D(&4le(double xl,
double yl, double ctrlx, double ctrly, double x2,
double y2) - &n'e ?2!"1!@ <i (x2,y2) sunt coordonatele
punctelor de la capetele curbei, iar (ctrlx, ctrly) este punctul de
control.
Curbe %ubi%e
Curbele cubice (englez: %ubi% %urves+ sunt forme care au
aspectul unor curbe generate de funcii de gradul 3. Ele sunt
realizate n Java2D prin clasa abstract CubicCurve2D i prin
clasele imbricate statice C&4i)C&rve2D7FI(a$ <i
C&4i)C&rve2D7D(&4le" toate din pachetul =ava7aE$7+e(%7
1 R
.igura #;. !ou4 %urbe %ubi%e/ %u
pun%t de inflexiune
*stUnga+ 5i f4r4 *dreapta+.
1 5i C sunt pun%tele de %ontrol.
Curba cubic este caracterizat prin patru puncte: cele dou
capete i dou puncte de control. Prin punctele de control trec
tangentele la capetele curbei.
Dac dreapta care unete cele dou puncte de control
intersecteaz curba, punctul de intersecie este un punct de
inflexiune. n caz contrar, curba nu are punct de inflexiune.
Exist i situaii, n care curba cubic se poate autointersecta,
ca n figura 2-8.
76
ntroducere n grafica Java
.igura #>. 0itua"ie Hn %are %urba %ubi%4 se
autointerse%tea)4.
.:.;. .orme generale
Clasa =ava7aE$7+e(%7GeneralPa$0 permite crearea de forme
compuse, prin nlnuirea de linii drepte, curbe patratice i curbe
cubice (Bezier). Se pot aplica dou "reguli de cuprindere"
(englez: (inding rule+ pentru a stabili dac un punct este sau
nu interior figurii: EVEN_ODD i NONZERO.
Conform regulii EVEN_ODD (par-impar), dac se traseaz un
segment de dreapt de la un punct situat nafara figurii, pn la
un punct situat n interior, se traverseaz conturul figurii de un
numr impar de ori. Parcurgnd aceast dreapt, punctele
exterioare figurii alterneaz cu cele interioare i invers de cte
ori se traverseaz conturul acesteia.
Conform regulii NON_ZERO, pentru a stabili dac un punct P
este interior figurii se procedeaz astfel: se duce o semidreapt
(o "raz") din punctul P la infinit i se parcurge conturul figurii,
urmrindu-se pe ce parte rmne punctul P la intersecia
conturului cu raza. Punctul este interior figurii dac, i numai
dac, numrul de intersectri la care punctul P rmne pe
partea stng difer de cel n care P rmne pe partea dreapt.
Pentru specificarea celor dou "reguli de cuprindere"
menionate, n clasa generalPath exist cmpurile statice finale
GeneralPa$07NIND6E9EN6ODD i respectiv
GeneralPa$07NIND6NON6MERO7
Constructorii clasei GeneralPath sunt urmtorii:
public GeneralPath () - construiete o instan vid, cu regula
de nchidere implicit NONZERO;
public GeneralPath (int rule) - construiete o instan vid cu
regula de nchidere dat ca argument.
public GeneralPa$0(int rule, int
initialCapacity) construiete o instan cu regula de nchidere
i capacitatea iniial date;
public GeneralPath (Shape s) - construiete o instan care
preia forma s primit ca argument, inclusiv regula de nchidere
a acesteia.
Clasa GeneralPa$0 conine toate metodele interfeei S0ape" pe
care o implementeaz, oferind n plus urmtoarele metode
specifice:
public void %(veT( (f loat x, float y) - se introduce un punct de
coordonate (x,y), deci se face o deplasare de la punctul curent
la noul punct, care devine astfel punct curent;
public void lineTo (float x, float y) - se traseaz un segment de
dreapt de la punctul curent, la cel de coordonate (x,y);
77
Ciprian-Daniel NEAGU" Severin BUMBARU
public void S&a'T((float xl, float yl, float x2, float y2) - se
traseaz o curb patratic cu un capt n punctul curent i alt
capt n punctul (x2,y2), folosindu-se (x1,y1) ca punct de
control;
public void )&rveT((float xl, float yl, float x2, float y2, float x3,
float y3) - se traseaz o curb Bezier cu capetele n punctul
curent i n cel de coordonate (x3,y3), folosind punctele (x1,y1)
i (x2,y2) ca puncte de control;
public void closePathO - se nchide conturul figurii unind printr-o
dreapt punctul curent cu ultimul punct introdus printr-un
moveTo. Dac cele dou puncte coincid, metoda nu are efect;
public void append(Shape s, boolean connect) - se adaug
forma s la cea existent. Dac al doilea argument este true,
forma existent i cea nou adugat se leag printr-un segment
de dreapt;
public void appen'(Pathlterator pi, boolean connect) - #e
adaug forma descris de iteratorul pi la forma deja existent.
Dac al doilea argument este true, cele dou forme se unesc
printr-un segment de dreapt;
public int getwindingRule ( ) - ntoarce regula de nchidere a
formei;
p&4li) v(i' #e$Nin'in+R&le ?in$ r&le@ - #e$ea5/ re+&la 'e
nchidere;
public Point2D getCurrentPoint () - ntoarce punctul curent;
public void resetf) - elimin toate componentele existente ale
formei;
public void $ran#,(r%?A, , ineTransform a$@ - apli)/ ,(r%ei
transformarea afin at,
public Shape )rea$eTran#,(r%e'S0ape?A,,ineTransform a$@
-ntoarce o nou form, obinut din cea existent prin aplicarea
transformrii afine at,
public Object clone () - creaz o clon a acestei forme.
Exemplu: n programul de mai jos se definete un applet n care
se exemplific utilizarea clasei GeneralPath. Se construiesc trei
forme generale: un patrulater neregulat, o curb nscris n
acest patrulater i o figur compus din acestea dou. Curba
nscris este format din patru curbe patratice, fiecare din ele
avnd drept capete mijloacele a dou laturi adiacente ale
patrulaterului i drept punct de control intersecia acestor laturi.
n acest fel, curbele patratice sunt tangente la capete la laturile
patrulaterului, deci curba nchis format din mbinarea lor este
nscris n patrulater.
Applet #:. Curbalns%risa.$ava/ utili)area %lasei
GeneralPat'.
77777777777777777777777777777777777777777777
AA :iVieru+ Cur.a+nscrisa.java
import java.app+et.),
import j ava.a-t.),
import java. a-t .geom. ) &F
pu.+ic c+ass Cur.a+nscrisa e/tends 'pp+et 0
f+oat12 pp/50+9.9f& *0.9f& D0.9f& 100.9f&
10.9fM& ppy50C0.0f& 10.9f& 10.9f&
D0.9f& C0.9fM&
ED
ntroducere n grafica Java
pc/5ne- f+oat182& pcy5ne-
f+oat182, 6enera+;ath patru+ater5ne-
6enera+;ath(&
cur.a+nscrisa5ne-
6enera+;ath(&
figuraCompusa,
pu.+ic void init9 0
AA @e ca+cu+eaQX coordonate+e capete+or
arce+or for(int i50, iJ8, iKK 0
p3A(-* < &ppA(-*DppA(- D 1* / Q20
p3y(-* < &ppy'-*Dppy(- D 1* / Q20
B
AA @e construiesc figuri+e
patru+ater.move3o(pp/102&
ppy102, for(int i5+, iJI,
iKK
patru+ater.+ine3o(pp/1i2&p
py1i2,
cur.a+nscrisa.move3o(pc/1*2&
pcy1*2, for(int i50, iJ8, iK
K
cur.a+nscrisa.[uad3o(pp/1i2&
ppy1i2& pc/1i2 & pcy 1i2 ,
figuraCompusa5ne-
6enera+;ath(patru+ater,
figuraCompusa.append(cur.a+nscrisa
& fa+se,
M
pu.+ic void paint(6raphics g 0
6raphics2D g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e2D.:+oat(2& 2& *C0&
1D0,
g2d. dra- (patru+ater &F
g2d.trans+ate(120&0,
g2d.dra-(cur.a+nscrisa&F
g2d.trans+ate(120& 0,
figuraCompusa.set_inding(u+e(
6enera+;ath._IND7="=N79DD,
g2d.dra-(figuraCompusa, g2d.trans+ate(F
280& U0, g2d. dra- (patru+ater &Fg2d.
fiii (cur.a+nscrisa &Fg2d. trans+ate
(120& 0 &Fg2d.setB9(Mode (Co+or.-hite
&Fg2d.fi++(patru+ater,
g2d.dra-(cur.a+nscrisa ,
g2d.trans+ate(120&0 , g2d.set;aintMode(,
g2d.fi++(figuraCompusa, M M
Aspectul appietului generat prin acest program este dat n figura
2-9.
Ciprian-Daniel NEAGU, Severin BUMBARU
mm >B C
C C D-E
.igura #@. .orme reali)ate folosind %lasa
GeneralPat'.
.:.>. 0tiluri de linii
n Java2D, pentru desenarea formelor (trasarea contururilor
figurilor) se pot folosi linii de diferite stiluri. Alegerea stilului liniei
se face folosind metoda void setstroke(stroke s) a clasei
Graphics2D. Stilul de trasare s transmis ca argument al acestei
metode trebuie s fie un obiect care implementeaz interfaa
java.awt.Stroke. Clasa de baz care implementeaz aceast
interfa este java.awt.BasicStroke.
Constructorii clasei BasicStroke sunt urmtorii:
pu.+ic BasicStroke(f+oat -idth& int cap& int
join& f+oat miter+imit& f+oat 12 dash& f+oat
dashjphase
pu.+ic BasicStroke(f+oat -idth& int cap& int
join& f+oat miter+imit
pu.+ic BasicStroke(f+oat -idth& int cap& int
join
pu.+ic BasicStroke(f+oat -idth
pu.+ic BasicStroke()
Semnificaiile argumentelor acestor constructori sunt
urmtoarele:
(idt' # grosimea liniei;
%ap # forma captului liniei, care poate fi:
BasicStroke.CAP_BUTT - liniile i segmentele de linii se
termin drept;
BasicStroke.CAP_ROUND - capetele liniilor i
segmentelor de linii ntrerupte sunt rotunjite;
BasicStroke.CAP_SQUARE - liniile i segmentele de linii
ntrerupte se termin cu ptrate care se extind pe
jumtate din limea liniei.
$oin - modul de mbinare a dou linii care formeaz ntre ele
un unghi i poate fi ales dintre:
BasicStroke. JON_MTER - segmentele de linii se extind
pe locul de mbinare pn se intersecteaz;
80
ntroducere n
grafica Java
Basicstroke. JON__ROUND - colul se rotunjete pe
jumtate din grosimea liniei;
Basicstroke. JON_BEVEL - colurile exterioare ale liniilor
care se mbin sunt unite printr-o dreapt.
iterliit- lungimea pe care se extinde mbinarea
(minimum 1);
!as" # un tablou care conine stilul de ntrerupere a liniei:
componentele tabloului indic lungimile zonelor opace,
alternnd cu cele transparente (prima component este
opac, a doua este transparent etc);
!as"#p"ase - decalarea stilului liniei ntrerupte fa de cel
prescris prin argumentul precedent.
Acolo unde sunt mai puine argumente, pentru cele lips se
admit valori implicite. Astfel, constructorul cu un singur
argument seteaz o linie plin (nentrerupt) avnd grosimea
(idt' i capetele drepte.
n figura 2-10 sunt reprezentate diferite combinaii de capete i
de mbinri de linii, care se dau prin argumentele %ap i $oin ale
metodei setstroke. De exemplu, combinaia CAP_BUTT,
JON_BEVEL a fost creat prin instruciunea:
g2d.setstro4e(ne- !asic@tro4e(12&
!asicstro4e.C';7!$33&
!asic@tro4e.b9IN7!="=%,
n care g2d este referina la contextul grafic Graphics2D.
CAP_BUTT CAP_R0UND
CAP_SQUARE JON_BEVEL
JON_ROUND
JON_MTER >>>
.igura #1B. Capete 5i Hmbin4ri de linii.
Din momentul n care s-a executat aceast instruciune i pn
la executarea altei instruciuni setstroke, toate liniile (inclusiv
contururile figurilor cu interfaa Shape) se traseaz respectnd
acest stil.
Pentru liniile intrerupte se folosesc in plus argumentele das' i
das'Vfase. Componentele tabloului dash reprezint
succesiunea lungimilor segmentelor opace (pline) alternnd cu
segmente transparente (spaii libere n care se vede culoarea
de fundal). De exemplu, o linie-punct format dintr-un segment
de lungime 10, urmat de un spaiu liber de lungime 3, urmar de
un segment (punct) de lungime 2 i de un alt spaiu liber de
lungime 3 va fi descris prin tabloul {10, 3, 2, 3}.
81
> > >
> > >
Ciprian-Daniel NEAGU, Severin BUMBARU
I
i77
i i
Linie cu stilul implicit
Linie plina grosime 5
Linie grosime 5, intrerupere
(10, 3}
Linie grosime 5, intrerupere
{10, 3, 3, 3}
Dreptunghi trasat cu linie-punct
.igura #11. !iferite stiluri de linii.
n figura 2-11 sunt reprezentate linii drepte i un dreptunghi
trasate cu diferite stiluri. n cazul liniilor ntrerupte s-au indicat i
componentele tabloului das'. Dm n continuare i programul
prin care a fost creat acest desen.
Applet #;. 0tiluriLinii.$ava/ stiluri de linii utili)ate pentru
trasare.
import
java.app+et.),
import j ava.a-t.),
import
java.a-t.geom.),
pu.+ic c+ass @ti+uri%inii e/tends
'pp+et 0 f+oat12 intrerupta5010&
*M&
un;unct5010& *& *& *M& doua;uncte5010& *&
*& *& *M, !asic@tro4e +inie;+ina5ne-
!asic@tro4e(I& +inie+ntrerupta5ne-
!asic@tro4e(I& !asic@tro4e.C';7!$33&
!asic@tro4e.b9IN7MI3=(& I& intrerupta& 0&
+inie;unct5ne- !asic@tro4e(I&
!asic@tro4e.C';7!$33&
!asic@tro4e.b9IN7!="=%& I& un;unct& 0,
6enera+;ath +inie5ne- 6enera+;ath(,
pu.+ic void init (
0 +inie.move3o(20&
20,
+inie.+ine3o(1D0&
20,
M
pu.+ic void
paint(6raphics g 0
6raphics2D
g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e2D.:+oat(I& I&
880& 1C0, g2d.dra-(+inie,
g2d.dra-@tring(<%inie cu sti+u+
imp+icit<& 210&
2I ,
g2d.trans+ate(0& 20,
g2d.set@tro4e(+inie;+
ina,
g2d.dra-(+inie,
g2d.dra-@tring(<%inie p+ina grosime I<&
210& 2I g2d.trans+ate(0& 20,
D2
ntroducere n grafica Java
g2d.set@tro4e(+inie+ntrerupta,
g2d.dra-(+inie,
g2d.dra-@tring(<%inie grosime I& intrerupere
(10&
*M<& 210& 2 I, g2d.trans+ate(0& 20,
g2d.set@tro4e(+inie;unct,
g2d.dra-(+inie, g2d.dra-@tring(<%inie
grosime I& intrerupere 010&
*& *& *M<& 210& 2I, g2d.dra-(ne-
(ectang+e2D.:+oat(20& 80& 1C0& C0,
g2d.dra-@tring(<Dreptunghi trasat cu
+inieFpunct<&
210& II ,
M M
.:.@. Umplerea formelor
Formele pot fi umplute cu o culoare uniform, cu o culoare
variabil sau cu o textur. n acest scop se folosete metoda
setPaint (Paint paint) pentru a stabili modul de umplere a
formelor (culoare, textur) i metoda void fiii (shape s) pentru a
efecua umplerea propriu-zis. Ambele metode sunt ale clasei
Graphics2D. Dac umplerea se face cu culoare uniform, n
locul metodei setPaint se poate folosi i metoda setColor (Color
c) motenit de clasa Graphics2D de la clasa Graphics.
Metoda setPaint primete ca argument un obiect cu interfaa
java.awt.Paint. n pachetul java.awt exist trei clase care
implementeaz aceast interfa: Color, GradientPaint i
TexturePaint. Prima se folosete pentru desenarea figurii cu o
culoare uniform, a doua cu o culoare variabil (cu gradient) i
a treia pentru textur. Modurile de colorare astfel setate sunt
valabile att pentru umplerea formelor, ct i pentru trasarea
conturului.
Colorarea uniform4
Pentru a trasa sau a umple formele cu culoare uniform, se
folosete instruciunea setPaint cu un argument din clasa Color,
de exemplu
set;aint(Co+or..+ue,
set;aint(ne- Co+or(1EI& 21I& 1D0,
n locul metodei setPaint se poate folosi i metoda setcolor cu
aceleai argumente.
Colorarea %u gradient
Pentru a trasa sau a umple formele cu o culoare care variaz
uniform, setarea culorii contextului grafic se face folosind
metoda setPaint cu un argument din clasa
java.awt.GradientPaint Aceast clas are constructorii:
public Gra'ien$Pain$(float xl, float yl, Color colori, float x2, float
y2, Color color2) - stabilete un gradient aciclic (fr repetare)
care ncepe din punctul *x1, y1+ cu culoarea %olori i se
83
Ciprian-Damel NEAGU, Severin BUMBARU
termin n punctul *x, y+ cu culoarea %olor. Trecerea de la o
culoare la alta se face uniform, n lungul axei care unete cele
dou puncte.
public Gra'ien$Pain$(float xl, float yl, Color colori,
float x2, float y2, Color color2, boolean cyclic) - la fel ca la
constructorul precedent, dar ultimul argument specific dac
gradientul este sau nu ciclic. Dac acest argument este true,
variaia culorilor se repet ciclic n lungul axei care unete cele
dou puncte.
.igura #1. Umplerea figurilor %u %uloare uniform4, %u
gradient a%i%li% 5i
%u gradient %i%li%.
Exemplu: n figura 2-12 sunt desenate trei dreptunghiuri. Primul
este umplut cu o culoare uniform. Al doilea este umplut cu
culoare cu gradient aciclic, variaia producndu-se n lungul
dreptei care trece prin colurile stnga-sus i dreapta-jos. Al
treilea dreptunghi are setat un gradient ciclic: se observa cum
culorile variaz uniform de la negru la alb, apoi de la alb la
negru i variaia se repet. La toate dreptunghiurile conturul a
fost trasat cu culoare uniform, deoarece aa s-a cerut prin
program.
Dm n continuare programul cu care s-a obinut acest desen.
Applet #>. Umplere.$ava/ Umplerea figurilor folosind
%uloare uniform4 5i
gradient.
import
java.app+et.),
import java.a-t.),
import
java.a-t.geom.),
pu.+ic c+ass $mp+ere e/tends 'pp+et 0
@hape dreptunghi5ne-
(ectang+e2D.:+oat(20&
D0& C0 , @tro4e sti++5ne-
!asic@tro4e(*, ;aint gradient+5ne-
6radient;aint (20& 20&
Co+or..+ac4& 100& D0& Co+or.-hite,
;aint gradient25ne- 6radient;aint(20&
20& Co+or..+ac4& 8E& 80& Co+or.-hite&
true,
20&
D8
pu.+ic void paint (6raphics
g 0 6raphics2D
g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e2D.:+oat(I& I&
*C0& 100 g2d.set@tro4e(sti++,
g2d.set;aint(Co+or.+ight6ray,
g2d.fiii(dreptunghi,
g2d.set;aint(Co+or..+ac4,
ntroducere fn grafica Java
g2d.dra-(dreptunghi
, g2d.trans+ate(120&
0 ,
g2d.set;aint(gradien
t1,
g2d.fiii(dreptunghi
,
g2d.setCo+or(Co+or..
+ac4
g2d.dra-(dreptunghi
, g2d.trans+ate(120&
0,
g2d.set;aint(gradien
t2,
g2d.fiii(dreptunghi
,
g2d.setCo+or(Co+or..
+ac4
g2d.dra-(dreptunghi
,
Umplerea %u textur4
n figura 2-13 sunt reprezentate dou forme, un dreptunghi i o
elips, umplute cu textur. Textura este format dintr-o imagine
sau un desen de dimensiuni mici, care se repet periodic pe
toat suprafaa pe care o umple.
iOOOOOOOOC
]ooooooooc ]ooooooooc
IC9999999C *C9999999C *06999999C
#/nr.%,r.o,nnnr
.igura #1&. Un dreptung'i 5i o elips4 umplute %u
textur4.
Pentru a crea o textur se procedeaz astfel:
- se creaz o instan a clasei
=ava7aE$7i%a+e7B&,,ere'l%a+e" n care se
va pune imaginea care trebuie repetat n textur. Clasa are
trei
constructori, dintre care aici va fi folosit:
pu.+ic Bufferedlmage(int -idth& int height& int
image3ype
unde parametrii (idt' i 'eig't sunt, respectiv, limea i
nlimea imaginii, iar image7ype este tipul acesteia, pentru
care exist mai multe constante predefinite (vom folosi aici
TYPE NTRGB);
- se creaz un contextul grafic al acestei zone tampon de
imagine, folosind
metoda:
pu.+ic 6raphics2D createGraphics(
- folosind acest context grafic se import n zona tampon o
imagine preexistent (folosind una din metodele drawlmage)
sau se deseneaz o imagine, folosind metodele de desenare
ale clasei Graphics2D; dimensiunile imaginii trebuie s se
ncadreze n cele ale zonei tampon;
- se creaz un dreptunghi suport, pe care se va proiecta
imaginea din zona-tampon; dimensiunile acestui dreptunghi
suport pot fi mai mici sau mai mari dect cele ale zonei
tampon;
- se creaz textura, ca o instan a clasei
=ava7aE$7Te2$&rePain$" folosind constructorul:
8

F
Ciprian-Daniel NEAGU, Severin BUMBARU
pu.+ic 3e/ture;aint(!uffered+mage t/tr&
(ectang+e2D anchor
an care:
- txtr este zona tampon cu imaginea creat anterior, n timp ce
an%'or este dreptunghiul suport pe care se proiecteaz
imaginea, modificndu-i astfel dimensiunile;
- textura astfel creat poate fi folosit pentru umplerea
formelor de pe desen.
Tehnica de obinere i utilizare a texturii descris aici este
utilizat n programul urmtor, prin care s-a creat desenul din
figura 2-13. n acest program, textura este creat o singur
dat, n metoda init, fiind apoi utilizat de dou ori n metoda
paint.
Applet #@. 7extura.$ava/ exemplifi%area te'ni%ilor de
ob"inere 5i utili)are a
texturii.
import
java.app+et.),
import j ava.a-t.),
import j
ava.a-t.geom.),
import j
ava.a-t.image.),
pu.+ic c+ass 3e/tura e/tends 'pp+et 0
(ectang+e dreptunghi5ne- (ectang+e(20& 20&
100& D0, =++ipse2D e+ipsa5ne-
=++ipse2D.:+oat(1C0& 20& 100&D0, ;aint
te/tura,
pu.+ic void init( 0
A) @e creaQa Qona tampon pentru imagine
.img )A !uffered+mage .img5ne-
!uffered+mage(10& 10&
!uffered+mage.3G;=7IN37(6!, A) @e creaQa
conte/tu+ grafic a+ Qonei tampon .g2d
)A
6raphics2D
.g2d5.img.create6raphics(, A) @e
creaQa dreptunghiu+ suport )A
(ectang+e suport5ne- (ectang+e(0& 0&
10& 10, A) @e deseneaQX in Qona
tampon un cerc gri cu contur negru
)A
=++ipse2D cerc5ne- =++ipse2D.:+oat(1& 1& U&
U,
.g2d. setCo+or (Co+or .-hite &F
.g2d.fiii(suport, AA cu+oarea de fond a
suportu+ui
.g2d.setCo+or(Co+or.+ight6ray,
.g2d.fiii(cerc, AA ump+erea cercu+ui
.g2d.setCo+or(Co+or..+ac4,
.g2d.dra-(cerc, AA desenarea conturu+ui
cercu+ui
A) @e creaQa te/tura& proiect`nd Qona tampon
.img
pe dreptunghiu+ suport& care se va repeta
cic+ic )A te/tura5ne- 3e/ture;aint(.img&
suport,
DC
ntroducere n grafica Java
M
pu.+ic void paint(6raphics g
0 6raphics2D
g2d5(6raphics2Dg,
g2d.dra-(ect(D& D& 2D0& 110,
g2d.set;aint(te/tura,
g2d.fiii(dreptunghi,
g2d.fiii(e+ipsa,
g2d.set;aint(Co+or..+ac4,
g2d.set@tro4e(ne-
!asic@tro4e(*,
g2d.dra-(dreptunghi,
g2d.dra-(e+ipsa, M M
.:.1B. 7ransform4ri ale sistemului de %oordonate al %ontextului
grafi%
S-a artat deja c clasa Graphics2D conine metode prin care
se poate transforma sistemul local de coordonate, astfel nct
s se obin modificarea formelor care se deseneaz. Metodele
prin care se realizeaz aceste transformri sunt: translate,
rotate, scale, shear i transform. Dintre acestea, am utilizat
pn n prezent numai metoda translate. Vom exemplifica i
folosirea celorlalte metode.
8otirea sistemului de %oordonate
Metoda void rotate (double theta) rotete sistemul de
coordonate cu unghiul t'eta, exprimat n radiani. Dac metoda
se folosete repetat, rotirile se cumuleaz. n figura 2-14 este
dat un exemplu de desen construit prin rotirea unei figuri n jurul
unui punct fix. Figura este creat n metoda init. n metoda paint
se traseaz mai nti dreptunghiul-chenar, apoi se face o
translaie a originii sistemului de coordonate n centrul de
rotaie, dup care se rotesc n mod repetat axele de
coordonate, desenndu-se de fiecare dat figura primitiv
creat anterior.
.igura #16. O figur4 ob"inut4 prin
rota"ie. Programul cu care s-a realizat acest desen este
redat n continuare.
87
Ciprian-Daniel NEAGU, Severin BUMBARU
Applet #1B. 8otiri.$ava/ rotirea unei figuri Hn $urul unui
pun%t fix.
import java.app+et.) ,
import java.a-t.),
import j ava.a-t.geom.),
pu.+ic c+ass (otiri e/tends 'pp+et 0
6enera+;ath forma5ne- 6enera+;ath(,
dou.+e unghi5Math.;IA*.0,
;aint gradient5ne- 6radient;aint(0& 0&
Co+or..+ac4& 8I& 20& Co+or.-hite,
pu.+ic void init(
0 forma.move3o(0&
0,
forma.+ine3o(8 0&
0,
forma.1ine3o(8I&
2 0,
forma.+ine3o(* 0&
D,
forma.c+ose;ath(
,
M
p19#-3 v>-d p!-2'&5!p,-3. g/ E
5!p,-3.2) g2d<&5!p,-3.2)/g0
g2d.d!"&2%" R%3'!2g#%&8+ 8+ 120+ 120//0
g2d.'!2.#!'%&66+ 66/ 0
g2d..%'S'>4%&2%" B!.-3S'>4%&3//0
=>&-2' -<00 -C60 -DD/ E
g2d.>'!'%&12g,-/0
g2d..%'N!-2'&g!d-%2'/0
g2d.=-##&=>$!/0
g2d..%'N!-2'&6>#>.9#!34/0
g2d.d!"&=>$!/0
B
B
B####################################################
0%'imbarea s%4rii
Pentru schimbarea scrii desenului se folosete metoda:
void scale(dou.+e s/& dou.+e sy
Rezultatul aplicrii acestei metode este c toate dimensiunile
formelor care vor fi trasate ulterior vor se vor nmuli cu
coeficienii sx pe axa Ox i respectiv sy pe axa Oy. Dac aceti
coeficieni sunt subunitari, are loc efectiv o reducere a
dimensiunilor. Dac transformarea se repet, efectul este
cumulativ.
n figura 2-15 se demonstreaz efectul cumulat al schimbrilor
de scar i translaiilor. Dup fiecare schimbare de scar se
face o translaie, dup care se umple figura (un dreptunghi) cu
gradient de culoare i se traseaz conturul.
88
ntroducere n
grafica Java
G Q
E
.igura #19. 7ransla"ii 5i s%'imb4ri de s%ar4
Se observ c, datorit modificrilor de scar, s-au modificat
att dimensiunile figurii, ct i grosimile liniilor de contur i
distanele pe care se face deplasarea figurii la translaie.
Programul cu care s-a obinut acest desen este dat n
continuare.
Applet #11. 0%ara.$ava/ s%'imb4ri de s%ar4 5i
transla"ii
import
java.app+et.),
import j
ava.a-t.), import
java.a-t.geom.),
pu.+ic c+ass @cara e/tends 'pp+et 0
@hape forma5ne- (ectang+e2D.:+oat(D& D& 20&
1I, ;aint gradient5ne- 6radient;aint(2D&
2*& Co+or..+ac4& D& D& Co+or.-hite,
pu.+ic void paint(6raphics g 0
6raphics2D g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e(D& D&
8E0& D0, g2d.trans+ate(F20&
20, g2d.set@tro4e(ne-
!asic@tro4e(*, for(int i50,
iJ8, iKK 0
g2d.sca+e(1.I& 1.2,
g2d.trans+ate (2I& 0,
g2d.set;aint(gradient,
g2d.fiii(forma,
g2d.set;aint(Co+or..+ac4,
g2d.dra-(forma,
M <
M
M7777777777777777777777777777777777777777777
Hn%linarea axelor
Spre deosebire de rotaie, n care se rotesc cu acelai unghi
ambele axe de coordonate, n cazul nclinrii fiecare ax se
rotete separat, fr a se deplasa originea sistemului de
coordonate. n consecin, dup nclinare sistemul de
coordonate poate s nu mai fie rectangular.
89
Ciprian-Daniel NEAGU, Severin BUMBARU
'
r^*---------j+,-
y*s.'
.igura #1:. Hn%linarea axelor de %oordonate/ Hnainte
*linii sub"iri+ 5i dup4 transformare *linii
groase+.
Me$('a prin )are #e reali5ea5/ *n)linarea a2el(r *n
)(n$e2$&l Grap0i)#2D e#$eF
pu.+ic a.stract void shear(dou.+e sh/& dou.+e
shy
*n ,i+&ra 2-!P #&n$ repre5en$a$e a2ele 'e )((r'(na$e *nain$e
<i '&p/ $ran#,(r%are <i #&n$ in'i)a$e #e%ni,i)a.iile
ar+&%en$el(r s"x <i s"$ ale %e$('ei shear. Fie)are p&n)$ 2
al a2ei O2 #e 'epla#ea5/ *n =(# )& 'i#$an.a 2H shy, iar
,ie)are p&n)$ 1 al a2ei O1#e 'epla#ea5/ #pre 'reap$a )&
'i#$an.a y*shx.
*n ,i+&ra 2-!C e#$e repre5en$a$ e,e)$&l *n)lin/rii a2el(r
a#&pra &nei ,(r%e )are )(n#$/ 'in$r-&n 'rep$&n+0i" *n
in$eri(r&l )/r&ia #e +/#e#) &n p/$ra$ <i &n )er)7
.igura #1;. 3fe%tul Hn%lin4rii axelor/ forma ini"ial4
*stUnga+ 5i %ea ob"inut4 dup4
transformare *dreapta+.
Pr(+ra%&l )& )are #-a (4.in&$ a)e#$ 'e#en e#$e 'a$ *n
)(n$in&are7
Applet #1. In%linare.$ava/ efe%tul Hn%lin4rii axelor asupra
unei forme
geometri%e.
import
java.app+et.),
import java.a-t.),
import
java.a-t.geom.),
pu.+ic c+ass anc+inare e/tends
'pp+et ( 6enera+;ath forma5ne-
6enera+;ath(, @tro4e
sti+%inie5ne- !asic@tro4e(2,
pu.+ic void init( 0
forma.append(ne- (ectang+e2D.:+oat(20& 20&
D0& C0&
fa+se, forma.appendLne-
(ectang+e2D.:+oat(*0& *0& 20& 20&
fa+se, forma.append(ne-
=++ipse2D.:+oat(CI& I0& 20& 20&
%%
ntroducere n grafica Java
=!#.%/0
:
pu.+ic void paint(6raphics g 0
6raphics2D g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e(D& D& *00& 100,
g2d.set@tro4e(sti+%inie,
g2d.dra-(forma,
g2d.trans+ate(100& 0,
g2d.shear(0.8& 0.1,
g2d.dra-(forma
, M M
7ransform4ri afine
Transformarea afin combin toate cele patru transformri ale
sistemului de coordonate discutate anterior: translaia, rotaia,
schimbarea scrii i nclinarea axelor (vezi capitolul 4).
Trecerea de la coordonatele (x,y) la noile coordonate (x',y') este
dat prin relaia matriceal:
( AR* ( $OO $O# $02 * ( A * ( $00PAD$01PyD$02 *
( yR* < ( $#O $## $#2 * ( y * < ( $#0PAD$##PyD$#2
*
(1* ( 0 0 1 * ( 1 * ( 1 *
n contextul Graphics2D transformarea afin se realizeaz prin
metodele:
pu.+ic a.stract void
transform('ffine3ransform 3/, pu.+ic
a.stract void setTransform(ffine3ransform
3/,
Deosebirea dintre cele dou metode este c la prima dintre ele
efectul noii transformri afine se cumuleaz cu transformarea
curent, n timp ce a doua metod seteaz o nou
transformare, fr cumularea efectului.
Ambele metode primesc ca argument o instan a clasei
=ava7aE$7+e(%7A,,ineTran#,(r%7 Principalii constructori ai
acestei clase sunt:
pu.+ic 'ffineTransform(dou!le m99& dou.+e m+9&
dou.+e
m9+& dou.+e m++& dou.+e m02&
dou.+e m+2 pu.+ic
ffineTransform(dou.+e12 f+atmatri/
Ambii constructori primesc ca argumente elementele din
primele dou linii ale matricei de transformare. Primul primete
aceste elemente ca argumente distincte. Al doilea constructor le
primete sub forma unui tablou cu 6 sau 4 elemente, sub forma
{mOO m10 m01 m11 [m02 m12]}. Dac ultimele dou elemente
lipsesc, se consider c nu are loc translaie.
Clasa A,,ineTran#,(r% are i numeroase metode (peste 40)
prin care se pot face operaii asupra transformrilor afine.
Printre acestea exist metode care permit s se extrag sau s
se seteze numai anumite componente ale transformrii
(translaie, rotaie, scalare, nclinare), s se concateneze dou
transformri, s se obin transformarea invers etc. O metod
important este i setToidentity (), care o transform ntr-o
transformare-identitate (deci elimin orice transformare
anterioar).
G
1
Ciprian-Daniel NEAGU, Severin BUMBARU
666666666666666666666666666666666666666666666666666
.:.11. !e%uparea unei )one a desenului
Contextele Graphics i Graphics2D conin metoda
pu.+ic a.stract void setClip(@hape c+ip
Efectul invocrii acestei metode este c desenul va fi vizibil
numai n interiorul conturului formei primit ca argument. Dac
se dorete restrngerea acestei zone, n contextul Graphics2D
se poate folosi, de asemenea, metoda
pu.+ic a.stract void clip(@hape s
care reduce zona de decupare la intersecia dintre cea curent
i forma primit ca argument.
.:.1. 7ransformarea textului Hn form4
Uneori este util s transformm un text ntr-o form *0'ape+.
Aceasta permite s se traseze conturul caracterelor tipografice
cu stilul de linie dorit i s se umple corpul caracterelor cu
culoarea sau textura dorit. Se pot, deasemenea aplica asupra
unui astfel de text toate transformrile permise asupra formelor.
Pentru a transforma un text ntr-o form se procedeaz astfel:
- se creaz o instan a clasei =ava7aE$7,(n$7Te2$La1(&$T
- se convertete aceast instan n form, invocnd metoda
getOutline din clasa TextLayout.
Pentru a crea o instan a clasei TextLayout se folosete unul
din constructorii acestei clase. Cel mai comod este s se
invoce constructorul
pu.+ic Te"t#a$out(@tring string& :ont font&
:ont(enderConte/t frc
unde:
string # textul care trebuie convertit;
font # fontul cu care se scrie acest text;
fr% - o instan a clasei =ava7aE$7,(n$7F(n$Ren'erC(n$e2$"
care poate fi furnizat, n cacest caz, sub forma
ne- :ont(enderConte/t(nu+i& true& true.
n consecin, urmtoarea secven de instruciuni permite s
se transforme irul de caractere "Proba text" ntr-o form:
3e/t%ayout +ayout 5 ne- 3e/t%ayout(<;ro.a
te/t<&
ne- :ont(<@ans@erif<& :ont.!9%D& 20&
ne- :ont(enderConte/t(nu+i& true& true,
'ffine3ransform at5ne- 'ffine3ransform9 ,
at.trans+ate(0&
(f+oat+ayout.get!ounds(.getReight( ,
@hape te/tf 5 +ayout.get9ut+ine(at,
Transformarea afin at a fost necesar, deoarece este cerut
ca parametru de metoda getOutline (). Translaia introdus n
transformarea afin at din exemplul de mai sus a fost necesar
pentru a muta originea sistemului de coordonate n colul din
stnga-sus al dreptunghiului n care se ncadreaz forma
obinut prin transformarea textului (n cazul textelor, originea
sistemului
GU
ntroducere n grafica Java
de coordonate este situat pe linia de baz, astfel c a trebuit
deplasat n sus cu o distan egal cu nlimea textului).
Forma astfel obinut poate fi manipulat ca orice alt obiect cu
interfaa Shape: poate fi supus unor transformri, poate fi
desenat sau umplut etc. Se obine astfel un rezultat de genul
celui din figura 2-18.
P.Wlbm ftXPY
.igura #1>. Un exemplu de text transformat Hntr#o
form4.
Programul prin care s-a obinut acest desen este reprodus n
continuare.
Applet #1&. 7ext.orma.$ava/ transformarea unui 5ir de
%ara%tere Hntr#o
form4.
import j ava.
app+et. ) &Fimport
j ava.a-t.), import
java.a-t.geom.),
import j
ava.a-t.font.),
pu.+ic c+ass 3e/t:orma e/tends
'pp+et 0 3e/t%ayout +ayout,
@hape te/t,
pu.+ic void init( 0 :ont font5ne-
:ont(<@ans@erif<& :ont.!9%D& 20,
:ont(enderConte/t frc5ne-
:ont(enderConte/t(nu+i& true& true ,
+ayout5ne- 3e/t%ayout(<;ro.a te/t<& font&
frc, 'ffine3ransform at 5 ne-
'ffine3ransform(, at.trans+ate(0&
(f+oat+ayout.get!ounds(.getReight0 ,
te/t5+ayout.get9ut+ine(at , M
pu.+ic void paint(6raphics g
0 6raphics2D g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e(D& D& **0&
D0, g2d.trans+ate(2I& 20,
g2d.shear(F0 .2& 0 &Fg2d.sca+e
(2.C& 2.C,
g2d.set;aint(Co+or.+ight6ray,
g2d.fi++(te/t,
g2d.set;aint(Co+or..+ac4 ,
g2d.dra-(te/t, M M
U*
Ciprian-Daniel NEAGU, Severin BUMBARU
.:.1&. Crearea 5i %ompunerea ariilor
n Java2D exist posibilitatea s se construiasc forme mai
complicate din forme mai simple, aplicnd tehnicile geometriei
constructive a ariilor *Constru%tive Area Geometry+. n
conformitate cu principiile acestei geometrii, aria este mulimea
punctelor din interiorul unei forme, inclusiv cele de pe conturul
acesteia. n consecin, se pot obine arii noi (i deci forme noi)
prin operaii pe mulimi asupra unor arii existente.
Pentru a realiza astfel de arii compuse este folosit clasa
=ava7aE$7+e(%7Area7 nstanele acestei clase sunt arii, iar
metodele realizeaz operaii asupra ariilor.
Constructorii clasei Area sunt
public Area () - creaz o arie vid;
public Area(Shape s) - creaz o arie cu forma s.
Principalele metode ale clasei Area sunt urmtoarele:
public void add(Area rhs) - realizeaz reuniunea ariei existente
cu aria r's,
public void #&4$ra)$ (Area rhs) - extrage (scade) aria r's din
aria existent;
public void in$er#e)$ (Area rhs) - intersecteaz aria existent
cu aria r's,
public void e2)l&#iveOr (Area rhs) - realizeaz operaia Zsau
ex%lusivZ intre aria existent i rhs;
public void resetO - elimin ntreg coninutul acestei arii (o
transform n arie vid);
public object clone () - creaz o copie a acestei arii;
public void $ran#,(r%(AffineTransform t) - apli)/ a#&pra
a)e#$ei arii transformarea afin t;
public Area )rea$eTran#,(r%e'Area(AffineTransform t) - las
aceast arie nemodificat, dar ntoarce o nou arie obinut din
aceasta prin aplicarea transformrii afine t;
public Pathlterator +e$Pa$0l$era$(r(AffineTransform at)
-ntoarce un iterator (Pathlterator) al conturului acestei arii.
Opional se poate da ca argument i transformarea afin care i
se aplic.
n figura 2-19 sunt reprezentate patru figuri compuse, obinute
din aplicarea operaiilor de compunere asupra a dou cercuri.
Ariile rezultate sunt colorate n gri, iar cercurile componente
sunt trasate cu negru.
ntroducere n grafica Java
d)O)5)6S
a b c d
.igura #1@. Compunerea ariilor/ a # reuniune
*add+, b # diferen"4 *subtra%t+, % #interse%"ie
*interse%t+, d # sau ex%lusiv *ex%lusiveOr+.
Programul prin care s-a realizat acest desen este dat n
continuare.
Appiet #16. AriiCompuse.$ava/ opera"ii de %ompunere a
dou4 %er%uri.
import
java.appiet.),
import java.a-t.),
import
java.a-t.geom.),
pu.+ic c+ass 'riiCompuse e/tends 'ppiet 0
@hape cerc+5ne- =++ipse2D.:+oat(20& 20&
C0& C0& cerc25ne- =++ipse2D.:+oat(I0&
20& C0& C0, 'rea arie+5ne- 'rea(cerc+&
arie25ne- 'rea(cerc2&
figComp125ne- 'rea182,
@tring s125 0<a<& <.<&
<c<& <d<M
,
pu.+ic void init( 0
for(int i50, iJ8, iKK
figComp1i25('reaariei.c+one(,
figComp102.add(arie2,
figComp112.su.tract(arie2 ,
figComp122.intersect(arie2,
figComp1*2
.e/c+usive9r(arie2 , M
pu.+ic void paint(6raphics g
0 6raphics2D g2d5(6raphics2Dg,
g2d.dra-(ne- (ectang+e(D& D&
820& 100, forLint i50, iJ8, iK
K 0
g2d.set!ac4ground(Co+or.-hite ,
g2d.setCo+or(Co+or.+ight6ray,
g2d.fiii(figComp1i2 ,
g2d.setCo+or(Co+or..+ac4 ,
g2d.dra-(cerci,
g2d.dra-(cerc2,
g2d.dra-@tring(s1i2 & C0& UI,
g2d.trans+ate(100&
0, M M M
Ciprian-Daniel NEAGU, Severin BUMBARU
2.7. Programarea orientat pe evenimente
Principalul rol al interfeei grafice utilizator este asigurarea
comunicaiei Hn ambele sensuri ntre om i calculator (mai exact,
ntre operatorul uman i aplicaia care ruleaz pe calculator). n
acest scop, utilizatorul (operatorul uman) trebuie s dispun de
modaliti de a transmite aplicaiei comenzi i date. Comenzile
sunt introduse de utilizator prin intermediul anumitor dispozitive
periferice (tastatur, mouse). Aplicaia sau appletul trebuie s
aib posibilitatea s sesizeze faptul c s-a transmis o comand
i s reacioneze n mod corespunztor. Aceasta se realizeaz
prin mecanismul generrii i captrii de evenimente.
Se numete eveniment orice modificare care are loc fie n
starea dispozitivelor de intrare, fie in cea a obiectelor grafice de
pe ecran: apsarea sau eliberarea unei taste, deplasarea
mouse-ului, apsarea sau eliberarea unui buton al mouse-ului,
deschiderea sau nchiderea unei ferestre, efectuarea unui click
de mouse pe un obiect de control (buton, caset de validare,
bara de defilare etc), intrarea cursorului de mouse n cmpul
activ al unui obiect grafic sau prsirea acestuia etc. Pot exista,
desigur, i alte tipuri de evenimente, dar aici ne intereseaz
numai cele legate de interfaa grafic a aplicaiei. Acest mod de
lucru impune o nou concepie n proiectarea programelor,
numit prograarea orie%tat& pe eve%ie%te *3vent#
Oriented Programming+, cunoscut i sub numele de
prograare g"i!at& !e eve%ie%te *3vent !'ven
programming+.
ntruct limbajul Java este orientat pe obiecte, n acest limbaj
evenimentul este un obie%t, adic o structur de date care
conine informaie privind sursa, tipul i atributele evenimentului
respectiv. Ca orice obiect, fiecare eveniment este instan a
unei clase. n Java, clasele de evenimente formeaz o ierarhie,
a crei rdcin este clasa =ava7&$il7Even$O4=e)$7 O subclas a
acesteia este clasa =ava7aE$7ANTEven$" care este rdcina
ierarhiei tuturor claselor de evenimente generate de interfaa
utilizator grafic. Clasele de evenimente ale interfeei grafice, cu
excepia clasei AWTEvent, se gsesc n pachetele
java.awt.event i =ava27#Ein+7even$7
Evenimentele sunt generate de %omponentele interfe"ei grafi%e,
n urmtoarele situaii:
- cnd are loc o modificare a strii componentei respective
(de exemplu se deschide sau se nchide o fereastr, se
modific poziia sau dimensiunile componentei);
- cnd componenta interacioneaz cu mouse-ul (cursorul de
mouse intr n sau iese din suprafaa componentei, se
apas sau se elibereaz butonul de mouse sau se face click
de mouse cnd cursorul acestuia se afl pe suprafaa
componentei;
- se apas sau se elibereaz o tast, atunci cnd
componenta respectiv este activ.
nsistm asupra faptului c evenimentele nu sunt generate
direct de ctre mouse sau tastatur, ci de ctre componentele
interfeei grafice. n funcie de clasa de componente creia i
aparine, fiecrei componente a interfeei i se asociaz anumite
clase de evenimente pe care le genereaz.
86
ntroducere n grafica Java
ncepnd de la JDK1.1, evenimentele sunt tratate respectnd
"modelul delegrii" *!elegation 3vent 2odel+. Conform acestui
model, fiecare eveniment este generat de un obiect numit surs4
i este captat de un obiect numit as%ult4tor, care dispune de
metode prin care se execut anumite aciuni ca rspuns la
apariia evenimentului respectiv. Fiecare surs poate genera
evenimente din mai multe clase, iar fiecare eveniment poate fi
recepionat de mai muli asculttori. Tot o dat, fiecare
asculttor poate recepiona mai multe tipuri de evenimente, de
la una sau mai multe surse. ntre surse i asculttori se
stabilesc deci relaii de genul celor din figura 2-20, n care S1,
S2, S3 sunt surse, iar A1, A2 sunt asculttori de evenimente.
S!
A!
66--H
S2 77
66666
A2
.igura #B. 7ransmiterea evenimentelor de la surse la
as%ult4tori.
n cazul interfeei grafice utilizator, sursele de evenimente sunt
componentele interfeei. Aceste componente aparin unor clase
"prefabricate", existente n pachetele java.awt sau javax.swing,
sau unor clase create de programatorul de aplicaie, care le
extind pe acestea. Evenimentele fac parte, de asemenea din
clase de evenimente "prefabricate", existente n pachetele
java.awt.event sau javax.swing.event. n consecin,
programatorul de aplicaie nu trebuie s se preocupe de modul
n care sunt generate evenimentele, ci doar s le utilizeze. n
schimb, asculttorii de evenimente trebuie creai de
programatorul de aplicaie.
Modul n care aplicaia (appletul) rspunde la diferite
evenimente este programat n metodele asculttorilor de
evenimente. n pachetele java.awt.event i javax.swing.event
se gsesc numai interfe"ele pe care trebuie s le implementeze
clasele de asculttori de evenimente.
Pentru acele interfee de asculttori de evenimente care conin
mai multe metode, se ofer i clase de adaptori pentru
evenimente. Adaptorul este o clas care implementeaz toate
metodele interfeei, numai c aceste metode au corpul vid, deci
nu fac nimic. Programatorul care dorete s creeze o clas
pentru ascultarea evenimentelor respective poate s extind
adaptorul corespunztor, redefinind numai acele metode care l
intereseaz.
Pentru a trata evenimentele dintr-o clasa A/u/neEvent generate
de o surs s, unde <ume este numele unui tip de eveniment,
programatorul de aplicaie procedeaz astfel:
- definete o clas care implementeaz interfaa
NumeListener sau extinde clasa Wu/neAdapter;
- creaz o instan ia a clasei de asculttor definit anterior;
- adaug asculttorul ia la sursa s prin
instruciunea
..!ddN1$%H-.'%2%&ia) -
De exemplu:
97
Ciprian-Daniel NEAGU, Severin BUMBARU
- orice component genereaz evenimente din clasa
MouseEvent, atunci cnd asupra ei se acioneaz cu
mouse-ul. Aceste evenimente sunt ascultate de instane ale
unor clase care implementeaz interfaa MouseListener sau
extind interfaa MouseAdapter i se adaug la sursa folosind
metoda addMouseListener;
- orice component genereaz, cnd este activ i se apas
o tast, evenimente din clasa KeyEvent. Aceste evenimente
sunt ascultate de instane ale unor clase care
implementeaz interfaa KeyListener sau extind clasa
KeyAdapter i se adaug la surs folosint metoda
add#ey%istener.
Cel mai sigur mod de a afla care sunt evenimentele generate de
o anumit clas de componente ale interfeei grafice este
urmtorul: consultm descrierea clasei respective de
componente n documentaia Java AP i cutm ce metode de
adugare a asculttorilor de evenimemte conine; dac clasa
componentei conine metoda addNumeListener, nseamn c
genereaz evenimente din clasa WumeEvent. Trebuie avut n
vedere de asemenea c, n conformitate cu principiul motenirii,
vor fi generate i toate tipurile de evenimente ale superclaselor
componentei respective.
2.8. Proiectarea unei aplicaii cu interfa utilizator grafic
nterfaa grafic a unei aplicaii Java trebuie s conin
obligatoriu, ca fereastr principal, o instan a clasei
=ava7aE$7Fra%e sau a clasei =ava27#Ein+7-Fra%e7 Proiectarea
unei astfel de aplicaii decurge n modul urmtor:
- se determin la ce comenzi date de utilizator trebuie s
rspund aplicaia i cum trebuie ea s rspund la fiecare
din aceste comenzi;
- se stabilete ce fel de informaii trebuie s se transmit
utilizatorului prin interfaa grafic n timpul executrii
aplicaiei;
- se stabilete prin ce componente ale interfeei grafice se
transmit comenzile respective i prin ce componente se
transmit utilizatorului informaiile necesare; cu aceast
ocazie, se stabilesc i evenimentele generate de aceste
componente, care trebuie captate i prelucrate;
- se proiecteaz clasele de asculttori de evenimente.
Metodele acestor asculttori sunt, de fapt, subprogramele
prin care se descrie modul n care rspunde aplicaia la
evenimentele respective, n conformitate cu obiectivele
aplicaiei;
- se proiecteaz interfaa grafic, stabilind poziia i
dimensiunile fiecrei componente i se adaug la fiecare
cte o instan de asculttor pentru fiecare din evenimentele
pe care aceast component le genereaz i care prezint
interes pentru aplicaia respectiv;
- se creaz clasa aplicaiei propriu-zise, care conine att
interfaa grafic, ct i asculttorii de evenimente i,
eventual, alte obiecte necesare pentru realizarea
obiectivelor aplicaiei.
98
ntroducere n grafica Java
.>.1. Clasele .rame 5i D.rame
nstanele acestor clase sunt folosite pentru realizarea
ferestrelor principale ale aplicaiilor. Aspectul unei astfel de
ferestre este dat n figura 2-21.
.igura #1. .ereastra prin%ipal4 a unei apli%a"ii, reali)at4 prin
extinderea
%lasei .rame. 1 # pi%tograma, # bara de titlu, & # buton de
minimi)are, 6 #
buton de maximi)areArestaurare, 9 # buton de Hn%'idere, : #
bordura, ; #
%Umpul ferestrei.
Fereastra are bordur, iar la partea superioar conine o bar cu
urmtoarele componente (de la stnga la dreapta):
- o pictograma (ceaca de cafea Java), care poate fi acionat
cu mouse-ul pentru a obine un meniu;
- o zon care conine titlul ferestrei dat de programator (de
exemplu, numele aplicaiei);
- trei butoane pentru minimizare, maximizare/revenire i
nchidere;
- cmpul ferestrei, n care se pot plasa componentele
interfeei grafice.
Fereastra poate fi deplasat trgnd cu cursorul de mouse de
bara de titlu, iar dimensiunile ferestrei pot fi modificate trgnd
de bordur sau de coluri. Dac se pune cursorul pe butonul de
minimizare & i se apas butonul stng al mouse-ului, fereastra
dispare de pe ecran, dar iconograma aplicaiei rmne n bara
de taskuri. Apsnd pe aceast iconograma, fereastra se
restaureaz. Dac se apas pe butonul 6, fereastra se
maximizeaz, ocupnd tot ecranul. Dac se apas iari pe
acelai buton, fereastra se restaureaz. n fine, dac se apas
pe butonul 5, fereastra dispare de pe ecran i genereaz un
eveniment de fereastr4 (din clasa WindowEvent) cu numele
WNDOW_CLOSNG ("fereastra se nchide").
Totui, nchiderea ferestrei principale nu are ca efect ncheierea
automat a executrii aplicaiei. Pentru a obine acest efect,
este necesar s se creeze o clas de asculttori de fereastr
care extinde clasa WindowAdapter i n care oprete
executarea aplicaiei prin instruciunea System, exit (0).
Dei aceast aplicaie nu face practic nimic altceva, programul
ei prezint interes, deoarece constituie un cadru pentru
realizarea oricrei alte aplicaii.
Applet #19. OApli%atie.$ava/ fereastra prin%ipal4 a unei
apli%a"ii.
/* Cea mai simp+a ap+icaLie cu interfaLa
uti+iQator grafica)A
UU
Ciprian-Daniel NEAGU, Severin BUMBARU
import j ava.a-t.),
import j
ava.a-t.event.),
c+ass 9'p+icatie 0 AA C+asa
ap+icaLiei I$6 iug5ne- I$6(,
A) C+asa interioara pentru interfaLa
uti+iQator grafica
)A
c+ass I$6 e/tends :rame 0
I$6( 0 AA Constructoru+ interfeLei
grafice super(<0 ap+icaLie<,
set%ocation(80& *0, set@iQe(*00&
100, set!ac4ground(Co+or.-hite,
add_indo-%istener (ne- @top9,
setvisi.+e(true,
M M AA starsitu+
c+asei I$6
A) C+asa ascu+tXtoru+ui de fereastra
)A
c+ass @top e/tends _indo-'dapter 0 AA
'scu+tXtor pu.+ic void
-indo-C+osing(_indo-=vent e 0
@ystem.e/it(0,
M M AA @f`rVitu+ ascu+tXtoru+ui de
fereastra
A) Metoda principa+a a ap+icaLiei
)A
pu.+ic static void main(@tring
args12 0 9'p+icatie ap+icatie5ne-
9'p+icatie(, M M
n constructorul interfeei utilizator grafice (numit aici UG) sunt
prezente instruciuni pentru: apelarea constructorului
superclasei pentru a-i transmite numele aplicaiei; stabilirea
poziiei i dimensiunilor ferestrei; stabilirea culorii de fond a
ferestrei; adugarea unei instane a asculttorului de fereastr
din clasa Stop; setarea atributului de vizibilitate a ferestrei. n
afar de aceste instruciuni, necesare la realizarea oricrei
interfee grafice, n acest constructor trebuie s apar i
instruciuni de adugare a componentelor ferestrei i a
asculttorilor evenimentelor generate de aceste componente.
Clasa interioar Stop extinde clasa WindowAdapter i a fost
necesar pentru ascultarea evenimentelor de fereastr. n
aceast clas a fost redefinit numai metoda windowClosing,
care reacioneaz la apariia evenimentului cu acelai nume. n
corpul acestei metode a fost pus o singur instruciune, care
produce ncheierea executrii aplicaiei. n general, n aceast
metod pot fi
100
ntroducere n grafica Java
puse i alte instruciuni necesare nainte de oprirea lucrrii,, de
exemplu nchiderea fiierelor care au fost deschise.
Metoda main conine aici o singur instruciune, prin care se
creaz o instan a clasei aplicaiei. Aceast situaie se
ntlnete, n general, n majoritatea metodelor main ale
aplicaiilor cu interfa grafic, deoarece toate celelalte aciuni,
necesare pentru realizarea obiectivelor aplicaiei, se execut de
ctre asculttorii de evenimente, ca rspuns la comenzile date
de utilizator prin componentele interfeei grafice.
Dac, n loc s extind clasa Frame, clasa UG ar fi extins clasa
JFrame, erau necesare urmtoarele modificri: se aduga la
nceputul programului instruciunea import javax.swing.*; se
nlocuia n titlul clasei UG cuvntul Frame prin JFrame.
.>.. Alegerea %omponentelor atomi%e
Componentele atomice sunt, n principiu, componentele care se
folosesc ca atare, fr a mai ngloba alte componente. n cazul
componentelor atomice AWT, aceast afirmaie este complet
valabil: toate sunt subclase ale clasei Component. n Swing
ns, toate componentele atomice sunt subclase ale clasei
javax.swing.JComponent, care este subclas a
java.awt.Container. Aa dar, componentele atomice Swing au
proprieti de container. Aceasta permite ca o component
atomic, de exemplu un buton, s conin att text, ct i
imagine. Vom trece n revist componentele Swing, indicnd,
unde este cazul, i corespondentele lor din AWT. Pentru
cunoaterea mai detaliat a acestor componente recomandm
consultarea documentaiei originale Java AP.
Coomponentele atomice pot fi mprite n dou categorii: de
control (comand) i de afiare.
A. Componente de %ontrol
Componentele de control au rolul de a permite utilizatorului s
introduc anumite comenzi folosind dispozitive de intrare
specializate, cum sunt mouse-ul i tastatura. Elementele de
comand pot fi: butoane, liste, liste ascunse, cmpuri de text,
meniuri, rigle ajustabile.
n Swing, clasele de butoane formeaz o ierarhie, care are ca
rdcin clasa java.swing.AbstractButton (figura 2-22), care
extinde clasa JComponent. Din punct de vedere funcional,
butonul este un dispozitiv de comand cu una sau dou stri
stabile, care trece dintr-o stare n alta atunci cnd asupra lui se
acioneaz cu mouse-ul.
Fiecrui buton i se poate ataa o mnemoni%4, adic o tast a
crei apsare, mpreun cu a tastei Alt, are efect ca cel al
acionrii cu mouse-ul asupra butonului respectiv. Ataarea
mnemonicii se face prin metoda clasei AbstractButton:
pu.+ic void set%nemonic(char mnemonic
unde mnemonic este o constant (cmp static final) din clasa
KeyEvent, de exemplu KeyEvent. VK_A pentru tasta A. n acest
exemplu, efectul mnemonicii se produce la apsarea
combinaiei de taste Alt-A.
101
Ciprian-Daniel NEAGU, Severin BUMBARU
Clasa A4#$ra)$B&$$(n conine numeroase metode aplicabile
tuturor butoanelor. Astfel, n buton se poate pune un text i/sau
o imagine, butonului i se poate pune o bordur (oferindu-se
diferite modele de borduri) etc.
AbstractButton
JButton JToggleButton JMenultem
X
o
!
o
-C
O
) (
CD O
05 )-
V )
E
/0
c
;D X
o
H
"!
7) O
E 1
WX )
'@ ^
c o
g o:
.igura #. Ierar'ia %laselor de butoane.
B&$(n&l #i%pl& (JButton n Swing i Button n AWT) este un
element de comand cu o singur stare stabil, cum ar fi, de
exemplu, butonul de sonerie. El se afund numai ct timp este
apsat, ridicndu-se imediat ce este eliberat. Cnd este apsat,
un astfel de buton genereaz un eveniment din clasa
A)$i(nEven$7
B&$(n&l )& '(&/ #$/ri #$a4ile (JToggleButton) este un buton
care poate s se menin timp ndelungat fie n starea "apsat",
fie n starea "eliberat". Trecerea dintr-o stare n alta se face
atunci cnd este acionat cu butonul de mouse sau prin
apsarea tastei mnemonice. n Swing exist dou subclase
pentru JToggleButton:
JCheckBox - este o "caset de validare", care are pe ecran
aspectul unui ptrat, care poate fi validat (bifat) sau
devalidat la fiecare apsare de mouse. La schimbarea
strii, genereaz un I$e%Even$7 n AWT exist clasa
similar Checkbox.
jRadioButton este tot un buton cu dou stri stabile, dar
care poate fi pus ntr-un grup de astfel de butoane
(javax.swing.ButtonGroup). Numai un singur buton dintr-un
grup se poate afla, la un moment dat, n starea "apsat",
celelalte fiind eliberate. Cnd este apsat, butonul radio
genereaz un A)$i(nEven$7
Ar$i)(l&l 'e %eni& (JMenultem) este considerat tot un buton,
putnd avea, dup caz, una sau dou stri stabile, astfel c are
ca subclase JCheckBoxMenultem i JRadioButtonMenultem.
Deosebirea fa de clasele discutate anterior este c acestea
nu sunt independente, ci apar ca articole ale unui meniu
(JMenu). Remarcm ns c i clasa JMenu este o subclas a
lui
102
ntroducere n grafica Java
JMenultem. Aceast recursivitate permite ca un articol de meniu
s fie el nsui un meniu.
Li#$ele (JList n Swing i List n AWT) sunt componente de
comand care conin fiecare un tablou de obiecte (n AWT -
numai obiecte din clasa String). Lista apare pe ecran ca un
dreptunghi, n care obiectele coninute sunt situate unul sub
altul. Cu mouse-ul pot fi selectate sau deselectate unul sau mai
multe articole din list, ceeace produce generarea unui
Li#$Sele)$i(nEven$7
Li#$ele a#)&n#e (JComboBox) sunt liste din care este vizibil un
singur articol, cel selectat. Cnd se acioneaz cu mouse-ul
asupra listei, aceasta se desfoar n ntregime, permind
selectarea altui articol. Fiecare articol din lista ascuns se
comport ca un buton.
CY%p&rile 'e $e2$ (JTextField i JPasswordField n Swing i
TextField n AWT) sunt zone dreptunghiulare, n care se poate
introduce de la tastatur o singur linie de text. Acest text este
editabil. Dac cursorul de text se gsete n acest cmp i se
apas tasta Enter, cmpul de text genereaz un A)$i(nEven$7
JPasswordField este o subclas a lui JTextField, care servete
la introducerea parolei.
Meni&rile sunt de dou categorii:
- -Men& sunt meniuri care se plaseaz ntr-o bar de meniu
?-Men&Bar@T astfel de bare se pot plasa ntr-un JFrame sau
un JAppet invocnd metoda setMenuBar; n AWT exist de
asemenea bare de menu (MenuBar), care se pot pune ntr-
un Frame;
- -P(p&pMen& sunt meniuri care se deruleaz ntr-un punct
oarecare al ecranului, atunci cnd utilizatorul le solicit (de
exemplu, apsnd butonul drept al mouse-ului); exist i n
AWT clasa similar PopupMenu.
Ri+lele a=&#$a4ile ?-Sli'er@ sunt dispozitive de comand care
permit o ajustare continu a valorii ntr-un interval dat, cum sunt
poteniometrele de la aparatura electronic. Pe ecran apare o
rigl cu cursor, care poate fi i gradat. Cursorul riglei poate fi
deplasat cu mouse-ul, ceeace genereaz un C0an+eEven$ La
crearea riglei se indic valoarea minim i cea maxim (de la
capetele acesteia) i - eventual - valoarea diviziunii. Valoarea
indicat de cursor poate fi preluat prin program.
1. Componente de afi5are
Componentele de afiare nu emit comenzi, ci servesc numai
pentru afiarea unor informaii (texte sau imagini) pentru
utilizator i pot fi editabile sau needitabile.
Componente de afi5are needitabile sunt etichetele, etichetele
volante i barele de progres. Tot aici poate fi ncadrat i clasa
Canvas din AWT.
E$i)0e$a (JLabel n Swing i Labei n AWT) este o component
n care se afieaz un text i-sau o imagine (n AWT numai un
text).
E$i)0e$a v(lan$/ (JToolTip) este o inscripie care apare
temporar pe ecran atunci cnd se plaseaz cursorul de mouse
deasupra unei componente, creia i-a fost ataat.
Bara 'e pr(+re# (JProgressBar) este o bar al crei cursor se
deplaseaz prin program, pentru a indica procentajul de
avansare a unei anumite aciuni.
103
Ciprian-Daniel NEAGU, Severin BUMBARL)
Foaia de 'e#en (Canvas) este o component AWT destinat
exclusiv desenrii.
Componentele de afi5are editabile permit s se modifice
coninutul lor de la tastatur sau cu mouse-ul, dar nu servesc
pentru a introduce comenzi. Acestea sunt: arii sau panouri de
editare a textului, tabele, arbori, selectoare de fiiere i
selectoare de culori.
Aria 'e $e2$ (JTextArea n Swing i TextArea n AWT) este o
arie dreptunghiular, care permite introducerea de la tastatur a
unui text neformatat i editarea acestuia. Textul poate conine
mai multe linii, iar editarea se face la fel ca ntr-un editor de text
simplu. Exist metode prin care se poate aduga text prin
program, sau se poate citi textul coninut.
Pan(&l 'e e'i$are (JEditorPane) i pan(&l 'e $e2$
(JTextPane) permit editarea informaiei formatate (text formatat
i imagini).
Ta4el&l (JTable) apare pe ecran ca un tablou, ale crui celule
sunt editabile.
Ar4(rele (JTree) servete pentru afiarea datelor ierarhizate.
nstanele acestei clase nu conin efectiv datele, ci ofer doar o
vedere a datelor structurat sub form de arbore. Arborele are
un nod r4d4%in4, din care pornesc linii spre nodurile cop/7.
Fiecare copil poate fi o frun)4 (un nod treminal) sau poate fi
rdcina unui subarbore.
Sele)$(r&l 'e ,i<iere (JFileChooser) permite navigarea pe
arborele director al sistemului de fiiere, permind selectarea
fiierelor.
Sele)$(r&l 'e )&l(ri (JColorChooser) permite selectarea unei
culori n sistemul RGB (Red Green 1lue, rou-verde-albastru)
sau HSB *Oue 0aturation 1rig'tness, nuan-saturaie-
strlucire).
.>.&. .olosirea %ontainerelor auxiliare
Clase de %ontainere auxiliare
De regul, componentele atomice nu se plaseaz direct ntr-o
instan a unei clase de cel mai nalt nivel (JFrame, Frame,
JAppet sau Applet) ci se grupeaz n containere auxiliare, care
se pun apoi direct n fereastra aplicaiei sau n alte containere
auxiliare (intermediare). Vom trece aici n revist principalele
clase de containere auxiliare.
-Panel (respectiv Panel n AWT) este un panou fr bordur,
pe care pot fi plasate diferite componente atomice sau alte
containere.
-S)r(llPane este un panou cu bare de defilare. Pe ecran
apare numai o parte din suprafaa panoului, mrginit de una
sau dou bare de defilare, care permit deplasarea zonei vizibile
pe direcie vertical i-sau orizontal.
-Spli$Pane este un panou mprit n dou subpanouri situate
unul lng altul sau unul sub altul. De regul, componentele nu
se adaug direct n aceste subpanouri, ci n fiecare din ele este
plasat un JScrollPane.
JTabbedPane conine mai multe panouri situate unul peste
altul. La partea superioar, fiecare panou conine o mic
etichet *tab # "agtoare"), a crei selectare cu mouse-ul face
vizibil panoul respectiv.
104
ntroducere n grafica Java
-T((lBar (bar de scule) este o bar care grupeaz mai multe
componente, de regul butoane cu pictograme, care permit
selectarea unor faciliti oferite de aplicaie.
nstanele claselor JFrame i JAppet conin n mod intrinsec
cte un panou, numit C(n$en$Pane7
Ad4ugarea %omponentelor la %ontainere
Adugarea de componente la containere se face prin una din
urmtoarele metode din clasa C(n$ainerF
p19#-3 6>$p>2%2' !dd&6>$p>2%2' 3>$p/ - !d!1gM #! 3>2'!-2%
3>$p>2%2'! com1 ?- O2'>!3% > %=%-2JM 3M'% !3%!.'!0
p19#-3 6>$p>2%2' a77&6>$p>2%2' 3>$p+ -2' -2d%A/ - a7a'A6
3>$p>2%2'! com1 p% p>L-J-! -2d-3!'M d% -2d-3%#% in2e')
p19#-3 v>-d !dd&6>$p>2%2' 3>$p+ O9K%3' 3>2.'!-2'./-a7a'A6
3>$p>2%2'! com1 %.p%3'T2d %.'-3J--#% constraints-
n toate cazurile, componenta adugat poate fi atomic sau
container.
Po)i"ionarea %omponentelor Hn %ontainere
Pentru configurarea interfeei grafice, prezint importan
deosebit stabilirea poziiei i dimensiunii fiecrei componente.
Aceasta se poate realiza n dou moduri: poziionare absolut
i folosind gestionari de poziionare.
Pozi ionarea absolut a componentelor
Pentru a indica faptul c poziia componentelor pe suprafaa
containerului i dimensiunile acestora sunt cele specificate
direct de programator, pentru containerul respectiv se invoc
metoda setLayout(nuli) n care argumentul nuli indic faptul c
nu se folosete un gestionar de poziionare. n acest caz,
pentru fiecare component adugat la container i pentu
containerul nsui se invoc metodele
pu.+ic void set%ocation(int /& int
y pu.+ic void set@iQe(int -idth&
int height
nvocarea metodei setsize este necesar numai dac nu ne
satisface dimensiunea minimal pe care aceasta o primete n
mod automat.
Folosirea gestionarilor de pozi ionare
Att n AWT, ct i n Swing este posibil ca amplasarea
componentelor pe suprafaa containerului, ct i dimensionarea
acestora, s se fac automat, folosind gestionari de
po)i"ionare. Acetia sunt instane ale unor clase care
implementeaz interfaa =ava7aE$7La1(&$Mana+er" sau
subinterfaa acesteia =ava7aE$7La1(&$Mana+er27 Fiecare clas
de gestionari de poziionare se caracterizeaz printr-un aspect
specific al amplasrii componentelor pe suprafaa containerului
la care se adaug, lat aceste clase:
B(r'erLa1(&$ - pe suprafaa containerului pot fi plasate cel
mult cinci componente, cte una n fiecare din zonele NORTH,
SOUTH, WEST, EAST i CENTER. Dac nu se specific zona,
se admite implicit CENTER. Aceast clas este gestionarul
implicit pentru Frame, JFrame i JAppet.
105
Ciprian-Daniel NEAGU, Severin BUMBARU
Fl(ELa1(&$ - pe suprafaa containerului componentele sunt
aezate n ordinea adugrii pe mai multe linii orizontale, ca
literele dintr-un text, adic de la stngas la dreapta i de sus n
jos. Se poate specifica dac alinierea componentelor se face la
stnga, la dreapta sau la centru. Este gestionarul implicit pentru
clasele Panel i Applet.
Car'La1(&$ - componentele sunt plasate una peste alta, ca
ntr-un pachet de cri de vizit. Numai una din componente
este vizibil, putndu-se permuta prin program.
Gri'La1(&$ - componentele sunt plasate n celulele unei grile
(grila nsi nu este vizibil). Numrul de linii i coloane al grilei
se specific la crearea gestionarului.
Gri'Ba+La1(&$ - componentele sunt plasate pe o gril, dar
este posibil ca flecare component s ocupe mai multe celule
vecine.
B(2La1(&$ - componentele sunt plasate pe o singur linie ntr-
o "caset" care poate fi pus n poziie orizontal sau vertical.
ntre componentele din caset pot fi lsate i spaii libere, prin
introducerea unor "componente fictive".
Un avantaj important al folosirii gestionarilor de poziionare este
c, la modificarea dimensiunilor ferestrei principale a aplicaiei,
se modific automat dimensiunile i amplasarea componentelor
acesteia, astfel nct s se asigure o ct mai bun vizibilitate.
.>.6. Ad4ugarea %omponentelor la fereastra prin%ipal4
Adugarea containerelor auxiliare i, eventual, a componentelor
atomice la fereastra principala din clasa Frame sau Applet se
face la fel ca adugarea de componente la containerele
auxiliare.
Adugarea componentelor la instanele claselor JFrame i
JAppet nu se poate face direct. Aceste clase conin intrinsec un
panou auxiliar, care se obine invocnd metoda:
pu.+ic Container getContent&ane()
Prin urmare, adugarea de componente se face la panoul astfel
obinut.
106
r^
3. NO|UN MATEMATCE FOLOSTE N APLCA| DE
GRAFC PE CALCULATOR
3.1. Sisteme de coordonate. Coordonate carteziene.
Si#$e%ele 'e )((r'(na$e reprezint o metod de localizare a
punctelor n spaiu, un mod de caracterizare a obiectelor
geometrice (linii, cercuri, plane) prin ecuaii algebrice, aceasta
fiind concepia de baz a reprezentrii n geometria analitic.
O )((r'(na$/ )ar$e5ian/ este o tupl ordonat de numere,
reprezentate prin (x,y) n spaiul bidimensional (2D) i *x,y,)+ n
spaiul tridimensional (3D), care descrie distana de la origine la
punct, msurat de-a lungul fiecrei axe. Valorile pot fi pozitive
sau negative. Axele sistemului sunt perpendiculare i se
intersecteaz n originea sistemului de coordonate. Acest
sistem (figura 3-1) poate fi generalizat pentru a reprezenta
punctul n spaiul n-dimensional nD
prin n-tupla (xi,x2,.Fn+# Sistemul de coordonate n spaiul n-
dimensional
const n n axe perpendiculare reciproc i intersectndu-se n
origine.
.igura &#1. 0istem de %oordonate %arte)iene !.
Ori+inea unui sistem de coordonate este punctul de
coordonate (0,0,....0) n care toate axele sistemului de
coordonate se intersecteaz. Orice linie ntr-un sistem de
coordonate poate fi folosit ca o ax pentru realizarea
transformrilor geometrice. Axele principale sunt cele ce
definesc sistemul de coordonate. Spre exemplu: n cazul
sistemului de coordonate carteziene n 2D, axele principale
sunt cele definite de ecuaiile: x=0, y=0.
3.2. Coordonate polare
.igura &#. 0istem de %oordonate polare !.
C((r'(na$ele p(lare n 2D reprezint o pereche ordonat (r,0)
definit astfel: pentru un punct P, r este distana de la origine la
P iar 0 este unghiul dintre axa [ i segmentul generat de
punctul P i origine. Se pot considera mai multe valori valide
pentru 0 (valoare din intervalul [0,27i]+27t). Folosirea sistemului
de coordonate polare poate simplifica n anumite cazuri
calculele de reprezentare.
107
Ciprian-Daniel NEAGU" Severin BUMBARU
3.3. Conversia ntre sistemele de coordonate carteziene i
polare (n spaiul bidimensional, 2D)
.igura &#&. !eterminarea %oordonatelor
%arte)iene ale unui pun%t %ara%teri)at
prin %oordonate polare.
Pentru conversia coordonatelor polare n coordonate carteziene
se folosesc relaiile:
x = r * cos(G)
&1-9/ +
> = r*sin(G)
Relaiile de conversie din coordonate carteziene n coordonate
polare sunt:
&1-10/
|e = atan(y/x)
\
s
s
O
ct
tul
3
O
ct
rit
ul
A

c a
dr
c ad
ra

s
s
s
N
A
A
A
\
O
ct
itu
l 4
s \
\ s
A
A
A A
O
ct
tu
n
O
ct
itu
l5
A
t
A
E s
s O
ct
tu
l
, Q '
A
\
s
c a C r V A s
A
A O
ri
-
i$l
O
ct
t
ul
s
.igura &#6. Hmp4r"irea unei grile bidimensionale Hn
%adrane 5i o%tante.
O gril bidimensional poate fi mprit n patru subdiviziuni
numite cadrane caracterizate prin semnul coordonatelor
punctelor din fiecare zon. Pentru un punct M(x,y), primul
cadran este caracterizat de relaia x * y ] 0, al doilea cadran de
relaiile x<0, y>0, al treilea cadran de relaiile x<0, y<0, al
108
P = <x,y> a = r sin(theta)
No iuni matematice folosite n aplicaii de grafic pe calculator
patrulea cadran prin relaiile x > 0,y < 0. Fiecare cadran se
mparte n cte dou octante numerotate n sens trigonometric
(figura 3-4).
3.4. H-2--
Fie o dreapt ce trece prin punctele (x-i,yi); (x2,y2) ntr-un
sistem de coordonate cartezian 2D (figura 3-5). Atunci ecuaia
dreptei caracterizat de pant este:
(1-11) y ^ mFx R n,
unde panta dreptei este:
&1-12/ m 3 ^*^+),
I2-I1
iar parametrul n reprezint ordonata din punctul n care dreapta
intersecteaz axa Y.
$1
2.
#
01
i.J
.igura &#9. Cara%teri)area unei linii Hntr#un sistem
%arte)ian !.
&.6.1. 3%ua"ia parametri%4 a unei drepte
Fie dreapta d caracterizat de punctele Pi(Xi,yi) i Pifa_+#
Forma parametric a ecuaiei dreptei d este:
=A < A+ D= P&A2 -A+/ U + U
&1-13/ 4
1

v

2
+ 0CC1
(y < y+ D P& y2 - y- /
Pentru t^B se obine chiar punctul P-i(xi,yi), iar pentru r=1
relaiile sunt verificate de punctul P2(x2,y2). Variaia lui t ntre 0
i 1 conduce la obinerea punctelor de pe segmentul [PiP2]-
&.6.. 3%ua"ia parametri%4 a unei drepte Hntr#un sistem
%arte)ian &!
Fie punctele P^xi.y^zi) i P2(x2,y2,Z2)- Ecuaia parametric a
dreptei care trece prin cele dou puncte este:
A < A+ D = P &A2 - A+/ &1-14/ y <
y- D & y2 - y1 / + 0C=C1. -5 3 5 6
7t *8 5 $ + 5 , )
109
Ciprian-Daniel NEAGU, Severin BUMBARU
Dac se dorete caracterizarea unei drepte n spaiul cartezian
3D ce trece printr-un punct P#E i este paralel cu vectorul V=[xv,
yv, )vJ, atunci:
&1-15/ X = x/ R1 F xv
y ^ y,RtFyv, o?t?#E.
) ^ ), Rt F)`
&.6.&. Algoritm de determinare a distan"ei dintre un pun%t 5i o
dreapt4 Hntr#un sistem %arte)ian de %oordonate !
:
*2
?H
E
.igura &#:. !istan"a dintre dou4 pun%te Hntr#un sistem
de %oordonate %arte)iene !.
Distana ntre dou puncte Pi(xi,yi) i P2(*2,y2) este dat ntr-un
sistem cartezian de coordonate 2D (figura 3-6) de teorema lui
Pitagora:
(1-16) d*PvP+ ^ 6=x#x,fR*y#y,f .
Distana ntre un punct i o dreapt reprezint lungimea
segmentului ce are un capt n Pi i cellalt capt n proiecia P2
a lui Pi pe dreapt (figura 3-7).
P
Q
W
D
P
2
.igura &#;. !istan"a dintre un pun%t 5i o dreapt4 Hntr#un
sistem %arte)ian de %oordonate
!.
Algoritmul de determinare a distanei dintre P_ i proiecia sa P2
pe dreapt este descris n continuare:
110
No iuni matematice folosite n aplicaii de grafic pe calculator
#1.Se determin panta m
1
= -1 / n
#2. Se determin ecuaia dreptei generate de segmentul P1P2
astfel nct P#E s aparin dreptei (relaia 3-3).
#3. Se determin coordonatele punctului P2 ca intersecie a
celor dou drepte, rezolvnd sistemul de ecuaii prin care se
verific faptul c P2 aparine fiecreia dintre cele dou
drepte.
#4. Se calculeaz distana dintre Pi i P2, (conform relaiei 3-8).
&.6.6. !eterminarea interse%"iei a dou4 drepte
Fie dou drepte di i d2. ntersecia lor este punctul de
coordonate (x,y) ce satisface ecuaiile dreptelor:
fy = m1 F x
R n.
(1-17) E
Iy ^ m x R n
Dou drepte paralele nu vor avea puncte de intersecie. Pantele
dreptelor paralele: sunt identice: m1=m2. Dou drepte paralele
avnd termenii liberi identici, ni=n2, se confund. n cazul n care
se dorete determinarea interseciei a mai mult de dou drepte,
trebuie folosit o metod mult mai general pentru rezolvarea
ecuaiilor simultane, metoda eliminrii (Gauss).
&.6.9. Algoritm de determinare a apartenen"ei unui pun%t de pe
o linie dat4 la
un segment dat
Pentru a determina dac punctul P3(x3,y3)e[PiP2] se parcurg
urmtorii pai: #1. Se determin valoarea f din ecuaia
parametric pentru x sau pentru y.
t^ x-*i x2 -x,
#2. Se pleac de la ipoteza x = x3 i se
calculeaz t. #3. Dac 0 < f < 1, atunci
P3e[PiP2].
3.5. Seciuni conice
Seciunile conice se obin prin intersecia unui con cu un plan
care nu trece prin vrful conului. Fie planul caracterizat de
ecuaia ax+by+cz=1. Dac unghiul dintre plan i axa conului
este drept, intersecia planului cu suprafaa conic are ca
rezultat seciunea circular (a=b=0, figura 3-8a). Dac unghiul
dintre plan i axa conului este cuprins ntre valoarea unghiului
ce descrie conul i unghiul drept, atunci intersecia planului cu
conul este o elips (a
2
+b
2
<c
2
, figura 3-8b). Primul tip de seciune
conic prezentat (cercul) este prin urmare un caz particular de
elips, pentru care unghiul dintre planul de intersecie i axa
conului este unghiul drept, una dintre extremele domeniului ce
definete seciunea eliptic. n cazul n care unghiul format de
planul de seciune cu axa conului este egal cu unghiul ce
descrie conul, intersecia cu pnza conului este practic vid. O
parabol se formeaz la intersecia unui plan cu conul, cu
condiia ca planul s fie paralel cu o generatoare a conului
(a
2
+b
2
=c
2
, v. figura 3-8c). Hiperbola se obine prin intersecia
unui plan paralel cu axa conului (a
2
+b
2
>c% figura 3-8d). '
111
Ciprian-Daniel NEAGU, Severin BUMBARU
(a) (b) (c) (d)
.igura &#>. Interse%"ia unui %on %u un plan/*a+
%er%, *b+ elips4, *%+ parabol4, *d+
'iperbol4.
3.6. Cercul
Ecuaia cartezian a unui cerc care trece prin originea
sistemului de coordonate este (figura 3-9a):
(1-18) x
2
+y
2
^r

<=>y ^ aDr

#x

,unde#r ?x?r.
'
'
<x
,y
th
et
L (
)
*
C
-Z
u
H
i
+
L O
!
j
' ,
' O [
HW
-
(a) (b)
.igura &#@. !es%rierea %er%ului %u %entrul Hn originea
unui sistem de %oordonate/ *a+ %arte)iene,
*b+ polare.
ntr-un sistem de coordonate polare 2D, un cerc avnd centrul
n originea sistemului de coordonate (figura 3-9b) este descris
de ecuaiile:
&1-19/ r = x
0 < 0 < n*radiani+
Ecuaia tangentei la un cerc C ntr-un punct dat Mi(xi,y-i) se
determin folosind derivata ecuaiei cercului. Fie cercul C: (x -
x0)
2
+ (y - yof = r

cu centrul Mo(x0,yo) i raza r, iar punctul M-


i(Xi,yi) un punct dat pe cercul C. Vom face
112
Noiuni matematice folosite n aplicaii de grafic pe calculator
substituirile (dedublri): x
2
->xxi, x->
1
/2*(x+xi), y^yyi.
y->
1
/2*(y+yi), xy^
1
/2*(xyi+x1y).
nlocuind n ecuaia cercului, vom obine:
x
2
-2xx0+Xo
2
+y
2
"2yy0+yo
2
=r
2
<=>xx1-2*
1
/2*(x+Xi)x0+x0
2
+yyi-2*
1
/2*(y+yi)yo+yo
2
=^
xx1-xxo-xix0+xo
2
+yyi-yy0-yiyo+yo
2
=A
2
x(x1-x0)-x0(xi-xo)+y(yi-yo)-yo(yi-yo)=A
2
(x1-xo)(x-x0)+(yi-y0)(y-yo)=A
2
.
[75 f?60 Fiii | Draw |
Applet started.
.igura &#1B. 7rasarea se%toarelor de %er% Hn %oordonate
%arte)iene.
Pentru exemplificare, vom face apel la unul din appiet-urile
demo propuse de firma Sun n documentaia jdk1.3.1 (v.
http://www.java.sun). Rezultatul rulrii applet-ului poate fi
urmrit n figura 3-10.
Applet &#1. Ar%7est.$ava/ trasarea se%toarelor de %er% Hn
%oordonate
%arte)iene.
K1 ##################################################
- c(d'rc3est.java 1.U UIA0UA01 @ami @haio
- Copyright (c 1UU8F1UUC @un Microsystems&
Inc. 'II ) (ights (eserved.
- Modificat si adaptat: 2001 Dan Neagu
) 7777777777777777777777777777777777777777777A
import java.a-t.),
import
java.app+et.),
11*
Ciprian-Daniel NEAGU, Severin BUMBARU
pu.+ic c+ass 'rc3est e/tends
'pp+et 0 'rcContro+s
contro+s, pu.+ic void
init( 0
set%ayout(ne- !order%ayout( ,
'rcCanvas c 5 ne- 'rcCanvas(,
add;NCenter< & c ,
addCN@outh<& contro+s 5 ne-
'rcContro+s(c, M
pu.+ic void start( 0
contro+s.ena.+e(
, M
pu.+ic void
stop( 0
contro+s.disa.+e
(, M
pu.+ic .oo+ean
hand+e=vent(=vent e 0 if
(e.id 55 =vent._IND9_7D=@3(9G
0 @ystem.e/it(0,
M
return fa+se,
M
pu.+ic static void main(@tring
args$ 0 :rame f 5 ne-
:rame(<'rc3est<, 'rc3est
arc3est 5 ne- 'rc3est(,
arc3est.init(
,
arc3est.start
(,
f .addCNCenter<&
arc3est, f.resiQe (*00&
*00 , f.sho-(, M M
c+ass 'rcCanvas e/tends
Canvas 0 int
start'ng+e 5 0, int
end'ng+e 5 8I, .oo+ean
fi++ed 5 fa+se, :ont
font,
pu.+ic void paint(6raphics g
0 (ectang+e r 5 .ounds9, int
h+ines 5 r.height A 10, int
v+ines 5 r.-idth A 10,
g.setCo+or(Co+or.pin4, for
(int i 5 1, i J5 h+ines, iK
K 0
g.dra-%ine(0& i ) 10& r.-idth& i
) 10, M
118
Noiuni matematice folosite n aplicaii de
grafic pe calculator
for (int i 5 1, i J5 v+ines, iKK 0
g.dra-%ine(i ) 10& 0& i ) 10&
r.height, M
g.setCo+or(Co+or.red
, if
(fi++ed 0
g.fi++'rc(0& 0& r.-idth
start'ng+e& end'ng+e, M e+se
0
g.dra-'rc(0& 0& r.-idth
start'ng+e& end'ng+e, M
g.setCo+or(Co+or..+ac4, g.set:ont(font,
g.dra-%ine(0& r.height A 2& r.-idth& r.height
A 2, g.dra-%ine(r.-idth A 2& 0& r.-idth A 2&
r.height, g.dra-%ine(0& 0& r.-idth&
r.height, g.dra-%ine(r.-idth& 0& 0&
r.height, int s/ 5 10, int sy 5 r.height F
2D,
g.dra-@tringCN@ 5 < K start'ng+e& s/& sy
, g.dra-@tring(<= 5 < K end'ng+e& s/& sy
K 18, M
pu.+ic void redra-(.oo+ean fi++ed& int start& int
end 0 this.fi++ed 5 fi++ed, this.start'ng+e 5
start, this.end'ng+e 5 end, repaint(, M M
c+ass 'rcContro+s e/tends
;ane+ 0 3e/t:ie+d s
&F3e/t:ie+d e, 'rcCanvas
canvas,
pu.+ic 'rcContro+s('rcCanvas
canvas 0 this.canvas 5 canvas,
add(s 5 ne- 3e/t:ie+d(<0<& 8,
add(e 5 ne- 3e/t:ie+d(<8I<& 8,
add(ne- !utton(<:iii<, add(ne-
!utton(<Dra-<,
M
pu.+ic .oo+ean action(=vent ev& 9.ject
arg 0 if (ev.target instanceof
!utton 0 @tring +a.ei 5 (@tringarg,
canvas.redra-(+a.ei.e[ua+s(<:iii<&
Integer.parse+nt(s.get3e/t(.trim(&
11I
- 1& r.height
F 1&
Ciprian-Daniel NEAGU" Severin BUMBARU
Integer.parse+nt(e.get3e/t(.trim(
, return true, M
return fa+se, M
M
3.7. Poligoane
O p(lilinie reprezint o secven de linii (muchii) ce leag ntre
ele o secven de puncte (vrfuri). O polilinie este Hn%'is4
(figura 3-11a) dac cele dou capete ale sale coincid. O
polilinie este simpl4 (figura 3-11b) daca nu se ntretaie (spre
exemplu, dou vrfuri coincid, un vrf al poliniei se afl n
interiorul unei muchii distincte sau dou muchii se
intersecteaz). O polilinie n plan poate fi reprezentat ca o
simpl serie de coordonate (x,y) ale
vrfurilor sale.
Modalitatea de redare a
proprietilor grafice ale poliliniei
(rendering) este determinat de un
set de proprieti numite a$ri4&$e
+ra,i)e7 Acestea includ culoarea
liniei, limea liniei, stilul liniei
(solid, punctat, ntrerupt),
modalitatea de unire a segmentelor
consecutive (rotunjit, dur) etc.
L9
(a) (b)
.igura &#11. Polilinii/ *a+ polilinie Hn%'is4, *b+ polilinie
simpl4.
Multe sisteme grafice furnizeaz cazuri speciale de curbe:
cercuri, elipse, suprafee circulare, curbe Bezier sau B-spline.
Vom considera curbele ca o generalizare a poliliniilor. Unul
dintre argumente este acela c, practic, multe sisteme grafice
de desenare realizeaz curbele prin algoritmi de aproximare
printr-un numr ct mai mare de polilinii ct mai mici.
Un p(li+(n este o figur plan compus din vrfuri i muchii cu
condiia ca seria segmentelor (muchiilor) sale s formeze o
polilinie nchis plan.
&.;.1. Convexitatea 5i %on%avitatea poligoanelor
Un poligon este numit convex dac pentru orice puncte P^ P2
aflate n interiorul poligonului, toate punctele de pe segmentul
[P1P2] aparin interiorului poligonului. Un poligon este concav
dac este neconvex, deci un poligon pentru care exist dou
puncte Pi, P2 din interiorul poligonului cu proprietatea c
segmentul [P1P2] are puncte ce nu aparin interiorului
poligonului. Un poligon ce se autointersecteaz este un poligon
concav pentru care cel puin dou laturi se intersecteaz ntr-un
punct, altul dect vrfurile lor.
116
Noiuni matematice folosite n aplicaii de
grafic pe calculator
(a) (b) (c)
.igura &#1. 7ipuri de poligon/ *a+ %onvex, *b+ %on%av,
*%+ poligon %e se
autointerse%tea)4.
Gradul unui poligon este dat de numrul laturilor (poligoanele
din figurile 3-12a,b sunt de grad cinci, numite i pentagoane, iar
cel din figura 3-12c este de grad patru). Poligonul din figura 3-
12a este convex, n timp ce poligoanele din figurile 3-12b,c sunt
concave (exist dou puncte aparinnd interiorului poligonului,
astfel nct segmentul avnd capete cele dou puncte s nu
aparin n totalitate interiorului poligonului, v. segmentul
[P1P2]).
3.8. Plane
Un plan este o suprafa continu extins pe dou direcii.
Planul este definit de trei puncte necoliniare sau de un punct i
un vector (paralel cu planul sau perpendicular pe acesta).
Ecuaia general a planului este dat de:
(1-20) Ax R 1y R C) ^ B sau
(1-21) AQx R 1Qy R CQ) R !Q^B
(1-22) AQ^#,1Q^#,C^#,Cr ^ #.d ^ $A

R1

RCF d
d d d
&.>.1. Algoritm de %ara%teri)are a unui ve%tor normal la plan
Fie Pi, P2, P3 trei puncte date. Un ve)$(r n(r%al la plan este
caracterizat de relaia:
(1-23)N=[P2-P1]x[P3-Pi]
unde x este produsul vectorial.
Exemplu: dat fiind planul: Ax R 1y R C) R ! ^ 0, vectorul [A B
C] este normal la plan. Algoritmul pentru determinarea ecuaiei
unui plan caracterizat prin trei puncte distincte necoliniare: Pi,
P2, P3.
#1.Se determin N = [A B C];
#2. Se determin D=-NP,, / =1,2,3, unde este produsul scalar
#3. Se scrie ecuaia planului folosind relaia (3-13) i coeficienii
A, B, C, D.
117
Ciprian-Daniel NEAGU, Severin BUMBARU
3.8.2. Interse%"ii
ntersecia a dou plane neparalele este o dreapt. Ecuaia
acestei drepte se obine rezolvnd sistemul format din ecuaiile
celor dou plane sau folosind metoda eliminrii Gaus.
ntersecia dintre un plan i o dreapt neparalel cu el este un
punct. Coordonatele punctului se obin rezolvnd sistemul de
ecuaii ce descriu n 3D planul (relaia 3-12 sau 3-13), respectiv
dreapta.
&.>.&. Po)i"ii relative la un plan dat
Ca)ul Hn %are un pun%t se g4se5te pe un plan/
Fie punctul P(x,y,z) i a un plan caracterizat de P i N. Atunci
Pea=> N.(P-P1)=0
Ca)ul Hn %are o dreapt4 apar"ine unui plan/
Fie dreapta d caracterizat de punctele Pi i P2. Dac Pi, P2e a,
atunci dreapta dea.
Fie dreapta d caracterizat de punctul P i vectorul V. Dac Pe
a i VN atunci dreapta e a.
&.>.6. 0emiplane
O dreapt mparte orice plan n dou semiplane. Un semiplan
se va exprima matematic printr-o inecuaie. Spre exemplu,
ecuaia x + y > 2 caracterizeaz toate punctele din planul (xy)
ce satisfac inegalitatea (se gsesc n semiplanul aflat de o
parte a dreptei x + y = 2).
118
4. TRANSFORMR GEOMETRCE
4.1. Transformri bidimensionale (2D)
Fie un obiect bidimensional descris ntr-un sistem cartezian de
coordonate. Fie P(x,y) un punct al su.
6.1.1. 7ransla"ia
Translaia este transformarea ce deplaseaz toate punctele
unui obiect cu un anumit deplasament fa de poziia iniial.
Rezultatul obinut prin translatarea punctului P(x,y) este punctul
PQ*xQ,y+, care verific sistemul:
ExQ^ x R 7x
(4-1) , .
Iy ^ yR7K
unde 7x, 7y sunt deplasamentele pe abscis i ordonat (figura
4-1).
.igura 6#1. 7ransla"ia unui obie%t bidimensional.
Forma vectorial a sistemului (16) este:
(4-2) PQ ^ P R 7, adic:
&4-3/(AR+y
+
* < (A+y* D (A+7y*.
Un exemplu care realizeaz translaia punctelor 2D este applet-
ul Translation (v. figura 4-2). Applet-ul Translation (fiierul
Translation.java) conine un obiect al clasei TranslationDisplay
(extensie a clasei Canvas). Applet-ul are dou moduri de
interaciune cu utilizatorul: modul 0 permite mutarea obiectului
(figura 4-2a), modul 1 permite modificarea vectorului ce
caracterizeaz translaia. Modurile conduc la comportare
diferit n clasa Translator. n modul 1 (figura 4-2b), vectorul de
translaie afieaz dou puncte la capete, pentru ca utilizatorul
s poat modifica dimensiunea sau orientarea vectorului.
Schema de culoare poate fi schimbat folosind setul de
parametri ai etichetei HTML care apeleaz applet-ul. Obiectul
TranslationDisplay este iniializat ca suprafa pentru desenare.
Toate fiierele surs necesare sunt adugate n Anexa .
MyMath.java este o colecie de funcii matematice necesare n
calculele geometrice. Metodele sunt decalarate public static (nu
e necesar o instan MyMath). Sistemul de coordonate relativ
are originea stnga sus, deci sunt necesare transformri
corespunztoare.
119
Ciprian-Daniel NEAGU, Severin BUMBARU
K-jA()(l<:t Viewer:
lranstaton.tla*f ;
Mutai obiectul
(Drowny urmrii
oDiectul (ulue).
Apple! started
_|g|x|
tDUp__N___ - -el
AppM
\ orvorr
1 Mod
e
1
Refre
sh
- H ADO
Ut
i
Modificai vectorul (prin
punctele caracteristice)
Applet
(a) (b)
.igura 6#. Appiet#ul 7ranslation/ un exemplu de transla"ie a
dou4 pun%te
in sistemul de %oordonate !/ *a+ modul B # transla"ie, *b+
modul 1 #
modifi%area ve%torului de transla"ie.
Applet 6#1. Clasa 7ranslation *fi5ierul
7ranslation.$ava+ pentru implementarea modurilor de
%ontrol al %ara%teristi%ilor de transla"ie !.
A)'pp+et demo: trans+aLia
puncte+or.)A import
java.app+et.), import j ava .
a-t. ) &Fimport java.utii.),
import MyMath,
pu.+ic c+ass 3rans+ation e/tends 'pp+et
imp+ements !utton;ane+Rost0
int state50& mode50,
Image -or4space,
6raphics off@creen,
private %a.ei +a.,
private :ont my:ont5ne-
:ont(<@ans@erif<&:ont.;%'IN&18,
Co+or canvasco+ 5 ne- Co+or(0& 0& 0,
Co+or +a.Co+or 5 ne- Co+or(20& 20& 20,
private !utton;ane+ .ut;an,
private 3rans+ationDisp+ay disp+ay,
pu.+ic void init(0 int
co+i& co+2& co+*,
set%ayout(ne-
!order%ayout(2&2,
set:ont(my:ont, try0
co+i 5
Integer.parse+nt(get;arameter(<(ed<,
co+2 5
Integer.parse+nt(get;arameter(<6reen< ,
co+* 5
Integer.parse+nt(get;arameter(<!+ue<,
canvasco+ 5 ne- Co+orfco++& co+2& co+*,
M
catch(=/ception
e0M try0
120
Transform ri geometrice
co+i 5
Integer.parseint(get;arameter(<%a.(ed<,
co+2 5
Integer.parseint(get;arameter(<%a.6reen<
, co+* 5
Integer.parseint(get;arameter(<%a.!+ue<,
+a.Co+or 5 ne- Co+or(co++& co+2& co+*,
M
catch(=/ception e0M
set!ac4ground( canvasco+,
-or4space5createImage(800&
2I0,
off@creen5-or4space.get6raph
ics(,
+a. 5 ne- %a.ei(<MutaLi o.iectu+ (.ro-nA
urmXriLi o.iectu+ (.+ue.<& %a.ei.C=N3=(,
+a..set!ac4ground(+a.Co+or, add(<@outh<&
+a.,
addCN=ast<& .ut;an5ne- !utton;ane+(this,
addCNCenter<& disp+ay5ne-
3rans+ationDisp+ay(this, M
pu.+ic void start (
0 disp+ay.setMa/(,
.ut;an.turnoff(, AAcontro+u+
modu+ui
M
pu.+ic void stop(0M
pu.+ic void turnoff(0
state50,
disp+ay.turnoff(,
+a..hide9
, M
pu.+ic void turnon9 0
state5+,
disp+ay.turnon(,
+a..sho-(
, M
pu.+ic void
response(int i0
s-itch (i0 case 2:
disp+ay.s-itchmode(,
mode 5 disp+ay.getmode(,
if (mode 55 0+a..set3e/t(<MutaLi o.iectu+
(.ro-nA urmXriLi o.iectu+ (.+ue .< ,
if (mode 55 1+a..set3e/t(<ModificaLi
vectoru+ (prin puncte+e caracteristice.<,
repaint(,
.rea4,
case *:
disp+ay.repaint(,
repaint(,
.rea4,
Ciprian-Daniel NEAGU, Severin BUMBARU
}
3!.% 4@
+a..set3e/t(<< ,
disp+ay.paint'.out ( ,
%p!-2' &/ 0
9%!40 :
6.1.. 0%ala rea
S)alarea este definit prin ecuaia:
(4-4) PQ^0bP, adic:
[
'
.x
]l
X
?: ^ \
L _O I
unde Sx, 0y sunt constantele (factorii) de scalare. Dac factorii
de scalare sunt negativi, atunci rezultatul scalarii este re,le2ia
fa de axa corespunztoare factorilor de scalare negativi.
Factorii de scalare supraunitari aplicai mulimii de puncte ale
unui obiect conduc la redimensionarea obiectului n fereastra
de reprezentare i deprtarea acestuia de originea sistemului
de coordonate, n timp ce factorii de scalare subunitari conduc
la micorarea obiectului i apropierea lui de originea sistemului
de coordonate.
6.1.&. 8ota"ia
R($a.ia de unghi 0 a unui obiect fa de origine conduce la
pstrarea distanei obiectului fa de origine i modificarea
coordonatelor n sensul pozitiv (trigonometric) pentru 0 > 0 sau
n sensul orar, negativ, pentru 0 < 0.
(0,0) axa x
.igura 6#&. 8ota"ia unui obie%t
fa"4 de originea sistemului de
%oordonate.
Pentru exprimarea rotaiei este
preferabil procesarea n
sistemul de coordonate polare
(figura 4-3):
(4-
6)P(xi,yi):
xi = r cos cp yi = r *sincp
122
(x2,y2) (xl,yl
Transformri
geometrice
Rotaia este astfel
caracterizat de sistemul: X2 = r *cos(9 + cp) /2 = r
*sin(9 + cp)
X2 = r *cos9*cos<j)-r *sin( [/2 = r
*sin0*cos()> + r *cos(
Folosind relaiile (4-6), obinem:
X2 < A-P3>.9-y-P.-20
(4-7) 8d
Vectorial, relaiile (4-7) sunt descrise de:
(4-8) PQ^8e.P,
adic, desfurat, pentru puncte ntr-un sistem de coordonate
cartezian 2D:
(4-9) X
'
$
^ cos
9
sin
-
sin
9
\ X
brtAppet Vewer: llllllllll'lll'lllll| _|
App$e$
On/Off C r Abo t Blu /
Appletstarted
.igura 6#6. Appiet#ul 8otation/ un exemplu de
rota"ie a obie%telor Hn sistemul de
%oordonate !.
Un exemplu care realizeaz rotaia punctelor unui obiect
'freehand' 2D este appiet-ul Rotation (v figura 4-4). Appiet-ul
Rotation (fiierul Rotation.java) conine un obiect al clasei
RotationDisplay (extensie a clasei Canvas). Appiet-ul are dou
moduri de interaciune cu utilizatorul: modul 0 permite
desenarea obiectului (figura 4-4), modul 1 permite modificarea
culorii ce caracterizeaz rotaia. Schema de culoare poate fi
schimbat folosind setul de parametri ai etichetei HTML care
apeleaz appiet-ul. Obiectul RotationDisplay este iniializat ca
suprafa pentru desenare. Toate fiierele surs necesare sunt
adugate n Anexa . MyMath.java: este o colecie de funcii
matematice necesare n calculele geometrice. Metodele sunt
declarate public static (nu e
123
Rceea ce este echivalent cu:
sin
^
sin
Re:
/2 = xi*sin9 + yi*cos9
Ciprian-Daniel NEAGU, Severin BUMBARU
necesar o instan MyMath). Trebuie reamintit c sistemul de
coordonate relativ este stnga sus, deci sunt necesare
transformri corespunztoare.
Applet 6#. Clasa 8otation! *fi5ierul
8otation!.$ava+ pentru implementarea modurilor de
%ontrol al %ara%teristi%ilor de rota"ie !.
A)(otationD.java)A
import java.app+et.),
import j ava.a-t.),
import j
ava.a-t.image.),
import java.utii.),
pu.+ic c+ass (otationD e/tends 'pp+et
imp+ements !utton;ane+Rost0
int state50,
Image -or4space,
6raphics off@creen,
:ont my:ont5ne-
:ont(<@ans@erif<&:ont.;%'IN&18,
Co+or canvasco+ 5 ne- Co+or(2II& 2II&
2II,
!utton;ane+D .ut;an,
(otationDDisp+ay disp+ay,
pu.+ic void init(0 int co+i&
co+2& co+*, set%ayout(ne-
!order%ayout(I&I,
set:ont(my:ont&Ftry0
co+i 5
Integer.parse+nt(get;arameter(<(ed< ,
co+2 5 Integer.parse+nt (get;arameter
(<6reen< &W
co+* 5
Integer.parse+nt(get;arameter(<!+ue< ,
canvasco+ 5 ne- Co+or(co++& co+2& co+*,
M catch(=/ception e
0M
set!ac4ground( canvasco
+,
-or4space5createImage(siQe ( .-idth&
siQe( .height ,
off@creen5-or4space.get6raphics(,
addCNNorth<& .ut;an5ne-
!utton;ane+D(this, add(<Center<&
disp+ay5ne- (otationDDisp+ay(this,
pu.+ic void
start(0
disp+ay.setMa/(
, .ut;an.turnoff
( ,
M
pu.+ic void
stop(0M pu.+ic
void turnoff(0
state50,
disp+ay.turnof
f(, M
pu.+ic void turnon(0
128
Transformri
geometrice
M
state5+, disp+ay.turnon(
pu.+ic void response(int
i0 s-itch (i0 case 2:
repaint(,
.rea4,
case *:
disp+ay.c+ear(,
repaint(,
.rea4,
case
8 :
disp+ay.paint'.out ( ,
.rea4, M
M M
c+ass (otationDDisp+ay e/tends Canvas 0
priv int disp+ay@tate50& ma/B& ma/G,
priv int gema50& captive50& .usy50,
priv int .rush+nde
priv Ima frontImag
priv Ima .rushes
priv (ot rotor,
priv (otatio nost,
priv fin in !($@R7@I> 5 20,
priv fin in !($@R7'(= 5 !($@R7@I>= )
priv fin in (=D 0
priv fin in 6(==N 1
priv fin in !%$= 2
priv fin in G=%%9_ *
priv fin in M'6=N3' 8
priv fin in CG'N I
priv fin in !%'C# C
priv fin in 6('G E
priv fin in _RI3= D
pu.+ic (otationDDisp+ay
((otationD h0
int inde/& i& j,
int a+pha,
Memory+mage@ource
mis, host5h,
set!ac4ground( h.canvas
co+, inde/ 5 0,
- 2' (* (* .>13%. < 2%" -2'(9*
(BRUSIBAR8A* 0 => &K<00 KCBRUSIBSIV80
K DD / E => &-<00 -CBRUSIBSIV80 - DD/ E
!#p,! < g%'A#p,!&-+ K/0
125
Ciprian-Daniel NEAGU, Severin BUMBARU
9/99ff0 K a+p
9/9999f K a+p
9/99999 K a+p
9/99fff K a+p
9/99ff9 K a+p
9/9999f K a+p
0/00000 K a+p
0/00.D. K a+p
9/99fff K a+p
a+pha JJ5 28, sources1(=D21inde/2
sources16(==N21inde/2 sources1!%$=2
1inde/2 sources1G=%%9_21inde/2
sources1M'6=N3'21inde/2 sources1CG'N2
1inde/2 sources1!%'C#21inde/2
sources16('G21inde/2 sources1_RI3=2
1inde/2 inde/KK&FM M AA Construirea
imagini+or din sursa de memorie.
.rushes 5 ne- Image1U2 ,
for (i50, iJU, iKK0
mis 5 ne- Memory+mage@ource(!($@R7@I>=&
!($@R7@I>=&
sources1i2& 0&
!($@R7@I>=, .rushes1i2 5
create+mage(mis, M M
int get'+pha(int /& int y0
dou.+e de+taB 5 (dou.+e(/ F
!($@R7@I>=A2,
dou.+e de+taG 5 (dou.+e(y F
!($@R7@I>=A2,
dou.+e distance 5
Math.s[rt(de+taB)de+taB K
de+taG)de+taG,
dou.+e fracDistance 5 distance A
(!($@R7@I>=A2,
if (fracDistance Z 1.0 fracDistance 5
1.0,
fracDistance 51.0 F fracDistance,
fracDistance 5 Math.po-(fracDistance& C,
return (int(2II )
fracDistance, M
pu.+ic void update(6raphics g0paint(g,M
pu.+ic void paint(6raphics g
0 if(disp+ay@tateZ5+0
g.dra-+mage(frontImage&0&0&th
is ,
M
e+se0
W .%'-6>#> &g%'.B!34g>12d &/ / 0
g.=-##R%3'&0+0+$!AX+$!A7/0
g. setCo+or(get:oreground(,
M
.usy50,
M
pu.+ic .oo+ean mouseDo-n(=vent e& int /&
int y0
return mouseDrag(e&
/& y, M
12C
Transformri geometrice
pu.+ic .oo+ean mouseDrag(=vent e& int /&
int y0 if (disp+ay@tate550 return
true, int /ne-& yne-, / F5
!($@R7@I>=A2, y F5 !($@R7@I>=A2,
;oint ne-/y5rotor.rotation(ne- ;oint(/&y,
Image .rush 5 .rushes 1host ..ut;an.getChoice
( 2 &Fhost.off@creen.dra-+mage(.rush& /& y&
this, host.off@creen.dra-+mage(.rush&
ne-/y./& ne-/y.y& this, for(int i50,iJ2,iKK0
ne-/y5rotor.rotation(ne-/y,
host.off@creen.dra-+mage(.rush& ne-/y./&
ne-/y.y& this,
M
refresh(,
return
true, M
pu.+ic void paint'.out(0
host.off@creen.setCo+or(get!ac4ground(,
host.off@creen.fiiI(ect(0&0&800&2I0,
host.off@creen.setCo+or(Co+or..+ac4,
host.off@creen.dra-@tringCN'pp+et (otaLieF
demo<&20&20,
host.off@creen.dra-@tring(<Computer
6raphics<&20&80,
set+mage(host.-or4spa
ce, M
pu.+ic void turnoff(0
disp+ay@tate50,
repaint(
, M
pu.+ic void turnon9 0
disp+ay@tate5+,
repaint(
, M
pu.+ic void setMa/(
0 ma/B5siQe(.-idth,
ma/G5siQe(.height, rotor5ne-
(otor(ne- ;oint((int(ma/BA2&
(int(ma/GA2&120, refresh(,
M pu.+ic void
c+earf0
host.off@creen.setCo+or(get!ac4ground 0,
host.off@creen.fi++(ect(0&0&siQe(.-idth&siQe
(.height,
refresh(
, M
private void
set+mage(Image I0
fronLImage51,
12E
Ciprian-Daniel NEAGU, Severin BUMBARU
%p!-2'&/0
M private void refresh(
0set+mage(host.-or4space,M
n concluzie, pentru cele trei transformri 2D, ecuaiile
caracteristice sunt:
- Translaie: PQ ^ P R 7,
- Scalare: PQ^0bP,
# Rotaie: PQ^8e.P.
Reprezentarea n coordonate omogene permite tratarea
(omogen) a tuturor transformrilor prin multiplicri matriciale.
Pe lng cele dou coordonate carteziene standard (2D) apare
o a treia coordonat omogen, astfel nct punctul de
coordonate (x,y) este reprezentat prin tripletul *x,y,(+,
reprezentarea unui punct prin coordonate omogene nefiind
unic. Spre exemplu, tripletele (2,4,8) i (1,2,4) reprezint
acelai punct din plan (n coordonate omogene). Pentru (FB,
reprezentrile *x,y,(+ i =xA(,yA(,E+ reprezint acelai punct,
unde xA( i yA( sunt coordonatele carteziene asociate punctului
omogen. Punctele pentru care (^B se numesc puncte la infinit.
Prin urmare, transformrile de baz pot fi reprezentate, prin
intermediul coordonatelor omogene, ca matrice 3X3. Aciunea
de a aplica o transformare unui punct oarecare este
echivalent cu multiplicarea coordonatelor omogene ale
punctului prin matricea transformrii specifice. Matricele (pentru
coordonate omogene) ale transformrilor discutate anterior
devin:
(4-10) 7*7x,7y+ ^
W
!
0
1 ! 7
y !
(4-11) 0*0x,0y+ ^ /x " "
0 0y 0
0 0 1
(4-12) Re = cos0 -sin8 0
sin9 cos9 0
0 0 1
Relaiile de transformare ale unui punct P, n coordonate
omogene, devin:
PQ^7*DF,7y+FP
(4-13)
EpQ^0*0F,0y
+bP. PQ ^
8obP
128
Transformri
geometrice
4.2. Transformri afine. Transformri compuse.
Majoritatea transformrilor n lumea real pstreaz liniile
drepte. Asemenea transformri includ rotaia, reflexia, scalarea,
translaia i definesc clasa de transformri numite transformri
afine. Elementele de baz ale geometriei afine sunt scalarii
(valori reale), punctele i vectorii liberi. Punctele sunt definitorii
pentru specificarea unei poziii. Vectorii liberi se utilizeaz pentru
a specifica direcia i dimensiunea, fr a avea ns o poziie
fix. Termenul "liber" definete faptul c vectorii nu depind de o
poziie particular (originea, spre exemplu), ci sunt nelegai n
spaiul de coordonate. Astfel, aceste entiti pot fi combinate
printr-un set de operaii valide: produsul unui scalar cu un
vector, adunarea a doi vectori. O alt operaie permis este
combinaia afin. Vom ncerca s introducem conceptul prin
exemple i generalizare.
Fie date dou puncte P i Q. Dorim s calculm punctul din
mijlocul segmentului PQ, sau, mai general, un punct R care
mparte segmentai PQ n rapoartele a i 1-a, pentru ae[0,l]
(mijlocul de segment se obine pentru
a=l/2). Rezultatul se obine prin calculul vectorului Q-P, scalarea
lui cu a i adugarea rezultatului la P:
&4-14/ R 3 9 7 a:;+9)-
Astfel, R "navigheaz" (figura 4-5) ntre poziiile lui P i Q, dup
cum a ia valori ntre 0 i 1. n principiu, a ar putea avea valori
negative (caz n care R parcurge dreapta PQ la stnga lui P),
sau valori supraunitare (n care caz R parcurge PQ la dreapta
lui P). Cazul special a e [0,1] se numete
combinare convex.
R +-, 1 7 lfo+9)
.igura 6#9. Combina"ii afine.
Astfel, n spaiul afin se definesc urmtoarele dou operaii
asupra punctelor:
Combina"ii afine/ dat o secven de puncte Pi, P2, .., Pn, o
combinaie afin este orice sum de forma: aiPi + a2P2 + .. +
ctnPn, unde a,, a2, ..,an sunt scalari ce satisfac relaia ]T. a, = 1.
Combina"ii %onvexe/ orice combinaie afin pentru care sunt
ndeplinite condiiile: co > 0, pentru i=1 ..n.
Combinaiile afine, respectiv cele convexe, au utilizri
interesante n grafica pe calculator. Spre exemplu, orice trei
puncte necoliniare determin un plan, n acest caz existnd o
coresponden 1-1 ntre punctele din plan i combinaiile afine
ale celor trei puncte date. Analog, se pot caracteriza i
corespondene 1-1 ntre vrfurile unui triunghi determinat de
cele trei puncte date i combinaii convexe ale punctelor
respective. n particular, punctul (1/3)P+(1/3)Q+(1/3)R este
centrul triunghiului.
129
Ciprian-Daniel NEAGU, Severin BUMBARU
Deoarece transformrile afine asupra unor segmente au ca
rezultat tot segmente, se poate concluziona c orice secven
de dou transformri afine este echivalent cu o singur
transformare afin. Acest enun conduce la construirea unor
transformri complexe asupra obiectelor, prin combinarea
succesiv a mai multor transformri afine prin concatenare. Prin
urmare, o secven de mai multe transformri afine poate fi
reprezentat printr-o matrice unic, ceea ce conduce la o
simplificare i descriere iterativ a problemei. Folosirea
secvenelor de transformri permite descompunerea
problemelor compuse n subprobleme, secvena transformrilor
obinndu-se prin concatenarea transformrilor simple ntr-o
singur matrice de multiplicare.
6..1. 7ransformarea de rota"ie
Rotaia unui punct dat n jurul unui punct P de coordonate
(xo,yo) poate fi descompus n trei probleme separate,
abordabile prin transformri simple:
1.87. translarea punctului P n originea sistemului de
coordonate;
1.88. rotaia n jurul originii;
1.89. translaia invers a punctului rezultat din origine
pe vechile coordonate.
Aceast secven este descris prin produsul matriceal
(operaiile de multiplicare se completeaz de la dreapta la
stnga):
(4-15) 7 ^ Cb 1b A, unde:
(4-16) C = T(-xo-yo)
1 ^ 81
A = T(xo,yo)
Extinznd, rezultatele intermediare sunt:
PQ^AbP
(4-17)
P2'=S P'i, adic:
P3'=CP2'
(4-18) PPQ^7bP ^
Cb 1Q Ab P. iar relaia (4-15) este descris
de secvena
(4-19) "1 0
Xo" 0 1
yo

0 0
1
cos 9
sinG
0
-sinG
0" cose
o

0
1
1 " 0 1
o o
\X(
yo
1
ceea ce are ca rezultat transformarea compus:
cos9 -sinG xo (1-cose)+yo sinG
(4-20) sinG cos9 yo (1-cosG)-xo
sin6
0 0 1
130
Transform ri geo metrice
4.2.2. Hn%linarea fat4 de o ax4
Transformrile afine pstreaz paralelismul dintre linii dar nu
pstreaz lungimile i unghiurile. Spre exemplu, pentru operaia de
nclinare fa de axa X cu unghiul de nclinare cp, ecuaiile
transformrii sunt:
[x'= x R y *cotan<p
yQ ^y
i corespunztor, matricea transformrii de nclinare este:
[1 cotanep
(4-22) O =
Aceast operaie se obine prin concatenarea a trei
transformri elementare. 6..&. 0%alarea dup4 o ax4
Transformarea de scalare distorsioneaz un obiect prin
modificarea dimensiunilor sale dup o singur direcie (figura 4-
6).
(a) $&% (c)
.igura 6#:. 0%alarea dup4 o ax4/ *a+ figura ini"ial4, *b+
figura s%alat4 dup4 axa K, *%+ figura
s%alat4 dup4 axa [.
Matricile corespunztoare transformrilor de scalare
corespunztoare axei X, respectiv Y, sunt:
(4-23) 0'
&4-21/
1
1 a 1 0
0 1
0
, respectiv:
0Oy ^
b 1
0
0 0 0 0
6..6. 8eflexia
Transformarea care produce imaginea n oglind a obiectelor n
raport cu o ax, un punct sau o linie este definit ca reflexie. n
cazul transformrilor 2D, se pot identifica urmtoarele cazuri de
reflexie: fa de axa X, respectiv Y, fa de un punct (n
particular fa de origine) i fa de o dreapt.
Matricea transformrii de reflexie fat de axa X:
(4-24) 8x =
" 0
0 -1
0 0 0
1
131
Ciprian-Daniel NEAGU, Severin BUMBARU
Matricea transformrii de reflexie fa de axa Y:
-
1
0 0
0 1 0
0 0 1
(4-25) 8K ^
Matricea transformrii de reflexie fa de originea sistemului de
coordonate:
X-1 0 0F
0-10 0 0
1
Reflexia fa de dreapta y ^ x este descris de matricea:
0 1 0
1 0 0
0 0 1
(4-27) 8yVV`
YKAppI%' G-%"%@ R%=#%3U>--O.3-!.. -Bl-lDlxl
Apptet
On/Off Clear | About fBlack j]
Applet started.
.igura 6#;. Applet#ul 8efle%tion/ un exemplu de
rota"ie a obie%telor Hn sistemul de
%oordonate !.
Un exemplu care realizeaz reflexia punctelor unui obiect
'freehand' 2D este applet-ul ReflectionD (v figura 4-7). Applet-ul
ReflectionD (fiierul ReflectionD.java) conine un obiect al clasei
ReflectionDisplay (extensie a clasei Canvas). Applet-ul are
dou moduri de interaciune cu utilizatorul: modul 0 permite
desenarea obiectului (figura 4-7), modul 1 permite modificarea
culorii ce caracterizeaz reflexia. Schema de culoare poate fi
schimbat folosind setul de parametri ai etichetei HTML care
apeleaz applet-ul. Obiectul ReflectionDisplay este iniializat ca
suprafa pentru desenare. Toate fiierele surs necesare sunt
adugate n anexa . MyMath.java: este o colecie de funcii
matematice necesare n calculele geometrice. Metodele sunt
declarate public static (nu e necesar o instan MyMath).
Trebuie reamintit c sistemul de coordonate relativ este stnga
(4-26) 8B ^
sus, deci sunt necesare transformri corespunztoare.
132
Transformri geometrice
Applet 6#&. Clasa 8efle%tion! *fi5ierul
8efle%tion!.$ava+ pentru implementarea modurilor de
%ontrol al %ara%teristi%ilor de reflexie !.
A)(ef+ectionD.java)A
import
java.app+et.),
import j ava.a-t.),
import
java.a-t.image.),
import java.utii.),
pu.+ic c+ass (ef+ectionD e/tends 'pp+et
imp+ements !utton;ane+Rost0
int state50,
Image -or4space,
6raphics off@creen,
:ont my:ont 5ne- :ont(<@ans@erif<&
:ont.;%'IN& 18
Co+or canvasco+ 5 ne- Co+or(2II& 2II&
2II,
!utton;ane+D .ut;an,
(ef+ectionDDisp+ay disp+ay,
pu.+ic void init(0 int
co+i& co+2& co+*,
set%ayout(ne-
!order%ayout(I&I,
set:ont(my:ont, try0
co+i 5
Integer.parse+nt(get;arameter(<(ed<,
co+2 5
Integer.parse+nt(get;arameter(<6reen<,
co+* 5
Integer.parse+nt(get;arameter(<!+ue<,
canvasco+ 5 ne- Co+or(co++& co+2& co+*,
M
catch(=/ception e0M
set!ac4ground( canvasco+,
-or4space5createImage(siQe(.-idth& siQe9
.height&F
off@creen5-or4space.get6raphics(,
addCNNorth<& .ut;an5ne- !utton;ane+D(this,
add(<Center<& disp+ay5ne-
(ef+ectionDDisp+ay(this,
M
pu.+ic void start(0
disp+ay.setMa/(,
.ut;an.turnoff(,
M
pu.+ic void stop(0M
pu.+ic void
response(int i0 s-itch
(i0 case 2 :
repaint(, .rea4, case
* : disp+ay.c+ear(,
repaint(, .rea4, case
8 :
1**
Ciprian-Daniel NEAGU, Severin BUMBARU
M
M
disp+ay.paint'.out( .rea4,
pu.+ic void
turnoff(0
state50,
disp+ay.turnoff (
,
pu.+ic void turnon(0
state 1,
disp+ay.turno
n(,
M M
c+ass
(ef+ectionDDi
sp+ay
e/tends
Canvas 0
priva int disp+ay@tate50& ma/B&
priva int gema50& captive50&
priva int .rush+nde
priva Ima frontImag
priva Ima .rushes
priva Mirror ref+ector& ref+ector2,
priva (ef+ectionD host,
priva fin in !($@R7@I> 5 20,
priva fin in !($@R7'(= 5 !($@R7@I>= ) @I
priva fin in (=D 5
priva fin in 6(==N 5
priva fin in !%$= 5
priva fin in G=%%9_ 5
priva fin in M'6=N3' 5
priva fin in CG'N 5
priva fin in !%'C# 5
priva fin in 6('G 5
priva fin in _RI3= 5
pu.+ic (ef+ectionDDisp+ay ((ef+ectionD h
int inde/& i& j,
int a+pha,
Memory+mage@ource mis, host5h,
set!ac4ground( h.canvasco+, inde/
5 0,
- 2' (* (* .>13%. < 2%" -2'(9* (BRUSIBAR8A* => &K<00
KCBRUSIBSIV80 K DD/ E => &-<00 -CBRUSIBSIV80 -DD/E
a+pha 5 get'+pha(i& j,
a+pha JJ5 28,
sources1(=D21inde/2
sources16(==N21inde/2
sources1!%$=21inde/2
1*8
5 9/99ff9999 K
a+pha, 5
9/9999ff99 K
9/999999ff K a+pha,
Transformri geometrice
sources1G=%%9_2 1inde/2 5 9/99ffff99 K
a+pha,
sources1M'6=N3'21inde/2 5 9/99ff99ff K
a+pha,
sources1CG'N21inde/2 5 9/9999ffff K a+pha,
sources1!%'C#2 1inde/2 5 0/00000000 K
a+pha,
sources16('G21inde/2 5 0/00.D.D.D K a+pha,
sources1_RI3=2 1inde/2 5
9/99ffffff K a+pha,
inde/KK,
M
M
.rushes 5 ne-
Image1U2, for (i50,
iJU, iKK0
mis 5 ne- Memory+mage@ource(!($@R7@I>=&
!($@R7@I>=&
sources1i2& 0& !($@R7@I>=,
.rushes1i2 5
create+mage(mis, M M
int get'+pha(int /& int y0
dou.+e de+taB 5 (dou.+e(/ F !($@R7@I>=A2,
dou.+e de+taG 5 (dou.+e(y F !($@Rb*I>=A2,
dou.+e distance 5
Math.s[rt(de+taB)de+taB K
de+taG)de+taG,
dou.+e fracDistance 5 distance A
(!($@R7@I>=A2,
if (fracDistance Z 1.0 fracDistance 5 1.0,
fracDistance 5 1.0 F fracDistance,
fracDistance 5 Math.po-(fracDistance& C,
return (int(2II )
fracDistance, M
pu.+ic void update(6raphics g0paint(g,M
pu.+ic void paint(6raphics g 0
if(disp+ay@tateZ5+
0g.dra-+mage(frontimage&0&0&this ,
e+se0 g. setCo+or(get!ac4ground( ,
g.fi++(ect(0&0&ma/B&ma/G ,
g.setCo+or(get:oreground( ,
M
.usy50,
M
pu.+ic .oo+ean mouseDo-n(=vent e& int /& int
y0
return mouseDrag(e&
/& y, M
pu.+ic .oo+ean mouseDrag(=vent e& int /&
int y0 if (disp+ay@tate550 return true,
int /ne-& yne-, / F5 !($@R7@I>=A2, y F5
!($@R7@I>=A2, ;oint
ne-/y5ref+ector.ref+ection(ne-
;oint(/&y,
Ciprian-Daniel NEAGU, Severin BUMBARU
Image .rush 5
.rushes1host..ut;an.getChoice(2,
host.off@creen.dra-+mage(.rush& /& y& this,
host.off@creen.dra-+mage(.rush& ne-/y./&
ne-/y.y& this, refresh(, return true, M
pu.+ic void paint'.out(0
host.off@creen.setCo+or(get!ac4ground(
,
host.off@creen.fi++(ect(0&0&800&2I0,
host.off@creen.setCo+or(Co+or..+ac4,
host.off@creen.dra-@tring(<'pp+et
(ef+ectionFdemo<&20&20,
host.off@creen.dra-@tring(<Computer
6raphics<&20&80, setimage(host.-or4space,
M
pu.+ic void
turnoff(0
disp+ay@tate50 ,
repaint(,
M
pu.+ic void
turnon(0
disp+ay@tate5+,
repaint ( &F
M
pu.+ic void
setMa/(0
ma/B5siQe(.-idt
h,
ma/G5siQe(.heig
ht,
ref+ector 5 ne- Mirror ( ne- ;oint( (int
(ma/BA2&0& ne- ;oint( (int
(ma/BA2&ma/G,
ref+ector2 5 ne- Mirror ( ne- ;oint( 0&(int
(ma/GA2 & ne- ;oint(ma/B& (int(ma/GA2,
refresh(, M
pu.+ic void c+ear(0
host.off@creen.setCo+or(get!ac4ground
( , host.off@creen.fi++(ect(0& 0&
siQe(.-idth& siQe(.height,
refresh(,
M
private void setimage(Image I0
frontImage 5 I ,
repaint(
, M
private void ref resh (0 setimage (host.
-or4space &F M M
1*C
Transformri geometrice
6..9. Ca)uri parti%ulare
Facem n continuare o succint trecere n revist a ctorva
cazuri particulare ale transformrilor discutate anterior i a
algoritmilor caracteristici
8ota"ia unui obie%t Hn $urul unei drepte arbitrare paralele %u una
din axele de %oordonate.
Algoritmul presupune parcurgerea urmtoarelor etape:
#1. Translatarea obiectului astfel nct axa de rotaie s
coincid cu axa de ordonate.
#2. Rotaia dup ax.
#3. Translatarea invers n vechea poziie.
8ota"ia unui obie%t dup4 una dintre axele de %oordonate
*axa de rota"ie %orespunde %u o ax4 a sistemului de
%oordonate+.
Algoritmul presupune particularizarea etapelor descrise mai sus:
#1. Rotaia axei pentru a deveni paralel cu una din axele de
coordonate.
#2. Se aplic algoritmul anterior.
#3. Rotaia invers a axei ctre poziia iniial.
Asem4narea
Scalarea afecteaz distanele dintre puncte. Un
caz particular al scalarii este asemnarea, pentru care factorii
de scal sunt egali: Sx scalarii tridimensionale generale este:
"Sx 0 0 0
0 Sy 0 0
0 0 Sz 0
0 0 0 1
Cazurile particulare de scalare (simetriile) sunt caracterizate de
apartenena Sx, Sy i Sz la mulimea {-1, 1}. Obinem astfel:
a) Simetria fa de unul din planele definite de axele de
coordonate. Spre exemplu, simetria punctului considerat
fa de planul xOy, caracterizat
de matricea Sxoy pentru care Sx = Sy = 1,
(4-29) 0Foy = 1.90. 0
1.91. 0 0 -1 0 0
b) Simetria fa de o ax a sistemului de coordonate. Spre
exemplu, simetria fat de axa y, definit de matricea Sy
pentru care Sy = 1, Sx = Sz = -1:
137
Sy = Sz. Matricea
(4-28) S =
-1@
Ciprian-Daniel NEAGU, Severin BUMBARU
(4-30) 0y = -10 0 0 0 10 0 0 0-10 0 0 0 1
c) Simetria fa de originea sistemului de coordonate,
caracterizat de matricea So pentru care Sx =
Sy = Sz = -1:
-1 0 0 0F 0 -
1 0 0 0
0 - 1 0 0
0 0 1
6..:. 7ransform4ri afine inverse
O clas de operaii importante o reprezint $ran#,(r%/rile
a,ine inver#e7 Fie transformarea:
(4-32) P'=/r
1
.P.
Atunci transformarea afin invers este definit de relaia:
(4-33) P = y4"
1
P.
4.3. Sisteme carteziene de referin
Pentru realizarea aplicaiilor grafice, trebuie definite sistemele
de coordonate carteziene de referin. Acestea permit
descrierea transformrilor n urma crora un obiect sau o
imagine din lumea real i gsete reprezentarea (virtual)
ntr-un sistem de coordonate caracteristic dispozitivului grafic
utilizat n acest scop.
1.92. Si#$e%&l 'e )((r'(na$e al l&%ii reale (pentru care
observatorul este centrul sistemului) poart numele de WCS
(World Coordinate System). WCS realizeaz reprezentarea
unui obiect definit prin uniti fizice de msurare. Pentru WCS,
fereastra se definete ca dreptunghiul ce delimiteaz acea
poriune a lumii reale pe care o dorim a fi reprezentat folosind
dispozitivul grafic (figura 4-8).
1.93. Si#$e%&l 'e )((r'(na$e al &n&i 'i#p(5i$iv +ra,i)F
DCS (Device Coordinate System) reprezint spaiul virtual n
care este reprezentat imaginea.
1.94. Si#$e%&l 'e )((r'(na$e n(r%ali5a$e al 'i#p(5i$iv&l&i
+ra,i)F NDCS (Normalized Device Coordinate System). Se
definete, pentru dispozitivul grafic de reprezentare, fereastra
de afiare ca dreptunghiul de pe dispozitivul grafic ce definete
locul n care apare imaginea (implicit, este ntregul ecran).
Transformarea de coordonate din S1 n S2 este un obiectiv
realizat de sistemele grafice. Majoritatea aplicaiilor grafice
utilizeaz, pentru portabilitate, S3 (considernd un dispozitiv
grafic virtual de reprezentare). Acest dispozitiv virtual de
reprezentare este ptratul unitate din S3 ce are colul din stnga
jos n originea sistemului. Valorile exprimate n uniti ale
dispozitivului virtual sunt transformate n valori ale S2 prin
intermediul funciilor dispozitivului grafic. n
138
(4-31) 0o##
Transformri geometrice
consecin, pentru o procesare grafic a unei imagini din lumea
real, sunt necesare: aplicaia grafic, drive-ul software pentru
dispozitivul grafic folosit pentru reprezentare i dispozitivul de
afiare.
.igura 6#>. Cara%teri)area unei ferestre de vi)uali)are
in NC0.
Transformarea de vizualizare este procesul de reprezentare a
imaginii ncadrate de o fereastr din WCS ntr-o fereastr de
afiare a DCS (informaia din afara zonei vizualizate din cadrul
ferestrei este practic decupat, v. figura 4-8). Pachetele de
programe grafice trebuie s efectueze transferul din
coordonatele lumii reale (ce desemneaz fereastra) n
coordonatele ecranului (zona de lucru).
Algoritmul de caracterizare a procesului de transfer a unei
imagini din coordonate WCS n coordonate DCS este
caracterizat de urmtoarele etape (figura 4-9):
#1. dentificarea ferestrei n coordonate WCS (caracterizat prin
decupare);
#2. Translatarea ferestrei n originea sistemului de coordonate
DCS;
#3. Scalarea ferestrei la dimensiunea zonei de lucru;
#4. Translatarea imaginii n zona de lucru.
Ferestrele i zonele de lucru se caracterizeaz prin punctele
(colurile) stnga sus i dreapta jos; prin urmare se pot
identifica obiectele: Fereastra((xmir,,ymin),(xmaXlymax)) i
Zona_de_lucru((x
min.ymin)i(Xmax.ymax)).
pentru care:
(4-34) 0<=Xmin<=Xmax<=1 i 0<=ymin<=ymax<=1.
139
Fereastra (din lumea reala) Fereastra de vizualizare
Ciprian-Daniel NEAGU, Severin BUMBARU
dentificarea ferestrei in WCS Decuparea ferestrei in
WCS Translatarea in
origine
Scalarea in fereastra de
vizualizare
Translatare pentru
poziionare in DCS
.igura 6#@. 7ransferul unei imagini din %oordonate NC0
Hn %oordonate
#C<-
Matricea transformrilor Fereastr-Zona_de_lucru poate fi
calculat prin concatenarea transformrilor descrise n relaia
(4-4), regsit n:
(4-35) PQ ^ 2 P, unde:
(4-36)M = 7(xmin,ymin).S
Z max
%%
2 max
L %%
max .
1 min L
Z *mirv 3
%in L
Observaie: n cazul construirii unei imagini n afara limitelor
spaiului vizibil pot apare primitive care s intersecteze frontiera
ferestrei (vezi figura 4-9). Pentru astfel de primitive este
necesar eliminarea poriunilor neobservabile. Aceast operaie
se numete decupare *%lipping+.
Pentru o mai bun nelegere a procesului de transfer din WCS
n DCS, s considerm exemplul din figura 4-10.
?V"V@
?7X7 I@
?" U0-
4-------
--,
Q,
ferea
X 7X@
?X"
y,
?!72V@D ?*7"2@ ?"7X@ (10,5) ?X" X@
140 ?7@ ;]7 W
.igura 6#1B. Un %a) parti%ular de transfer din NC0
Hn !C0.
Transformri geometrice
n acest caz, matricea transformrii compuse se obine ca
rezultat al urmtorului calcul matriceal:
(4-37) 0
0.5 1
Q 0 0 1 -
0 1Q50
0
Z 0
1
-
5 0 0 0 1
corespunztor transformrilor (n ordinea invers a executrii
multiplicrii matriceale): (1) translatarea ferestrei n originea
sistemului de coordonate, (2) scalare la dimensiunea cerut, (3)
translatarea ferestrei de vizualizare la coordonatele cerute.
4.4. Transformri tridimensionale
Pentru cazul reprezentrilor tridimensionale (pe scurt 3D),
matricea de reprezentare va avea dimensiunea 4x4 n
coordonate omogene.
Prin transformarea de omogenizare a unui punct P(x, y), definit
n coordonate 3D, se asociaz un punct (x, y, z, (+ n
coordonate omogene cu proprietatea c dou cvatuple
reprezint acelai punct dac coordonatele specifice sunt
proporionale. Reprezentarea standard a unui punct n
coordonate omogene (x, z, y, (+ este, pentru toate punctele cu
( * 0: *xA(, )A(, yA(, 1).
Vom trece n continuare n revist i vom caracteriza
principalele transformri definite anterior pentru spaiul
bidimensional.
6.6.1. 7ransla"ia. 8ota"ia. 0imetrii. Hn%lin4ri.
Translaia tridimensional de valori Dx, !y, !), este caracterizat
n spaiul tridimensional de matricea:
(4-38) 7*!F,!y,!)+ ^ 1 0 0 )A
0 1 0 )y
0 0 1 )L
0 0 0 1
Rotaia n spaiul tridimensional se descompune n maximum trei
rotaii dup fiecare ax a sistemului 3D. Convenia de semn
(pozitiv) este pentru axa Z de la axa X ctre axa Y, pentru axa Y de
la axa Z ctre axa X, pentru axa X de la axa Y ctre axa Z. Matricile
de transformare pentru rotaia dup fiecare ax sunt 8x (rotaia
dup axa X), 8y (rotaia dup axa Y), 8) (rotaia dup axa Z):
F 1 0 0 0F
0 cose -sin9 0
0 sine cose 0
0 0 0 1
cose 0 -sine o
0 10 0
sine 0 cose o
0 0 0 1
141
(4-39) Rx
(4-40) 8y =
Ciprian-Daniel NEAGU, Severin BUMBARU
&4-41/ RL
co
sO
-
sin0
0 0
sin
O
cos
G
0 0
0 0 1 0
0 0 0 1
Vom exemplifica conceptele de rotaie i scalare a unui obiect
3D prin aplicaia urmtoare. Dimensiunea obiectului poate fi
modificat prin scalare folosind scroll-bar. Obiectul, "agat" cu
mouse-ul, poate fi rotit n jurul originii sistemului su de
coordonate. Rezultatul aplicaiei este afiat n secvenele din
figura 4-11, pentru a urmri att rotaia ct i scalarea.
-I2- A[ -Pxl
V>>$ C I & \K V>>$ 0 ( I *i
OX
(a) (b)
-il
AppW
Zo
om
'
_JJ_
d
Appiel
s tarte
d
IS8BS8S88
$5%
(<)
142
.igura 6#11. 8e)ultatul applet#ului 8otation/ *a,b+ se%ven"e
de rota"ie &!, *%,d+ obie%tul s%alat &! 5i rotit
&!.
-;O#4#
Transform ri geometrice
Applet 6#6. 8otation.$ava/ s%alari 5i rota"ii &! ale unui
obie%t.
import java.a-t.),
import
java.a-t.event.),
import java.uti+.),
pu.+ic c+ass (otation e/tends
java.app+et.'pp+et imp+ements
MouseMotion%istener& 'ction%istener&
'djustment%istener 0 3e/t:ie+d >oom&F
dou.+e /& y& Q, int B& G& /c& yc, int
_idth& Reight,
dou.+e theta50.0& phi5*.181IU2CA12&
Qoom51.0, dou.+e data12 125ne- dou.+e
1I02 1I02 , int po+y/125ne- int 1C2 &
po+yy125ne- int 1C2, ;o+ygon po+y, int
ang+e, Image offscreen+mg, 6raphics
offscreen6, Co+or myco+or, @cro++.ar
.ar, pu.+ic void init(0 %a.ei
>99M5ne- %a.ei(<>oom :<, add(>99M,
.ar5ne-
@cro++.ar(@cro++.ar.R9(I>9N3'%&0&1&0&100,
.ar.add'djustment%istener(this ,
add(.ar,
_idth5siQe(.-idth
,
Reight5siQe(.heig
ht, /c5(_idthA2,
yc5(ReightA2,
addMouseMotion%istener(this,
offscreen+mg5create+mage(this.siQe(.-idth&this
.siQe( .height,
offscreen65offscreen+mg.get6raphics(,
M
pu.+ic void paint(6raphics g0
offscreen6.c+ear(ect(0& 0& _idth& Reight,
offscreen6.setCo+or(Co+or..+ac4,AAdra-
a/es
/5(100.0AQoom, y50.0, Q50.0,
Bform8(/& y& Q,
offscreen6.dra-%ine(/c& yc& /cKB& ycFG,
/5(100.0AQoom, y5(10.0AQoom, Q50.0,
Bform8(/& y& Q,
int '5/cKB& !5ycFG,
/5(100.0AQoom, y5(F10.0AQoom, Q50.0,
Bform8(/& y& Q,
offscreen6.dra-%ine('& !& /cKB& ycFG,
/50.0, y5(100.0AQoom, Q50.0,
Bform8(/& y& Q,
'5/cKB, !5ycFG,
18*
Ciprian-Daniel NEAGU, Severin BUMBARU
offscreen6.dra-%ine(/c& yc&
'& !, /5 (10.0AQoom ,
y5(100.0AQoom , Q 5 0.0,
Bform8(/& y& Q, '5BCKB,
!5ycFG,
/5 (F10.0AQoom , y5(100.0AQoom
, Q 5 0.0, Bform8(/& y& Q,
offscreen6.dra-%ine('& !& /cKB&
ycFG, /50.0, y50.0,
Q5(100.0AQoom , Bform8(/& y& Q
, '5/cKB, !5ycFG,
offscreen6.dra-%ine(/c& yc&
'& !, /5 (10.0AQoom ,
y50.0, Q5(100.0AQoom,
Bform8(/& y& Q , '5BCKB,
!5ycFG,
/5(F10.0AQoom, y50.0,
Q5(100.0AQoom, Bform8(/& y&
Q ,
offscreen6.dra-%ine ('& !& /cKB&
ycFG, for (int n50, nJ (int
(I0 . 0AQoom &F nK5+ 0
for (int m50, mJ(int(I0.0AQoom,
mK5+0 data1n2 1m25h(n&
m , M
:
=>
&-2'
2<00
=> &-2'
2C4 60 2D<4/E $<00
$C460 $D<4/E
$y3>#> < 2%" 6>#>&0+ 0+
&-2'/&&&d!'!=2*($*/P2/D100. 0/ /0
>==.3%%25..%'6>#>&$y3>#>/
X=>$4&2+ $+ d!'!(2*($*/0
p>#yA(0*<&A3DX/
p>#yy(0*<&y3-7/
X=>$4&&2D4/+ $
p>#yA(1*<&A3DX/
p>#yy(1*<&y3-7/
X=>$4&2+ &$D4/
p>#yA(2*<&A3DX/
p>#yy(2*<&y3-7/
X=>$4&&2D4/+ &$D4
d!'!'&2D4/*(&$D4/*/
p>#yA(3*<&A3DX/0
p>#yy(3*<&y3-7/0
X=>$4&2+ & $D4/ + d!'!(2*(&D$D4/*
p>#yA(4*<&A3DX/0
p>#yy(4*<&y3-7/0
p>#y<2%" N>#yg>2&p>#yA+ p>#yy+ 5
>==.3%%25.=-##N>#yg>2&p>#y/0
Bform8(n& m& data1n21m2,
po+y/1025(/cKB,
po+yy1025(ycFG,
Bform8( (nK8 & m& data1(nK82 1m2
po+y/1125(/cKB,
po+yy1125(ycFG,
Bform8(n& (mK8& data1n21(mK82
188
d!'!(&2D4/*($*/0
d!'!(2*(&$D4/*/0
Transformri geometrice
po+y/1225(/cKB, po+yy1225(ycF
G, Bform8((nK8& (mK8&
data1(nK821(mK82,
po+y/1*25(/cKB
,
po+yy1*25(ycF
G,
Bform8((nK8 & m& data
1 (nK82 1m2 ,
po+y/1825(/cKB,
po+yy1825(ycFG,
po+y5ne- ;o+ygon(po+y/& po+yy& I,
offscreen6.fi++;o+ygon(po+y, M M
g.dra-+mage(offscreen+mg&0&0&this,
M
pu.+ic void Bform8(int /& int y& int Q 0
B 5 (int
(Qoom)((/)(Math.cos(theta
K (y) (Math. sin
(theta &F
G 5 (int(Qoom)((((/)(Math.sin(theta
K (F
y)(Math.cos(theta)(Math.sin(phi
K (Q) (Math. cos (phi &F
M
pu.+ic void Bform8(dou.+e /& dou.+e y&
dou.+e Q0 B 5 (int
(Qoom)((/)(Math.cos(theta K
(y)(Math.sin(theta,
G 5 (int(Qoom)((((/)(Math.sin(theta
K (F
y)(Math.cos(theta)(Math.sin(phi
K (Q)(Math.cos(phi,
M
pu.+ic dou.+e h(int /& int y0
return ((dou.+e(((/)/K(y)yAF
D0K20,
M
pu.+ic void mouseMoved(Mouse=vent e0M
pu.+ic]void mouseDragged(Mouse=vent e0
int a5(/cF(e.getB9 ,
int .5 (ycF (e.getG9 ,
theta5F(*.181IU2CA8F
((dou.+eaA(dou.+eyc)(*.181IU2CA2,F F
phi5 F((dou.+e.A
(dou.+eyc)(*.181IU2CA2 ,
repaint(,
M
p19#-3 v>-d !3'->2N%=>$%d&A3'->28v%2' %/
E L>>$<)>19#%.v!#1%O=&V>>$.g%'T%A'&//.d>19#%G!#1%&/0
%p!-2'&/0
:
pu.+ic void
adjustment"a+ueChanged('djustment=vent e
0 Qoom5(e.get"a+ue(AI9, repaint(,
M
pu.+ic void update(6raphics g0paint(g,M
M
18I
Ciprian-Daniel NEAGU, Severin BUMBARU
____________________________________________________
Pe baza definiiilor i a relaiilor ce definesc transformrile de
rotaie i translaie 3D, pot fi trecui n revist algoritmi de
definire a #i%e$riei unui punct n spaiul tridimensional ca
transformare compus: simetria punctului fa de un alt punct
dat n spaiul 3D, fa de o dreapt dat, respectiv fa de un
plan dat.
Algoritm pentru reali)area simetriei unui pun%t fa"4 de un pun%t
dat Hn spa"iul &!/
#1. Translaia sistemelor de coordonate astfel nct originea s
corespund cu punctul de simetrie.
#2. Transformarea de simetrie fa de origine
#3. Translaia invers.
Algoritm de reali)are a simetriei unui pun%t fa"4 de o dreapt4
oare%are Hn spa"iul &!/
#1. Roto-translaia sistemului de coordonate astfel nct o ax
de coordonate s corespund cu axa de simetrie
#2. Realizarea simetriei fa de respectiva ax.
#3. Roto-translaia invers.
Algoritm de %ara%teri)are a transform4rilor de simetrie a unui
pun%t fa"4 de un plan oare%are
#1. Translatarea sistemului de referin astfel nct un plan de
coordonate s coincid cu planul de simetrie.
#2. Rotaia sistemelor de referin referin astfel nct un plan
de coordonate s coincid cu planul de simetrie.
#3. Aplicarea simetriei fa de respectivul plan de coordonate
#4. Roto-translaia invers.
Alte cazuri de simetrii, considerate transformri compuse, se
pot Sxprima ca produs de simetrii fa de planele de
coordonate. Spre exemplu:
- Simetria fa de o ax reprezint concatenarea simetriilor fa
de planele ^e crordonate a cror intersecie este axa
respectiv.
- Simetria fa de origine reprezint concatenarea simetriilor
fa de cele trei plane de coordonate.
- Dac se consid.er ca primitiv grafic simetria fa de un
singur plan de coordonate t transformarea de rotaie, atunci
simetriile fa de celelalte dou plane de coordonate
reprezint concatenarea unei simetrii fa de planul de
coordonate ales i rotaii de multipli de 90 pentru
suprapunerea planelor de coordonate.
Similar, matricea transformrii de *n)linare fa de un plan
(spre exemplu, planul xOy) este:
146
Transform ri
geometrice
(4-42) OFy*'F,'y+ 1 0 'F 0
0 1 'y 0
0 0 10
0 0 0 1
Prin analogie se pot caracteriza transformrile de nclinare fa
de celelalte plane ce definesc sistemul de coordonate cartezian
3D.
6.6.. Proie%"ii
Complexitatea calculului n aplicaii grafice orientate 3D este
datorat celei de-a treia dimensiuni din WCS comparativ cu
reprezentarea bidimensional n NDCS. Soluia aplicat este
folosirea proieciilor ca aplicaii de transformare a obiectului 3D
n obiectul 2D.
Pr(ie).ia &n&i (4ie)$ $ri'i%en#i(nal se definete astfel:
razele de proiecie (numite proie%torc+ trec printr-un punct dat al
spaiului (numit %entru de proie%"ie+ i prin fiecare punct al
obiectului, intersectnd planul de proiecie pe care se realizeaz
proiecia.
Proieciile
plane pot fi
paralele sau
perspe%tive. Acestea difer prin
distana dintre centrul de
proiecie i planul de proiecie.
Dac distana este finit se
obine pr(ie).ia per#pe)$iv/ (figura 4-12); dac distana este
infinit se obine pr(ie).ia paralel/ (figura 4-13). Proiecia
perspectiv este caracterizat de poziia centrului de proiecie i
de planul de proiecie. Proiecia paralel este caracterizat de
direcia de proiecie i de planul de proiecie.
.igura 6#1&. Proie%"ie paralel4 a segmentului relativ la
dire%"ia de
proie%"ie.
Prin parametrizarea definiiilor proieciilor, se obin diferite
cazuri particulare: proiecia perspectiv cu un punct de fug, cu
dou puncte de fug, cu trei puncte fug; proiecia paralel
ortografic (elevaie, plan, profil, axonometric -izometric),
respectiv oblic (cabinet, cavalier, alte cazuri).
147
.igura 6#1. Proie%"ie perspe%tiv4 a segmentului
relativ la %entrul de
proie%"ie.
Ciprian-Daniel NEAGU, Severin BUMBARU
A. Proie%"ia perspe%tiv4
Proiecia perspectiv este caracterizat de poziia centrului de
proiecie i de planul de proiecie (figura 4-12). Astfel, liniile
paralele ntre ele i neparalele cu planul de proiecie converg
spre un punct de fug (figura 4-14). Dac liniile sunt paralele cu
axele principale, punctul de fug se numete pun%t de fug4
axial. ntr-o asemenea proiecie pot exista cel mult trei puncte
de fug.
Spre exemplu, dac planul de proiecie intersecteaz axa Z
atunci doar aceast ax are punct de fug, ntruct liniile
paralele cu axele Y i X sunt paralele i n planul de proiecie
(nu au puncte de fug). Din acest motivul, numrul punctelor de
fug reprezint un criteriu important de clasificare a proieciilor
perspective. n practic, proieciile perspective cu dou puncte
de fug se folosesc n proiecia arhitectural i industrial.
.igura 6#16. Proie%"ii perspe%tive.
n funcie de nclinarea planului de proiecie fa de centrul de
proiecie i de obiect pot fi identificate dou tipuri de proiecii
perspective:
1.95. Per#pe)$iv/ a#)en'en$/ (punctul de fug este situat
deasupra obiectului): este cazul centrului de proiecie privind
obiectul de jos i aproape.
1.96. Per#pe)$iv/ 'e#)en'en$/ (punctul de fug este situat
sub obiect): este cazul centrului de proiecie privind obiectul de
sus i aproape.
Pentru determinarea coordonatelor n perspectiv pentru un
punct se rezolv
sistemul format de ecuaia planului de proiecie i ecuaia razei
vizuale. Acest
mod de procesare conduce la calcule greoaie, necesitnd un
efort de calcul
semnificativ. -
1. Proie%"ia paralel4
n funcie de unghiul dintre direcia de proiecie i normala la
planul de proiecie, proiecia paralel poate fi:
B.1. Pr(ie).ia paralel/ (r$(+ra,i)/ - dac direcia de proiecie
coincide cu normala la planul de proiecie. n acest tip de
proiecie se folosete ca plan de proiecie un plan perpendicular
pe axele de coordonate, obinndu-se proieciile: vedere plan
(sau vedere de sus), vedere profil (sau vedere lateral)
148
Transformri geometrice
i vedere frontal4 (sau elevaie). Aceste proiecii au proprietatea
de a pstra distanele i unghiurile, dar cele trei figuri rezultate
nu dau informaii detaliate despre natura tridimensional a
obiectului.
Pentru punctul P de coordonate omogene (x,y,z,1) aparinnd
obiectului ce va fi supus proieciei ortografice obinem
urmtoarele transformri:
B.1.1. Vederea frontal
(4-43)VFxoy = 10 0 0
0 10 0
0 0 0 0
0 0 0 1
(dispare axa Z din reprezentare).
Matricea din relaia (4-43) caracterizeaz sistemul de
transformri:
x'= x
(4-44) E yQ ^y
5=3%
1A.. Vederea de sus
Transformarea compus este o combinaie ntre o rotaie de 90
n jurul axei X i proiecia pe planul xOy.
(4-45)VS =
VFPXOY =
[10 0 [1 0
X
0 10 0 0
, astfel VQ
0 0 0
0
0-100 7'
=0 0 0 0 _
B.1.3. Vederea lateral
Folosete transformrile: rotaie de unghi 90 n jurul axei Y i
proiecie pe planul xOy:
(4-46) VL
=
1 0 0 0
0 1 0 0
0 0 0 0
0 0 0 1
0
0
1 0 [x'=
z
0
1
0 0 , astfel
nct
yQ^
y.
-1
0
0 0 z'=
0 0 0 1 ^
B.2. Pr(ie).ie paralel/ (4li)/ - dac unghiul dintre direcia de
proiecie i normala la planul de proiecie este nenuJ.
Astfel de proiecii se obin prin proiectarea unui obiect de-a
lungul unor linii paralele care nu sunt perpendiculare pe planul
de proiecie. Proiecia unei fee a obiectului, paralel cu planul
de proiecie, pstreaz unghiurile i permite msurarea corect
a distanelor iar proieciile celorlalte fee permit doar msurarea
distanelor (figura 4-15).
149
Ciprian-Daniel NEAGU, Severin BUMBARU
Grrid oblic 5-d -L>$%'-3
(a) (b)
.igura 6#19. 0uprafa"a de trasare pentru
proie%"ia/ *a+ obli%4, *b+
i)ometri%4.
Se convine ca o proiecie oblic pe planul xOy s fie
caracterizat prin punctul n care este proiectat punctul M(0,0,1)
pe planul xOy, distana r de la origine pn la proiecie i
unghiul a dintre raza r i Ox. n funcie de aceste valori se pot
exprima coordonatele x', y' i z' ale proieciei oblice pe planul
xOy a unui punct oarecare de coordonate (x,y,z):
n coordonate omogene:
(4-48)
(4-47) u
5 = x R )F r
$ =

y
R )F rF
ina
z'=0
1 0 r*cosa
0
0 1 r*sina
0 0 0 0 0
0 0 0 1
Proie%"ia ortogonal4 este un caz particular al proieciei oblice
(pentru r=0). Alte cazuri particulare: proie%"ia %avalier4 (pentru
r^1+, proie%"ia %abinet (pentru r^V+. n proiecia cavalier
direcia de proiecie face un unghi de 45 cu planul de proiecie.
n consecin, proiecia unui segment de dreapt pe planul de
proiecie are aceeai lungime cu segmentul, dac segmentul
este perpendicular pe plan. n cazul proieciei cabinet, direcia
de proiecie face un unghi arctan(2) cu planul de proiecie. n
consecin, segmentul perpendicular pe planul de proiecie se
proiecteaz la jumtate din lungimea real.
Alte tipuri de proiecii ortogonale sunt proie%"iile axonometn%e
i)ometri%e, pentru care direcia de proiecie face unghiuri egale
cu cele 3 axe ale sistemului de referin iar factorii de scalare
pentru lungimi sunt egali. Proieciile izometrice pot fi realizate
dup opt direcii.
150
Transform ri geometrice
6.6.&. 7ransform4ri proie%tive
S determinm matricea 4x4 caracteristic unei proiecii
oarecare. Se presupune c n proiecia respectiv planul de
proiecie este perpendicular pe axa Z iar pentru proiecia
paralel planul de proiecie este z=0. Fie punctul oarecare
P(x,y,z) i P'(x',y',z') proiecia sa.
Cazul 1. Centrul de proiecie perspectiv se afl n originea
sistemului de coordonate iar planul de proiecie este z = d
(figura 4-16).
.igura 6#1:. Proie%"ie perspe%tiv4 avUnd %entrul de
proie%"ie Hn originea sistemului de
%oordonate.
Relaiile caracteristice rezultate din asemnarea triunghiurilor
generate prin proiectarea punctului P n P' (obiectele mai
deprtate apar mai mici) sunt:
"1 0 0 Ol
(4-49)
z , iar matricea acestei transformri este:
Mpers=
z
!
!
6!
Conform acestei ultime relaii, un punct n coordonate omogene
se exprim prin: (x,z,y,w)
T
=Mpers(x,z,y,1) , iar coordonatele
carteziene asociate punctului omogen se obin prin divizarea cu
(, deci: *x,y,), 1)=(x/w,y/w,z/w,1).
Cazul 2. Centrul de proiecie se afl la )^#d (figura 4-17) iar
planul de proiecie este z=0.
.igura 6#1;. Proie%"ie perspe%tiv4 avUnd planul de
proie%"ie xOy.
151
&0+ 0+ -d/
Ciprian-Daniel NEAGU, Severin BUMBARU
(4-50) ,
z

+
" , iar matricea transformrii devine:
M'
:
y V y
d ) R d
0 10 0 0 0 0
0 0 0 1Qd
1
Acest caz include proieciile paralele: spre exemplu, pentru 1/d
-> 0 se obine
x'= x
proiecia ortografic pe planul z=0 de
ecuaie: yQ^y.
z'=0
3. Planul de proiecie este )^)p iar centrul de proiecie se afl la
distana T de punctele (0, 0, )p+ pe direcia vectorului normalizat
*dx,dy,d)+. Dreapta ce unete centrul de proiecie i punctul P
poate fi descris parametric:
d: Cp + f (P - CP), t e R. Cp e d, prin urmare: Cp = (0, 0, zp) +
T*dx,dy,d)+.
xQ^TFdx R t=x#TFdx+
(4-51)- yQ^TFdy R t*y#TFdy+
)Q^*)p R TFd)+ R t*)CPp R TFd)+
Cum P'e planului: =)#)p+, obinem t=-------- -.
)#*)P R TF d)+
nlocuind t n ecuaiile lui x' i y', se obine matricea
transformrii:
>1 /25/ 1
(4-52) Mgen
1 0
0 1
0 0
0 0
#dx
d) #dy
d)
$z%
TFd) -1
TF d) TFd)
Din expresia (4-52) se pot deduce urmtoarele cazuri
particulare:
)P ^ d
1. Matricea perspectiv se obine pentru E
T ^ d
*dx,dy,d)+ ^ (0,0,-1)
2. Proiecia ortogonal pe planul z=0: 5` ^
; < 0
*dx,dy,d)+ ^ (0,0,-1)
Relaiile caracteristice rezultate din asemnarea triunghiurilor
generate prin proiectarea punctului P n P' sunt:
X1 0 0 0F
.dx
d
)
)Fdy
TF d) R
Pp
- + 1
Zp
152
Transformri
geometrice
3. Proiecia cavalier pe planul
z=0:
4. Proiecia cabinet pe planul
z=0:
LN < 0
T ^ oo
*dx,dy,d)+ ^ (cosa,sina,-1)
LN < 0
T = oo
*dx,dy,d)+ ^ (1/2* cos
a,1/2*sina,-T)
Pentru q * oo, transformarea general Mgen definete o proiecie
perspectiv cu un punct de fug.
Punctul de fug se obine astfel: (XF, yF, ZF)
T
= Mgen (O, O, 1, 0)
T

(prin
[. ^ TFdx
multiplicarea punctului de la infinit de pe axa Z cu Mgen): Ey. ^
TFdy.
ZF 7Z8
6.6.6. 0tru%turi de date pentru repre)entarea obie%telor Hn
spa"iul tridimensional
Pentru a caracteriza un obiect 3D trebuie specificate:
1. pun%tele/ printr-un vector tridimensional de numere reale
pentru
reprezentarea sa n coordonate carteziene sau
quadridimensional pentru
reprezentarea sa n coordonate omogene.
1.97. liniile/ prin referine ctre punctele de sfrit ntr-un
vector de puncte aplicate mulimii punctelor de la aliniatul
anterior.
1.98. suprafe"ele/ prin referinele la linii n mulimea liniilor
definit la etapa anterioar.
y " *
Puncte: 8 Linii: 12 Fete:
6
.igura 6#1>. Cubul unitate.
Fie cubul unitate (figura 4-18) caracterizat de 8 puncte, 12 linii
i 6 fee, cu un vrf n originea sistemului de coordonate
(vrfurile vor fi descrise de coordonatele: (0,0,0), (1,0,0)...). n
cazul n care cubul unitate nu este n origine i nu are feele
paralele cu planele sistemului de coordonate, acestea se obin
aplicnd transformri de rotaie i translaie.
Liniile se caracterizeaz prin perechi de puncte; spre exemplu,
liniai(Oi,02), sau, n mulimea punctelor, liniile se reprezint ca
referine de la fiecare punct la punctele ce caracterizeaz liniile
respective. Feele pot fi numite prin indicii liniilor care le
genereaz - spre exemplu, F^l ,2,3,4), astfel nct o fa se
poate caracteriza prin punctele ce definesc muchiile
caracteristice.
153
Ciprian-Daniel NEAGU, Severin BUMBARU
___________________________________________________
Algoritm pentru afiarea vrfurilor:
=> - C] 1 '> 2Bp3'
d-.p#!yBp>-2' & A( - * + y( - * + L ( - * / 0
Pentru a afia fiecare linie:
=> - C] 1 '> 2B#-2--
=-.'B- C] #-2-%B-2d-3% (=-.'+-* 0
#!.'B- C] #-2-%B-2d-3% (#!.'+-* 0
$>v%B'>&A(=-.'B-*+ y(=-.'B-*+ L( # !.' B- * / 0
d!"B'>&A(#!.'B-*+ y(#!.'B-*+ L (#!.'B-*/ 0
Pentru afiarea unei suprafee:
for i Je 1 to nr7+inii7a+e7suprafeLei1facet2
j Je facet7indice1i2 AApre+ucrarea
indice+ui +iniei first7j ?*
+inie7indice1first& j2, +ast7j Je
+inie7indice1+ast& j 2 , move7to (/1first7j2&
y1first7j2& Q1first7j2, dra-7to (/1+ast7j2&
y1+ast7j2& Q1+ast7j2,
Pentru a afia ntregul obiect nu este necesar afiarea tuturor
suprafeelor deoarece ar conduce la desenarea suprapus a
mai multor linii. Algoritmi din categoria celor descrii anterior
trebuie modificai pentru transformarea coordonatelor (x,y,z) n
coordonatele (Xecran, yecran) folosind transformri perspective
i rutine de afiare pe ecran. Astfel, succesiunea etapelor de
transfer pentru prelucrarea coordonatelor pixelului
corespunztor punctelor (x,y,z) sunt: transformare_3D,
decupare_3D, transformare proiectiv, transformare_2D,
decupare 2_D, transformare din coordonate de fereastr n
coordonate de ecran.
6.6.9. Con%lu)ii privind pro%esarea obie%telor Hn spa"iul
tridimensional
Dezvoltarea algoritmilor pentru manipularea i transformarea
unui obiect 3D ntr-o fereastr de vizualizare pe ecran trebuie
s rspund nainte de procesare la urmtoarele ntrebri:
1.99. Unde este obiectul? (coordonatele 3D: x, y i z);
1.100. Unde este ecranul? caracterizat prin punctul de referin
al ferestrei de vizualizare (vx, vy, vz);
1.101. Unde este planul normal? (care este orientarea ecranului
fa de planul normal);
1.102. Care este dimensiunea ferestrei de vizualizare i unde
este centrul de proiecie?
1.103. Care este direcia de proiecie?
1.104. Cum este reprezentat obiectul?
Prin urmare, transformarea unui obiect 3D necesit: translaia,
rotaia, modificarea axei Z, nclinarea i scalarea, toate aceste
transformri fiind precedate de proiecii. Vom exemplifica prin
aplicaia ViewFrame, care permite observarea unui obiect 3D n
micare (figurile 4-19, 4-20, 4-21) sub o surs de lumin.
Funciunile controalelor i utilizarea appletului sunt descrise mai
jos.
154
Transformri
geometrice
S#, 5M +^;-P^
Morjei jCutj
Reset Rese
Animaie:
Rolti axa
Rsuc axa
Start Stop
Manual
Muta Obie
Metod Tran
Sus Jos
Stng Drea
nunt n
Apple! siarted.
.igura 6#1@. 7ransform4ri &! %u surs4 de lumin4 apli%ate
unui %ub.
mm@sommnmm R%
jnijy
Modelul obiectului: |
Piramida "rl Resa
Camera j Reset
Obiect |
Rotaie dup |
a*aX(CCW) .|J
Rsucire dup: |
axaY(CCW) _^J
~S^art ~ Stop
Muta Cam
Metod Tran
Sus Jos
Stng Drea
nunt n
Applet started
.igura 6#B. 7ransform4ri &! %u surs4 de lumin4 apli%ate unei
piramide.
5M/l"l*l
Model
ul
Res
et
Anima
Rotai
e
dup:
Rsuc
tie:
axa
x
(CC
M
nu
Mula
al:
Cam
Metod
a:
Tran
slai
Stng Drea
nunt n
A^ylel started
.igura 6#1. 7ransform4ri &! %u surs4 de lumin4
apli%ate unei prisme.
155
Ciprian-Daniel NEAGU, Severin BUMBARU
0e%"iunea Obie%te/
Butonul de selecie a figurii geometrice 3D (Modelul obiectului)
permite utilizatorului alegerea unui obiect dintr-o list de trei:
Cub (figura 4-19), Piramid (figura 4-20), Prism (figura 4-21).
La modificarea modelului obiectului, animaia este repornit cu
noul model:
- Butonul Reset Camera aduce camera (observatorul) n
poziia iniial
(stabilit la iniializarea applet-ului);
- Butonul Reset Obiect aduce obiectul n poziia iniial
(originea WCS).
0e%"iunea Anima"ie permite alegerea modului n care se va
realiza micarea:
- Butonul Rota ie (dup) permite alegerea axei i direciei n
jurul creia se va roti obiectul;
- Butonul R sucire (dup) permite alegerea axei i direciei n
jurul creia se va rsuci obiectul (axa trece prin centrul
obiectului);
- Butonul Start pornete animaia;
- Butonul Stop oprete animaia.
0e%"iunea 2anual permite modificarea poziiei obiectului sau
camerei:
- Butonul Mut permite alegerea subiectului care va fi
deplasat, obiectul sau camera.
- Butonul Metoda permite alegerea aciunii ce se va realiza
asupra subiectului (Translaie, Rsucire sau Rotaie). Pentru
varianta Camera, opiunea Rsucire este dezactivat.
- Butoanele de aciune permit realizarea mutrii subiectului, n
condiiile n care nti a fost stopat animaia
(Camera=observatorul poate fi deplasat/ n timpul
animaiei).
- Acionarea mouse-ului permite mutarea (translatarea sau
rsucirea) obiectului n funcie de metoda aleas.
Appietul ViewFrame.java este descris mai jos. Toate fiierele
surs i modelele obiectelor necesare sunt adugate n Anexa
.
Applet 6#9. Vie(.rame.$ava/ obie%t &! in mi5%are, sub o
surs4 de lumin4.
pu.+ic c+ass "ie-:rame0AA sistem de coordonate
spre st`nga AA sistemu+ de coordonate a+
+umii _C@ "ector C9;, AA centru+ de proiecLie
"ector ":>,AA vectoru+ unitate a+ proiecLiei
"ector ":G,AA vector unitate spre @us "ector
":B,AA vector unitate spre Dreapta AA
o.servatoru+
static "ector12 (;,AA punctu+ de referinLa
p+an static "ector12 N",AA "ectoru+ norma+ +a
p+an static int "D,AA distanta +a p+anu+ de
viQua+iQare static int :,AA distanta +a
p+anu+ din fata static int !,AA distanta +a
p+anu+ din spate static f+oat "_,AA +XLimea
ferestrei de viQua+iQare static f+oat "R,AA
ina+timea ferestrei de viQua+iQare static
Matri/ :2@7Matri/,AA Matrice de conversie
1IC
Transformri
geometrice
static Matri/ @2:7Matri/,AA Matrice de conversie
Matri/ _2:7Matri/,AAMatrice de conversie _C@ +a
cadru Matri/ :2_7Matri/,AA Matrice de conversie
cadru +a _C@ pu.+ic "ie-:rame(0AA iniLia+iQeaQX
cadru+
9.f& F2U0.f
C9; 5 ne- "ector(0.
"D 5 2 00,
"_ 5 I00
"R 5 *I0
: 5 20,
! 5 C00,
":> 5 ne- "ector(9.f& 9.f& (f+oat"DA100,
":>.ma4e7vector(,
":B 5 ne- "ector(("_A2A100& 9.f& 9.f,
":B.ma4e7vector(,
":G 5 ne- "ector(9.f
":G.ma4e7vector( ,
N" 5 ne- "ector1C2 ,
NG NG
NG
NG
NG
NG
NG
NG
NG
NG
NG
NG
RN
RN
RN(
RN
RN
RN
RN
5
ne-
"ector(9.f&
.ma4e7vector(, 5 ne-
"ector(9.f& .ma4e7vector(,
5 ne- "ector(9.f&
.ma4e7vector(, 5 ne-
"ector(9.f& .ma4e7vector(,
5 ne- "ector(1
.ma4e7vector(, 5 ne-
"ector(F+.f .ma4e7vector(,
ne- "ector1C2 , ne-
"ector(0 ne- "ector(0 ne-
"ector(0 ne- "ector(0 ne-
"ector(0 ne- "ector(0
:2_7Matri/ 5 ne- Matri/9,
:rame2_or+d(, _2:7Matri/ 5
ne- Matri/9 ,
_or+d2:rame(, :2@7Matri/ 5
ne- Matri/9 ,
(f+oat("RA2A100& 9.f,
+.f, AA p+anu+
apropiat F+.f,AA
p+anu+ depXrtat
+.f,AA p+anu+ de
.
f,
.f,
l.f,
0
o
W
f

AA p+anu+ de jos
AA p+anu+ din
+.f& f& 9.f& 9.f& 1.f,AAp+anu+ dreapta
9.
f&
9.
f&
9.
f&
9.
(f+oat:,AApi
apropiat
(f+oat!,AAp+
depXrtat
0.f,AAp+anu+ de
sus AAp+anu+ de jos
AAp+anu+ din st`nga
9.
f
9.
f
:rame2@creen(, @2:7Matri/
5 ne- Matri/9,
@creen2:rame(,
pu.+ic void :rame2_or+d(0AAseteaQX
:2_7Matri/ int i , for (i 5 0, i J
8, iKK
:2_7Matri/.e+ement1i2102 5
":B.e+ement1i2, for (i 5 0, i J 8,
iKK
:2_ Matri/.e+ement1i2112 5
":G.e+ement1i2,
1IE
Ciprian-Daniel NEAGU, Severin BUMBARU
=> &- < 00 - C 40 -DD/
_2WBM!'-A.%#%$%2'(-*(2* < G_V.%#%$%2'(-* 0
=> &- < 00 - C 40 -DD/
_2WBM!'-A.%#%$%2'(-*(3* < 6ON.%#%$%2'(-*0
:
AAca+cu+eaQX _2:7Matri/& inversa :2_7Matri/
pu.+ic void _or+d2:rame(0
Matri/ m 5 ne-
Matri/(:2_7Matri/,
_2:7Matri/ 5 m.inverse(,
M
pu.+ic void :rame2@creen(0AA seteaQX
:2@7Matri/
:2@7Matri/.reset(,
_2SBM!'-A.%#%$%2'(0*(0* < &GWQ2/Q1000
_2SBM!'-A.%#%$%2'(1* (1* < -&GIQ2/Q1000
_2SBM!'-A.%#%$%2'(0*(3* < GWQ20
_2SBM!'-A.%#%$%2'(1*(3* < GIQ20
:
pu.+ic void @creen2:rame(0AA seteaQX
@2:7Matri/
@2:7Matri/.reset(,
S2_BM!'-A.%#%$%2'(0*(0* < 200 Q GW0
S2_BM!'-A.%#%$%2'(1*(1* < -200 Q GI0
S2_BM!'-A.%#%$%2'(0*(3* < -1000
S2_BM!'-A.%#%$%2'(1*(3* < 1000
:
pu.+ic void 3rans+ate ("ector v0 AA
trans+aLia cadru+ui
C9;.add(v,
:rame2_or+d(,
_or+d2:rame(,
M
pu.+ic void (otateB(int degree0AArotaLie
cadru dupX /
Matri/ m 5 ne- Matri/9,
m. rotate/(degree ,
":>.mu+tip+y(m,
":G.mu+tip+y(m,
":B.mu+tip+y(m,
:rame2_or+d ( &F
_or+d2:rame(,
M
pu.+ic void (otateG (int degree0AArotaLie
cadru dupX y
Matri/ m 5 ne- Matri/9 ,
m. rotatey(degree ,
":>.mu+tip+y(m,
":G.mu+tip+y(m,
":B.mu+tip+y(m,
:rame2_or+d(,
_or+d2:rame(,
M
pu.+ic void (otate> (int degree0AArotaLie
cadru dupX Q
Matri/ m 5 ne- Matri/9 ,
m. rotateQ(degree ,
":>.mu+tip+y(m,
1ID
Transformri geometrice
":G.mu+tip+y(
m,
":B.mu+tip+y(
m ,
:rame2_or+d(
,
_or+d2:rame(
,
M
AAdecupeaQX +inii+e
pu.+ic .yte C+ipping ("ector start&
"ector end0 .yte retva+ 5 0/0 0,
"ector vi 5 ne- "ector(, "ector v2 5
ne- "ector(, "ector c+ip7ptr 5 ne-
"ector (,
for (int i 5 0, i J C, iKK0 AA dupX fiecare
p+an vi.set7e+ement(start.e+ement102&
start.e+ement112& start.e+ement122,
v+.su.((;1i2 ,
v2.set7e+ement(end.e+ement102&
end.e+ement112& end.e+ement122,
v2.su.((;1i2 ,
f+oat dpi 5 v+.dot7product(N"1i2 , f+oat dp2 5
v2.dot7product(N"1i2, AAcapete+e muchiei sunt
in afara p+anu+ui de decupare
if (dpi J 0 PP dp2 J 0 return 0/08, AAun
capXt a+ muchiei in afara p+anu+ui de
decupare if (dpi J 0 SS dp2 J 00 f+oat
fraction5Math.a.s(dpiA(Math.a.s(dpiK
Math.a.s(dp2,
c+ip7ptr.set7e+ement(end.e+ement102
& end.e+ement112& end.e+ement122,
c+ip7ptr.su.(start,
c+ip7ptr.sca+e(fraction,
c+ip7ptr.add(start, if (dpi J 0
0AAin+ocuirea capXtu+ui decupat retva+ 5
(.yte (retva+ S 0
/02 &
Fstart.set7e+ement(c+ip7ptr.e+ement102&
c+ip7ptr.e+ement112& c+ip7ptr.e+ement122,
M e+se0AA in+ocuirea capXtu+ui de sf`rVit
decupat retva+ 5 (.yte (retva+ S 0/01,
end.set7e+ement(ciip7ptr.e+ement102 &
c+ip7ptr.e+ement112& c+ip7ptr.e+ement122,
M M M return retva+,
M
M
1IU
5. ANEXA: SURSELE APLCA|E RGB (CAPTOLUL
)
- Co+or @pace appiets: ap+icaLia (6!
- Modificat si adaptat: 2001 Dan Neagu
) Copyright (c 1UUC 6reg 3hoenen and the
$niversity of $tah& 'II (ights (eserved.
'
((((((((((((((((((((((((((((((((((((((((((((
')
Appiet 9#1. .i5ierul finalColorDava/ apli%a"ia
8G1.
import j ava.appiet.'ppiet,
import j ava.a-t.),
import j ava.+ang.),
import No:+ic4er'pp+et,
import Co+or@p+atch,
pu.+ic c+ass fina+Co+or
e/tends No:+ic4er'pp+et0
Chooser rg., Chooser hsv,
Chooser yi[, Chooser cie,
.oo+ean userg. 5 fa+se,
.oo+ean usehsv 5 fa+se,
.oo+ean useyi[ 5 fa+se,
.oo+ean usecie 5 fa+se,
int num, pu.+ic void
init(0 @tring param, num
5 0,
param 5
get;arameter
(<yi[<, if
(param.compare3o(<
true< 55 00 numK
K, useyi[ 5 true,
*
param 5 get;arameter (<rg.<,
if (param.compare3o(<true< 55 00
numKK,
userg. 5 true,
*
param 5 get;arameter (<cie<,
if (param.compare3o(<true< 55 00
numKK,
usecie 5 true,
*
param 5 get;arameter (<hsv<,
if (param.compare3o(<true< 55 00
numKK,
usehsv 5 true,
*
myinit(this,
*
pu.+ic void
myinit('ppi
et a0 int
num%eft 5
num,
if (userg. rg. 5 ne-
rg.Chooser(, if (usehsv
hsv 5 ne- hsvChooser(, if
(useyi[ yi[ 5 ne-
yi[Chooser(, if (usecie
cie 5 ne- cieChooser(,
6rid!ag%ayout grid.ag 5 ne-
6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set:ont(ne-
:ont(<Re+vetica<&
:ont.;%'IN& 18,
set%ayout(grid.ag,
AAadaugX rg. if (userg.0
if (num%eft Z 2 c.grid-idth 5 1,
e+se if (num%eft 55 2 c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
e+se c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(rg.& c,
add(rg.,
160
Anexa : sursele aplica iei RGB (capitolul )
rg..myi
nit(a,
num%e f
tFF,
*
AAadaugX hsvChooser
if (usehsv0
if (num%eft Z 2 c.grid-idth 5 1,
e+se if (num%eft 55 2 c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
e+se AAnum%eft 551
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(hsv& c,
add(hsv,
hsv.myinit(a,
num%eftFF,
*
AAadaugX yi[Chooser
if (useyi[0
if (num%eft Z 2 c.grid-idth 5 1,
e+se if (num%eft 55 2 c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
e+se AAnum%eft 551 c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(yi[& c ,
add(yi[,
yi[.myinit(a,
num%eftFF,
*
AAadaugX cieChooser
if (usecie0
if (num%eft Z 2 c.grid-idth 5 1,
e+se if (num%eft 55 2 c.grid-idth 5
6rid!agConstraints.R+#T,-+;
e+se c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(cie& c,
add(cie,
cie.myinit(a,
num%eftFF,
*
repaint(,
*
pu.+ic .oo+ean hand+e=vent(=vent evt 0
if (usehsv PP hsv.isItMe(evt 0AAforma hsv
actua+iQatX.
if (userg. rg..set"a+ues(hsv.r& hsv.g&
hsv..,
if (useyi[ yi[.set"a+ues(hsv.r& hsv.g&
hsv..,
if (usecie
cie.set"a+ues(hsv.r& hsv.g& hsv..,
M e+se if (userg. PP
rg..isItMe(evt 0AA forma rg.
actua+iQatX.
if (usehsv hsv.set"a+ues(rg..r&
rg..g&rg...,
if (useyi[ yi[.set"a+ues(rg..r&
rg..g&rg...,
if (usecie
cie.set"a+ues(rg..r& rg..g&rg...,
M e+se if (useyi[ PP
yi[.isItMe(evt 0AA forma yi[
actua+iQatX.
if (usehsv hsv.set"a+ues(yi[.r&
yi[.g&yi[..,
if (userg. rg..set"a+ues(yi[.r&
yi[.g&yi[..,
if (usecie
cie.set"a+ues(yi[.r& yi[.g&yi[..,
M e+se if (usecie PP
cie.isItMe(evt 0AA forma cie
actua+iQatX.
if (usehsv hsv.set"a+ues(cie.r&
cie.g&cie..,
if (useyi[ yi[.set"a+ues(cie.r&
cie.g&cie..,
if (userg. rg..set"a+ues(cie.r&
cie.g&cie..,
*
return true,
*
Applet 9#. .i5ierul axis.$ava/ apli%a"ia 8G1.
import j ava.app+et.),
import j ava.a-t.),
import j ava.+ang.),
import j ava.net.),
pu.+ic c+ass a/is e/tends No:+ic4er'pp+et0
pu.+ic dou.+e /&y,
pu.+ic dou.+e out/&outy,
Ciprian-Paniel NEAGU" Severin BUMBARU
Co+or
myco+)
Co+or
.+ac4,
Co+or
.ac4c,
Co+or
.ac4co+,
Co+or
out1ineCo+
, Image i,
int
/origin&yori
gin, @tring
/+a.e+&y+a.e
+&F
dou.+e /min&/ma/&ymin&yma/&/diff&ydiff,
Dimension siQe, pu.+ic void my+nit('pp+et
a&dou.+e start/&dou.+e starty& @tring
/+&@tring y+&@tring pic+oc& dou.+e
/minpass&dou.+e /ma/pass&dou.+e
yminpass&dou.+e yma/pass 0
6raphics gr 5 a.get6raphics(,
.ac4co+ 5 ne- Co+or((f+oat 0.E&(f+oat
0.E&(f+oat 0.E,
out+ineCo+ 5 ne- Co+or((f+oat 0.0&
(f+oat 0.0&(f+oat 1.0,
try 0 i 5 a.getImage(ne-
$(%(a.getCode!ase(&pic+oc,M
catch (=/ception e
0 @ystem.out.print+n(<=rror opening this
gif...< K e,M
/ 5 start/,
y 5 starty,
/origin 5 *I,AA/o,
yorigin 5 110,AAyo,
/+a.e+ 5 ne- @tring(/+,
y+a.e+ 5 ne- @tring(y+,
/min 5 /minpass,
/ma/ 5 /ma/pass,
ymin 5 yminpass,
yma/ 5 yma/pass,
/diff 5 /ma/ F /min,
ydiff 5 yma/ F ymin,
myco+ 5 ne- Co+or((f+oat 1.0&(f+oat
1.0&(f+oat 1.0,
.+ac4 5 ne- Co+or((f+oat 0.0&(f+oat
0.0&(f+oat 0.0,
.ac4c W ne- Co+or((float) ./01(f+oat
./01(float) ./0);
si2e = ne3 Dimension (4561426);
*
pu.+ic void set"a+s(dou.+e ne-/&dou!le ne-y0
/ 5 ne-/,
y 5 ne-y,
repaint(,
*
pu.+ic Insets insets9 0 return ne-
Insets(1&1&1&1,M
pu.+ic void paint(6raphics g0
int temp/,
int tempy,
g.setCo+or(.ac4c,
g.fi++(ect(0&0&1*I&12I,
g.dra-+mage(i&/origin&10&this,
g.setCo+or(.+ac4,
g.dra-%ine(/origin&yorigin&/origin&10, A
Ay a/is
g.dra-%ine(/origin&yorigin&1*I&yorigin,
AA/ a/is
g.dra-@tring(y+a.e+&I&II,
g.dra-@tring(/+a.e+&E0&12I,
g.dra-@tring(@tring.va+ue9f(/min&8I&yori
ginK12 ,
g.dra-@tring(@tring.va+ue9f(ymin&20&yori
ginFD,
g.dra-@tring(@tring.va+ue9f(/ma/&12I&yor
iginK12,
g.dra-@tring(@tring.va+ue9f(yma/&20&2I,
g.setCo+or(myco+,
temp/ 5 (int (((/F/minA/diff ) 100.0
K /origin F *,
tempy 5 (int (((yFyminAydiff ) (F
100.0 K yorigin F *,
g. fi++9va+(temp/&tempy&C&C, AAcurrent
spot
g.setCo+or(out+ineCo+,
g.dra-9va+(temp/&tempy&E&E,
g.setCo+or(.ac4co+,
*
pu.+ic Dimension
preferred@iQe(0return
siQe,M pu.+ic Dimension
minimum@iQe(0return siQe,M
pu.+ic .oo+ean
mouseDrag(=vent evt&int
-/&int -y0
dou.+e temp/ 5 -/ F /origin,
dou.+e tempy 5 yorigin F -y ,
if (temp/ Z 100.0 temp/ 5 100.0,
if (tempy Z 100.0 tempy 5 100.0,
if (temp/ J 0.0 temp/ 50.0,
if (tempy J 0.0 tempy 5 0.0,
temp/ 5 temp/ A 100.0,
tempy 5 tempy A 100.0,
set"a+s(temp/&tempy,
return fa+se&F
162
Anexa 1: sursele aplica iei RGB (capitolu l )
>
pu.+ic .oo+ean mouseDo-n(=vent evt&int
-/&int -y0return mouseDrag(evt&-/&-y,M *
Applet 9#&. .i5ierul C'ooser.$ava/ apli%a"ia 8G1.
import java.app+et.),
import j ava.a-t.),
import j ava.+ang.),
import j ava.net.),
import No:+ic4er'pp+et,
pu.+ic a.stract c+ass Chooser e/tends
No:+ic4er'pp+et0
pu.+ic dou.+e r& g& ., AA cu+ori+e funda+u+ui
pu.+ic void myinit('pp+et a0M
pu.+ic void set"a+ues(dou.+e nr&dou.+e ng&
dou.+e n.0M
pu.+ic .oo+ean isItMe(=vent evt0retum
fa+se,M
*
Applet 9#6. .i5ierul Color0plat%'.$ava/ apli%a"ia
8G1.
import j ava.a-t.),
c+ass Co+or@p+atch e/tends Canvas 0
private Co+or theCo+or,
pu.+ic Dimension preferred@iQe,
private Image off@creen+mage,
private 6raphics off@creen6raphics,
private Dimension off@creen@iQe,
private Dimension d,
Co+or@p+atch(Dimension pref@iQe
0 preferred@iQe 5 ne- Dimension(pref@iQe, M
pu.+ic Dimension minimum@iQe( 0return
preferred@iQe,M
pu.+ic Dimension preferred@iQe( 0return
preferred@iQe,M
pu.+ic void set!ac4Co+or(dou.+e r& dou.+e g&
dou.+e .0
theCo+or 5 ne- Co+or ((f+oat r&(f+oat g&
(f+oat .,
repaint(,
*
A) metoda de adXugare pre+uatX
din No:+ic4er'pp+et )A pu.+ic
fina+ synchroniQed void update
(6raphics the60 d 5 siQe9 ,
if((off@creen+mage 55 nu+i SS
(d.-idth W 5 off@creen@iQe.-idth
SS (d.height T5
off@creen@iQe.height 0
off@creen+mage 5
create+mage(d.-idth& d.height,
off@creen@iQe 5 d,
off@creen6raphics 5
off@creen+mage.get6raphics(
,
off@creen6raphics.set:ont(g
et:ont(,
*
off@creen6raphics.fi++(ect(0
&0&d.-idth& d.height,
paint(off@creen6raphics,
the6.dra-+mage(off@creen+mag
e& 0& 0& nu+i,
* pu.+ic void
paint(6raphics g
0
d 5 siQe (,
g.setCo+or(theCo+or,
g.fi++(ect(0&0&d.-
idth& d.height, * *
Applet 9#9. .i5ierul mat%'er$ava/ apli%a"ia 8G1.
import j
ava.app+et.
), import j
ava.a-t.),
import j
ava.+ang.),
import j
ava.net.),
pu.+ic c+ass matcher
e/tends
No:+ic4er'pp+et0 dou.
+e rea+(&rea+6&rea+!,
dou.+e r&g&., dou.+e
dist,
dou.+e
c&i&e,
AAc55%&i55u&e55v
dou.+e
B&G&>&u;rime&v;rime
&un&vn, dou.+e
rea+%&rea+$&rea+",
Co+or@p+atch cs,
%a.ei co+or%a.ei,
163
Ciprian-Daniel NEAGU" Severin BUMBARU
Chooser space 5 nu+i, AAindiferent
de a+egerea tipu+ui de spaLiu. int
-hich@tandard, pu.+ic Choice
standardChoice&F
%a.ei standard%a.e+, AAnecesare
pentru a+egerea standardu+ui. !utton
.utt, !utton ne-Co+or!utt, fire-or4s
f-, %a.ei resu+t%a.e+, %a.ei
resu+t%a.e+2&resu+t%a.e+*, %a.ei
.+an4+&.+an42, pu.+ic Insets insets9
0return ne- Insets (8&8&I&I,M pu.+ic
void ne-"a+ue(0AAa+ege o nouX
cu+oare
r 5 Math.random(,
g 5 Math.random(,
. 5 Math.random(,
rea+( 5 r,
rea+6 5 g,
rea+! 5 .,
(6!to%$"9, AAconversiet +a %$"
rea+% 5 c,
rea+$ 5 i,
rea+" 5 e,
cs.set!ac4Co+or(r&g&.,
resu+t%a.e+.set3e/t(< <,
resu+t%a.e+2.set3e/t(< <,
resu+t%a.e+*.set3e/t(< <,
f-.stop(,
*
pu.+ic void myinit (Chooser inputChooser
0AAiniLia+iQare r&g&. P cie
r 5 1.0,
U 5 1F0,
. 5 1.0,
(6!to%$"9 ,
space \ inputChooser,
-hich@tandard 5 2,
6rid!ag%ayout grid.ag 5 ne-
6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set:ont(ne- :ont(<Re+vetica<&
:ont.;%'IN& 18,
set%ayout(grid.ag,
ne-Co+or!utt 5 ne- !utton(<;ress here
to generate a ne- co+or to match.<,
c.fi++ 5 6rid!agConstraints.!93R,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.gridheight 5 1,
grid.ag.setConstraints(ne-Co+or!utt&c,
add(ne-Co+or!utt,
.+an4+ 5 ne- %a.ei(<<&%a.ei.C=N3=(,
grid.ag.setConstraints(.+an4+&c,
add(.+an4+,
standard%a.e+ 5 ne- %a.ei(<Monitor
@tandard to use:<&%a.ei.C=N3=(,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.!93R,
c.gridheight 5 1,
c.-eight/ 5 c.-eighty 5 0,
grid.ag.setConstraints(standard%a.e+&
c,
add(standard%a.e+,
standardChoice 5 ne- Choice9,
standardChoice.add+tem(<CCI( ((ec C01F
1 (C i++uminant<,
standardChoice.add+temCNCCI( ((ec E0UF
1 (DCI<,
standardChoice.add+temCNI3$ (DCI<,
standardChoice.se+ect(2,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.!93R,
c.gridheight 5 1 ,
grid.ag.setConstraints(standardChoice&
c,
add(standardChoice ,
.+an42 5 ne- %a.ei(<<&%a.ei.C=N3=(,
grid.ag.setConstraints(.+an42&c,
add(.+an42,
co+or%a.e+ 5 ne- %a.ei (<3ry to match
this co+or:<& %a.ei .C=N3=( ,
c.fi++ 5 6rid!agConstraints.!93R,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.gridheight 5 1 ,
grid.ag.setConstraints(co+or%a.e+& c,
add(co+or%a.e+,
cs 5 ne- Co+or@p+atch (ne-
Dimension(80& 80 &F
cs.set!ac4Co+or(r&g&.,
grid.ag.setConstraints(cs&c,
164
Anexa 1: sursele aplica iei RGB (capitolul )
add(cs,
resu+t%a.e+ 5 ne- %a.ei(<
<&%a.ei.C=N3
=(,
resu+t%a.e+2 5 ne- %a.e#<
<&%a.ei.C=N
3=(,
resu+t%a.e+* 5 ne- %a.e+(<
<&%a.ei.C=N
3=(,
grid.ag.setConstraints(resu+t%a.e+& c ,
add(resu+t%a.e+,
grid.ag.setConstraints(resu+t%a.e+2& c ,
add(resu+t%a.e+2,
grid.ag.setConstraints(resu+t%a.e+*&c,
add(resu+t%a.e+*,
.utt 5 ne- !uttonCNC+ic4 here to see if
your chosen co+or is c+ose enough.<,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.gridheight 5 1,
c.fi++ 5 6rid!agConstraints.R9(I>9N3'%,
grid.ag.setConstraints(.utt&c,
add(.utt,
f- 5 ne- fire-or4s(,
grid.ag.setConstraints(f-&c,
add(f-,
f-.init9, AAgives it right .ac4ground
co+or
f-.stop(,
ne-"a+ue9, AAma4e a random va+ue
*
pu.+ic void (6!toBG>(0
if (-hich@tandard 55 0 0AACCI( C01F1
B 5 0.C0E)r K 0.1E8)g K 0.200).,
G5 0.2UU)r K
0.IDE)g K
0.118).,
> 5 0.0CC)g K
1.11C).,
AABn 5 0.UD0E22 Gn
5 1 >n 5 1.1D22I8
un 5 0.202221E, vn
5 ./78.999:;
*
e+se if (-hich@tandard
55 1 0AACCI( E0UF1
B 5 ./742'r ;
0.*ID)g K 0.1D0).,
G5 ./245'r ;
0.E1I)g K
0.0E2).,
> 5 ./.4:'r K
0.11U)g K
0.UI0).,
AAQn 5 0.*ID2E1 Bn 5
0.UI088U2 Gn 5 1 >n 5
1.0DDU1CC un 5 0.1UED**, vn 5
0.8CD**0I,
*
e+se 0AAI3$ (DCI
B 5 0.8*1)r K 0.*82)g K 0.1ED).,
G5 0.222)r K
0.E0E)g K
0.0E1).,
> 5 0.020)r K
0.1*0)g K
0.U*U).,
AAQn 5 0.*ID2E1 Bn 5 0.UI088U2 Gn 5 1
>n 5 1.0DDU1CC
un 5 0.1UED**,
vn 5
0.8CD**0I, * *
pu.+ic void
BG>to%$"9 0
dou.+e temp 5 B K
1I.0)G K *.0)>,
try0
if (G Z 0.00DDIC c 5 11C.0 )
Math.po-(G&0.******* F 1C.0,
e+se c 5
U0*.* ) G, M
cateh (=/ception
e 0 M AAset u
(i P v (e if
(temp Z 0.000001
0
u;rime 5 8.0)B A temp,
v;rime 5 U.0)G A temp,
i 5 1*.0)c)(u;rime F un,
e 5
1*.0)c)(v;rime F
vn, M e+se 0
i 5 0.0,
e 5 0.0,
* *
pu.+ic void
(6!to%$"(
0 (6!toBG>(,
BG>to%$"(, *
pu.+ic void
goodMatch(0
resu+t%a.e+.set3e/t(<C9N6('3$%'3I9N@.< ,
resu+t%a.e+2.set3e/t(<Gou -ere < K
@tring.va+ue9f(dist K < off.<,
resu+t%a.e+*.set3e/t(<Gou needed to .e
-ithin I.0<,
=".$y-2-'&9+50+ 10+ 100+ 3. 2+ 0. 1/ +
=".$yS'!'&/ 0
165
Ciprian-Daniel NEAGU" Severin BUMBARU
pu.+ic void .adMatch(0
resu+t%a.e+.set3e/t(<INC9((=C3 M'3CR<,
resu+t%a.e+2.set3e/t(<Gou -ere < K
@tring.va+ue9f(dist K < off.<,
resu+t%a.e+*.set3e/t(<Gou need to .e
-ithin I.0<,
f-.stop( ,
M
pu.+ic void
[ueryMatc
h(
0 dou.+e
tr&tg&t.,
r 5
space.r,
g 5
space.g,
. 5
space..,
(6!to%$"9,
AAconversie +a
c&i&e AAca+cu+u+
distantei. tr 5
(rea+%Fc, tg 5
(rea+$Fi, t. 5
(rea+vFe,
dist 5 Math.s[rt(tr)tr K tg)tg K t.)t.,
@ystem.out.print+n(<Distance is < K
@tring.va+ue9f(dist,
@ystem.out.print+nCNDesired %&$&" is< K
@tring.va+ue9f(rea+% K <& < K
@tring.va+ue9f(rea+$ K <& <
K @tring.va+ue9f(rea+",
@ystem.out.prinLIn(<Converted %&$&" is<
K @tring.va+ue9f(c K <& < K
@tring.va+ue9f(i K <&
< K @tring.va+ue9f(e, if (dist J
I.0 goodMatch9 , e+ se .adMatch9 ,
M
pu.+ic .oo+ean hand+e=vent(=vent evt0
if ((evt.target55.utt PP
(evt.id55=vent.'C3I9N7="=N3
([ueryMatch(,M e+se if ((evt.target 55
ne-Co+or!utt PP (evt.id 55
=vent.'C3I9N7="=N30 ne-"a+ue9,
AAa++ege o noua cu+oare
M
e+se if ((evt.target 55 standardChoice
PP (evt.id 55 =vent.'C3I9N7="=N30
-hich@tandard 5
standardChoice.get@e+ected+nde/(,
r 5 rea+(,
g 5 rea+6,
. 5 rea+!,
(6!to%$"9, AAconversie +a %$"
rea+% 5 c,
rea+$ 5 i,
rea+" 5 e,
resu+t%a.e+.set3e/t(< <,
resu+t%a.e+2.set3e/t(< <,
resu+t%a.e+*.set3e/t(< <,
f-.stop9 ,
M
return fa+se,
Applet 9#:. .i5ierul mat%'Oolder$ava/ apli%a"ia
8G1.
import j
ava.app+et.)
, import j
ava.a-t.),
import j
ava.+ang.),
import j
ava.net.),
import
No:+ic4er'pp+
et, import
Co+or@p+atch,
pu.+ic c+ass matchRo+der
e/tends No:+ic4er'pp+et0
matcher m,
Chooser space 5 nu+i, AA-hatever
co+or space they chose. pu.+ic
Insets insets9 0 return ne-
Insets(8&8&I&I,M pu.+ic void
init(0 @tring param,
param 5 get;arameter (<yi[<,
if (param.compare3o(<true< 55 0
0space 5 ne- yi[Chooser(,M e+se0
param 5 get;arameter (<rg.<,
if (param.compare3o(<true< 55 0
0space 5 ne- rg.Chooser(,M
e+se0
param 5 get;arameter (<cie<,
if (param.compare3o(<true< 55
00space 5 ne- cieChooser(,M
e+se0 param 5 get;arameter
(<hsv<,
if (param.compare3o(<true< 55 0
0space 5 ne- hsvChooser(,M M M
166
Anexa : sursele aplica iei RGB (capitolul 1)
if (space 55 nu+i AAfara parametri
specificaLi 0
@ystem.out.prinLIn(<=((9(: N9
C9%9( CR99@=( @;=CI:I=D.<,
return,
*
m 5 ne- matcher(,
m.myinit(space,
6rid!ag%ayout grid.ag 5 ne-
6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set:ont(ne- :ont(<Reivetica<& :ont.;%'IN&
18,
set%ayout(grid.ag,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
c.gridheight 5 1,
c.-eight/ 5 c.-eighty 5 1.0,
c.fi++ 5 6rid!agConstraints.N9N=,
grid.ag.setConstraints(m&c,
add(m,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.gridheight 5 1,
c.-eight/ 5 c.-eighty 5 1,
grid.ag.setConstraints(space& c,
add(space,
space.myinit(this,
m.start(,
space.start(,
repaint (,
Appiet 9#;. .i5ierul <o.li%-erAppIet$ava/
apli%a"ia 8G1.
AF ----------------------------------------------------------------
) Co+or @pace app+ets P support programs:
No:+ic4er'pp+et.java
) =/tension to .ase appiet c+ass to avoid
disp+ay f+ic4er
)Copyright (C 1UUC .y Matthe- 6ray
' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
import j ava.a-t.),
import j ava.a-t.image.Co+orMode+,
import j ava.net.$(%,
import j ava.net.Ma+formed$(%=/ception,
import j ava.appiet.'ppiet,
pu.+ic c+ass
No:+ic4er'pp+et e/tends
'ppiet 0 private Image
off@creen+mage, private
6raphics
off@creen6raphics,
private Dimension
off@creen@iQe,
pu.+ic fina+ synchroniQed void
update (6raphics the60
Dimension d 5 siQe(,
if((off@creen+mage 55 nu+i SS
(d.-idth T5 off@creen@iQe.-idth
SS (d.height T5
off@creen@iQe.height0
off@creen+mage 5
create+mage(d.-idth& d.height,
off@creen@iQe 5 d,
off@creen6raphics 5
off@creen+mage.get6raphics(
,
off@creen6raphics.set:ont(ge
t:ont(,
*
off@creen6raphics.fi++(ect(
0&0&d.-idth& d.height,
paint(off@creen6raphics,
the6.dra-Image(off@creen+ma
ge& 0& 0& nu+i,
Appiet 9#>. .i5ierul pi%-er$ava/ apli%a"ia 8G1.
import j
ava.appiet.
), import j
ava.a-t.),
import j
ava.+ang.),
import j
ava.net.),
pu.+ic c+ass pic4er
e/tends 'ppiet0
!utton .utt,
%a.ei +a.,
%a.ei -arn+,
%a.ei -arn2,
Chec4.o/ cie,
167
Ciprian-Daniel NEAGU" Severin BUMBARU
Chec4.o/
yi[,
Chec4.o/
rg.,
Chec4.o/
hsv,
Chec4.o/
cieMatch,
Chec4.o/
rg.Match,
Chec4.o/
yi[Match,
Chec4.o/
hsvMatch,
Chec4.o/6r
oup grp,
!utton
match!utt,
%a.ei
match%a.,
%a.ei
.+an4%a.+&.+an4%a.2&.+an4%a.
*&.+an4%a.8, pu.+ic void
init(0
6rid!ag%ayout grid.ag 5 ne-
6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set:ont(ne- :ont(<Re+vetica<& :ont.;%'IN&
18,
set%ayout(grid.ag,
-arn+5ne- %a.ei(< <&
%a.ei.C=N3=(,
-arn2 5 ne- %a.ei(< <&
%a.ei.C=N3=(,
.utt 5 ne- !uttonCN;ress here to run the
chosen app+et(s.<,
cie 5 ne- Chec4.o/(,
yi[ 5 ne- Chec4.o/(,
rg. 5 ne- Chec4.o/(,
hsv 5 ne- Chec4.o/ ( &F
cie.set%a.e+(<CI= %$"<,
yi[.set%a.e+(<GIO<,
rg..set%a.e+(<(6!<,
hsv.set%a.e+(<R@"<,
AAimp+icit: rg. P hsv
rg..set@tate(true,
hsv.set@tate(true,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(-arn+& c,
add(-arn+,
grid.ag.setConstraints(-arn2& c,
add(-arn2,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(.utt& c,
add(.utt,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
c.gridheight 5 1,
c.-eight/ 5 c.-eighty 50.0,
grid.ag.setConstraints(rg.& c,
add(rg.,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
grid.ag.setConstraints(hsv& c,
add(hsv,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
grid.ag.setConstraints(yi[& c,
add(yi[,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
grid.ag.setConstraints(cie& c,
add(cie,
.+an4%a.8 5 ne- %a.ei(<<&%a.ei.C=N3=(,
.+an4%a.* 5 ne- %a.ei(<<&%a.ei.C=N3=(,
.+an4%a.2 5 ne- %a.ei(<<&%a.ei.C=N3=(,
.+an4%a.+ 5 ne- %a.ei(<<&%a.ei.C=N3=(,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
grid.ag.setConstraints(.+an4%a.+& c,
add(.+an4%a.+,
match%a. 5 ne- %a.ei(<9(& choose a
co+or space to p+ay the matching game
-ith:<& %a.ei.C=N3=(,
c.grid-idth 5
6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag. setConstraints (match%a.& c &F
add(match%a.,
AAChec4.o/es
grp 5 ne- Chec4.o/6roup(,
cieMatch 5 ne- Chec4.o/(<CI=
%$"<&grp&fa+se,
yi[Match 5 ne- Chec4.o/(<GIO<&grp&fa+se,
168
Anexa 1: sursele aplica iei RGB (capitolul )
rg.Match 5 ne-
Chec4.o/(<(6!<&grp&true,
AAdefau+ts to true hsvMatch 5 ne-
Chec4.o/(<R@"<&grp&fa+se ,
c.grid-idth 5
6rid!agConstraints.(=%'3I"=,
c.-eight/ 5 c.-eighty 5 0.0,
c.gridheight 5 1,
grid.ag.setConstrain
ts(rg.Match& c,
add(rg.Match ,
c.grid-idth 5
6rid!agConstraints.(=M'
IND=(,
grid.ag.setConstraints(
hsvMatch& c,
add(hsvMatch,
c.grid-idth 5
6rid!agConstraints.(=%'
3I"=,
grid.ag.setConstraints(
yi[Match& c,
add(yi[Match ,
c.grid-idth 5
6rid!agConstraints.(=M'
IND=(,
grid.ag.setConstraints(
cieMatch& c,
add(cieMatch,
match!utt 5 ne- !utton(<;ress here to p+ay
the Matching game -ith the chosen space. < ,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.fi++ 5 6rid!agConstraints.N9N=,
c.-eighty 5 1.0,
c.-eight/ 5 1.0,
grid.ag.setConstraints(match!utt& c,
add(match!utt,
repaint(,
*
pu.+ic .oo+ean
hand+e=vent(=vent
evt0 int
numChosen 5 0,
@tring!uffer .+ah 5 ne- @tring!uffer(,
if ((evt.target 55 .utt PP
(evt.id 55
=vent.'C3I9N7="=N30 if
(rg..get@tate9 0 numChosenK
K, .+ah.append(<rg.<,
*
-= &3-%.g%'S'!'%O / E
numChosenKK,
.+ah.appen
d(<cie<, * if
(yi[.get@tate9
0
numChosenKK,
.+ah.appen
d(<yi[<, * if
(hsv.get@tate9
0
numChosenKK,
.+ah.appen
d(<hsv<, * if
(numChosenZ80
-arn+.set3e/t(<Gou chose < K
@tring.va+ue9f(numChosen,
-arn2.set3e/t(<co+or spaces &.ut
you are +imited to four.<,
return fa+se,
*
e+se if (numChosen J 10
-arn+.set3e/t(<Gou chose +ess than
1 co+or space. <,
-arn2.set3e/t(<Gou need to choose
at +east 1.<,
return
fa+se, *
e+se0
-arn+.set3e/t(<< ,
-arn2.set3
e/t(<< , *
.+ah.append
(<.htm+<,
try0
get'pp+etConte/t(.sho-Document(
ne- $(%(getCode!ase(&
.+ah.to@tring(, * catch
(=/ception e0
-arn+.set3e/t(<=rror +oading $(% <K
< .AmeA<K.+ah.to@tring9, * M e+se if
((evt.target 55 match!utt PP (evt.id 55
=vent.'C3I9N7="=N30 if
(rg.Match.get@tate9
0.+ah.appendCrg.Match.htm+< ,M e+se if
(cieMatch.get@tate (
0.+ah.appendCcieMatch.htm+< ,M e+se if
(yi[Match.get@tate (
0.+ah.appendCyi[Match.htm+< , M e+se
0.+ah.appendChsvMatch.htm+< , M
try 0get'pp+etConte/t(
.sho-Document( ne- $(%(getCode!ase( &
.+ah.to@tring(,M
catch (=/ception e
0-arn+.set3e/t(<(match=rror +oading
$(%<,M *
1CU
Ciprian-Paniel NEAGU" Severin BUMBARU
%'12 =!#.%0
Applet 9#@. .i5ierul urlLabel.$ava/ apli%a"ia 8G1.
import j
ava.app+et.)
, import j
ava.a-t.),
import j
ava.net.),
pu.+ic c+ass
ur+%a.e+ e/tends
%a.ei0 @tring va+ue,
@tring ur+7goto, $(%
ur+7va+ue, 'pp+et
runner, pu.+ic void
ur+%a.e+(0M
pu.+ic void myinit ('pp+et
a& @tring -&@tring va+
0 runner 5 a, va+ue 5
ne- @tring(, ur+7goto
5 ne- @tring(-,
va+ue.concat(va+,
ur+7goto.concat(-,
try0ur+7va+ue 5 ne-
$(%(ur+7goto,M
cateh (=/ception e0
ur+7va+ue 5 nu+i,
@ystem.out.prinLIn(<Inva+id $(%
specification.<, * * pu.+ic
.oo+ean mouseDo-n (=vent e& int /&
int y0
if( ur+7va+ue T5 nu+i
0runner.get'pp+etConte/t(.sho-Document( u
r+7va+ue ,M return true,
*
pu.+ic .oo+ean mouseMove(=vent evt& int /& int
y 0
if ((ur+7goto 55 nu+i SS
(ur+7va+ue55nu++ 0
@ystem.out.prinLIn(<N$%% @3(IN6<,
return true,
*
runner.sho-@tatus(<6o to < K ur+7goto,
return true,
*
pu.+ic .oo+ean mouse=/it(=vent evt& int /& int
y 0
if (ur+7goto 55 nu+i return true,
runner.sho-@tatus(<<,
return
true, * *
Observaie: pentru o list complet a fiierelor surs Java i
HTML pe tema tratrii culorilor (aplicaia RGB), putei face
referire la pagina web anunat n introducere.
170
6. ANEXA : SURSELE APLCA|LOR PRVND
TRANSFORMRLE 2D (CAPTOLUL V)
Appiet :#1. .i5ierul 7ranslation$ava/ apli%a"ia
7ransformations.
/*
__________________________________________________
u
Af'ppiet demo:
trans+aLia
puncte+or.)A import
java.appiet.), import
j ava.a-t.), import j
ava.ut i1.), import
MyMath,
c+ass 3rans+ator 0
private ;oint p+&p2,
private int rad52& mode50,
pu.+ic 3rans+ator(;oint p& ;oint [0 pi 5
p, p2 5 [, M
pu.+ic void dra-(6raphics g0
g.dra-%ine(p+./&p+
.y&p2./&p2.y,
dou.+e r5*0,
dou.+e +en 5 MyMath.dist(pi&p2,
;oint p 5 ne- ;oint ((int(r)(p2./F
p+./A+en&(int(r)(pi.yFp2.yA+en
dou.+e theta50,
if(p+./55p2./0 if(p2.y J
p+.y0 theta5Math.;IA2, M
e+se0 theta5*)Math.;IA2, M M
if(p2.y 55 p+.y0
if(p2./ J p+./
0 theta5Math.;I, M
e+se0 theta50, M
M
if((p2/"<pl/")'(p2/$<pl/$) ==.)>
theta = %ath/atan(%$%ath/slope(pi1p2,
if(p2./ J p+./ theta K5 Math.;I,
if(theta J 0 theta
K5 2?%ath/&,; M
;oint p+eft 5 ne- ;oint((int((rF
10)Math.cos(thetaK0.2C &(int(trio
)Math. sin (thetaK0 . 2C ,
;oint pright 5 ne3 ;oint((int((rF
10)Math.cos(thetaF0.2C&(int((rF
10)Math.sin(thetaF0.2C ,
;oint diff5ne- ;oint(p2./Fp./&p2.yF
p.y,
int12 /coord5 0p2./&p2./F(p./F
p+eft./&p2./F(p./Fpright./M,
int12 ycoord50p2.y&p2.yK(p.yF
p+eft.y&p2.yK(p.yFpright.yM,
;o+ygon arro-head5ne-
;o+ygon(/coord&ycoord&*,
g.fi11;o+ygon(arro-head,
if(mode55+0
g.setCo+or(Co+or.red,
int /+5p+./& /25p2./&y+5p+.y& y25p2.y ,
g.fi++9va+(/+Frad&y+Frad&2)rad&2)rad,
g.fi++9va+(/2Frad&y2F
rad&2)rad&2)rad, M M
pu.+ic ;oint
trans+ation(;oint
p0 ;oint ans 5
p,
ans.trans+ate(p2./F
p+./&p2.yFp+.y,
return ans,
M
pu.+ic void s-itchmode90
if(mode5500 mode5+, M
e+se mode50,
M
pu.+ic void
s-itchmode(int i
0 mode5i,M pu.+ic void
move(int gemX&;oint p
0 s-itch(gema0 case
2:
p+5p,
.rea4,
case *:
p25p,
.rea4,
defau+t:
d.g(<;ro.+eme privind vectoru+
de trans+aLie<, M M
1E1
Ciprian-Daniel NEAGU" Severin BUMBARU
pu.+ic int
getmode(0 return
mode, M pu.+ic
;oint
tai++ocation(0
;oint ans 5 ne- ;oint(p+./& p+.y,
return ans,
M
pu.+ic ;oint head+ocation(0
;oint ans 5 ne- ;oint(p2./& p2.y,
return ans,
M
pu.+ic ;oint get"ector(0 return ne-
;oint(p2./Fp+./& p+.yFp2.y, M private
void d.g(@tring msg
0 @ystem.out.print+n(msg, M M
c+ass Mirror0
private int
/+& y+& /2& y2,
private int
r58& mode50,
pu.+ic Mirror(int /a& int
ya& int /.& int y.0
/+5/a, y+5ya, /25/.,
y25y.,
M
pu.+ic Mirror(;oint pi& ;oint p2
0 this(pi./&p+.y&p2./&p2.y, M
pu.+ic void dra-(6raphics g0
int v+5/2F/+& v25y2Fy+& d5(int
(2K200AMyMath.dist(/+&y+&/2&y2,
g.dra-%ine(/+Fd)v+&y+F
d)v2&/+Kd)v+&y+Kd)v2, if(mode55+0
g.setCo+or(Co+or.red,
g.fi++9va+(/+Fr&y+F
r&2)r&2)r ,
g.fi++9va+(/2Fr&y2F
r&2)r&2)r , M M pu.+ic
void s-itchmode(0
if(mode550
0 mode5+, M
e+se
mode50,
M
pu.+ic void
s-itchmode(int i
0 mode5i,M pu.+ic int
getmode(0 return
mode, M pu.+ic f+oat
s+ope(0
if (/255/+
0 return
:+oat.NaN, M e+se0
f+oat num 5y2F
y+, f+oat
den5/2F/+,
return
numAden, M M
pu.+ic ;oint
ref+ection(;o
int p0 ;oint
ans5p,
if(:+oat.isNaN(s+ope(0ans 5 ne-
;oint(p./K2)(/+Fp./&p.y, M e+se0
if(s+ope(5500 ans 5 ne-
;oint(p./&p.yK2)(y+Fp.y, M
e+se0
int12 veci 5 (p./F/+&y+Fp.yM& vec2 5 0/2F
/+&y+Fy2M, dou.+e ang+e 5
MyMath.ang+edeg(vec+&vec2, dou.+e hyp 5
MyMath.dist(/+&y+&p./&p.y, dou.+e +eg 5
hyp)Math.cos(ang+eA1D0 ) Math.;I, dou.+e
rat 5 +egA(MyMath.dist(/+&y+&/2&y2, dou.+e
mirror;ointB 5 /+K rat)(/2F/+, dou.+e
mirror;ointG 5 y+K rat)(y2Fy+, ans5ne-
;oint(p./K(int(2)(mirror;ointBFp./&p.yK
(int(2)(mirror;ointGFp.y, M M return
ans,
M
pu.+ic ;oint tai++ocation(0
;oint ans 5 ne- ;oint (/2& y2 &F
return ans,
M
pu.+ic ;oint head+ocation(0
;oint ans 5 ne- ;oint(/+& y+,
return ans,
M
pu.+ic ;oint get;oint2(0
;oint ans 5 ne- ;oint (/2& y2 &F
return ans,
M
p19#-3 N>-2' g%'N>-2'#&/E
N>-2' !2. < 2%" N>-2'&A#+ y#/0
%'12 !2.0
172
Anexa : sursele aplica iilor privind transformrile 2D (capitolul
V)
pu.+ic void
move(int
gema&;oint p0
s-itch(gemX
0 case 2:
/25p./, y25p.y,
.rea
4, case
*:
/+5p./, y+5p.y,
.rea4,
*
c+ass (otor 0
;oint center, int
ang+e, AAin deg
int rad52, int
mode50& r5**,
pu.+ic (otor(;oint c& int a
0 center 5 c, ang+e 5 a, M
pu.+ic void dra-(6raphics g 0
if(mode555+0
g.fi++9va+(F100&F100&200&200 ,
6>#> d-.46>#><2%" 6>#>&0+0+0/0
g..%'6>#>&d-.46>#>/0
g.=-##Ov!#&2+2+70+70/ 0
Co+or foreco+or 5 Co+or..+ac4,
g.setCo+or(foreco+or,
g.fi++'rc(*&*&CU&CU&0&ang+eF10,
g.setCo+or(dis4Co+or,
g.fi++9va+(E&E&C1&C1,
:ontMetrics font+nfo 5
g.get:ontMetrics(g.get:ont(,
int 15(int(font+nfo.string_idthC
1
<
K ang+eA2 ,
g.setCo+or(foreco+or,
g.dra-@tring(<
&+
Kang+eK
&
Yu00.0
&
&80F1&82 ,
;oint p5ne- ;oint((int
(r)Math.cos(MyMath.ma4e(adian(ang+e& (int
(r)Math.sin(MyMath.ma4e(adian(ang+e ,
;oint p+5ne-
;oint((int((rF
10)Math.cos(MyMath.ma4e(adi
an(ang+eF1I&(int( (rF
10)Math.sin(MyMath.ma4e(adi
an(ang+eF1I,
;oint p25ne-
;oint((int
((rK10)Math.cos(MyMath.ma4e(adi
an(ang+eF1I&(int
((rK10)Math.sin(MyMath.ma4e(adi
an(ang+eF1I,
int12 /coord5 0*EKp./&*EKp+./&*EKp2./M,
int12 ycoord50*EFp.y&*EFp+.y&*EFp2.yM,
;o+ygon arro-head5ne-
;o+ygon(/coord&ycoord&*,
g.fi++;o+ygon(arro-head,
g.setCo+or(Co+or.red,
int /+5p./&y+5p.y ,
g.fi++9va+(*EK/+Frad&*EFy+F
rad&2)rad&2)rad,
g.fi++9va+(center./F*&center.yF*&C&C,
*
e+se
0
g.setCo+or(Co+or..+ac4,
g.fi++9va+(center./F
*&center.yF*&C&C, * *
pu.+ic ;oint
rotation(;oi
nt p0 ;oint
ans5p,
dou.+e
theta50,
dou.+e r 5
MyMath.dist(p&cente
r,
if(p./55center./0
if(p.y J center.y0 theta5Math.;IA2, M
e+se0 theta5*)Math.;IA2,M
*
if(p.y 55 center.y0
if(p./ J center./0 theta5Math.;I,
M
e+se0 theta50, M *
if((p./F
center./)(p.yF
center.y T5 0 0
theta 5 Math.atan(MyMath.s+ope(center&p,
if(p./ J center./ theta K5
Math.;I,
if(theta J 0 theta K5 2)Math.;I,
*
theta K5 MyMath.ma4e(adian(ang+e,
ans 5 ne- ;oint(center./K(int
(r)Math.cos(theta&center.yF(int
(r)Math.sin(theta, return ans, *
173
Ciprian-Daniel NEAGU" Severin BUMBARU
pu.+ic void s-itchmode(0
if(mode5500mode5+,M
e+se mode50,M
pu.+ic void
s-itchmode(int i
0mode5i,M pu.+ic int
getmode(0return
mode,M pu.+ic .oo+ean
inQone(;oint p0
;oint [ 5 ne- ;oint((int
(*EKr)Math.cos(MyMath.ma4e(adian(ang+e&*EF
(int (r)Math.sin(MyMath.ma4e(adian(ang+e
,
int d 5 (int(MyMath.dist(p&[,
if(dJIreturn true,
e+se return fa+se,
*
pu.+ic ;oint getCenter(0
;oint ans 5 ne- ;oint(center./&
center.y,
return ans,
*
pu.+ic int
get'ng+e(0return
ang+e,M pu.+ic void
move(int gemX&;oint
p0 s-itch(gema
0 case 2:
int12 horiQonta+ 5
01&0M, int12
topoint 5 0p./F
*E&*EFp.yM,
ang+e 5
(intMyMath.ang+edeg(horiQonta+
&topoint, if
(p.yZ*Eang+eK52)(1D0Fang+e,
.rea4, case *:
center 5
p, .rea4,
MAAend
s-itch
pu.+ic c+ass 3rans+ation e/tends
'pp+et imp+eraents
!utton;ane+Rost0
int state50& mode50,
Image -or4space,
6raphics
off@creen,
private %a.ei
+a.,
private :ont my:ont 5ne-
:ont(<@ans@erif<& :ont.;%'IN&
18,
Co+or canvasco+ 5 ne- Co+or(0&
0& 0 ,
Co+or +a.Co+or 5 ne- Co+or(20& 20& 20,
private !utton;ane+ .ut;an,
private
3rans+ationDisp+ay
disp+ay, pu.+ic void
init(0
int co+i& co+2&
co+*,
set%ayout(ne-
!order%ayout(2&2
, set:ont(my:ont,
try0
co+i 5
Integer.parse+nt(get;aramet
er(<(ed<, co+2 5
Integer.parse+nt(get;aramet
er(<6reen<, co+* 5
Integer.parse+nt(get;aramet
er(<!+ue<, canvasco+ 5
ne- Co+or(co++& co+2&
co+*,
*
catch(=/ception e0M
try0
co+i 5
Integer.parse+nt(get;arameter(<%a.
(ed<,
co+2 5
Integer.parse+nt(get;arameter(<%a.
6reen<,
co+* 5
Integer.parse+nt(get;arameter(<%a.
!+ue<,
+a.Co+or 5 ne- Co+or(co++& co+2& co+*,
*
catch(=/ception e
0M
set!ac4ground( can
vasco+ &
F-or4space5create+
mage(800& 2I0 ,
off@creen5-or4spac
e.get6raphics(,
+a. 5 ne- %a.ei(<MutaLi o.iectu+
(.ro-nA urmXriLi o.iectu+ (.+ue.
%a.ei.C=N3=(,
+a..set!ac4ground(+a.Co+or,
add(<@outh<& +a.,
addCN=ast<& .ut;an5ne-
!utton;ane+(this ,
add(<Center<& disp+ay5ne-
3rans+ationDisp+ay(this,
*
pu.+ic void start(0
disp+ay.setMa/(,
.ut;an.turnoff(,
AAuser -i++ turn it on *
pu.+ic void stop(0M pu.+ic
void turnoff(0 AAca++ed .y
.ut;an.turnoff(
state50,
1E8
Anexa : sursele aplica iilor privind
transformrile 2D (capitolul V)
disp+ay.turnoff(,
+a..hide9 ,
*
pu.+ic void turnon(0 AAca++ed .y .ut;an.turnon(
state5+,
disp+ay.turnon(,
+a..sho-(,
*
pu.+ic void response(int
i 0 s-itch (i0
case 2:
disp+ay.s-itchmode(,
mode 5
disp+ay.getmode(,
if (mode 55 0+a..set3e/t(<MutaLi
o.iectu+ (.ro-nA
if (mode 55
1+a..set3e/t(<ModificaLi vectoru+ (prin
repaint(,
.rea4,
disp+ay.repaint(,
repaint(, .rea4,
+a..set3e/t(<<,
disp+ay.paint'.out(,
repaint(, .rea4,
c+ass 3rans+ationDisp+ay e/tends Canvas 0
private int
disp+ay@tate50&ma/B&ma/G& mode50,
private int gema50& captive50&
.usy50, AAmouse
private ImagefrontImage,
private Co+oro.jectCo+or 5 ne-
Co+or(12D& C8& 0, AA.ro-n
private Co+orimageCo+or 5 ne-
Co+or(0& 0& 2II, AA.+ue
private ;icture origina+&
trans+ated,
private 3rans+ator trans+ator,
private 3rans+ation host,
pu.+ic 3rans+ationDisp+ay
(3rans+ation h0
host5h,
set!ac4ground( h.canvasco+,
origina+ 5 ne- ;icture(,
origina+.add=+ement(ne-
Circ+e(200&100&I,
*
pu.+ic void update(6raphics g
0paint(g,M
pu.+ic void paint(6raphics g 0
if(disp+ay@tateZ5+
0 g.dra-+mage(frontimage&0&0&t
his, M e+se0
g.setCo+or(get!a
c4ground(,
g.fi++(ect(0&0&m
a/B&ma/G,
g.setCo+or(get:o
reground(,
*
.usy
50&F
*
pu.+ic void paint'.out(0
host.off@creen.setCo+or(get!ac4g
round(,
host.off@creen.fi++(ect(0&0&800&
2I0,
host.off@creen.setCo+or(Co+or..+
ac4,
host.off@creen.dra-@tring(<'pp+e
t 3rans+aLie F demo<&20&20,
host.off@creen.dra-@tring(<Compu
ter 6raphics<&20&80,
host.off@creen.setCo+or(get!ac4g
round(,
setImage(host.-or4space,
*
pu.+ic void turnoff(0
disp+ay@tate50,
repaint(,
*
pu.+
i
c

v
o
i
d

t
u
r
n
o
n
(

0

s
e
t
M
a
/
(

,
dis
p+a
y@t
ate
5+,
rep
ain
t(
,
*
p
u
.
+
i
c

v
o
urmXriLi
o.iectu+
(.+ue.<,
id setMa/(0
ma/B5siQe(.-idth,
175
Ciprian-Daniel NEAGU" Severin BUMBARU
ma/G5siQe(.heightF*0,
trans+ator 5 ne- 3rans+ator ( ne- ;oint( (int
(ma/BA8&(int(ma/GA8 & ne- ;oint( (int
(ma/BA2&(int(ma/GA2 , refresh(,
*
pu.+ic void s-itchmode(0
trans+ator.s-itchmode(,
mode 5 trans+ator.getmode(,
refresh(,
*
pu.+ic int getmode(0return mode,M
private void set+mage(Image I0
frontImage5I,
repaint(,
*
private void refresh(0
host.off@creen.setCo+or(get!ac4ground(
,
host.off@creen.fi++(ect(0&0&800&2I0,
host.off@creen.setCo+or(Co+or..+ac4&F
trans+ator.dra-(host.off@creen,
trans+ated 5
origina+.trans+ation(trans+ator,
host.off@creen.setCo+or(imageCo+or,
trans+ated.dra-(host.off@creen,
host.off@creen.setCo+or(o.jectCo+or,
origina+.dra-(host.off@creen,
host.off@creen.setCo+or(get!ac4ground9
,
host.off@creen.dra-(ect(0&0&ma/B&ma/G
,
set+mage(host.-or4space,
*
pu.+ic .oo+ean mouseDrag(=vent evt& int /&
int y0
;oint p,
s-itch (mode0
case 0:
if(/Zma/BSS/J0SSyJ0SSyZma/Greturn true,
if(.usy55+return true,
.usy5+,
p5ne- ;oint(/&y,
;ic=+em current;ic5 ne- Circ+e(0&0&0 ,
if(gema55+0
current;ic5(;ic=+em
(origina+.e+ement't(captive
,
current;ic.move(p,
origina+.set=+ement't(current
;ic&captive,
refresh9 ,
return true,
*
for(int i50,iJorigina+.siQe9,iKK0
current;ic5(;ic=+em
(origina+.e+ement't(i,
if
(MyMath.dist(current
;ic.+ocation(&pJ10
0 gema5+,captive5i,
*
*
if(gem
a5500
.usy50,
return true,
*
current;ic.move(p,
origina+.set=+ement't(current;ic&captive,
refresh9 ,
.rea4,
if(/Zma/BSS/J0SSyJ0SSyZma/Greturn true,
if(.usy55+return true,
.usy5+,
p5ne- ;oint(/&y,
if(gema552 SS gema55*0
trans+ator.move(gemX&p,
AAmuta punctu+ in p
refresh9 ,
return true,
*
gemX 5 0,
if
(MyMath.dist(trans+ator.tai++ocati
on9 &p JI 0 gema52, M
if
(MyMath.dist(trans+ator.head+ocati
on(&pJI0 gema5*, M
if(gema5500
.usy50,
return true,
*
trans+ator.move(gemX&p,
176
Anexa : sursele aplica iilor privind transformrile 2D (capitolul
V)
refres
h(,
.rea4,
M
return true,
M
pu.+ic .oo+ean mouse$p(=vent evt& int /&
int y0
gema50,
.usy50,
return true,
a.stract interface
!utton;ane+Rost
0 pu.+ic void
turnon9, pu.+ic
void turnoff9,
pu.+ic void
response(int
i,
c+ass !utton;ane+ e/tends ;ane+ 0
private int .utton@tate50,
private !utton on9ff!utton&mode!utton&
he+p.ut&
refresh.ut&
a.out.ut , private
!utton;ane+Rost host,
pu.+ic
!utton;ane+(!utton;ane+Rost
h0
host5h,
resiQe(I0&28E,
on9ff!utton5ne- !utton(<9nA9ff<,
mode!utton5ne- !utton(<Mode<,
refresh.ut5ne- !utton(<(efresh<,
a.out.ut5ne- !utton(<'.out<,
set%ayout(ne- 6rid%ayout(C&1,
add(on9ff!utton,
add(mode!utton,
add(refresh.ut,
add(a.out.ut,
M pu.+ic .oo+ean
action(=vent evt& 9.ject
o.j0 @tring s, if
(evt.target instanceof
!utton0 @tring +a.ei 5
(@tringo. j , if
(+a.ei.e[ua+s(<9nA9ff< 0
if
(.utton@tate550
0turnon9 , M
e+se turnoff9 ,
M
if (+a.ei.e[ua+s(<Mode<
0host.response(2,M if
(+a.ei .e[ua+s (<(ef
resh< (host
.response9 , M if
(+a.ei.e[ua+s(<'.out<
(host.response(8,M
M
return true,M
pu.+ic void
turnoff(0
.utton@tate50,
mode!utton.hid
e(,
refresh.ut.hid
e(,
a.out.ut.hide(
,
host.turnoff(
,
M
pu.+ic void turnon9 0
.utton@tate5+ ,
mode!utton.sho-(,
refresh.ut.sho-(,
a.out.ut.sho-(,
host.turnon(
, M M
c+ass ;icture e/tends "ector 0
pu.+ic void dra-(6raphics g0
for(int i50,iJsiQe(,iKK0
;ic=+em current;ic5(;ic=+em
(e+ement't(i, current;ic
.dra-(g &FM M
pu.+ic void
dra-Rand+e(6ra
phics g
0 for(int
i50,iJsiQe(,i
KK0
;ic=+em
current;ic5(;ic=+em
(e+ement't(i,
current;ic.dra-Rand+e(g
,
1EE
Ciprian-Daniel NEAGU" Severin BUMBARU
>
pu.+ic ;icture
trans+ation(3rans+ator
trans+ator0 ;icture
ans5ne- ;icture 9,
for(int i50,iJsiQe
(,i K K 0
;ic=+em current;ic5((;ic=+em
(e+ement't(i.trans+ation(trans+ato
r,
ans.add=+ement(
current;ic , *
return ans,
*
*
c+ass Circ+e imp+ements ;ic=+em0 private int
/&y& repu.+ic Circ+e(int /+& int y+& int
r+0/5/+, y5y+, r5r+,AAcenter (/&t&
radius r
*
pu.+ic Circ+e(;oint p& int r+
0 /5p./, y5p.y, r5r+, M pu.+ic
void dra-(6raphics g
0 g.fi++9va+(/Fr&yFr&2)r&2)r, M
pu.+ic void dra-Rand+e(6raphics
g0
g.setCo+or(Co+or.red,
int /+5+ocation(./& y+5+ocation(.y,
int rad5*,
g.fi++9va+(/+Frad&y+Frad&2)rad&2)rad,
*
pu.+ic ;ic=+em trans+ation(3rans+ator
trans+ator0
;oint p5ne- ;oint(/&y,
Circ+e ans 5 ne-
Circ+e(trans+ator.trans+ation(p&r,
return ans,
*
pu.+ic ;ic=+em ref+ection(Mirror m0
;oint p5ne- ;oint(/&y,
Circ+e ans5ne-
Circ+e(m.ref+ection(p&r,
return ans,
*
pu.+ic ;oint +ocation9 0
;oint p5ne- ;oint(/&y ,
return p,
*
pu.+ic void move (;oint p0
int /Diff5p./F+ocation9 ./,
int yDiff5p.yF+ocation9 .y,
/K5/Diff,
yK5yDiff, *
*
a.stract interface ;ic=+em0
pu.+ic a.stract void dra-(6raphics g,
pu.+ic a.stract void dra-Rand+e(6raphics g
,
pu.+ic a.stract ;ic=+em
trans+ation(3rans+ator trans+ator,
pu.+ic a.stract ;ic=+em ref+ection(Mirror
m,
pu.+ic a.stract ;oint +ocation9,
pu.+ic a.stract
void move(;oint p, *
Applet :#. .i5ierul 2y2at'.$ava/ apli%a"ia
7ransformations.
* *
A)c+asa care defineVte funcLii+e matematice.
Metode+e (si c+asa sunt pu.+ice si statice&
deci pot fi fo+osite fara a necesita
dec+ararea unui o.iect Mymath.)A
import j ava.a-t.),
pu.+ic c+ass MyMath0
Afprodusu+ sca+ar a+ doi
vectori 2D.)A pu.+ic
static int dot(int12 veci&
int12 vec20 return
veci102)vec2
102Kvec+112)vec2112,
*
Afnorma unui vector 2
/ 1.)A pu.+ic static
dou.+e norm(int12
veci0
return Math.s[rt(dot(veci&veci ,
*
pu.+ic static dou.+e norm(;oint p0
int12 vec50p./&p.yM,
return norm(vec,
*
A)pentru un vector 2/1& reQu+ta un
vector unitate cu aceeaVi direcLie.)A
pu.+ic static dou.+e 12 unit(int12
veci0
178
Anexa : sursele aplica iilor privind transformrile 2D (capitolul
V)
d>19#% (* !2.<Ev%3#(0*Q2>$&v%3#/
+v%3-(1*Q2>$&v%3#/:0 %'12 !2.0
:
Afunghiu+ in grade intre doi
vectori in 2D.)A pu.+ic static
dou.+e ang+edeg(int12 veci&
int12 vec20
dou.+e ans,
dou.+e den5norm(vec+)norm(vec2,
AA.e-are of Qero denominatorsT
if(den5500 return 0, AAone of the
vectors is the Qero vector
*
e+se0 ans5(1D0AMath.;I)Math.acos(dot(v
eci&vec2Aden,return ans,M
* Afconversie
radianiFZgrade.)A
pu.+ic static dou.+e ma4eDegree(dou.+e
ang+e(ad0 return ang+e(ad)1D0AMath.;I,M
Afconversie gradeFZradiani.)A
pu.+ic static dou.+e ma4e(adian(dou.+e
ang+eDeg0 return ang+eDeg]Math.;IA1D0,M
Afdistanta euc+idianX intre doua puncte in
p+an.]A
pu.+ic static dou.+e dist(;oint pi& ;oint
p20
return Math.s[rt((p+./Fp2./)(p+./F
p2./K(p+.yFp2.yf(p+.yFp2.y,
*
pu.+ic static dou.+e dist(int
/+& int y+& int /2& int y2
0 return dist(ne-
;oint(/+&y+& ne-
;oint(/2&y2,
*
AfrotunjeVte un dou.+e +a un
numXr dat de Qecima+e.)A
pu.+ic static dou.+e
dec;+ace(dou.+e num& int d0
return (dou.+e
(Math.round(num]Math.po-(10.0&dA
(Math.po-(10.0&d,
*
Afpanta unei drepte intre doua puncte:
sistemu+ de coordonate are originea
sistemu+ui de coordonate ecran: stg sus.
drepte+e vertica+e intorc Nan.]A pu.+ic
static dou.+e s+ope(;oint pi& ;oint p20
if (pi./55p2./0return :+oat.NaN,M
e+se0
dou.+e num 5p+.yFp2.y,
dou.+e den5p2./Fp+./,
return numAden,
* * pu.+ic static void
d.g(@tring msg
0@ystem.out.prinLIn(msg,M
*
Applet :#&. .i5ierul Pi%ture.$ava/ apli%a"ia
7ransformations.
Af'pp+et demo: o.iecte grafice necesare an
trans+aLia 2D.)A
import j
ava.a-t.),
import j
ava.ut
i1.),
a.stract interface ;ic=+em0
pu.+ic a.stract void dra-(6raphics g,
pu.+ic a.stract void dra-Rand+e(6raphics
g,
pu.+ic a.stract ;ic=+em
trans+ation(3rans+ator trans+ator,
pu.+ic a.stract ;ic=+em ref+ection(Mirror
m,
pu.+ic a.stract ;ic=+em rotation((otor m,
pu.+ic a.stract ;oint +ocation9,
pu.+ic a.stract void
move(;oint p, *
c+ass Circ+e
imp+ements
;ic=+em0 priv
ate int
/&y&r,
pu.+ic Circ+e(int /+& int y+& int r+0/5/+,
y5y+, r5r+,AAcenter (/&t& radius r *
pu.+ic Circ+e(;oint p& int r+
0/5p./, y5p.y, r5r+,M pu.+ic
void dra-(6raphics g
0g.fi++9va+(/Fr&yFrd2)r& 2)r ,M
pu.+ic void dra-Rand+e(6raphics
g 0
g.setCo+or(Co+or.red,
int /+5+ocation(./& y+5+ocation(.y,
int rad5*,
g.fi++9va+(/+Frad&y+Frad&2]rad&2)rad,
*
pu.+ic ;ic=+em trans+ation(3rans+ator
trans+ator0
;oint p5ne- ;oint(/&y,
Circ+e ans 5 ne-
Circ+e(trans+ator.trans+ation(p&r,
return ans,
*
pu.+ic ;ic=+em
ref+ection(Mirr
or m0 ;oint
p5ne-
;oint(/&y,
179
Ciprian-Daniel NEAGU" Severin
BUMBARU
Circ+e ans5ne-
Circ+e(m.ref+ection(p
&r, return ans,
M
pu.+ic ;ic=+em
rotation((otor rotor0
;oint p5ne- ;ointJ/&y,
Circ+e ans 5 ne-
Circ+e(rotor.rotation(p
&r,
return ans,
M
pu.+ic ;oint +ocation(0
;oint p5ne- ;oint(/&y,
return p,
M
pu.+ic void move (;oint p0
int /Diff5p./F
+ocation(./,
int yDiff5p.yF
+ocation(.y,
/K5/Diff,
yK5yDiff, M M
c+ass ;o+y e/tends
"ector imp+ements
;ic=+em0 private
int r5* , pu.+ic
;o+y(0super(,M
pu.+ic ;o+y(;oint12
;& int n0 this9 ,
for(int i50, iJn
,iKK0
add=+ement(;1
i2, M M
pu.+ic void
dra-(6raphics
g0 ;oint p&[,
for(int
i50,iJsiQe(F
+,iKK0
p 5
(;ointe+ement't
(i, [ 5 (;oint
e+ement't
(iK1 ,
g.dra-%ine(p./&p
.y&[./&[.y ,
M
if(siQe(Z00
p 5 (;oint
e+ement't (siQe (F
1 ,
[ 5
(;ointe+ement't(0,
g.dra-%ine
(p./&p.y&[./&[.y, M M
pu.+ic void
dra-Rand+e(6raphics
g0
g.setCo+or(Co+or.red
, int
/+5+ocation(./&
y+5+ocation(.y, int
rad5*,
g.fi++9va+(/+F
rad&y+F
rad&2)rad&2)rad,
M
pu.+ic ;ic=+em
trans+ation(3rans+ator
trans+ator0 ;oint
p&[,
;oint12 ;5ne-
;oint1siQe(2,
for(int
i50,iJsiQe(,iK
K0
p 5
(;ointe+ement't(i,
[5ne-
;oint(p./&p.y,
[5trans+ator.trans+a
tion([,
;1i25[, M
return ne-
;o+y(;&siQe(
,
M
pu.+ic ;ic=+em
ref+ection(Mirror
ref+ector0 ;oint
p&[,
;oint12 ;5ne-
;oint1siQe (2,
for(int
i50,iJsiQe(,iK
K0
p 5 (;ointe+ement't
(i,
AAd.g(<;oint<Kp,
[5ne-
;oint(p./&p.y,
[5ref+ector.ref+ecti
on([,
;1i25[, M
return ne-
;o+y(;&siQe9
,
M
pu.+ic ;ic=+em
rotation((otor
rotor0 ;oint
p&[,
;oint12 ;5ne-
;oint1siQe (2,
for(int
i50,iJsiQe(,iK
K0
p 5
(;ointe+emen
t't(i, [5ne-
;oint(p./&p.y
,
[5rotor.rotat
ion([,
180
Anexa : sursele aplica iilor privind transformrile 2D (capitolul
V)
;1i25[, *
return ne-
;o+y(;&siQe(
,
*
pu.+ic void tnove (;oint mp 0
int /Diff5mp./F
+ocation(F/,
int yDiff5mp.yF
+ocation(.y,
for(int
i50,iJsiQe(,iK
K0
;oint p 5
(;ointe+ement't(i,
p./K5/Diff, p.yK5yDiff,
set=+ement't(p&i, * *
pu.+ic void
add;oint(;oint ;
0add=+ement(;,M pu.+ic
;oint +ocation(0
;oint p5ne-
;oint(0&0,
for(int
i50,iJsiQe(,i
KK0
;oint [ 5 (;oint
e+ement 't (i ,
p./K5[./,
p.yK5[.y,
*
if (siQe(Z00
p./5(int(p./AsiQe(,
p.y5(intp.yAsiQe(,
*
return p,
c+ass ;icture e/tends "ector 0
pu.+ic void dra-(6raphics g0
for(int i50,iJsiQe(,iKK0
;ic=+em current;ic5(;ic=+em
(e+ement't(i,
current;ic.dra-(g, * *
pu.+ic void
dra-Rand+e(6ra
phics g
0 for(int
i50,iJsiQe(,i
KK0
;ic=+em current;ic5(;ic=+em
(e+ement't(i,
current;ic.dra-Rand+e(g, * *
pu.+ic ;icture
trans+ation(3rans+ator
trans+ator0 ;icture ans5ne-
;icture(, for(int
i50,iJsiQe(,iKK0 ;ic=+em
current;ic5((;ic=+em
(e+ement't(i.trans+ation(trans
+ator,
ans.add=+ement(current;ic,
*
return ans,
*
pu.+ic ;icture
ref+ection(Mirro
r m0 ;icture
ans5ne-
;icture(,
for(int
i50,iJsiQe(,iK
K0
;ic=+em current;ic5((;ic=+em
(e+ement't(i.ref+ection(m,
ans.add=+ement(current;ic,
*
return ans,
*
pu.+ic ;icture
rotation((otor
rotor0 ;icture
ans5ne-
;icture(,
for(int
i50,iJsiQe (,iK
K0
;ic=+em current;ic5((;ic=+em
(e+ement't(i.rotation(rotor,
ans.add=+ement(current;ic,
*
return ans,
*
*
Observaie: pentru o list complet a variantelor fiierelor surs
Java i HTML pe tema tratrii transformrilor 2D (aplicaia
Transformations), putei face referire la pagina web anunat n
introducere.
18
1
7. ANEXA : SURSELE APLCA|LOR PRVND
TRANSFORMRLE 3D (CAPTOLUL V)
Modelele obiectelor folosite n aplicaia ViewFrame sunt
definite mai jos:
Axele de
coordonate:
vOOO
v4000
v0 40 0
v0 0 40
3OOO
10 1
I02
I03
N-.$!@ v 30 -30
0 v 15-30 25.98
v-15-30 25.98 v
-30 -30 0 v-15-
30-25.98 v 15-
30-25.98 v 30
30 0 v 15 30
25.98 v-15 30
25.98 v -30 30 0
v-15 30-25.98 v
15 30-25.98
6000
1.105. 1
1.10
6. 2
I23
I34
I45
I50
I06 I
1 7
I28
I39
14
10
1511
I67
I78
I89
19
10
I 10 11
111 6
color 255 0 255
=47 13-8-1
= 48 14-9-2
f 4915-10-3
f 4 10 16-11 -4
=4 11 17-12-5
f4 12 18-7-6
=6 12 34 56
= 6 -18 -17 -16 -15
-14 -13
Cubul:
v -40 -40 -40
v 40 -40 -40
v -40 40 -40
v 40 40 -40
v -40 -40 40
v 40 -40 40
v -40 40 40
v 40 40 40
6000
#capetele muchiilor
101
I02
I04
1 5
I 1 3
I26
I23
I37
I46
I45
I57
I67
color 255 0 0
#numarul de muchii pe o
fata>0
#daca e negativ, se
inverseaz sensul
f 47-5-1 2
= 4 -6 -2 3 9
f 4 12-8-7 6
= 4 10 11 -12-9
f 4 1 4-10-3
f4 58-11 -4
Piramida:
v -30 0 -30
v 30 0 -30
v 30 0 30
v -30 0 30
v0600
3OOO
IO 1
I03
I04
I 1 2
1 4
23
24
i 3 4
color 0 255 0
= 3-1 3-5
f 3 5 -7 -4
f 3 7 -8 -6
f 3 8 -3 2
= 4 1 4 6 -2
Anexa : sursele aplica iilor privind transformrile 3D (capitolul
V)
Appiet ;#1. .i5ierul .a%e.$ava/ apli%a"ia Vie(.rame.
/*________________________________________________
f'daptat si modificat 2001 Dan Neagu
) Copyright (c 1UUC C9NNI= #. ;=N6 P
$niversity of Mary+and 'II (ights (eserved.
' (((((((((((((((((((((((((((((((((((((((((((((')
import java.a-t.Co+or,
pu.+ic c+ass :ace 0
int +ine12,AA +inii+e ce definesc o fata
int num%ines, AA numXru+ tota+ de +inii
pe o fata
Co+or co+or, AA cu+oarea fetei
.oo+ean .ehind, AA f+ag: fata ascunsa
int cur, AA unde/u+ +iniei
pu.+ic :ace (int num0
co+or 5 nu+i,
+ine 5 ne- int 1num2,
num%ines 5 num,
.ehind 5 fa+se,
cur 5 0,
*
pu.+ic :ace (int r& int g& int .& int num0
co+or 5 ne- Co+or(r& g& .,
+ine 5 ne- int1num2,
num%ines 5 num,
.ehind 5 fa+se,
cur 5 0,
*
pu.+ic :ace
(:ace f0
if (f.co+or
55 nu+i
co+or 5
nu+i,
e+se
co+or 5 ne-
Co+or(f.co+or.get(6!
9, num%ines 5
f.num%ines, cur 5
f.cur, .ehind 5
f..ehind, +ine 5 ne-
int1num%ines2, for
(int i 5 0, i J
num%ines, iKK
+ine1i2 5 f.+ine1i2,
*
void add%ine (int +inde/0
+ine1cur2 5 +inde/,
curKK,
*
void set!ehind(.oo+ean f+ag(.ehind 5 f+ag,M
*
Appiet ;#. .i5ierul .ile.ormat3x%eption.$ava/ apli%a"ia
Vie(.rame.
pu.+ic c+ass :i+e:ormat=/ception e/tends
=/ception 0
pu.+ic
:i+e:ormat=/ception(@tring
s (super(s,M *
Appiet ;#&. .i5ierul Line.$ava/ apli%a"ia Vie(.rame.
pu.+ic c+ass %ine0
int start, AA inde/u+ punctu+ui de start
int end, AA inde/u+ punctu+ui fina+
.oo+ean
9ut9f(ange
, pu.+ic
%ine(%ine
10
start 5 1.start,
end 5 1.end,
9ut9f(ange 5
1.9ut9f(ange, *
pu.+ic %ine(int
s& int e0
start 5 s,
end 5 e,
9ut9f(ange 5 fa+se,
Appiet ;#6. .i5ierul 2atrix.$ava/ apli%a"ia
Vie(.rame.
pu.+ic c+ass Matri/ 0
183
Ciprian-Daniel NEAGU" Severin BUMBARU
f+oat 12
12
e+ement,
pu.+ic
Matri/9 0
e+ement 5 ne- f+oat 182 182 ,
this.reset 9,
*
pu.+ic
Matri/(Matri/
m 0 e+ement 5
ne- f+oat 182
182 , for(int i
5 0, i J 8, K
Ki for (int j
50, j J 8, K K
j
e+ement 1i2.1j 2 5
m. e+ement 1i2 1j2, *
pu.+ic void reset (0
for(int i 5 0,
i J 8, KKi
for(int j 50,
j J 8, KKj if
(i 55 j
e+ement1i2
1j2 5 1,
e+se
e+ement(i2 1j2 5 0,
*
pu.+ic void
mu+tip+y(Matri/
m 0 f+oat 12 12
e 5 ne- f+oat 182
182 , for(int i 5
0, i J 8, KKi
for(int j 50, j J
8, KKj for(int
4 5 0, 4 J 8, K
K4
e1i2 1j2 K5 e+ement142 1j2
) m.e+ement1i2 142 ,
for(int i 5 0, i J 8, KKi
for(int j 50, j J 8, K Kj
e+ement 1i2 1j2 5 e1i2 1j2,
*
pu.+ic Matri/
inverse(0
Matri/ m 5 ne-
Matri/(,
for (int j 50, j J 8, jKK0 AA
norma+iQarea e+ementu+ui pe
diagona+a f+oat e 5 e+ement1j21j2,
for (int i 5 0, i J 8, iKK 0
e+ement1i21j2 5
e+ement1i21j2 A e,
m.e+ement1ij 1j2 5
m.e+ement1i2 1j2 Ae,
*
for (int 4 5 0,
4 J 8, 4KK 0
if (4 T5 j 0
e 5 Fe+ement 1j2 142 ,
for (int i 5 0, i J 8, iKK 0
e+ement1i2 142 5 e+ement1i2 142 K e
) e+ement1i2 1j2, m.e+ement1i2 142 5
m.e+ement1i2 142 K e ) m.e+ement1i2
1j2, * * * * return m,
*
pu.+ic void sca+e(f+oat f 0
Matri/ m 5 ne- Matri/9 ,
for(int i 5 0,
i J 8, KKi
e+ement 1i2
(i2 5 f ,
this.mu+tip+y(m,
*
pu.+ic void trans+ate("ector vec0
trans+ate(vec.e+ement 102&
vec.e+ement112& vec.e+ement122,
*
pu.+ic void trans+ate (f+oat /& f+oat
y& f+oat Q0
Matri/ m 5 ne- Matri/9,
m.e+ement1021*2 5 /,
m.e+ement1121*2 5 y,
m.e+ement1221*2 5 Q,
this.mu+tip+y(m,
*
pu.+ic void rotate/(int degree0 AA
rotaLie dupX a/a /
f+oat d,
f+oat cos& sin,
d 5 (f+oat (degree ) Math.;IA1D0.,
sin 5 (f+oat Math.sin(d,
cos 5 (f+oat Math.cos(d,
rotate/(sin& cos,
*
pu.+ic void rotate/(f+oat sin& f+oat
cos0 AA rotaLie deFa +ungu+ a/ei /
Matri/ m 5 ne- Matri/9 ,
m&e+ement112112 5 cos,
m.e+ement122 122 5 cos,
184
Anexa 111: sursele aplica iilor privind transformrile 3D (capitolul
V)
$.%#%$%2'(1*(2* <
-.-20 $.%#%$%2'(2*
(1* < .-20
',-..$1#'-p#y&$/0
:
pu.+ic void rotatey(int degree0 AA rotaLie
deFa +ungu+ a/ei y
f+oat d,
f+oat cos& sin,
d 5 (f+oat (degree ) Math.;IA1D0.,
sin 5 (f+oat Math.sin(d,
cos 5 (f+oat Math.cos(d,
rotatey(sin& cos,
M
pu.+ic void rotatey(f+oat sin& f+oat cos0 AA
rotaLie deFa +ungu+ a/ei y
Matri/ m 5 ne- Matri/9 ,
m.e+ement102102 5 cos,
m.e+ement122122 5 cos,
m.e+ement102122 5 sin,
m.e+ement122102 5 Fsin,
this.mu+tip+y(m,
M
pu.+ic void rotateQ(int degree0 AA rotaLie
deFa +ungu+ a/ei Q
f+oat d,
f+oat cos& sin,
d 5 (f+oat (degree ) Math.;IA1D0.,
sin 5 (f+oat Math.sin(d,
cos 5 (f+oat Math.cos(d,
rotateQ(sin& cos,
M
pu.+ic void rotateQ(f+oat sin& f+oat cos0 AA
rotaLie deFa +ungu+ a/ei Q
Matri/ m 5 ne- Matri/9 ,
m.e+ement102102 5 cos,
m.e+ement112112 5 cos,
m.e+ement102112 5 Fsin,
m.e+ement112102 5 sin,
this.mu+tip+y(m,
M
pu.+ic void rotate("ector point&"ector
a/is&int ang+e0AArotaLie dupX a/aApunct date
f+oat sin/& cos/, AA unghiu+ de rotaLie deFa
+ungu+ a/ei /
f+oat siny& cosy, AA unghiu+ de rotaLie deFa
+ungu+ a/ei y
f+oat yQ7m, AA dimensiunea componentei yQ
f+oat m, AA dimensiunea vectoru+ui pe a/a
Matri/ matri/ 5 ne- Matri/9 , yQ7m5 (f+oat
Math. s[rt (a/is .e+ement 112 )a/is .e+ement
112 Ka/is .e+ement 122 )a/is. e+ement 122 ,
if (yQ7m 55 0 0 sin/ 5 0, cos/ 5 1,
M
e+se
0
sin/ 5 a/is.e+ement112AyQ7m,
cos/ 5 a/is.e+ement122AyQ7m,
M
m 5 a/is.magnitude(,
if (m 55 00
s iny 5 0,
cosy
5
1,
M
e+se0
siny 5 Fa/is.e+ement102Am,
cosy 5 yQ7mAm,
M
AA maparea originii +a punct& apoi rotaLia
a/ei Q dupX a/a / (de sus in jos
AA apoi rotaLia a/ei Q dupX a/a y
(stgAdreapta
AA a/a Q are direcLia data de uti+iQator
AA a/a Q preia unghiu+ dat.
"ector origin 5 ne- "ector(point,
matri/.trans+ate(origin.negative 9,
matri/.rotate/(sin/& cos/,
matri/.rotatey(siny& cosy,
matri/.rotateQ(ang+e,
AA procesu+ invers
matri/.rotatey(Fsiny& cosy,
matri/.rotate/(Fsin/& cos/,
matri/.trans+ate(point,
this.mu+tip+y
(matri/, M
pu.+ic void
prinL 9 0 for
(int j 5 0, j J
8, jKK
185
Ciprian-Paniel NEAGU" Severin BUMBARU
@ystem.out.prinLIn(e+ement102 1j2K<
<Ke+ement112 1j2K< <Ke+ement122 1j2K<
<Ke+ement1*2 1j2,M
Applet ;#9. .i5ierul
Ob$e%t&!.$ava/apli%a"ia Vie(.rame.
import
java.io.Input@tre
am, import
java.io.@tream3o4
eniQer, import j
ava.io.I9=/cept
ion, import
java.net.$(%,
import j
ava.a-t.Co+or,
pu.+ic c+ass 0.ject*D0
%ine +ines 12, AA muchii+e o.iectu+ui
"erte/ points$,AA v`rfuri+e o.iectu+ui
:ace faces 12, AA fete+e o.iectu+ui
"ector center, AA centru+ o.iectu+ui
int ma/;oints, AA numXru+ ma/im de
puncte
int ma/%ines, AA numXru+ ma/im de
+inii
int ma/:aces,
int num%ines, AA numXru+ de +inii a+e
o.iectu+ui
int num;oints, AA numXru+ de puncte
a+e o.iectu+ui
int num:aces,
Co+or co+or,
pu.+ic 0.ject*D(0AA iniLia+iQarea
o.iectu+ui
ma/;oints 5 I0,
ma/%ines 5 I0,
ma/:aces 5 I0,
num;oints 5 0,
num%ines g 0,
num:aces 5 0,
+ines 5 ne- %ine1ma/%ines2,
points 5 ne- "erte/1ma/;oints2,
faces 5 ne- :ace1ma/:aces2,
center 5 ne- "ector(,
co+or 5 nu+i,
*
pu.+ic 9.ject*D(9.ject*D o.ject
0 AA constuctor de copiere
num%ines 5 o.ject.num%ines,
num;oints 5 o.j ect.num;oints,
num:aces 5 o.j ect.num:aces,
ma/%ines 5 o.ject.ma/%ines,
ma/;oints 5 o.ject.ma/;oints,
ma/:aces 5 o.ject.ma/:aces,
+ines 5 ne- %ine1ma/%ines2,
points 5 ne-
"erte/1ma/;oints2, faces 5 ne-
:ace1ma/:aces2, for (int i 5
0, i J num;oints, iKK
points1i2 5 ne-
"erte/(o.ject.points
1i2, for (int i 5 0, i
J num%ines, iKK
+ines1i2 5 ne-
%ine(o.ject.+ines
1i2, for (int i 5 0,
i J num:aces, iKK
faces1i2 5 ne-
:ace(o.ject.faces
1i2, center 5 ne-
"ector(o.ject.center,
co+or 5 o.ject.co+or,
*
AA citeVte parametrii o.iectu+ui din
fiVieru+ de intrare pu.+ic
9.ject*D(Input@tream is thro-s
+9=/ception& :i+e:ormat=/ception0
this(,
@tream3o4eniQer st 5 ne-
@tream3o4eniQer(is,
st.eo+Is@ignificant(true
, st. ho JiFFitCT:] .
dN . scan:
-hi+e (true 0
s-itch
(st.ne/t3o4en
( 0
defau+t:
.rea4 scan,
case
@tream3o4eniQer
.337=9%:
.rea4, case
@tream3o4eniQer
.337=9::
.rea4 scan, case
@tream3o4eniQer.3
37_0(D: if
(<v<.e[ua+s(st.sv
a+ 0 dou.+e
/50& y50& Q50,
if (st.ne/t3o4en( 55
@tream3o4eniQer.337N$M!=(
0 / 5 st.nva+,
186
Anexa : sursele aplica iilor privind
transformrile 3D (capitolul V)
if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=(
0 y 5 st.nva+, if
(st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=(
Q 5 st.nva+, e+se thro-
ne-
:i+e:ormat=/ception(st.to@tr
ing(,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@tring(,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@tring(,
add"erte/((f+oat/& (f+oaty&
(f+oatQ, AA adaugX punctu+ +a o.iect
-hi+e (st.ttype T5
@tream3o4eniQer.337=9% PP st.ttype T5
@tream3o4eniQer. 337=9: st
.ne/t3o4en9 , .rea4,
*
e+se if (<c<.e[ua+s(st.sva+ 0AA
citeVte punctu+ de centru
dou.+e / 5 0& y 5 0& Q 5 0,
if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=(
0 / 5 st.nva+,
if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=(
0 y 5 st.nva+,
if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=( Q 5
st.nva+, e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9
,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@tr
ing9,
center.set7e+ement((f+oat/&
(f+oaty& (f+oatQ, -hi+e
(st.ttype T5
@tream3o4eniQer.337=9% PP
st.ttype T5
@tream3o4eniQer.337=9:
st.ne/t3o4en(, .rea4,
*
e+se if (<1<.e[ua+s(st.sva+ 0AA
citeVte ide/u+ pt puncte+e de capXt
int s& e,
if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=(
0 s 5 (int st.nva+,
if (st.ne/t3o4en( 55
@tream3o4eniQer.337N$M!=( e 5 (int
st.nva+, e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@t
ring9, add%ine(s& e, AA
adaugX +inia +a o.iect
-hi+e (st.ttype T 5
@tream3o4eniQer.337=9% PP
st.ttype T5
@tream3o4eniQer.337=9:
st.ne/t3o4en(, .rea4,
*
e+se if (<co+or<.e[ua+s(st.sva+
0 AA citeVte cu+oarea o.iectu+ui
int r& g& ., AA citeVte cu+oarea
if (st.ne/t3o4en( 55
@tream3o4eniQer.337N$M!=( r 5 (int
st.nva+ e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9,
if (st.ne/t3o4en9 55
@tream3o4eniQer.33N$M!=( g 5 (int
st.nva+ e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9,
if (st.ne/t3o4en9 55
@tream3o4eniQer.33bb$M!=( . 5 (int
st.nva+ e+se thro- ne-
:i+e:ormat=/ception(st.to@tring9,
co+or 5 ne- Co+or(r& g& .,
-hi+e (st.ttype T5
@tream3o4eniQer.33b*0% PP
st.ttype T5
@tream3o4eniQer.337=9:
st.ne/t3o4en(, .rea4, *
e+se if (<f<.e[ua+s(st.sva+ 0AA
citeVte fete+e o.iectu+ui int
num& 1inde/,
if (co+or 55 nu+i thro- ne-
:i+e:ormat=/ception(<Cu+oare
nedefinita<, AA numXru+ tota+ de +inii
a+e fetei if (st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=( 0 num 5 (int
st.nva+, if (num J * thro- ne-
:i+e:ormat=/ception(<NumXru+ de muchii
pe fiecare fataZ52<,
*
e+se thro- ne-
:i+e:ormat=/ception(st.to@t
ring9, add:ace(num,
for (int i 5 0, i J num, iKK 0AA
adaugX fiecare muchie a fetei if
(st.ne/t3o4en9 55
@tream3o4eniQer.337N$M!=( 0
1inde/ 5 (int st.nva+,
faces1num:acesF12.add%ine(1inde/,
*
187
Ciprian-Paniel NEAGU" Severin BUMBARU
e+se thro- ne-
:i+e:ormat=/ception(st.to@tring(,
M
-hi+e(st.ttypeT
5@tream3o4eniQer.337=9%PPst.ttypeT
5@tream3o4eniQer.337=9:
st.ne/t3o
4en(,
.rea4, M
e+se thro- ne-
:i+e:ormat=/ception(st.to@trin
g(, M M is.c+ose(,
M
pu.+ic void add"erte/(f+oat /& f+oat
y& f+oat Q0 AA adaugX un v`rf if
(num;oints Z5 ma/;oints0
ma/;oints )5 2, AA du.+eaQX
dimensiunea vectoru+ui de puncte
"erte/ 12 v 5 ne-
"erte/1ma/;oints2, for (int i 5
0, i J points.+ength, iKK
v1i2 5 ne-
"erte/(points1i2
, points 5 v,
M
points1num;oints2 5 ne- "erte/(/& y& Q,
num;ointsKK,
M
pu.+ic void add%ine(int s&
int e 0AA adaugX o muchie
if (num%ines Z5 ma/%ines 0
ma/%ines )5 2, AA du.+eaQX dimensiunea
vectoru+ui de muchii
%ine 112 5 ne- %ine1ma/%ines2,
for (int i 5 0, i J +ines.+ength, iKK
+1i2 5 ne-
%ine(+ines1i2,
+ines 5 1,
M
+ines1num%ines2 5 ne- %ine(s& e ,
num%inesKK,
M
pu.+ic void add:ace(int
num 0AA adaugX o fata
if (num%ines Z5
ma/%ines 0
ma/:aces )5 2, AA du.+eaQX dimensiunea
vectoru+ui de fete
:ace f12 5 ne- :ace1ma/:aces2,
for (int i 5 0, i J faces.+ength, iKK
f 1i2 5 ne-
:ace(faces1i2,
faces 5 f,
M
faces1num:aces2 5 ne- :ace(num,
num:acesKK,
M
AA ap+ica matricea transformXrii pt fiecare
punct a+ o.iectu+ui
pu.+ic void 3ransform*D(Matri/ m0
for (int i 5 0, i J
num;oints, iKK
points 1i2
.mu+tip+y(m &F
center.mu+tip+y(m,
M AAverifica viQi.i+itatea fiecXrei fete&
determina +uminoQitatea fetei& +umina pe a/a Q
pu.+ic void Chec4!ehind:ace( 0 int 11& 12,
int vi& v2& v*& v8 , "ector u 5 ne- "ector(,
"ector v 5 ne- "ector(, "ector norma+, f+oat
.right,
"ector Q 5 ne-
"ector(0& 0& 1,
Q.ma4e7vector(,
"ector vie-Dir 5 ne-
"ector(, int r& g&
., for (int i 5 0, i
J num:aces, iKK 0
1.107. 5 faces1i2.+ine102,
1.108. 5
faces 1i2
.+ine1+2, if
(11 J 0 0
AA daca numXru+ muchiei este
negativ& schim.a capete+e vi
5 +ines1Math.a.s(11F12 .end,
v2 5 +ines1Math.a.s(11F
12.start,
M
e+s
e 0
v- < #-2%.(##-#*..'!'0
v2 < #-2%.(11-1*.%2d0
:
if (12 J 0 0 v*5+ines1Math.a.s(12F
12.start,AAdaca nr. muchiei este negativ&
schim.a capete+e v8 5 +ines1Math.a.s(12F+2
end,
188
Anexa U: sursele aplica iilor privind transformrile 3D (capitolui
V)
>
%#.% E
v3 < #-2%.(12-
1*.%2d0 v4 <
#-2%.(12-1*..'!'0
:
AA vectoru+ norma+ +a fata
u.set7e+ement(points1vi2 .e+ement102&points
1vi2 .e+ement112 &points 1vi2 .e+ement122,
u.su.(("ectorpoints1v22,
v.set7e+ement(points1v*2.e+ement102&points1v*2.
e+ement112&points1v*2.e+ement122,
v.su.(("ectorpoints1v82, norma+ 5
u.cross7product(v,
vie-Dir.set7e+ement(points1v22.e+ement102&point
s1v22.e+ement112&points1v22.e+ement122,
vie-Dir.ma4e7vector(,
AA verifica daca norma+a +a fata are
aceeaVi direcLie cu o.servatoru+ if
(norma+.dot77product(vie-Dir J5 0
faces 1i2 ..ehind 5 true, e+se0
faces 1i2 ..ehind 5 fa+se,
.right5 (Math.a.s(norma+.dot7product(QA
(Q.magnitude( ) norma+.magnitude( ,
r 5 co+or.get(ed9 ,
g 5 co+or.get6reen9 ,
. 5 co+or.get!+ue(,
r 5 (int(rA2 K r).rightA2,
g 5 (int(gA2 K g).rightA2,
. 5 (int(.A2 K .).rightA2,
faces 1i2 .co+or 5 ne-
Co+or(r& g& ., * * *
pu.+ic void Ciipping*D("ie-:rame vf
0AAdecupare(c+ipping pe muchii+e
o.iectu+ui .yte retva+,
for (int i 5 0, i
J num%ines, iKK0
int s 5
+ines1i2.start,
int e 5
+ines1i2.end,
"ector start 5 ne-
"ector(("ectorpoints1s2, "ector end 5
ne- "ector(("ectorpoints1e2, retva+ 5
vf.C+ipping(start& end, if ((retva+ P
0/08 T5 0 0AA +inie in afara
suprafeLei de viQua+iQare
+ines 1i2 .9ut9f(ange 5 true,
points 1s2 .9ut9f(ange 5 true,
points1e2.9ut9f(ange 5 true,
*
e+se
0
if ((retva+ P 0/02 T5 00 AA punctu+ de
start in afara Qonei de viQi.i+itate
points1s2.9ut9f(ange 5 true,
add"erte/(start.e+ement102&
start.e+ement112& start.e+ement122,
+ines1i2.start 5 num;oints F 1,
*
if ((retva+ P 0/01 T5 0 0AA punctu+ de
capXt in afara Qonei de viQi.i+itate
points1e2.9ut9f(ange 5 true,
AAadaugX nou+ punct& Vterge +inia
pana +a fsoLu+ capXt
add"erte/(end.e+ement102&
end.e+ement112& end.e+ement122,
+ines1i2.end 5 num;oints F 1, * * * *
pu.+ic void ;erspective*D(int distance
0AAtransformarea perspectiva pt fiecare punct
for (int i 5 0, i J num;oints, iKK if
(points1i2.9ut9f(ange 55 fa+se points 1i2
.perspective(distance,
center.perspective(distance,
*
pu.+ic 0.ject*D Move73ransform(Matri/ m&
"ie-:rame vf0 AA transformarea o.iectu+ui
3ransform*D(m,
0.ject*D o.ject 5 ne- 0.ject*D(this,
o.ject.3ransform*D(vf._2:7Matri/,
o.j ect.Chec4!ehind:ace(,
o.ject.CIipping*D(vf,
o.ject.;erspective*D(100,AA distanta
o.servatoru+u+99 unit of ":>
o.ject.3ransform*D(vf.:2@7Matri/,
return
o.ject, * *
Applet ;#:. .i5ierul 0urfa%e.rame.$ava/ apli%a"ia
Vie(.rame.
189
Ciprian-Paniel NEAGU" Severin BUMBARU
import j ava.a-t.),
import java.io.Input@tream,
import j ava.net.$(%,
pu.+ic c+ass @urface:rame e/tends
java.app+et.'pp+et imp+ementa
(unna.+e0 "-Canvas "ie-_indo-,
"-Contro+ Contro+;ane+, Contro+9ption
options, "ie-:rame Camera, 0.ject*D
9.ject, 0.ject*D origin9.ject,
0.ject*D ne-9.ject, 0.ject*D '/is,
0.ject*D ne-'/is, 3hread runner 5
nu+i, pu.+ic void init(0
set%ayout(ne- !order%ayout(I& I,
Camera 5 ne- "ie-:rame(,AA iniLia+iQeaQX
camera
"ie-_indo- 5 ne- "-Canvas(this,
Contro+;ane+ 5 ne- "-Contro+(this,
add (<_est<& Cont ro+;ane1,
add (<=ast<& "ie-_indo-,
options 5 ne- Contro+9ption(true& 0& 1& 0&
0, AA seteaQX va+ori+e iniLia+e
Input@tream is 5 nu+i, AA preia sistemu+ de
coordonate
try 0
is 5 ne- $(%(getDocument!ase ( &
<mode+Aa/is< .open@tream9 &F'/is
5 ne- 9.ject*D(is,
*
cateh (=/ception e 0M
Matri/ m 5 ne- Matri/9,AA ap+ica
transformarea proiectiva a/ei
ne-'/is 5 '/is.Move73ransform(m& Camera,
init7Mode+(0, AA iniLia+iQeaQX mode+u+
o.iect
*
pu.+ic void
init7Mode+(int
se+ection0 @tring
mdName 5 nu+i,
Input@tream is 5
nu+i,
s-itch (se+ection 0AA
preia mode+u+ din se+ecLie
case 0:
mdName 5 ne-
@tring(<mode1Acu.e<
, .rea4, case 1:
mdName 5 ne-
@tring(<mode+Apyramid
<, .rea4, case 2:
mdName 5 ne-
@tring(<mode+Acy+ind
er<, .rea4,
*
tr
y
0
is 5 ne- $(%(getDocument!ase(&
mdName.open@tream9,
9.ject 5 ne- 9.ject*D(is,
*
catch (=/ception e 0M
origin9.ject 5 ne- 0.ject*D(9.ject, AA
ap+ica transformarea proiectiva o.iectu+ui
Matri/ m 5 ne- Matri/9,
m.trans+ate(0& 0& 1I0,
ne-9.ject 5 9.ject.Move73ransform(m&
Camera,
*
pu.+ic Insets insets(0return ne- Insets(10&
10& 10& 10,M
pu.+ic void start(0
options.animat
ion 5 true, if
(runner 55
nu+i0
runner 5 ne-
3hread(this,
runner.start(, *
* pu.+ic void
stop(0
options.animation 5 fa+se,
if (runner T5 nu+i
0 runner.stop(, runner 5
nu+i, * * pu.+ic void run(
0AA funcLia de animaLie a
o.iectu+ui
3hread.current3hread(
.set;riority(3hread.MIN7;(I9(I3G , -hi+e
(runner T5 nu+i0 Matri/ m 5 ne- Matri/9,
s-itch (options.rotate7inde/ 0AA rotaLia
o.iectu+ui dupX a/a se+ectata
190
Anexa : sursele aplica iilor privind transformrile 3D (capitolul
V)
case 0:
m.rotate/(1 ,
.re
a4,
case
1:
m.rotatey(1,
.re
a4,
case
2:
m.rotateQ(1,
.re
a4,
case
*:
m.rotate/(F1 ,
.re
a4,
case
8:
m.rotatey(F+,
.re
a4,
case
I:
m.rotateQ(F1,
.rea4,
*
"ector a/is 5 ne- "ector(,AA
sensu+ se+ectat a+ rotaLiei
s-itch (options.spin7inde/
0 case 0:
a/is.set7e+emen
t(1& 0& 0 ,
a/is.ma4e7vecto
r( , .rea4,
case 1:
a/is.set7e+emen
t(0& 1& 0,
a/is.ma4e7vecto
r(, .rea4,
case 2:
a/is.set7e+emen
t(0& 0& 1,
a/is.ma4e7vecto
r(, .rea4,
case *:
a/is.set7e+emen
t(F1& 0& 0 ,
a/is.ma4e7vecto
r( , .rea4,
case 8:
a/is.set7e+emen
t(0& F+& 0 ,
a/is.
ma4e77vector (
, .rea4, case
I:
a/is.set7e+ement
(0& 0& F1 ,
a/is.ma4e7vector
(, .rea4, *
m.rotate(9.ject.center& a/is& * ,
AA ap+ica transformarea proiectiva
pt o.iect si redeseneaQa ne-9.ject
5 9.ject.Move73ransform(m&
Camera, "ie-_indo-.repaint(, try
03hread.s+eep(I0,M catch
(Interrupted=/ception e 0 M * *
pu.+ic void move(int /&int y&int Q&.oo+ean
f+ag0AAdep+(rotaLie& sens& trans+aLie
Matri/ m 5 ne- Matri/9 ,
if (options.o.ject7inde/ 55 0 PP
options.animation 55 fa+se 0AA muta
o.iectu+ s-itch (options.method7inde/
0 case 0: AA trans+atare
if (f+ag 55 true0AA drag de mouse
"ector direction 5 ne-
"ector(/& y& Q,
direct
ion.ma4e7vector(,
AA transforma acLiunea mouseFu+ui
in coordonate a+e +umii rea+e
direction.mu+tip+y(Camera.@2:7Matri
/,
direction.mu+tip+y(Camera.:2_7Matri
/, m.trans+ate(direction, *
e+se AA 'cLiune de +a .uton
m.trans+ate((f+oatI)/&
(f+oatI)y& (f+oatI)Q,
.rea4, case 1: AA rotaLie if
(/ 55 1
m.rotate
/(10, if
(y 55 1
m.
rotatey
(10 &Fif
(Q 55 1
m.rotateQ(10,
Ciprian-Daniel NEAGU" Severin BUMBARU
if (/ 55 F1
m.rotate
/(F10,
if (y 55
F1
m.rotate
y(F10,
if (Q 55
F1
m.rotateQ
(F10,
.rea4,
case 2: AA
rXsucire
"ector a/is 5 ne- "ector(/& y& Q ,
a/is.ma4e7vector(,
if (f+ag 55 true 0 AA drag de mouse
a/is.orthogona+(,
a/is.mu+tip+y(Camera.@2:7Matri/, AA
screen vector FZ vie-frame vector,
a/is.mu+tip+y(Camera.:2_7Matri/,
M
m.rotate(9.ject.center& a/is& 10,
.rea4,
M
AA transforma o.iectu+ si
redeseneaQa vie- -indo-
ne-9.ject 5
9.ject.Move73ransform(m&
Camera,
"ie-_indo-.repaint(,
M
e+se 0AA muta camera
s-itch
(options.method
7inde/ 0 case
0: AA
trans+aLie
"ector distance 5 ne-
"ector(I)/& I)y& I)Q,
distance.ma4e7vector(,
Camera.3rans+ate(distanc
e, .rea4,
c 1
i (
i (
i (
i (
i (
i (
AA rotaLie
55 1
Camera.(otateB(10
, 55 1
Camera.(otateG(10
, 55 1
Camera.(otate>(10
, WW F1
Camera.(otateB(F
10, 55 F1
Camera.(otateG(F
10, 55 F1
Camera.(otate>(F
10, .rea4,
M
ne-'/is 5 '/is.Move73ransform(m&
Camera, AA transforma a/a
if (options.animation 55 fa+se 0
ne-9.ject 5
9.ject.Move73ransform(m&
Camera,
"ie-_indo-.repaint(, M M M
pu.+ic void
resetCamera(
0 Matri/ m 5
ne- Matri/(,
Camera 5 ne- "ie-:rame(,AA
iniLia+iQeaQX camera si transforma
a/a ne-'/is 5 '/is.Move73ransform(m&
Camera,
AA +a animaLie oprita&
transforma o.iectu+ si
redeseneaQa if
(options.animation 55 fa+se 0
ne-9.ject 5
9.ject.Move73ransform(m&
Camera,
"ie-_indo-.repaint(, M M
pu.+ic void
reset9.ject(
0 Matri/ m 5
ne- Matri/(,
9.ject5ne- 9.ject*D(origin9.ject,AAreset
o.iect +a condiLii iniLia+e si transforma
ne-9.ject 5 9.ject.Move73ransform(m& Camera,
"ie-_indo-.repaint(, M M c+ass Contro+9ption0
.oo+ean animation, AAf+ag
animaLie int rotate7inde/,
AAdirecLia de rotaLie int
spin7inde/, AAsensu+ de
rotaLie int o.ject77inde/,
AAdep+aseaQX o.iectu+ sau camera
int method7inde/,
AAtrans+atieAinvarteAroteste
Contro+9ption(.oo+ean f+ag& int
ri& int si& int oi& int mi 0
set7animation(f+ag,
set7rinde/(ri, set7sinde/(si,
set7oinde/(oi, set7minde/(mi,
M
pu.+ic void set7animation(.oo+ean f+ag
(animation 5 f+ag&M
pu.+ic void set7rinde/(int ri 0rotate7inde/
5 ri&M
1U2
Anexa : sursele aplica iilor privind transformrile 3D (capitolul
V)
pu.+ic void set7minde/(int
mi 0method7inde/ 5 mi, M
pu.+ic void set7sinde/(int
si 0 spin7inde/ 5 si, M
pu.+ic void set7oinde/(int
oi 0 o.ject7inde/ 5 oi, M
M
c+ass "-Contro+
e/tends ;ane+0
!utton start&
stop, Choice
rotate& spin,
Choice
o.ject7+ist&
method7+ist,
Choice mode+7+ist,
!utton up& do-n& +eft& right& in& out,
!utton resetCamera& reset9.ject,
@urface:rame ca++er,
"-Contro+(@urface:rame parent0 AA
+ayout: .utoane& etichete& opLiuni.
ca++er 5 parent,
6rid!ag%ayout grid.ag 5 ne- 6rid!ag%ayout(,
6rid!agConstraints c 5 ne-
6rid!agConstraints(,
set%ayout(grid.ag,
c.fi++ 5 6rid!agConstraints.!93R,
c.-eight/ 5 1.0,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
%a.ei mode+ 5 ne- %a.ei(<Mode+u+
o.iectu+ui:<& %a.e+.%=:3,
grid.ag.setConstraints(mode+& c,
add (mode+,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
mode+7+ist 5 ne- Choice(,
mode+7+ist.add+tem(<Cu.<,
mode+7+ist.add+tem(<;iramida<,
mode+7+ist.add+tem(<;risma<,
grid.ag.setConstraints(mode+7+ist& c,
add(mode171ist,
mode+7+ist.se+ect(<Cu.<,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
resetCamera 5 ne- !utton(<(eset Camera<,
grid.ag.setConstraints(resetCamera& c,
add (resetCamera,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
reset9.ject 5 ne- !utton(<(eset 9.iect<,
grid.ag.setConstraints(reset9.ject& c,
add (reset9.ject,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
c.-eight/ 5 0.0,
%a.ei 11 5 ne- %a.ei(<'nimaLie:<&
%a.ei.C=N3=(,
grid.ag.setConstraints(11& c ,
add (11,
c.-eight/ 5 1.0,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
%a.ei 12 5 ne- %a.ei(<(otaLie dupX: <&
%a.e+.%=:3,
grid.ag.setConstraints(12& c,
add (12,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
rotate 5 ne- Choice(,
rotate.add+tem(<a/a B (CC_<,
rotate.add+tem(<a/a G (CC_<,
rotate.add+tem(<a/a > (CC_<
rotate.add+tem(<a/a B (C_<
rotate.add+tem(<a/a G (C_<,
rotate.add+tem(<a/a > (C_<,
grid.ag.setConstraints(rotate& c ,
add(rotate,
rotate.se+ect(<a/a B (CC_<,
c.grid-idth 5 6rid!agConstraints .(=%'3I"= &F
%a.ei 1* 5 ne- %a.ei(<(Xsucire dupX: <&
%a.e+.%=:3,
grid.ag.setConstraints(1*& c,
add (1*,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
spin 5 ne- Choice(,
spin.add+tem(<a/a B (CC_<,
spin.add+tem(<a/a G (CC_<,
spin.add+tem(<a/a > (CC_<,
spin.add+tem(<a/a B (C_<,
spin. add+tem (<a/a G (C_ < &F
spin.add+tem(<a/a > (C_<,
grid.ag.setConstraints(spin& c ,
add(spin,
spin.se+ect(<a/a G (CC_<,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
start 5 ne- !utton( <@tart< &F
193
Ciprian-Daniel NEAGU" Severin BUMBARU
grid.ag.setConstraints(start& c,
add (start,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
stop 5 ne- !utton(<@top<,
grid.ag.setConstraints(stop& c,
add(stop,
c.-eigh_f F50.F0, ...
& 7
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
%a.ei 18 5 ne- %a.ei(<Manua+:
M
&
%a.ei.C=N3=(,
grid.ag.setConstraints(18& c,
add(18 ,
c.-eight/ 5 1.0,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
%a.ei 1I 5 ne- %a.ei(<Muta:<& %a.e+.%=:3,
grid.ag.setConstraints(1I& c,
add (1I ,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
o.ject7+ist 5 ne- Choice9,
o.ject7+ist.add+tera(<9.iectu+<,
o.ject7+ist.add+tem(<Camera<,
grid.ag.setConstraints(o.ject7+ist& c,
add(o.ject7+ist,
o.ject7+ist.se+ect(<9.iectu+<,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
%a.ei 1C 5 ne- %a.ei(<Metoda: <&
%a.e+.%=:3,
grid.ag.setConstraints(1C& c,
add (1C ,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
method7+ist 5 ne- Choice9 ,
method7+ist.add+tem(<3rans+atie<,
method7+ist.add+tem(<(otaLie<,
method7+ist.add+tem(<(Xsucire<,
grid.ag.setConstraints(method7+ist& c,
add(method7+ist,
method7+ist.se+ect(<3rans+aLie<,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
up 5 ne- !utton(<@us<,
grid.ag.setConstraints(up& c,
add(up,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
do-n 5 ne- !utton(<bos<,
grid.ag.setConstraints(do-n& c,
add(do-n,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
+eft 5 ne- !utton(<@t`nga<,
grid.ag.setConstraints(+eft& c,
add(+eft,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
right 5 ne- !utton(<Dreapta<,
grid.ag.setConstraints(right& c,
add (right,
c.grid-idth 5 6rid!agConstraints.(=%'3I"=,
in 5 ne- !utton(<anXuntru<,
grid.ag.setConstraints(in& c,
add(in,
c.grid-idth 5 6rid!agConstraints.(=M'IND=(,
out 5 ne- !utton(<In afara<,
grid.ag.setConstraints(out& c,
add(out,
*
pu.+ic Insets insets(0 return ne-
Insets(10& 10& 10& 10,M
pu.+ic .oo+ean action(=vent evt& 9.ject arg
0
if (evt.target instanceof !utton
hand+e!utton(evt, AA acLionarea .utonu+ui
if (evt.target instanceof Choice
hand+eChoice(evt& arg, AA acLionarea
opLiunii
return true,
*
pu.+ic void hand+eChoice(=vent evt&
9.ject arg 0AA evenimentu+: opLiune
int inde/ 5 ((ChoiceevtF
target.get@e+ected+nde/(, if
(evt.target 55 mode+7+ist 0AA a+ege
mode+u+ si reincepe if
(ca+Ier.options.animation 55 true
ca++er.stop(,
ca+Ier.init7Mode+(inde/,
ca++er.start(,
*
if (evt.target 55 rotate
ca++er.options.set7rinde/(inde/
, if (evt.target 55 spin
ca++er.options.set77sinde/(inde/
, if (evt.target 55
o.ject7+ist
0 ca++er.options.set7oinde/(inde
/,
184
Anexa : sursele aplica iilor privind transformrile 3D (capitolul
V)
AAsFa a+es dep+asarea camerei si acum este
rXsucire
if (inde/ 55 1 PP
method7+ist.get@e+ected+nde/( 552 0
method7+ist.se+ect(1 ,
ca++er.options.s
et7minde/(1 , * *
if (evt.target 55
method7+ist 0
if (ca++er.options.o.ject7inde/ 551 0AA
camera se dep+aseaQX
if (inde/ 552 0AA schim.a
sensu+ de rXsucire inde/
5 1,
method7+ist.se+ect(inde/
,
* * if (inde/ T5
0 0AA tras+atie
up.set%a.e+(<a/a G (CC_
11
,
do-n.set%a.e+(<a/a G (C_<,
+eft.set%a.ei(<a/a B (C_<,
right.set%a.e+(<a/a B (CC_<,
in.set%a.e+(<a/a > (CC_<,
out.set%a.e+(<a/a > (C_<,
*
e+se0AA rotaLie sau rXsucire
up.set%a.e+(<@us<,
do-n.set%a.e+(<bos<,
+eft.set%a.e+(<@t`nga< ,
right.set%a.e+(<Dreapta<,
in.set%a.e+(<anXuntru<,
out.set%a.e+(<In afara<,
*
ca++er.options.set7minde/(inde/,
* * pu.+ic void
hand+e!utton(=vent
evt 0
if (evt.target 55 start ca++er.start(,
if (evt.target 55 stop ca++er.stop(,
if (evt.target 55 up ca++er.move(0& 1& 0&
fa+se,
if (evt.target 55 do-n ca++er.move(0& F+& 0&
fa+se,
if (evt.target 55 +eft ca++er.move(F+& 0& 0&
fa+se,
if (evt.target 55 right ca++er.moved& 0& 0&
fa+se,
if (evt.target 55 in ca++er.move(0& 0& 1&
fa+se,
if (evt.target 55 out ca++er.move(0& 0& F+&
fa+se,
if (evt.target 55 resetCamera
ca++er.resetCamera(,
AAnu permite modificarea o.iectu+ui animat
if
(evt.target55reset9.jectPPca++er.options.animat
ion55fa+se ca++er.reset9.ject9, * *
c+ass "-Canvas e/tends Canvas0AA
c+asa pt fereastra de viQua+iQare
0.ject*D 9.ject, 0.ject*D '/is,
@urface:rame ca++er, Image off+mage,
AA Dou.+e !uffering 6raphics
off6raphics, int prev/& prevy,
"-Canvas(@urface:rame parent0
ca++er 5 parent,
set!ac4ground(Co+or..+ac4,
resiQe ((intca++er.Camera."_&
(intca++er.Camera."R,
*
pu.+ic void update(6raphics g
0paint(g,M AA funcLia de
actua+iQare pu.+ic void
paint77a/is(6raphics off6raphics
0 off6raphics.setCo+or(Co+or.-hite
,
for (int i 5 0, i J '/is.num%ines, iK
K 0AA _C@ a/e+e de coordonate if
('/is.+ines 1i2 .9ut9f(ange T5 true
0 int start 5 '/is.+ines1i2.start,
f+oat start/ 5
'/is.points1start2.e+ement102, f+oat
starty 5
'/is.points1start2.e+ement112, int
end 5 '/is.+ines1i2.end, f+oat end/
5 '/is.points1end2 .e+ement102,
f+oat endy 5
'/is.points1end2.e+ement112,
off6raphics.dra-%ine((intstart/&
(intstarty& (intend/& (intendy, if (i
55 0 off6raphics.dra-@tring(</<&
(intend/& (intendy, if (i 55 1
off6raphics.dra-@tring(<y<& (intend/&
(intendy, if (i 55 2
off6raphics.dra-@tring(<Q<& (intend/&
(intendy, * * * AA deseneaQX o.iectu+ si
a/a _C@ in fereastra de viQua+iQare
195
Ciprian-Daniel NEAGU" Severin BUMBARU
pu.+ic void
paint(6raphics
g 0 :ace f,
%ine 1 ,
.oo+ean first, int
first%ine 5 0, int
/50& y50, int /+&
y+& /2& y2 , int
-idth 5
(intca++er.Camera
."_, int height 5
(intca++er.Camera
."R, 9.ject 5
ca++er.ne-9.ject,
'/is 5
ca++er.ne-'/is, if
(off6raphics 55
nu+i 0
off+mage 5 create+mage(siQe(.-idth&
siQe9 .height,
off6raphics 5 offImage.get6raphics(,
*
off6raphics.setCo+or(get!ac4ground(,AA
Vterge
off6raphics.fi++(ect(0& 0& siQe(.-idth&
siQe(.height,
AA daca o.iectu+ e in fata a/e+or&
deseneaQX intai a/e+e
if (9.ject.center.e+ement122 J
'/is.center.e+ement122
paint7a/is(off6raphics, for (int i 5
0, i J 9.ject.num:aces, iKK 0AA
deseneaQX fete+e nevisi.i+e f 5
9.ject.faces 1i2, if (f..ehind 55
fa+se 0 first 5 true,
;o+ygon po+y 5 ne-
;o+ygon9 , for (int j
50, j J5 f.num%ines,
jKK 0 int 4 5 j,
if (4 55 f.num%ines 4
5 first%ine, 1 5
9.ject.+ines1Math.a.s(
f.+ine142F12, if
(1.9ut9f(ange 55
fa+se 0
if (first 55 true first%ine 5
j, AA determina prima muchie AA
daca numXru+ +iniei este
negativ& schim.a capete+e if
(f.+inet42 J 0 0
/+ 5
(int9.ject.points11.end
2.e+ement102, y+ 5
(int9.ject.points11.end
2.e+ement112, /2 5
(int9.ject.points11.sta
rt2.e+ement102, y2 5
(int9.ject.points11.sta
rt2.e+ement112,
*
e+s
e 0
/+ g
(int9.ject.points11.star
t2.e+ement102, y+ 5
(int9.ject.points11.star
t2.e+ement112, /2 5
(int9.ject.points11.end2
.e+ement102, y2 5
(int9.ject.points11.end2
.e+ement112, *
if (first 55 true po+y.add;oint(/+&
y+ , e+se if (/+ T5 / SS y+ T5 y
0 if (/ 55 0 PP y Z 0 <C<! /+ Z 0
po+y.add;oint (0& 0 , e+se if (y 55 0
PP / J -idth PP y+ Z 0
po+y.add;oint(-idth& 0, e+se if
(/55-idthPPyJheightPP/+J-idth
po+y.add;oint(-idth& height, e+se if
(y 55 height PP / Z 0 PP y+ J height
po+y.add;oint(0& height,
po+y.add;oint(/+& y+, *
if (j J
f.num%ines 0
po+y.add;oint(/
2& y2, first 5
fa+se, / 5 /2,
y 5 y2, * * *
off6raphics.setCo+or(f.co+or, AA
deseneaQX fata in .uffer
off6raphics.fi++;o+ygon(po+y, * *
AA daca a/a este in fata o.iectu+ui&
deseneaQX a/a dupX o.iect
if (9.ject.center.e+ement122 Z5
'/is.center.e+ement122
paint7a/is(off6raphics,
g.dra-+mage(offImage& 0& 0& this,
*
pu.+ic .oo+ean mouseDo-n(=vent evt& int /&
int y0 AA poQiLia de start
prev/ 5 /,
prevy 5 y,
return true,
*
pu.+ic .oo+ean mouseDrag(=vent evt& int /&
int y0 AA vectoru+ de dep+asare
int vector/ 5 / F prev/,
int vectory 5 y F prevy,
AA mouse drag pentru trans+aLie si rotaLie
186
Anexa : sursele aplica iilor privind transformrile 3D (capitolul
V)
if (ca++er.options.method7inde/ T5 1 PP
ca++er.options.o.ject7inde/ 55 0
ca++er.move(vector/&
vectory& 0&
true &Fprev/ 5 /,
AAiniLia+iQeaQX poQiLia
de start prevy 5 y,
return true,
Appiet ;#;. .i5ierul Ve%tor.$ava/ apli%a"ia
Vie(.rame.
pu.+ic c+ass "ector0
pu.+ic f+oat
e+ement12,
pu.+ic
"ector( 0
e+ement 5 ne- f+oat182,
e+ement102 5 e+ement112 5 e+ement122 5 0,
e+ement1*2 51,
*
pu.+ic "ector("ector v 0
e+ement 5 ne- f+oat 182,
for (int i 5 0, i J 8,
iKK e+ement1i2 5
v.e+ement1i2, * pu.+ic
"ector(f+oat /& f+oat y&
f+oat Q 0
e+ement 5 ne- f+oat 182,
e+ement102 5 /,
e+ement112 5 y,
e+ement122 5 Q,
e+ement1*2 5 1,
*
pu.+ic void set7e+ement(f+oat /& f+oat y&
f+oat Q0
e+ement102 5 ";
element@4A 5 y,
element122 5 2;
e+ement1*2 5 4;
*
pu.+ic void
ma4e7vector(
0 e+ement1*2 50, M
pu.+ic void
ma4e7point(
0 e+ement1*2 51, M
pu.+ic void add("ector
v 0
for (int i 5 0, i
J 8, iKK
e+ement1i2 K5
v.e+ement1i2, *
pu.+ic void
su.("ector v 0
for (int i 5 0,
i J 8, iKK
e+ement1i2 F5
v.e+ement1i2,
*
pu.+ic "ector
negative( 0
for (int i 5
0, i J *, iKK
e+ement1i2 5 F
e+ement1i2,
return this, *
pu.+ic void
sca+e (f+oat
f 0 for (int
i 5 0, i J *,
iKK
e+ement1i2 )5
f,
*
pu.+ic f+oat magnitude9 0
f+oat s[uare 5 0,
for (int i 5 0, i J *, iKK
s[uare K5 e+ement1i2 ) e+ement1i2 ,
return (f+oat
Math.s[rt(s[uare, *
pu.+ic f+oat
dot7product("ector
v 0
f+oat f 5 0,
for (int i 5 0, i J *, iKK
f K5 e+ement1i2 ) v.e+ement1i2 ,
return f,
*
pu.+ic "ector cross7product("ector v 0
"ector cross 5 ne- "ector(,
cross.e+ement102 5 e+ement112 ) v.e+ement122
F e+ement122 ) v.e+ement112
cross.e+ement112 5 e+ement122 ) v.e+ement102
F e+ement102 ) v.e+ementA$B
cross.e+ement122 5 e+ement102 ) v.e+ement112
F e+ement112 ) v.e+ement102
return cross,
* pu.+ic void
orthogona+9 0
Matri/ m 5 ne- Matri/9 ,
m.rotateQ(U0,
197
Ciprian-Daniel NEAGU" Severin BUMBARU
this.mu+tip+y (m ,
*
pu.+ic void
mu+tip+y(Matri/
m 0 f+oat12 e 5
ne- f+oat182,
for (int i 5 0,
i J 8, iKK 0
e1i2 5 0, for
(int j 50, j J
8, jKK
e1i2 K5 e+ement1j2 ) m.e+ement1i2 1j2,
*
for (int i 5 0,
i J 8, iKK
e+ement1i2 5 e
1i2,
*
pu.+ic void perspective(int distance 0AA
transformarea perspectiva a vectoru+ui
e+ement102 5 (e+ement102 A e+ement122 )
distance,
e+ement112 5 (e+ement112 A e+ement122 )
distance,
e+ement122 5 F 1 A e+ement122,
*
pu.+ic void prinL( 0 @ystem.out.prinL(<(< K
e+ement102 K <&< K e+ement112 K <&< K
e+ement122 K <&< K
e+ement1*2 K <<, * *
Applet 7-8. .i5ierul Vertex.$ava/ apli%a"ia
Vie(.rame.
pu.+ic c+ass "erte/ e/tends "ector0
.oo+ean 9ut9f(ange,
pu.+ic "erte/9 0 super9, 9ut9f(ange 5 fa+se, M
pu.+ic "erte/(f+oat /& f+oat y& f+oat Q
0 super(/& y& Q , 9ut9f(ange 5 fa+se, M
pu.+ic "erte/ ("erte/ v
0 super(("ectorv, 9ut9f(ange 5
v.9ut9f(ange, M *
O4#erva.ieF pen$r& ( li#$/ )(%ple$/ a varian$el(r ,i<ierel(r
#&r#/ -ava <i 8TML pe $e%a $ra$/rii $ran#,(r%/ril(r VD
?apli)a.ia 9ieEFra%e@" p&$e.i ,a)e re,erire la pa+ina Ee4
an&n.a$/ *n in$r('&)ere7
198
8. BBLOGRAFE
ACM M&l$i%e'ia S1#$e%# -(&rnal" (D. Ferrari, R.G.
Herrtwich, P. Venkat R.
Rangan, eds), SSN: 0942-4962, ACM, 2000 and 2001
issues. ACM Tran#a)$i(n# (n Grap0i)#" (J. Hodgins ed.)
SSN: 0730-0301, ACM, 2000 and
2001 issues. Athanasiu, ., Costinescu, B., Dragoi O.A.,
Popovici F.., Li%4a=&l -ava7 O
per#pe)$iv/ pra+%a$i)/7 Agora, Tg.Mure, 1998. Berg,
M.de; Kreveid, M.van; Overmars, M.; Schwarzkopf, O,
C(%p&$a.i(nal
Ge(%e$r1 Al+(ri$0%# an' Appli)a$i(n#" SBN 3-540-
65620-0, Springer, 2nd
rev. ed. 2000, X. Brookshear, J.G., In$r('&)ere in
in,(r%a$i)/" Teora, 1999. Bumbaru, Severin, Pr(+ra%are
-ava" note de curs, intranet, Catedra de Calculatoare
i nformatic Aplicat, Universitatea ,Dunrea de Jos" din
Galai. Chapman, Nigel, and Chapman, Jenny, Di+i$al
M&l$i%e'ia" SBN: 0471983861, John
Wiley and Sons, 2000. Eckel, Bruce, T0in3in+ in -ava"
SBN: 0130273635, O' Reilly, 2000. Fraizer C, Bond J., -ava
API7 Pa)0e$ele API =ava7apple$ #i =ava aE$7 Teora,
Bucureti, 1998. Furht, Borko and Milenkovic, Milan (eds.) A
G&i'e' T(&r (, M&l$i%e'ia S1#$e%#
an' Appli)a$i(n#" SBN 0-8186-7054-1, EEE, 1995. Furht,
Borko, M&l$i%e'ia T((l# an' Appli)a$i(n#" SBN 0-7923-
9721-5, Kluwer,
1996. BM Learning Services, B&il'in+ a -ava
apple$" April !GGG" 0$$pFLLEEE -
!X7i4%7)(%L'evel(perE(r3#Le'&)a$i(n7n#,Liava-
(nline)(&r#e-4v$i$leL IEEE C(%p&$er Grap0i)# an'
Appli)a$i(n# Ma+a5ine" 2000 and 2001 issues,
EEE016-306-TBR. IEEE C(%p&$er Grap0i)# In$erna$i(nal
2 (CG 2000), EEE Conf Proceeding,
SBN 0-7695-0643-7, EEE 2000. IEEE C(%p&$er Grap0i)#
In$erna$i(nal C(n,eren)e (CG 2001), 19th EEE Conf
Proceeding, SBN 0-7695-1007-8, EEE 2001. IEEE Tran#7
(n M&l$i%e'ia" 2000 and 2001 issues, EEE 500-182-TBR.
Knudsen, Jonathan, -ava 2D Grap0i)#" SBN: 1565924843, O'
Reilly, 1999. Miano, John, C(%pre##e' I%a+e File F(r%a$#"
SBN 0-201-60443-7, ACM, 1999. Neagu, Ciprian-Daniel
M&l$i%e'ia7 Gra,i)/ pe )al)&la$(r" note de curs, intranet,
Catedra de Calculatoare i nformatic Aplicat, Universitatea
,Dunrea de Jos"
din Galai. Norton P., Stanek, W., Ghid de programare n
Java. Teora, Bucureti, 1997. Richardson, Malcolm, Pra)$i)ai
C(%p&$er Grap0i)#" SBN 0077094441, McGraw
Hill, 1999. Rotariu, E., Li%4a=&l
-ava7 Agora, Tg.Mure, 1996.
Sun, -A9A" Pr(+ra%%in+ lan+&a+e an' envir(n%en$"
http://iava.sun.com/ Watt, Alan, Policarpo, Fabio, T0e C(%p&$er
I%a+e" SBN 0-201-42298-0, ACM,
1998. Welch, Terry A., A 7e%'niTue for Oig' Performan%e
!ata Compression, IEEE
C(%p&$er" Voi. 17, No. 6, 1984, pp. 8-19. Wu, Jian Kang,
Kankanhalli, Mohan S., Lim, Joo-Hwee, Hong, Dezhong,
Per#pe)$ive# (n C(n$en$-Ba#e' M&l$i%e'ia S1#$e%#"
SBN 0-7923-7944-6,
Kluwer, 2000.
199
MATRIX ROM
CARTE TEHNCA Sl
STN|FCA 8 AN DE ACTVTATE -
PESTE 700 DE TTLUR
A#'% #13M- d% 6AH6UHATOAR8P !pM1'%@
M-,!- 6%!pT1 - PRHLR-MM-TIHN EN ;-NL-LE
OP-//EMB;-LE Z N%J@ 82000
_!23-. 6>'#%'+ O3'!v-!2 6->9!21 - B-QE;E PRHLR-MRRII SN
;-BTIE? Z N%J@66000
S-#v-! 61'%!21 - C-;CU; NUMERIC I /IMBH;IC SN
M-TUC-O Z N%J@ 85000 #%-
A23! )!2-%#! I>2-JM+ )!2-%#! S!1 - OEQTH;T-RE- HRIENT-TR
PE HBIECTE
PRHLR-ME;HR MEOII I M-RI SN ;IMB->U; 6DD Z
N%J@60000 #%-
H-v-1 Y%-2d#%+ RMd131 5-13#%! - B-QE;E
MICRHPRHCE/H-RE;HR Z N%J@77000 #%-
I-2! M12'%!21+ )!2-%# I>!2 - UTI;IQ-RE- IN/TRUMENTE;HR
UNII SN TIINVR
INLINERIE Z N%J@ 89000 #%-
81g%2 N%'!3+ )>-2! N%'!3 - PRINCIPII I TEUNICI OE
PRHTECVIE - INWHRM-TX
SN REVE;E;E OE C-;CU;-TH-RE Z N%J@ 72000 #%-
)!2-%#! 8#%2! N>p%.31 - INTRHOUCERE SN
-RUITECTUR- /I/TEME;C
CHNTENVIHN-;E OE C-;CU; Z N%J@ 125000 #%-
6>.'-2 N-9%!21 - B-QE OE O-TE I -P;IC-VII Z N%J@99000 #%-
T!'-!2! RTd1#%.31 - INLINERIE /HWT?-RE HRIENT-TR PE
HBIECTE Z N%J80000
`'%=!2 TM1?!2-M!'1 - INTERW-V-RE- ETH;U-TR HM -
C-;CU;-THR Z N%J@ 5 5 000 #%-
`'%=!2 TM1?!2-M!'1 ?!. - PRE;UCR-RE- OHCUMENTE;HR
WH;H/INO IM; I PER;
N%J@55000 #%-
Hfetele 5"m2lete Yi Aat'ite 2e 7"me3ii 9e 2"t 9"li5ita telef"3i5.
-5+i<i(i"3aea 56(il" 9e 2"ate fa5e 7ii 7e la 9e7i'l e7it'ii, 2i3 5"let
2"Ytal 5' 2lata am&'9, 2e &a<a '3ei 5"me3<i 95i9e 9a' 7e la
7i9ti&'it"ii B'5'eYti $li&6ia R-M-, li&6ia 164, li&6ia
;'5eaf6'l%, IaYi, C"39ta3(a, Ha7ea, PiteYti, Lalati. Pe('ile a5ea9t6
"fet6 9'3t 2e3t' a5+i<i(i"3ae 7ie5t6 7e la e7it'6 9a' 2i3 5"let
2"Ytal. Clie3(ii 2ime95 2eia i3f"ma(ii 7e92e 3"ile l'56i a26'te 9a'
Z3 5'9 7e a2ai(ie.
1 Pe('ile 7i3 a5ea9ta li9t6 9'3t 4ala&ile Z35e2E37 5' 01.082001