You are on page 1of 571

Lp trnh ha trn Java 2D v 3D

Phn 1 ............................................................................................................................. 9
Lp trnh ha vi Java 2D .......................................................................................... 9
Chng 1 .................................................................................................................. 10
Tng !an v" Java 2D #P$ ....................................................................................... 10
1.1 %nhan&'( )raphi&*+ T',t+ an( i-aging .......................................................... 10
1.2 .'n('ring /0('1 ............................................................................................ 11
1.2.1 C00r(inat' 23*t'-* ................................................................................. 12
1.2.1.1 4*'r 2pa&' ....................................................................................... 12
1.2.1.2 D'vi&' 2pa&' .................................................................................... 15
1.2.2 Tran*60r-* ............................................................................................... 17
1.2.5 80nt* ........................................................................................................ 19
1.2.7 $-ag'* ...................................................................................................... 1:
1.2.9 8i11* an( 2tr0;'* ....................................................................................... 1<
1.2.: C0-p0*it'* ............................................................................................... 1=
>a&;?ar( C0-pati@i1it3 an( P1at60r- in('p'n('n&' .......................................... 19
1.5.1 >a&;?ar( C0-pati@i1it3 .......................................................................... 19
1.5.2 P1at60r- in('p'n('n&' ............................................................................ 21
1.7 Th' Java 2DA #P$ Pa&;ag'* ......................................................................... 21
Chng 2B ................................................................................................................. 29
.'n('ring ?ith )raphi&*2D ..................................................................................... 29
2.1 CC& 1p vD gia0 (iEn. ...................................................................................... 2:
2.2 .'n('ring C0n&'pt* ........................................................................................ 2<
2.2.1 .'n('ring Pr0&'** .................................................................................... 2=
2.2.2 C0ntr011ing .'n('ring F!a1it3 ................................................................ 29
2.2.5 2tr0;' #ttri@!t'* ...................................................................................... 51
2.2.7 8i11 #ttri@!t'* ........................................................................................... 52
F!C trnh ,G 1H th'0 phiIn ............................................................................ 57
2.2.9 C1ipping Path* .......................................................................................... 57
2.2.: Tran*60r-ati0n* ....................................................................................... 59
2.2.:.1 C0n*tr!&ting an #66in'Tran*60r- .................................................... 5<
2.2.< C0-p0*it' #ttri@!t'* ............................................................................... 5=
2.2.<.1 /anaging Tran*par'n&3 .................................................................. 59
2.2.<.2 Tran*par'n&3 an( i-ag'* ................................................................. 70
2.5 ThiJt 1p )raphi&*2C0nt',t ............................................................................ 70
2.5.1 2'tting .'n('ring Kint* ........................................................................... 70
2.5.2 2p'&i63ing 2tr0;' #ttri@!t'* .................................................................... 71
2.5.2.1 2'tting th' 2tr0;' Li(th .................................................................. 71
2.5.2.2 2p'&i63ing J0in an( %n(&ap 2t31'* .................................................. 72
2.5.2.5 2'tting th' Da*hing Patt'rn .............................................................. 72
2.5.5 2p'&i63ing 8i11 #ttri@!t'* ......................................................................... 77
2.5.5.1 8i11ing a 2hap' ?ith a )ra(i'nt ....................................................... 77
2.5.5.2 8i11ing a 2hap' ?ith a T',t!r' ......................................................... 79
2.5.7 2'tting th' C1ipping Path ......................................................................... 7:
2.5.9 2'tting th' )raphi&*2D Tran*60r- .......................................................... 7=
2.5.: 2p'&i63ing a C0-p0*iti0n 2t31' .............................................................. 91
2.5.:.1 4*ing th' 20!r&' Mv'r C0-p0*iting .!1' ....................................... 91
2.5.:.2 $n&r'a*ing th' Tran*par'n&3 06 C0-p0*it'( M@N'&t* ...................... 91
2.7 .'n('ring )raphi&* Pri-itiv'* ....................................................................... 95
2.7.1 Dra?ing a 2hap' ...................................................................................... 95
2.7.2 8i11ing a 2hap' ......................................................................................... 99
httpBOOtai1i'!ha3.&0-
1
Lp trnh ha trn Java 2D v 3D
2.7.5 .'n('ring T',t ........................................................................................ 9:
2.7.7 .'n('ring i-ag'* .................................................................................... 9:
2.9 D'6ining C!*t0- C0-p0*iti0n .!1'* ............................................................. 9:
2.: .'n('ring in a /!1tiP2&r''n %nvir0n-'nt ..................................................... 9<
Chng 5 .................................................................................................................. <9
CC& Qi tRng hnh ha ............................................................................................. <9
5.1 )ia0 (iEn vD 1p. ............................................................................................. <9
5.2 CC& ;hCi niE- hnh h&B ................................................................................. <=
5.2.1 C0n*tr!&tiv' #r'a )'0-'tr3 ................................................................... <9
5.2.2 >0!n(* an( Kit T'*ting ........................................................................... =0
5.5 C0-@ining #r'a* t0 Cr'at' S'? 2hap'* ........................................................ ==
Chng 7B ................................................................................................................. 97
KiTn thU 80nt vD vVn @Wn ........................................................................................... 97
7.1.)ia0 (iEn vD 1p. ............................................................................................. 97
7.2.CC& ;hCi niE- v" 80nt .................................................................................... 9:
7.5 CC& ;hCi niE- v" T',t La30!t. ....................................................................... 9=
7.5.1 XY &hZ. ..................................................................................................... 99
7.5.2 Mr('ring T',t ......................................................................................... 101
7.5.5 [0 vD Unh vU vVn @Wn ............................................................................ 105
7.5.7 K\ trR tha0 tC& vi vVn @Wn. ................................................................... 107
7.5.7.1 KiTn thU (]! nh^& ............................................................................ 107
7.5.7.2 Di &h!3Tn (]! nh^&. ....................................................................... 10:
7.5.7.5 Kit T'*ting ..................................................................................... 10<
7.5.7.7 [Cnh (]! v_ng 1`a &hn. ............................................................... 10=
7.5.9 Th`& thi viE& hiTn thU vVn @Wn tr0ng ang (bng JavaA . ........................ 109
F!Wn 1H viE& hiTn thU vVn @Wn. ............................................................................ 110
7.7.1 Trnh @D3 vVn @Wn. ................................................................................. 111
KiTn thU (]! nh^& ;cp. .................................................................................... 112
7.7.5 Di &h!3Tn (]! nh^&. ............................................................................... 115
7.7.7 Kit T'*ting ............................................................................................. 117
7.7.9 [Cnh (]! v_ng 1`a &hn. ....................................................................... 119
7.7.: F!'r3ing La30!t /'tri&* ....................................................................... 119
7.7.< XY vVn @Wn trIn nhi"! (dng. .................................................................. 11:
Chng 9 ................................................................................................................ 12:
Te0 Wnh ....................................................................................................................... 12:
9.1 CC& gia0 (iEn vD &C& 1p .......................................................................... 12:
9.1.1 CC& gia0 (iEn i-aging fi-aging int'r6a&'*g ......................................... 12<
9.1.2 CC& 1p (Z 1iE! Wnhfi-ag' Data C1a**'*g .............................................. 12<
9.1.5 i-ag' Mp'rati0n C1a**'* ........................................................................ 129
9.1.7 2a-p1' /0('1 C1a**'* ........................................................................... 150
C010r /0('1 C1a**'* ....................................................................................... 151
9.1.: %,&'pti0n C1a**'* .................................................................................. 152
9.2 $--'(iat' /0(' i-aging C0n&'pt* ............................................................. 155
9.2.1 T'r-in010g3 ........................................................................................... 159
9.5 4*ing >!66'r'(i-ag'* .................................................................................. 15:
9.5.1 Cr'ating a >!66'r'(i-ag' ...................................................................... 15:
9.5.2 Dra?ing in an M66*&r''n >!66'r ............................................................ 15<
9.5.2.1 Cr'ating an M66*&r''n >!66'r ......................................................... 15=
9.5.2.2 Dra?ing in an M66*&r''n >!66'r .................................................... 170
9.5.5 /anip!1ating >!66'r'(i-ag' Data Dir'&t13 .......................................... 171
httpBOOtai1i'!ha3.&0-
2
Lp trnh ha trn Java 2D v 3D
9.5.7 8i1t'ring a >!66'r'(i-ag' ...................................................................... 172
9.5.9 .'n('ring a >!66'r'(i-ag' .................................................................. 172
9.7 /anaging an( /anip!1ating .a*t'r* ............................................................ 190
9.7.1 Cr'ating a .a*t'r .................................................................................... 190
9.7.2 Par'nt an( Chi1( .a*t'r* ........................................................................ 191
9.7.7 Th' Lrita@1'.a*t'r 2!@&1a** ................................................................. 191
9.9 $-ag' Data an( Data>!66'r* ......................................................................... 192
9.: %,tra&ting Pi,'1 Data 6r0- a 2a-p1'/0('1 ................................................. 195
9.< C010r/0('1* an( C010r Data ........................................................................ 197
9.<.1 L00;!p Ta@1' ......................................................................................... 199
9.= i-ag' Pr0&'**ing an( %nhan&'-'nt ............................................................. 199
9.=.1 4*ing an i-ag' Pr0&'**ing Mp'rati0n ................................................... 19=
Chng : ................................................................................................................ 1:2
/! *^& ................................................................................................................... 1:2
:.1 CC& 1p ......................................................................................................... 1:5
:.2 ShZng Unh nghha v" -! *^&. ...................................................................... 1:5
:.2.1 ihjng gian -! .................................................................................... 1:7
:.2.1 >iT! (ikn -D! ....................................................................................... 1:<
Chng < ............................................................................................................... 1<1
$n ]n ........................................................................................................................ 1<1
<.1 CC& gia0 (iEn vD &C& 1p ............................................................................... 1<1
<.2.1 2!pp0rting Printing ................................................................................ 1<7
<.2.1.1 [i"! ;hiTn in fJ0@ C0ntr01g ........................................................... 1<7
<.2.2 Pag' Paint'r* .......................................................................................... 1<9
<.2.5 Printa@1' J0@* an( Pag'a@1' J0@* ........................................................... 1<<
<.2.7 T3pi&a1 Li6'PC3&1' 06 a Print'rJ0@ ................................................................ 1<=
<.5 Printing ?ith Printa@1'* ................................................................................ 1=1
<.5.2 Printing a 8i1' ......................................................................................... 1=9
<.7.1 4*ing a Pag'a@1' J0@ ............................................................................. 191
<.7.2 4*ing /!1tip1' Pag' Paint'r* ................................................................ 195
Phn 2 ......................................................................................................................... 20:
Lp trnh ha vi Java 5D ...................................................................................... 20:
CKlmS) 1 ............................................................................................................ 20<
SKnP /oS LnP T.pSK T.qS J#X# 5D ......................................................... 20<
1.1 Tng !an v" Java 5D #P$ A ...................................................................... 20<
1.2 CC& v]n " & @Wn v" Java 5D #P$A .......................................................... 20=
1.5 rs3 (`ng thU ;h!ng &Wnh ......................................................................... 20=
1.5.1 Thta ;J &]p &a0 tt Java 5D #P$ .......................................................... 217
1.7 CC&h tha& T viJt -ut &hng trnh Java 5D .................................................... 21:
1.7.1 Cjng tha& n giWn T viJt -ut &hng trnh Java 5D ........................ 21:
1.9 /ut vDi th!t ngZ tr0ng Java 5D ................................................................. 221
1.: Xv (b n giWnB K'110Java5Da ..................................................................... 225
1.:.1 CC& 1p &wa Java 5D C1a**'* R& *G (bng tr0ng K'110Java5Da .............. 229
Te0 nIn hnh 1p phng &x ;v&h th& R& Unh ra @yi &C& giC trU &h0 tr&. .... 255
1.< F!a3 hnh 1p phng ................................................................................. 255
1.<.1 2` ;Jt hRp &wa &C& phcp @iJn hnhB K'110Java5D@ ............................... 259
1.= ihW nVng vD h0et ung ................................................................................. 25:
1.=.1 DU&h &C& nui (!ng .................................................................................. 25:
1.=.2 ihW nVng ............................................................................................... 25<
1.9 ThI- vD0 &C& hDnh vi ani-ati0n .................................................................. 259
httpBOOtai1i'!ha3.&0-
5
Lp trnh ha trn Java 2D v 3D
1.9.1 [Unh nghha &C& hDnh vi ani-ati0n ......................................................... 270
1.9.2 CC& hD- @iJn i v" thzi gianB {nh ,e -ut hDnh vi vi thzi gian ........ 271
1.9.5 Lp (anh -b& &C& v_ng ......................................................................... 272
1.9.7 Xv (b v" hDnh viB K'110Java5D& ........................................................... 275
1.9.9 Phcp @iJn hnh vD ;Jt hRp &C& hDnh vi .Xv (bB K'110Java5D( ............. 27:
CKlmS) 2 ............................................................................................................ 291
Te0 &C& hnh ............................................................................................................ 291
2.1 KE ta u thJ gii W0 ..................................................................................... 291
2.2 Xi*!a1 M@N'&t D'6initi0n >a*i&* ................................................................... 292
2.2.1 #n $n*tan&' 06 2hap'5D D'6in'* a Xi*!a1 M@N'&t ................................ 292
2.2.2 S0(' C0-p0n'nt* .................................................................................. 297
2.2.5 D'6ining Xi*!a1 M@N'&t C1a**'* ............................................................. 299
2.5 CC& 1p tiEn v&h hnh h& ............................................................................. 29:
2.5.1 >0, ......................................................................................................... 29<
2.5.2 C0n' ...................................................................................................... 299
2.5.5 C31in('r ................................................................................................. 299
2.5.7 2ph'r' .................................................................................................... 2:0
2.5.9 /0r' #@0!t )'0-'tri& Pri-itiv'* ........................................................ 2:1
2.5.: C010rC!@' ............................................................................................. 2:1
2.5.< %,a-p1'B Cr'ating a 2i-p1' |0P|0 8r0- T?0 C0n'* ........................ 2:1
2.7 CC& 1p t0Cn h& ........................................................................................... 2:<
2.7.1 P0int C1a**'* ............................................................................................. 2<1
2.7.2 C010r C1a**'* ......................................................................................... 2<2
2.7.5 X'&t0r C1a**'* ........................................................................................ 2<7
2.7.7 T',C00r( C1a**'* .................................................................................. 2<9
2.9 CC& 1p hnh h& ........................................................................................... 2<:
2.9.1 )'0-'tr3#rra3 C1a** ........................................................................... 2<<
2.9.2 2!@&1a**'* 06 )'0-'tr3#rra3 .............................................................. 2=7
2.9.5 2!@&1a**'* 06 )'0-'tr32trip#rra3 ........................................................ 2=:
2.9.7 2!@&1a**'* 06 $n(','()'0-'tr3#rra3 ................................................... 295
2.9.9 #,i*.Nava i* an %,a-p1' 06 $n(','()'0-'tr3#rra3 ............................ 29:
2.: #pp'aran&' an( #ttri@!t'* ............................................................................ 29:
2.:.1 #pp'aran&' S0('C0-p0n'nt ................................................................ 29=
2.:.2 2haring S0('C0-p0n'nt M@N'&t* ........................................................ 29=
2.:.5 #ttri@!t' C1a**'* ................................................................................... 299
2.:.7 %,a-p1'B >a&; 8a&' C!11ing ................................................................ 510
2.< >0!n(* an( 2&0p' ........................................................................................ 520
2.<.1 >0!n(* S0(' C0-p0n'nt* ................................................................... 521
2.<.2 >0!n(ingL'a6a S0(' ............................................................................ 529
2.<.5 2&0p' ...................................................................................................... 52<
2.= Knh h& nsng &a0 ........................................................................................ 529
2.=.1 /!1tip1' )'0-'tri'* in a 2ing1' 2hap'5D ........................................... 529
2.=.2 )'0-'tr3#rra3 ..................................................................................... 552
2.=.7 #1t'rnat'#pp'aran&' }n'? in 1.2~ ...................................................... 570
2.9 C1ipping C^t ,cn ........................................................................................ 575
2.9.1 Xi'? D'6in'* a 8r!*t!- ........................................................................ 575
2.9.2 C1ip S0(' .............................................................................................. 579
2.9.7 /0('1C1ip %,a-p1' .............................................................................. 57:
CKlmS) 5 ............................................................................................................ 590
TM S$ D4S) .................................................................................................... 590
httpBOOtai1i'!ha3.&0-
7
Lp trnh ha trn Java 2D v 3D
5.1 Sui (!ng &hvnh .............................................................................................. 590
5.1.1 )'0-'tr3$n60 ......................................................................................... 591
5.2.1 /ut vv (b n giWn v" )'0-'tr3$n60 ........................................................ 591
5.2.2 2G (bng )'0-'tr3$n60 .......................................................................... 592
5.2.5 /ut *Q 1p thjng (bng &x 1iIn !an Jn )'0-'tr3$n60 ........................ 595
L0a('r* ................................................................................................................ 59=
/ut vv (b n giWn *G (bng 1'a('r. ................................................................ 599
CC& 10a('r ph @iJn ........................................................................................... 5:0
5.5.5 )ia0 (iEn &wa gxi L0a('r vD 1p & *y ............................................... 5:1
XiJt -ut 10a('r ................................................................................................... 5:9
Cjng viE& &wa -ut 10a('r ............................................................................... 5:9
KD- te0 1p L0a('r ........................................................................................ 5::
XiJt -ut 8i1' L0a('r n giWn ........................................................................ 5:=
T',t2D ................................................................................................................ 5<9
5.9.1 Xv (b T',t2D n giWn .......................................................................... 5=0
5.9.2 Lp T',t2D ............................................................................................ 5=0
T',t5D ................................................................................................................ 5=2
/ut vv (b T',t5D ........................................................................................... 5=2
ShZng 1p 1iIn !an T te0 ra Qi tRng T',t5D ........................................... 5=7
S"n ;hjng gian ha ...................................................................................... 591
/ut vv (b @a&;gr0!n( ..................................................................................... 591
Lp >a&;gr0!n( ............................................................................................. 592
CKlmS) 7 ............................................................................................................ 59:
TlmS) T{C ......................................................................................................... 59:
7.1 KDnh viB C *y &wa tng tC& vD h0et hnh ................................................... 59<
7.1.1 ng (bng &wa hDnh vi ............................................................................ 59<
7.1.2 Tng !an 1p >'havi0!r ...................................................................... 599
7.2 C @Wn v" hDnh vi ......................................................................................... 599
7.2.1 XiJt -ut 1p >'havi0!r ......................................................................... 700
7.2.2 2G (bng -ut 1p >'havi0!r ................................................................... 709
7.2.5 CC& hD- #P$ tr0ng 1p >'havi0!r ......................................................... 709
7.5 [i"! ;iEn ;v&h h0etB CC&h ;v&h h0et &C& hDnh vi .......................................... 712
7.5.1 [i"! ;iEn ;v&h h0et ................................................................................ 715
7.5.2 La;'!pCrit'ri0n .................................................................................... 717
7.5.5 F!3 Unh 1p La;'!pCrit'ri0n ............................................................. 717
7.5.7 ThDnh phn &wa La;'!pC0n(iti0n ....................................................... 750
7.7 Lp >'havi0!r tiEn v&h ,G 1H @Dn phv- ........................................................ 752
7.7.1 /ut vv (b n giWn ................................................................................. 755
7.7.2 Lp i'3Savigat0r>'havi0!r vD i'3Savigat0r .................................. 759
7.9 Lp tiEn v&h tng tC& vi &h!ut ................................................................... 75<
7.9.1 2G (bng 1p /0!*'>'havi0!r .............................................................. 75<
7.9.2 /0!*' >'havi0!r 80!n(ati0n ................................................................ 772
7.9.5 CC& 1p /0!*'>'havi0!r ..................................................................... 777
7.9.7 /0!*' Savigati0n .................................................................................. 77<
7.: Pi&;ing M@N'&t ............................................................................................... 790
7.:.1 4*ing Pi&;ing 4ti1it3 C1a**'* ................................................................ 797
7.:.2 CC& hD- #P$ & @Wn tr0ng &C& 1p Pi&;ing .......................................... 79=
7.:.5 CC& 1p pi&;ing ...................................................................................... 7:<
7.:.7 CC& 1p Pi&;ing >'havi0r ..................................................................... 7<1
CKlmS) 9 ............................................................................................................ 7<7
httpBOOtai1i'!ha3.&0-
9
Lp trnh ha trn Java 2D v 3D
K0et Knh ................................................................................................................ 7<7
#ni-ati0n P K0et hnhB ....................................................................................... 7<:
[Qi tRng $nt'rp01at0r vD #1pha vi h0et Wnh (`a thzi gian ............................. 7<<
#1pha ................................................................................................................... 7<<
2G (bng &C& Qi tRng $nt'rp01at0r vD #1phaB ................................................... 7=0
Xv (b *G (bng 1p #1pha vD .0tati0n$nt'rp01at0rB ............................................. 7=0
#1pha #P$B .......................................................................................................... 7=:
CC& 1p hDnh vi $nt'rp01at0r B ............................................................................. 7=9
C0r' $nt'rp01at0r #P$B ....................................................................................... 907
CC& 1p Qi tRng nui *!3 zngB ...................................................................... 915
Lp >i11@0ar( B ........................................................................................................ 922
2G (bng Qi tRng >i11@0ar( ............................................................................. 925
Chng trnh vv (b *G (bng >i11@0ar( ............................................................... 929
)ia0 (iEn 1p trnh ang (bng &wa >i11@0ar( f>i11@0ar( #P$g ........................... 929
Mri'nt'(2hap'5D ................................................................................................ 951
)ia0 (iEn 1p trnh ang (bng &wa Mri'nt'(2hap'5D .......................................... 952
Xv (b *G (bng Mri'nt'(2hap'5D ........................................................................ 955
K0et Wnh -a& &hi tiJt fL'v'1 M6 D'tai1 #ni-ati0n*g ......................................... 959
2G (bng Qi tRng Di*tan&'LMD ....................................................................... 95:
CC& 1\i thzng gp ;hi *G (bng LMD ............................................................ 95<
Xv (b *G (bng Di*tan&'LMD .............................................................................. 95<
)ia0 (iEn 1p trnh ang (bng Di*tan&'LMD #P$ ............................................... 977
/0rph ................................................................................................................. 979
2G (bng Qi tRng /0rph .................................................................................. 97:
Xv (b *G (bng /0rph ......................................................................................... 97<
)ia0 (iEn 1p trnh ang (bng /0rph #P$ .......................................................... 995
)ia0 (iEn )'0-'tr34p(at'r ................................................................................... 997
2G (bng )'0-'tr34p(at'r ................................................................................. 999
Chng trnh vv (b hE thQng phsn tG Di ph!n n& *G (bng )'0-'tr34p(at'r
............................................................................................................................ 99:
Li ni u
2` phCt triTn &wa ;h0a h&+ ;h th!t+ nghE th!t+ ;inh (0anh+ vD
&jng nghE 1!jn 1!jn phb th!u& vD0 ;hW nVng tr!3"n et thjng tin &wa
&hng ta+ h0& thjng !a &C& @it (Z 1iE! 1! trZ tr0ng -i&r0&hip h0&
thjng !a gia0 tiJp @ng tiJng nxi. Cs! &hs- ngjn tt ,a ,a -ut hnh
Wnh &x giC trU hn &W ven 1zi ha3 trV- ngh' ;hjng @ng -ut th]3 &h0
th]3 H nghha r]t 1n &wa hnh Wnh tr0ng viE& &h!3Tn tWi thjng tin. Knh
Wnh @a0 giz &ng R& &W- nhn nhanh vD (k (Dng hn+ & @iEt 1D tr0ng
trzng hRp @]t ng v" ngjn ngZ. D0 x ;hjng &x g nge& nhiIn ;hi -D
nga3 tt ;hi ,!]t hiEn -C3 tvnh+ &C& nhD nghiIn &a! &Q g^ng *G (bng
nx T phCt *inh &C& Wnh trIn -Dn hnh. Tr0ng *!Qt gn 90 nV- phCt triTn
httpBOOtai1i'!ha3.&0-
:
Lp trnh ha trn Java 2D v 3D
&wa -C3 tvnh+ ;hW nVng phCt *inh hnh Wnh @ng -C3 tvnh &wa &hng ta
et ti -a& -D @s3 giz h! nh t]t &W &C& -C3 tvnh "! &x ;hW nVng
ha.[ ha -C3 tvnh 1D -ut tr0ng nhZng 1hnh v`& 1v th nh]t vD phCt triTn
nhanh nh]t &wa tin h&. Sga3 tt ;hi ,!]t hiEn+ ha -C3 tvnh &x *a&
1ji &!Qn -nh 1iEt+ &!Qn ht r]t nhi"! ngzi y nhi"! 1hnh v`& ;hC& nha!
nh ;h0a h&+ nghE th!t+ ;inh (0anh+ !Wn 1v+ ... Tvnh h]p (n vD a (eng
&wa ha -C3 tvnh &x thT R& -inh ha r]t tr`& !an thjng !a viE&
;hW0 *Ct &C& ang (bng &wa nx.
SgD3 na3+ ha -C3 tvnh R& *G (bng tr0ng r]t nhi"! 1hnh v`&
;hC& nha! nh &jng nghiEp+ thng -ei+ !Wn 1v+ giC0 (b&+ giWi trv+ 2Q
1Rng &C& &hng trnh ha ang (bng tht ;hng 1 vD phCt triTn 1iIn
tb&.Tr0ng 1hnh v`& &jng nghiEp+C#Df&0-p!t'rPai('( ('*igng R& *G
(bng h! hJt tr0ng viE& thiJt ;J &C& &a0 Q&+ j tj+ -C3 @a3+ tD! thw3+ tD! v
trb+ -C3 tvnh+Tr0ng 1hnh v`& giWi trv+nghE th!t+ ha -C3 tvnh gip ta
te0 ra &C& &hng trnh trd &hi+&C& ;h ,W0 iEn Wnh &h0 &C& nhD 1D-
phi-+ha3 nga3 &hvnh gia0 (iEn ha 1D- nsng &a0 ;hW nVng gia0 tiJp
giZa ngzi vD -C3 tvnh.
[T &x thT 1D- R& nhZng ang (bng ha hZ! v&h &h0 &!u&
*Qng+tr& hJt &hng ta &n phWi &x -ut n"n tWng vZng &h^& v" 1p trnh
ha.Cx r]t nhi"! ngjn ngZ h\ trR 1p trnh ha -C3 tvnh+-\i ngjn
ngZ R& ,s3 (ng trIn nhZng th viEn ha riIng+&x nhZng thJ -enh
riIng.XD ;hi nxi v" 1p trnh ha+&hng ta ;hjng thT ;hjng nxi Jn
ngjn ngZ Java+-ut ngjn ngZ r]t -enh tr0ng 1hnh v`& nD3.Xi -b& v&h
nghiIn &a!+t- hiT! vD -ang Jn &h0 nhZng ai -!Qn t- hi"! v" 1p trnh
ha -ut tDi 1iE! thiJt th`&+nhx- &hng '- &hn " tDi 1D- t!t0ria1
v" 1p trnh ha trIn n"n tWng ngjn ngZ 1sp trnh Java+(`a trIn &C& tDi
1iE! training trIn -eng &wa hng 2!n.X 1D 1n ! 1D- tDi 1iE! tha- ;hW0
httpBOOtai1i'!ha3.&0-
<
Lp trnh ha trn Java 2D v 3D
nIn &hng '- ;hjng trCnh ;hi *ai *xt.Chng '- -0ng th3 ,'- ,ct vD
gxp H &h0 tDi 1iE! nD3.Chng '- &hsn thDnh &W- n.
httpBOOtai1i'!ha3.&0-
=
Lp trnh ha trn Java 2D v 3D
Phn 1
Lp trnh ha vi Java 2D
httpBOOtai1i'!ha3.&0-
9
Lp trnh ha trn Java 2D v 3D
Chng 1
Tng quan v Java 2D API
Java 2DA #P$ tVng &zng v" ;hW nVng h0e+ vVn @Wn vD Wnh &wa
#@*tra&t Lin(0?ing T001;it f#LTg+ gip phCt triTn v" gia0 (iEn ngzi
*w (bng vD ang (bng v" J#X# tr0ng -ut *Q 1hnh v`& -i.C_ng vi ;hW
nVng -enh v" h0e +phjng &hZ vD Wnh tr0ng &C& #P$+ th Java 2D #P$
&dn h\ trR nhZng th!u& tvnh vD thDnh phn -D! *^& R& nsng &a0+ vD
thDnh &jng tr0ng viE& @iT! (ikn &C& @" -t hnh h& t! H vD -ut ;iT! tj
trCt &h!n &h0 -C3 in vD thiJt @U hiTn thU. Java 2D #P$ &ng &h0 phcp te0
ra &C& th viEn h0e -y rung+nh &C& th viEn &wa C#DPC#/ vD &C&
th viEn te0 hiE! ang & @iEt &h0 Wnh vD h0e+ &ng nh viE& te0 ra &C&
@u 1& &OviJt 6i1' Wnh vD h0e.ihi R& *G (bng ;Jt hRp vi Java
/'(ia 8ra-'?0r; Java /'(ia #P$* ;hC& +th Java 2D #P$* &x thT R&
*G (bng T te0 ra vD hiTn thU hiEn th`& W0 vD &C& (eng a phng tiEn
;hC&. Java #ni-ati0n vD Java /'(ia 8ra-'?0r; #P$* (a trIn Java 2D
#P$ T h\ trR viE& tj trCtfr'n('ringg.
1.1 Enhanced Graphics, Tet, and i!a"in"
SJ! &C& phiIn @Wn tr& &wa #LT &h &!ng &]p &C& gxi tj
trCtfr'n('ringg n giWn &h ph_ hRp &h0 viE& r'n('ring &C& trang KT/L
n giWn+-D ;hjng Cp ang w &h0 &C& (eng h0e+vVn @Wn vD Wnh pha&
httpBOOtai1i'!ha3.&0-
10
Lp trnh ha trn Java 2D v 3D
tep. Th Java 2DA #P$ &!ng &]p gxi tj trCt 3 w &C& tvnh nVng @ng
&C&h -y rung #LT T h\ trR &h0 h0e vD &C& tha0 tC& r'n('ring. Xv (b
nh thjng !a &C& 1p h0e &h0 phcp vY hnh &hZ nht+hnh jva1+vD &C&
a giC&. [ h0e 2D tVng &zng v" ;hCi niE- &wa phcp tj trCt hnh h&
@ng &C&h &!ng &]p -ut & &hJ &h0 phcp r'n('ring W0 &wa @]t ; @" -t
hnh h& nD0.Tng t nh v3 vi Java 2D #P$ @en &x thT vY &C& (eng
zng vi @]t ; u rung vD (eng hnh h& nD0.
Deng hnh h& R& &!ng &]p thjng !a &C& phn th`& thi
i-p1'-'ntati0n* &wa Shape int'r6a&' tr0ng Graphic &1a**+ nh hnh &hZ
nht 2D vD %1ip 2D. CC& zng &0ng vD hnh &!ng &ng th!u& phn
i-p1'-'ntati0n* &wa Shape. CC& ;iT! vY vD tj &ng R& &!ng &]p thjng
!a phn th`& thi i-p1'-'ntati0n* &wa gia0 tiJp Paint v Stroke
interfaces+ vv (b BasicStroke+ GradientPaint+ TexturePaint+vD Coor.
!ffineTransfor" Unh nghha &C& phcp @iJn i tr0ng t0e u 2 &hi"!+
g- &x phcp 1]3 t 1E+phcp &h!3Tn i t0e u +phcp !a3 vD phcp ,cn &^t.
ih!ng nhn R& Unh nghha @yi &C& phng tha& giQng nha! &wa 1p
Shape -D &hng R& (_ng T Unh nghha &C& ;h!ng nhn &h!ng+vv (b
nh #ectan$e%& vD GeneraPath.
ThDnh phn -D! *^& R& &!ng &]p @yi &C& phng tha& &wa 1p
Co"posite+ vv (b !phaCo"posite.
/ut ;iT! 80nt &hZ th R& Unh nghha @yi &C& &011'&ti0n &wa G'phs.
1.2 #enderin" $%de&
iiT! tj trCt ha n giWn ;hjng &x g tha3 i ;hi thI- vD0 Java
2DA #P$*. [T tj trCt ha th phWi thiJt 1p &C& thjng *Q v" ha vD
gi phng tha& &wa Qi tRng )raphi&*.
Tr0ng Java 2D #P$+ 1p )raphi&*2D -y rung 1p )raphi&* T h\ trR
thI- nhi"! th!u& tvnh ha vD &!ng &]p thI- &C& phng tha& &h0 !C
trnh tj trCt.
httpBOOtai1i'!ha3.&0-
11
Lp trnh ha trn Java 2D v 3D
Th' Java 2D #P$ t` ung &sn &hnh nhZng *ai ;hC& tr0ng &C& thiJt @U tj
trCt vD &!ng &]p -ut ;iT! tj trCt thQng nh]t &h0 &C& (eng thiJt @U ;hC&
nha!. Tei tng ang (bng+!C trnh tj trCt 1D giQng nha! &h0 (_ thiJt @U
&!Qi x 1D -Dn hnh ha3 -C3 in.
Xi Java 2 2Di+ v'r*i0n 1.5 + Java 2D #P$ &dn h\ trRp &h0 &C& -ji
trzng a -Dn hnh f-!1tiP*&r''n 'nvir0n-'nt*g.
(.%.( Coordinate S'ste"s
Java 2D #P$ @a0 hD- hai hE ta uB
1. ihjng gian ngzi *w (bng 1D hE ta u 10gi& vD u& 1p vi thiJt @U.
CC& ang (bng thzng *w (bng hE ta u nD3+t]t &W &C& (eng hnh
h& R& tj trCt @ng Java 2D "! R& ,C& Unh tr0ng hE ta u
nD3.
2. ihjng gian thiJt @U 1D hE ta u phb th!u& thiJt @U+ang vi ttng 10ei
thiJt @U &!Qi -D &x hE te0 u ;hC& nha!.
>ng ang (bng -C3 W0 -ut &Ga * hiTn thU &x thT -y rung thI- nhi"!
thiJt @U hiTn thU v3 1H te0 nIn -ji trzng a -Dn hiTn thU+ hE ta u &wa
thiJt @U nD3 R& *w (bng 1D- hE ta u &wa -C3 W0 *Y R& 1]3 1D- hE
ta u &h0 t]t &W &C& -Dn hiT thU &dn 1ei.
KE thQng Java 2D *Y t` ung th`& hiEn nhZng phcp &h!3Tn i &n
thiJt giZa ;hjng gian ngzi *G (bng vD ;hjng gian thiJt @U . /& (_ hE
ta u &h0 -Dn hnh r]t ;hC& Qi vi hE ta u &h0 -C3 in nhng *` ;hC&
@iEt nD3 tr0ng *!Qt Qi vi &C& ang (bng.
1.2.1.1 User Space
KE ta u nD3 R& &h ra tr0ng hnh 1P1.
(0,0)
x
httpBOOtai1i'!ha3.&0-
12
Lp trnh ha trn Java 2D v 3D
y
8ig!r' 1P1 4*'r 2pa&' C00r(inat' 23*t'-
ihjng gian ngzi *G (bng @iT! (ikn -ut &C&h trt! tRng ng nh]t
&h0 &C& hE te0 u &wa t]t &W &C& thiJt @U &x 1iIn !an.Cdn ;hjng gian thiJt
@U &h0 -ut thiJt @U &b thT &x thT &x &_ng gQ& ta u vD hng &wa &C& trb&
h0& 1D &x thT ;hjng.Sg0Di ra &C& ta u &wa ;hjng gian ngzi *G (bng
&x thT &h!3Tn i -ut &C&h t` ung vD0 ;hjng gian thiJt @U ph_ hRp -\i
;hi -ut Qi tRng ha R& tj trCt+thzng th &C& &hng trnh (riv'r
&wa &C& thiJt @U th`& hiEn i"! nD3.
1.2.1.2 Device Space
Java 2D #P$ Unh nghha 5 -a& thjng tin &]! hnh T h\ trR &h0 viE&
&h!3Tn i tt ;hjng gian ngzi *G (bng *ang ;hjng gian thiJt @U. Thjng
tin nD3 R& &haa tr0ng 5 1p B
)raphi&*%nvir0n-'nt
)raphi&*D'vi&'
)raphi&*C0n6ig!rati0n
Kai tr0ng *Q &hng *Y @iT! (ikn t]t &W &C& thjng tin &n thiJt &h0 viE&
,C& Unh thiJt @i tj trCt vD &h0 viE& &h!3Tn i ta u tt ;hjng gian ngzi
httpBOOtai1i'!ha3.&0-
15
Lp trnh ha trn Java 2D v 3D
*G (bng *ang ;hjng gian thiJt @U. ng (bng &x thT tr!3 &p thjng tin nD3
nhng ;hjng nh]t thiJt phWi th`& hiEn @]t ; phcp &h!3Tn i nD0 gia hai
hE ta u&h!3Tn .
Lp Graphics)nviron"ent -j tW tp &C& thiJt @U -D `R& &h]p nhn @yi
&C& ang (bng Java tr0ng -ut -ji trzng &b thT.CC& thiJt @U *G (bng &h0
!C trnh tj trCt g- &x -Dn hnh + -C in vD &C& @u E- Wnh.Lp
Graphics)nviron"ent &ng @a0 g- tp &C& 60nt ph_ hRp tr0ng -ji
trzng x.
Lp Graphics&evice -j tW thiJt @U tj trCt nh -Dn hnh h0& -C3 in./\i
&]! hnh ph_ hRp &wa thiJt @U R& @iT! (ikn @yi 1p
GraphicsConfi$uration. Xv (b+-ut thiJt @U hiTn thU 2X)# &x thT th`&
hiEn tr0ng -ut *Q &hJ u -D! nh B :70,7=0,1: &010r*+ :70,7=0,29:
&010r*+ an( =00,:00,29: &010r*.
/Dn hnh 2X)# R& @iT! (ikn @yi -ut Qi tRng Graphics&evice
vD ang vi -\i &hJ u -D! &wa -Dn hnh 2X)# *Y R& @iT! (ikn @yi
-ut Qi tRng GraphicsConfi$uration./ut Qi tRng ;iT!
Graphics)nviron"ent &x thT @a0 g- 1 ha3 nhi"! Qi tRng
Graphics&evices. SgR& 1ei +-\i Qi tRng Graphics&evice &x thT &x 1
ha3 nhi"! Qi tRng ;iT! GraphicsConfi$urations.
(.%.% Transfor"s
Java 2D #P$ &x -ut &hJ u &h!3Tn ta u thQng nh]t. T]t &W &C& phcp
&h!3Tn ta u+@a0 g- &C& phcp &h!3Tn tt ;hjng gian ngzi *G (bng
Jn ;hjng gian &wa thiJt @U+"! R& @iT! (ikn @yi Qi tRng ;iT!
!ffineTransfor" .!ffineTransfor" Unh nghha &C& 1!t &h0 nhZng tha0
tC& trIn &C& hE ta u @ng &C& -a trnf&C& phcp @iJn i Wnh @ng &C& @u
1&g.
Cng &x thT thI- Qi tRng !ffineTransfor" &h0 &C& (eng ha @ng
&C& phcp ,0a3 +1]3 t 1E +&h!3Tn i h0& &^t ta u &h0 -ut -t hnh h&
httpBOOtai1i'!ha3.&0-
17
Lp trnh ha trn Java 2D v 3D
+vVn @Wn ha3 Wnh ;hi &hng R& tj trCt.CC& phcp @iJn i R& thI- vD0
nD3 *Y R& ang (bng &h0 &C& Qi tRng ha R& tj trCt tr0ng trzng
hRp x phcp @icn i nD3 R& th`& hiEn ;hi &h!3Tn tt ta u ;hjng gian
ngzi *G (bng *ang ;hjng gian &wa thiJt @U.
(.%.* +onts
/ut ,s! thzng R& hiT! 1D tp &C& ;v t` ta0 thDnh.ihi -ut ,s!
R& vY+ hnh (eng &wa nx *Y R& ,C& Unh @yi 60nt -D &hng ta
&hn.T!3 nhiIn+ hnh (eng -D 60nt *G (bng T hiTn thU 1In -Dn hnh ,s!
x ;hjng phWi 1& nD0 &ng giQng vi hnh (Cng &wa -\i ;v t` riIng @iEt.
vv (b *` ;Jt hRp &wa 2 ha3 nhi"! ;v t` thzng R& tha3 thJ @yi -ut hnh
(eng ;v hiI! nD0 x R& gi 1D ligature.
CC& hnh (eng -D -ut phjng &hZ *G (bng T @iT! (ikn &C& ;v t` tr0ng
-ut ,s! R& gi 1D glyphs. /ut 60nt &x thT @iT! (ikn -ut ;v t` nh &hZ
thzng h0& &hZ h0a @ng &C&h *G (bng nhi"! glyphs+ h0& @iT! (ikn &C&
1iIn ;Jt ;v t` nh fi &h @iT! (ikn @yi 1 glyph. Tr0ng Java 2D #P$+ -ut
g13ph &h n giWn 1D -ut (eng fShapeg -D &x thT `0& tha0 tC& vD tj trCt
-ut &C&h giQng nha! nh @]t ; vi &C& (eng ;hC& Shape.
/ut font &x thT R& ,'- nh tp &C& g13ph. /ut 60nt n &x thT &x
r]t nhi"! ;iT! ;hC& nha! nh ;Ti &hZ - +vta+nghiIng +gjtv&ht]t &W
&C& ;iT! &hZ nD3 tr0ng -ut 60nt &x &_ng thiJt ;J in vD &x thT vv nh
&hng 1D &C& thDnh viIn tr0ng &_ng -ut gia nh. Ka3 nxi &C&h ;hC& +-ut
nhx- &C& g13ph* vi &C& ;iT! riIng @iEt te0 nIn -ut (eng 60nt+nhx- &C&
(eng 60nt ta0 nIn -jt h 60nt +h &C& 60nt te0 nIn -ut tp 60nt vD tp nD3
&x *n tr0ng -ut Qi tRng Graphics)nviron"ent &b thT nD0 x.
Tr0ng Java 2D #P$+ &C& 60nt R& ,C& Unh @yi -ut tIn -D -j tW -ut
(eng 60nt riIng @iEt nD0 x+vv (b K'1v'ti&a >01(. Shng i"! nD3 1ei ;hC&
vi 6n -"- JDi 1.1 +&C& 60nt R& -j tW @ng &C& tIn 1jgv& -D Cnh ,e
trIn &C& (eng 60nt ;hC& nha! 6b th!u& 1iE! &C& (eng 60nt x &x *^n tr0ng
httpBOOtai1i'!ha3.&0-
19
Lp trnh ha trn Java 2D v 3D
-ji trzng ang ,ct ;hjng.Sh T tng thv&h &h0 i"! x th' Java 2D
#P$ h\ trR viE& ,C& Unh &C& 60nt @ng tIn 1jgv& &ng nh @ng tIn (eng
60nt.
2G (bng Java 2D #P$+ &x thT *0en thW0 vD tj rCt &C& ,s! @a0 g-
nhi"! 60nt th!u& &C& h 60nt+hnh (eng+;i&h th&+ vD ths- &hv &W ngjn
ngZ ;hC& nha!. CC& (eng &wa vVn @Wn R& 1! riIng @iEt -ut &C&h 1jgv&
vi *` *^p ,Jp &C& vVn @Wn.CC& Qi tRng 80nt R& *G (bng T -j tW &C&
hnh (eng hiTn thU &wa 60nt+ vD thjng tin *^p ,Jp R& 1! tr0ng Qi tRng
TextLa'out vD Text!ttri,uteSet . XiE& 1! gia &C& 60nt vD thjng tin *^p
,Jp riIng @iEt nha! 1D- (k (Dng hn &h0 viE& *G (bng &_ng 60nt &hZ
nhng ;hC& v" &]! hnh *^p ,Jp.
(.%.- ."a$es
nh R& te0 nIn tt tp &C& pi,'1 . /ut iT- Wnh ha3 -ut pixel *Y
Unh nghha thT hiEn &wa -ut Wnh tei v_ng !an *Ct &wa -Dn hnh . /ut
-Wng hai &hi"! &wa iT- Wnh R& gi 1D -ut raster.
ThT hiEn &wa -ut iT- Wnh &x thT R& Unh nghha -ut &C&h tr`& tiJp
h0& nh 1D -ut &h *Q tr0ng @Wng -D! (Dnh &h0 Wnh.
Tr0ng Wnh -D! a -D! fhn 29: -D!g &C& iT- Wnh thzng tr`& tiJp
@iT! (ikn 1!jn -D! *^& vD &C& & trng ;hC& &h0 -\i v_ng hiTn thU &wa
Wnh. ShZng Wnh nh v3 *Y &x ;v&h th& 1n hn Wnh -D! -D hiTn thU
@ng &h *Qfin(','(P&010r i-ag'*g+ nhng &hng nhn *Y tht hn .
Tr0ng Wnh -D! hiTn thU @ng &h *Q fin(','(P&010r i-ag'g+ nhZng
-D! *^& &wa Wnh *Y @U gii hen @yi @Wng -D! + vD thzng *Q 1Rng -D!
tr0ng @Wng -D! *Y vt hn *0vi Wnh tht. T!3 nhiIn &C& Wnh ;hi R& 1!
nh tp &C& &h *Q -D! *Y 1D- &h0 ;v&h th& Wnh nh i.[Unh (eng nD3
thzng R& (_ng &h0 nhZng Wnh &x 29: -D!.
nh tr0ng Java 2D #P$ &x hai thDnh phn &hvnh
DZ 1iE! Wnh thjf&C& iT- Wnhg
httpBOOtai1i'!ha3.&0-
1:
Lp trnh ha trn Java 2D v 3D
ShZng thjng tin &n thiJt &h0 !C trnh &h!3Tn i &C& iT- Wnh
CC& 1!t &h0 viE& &h!3Tn i &C& iT- Wnh R& 1! @yi Qi tRng
Coor/ode. [Qi vi -ut iT- Wnh T hiTn thU &n phWi i ;- vi -ut
;iT! -D! *^&.
/ut (Wi -D! 1D -ut thDnh phn &wa ;hjng gian -D! *^& (Dnh &h0
Wnh.Xv (b &C& thDnh phn -D! 1D &C& (a -D! tr0ng Wnh .)> . /ut
iT- Wnh tr0ng Wnh (_ng -D! tr`& tiJp &x thT R& hiT! nh -ut tp .
)xi 0ava.a1t.i"a$e @a0 g- -ut *Q phng tha& Coor/ode &h0
&C& @iT! (ikn thDnh phn iT- Wnh.
/ut Qi tRng CoorSpace &haa &C& 1!t T *a0 &h0 tp &C& giC trU
-D! tng ang vi -ut -D! *^& nh]t Unh .CC& phng tha& &wa
CoorSpace tr0ng 0ava.a1t.coor *Y @i! (ikn &C& ;hjng gian -D! *^&
thjng (bng+ g- &x ;hjng gian -D! .)> vD gra3 *&a1'. L! H rng -ut
;hjng gian -D! ;hjng phWi 1D -ut tp &C& -D! *^& -D tp nD3 Unh nghh
&C& 1!t T &x thT &h!3Tn i &C& giC trU -D! thDnh &C& -D! tng ang
thjng (U&h.
XiE& &hia ;hjng gian -D! *^& thDnh &C& &hJ u -D! *Y te0 nIn *` 1inh
h0et hn tr0ng viE& @iT! (ikn vD &h!3Tn i tt phcp @iT! (ikn -D! nD3
*ang -ut phJp @iT! (iYn -D! ;hC&.
(.%.2 +is and Strokes
Xi Java 2D #P$+ &x thT tj &C& hnh @Vng &C&h *G (bng &C& ;iT! @!t
;hC& nha! vD &C& ;iT! tj ;hC& nha!. X &C& &hZ ,ct &h0 &_ng &ng R&
@iT! (ikn @ng tp &C& g13ph+ nIn &C& ,s! ;v t` &ng &x thT R& vY vD tj.
CC& ;iT! @t R& Unh nghha @Vng &C& Qi tRng ;iT! 2tr0;'.Cx thT
,C& Unh u rung &ng nh &C& nct &h0 &C& zng thng vD zng &0ng.
CC& ;iT! tj R& Unh nghha @yi &C& phng tha& th!u& Qi tRng
Paint. Lp Coor &x *^n tr0ng &C& phiIn @Wn tr& &wa #LT s3 1D -ut
httpBOOtai1i'!ha3.&0-
1<
Lp trnh ha trn Java 2D v 3D
(eng n giWn &wa Qi tRng Paint R& *G (bng T Unh nghha tj -D!
trn f*01i( &010rg. Java 2D #P$ &!ng &]p thI- hai phng tha& -i &h0
Paint 1D TexturePaint vD GradientPaint. TexturePaint Unh nghha ;iT!
tj (_ng -! Wnh n giWnf*i-p1' i-ag' 6rag-'nt g -D R& 1p nh
nha!. GradientPaint Unh nghha -ut ;iT! tj -D! 10angfgra(i'ntg giZa
hai -D!.
Tr0ng Java 2D+ r'n('ring -ut zng nct &wa -ut hnh vD tj hnh x
@ng -ut ;iT! nD0 x R& th`& hiIn hai tha0 tC& riIng @iEtB
2G (bng -ut tr0ng &C& th!t t0Cn dra T r'n('r &C& zng nct
&wa hnh *G (bng &C& ;iT! @t R& ,C& Unh @yi &C& th!u& tvnh &wa
Stroke vD ;iT! tj R& ,C& Unh @yi th!u& tvnh !aint.
2G (bng phng tha& fill T tj &C& v_ng tr0ng &wa hnh vi ;iT!
tj (R& ,C& Unh.
ihi -ut &h!\i ;v t` R& r'n('r+&C& th!u& tvnh hiEn tei &wa Paint
`& Cp (bng &h0 &C& g13ph* te0 nIn &h!\i x.L! H th`& &h]t Qi tRng
dra"tring *Y tj &C& g13ph* -D R& r'n('r. [T vY &C& nct &wa &C& g13ph*
tr0ng &h!\i ;v t` &n phWi &hn &C& zng nct vD r'n('r &hng nh Qi
vi &C& hnh *G (bng phng tha& dra .
(.%.3 Co"posites
ihi r'n('r -ut Qi tRng -D &hng 1In -ut Qi tRng tn tai tr&
x &n phWi ,C& Unh 1D- thJ nD0 T ;Jt hRp -D! &wa &C& Qi t!Rng. Java
2D #P$ &x &C& 1!t &h0 viE& ;Jt hRp -D! tr0ng trzng hRp nD3 tr0ng Qi
tRng Co"posite.
T!3 nhiIn &x -ut *Q v]n " tr0ng &C&h tiJp &n nD3B
2Y tht ;hx tr0ng trzng hRp nJ! -D! #ed vD -D! Bue R& thI-
vD0 hs3 ;hjng R& thI- vD0.
XiE& ;Jt hRp 1jgv& *Y ;hjng R& h\ trR tr0ng trzng hRp &C&-D!
th!u& &C& ;hjng gian -D! ;hC& nha!.
httpBOOtai1i'!ha3.&0-
1=
Lp trnh ha trn Java 2D v 3D
2` ;Jt hRp *Y ;hjng &x H nghha tr0ng trzng hRp -D! R& @iT!
(ikn @ng &C& gia trU -D! th ;hi x *` ;Jt hRp hai iT- Wnh 1D *` ;Jt hRp
&wa hai giC trU -D!.
Java 2D #P$ trCnh &C& 10hi nD3 @ng &C&h th`& hiEn &C& 1!t pha trun
a1pha -D *Y a vD0 &C& thjng tin v" ;iT! @iT! (ikn iT- Wnh -\i ;hi
th`& hiEn ;Jt hRp -D!. /ut Qi tRng !phaCo"posite @a0 g- &C&
;iT! v" -D! *^& &wa &C& -D! *^& &wa ng!n vD v&h.
'ac()ard *%!pati+i&it, and P&at-%r! independence
Sh nxi+Java 2DA #P$ &x *` tng thv&h Qi vi phn -"- JDi
1.1 . XD Java 2DA #P$ 1D -ut ;iJn tr& &hvnh v v3 -D &C& ang (bng
&wa nx &x tvnh u& 1p v" -ji trzng
(.*.( Back1ard Co"pati,iit'
[T tng thv&h vi &C& tvnh nVng tn tei tr0ng ha JDi .Java
2D #P$ tVng &zng thI- -ut *Q tvnh nVng &h0 #LT @ng &C&h thI- &C&
phng tha& -i vD0 &C& 1p tn tei+-y rung thI- &C& 1p tn tei
vD ng thzi thI- &C& 1p -i vD &C& int'r6a&' -i -D ;hjng Wnh hyng
ti &C& #P$ hRp 1E.
Xv (b+Cx r]t nhi"! tvnh nVng &waJava 2D #P$ R& @^t ng!n tt viE&
-y rung &C& th!u& tvnh v" ha tr0ng Graphics%&. [T &!ng &]p &C&
th!u& tvnh -y rung v" ha tr0ng x @a0 g- &W 3J! tQ tng thv&h vi
&C& phn -"- ha ;hC&+ Graphics%& -y rung &C& 1p )raphi&*
tr0ng JDi1.1.
# paint
# paint$ll
# update
# print
httpBOOtai1i'!ha3.&0-
19
Lp trnh ha trn Java 2D v 3D
# print$ll
# get%raphi&s
JDi 1.1 app1't thjng (U&h ngZ &Wnh ha -D R& a vD0 nh 1D
-ut thT hiEn &wa 1p Graphics. [T &x thT tr!3 nhp nhZng &ha& nVng
R& th`& thi tr0ng Qi tRng Graphics%&+ th -ut app1't tng thv&h vi
Java 2D #P$ *Y a ngZ &Wnh ha ti Qi tRng Graphics%&B
public void Paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
...
...
g2.setTransform (t);
}
Tr0ng -jt vDi trzng hRp + ha3 ng hn 1D -y rung -ut 1p thta ;J+
Java 2D #P$ ;hCi !at hxa nx. Cx hai ;h th!t R& *G (bng T ;hCi
!at hxa &C& 1p ;J thtaB
/ut ha3 nhi"! 1p &ha R& &hn vD0 @iT! phsn &]p &wa 1p + vD
&C& 1p thta ;J R& &p nht T -y rung &C& 1p &ha -i. ih th!t nD3
R& *G (bng T thI- &C& phng tha& vD &C& (Z 1iE! thT hiEn &h0 1p ;J
thta.
/ut ha3 nhi"! triTn ;hai &C& int'r6a&' R& thI- vD0 1p ;J thta .
ih th!t nD3 R& *G (bng T thI- &C& phng tha& W0 tng !Ctfg'n'ra1
a@*tra&t -'th0(*g &h0 1p ;J thta .
Xv (b+ Java 2D #P$ ;hCi !Ct hxa 1p #LT .'&tang1' @ng &C&h *G
(bng &W hai ;h th!t 2` phsn &]p &h0 hnh &hZ nht giQng nhB
httpBOOtai1i'!ha3.&0-
20
Lp trnh ha trn Java 2D v 3D
Tr0ng phn -"- JDi 1.1 + #ectan$e 1D -ut Qi t!Rng -y rung n
giWn. >s3 giz -y rung &C& 1p #ectan$e%& -i vD triTn ;hai &W hai
int'r6a&' Shape vD Seriai4a,e. Kai 1p &ha R& thI- vD0 phsn &]p &wa
1p #ectan$e 1D #ectan$uarShape vD #ectan$e%&. CC& #pp1't R&
viJt &h0 phn -"- JDi 1.1 ;hjng tr!3 &p R& &C& 1p -i vD &C& phn
triTn ;hai &wa &C& int'r6a&'+nhng i"! nD3 ;hjng Wnh hyng @yi v 1p
#ectan$e vn @a0 g- &C& phng tha& vD &C& thDnh phn &x tr0ng &C&
phiIn @Wn tr&.
(.*.% Patfor" independence
Cx ;hW nVng phCp triTn &C& ang (bng u& 1p vi -ji trzng. Java 2D
#P$ ;hjng W- ng v" ;hjng gian -D! *^& ha3 1D &hJ u -D! &wa
thiJt @U r'n('ring vD Java 2D #P$ &x @]t ; Unh (eng Wnh &b thT nD0.
XD &h u& 1p v" 60nt ;hi &C& 60nt x R& ,s3 (`ng *nfR&
&!ng &]p nh 1D -ut phn &wa phn -"- JDi g+ha3 1D ;hi &hng R&
gyi te0 @ng 1p trnh. Java 2D #P$ ;hjng h\ trR &C& 60nt ,s3 (`ng *n
vD &C& 60nt R& te0 nIn nhz &hng trnh te0 60nt nhng nx 1ei h\ trR
viE& Unh nghha &C& 60nt thjng !a tp &C& g13ph &wa nx. /\i g13ph 1ei &x
thT R& Unh nghha @yi 2hap' -D @a0 g- &C& 0en zng thng vD &C&
zng &0ng. Cx r]t nhi"! ;iT! 60nt vi nhi"! hnh (ang vD ;i&h th&
R& @^t ng!n tt tp &C& g13ph n 1.
1.. The Java 2D/ 0P1 Pac(a"es
CC& 1p Java 2D #P$ R& t &ha& tr0ng &C& pa&;ag' *a!B
httpBOOtai1i'!ha3.&0-
21
Lp trnh ha trn Java 2D v 3D
5 0ava.a1t
5 0ava.a1t.$eo"
5 0ava.a1t.font
5 0ava.a1t.coor
5 0ava.a1t.i"a$e
5 0ava.a1t.i"a$e.rendera,e
5 0ava.a1t.print
Pa&;ag' Nava.a?t @a0 g- &C& 1p Java 2D #P$ " &p y trIn vD
&C& int'r6a&' tn tei tr& x vD &C& int'r6a&' 6Ct triTn thI-. f. (Dng
1D ;hjng phWi t]t &W &C& 1p tr0ng Nava.a?t 1D &C& 1p &wa Java 2D g
Pa&;ag' Nava.a?t.g'0- @a0 g- &C& &1a**' vD int'r6a&' &x 1iIn !an Jn
viE& Unh nghha &C& (eng hnh h& ng!3In thw3B

httpBOOtai1i'!ha3.&0-
22
Lp trnh ha trn Java 2D v 3D
Cx nhi"! (eng hnh h& ng!3In thw3 ang vi &C& phn
i-p1'-'ntati0n. +oat vD &ou,e
[i"! nD3 &h0 phcp &C& i-p1'-'ntati0n &x thT y hai -a& &hvnh ,C& 1D
giC trU sin$e vD dou,e.
)xi 0ava.a1t.font &haa &C& 1p vD &C& gia0 (iEn R& *G (bng &h0
viE& @Q trv vVn @Wn vD Unh nghha &C& ;iT! 60ntB
)xi Nava.a?t.&010r &haa &C& 1p vD &C& gia0 (iEn &h0 viE& Unh nghha
&C& ;hjng gian -D! vD &C& -! -D!B
CC& gxi 0ava.a1t.i"a$e vD 0ava.a1t.i"a$e.rendera,e &haa &C& 1p
vD &C& gia0 (iEn &h0 viE& Unh nghha vD te0 @xng &wa Wnh.
httpBOOtai1i'!ha3.&0-
25
Lp trnh ha trn Java 2D v 3D
Pa&;ag' 0ava.a1t.i"a$e tn tei tr0ng &C& v'r*i0n tr& x &wa #LT.
Java 2D #P$ tVng &zng thI- &C& 1p Wnh ;J thta tt #LT *a! s3B
Coor/ode
&irectCoor/ode
indexCoor/ode
CC& 1p &hJ u -D! *^& nD3 vn tn tei tr0ng pa&;ag'
0ava.a1t.i"a$e pa&;ag' &h0 *` tng thv&h .[T W- @W0 tvnh thQng
nh]t+&C& 1p &h0 &hJ u -D! -i &ng &x tr0ng pa&;ag' 0ava.a1t.i"a$e .
Pa&;ag' 0ava.a1t.print @a0 g- &C& 1p vD &C& int'r6a&' &h0 phcp in
t]t &W &C& (eng vVn @Wn + ha vD Wnh (`a trIn &jng nghE Java 2D.
httpBOOtai1i'!ha3.&0-
27
Lp trnh ha trn Java 2D v 3D
Chng 2:
Rendering with Graphi!2D
Graphics%& -y rung 0ava.a1t.Graphics T te0 ra i"! ;hiTn tinh vi
hn v" @iT! (ikn &C& hnh +vVn @Wn vD Wnh .F!C trnh tj trCt Java 2DA
R& i"! ;hiTn thjng !a Qi tRng Graphics%& vD &C& th!u& tvnh
treng thCi &wa nx.
CC& th!u& tvnh teng thCi Graphics%& + nh 1D &C& ;iT! zng thng vD
&C& phcp @iJn i+R& Cp (bng &h0 &C& Qi tRng ha ;hi &hng R&
tj trCt. Tp &C& th!u& tvnh treng thCi ;Jt hRp vi Graphics%& R& tha-
&hiJ! ti nh 1D Graphics%&Context.
[T tj trCt vVn @Wn +hnh vD Wnh+&n thiJt 1p Graphics%& &0nt',t vD *a!
x gi -ut tr0ng &C& phng tha& tj trCt Graphics%& nh (ra? ha3 6i11.
httpBOOtai1i'!ha3.&0-
29
Lp trnh ha trn Java 2D v 3D
2.1 *2c &p v3 "ia% di4n.
>Wng &h0 *a! s3 *Y 1iIt ;I &C& gia0 (iEn vD 1p tr0ng viE& ;Jt hRp
vi ngZ &Wnh Graphics%& &0nt',t+@a0 g- &C& 1p @iT! (ikn &C& th!u&
tvnh treng thCi. K! hJt &C& 1p nD3 1D -ut phn &wa pa&;ag' 0ava.a1t.
CC& gia0 (iEn vD -j tW &hngB
)ia0 (iEn /j tW
C0-p0*it' [Unh nghha &C& phng tha& &h0 viE& ;Jt hRp -ut
Qi tRng vY gQ& vi &_ng ha R& Cnh (]!.
[R& th`& thi @yi phng tha& #1phaC0-p0*it'.
C0-p0*it'C0nt',
t
[Unh nghha -ut -ji trng tQi ! vD u& 1p &h0
viE& th`& hiEn &C& phcp ;Jt hRp .XiE& th`& hiEn &C&
1!t ;Jt hRp t_3 &hn R& th`& hiEn @it ngzi 1p
trnh.
Paint /y rungB Tran*par'n&3
[Unh nghha &C& -D! *^& &h0 viE& tj h0& vY. [R&
th`& thi @yi Qi tRng C010r+)ra(i'ntPPaint vD
T',t!r'Paint.
PaintC0nt',t [Unh nghha -ut -ji trng tQi ! vD u& 1p &h0
viE& vY.CC& tha0 tC& vY R& t_3 &hn @yi ngzi 1p
trnh.
2tr0;' Te0 ra -ut Qi tRng 2hap' -D &C& zng vi"n &wa
nx `0& te0 @xng.[R& th`& thi @yi phng tha&
>a*i&2tr0;'.
CC& 1p vD -j tW * 1R& v" &hngB
Lp /j tW
#66in'Tran*60r-
fNava.a?t.g'0-g
/iI! tW -ut phcp @iJn i 2D a66in' +-D th`& hiEn
viE& Cnh ,e t!3Jn tvnh tt ta u 2D nD3 Jn ta u
2D ;hC&.
httpBOOtai1i'!ha3.&0-
2:
Lp trnh ha trn Java 2D v 3D
#1phaC0-p0*it' Th`& thi B C0-p0*it'
Th`& hiEn &C& 1!t ;Jt hRp &C& giC trU a1pha & @Wn &h0
&C& Qi tRng 2hap'+T',t vD $-ag'.
>a*i&2tr0;' Th`& thi B2tr0;'
[Unh nghha ;iT! @t vYf p'n *t31'g R& Cp (bng
&h0 &C& zng @a0 &wa Qi tRng 2hap'.
C010r Th`& thiB Paint
[Unh nghha -ut ;iT! tj -D! ng nh]t &h0 Qi tRng
2hap'.
)ra(i'ntPaint Th`& thiB Paint
[Unh nghha -ut -! tj -D! 10ang t!3Jn tvnh &h0 Qi
tRng 2hap'./! nD3 *Y tha3 i tt -D! C1 ftei iT-
P1g ti -D! C2ftai iT- P2g.
)raphi&*2D /y rungB )raphi&*
Lp & *y &h0 !C trnh te0 @xng tr0ng ;hjng gian
2D./y rung 1p gQ& Nava.a?t.)raphi&*
T',t!r'Paint Th`& thiB Paint
[Unh nghha -ut ;iT! tj th'0 -! &h0 Qi tRng
2hap'./! tj R& te0 ra tt! Qi tRng
>!66'r'($-ag'.
2.2 #enderin" *%ncepts
[T tj trCt -ut Qi tRng ha *G (bng Java 2DA #P$+ &n thiJt 1p
ngZ &Wnh Graphics%&Context vD *G (bng -ut tr0ng &C& phng tha& tj
trCt Graphics%& Qi vi Qi tRng.
Cx thT tha3 i &C& th!u& tvnh treng thCi -D te0 nIn ngZ &Wnh
Graphics%& nh B
Tha3 i u rung &wa nct @t
Tha3 i &h0 &C& nct @t ;Jt hRp vi nha! nh thJ nD0.
httpBOOtai1i'!ha3.&0-
2<
Lp trnh ha trn Java 2D v 3D
ThiJt 1p -ut ;h!ng &^t T gii hen v_ng R& tj trCt.
Ch!3Tn i ta u +,0a3+1]3 t 1E h0& &^t &C Qi tRng ;hi
&hng R& r'n('r.
[Unh nghha &C& -D! vD &C& ;iT! T tj &C& hnh.
rC& Unh &C& Qi tRng a haf-!1tip1' graphi&* 0@N'&t*g &n
phWi R& te0 ra nh thJ nD0.
Graphics%& Unh nghha -ut *Q phng tha& T thI- vD tha3 i &C&
th!u& tvnh tr0ng ngZ &Wnh ha . K! hJt nhZng phng tha& nD3 1D
nhZng Qi tRng @iT! (ikn &C& th!u& tvnh riIng @iEt nh Qi t`ng Paint
ha3 Stroke .
SgZ &Wnh Graphics%& &]t giZ &C& tha- &hiJ! ti &C& Qi tng th!u&
tvnh . SJ! @iJn i -ut Qi tRng th!u& tvnh -D 1D -ut phn &wa ngZ &Wnh
Graphics%& +th &n phWi gi phng tha& thiJt 1p ph_ hRp T ;hai @C0
ngZ &Wnh.Tha3 i -ut Qi tRng tr0ng !C trnh tha0 tC& r'n('r *Y gs3
nIn -ut *Q @iT! hiEn @]t thng thzng vD ;hjng n Unh .
%.%.( #enderin$ Process
ihi -ut Qi tRng ha R& r'n('r+ thjng tin v" hnh h& +Wnh vD
th!u& tvnh R& ;Jt hRp T tvnh t0Cn nhZng giC trU iT- Wnh &n phWi tha3
i trIn -Dn hiTn thU.
F!C trnh r'n('r &h0 -ut Qi tRng 2hap' &x thT R& &hia thDnh 7 @&
B
1. SJ! Qi tRng Shape R& ta nct +Qi tRng Stroke !3 vD0 ngZ
&Wnh Graphics%& R& *G (bng T te0 nIn -ut Qi tRng Shape -i
@a0 !anh nhZng zng nct x .
2. Ta u &wa zng th!u& Qi tRng Shape R& @iJn i tt ;hjng
gian ngzi *G (bng *ang ;hjng gian &wa thiJt @U th'0 &C& th!u& tvnh @iJn
i tr0ng ngZ &Wng ha Graphics%& .
httpBOOtai1i'!ha3.&0-
2=
Lp trnh ha trn Java 2D v 3D
5. [zng fpathg&wa Qi tRng 2hap' R& &^t @ @ng &C&h *G (bng
&C& th!u& tvnh &^t tr0ng ngZ &Wnh Graphics%&.
7. Phn &dn 1ei &wa Qi tRng Shape R& tj @Vng &C&h *G (bng
th!u& tvnh &wa Qi tRng Paint vD Co"posite th!u& tvnh tr0ng ngZ &Wnh
&wa Qi tRng Graphics%&.
Te0 @xng f.'n('ringg vVn @Wn tng ng vi viE& te0 @xng &C& Qi
tRng th!u& ;iT! Shape+ ;hi x vVn @Wn R& te0 @xng vi ttng g13ph vD
-\i g13ph 1D -ut Qi tRng th!u& ;iT! Shape. Ch &x i"! ;hC& 1D Java
2D #P$ phWi ,C& Unh Qi tRng +ont nD0 *G (bng &h0 vVn @Wn vD 1]3
;iT! g13ph tng ang tt Qi tRng +ont tr& ;hi te0 @xng.
[Qi vi Wnh th &x *` ;hC& @iEt + *` &h!3Tn i vD th`& hiEn &C& phcp
&^t @ vi hup ,C& Unh @iIn Wnhf i-ag'* @0!n(ing @0,g. Thjng tin v"
-D! *^& 1]3 tt &hvnh Wnh x vD ng!n a1phafa1pha &hann'1g R& *G (bng
;Jt hRp vi th!u& tvnh hiEn tei &wa Co"posite ;hi &C& iT- Wnh R&
hRp trIn @" -t te0 @xng.
%.%.% Controin$ #enderin$ 6uait'
Java 2D #P$ a ra &C& 1`a &hn &h0 phcp ngzi *G (bng te0 @xng
nhanh ha3 te0 @xng vi &h]t 1Rng &a0. ShZng tha- &hiJ! &wa ngzi *!
(bng R& ,C& Unh nh 1D &C& &h (n thjng !a th!u& tvnh &wa Qi tRng
#enderin$7ints tr0ng ngZ &Wnh &wa Qi tRng Graphics%& . ihjng phWi
t]t &W &C& -ji trzng "! h\ trR viE& tha3 i &hJ u te0 @xng v v3 ,C&
Unh &C& &h (n &h0 !C trnh te0 @xng *Y ;hjng R& W- @W0 &hng *Y
R& *G (bng ha3 ;hjng .
Lp .'n('ringKint* h\ trR &C ;iT! &h (n *a! s3B
#1pha int'rp01ati0n P &x thT thiJt 1p t_3 &hn ('6a!1t+ !a1it3+
*p''(.
#ntia1ia*ing P &x thT thiJt 1p t_3 &hn ('6a!1t B0n h0& 066.
httpBOOtai1i'!ha3.&0-
29
Lp trnh ha trn Java 2D v 3D
C010r .'n('ring P &x thT thiJt 1p t_3 &hn ('6a!1t+ !a1it3+ h0&
*p''(.
Dith'ring P &x thT thiJt 1p t_3 &hn ('6a!1tB(i*a@1'+ 'na@1'.
8ra&ti0na1 /'tri&* P &x thT thiJt 1p t_3 &hn ('6a!1t+ 0n+ h0& 066.
$nt'rp01ati0nP &x thT thiJt 1p t_3 &hn n'ar'*tPn'igh@0r+ @i1in'ar+
h0& @i&!@i&.
.'n('ring P &x thT thiJt 1p t_3 &hn ('6a!1t+ !a1it3+ h0& *p''(.
T',t antia1ia*ing P &x thT thiJt 1p t_3 &hn ('6a!1tB 0n h0& 066.
[T thiJt 1p h0& tha3 i &C& th!u& tvnh #enderin$7ints tr0ng ngZ
&Wnh &wa Qi tRng Graphics%& th gi phng tha& set#enderin$7ints.
ihi -ut &h (n R& thiJt 1p -V& Unh +-ji trzng te0 @xng -& Unh
*Y R& *G (bng .
89 thu:t " tr;n<!ntiaiasin$=
ihi &C& th`& thT & *y R& te0 @xng trIn thiJt @U hiTn thU +&C&
@iInf&enhg &wa &hng &x thT ;hjng trn ha3 nhC- 1D (0 th!u& tvnh
aliasing. CC& zng &!ng vD zng &hc0 &x (eng nhC- @yi v &hng
R& ,]p , @yi &C& iT- Wnh -D gn nh]t v" hn (eng vi &hng . [s3 1D
i"! -D &hng ta &x thT nhn th]3 vi &C& thiJt @U tr& s3 vi &C& &enh
nhC- ,!]t hiEn trCi ngR& h0Dn t0Dn vi &C& &enh trn &wa zgn n-
ngang ha3 thng ang.
$ntialiasing 1D -ut ;h th!t R& *G (bng T te0 @xng &C& Qi tRng
vi &C& &enh trn hn. Tha3 v *G (bng &C& iT- Wnh gn giQng vi &C&
zng &hc0 vD zng &0ng +tVng -t u &C& iT- Wnh @a0 !anh ti &C&
v_ng R& te0 @xng. [i"! nD3 1D- &h0 &C&h &enh trn hn vD trWi rung *`
&h!3Tn tiJp @tOt^t vi &C& pi,'1 a iT-f-!1ti pi,'1g . T!3 nhiIn ;h th!t
antia1ia*ing di hi nhi"! v" tDi ng!3In -C3 tvnh vD 1D- tVng thzi gian te0
@xng.
httpBOOtai1i'!ha3.&0-
50
Lp trnh ha trn Java 2D v 3D
%.%.* Stroke !ttri,utes
Te0 nct -ut Qi tRng th!u& ;iT! 2hap' nh Qi tRng GeneraPath
tng nng vi viE& *G (bng -ut @t 1jgv& th'0 &C& 0en &wa Qi tRng
GeneraPath. Th!u& tvnh &wa Graphics%&Stroke Unh nghha &C& tvnh
&h]t &wa nct @t vY.
[Qi tRng BasicStroke R& *G (bng T Unh nghha &C& th!u& tvnh
zng nct &h0 -ut ngZ &Wnh &wa Graphics%&. BasicStroke inh nghha
&C& th!u& tvnh nh u rung &!W nct vY +-! tj
[T thiJt 1p ha3 tha3 i &C& th!u& tvnh 2tr0;' tr0ng ngZ &Wnh &wa
Graphics%& th gi phng tha& setStroke.
Sh vv (!+Wnh ! tiIn tr0ng hnh 2P5 *G (bng -it'r N0inP*t31'+vD hnh
tha hai *G (bng ;iT! r0!n( N0inP*t31'+ a r0!n( 'n(&ap *t31'+ an( a (a*hing
patt'rn.
httpBOOtai1i'!ha3.&0-
51
Lp trnh ha trn Java 2D v 3D
CC& phng tha& te0 @xng Graphics%& &x *G (bng th!u& tvnh &wa
Stroke T vY nh dra$r&+ draLine+ dra'val+ dra!olygon+
dra!olyline+ dra(e&t+ vD
dra(ound(e&t.ihi -ut tr0ng &C& phng tha& R& gi th &C& zng
nct &wa Qi tRng Shape ,C& Unh *Y R& t0 @xng. Th!u& tvnh
Stroke Unh nghha &C& tvnh &h]t &wa zng thng vD &C& th!u& tvnh &wa
Paint Unh nghha -D! *^& ha3 -! &wa nct @t. Xv (b phng tha&
draf-3.'&tang1'g R& giB
1. Th!u& tvnh &wa Stroke *Y !3 Unh &h0 zng nct &wa hnh &hZ nht .
2. CC& zng nct nD3 *Y R& @iJn i thDnh -ut Qi tRng ;iT! Shape
.
5. [Qi tRng Paint i* R& Cp (bng&C& iT- Wnh th!u& -i"n gii hen
@yi zng @a0 &wa Qi t`ng Shape.
F!C trnh ,G 1H nD3 R& -inh he0 tr0ng hnh 2P7B
%.%.- +i !ttri,utes
Th!u& tvnh tj -D! tr0ng ngZ &Wnh Graphics%& R& @iT! (ikn @yi
Qi tRng Paint. Cx thT thI- -ut Qi tRng vD0 ngZ &Wnh &wa Qi tRng
Graphics%& f)raphi&*2D &0nt',tg @ng &C&h gi phng tha& set!aint.
ihi -ut Qi tRng Shape ha3 1D &C& g13ph R& vY f@yi &C& phng tha&
Graphics%&.dra+ Graphics%&.dra"tringg+
httpBOOtai1i'!ha3.&0-
52
Lp trnh ha trn Java 2D v 3D
[Qi tRng Paint nD3 *Y R& Cp (bng ti t]t &W &C& pi,'1 n- tr0ng
Qi tRng Shape -D @iT! (ikn &C& zng nct @a0 !anh Qi tRng . ihi
-ut Qi tRng 2hap' R& tj -D! fGraphics%&.fillg+ Qi tRng Paint
R& Cp (bng ti t]t &W &C& iT- Wnh n- tr0ng zng @a0 &wa Qi tRng
2hap'.
CC& ;iT! tj -D! ng nh]t n giWn f*01i( &010rg R& ;hyi te0 @yi
phng tha& setCoor.)olor 1D phn triTn ;hai fi-p1'-'ntati0ng n giWn
nh]t &wa gia0 tiJp Paint fPaint int'r6a&'g.
[T tj &C& hnh vi &C& ;iT! tj pha& tep hn nh 1D tj 10angfgra(i'ntg
vD tj (Et f t',t!r'g @ng &C&h *G (bng &C& 1p tr0ng Java 2D Paint 1D
GradientPaint vD TexturePaint. CC& 1p nD3 *Y 10ei @ &C& &jng viE&
tiI! tQn thzi gian T te0 &C& ;iT! tj pha& tep @ng &C&h *G (bng &C& ;iT!
tj -! ng nh]t n giWn .
ihi gi ph0ng tha& fill T te0 @xng -ut Qi tRng 2hap'+th hE
thQng *YB
1. rC& Unh &C& iT- Wnh nD0 T thT hiEn Qi tRng x.
2. rC& Unh -D! &h0 -\i iT- Wnh tt Qi t`Rng Paint.
5. Ch!3Tn &C& -D! nD3 ti giC trU iT- Wnh tng ang &h0 &C&
thiJt @U hiTn thU.
7. )hi &C& iT- Wnh ra thiJt @U hiTn thU x.
httpBOOtai1i'!ha3.&0-
55
Lp trnh ha trn Java 2D v 3D
Qu trnh x l theo phin
[T t &ha& hRp 1H !C trnh ,G 1H &C& iT- Wnh + Java 2D #P$ t &ha&
&hng th'0 ttng phiIn.
/\i phiIn &x thT 1D tp &C& iT- Wnh ;" nha! trIn -ut zng !ct
ha3 1D -ut ;hQi f@10&;g&C& iT- Wnh. F!C trnh ,G 1H th'0 phiIn R&
th`& hiEn th'0 2 @&B
1. Phng tha& &reate)ontext &wa Qi tRng paint R& gi T te0
-ut Qi tRng PaintContext. [Qi tRng PaintContext nD3 *Y 1! thjng
tin ngZ &Wnh v" tha0 tC& te0 @xng hiEn thzi vD nhZng thjng tin &n thiJt
T te0 ra &C& -D!. Phng tha& &reate)ontext -'th0( i* pa**'( th'
@0!n(ing @0,'* 06 th'graphi&* 0@N'&t @'ing 6i11'( in !*'r *pa&' an( in
('vi&' *pa&'+Qi tRng Coor/ode 1D ni T te0 &C& -D! *^&+vD th`&
hiEn !C trnh &h!3Tn i T Cnh ,e tt ;hjng gian ngzi *G (bng vD0
;hjng gian &wa thiJt @U. [Qi tRng Coor/ode ,'- nh -ut &h (n
;hjng phWi t]t &W &C& Qi tRng Paint &x thT h\ trR -ut Qi tRng
Coor/ode @]t ;.
2. Phng tha& get)olor*odel R& gi T nhn giC trU &wa Qi tRng
Coor/ode &h0 -D! vY tt Qi tRng PaintContext.
Phng tha& get(aster *a! x R& gi 1p 1ei nhi"! 1n T nhn giC
trU &wa Qi t`Rng .a*t'r -D @a0 g- (Z 1iE! -D! tht &h0 -\i phiIn.
Thjng tin nD3 pa**'( t0 th' n',t *tag' in th' r'n('ring pip'1in'+ -D vY
&C& -D! R& te0 @ng &C&h *G (bng Qi t`Rng Co"posite hiEn thzi .
%.%.2 Cippin$ Paths
/ut ;h!ng nhn *Y ,C& Unh phn &wa Qi tRng Shape ha3 ."a$e
&n R& te0 @xng . ihi -ut ;h!ng nhn 1D -ut phn &wa ngZ &Wnh &wa
Qi tRng Graphics%&+ th &h nhZng phn &wa Qi tRng Shape ha3
i"a$e n- tr0ng ;h!ng nhn x -i R& te0 @xng.
httpBOOtai1i'!ha3.&0-
57
Lp trnh ha trn Java 2D v 3D
[T thI- ;h!ng nhn &h0 ngZ &Wnh &wa Graphics%& th g0U phng
tha& setCip. >]t ; Qi tRng Shape &ng &x thT R& *G (bng T Unh
nghha -ut ;h!ng nhn.
[T thDnh i ;h!ng nhn &n phWi *G (bng phng tha& setClip T
,C& Unh -ut ;h!ng nhn -i ha3 1D gi phng tha& &1ip T tha3 i
;h!ng nhn &h0 phn gia0 nha! giZa ;h!ng nhn & vD -ut Qi tRng
Shape.
%.%.3 Transfor"ations
SgZ &Wnh &wa Qi tRng Graphics%& @a0 g- -ut phcp @icn i -D
R& *G (bng T @iJn i nhZng Qi tRng tt ;hjng gian ngzi *G (bng
vD0 ;hjng gian thiJt @U tr0ng !C trnh te0 @xng. [T th`& hiEn &C& phcp
@iJn i ;hC& nh phcp !a3 ha3 1]3 t 1E th &n phWi thI- &C& phcp @iJn
i ;hC& vD0 ngZ &Wnh &wa Qi tRng.CC& phcp @iJn i R& thI- vD0
nD3 *Y try thDnh -ut phn &wa Qng @iJn i fpip'1in' 06 tran*60r-ati0n*g
-D R& Cp(bng tr0ng *!jt !a trnh te0 @xng.
Graphics%& &!ng &]p -ut vDi &C&h ;hC& T tha3 i phcp @iJn i
tr0ng ngZ &Wnh &wa Qi tRng Graphics%& . CC&h n giWn nh]t 1D gi
-ut tr0ng &C& phng tha& @iJn i tr0ng Qi tRng Graphics%& nh B
rotate+ s&ale+ shear+ ha3 translate. rC& Unh &C& tvnh &h]t &wa phcp @iJn
i T Cp (bng tr0ng *!Qt a trnh te0 @xng vD Graphics%& t` ung te0
ra &C& tha3 i ph_ hRp.
Cng &x thT nQi -ut phcp @iJn i !ffineTransfor" vi phcp @iJn
i Graphics%& hiEn tei. Phcp @iJn i !ffineTransfor" th`& hiEn &C&
phcp @iJn i &h0 zng nh phcp (U&h+t 1E +!a3 vD &^t @ vi tp &C&
hnh & @Wn.
ihi -ut phcp @iJn i R& nQi vD0 phcp @iJn i tn tei tr& x
th phcp @iJn i *a! &_ng *Y R& ,C& Unh nh 1D phcp @iJn i R&
httpBOOtai1i'!ha3.&0-
59
Lp trnh ha trn Java 2D v 3D
th`& hiEn ! tiIn. [T tiJp nQi -ut phcp @iJn i vi phcp @iJn i hiEn
tei + 30! pa** an #66in'Tran*60r- t0 Graphics%&.transfor+.
Lp Graphics%& &ng @a0 g- phng tha& set,ransfor+ + nhng
phng tha& nD3 ;hjng @a0 giz R& *G (bng T nQi vi &C& phcp @iJn
i ta u ;hC& &wa phcp @iJn i ang tn tei. Phng tha& set,ransfor+
*Y ghi 1In phcp @iJn i hiEn thzi &wa Qi tRng Graphics%&+ nhng
phng tha& nD3 &n &h0 -jt *Q -b& v&h ;hC& nhB
{p (bng phcp @iJn i t 1E i"! &hnh &h0 -C3 in.
XY -ut Qi tRng >Co"ponent n0nP'r0 tran*1ati0n 6r0- it*
par'nt* 0rigin
Phxng t0 -ut thDnh phn T (k (Dng !an *Ct.
CC& tnh h!Qng ;hC& -D ngzi &!ng &]p Qi tRng )raphi&*2D
-!Qn &h!3Tn i &h0 !C trnh te0 @xng hiE! !W .
Phng tha& set,ransfor+ -'th0( R& ,'- nh T thiJt 1p Qi
tRng Graphics%& try 1ai phcp @iJn i @an ! *a! !C trnh te0 @xng
ha +vVn @Wn vD Wnh R& &h!3Tn iB
AffineTransform aT = g2d.getTransform();
g2d.transform(...);
g2d.draw(...);
g2d.setTransform(aT);
Graphics%& &ng &!ng &sp -ut phiIn @Wn v" (ra?i-ag' -D tr0ng x
Qi tRng !ffineTransfor"
[R& ,'- nh -ut tha- *Q . [i"! nD3 &h0 phcp Cp (bng -ut phcp
@iJn i &h0 Qi tRng Wnh ;hi nx R& vY -D ;hjng &n &hnh *Ga
zng Qng &!W phcp @iJn i. nh nD3 R& R& vY nh ;hi ;Jt nQi
httpBOOtai1i'!ha3.&0-
5:
Lp trnh ha trn Java 2D v 3D
phcp @iJn jit nD3 vi phcp @iJn jit hiEn tei tr0ng ngZ &Wnh &wa
Graphics%&
*2c ph5p +i6n 7i 89an h4:0--ine Trans-%r!s;
Java 2D #P$ &!ng &]p -ut 1p @iJn i 1D !ffineTransfor".
!ffineTransfor"s R& *G (bng T @iJn i vVn @Wn +hnh vD &C& Wnh
;hi &hng R& te0 @xng.
Cng &x thT ang (bng &C& phcp @iJn i &h0 Qi tRng +ont T te0 ra
&C& (n ,!]t 60nt -ifn'? 60nt ('rivati0n*g.
/ut phcp @iJn i ng nh]t fa66in' tran*60r-ati0ng th`& hiEn -ut phcp
@iJn i t!3Jn tvnh trIn tp he0 & @Wn. Sx 1!jn @iJn &C& zng thng
thDnh &C& zng thng vD &C& zng thng *0ng *0ng thDnh &C& zng
thng *0ng *0ng+t!3 nhiIn ;h0Wng &C&h giZa &C& iT- vD &C& gx& &wa &C&
zng thng ;hjng *0ng *0ng &x thT tha3 i.
CC& phcp @iJn i &x thT ;Jt hRp T te0 ra zng Qng &C& phcp @iJn
i -ut &C&h hiE! !W nh- Cp (bng &h0 -ut Qi tRng nD0 x. 2` ;Jt
hRp nD3 ,'- nh 1D *` -x& nQi. ihi -ut phcp @iJn i R& ;Jt nQi vi
-ut phcp @iJn i ang tn tei nh vi !ffineTransfor".&on&atenate+
th phcp @iJn i &!Qi &_ng R& ,C& Unh 1D phcp @iJn i ! tiIn R&
Cp (bng . /ut phcp @iJn i &ng &x thT R& -x& nQi tr& vi -ut
phcp @iJn i ang tn tei . Tr0ng trzng hRp nD3 th phcp @iJn i &!Qi
&_ng *Y R& th`& hiEn &!Qi &_ng . Phcp -x& nQi tr& R& R& Cp
(bng T th`& hiEn &C& phcp @iJn i &x 1iIn !an vi ;hjng gian thiJt @U
tha3 v ;hjng gian ngzi *G (bng. Xv (b &x thT *G (bng phng tha&
!ffineTransfor".pre)on&atenate T th`& hiEn phcp &h!3Tn i &x 1iIn
!an ti ;hjng gian &C& iT- Wnh..
2.2.6.1 Constructing an !!ine"rans!or#
httpBOOtai1i'!ha3.&0-
5<
Lp trnh ha trn Java 2D v 3D
!ffineTransfor" &!ng &]p -ut tp &C& phng tha& &h0 viE& ,s3
(`ng &C& Qi tRng !ffineTransfor".
# get,ranslateinstan&e
# get(otateinstan&e
# get"&aleinstan&e
# get"hearinstan&e
[T *G (bng &C& phng tha& nD3 &n phWi ,C& Unh &C& tvnh &h]t &wa
phcp @iJn i -D &n te0 ra vD 1p !ffineTransfor" *Y te0 ra &C& -a
trn &h!3Tn i ph_ hRp. Cng &x thT ,s3 (`ng phcp @iJn i dng nh]t
-ut &C&h tr`& tiJp -D ;hjng &n thjng !a 1p !ffineTransfor" @ng
&C&h ,C& Unh &C& thDnh phn &wa phcp @iJn i x.
%.%.? Co"posite !ttri,utes
ihi hai Qi tRng ha trng 1In nha! th i"! &n thiJt 1D phWi ,C&
Unh nhZng -D! nD0 *Y R& te0 @xng &h0 &C& iT- Wnh &hng 1In nha!.
Xv (b nJ! -ut hnh &hZ nht -D! vD -ut hnh &hZ nht -D! ,anh
&hng 1In nha! th &C& iT- Wnh x *Y &x -D! h0& -D! ,anh ha3 1D
*` ;Jt hRp &wa &W hai -D!. /D! &wa nhZng iT- Wnh tr0ng v_ng &hng
nha! x *Y ,C& Unh hnh &hZ nht nD0 n- trIn vD @U &h' ;h!]t nh thJ
nD0. F!C trnh ,G 1H T ,C& Unh -D! nD0 te0 @xng &h0 &C& iT- Wnh *Y
R& &hia *Y &h0 &C& Qi tRng &hng f0v'r1aping 0@N'&t*gR& gi
&o+positing.
Cx hai int'r6a&' te0 &C& ;iT! ;Jt hRp & @Wn tr0ng Java 2D 1D B
Co"posite vD Co"positeContext.
[T ,C& Unh &C& ;iT! ;Jt hRp *Y R& *G (bng th &n phWi thI- vD0
-ut Qi tRng !phaCo"posite &h0 ngZ &Wnh &wa Qi tRng
Graphics%& @ng &C&h gi phng tha& set)o+posite.
$lpha)o+posite+vD -ut triTn ;haifi-p1'-'ntati0ng &wa int'r6a&'
C0-p0*it' + &x h\ trR -ut *Q ;iT! ;Jt hRp ;hC& nha! . /\i Qi tRng &wa
httpBOOtai1i'!ha3.&0-
5=
Lp trnh ha trn Java 2D v 3D
1p nD3 1D -ut 1!t ;Jt hRp T -j tW *` pha trun -ut -D! -i vi -D!
ang tn tei..
/ut tr0ng nhZng 1!t ;Jt hRp tr0ng 1p #1phaC0-p0*it' 1D 2.CMX%.+
1!t nD3 &h ra -D! -i f-D! ng!ng *Y R& pha trun vi -D! ang tn
tei f-D! v&h g nh thJ nD0.
2.2.$.1 %anaging "ransparenc&
)iC trU alpha &wa -ut -D! 1D giC trU 0 tr0ng *!jt &wa -D! x +nx
&h ra fth'0 phn trV-g @a0 nhiI! phn trV- -D! tr& ;hi tj R& hiTn
thU ra ;hi &C& -D! &hng 1In nha!. CC& -D! tQi f&0 giC tri a1pha1.0g th
&C& -D! tj 1In &hng *Y ;hjng R& hiTn thU+ tr0ng ;hi x &C& -D!
tr0ng *!Qt f&x giC trU a1pha0.0g &h0 phcp &C& -D! tj 1In nx R& hiTn
thU.
ihi vVn @Wn vD hnh R& te0 @xng th giC trU a1pha *Y @^t ng!n tt
th!u& tvnh &wa Qi tRng Paint tr0ng ngZ &Wnh &wa Qi tRng
Graphics%& . ihi &C& hnh vD vVn @Wn R& 1D- trn th giC trU a1pha tt
th!u& tvnh Paint ftr0ng ngZ &Wnh &wa Graphics%&g R& ;Jt hRp vi
thjng tin v" &C& iT- Wnh @U &h' tt ra*t'ri'( path. CC& Wnh 1! thjng
tin v" giC trU a1pha &wa &hvnh nx .
ihi te0 -ut Qi tRng !phaCo"posite + &x thT ,C& Unh R& giC trU
a1pha R& thI- vD0 . ihi thI- Qi tRng !phaCo"posite nD3 ti ngZ
httpBOOtai1i'!ha3.&0-
59
Lp trnh ha trn Java 2D v 3D
&Wnh &wa Graphics%& +giC trU a1pha thI- vD0 nD3 *Y 1D- tVng giC trU tr0ng
*!Qt &wa @]t ; Qi tRng ha nD0 ;hi &hng R& te0 @xng P giC trU
a1pha &wa -\i Qi tRng ha R& nhsn 1In @yi giC trU a1pha &wa Qi
tRng !phaCo"posite.
2.2.$.2 "ransparenc& an' i#ages
CC& Wnh &x thT 1! thjng tin v" u tr0ng *!Qt &h0 -\i iT- Wnh &wa
nx. Thjng tin nD3 `0& gi 1D ;Inh a1phaf alpha &hannel+g +nx R& *G
(bng ;It* hRp vi Qi tRng Co"posite tr0ng ngZ &Wnh &wa Graphics%&
T pha trun -D! &wa Wnh x &C& ha ang tn tei.
2.< Thi6t &p Graphics2*%ntet
[T &]! hnh ngZ &Wnh Graphics%& &h0 !C trnh te0 @xng phWi *G
(bng &C& phng tha& ;hyi te0 &h0 Qi tRng Graphics%& T ,C& Unh
&C& th!u& tvnh nh .'n('ringKint*+ 2tr0;'+ Paint+C1ipping path+
C0-p0*it'+ an( Tran*60r-.
%.*.( Settin$ #enderin$ 7ints
[Qi tRng #enderin$7ints xng gxi t]t &C& tha- &hiJ! T ,C& Unh
-ut Qi tRng *Y R& te0 @xng nh thJ nD0 . [T te0 &C& &h (n &h0 !C
httpBOOtai1i'!ha3.&0-
70
Lp trnh ha trn Java 2D v 3D
trnh te0 @xng tr0ng ngZ &Wnh Graphics%& +th &n te0 -ut Qi tRng
#enderin$7ints vD &h!3Tn nx vD0 1p Graphics%&.set(endering
Te0 &h (n &h0 !C trnh te0 @xng *Y ;hjng W- @W0 viE& *Y *G (bng
-ut th!t t0Cn te0 @xng &b thTB ;hjng phWi -ji trzng &ng h\ trR &hJ u
te0 @xng .
Tr0ng vv (b &h0 *a! s3 th &h0 phcp *G (bng ;h th!t 1D- trn
fantia1ia*ingg vD te0 ra &C& tha- &hiJ! T ,C& Unh &h]t 1Rng &h0 !C
trnh te0 @xngB
qualityHints = new
RenderingHints(RenderingHints.KEY_ANTiALiAS
iNG,
RenderingHints.VALUE_ANTiALiAS_ON);
qualityHints.put(RenderingHints.KEY_RENDERi
NG,
RenderingHints.VALUE_RENDER_QUALiTY);
g2.setRenderingHints(qualityHints);
%.*.% Specif'in$ Stroke !ttri,utes
/ut Qi tRng BasicStroke *Y Unh nghha &C& tvnh &h]t !?0& Cp
(bng &h0 zng vi"n @a0 !anh -ut Qi tRng Shape+ g- &x u rung vD
;iT! zng f(a*hing patt'rng+T 1D- thJ nD0 &C& 0en thng R& ;Jt hRp
vi nha!. [T ;hyi te0 &C& th!u& tvnh v" zng nct tr0ng ngZ &Wnh
Graphics%& +th ;hyi te0 -ut Qi tRng BasicStroke vD &h!3"n nx vD0
phng tha& setStroke
2.(.2.1 Setting the Stro)e *i'th
[T ;hyi te0 u rung zng nct th ;hyi te0 Qi tRng BasicStroke vi
u rung -0ng -!Qn vD *a! x gi phng tha& set"tro-e
httpBOOtai1i'!ha3.&0-
71
Lp trnh ha trn Java 2D v 3D
Tr0ng vv (b &h0 *a! s3 +u rung zng nct R& ;hyi te0 vi 12
iT- vD giC trU -& Unh R& *G (bng &h0 viE& @Q trv ;iT! N0nt vD ;iT!
'n(&ap.
wideStroke = new BasicStroke(12.0f);
g2.setStroke(wideStroke);
2.(.2.2 Speci!&ing +oin an' ,n'cap St&les
[T ;hyi te0 &h0 &C& ;iT! N0in vD 'n(&ap +&n te0 -ut Qi tRng
BasicStroke vi &C& th!u& tvnh -0ng -!Qn .
Tr0ng vv (b &h0 *a! s3+u rung zng nct R& ;hyi te0 vi 12 iT-
vD &C& ;iT! N0in vD 'n(&ap R& *G (bng tha3 &h0 &C& gia tri -& UnhB
roundStroke = new BasicStroke(4.0f,
BasicStroke.CAP_ROUND,
BasicStroke.JOiN_ROUND);
g2.setStroke(roundStroke);
2.(.2.( Setting the Dashing -attern
CC& ;iT! zng pha& tep &x thT (k (Dng R& Unh nghha vi -ut Qi
tRng BasicStroke.
ihi te0 -ut Qi tRng BasicStroke +phWi ,C& Unh 2 tha- *Q T ;iT-
*0Ct ;iT! zngB
dash P 1D -ut -Wng @iT! (ikn ;iT! zng. CC& phn tG ,'n ;Y
&wa -Wng @iT! (ikn ;v&h th& nct ge&h vD ;h0Wng &C&h giZa &C& nct
ge&h .
Phn tG 0 @iT! (ikn nct ge&h ! tiIn+ phn tG tha 1 @iT! (ikn ;h0Wng
tr^ng ! tiIn.
httpBOOtai1i'!ha3.&0-
72
Lp trnh ha trn Java 2D v 3D
dashphase P 1D -ut 066*'t Unh nghha ni @^t ! &wa -! nct
ge&h.
Tr0ng vv (b *a! s3+ hai -! nct ge&h R& Cp (bng &h0 -ut zng
thng. Tr0ng -! tha nh]t +;v&h th& &wa &C& nct ge&h vD ;h0Wng trQng
giZa &hng 1D ;hjng tha3 i. /! tha hai th pha& tep hn +*G (bng
-Wng *C! phn tG T Unh nghha
float dash1[] = {10.0f};
BasicStroke bs = new BasicStroke(5.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOiN_MiTER, 10.0f, dash1,
0.0f);
g2.setStroke(bs);
Line2D line = new Line2D.Float(20.0f,
10.0f, 100.0f, 10.0f);
g2.draw(line);
float[] dash2 = {6.0f, 4.0f, 2.0f,
4.0f, 2.0f, 4.0f};
bs = new BasicStroke(5.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOiN_MiTER, 10.0f, dash2,
0.0f);
g2.setStroke(bs);
g2.draw(line)
CW hai -! "! *G (bng 066*'tfUa &h @^t ! &wa hai -!g 0 ;hi x
&C& nct ge&h ! tiIn *Y vU trv ! &wa -!. Kai -! nD3 R& -inh ha
tr0ng hnh2P<
httpBOOtai1i'!ha3.&0-
75
Lp trnh ha trn Java 2D v 3D
%.*.* Specif'in$ +i !ttri,utes
Th!u& tvnh &W! Qi tRng Paint tr0ng ngZ &Wnh Graphics%& ,C&
Unh &C& -D! tj ha3 &C& -! f;iT! gtj ;hi -ut Qi tRng vVn @Wn vD
2hap' R& te0 @xng.
2.(.(.1 .illing a Shape /ith a 0ra'ient
Lp GradientPaint &!ng &]p -ut &C&h n giWn T tj -ut hnh @ng
;iT! tj 10ang . ihi ;hyi te0 Qi tRng GradientPaint+ &n ,C& Unh vU trv
! tiIn &_ng vi -D! tj vD vU trv &!Qi &_ng -ut -D! tj. iiT! tj nD3 *Y
tha3 i t 1E tt -D! nD3 *ang -D! ;hC& (& th'0 zng nQi &wa hai vU trv
&hn+ -inh ha tr0ng hnh 2P=.
Tr0ng ngji *a0 tha @a+&W hai iT- "! n- tr0ng &_ng -ut hnh.T]t
&W &C& iT- (& th'0 zng tj 10ang -y rung !a iT- P1 *Y nhn R&
-D! @an ! vD &C& iT- (& th'0 zng tj 10ang R& -y rung ng0Di
iT- P2 *Y nhn -D! ;Jt th&.
CC& @& &n th`& hiEn T tj 10ang th'0 hai -D!B
1. ihyi te0 Qi tRng GradientPaint .
2. )i phng tha& Graphics%&.set!aint.
5. ihyi te0 Qi tRng Shape.
httpBOOtai1i'!ha3.&0-
77
Lp trnh ha trn Java 2D v 3D
Tr0ng vv (b *a! s3+ -ut hnh &hZ nht R& tj vi -! (Et n giWn
tt -ut Qi tRng @!66'r'( i-ag'.
GradientPaint gp = new
GradientPaint(50.0f, 50.0f, Color.blue
50.0f, 250.0f, Color.green);
g2.setPaint(gp);
g2.fillRect(50, 50, 200, 200);
2.(.(.2 .illing a Shape /ith a "exture
Lp T',t!r'Paint &!ng &]p -ut &C&h n giWn T tj hnh @ng -! 1p.
ihi te0 -ut Qi tRng >!66'r'(i-ag' T *G (bng nh 1D -ut -! tj. Cn
&h!3Tn hD- ;hyi te0 -ut hnh &hZ nht T Unh nghha tn *Q 1p &h0
-! +R& &hi ra tr0ng hnh 2P9.
[T tj hnh th'0 -! (EtB
1. Te0 Qi tRng TexturePaint
2. )i phng tha& Graphics%&.set!aint.
5. Te0 Qi tRng Shape.
7. )i phng tha& Graphics%&.fillf*hap'g.
Tr0ng vv (b *a! s3+ -ut hnh &hZ nht R& tj vi -! (Et
n giWn tt -ut Qi tRng ,ufferedi"a$e.
// Create a buffered image texture patch
of size //5x5
Bufferedimage bi = new Bufferedimage(5, 5,
Bufferedimage.TY!"i#T"$%B&'
%raphics() big = bi.create%raphics(&'
big.setCo*or(Co*or.green&'
httpBOOtai1i'!ha3.&0-
79
Lp trnh ha trn Java 2D v 3D
big.fi**$ect(+,+,5,5&'
big.setCo*or(Co*or.*ight%ra,&'
big.fi**-.a*(+,+,5,5&'
// Create a texture paint from the
buffered image
$ectang*e r = new $ectang*e(+,+,5,5&'
Textureaint tp = new
Textureaint(bi,r,Textureaint.#!/$!0T"#!i%1B-$&'
// /dd the texture paint to the graphics
context. g(.setaint(tp&'
// Create and render a rectang*e fi**ed
with the texture. g(.fi**$ect(+,+,(++,(++&'
2
%.*.- Settin$ the Cippin$ Path
[T Unh nghha -ut ;h!ng nhnB
1. ihyi te0 -ut Qi tRng Shape -D @iT! (ikn v_ng -!Qn te0
@xng.
2. )i phng tha& Graphics%&.set)lip T *G (bng Qi t!Rng
*hap' nh 1D -ut ;h!ng nhn &h0 ngZ &Wnh )raphi&*2D .
[T th! hp ;h!ng nhnB
1. ihyi te0 Qi tRng Shape -D gia0 vi ;h!ng hnn hiEn tei.
2. )i phng tha& &1ip T tha3 i ;h!ng nhn &h0 phn gia0
nha! &wa ;h!ng nhn hiEn tei vD Qi tRng Shape -i.
Tr0ng vv (b &h0 *a! s3+ -ut ;h!ng nhn R& te0 ra tt -ut '1ip vD
*a! x R& tha3 i @Vng &C&h gi phng tha& &lip.
public void paint(Graphics g) {
httpBOOtai1i'!ha3.&0-
7:
Lp trnh ha trn Java 2D v 3D
Graphics2D g2 = (Graphics2D) g;
// The width and height of the canvas
int w = getSize().width;
int h = getSize().height;
// Create an ellipse and use it as
the clipping path
Ellipse2D e = new
Ellipse2D.Float(w/4.0f,h/4.0f,
w/2.0f,h/2.0f);
g2.setClip(e);
// Fill the canvas. Only the area
within the clip is rendered
g2.setColor(Color.cyan);
g2.fillRect(0,0,w,h);
// Change the clipping path, setting
it to the intersection of
// the current clip and a new
rectangle.
Rectangle r = new
Rectangle(w/4+10,h/4+10,w/2-20,h/2-20);
g2.clip(r);
// Fill the canvas. Only the area
within the new clip
// is rendered
httpBOOtai1i'!ha3.&0-
7<
Lp trnh ha trn Java 2D v 3D
g2.setColor(Color.magenta);
g2.fillRect(0,0,w,h);
%.*.2 Settin$ the Graphics%& Transfor"
[T @iJn i Qi tRng Shape+,s! vVn @Wn+ ha3 Wnh &n phWi thI- vD0
-ut phcp @iJn i -i !ffineTransfor" &h0 zng Qng phcp @iJn i
tr0nh ngZ &Wnh &wa Graphics%& tr& ;hi te0 @xng . phcp @iJn i R&
Cp (bng ;hi Qi tRng ha R& te0 @xng .
Xv (b T vY -ut hnh &hZ nht nghiIng 79 uB
1. L]3 -ut phcp @iJn i Graphics%& tr& ;hi th`& hiEn @]t
; phcp @iJn i nD0 . L!jn gi phng tha& get,ransfor+
tr0ng Qi tRng Graphics%& tr& ;hi thI- vD0 -ut phcp @iJn
i &h0 ngZ &Wnh ha @yi v ngZ &Wnh ha &x thT tn
tei -ut phcp @iJn i &h0 -ut 1v (0 ;hC& +Unh vU 2?ing vD &C&
thDnh phn tr0ng -ut &Ga *.
2. L]3 phcp !a3 @ng &C&h gi !ffineTransfor".
get(otateinstan&e.
5. )i phng tha& Graphics%&.tran*60r- T thI- vD0 &C&
phcp @iJn i -i &h0 zng Qng @iJn i. ihjng R& *G
(bng phng tha& set,ransfor+ T thI- -ut phcp @iJn i ta
u -i+@yi v set,ransfor+ *Y ghi 1In phcp @iJn i hiEn tei
tr0ng ngZ &Wnh ha
1. 7.Te0 Qi tRng #ectan$e%&..loat .
7. )i phn tha& Graphics%&.dra T te0 @xng hnh &hZ
nht.
9. 2a! ;hi te0 @xng &h0 hnh &hZ nht R& @iJn i + th
r'*'t phcp @iJn i &wa Graphics%& try v" phcp @iJn i @an
httpBOOtai1i'!ha3.&0-
7=
Lp trnh ha trn Java 2D v 3D
! -D 1! tr0ng @& 1 @ng &C&h gi phng tha&
set,ransfor+ &h0 phcp @iJn i @an ! .
Tr0ng vv (b *a! s3+ -ut thT hiEn &wa !ffineTransfor" R& *G
(bng T !a3 hnh &hZ nht i 79 u ;hi nx R& te0 @xng.
AffineTransform aT = g2.getTransform();
Rectangle2D rect = new
Rectangle2D.Float(1.0,1.0,2.0,3.0);
AffineTransform rotate45 =
AffineTransform.getRotateinstance(Math.Pi
/4.0,0.0,0.0)
g2.transform(rotate45);
g2.draw(rect);
g2.setTransform(aT);
Cdn tr0ng vv (b nD3+-ut Qi tRng !ffineTransfor" R& *G (bng
T !a3 &C& &s! t',t ,!ng !ang -ut iT- tr!ng ts-.
// Define the rendering transform
AffineTransform at = new
AffineTransform();
// Apply a translation transform to
make room for the
// rotated text.
httpBOOtai1i'!ha3.&0-
79
Lp trnh ha trn Java 2D v 3D
at.setToTranslation(400.0, 400.0);
g2.transform(at);
// Create a rotation transform to
rotate the text
at.setToRotation(Math.Pi / 2.0);
// Render four copies of the string
Java at 90 degree angles
for (int i = 0; i < 4; i++) {
g2.drawString(Java, 0.0f, 0.0f);
g2.transform(at);
}
Cx thT @iJn i Wnh tr0ng &C&h tng t` Pphcp @iJn i tr0ng ngZ
&Wnh Graphics%& R& Cp (bng tr0ng !C trnh te0 @xng -D ;hjng &n
!an ts- Jn ;iT! Qi tRng he0 ang R& te0 @xng
[T Cp (bng phcp @iJn i &h0 Wnh -D ;hjng &n tha3 i phcp @iJn
i tr0ng ngZ &Wnh Graphics%& + th &h!3Tn !ffineTransfor" *ang
dra1i"a$eB
AffineTransform rotate45 =
AffineTransform.getRotateinstance(Math.Pi
/4.0,0.0,0.0)
g2.drawimage(myimage, rotate45);
CC& phcp @iJn i &ng R& Cp (bng &h0 Qi tRng 80nt T te0 ra
-ut ;iT!.
httpBOOtai1i'!ha3.&0-
90
Lp trnh ha trn Java 2D v 3D
%.*.3 Specif'in$ a Co"position St'e
/ut Qi tRng !phaCo"posite &haa &C& 1!t ;Jt hRp T ,C& Unh
&C& -D! *Y R& te0 @xng nh thJ nD0 ;hi Qi tRng nD! 1In Qi tRng
;hC& . [T ,C& Unh &C& ;iT! ;Jt hRp &h0 ngZ &Wnh Graphics%& + &n te0
-ut Qi tRng !phaCo"posite vD &h!3"n nx vD0 phng tha&
setCo"posite. iiT! thjng (bng nh]t 1D 2.CMX%..
2.(.6.1 Using the Source 1ver Co#positing 2ule
L!t ;Jt hRp 2.CMX%. *Y ;Jt hRp &C& iT- Wnh ng!n f*0!r&'
pi,'1g vi &C& iT- Wnh v&h f('*tinati0n pi,'1g. Xv (b +nJ! te0 @xng -ut
hnh &hZ nht -D! ,anh n& @iTn f@1!'g vD *a! x te0 @xng -ut hnh
&hZ nht -D! -D 1In -ut phn &wa hnh &hZ nht ;ia+th v_ng gia0
nha! x *Y &x -D! . Ka3 nxi &C&h ;hC& +Qi tng -D R& te0 @xng
&!Qi &_ng *Y ,!]t hiEn y trIn &_ng .
[T *G (bng 1!t ;Jt hRp 2.CMX%. B
1. Te0 -ut Qi tRng #1phaC0-p0*it' @ng &C&h gi phng
tha& g'tin*tan&' vD ,C& Unh 1!t
2.CMX%. .
#1phaC0-p0*it' a&
#1phaC0-p0*it'.g'tin*tan&'f#1phaC0-p0*it'.2.CMX
%.g
2. )i phng tha& *'tC0-p0*it' T thI- Qi t!Rng
#1phaC0-p0*it' &h0 ngZ &Wnh &wa )raphi&*2D.
g2.*'tC0-p0*it'fa&g
/\i ;hi Qi tRng ;Jt hRp nD3 R& thiJt 1p +th Qi tRng 1In
R& te0 @xng @ng &C&h *G (bng 1!t ;Jt hRp ,C& Unh.
2.(.6.2 3ncreasing the "ransparenc& o! Co#posite' 145ects
httpBOOtai1i'!ha3.&0-
91
Lp trnh ha trn Java 2D v 3D
!phaCo"posite &h0 phcp ,C& Unh -ut giC trU hng *Q a1pha thI-
vD0 -D R& nhsn vi giC trU a1pha &wa &C& iT- Wnh ng!n T tVng u
tr0ng *!Qt.
Xv (b +T ;hyi te0 -ut Qi tRng !phaCo"posite -D te0 @xng Qi
tRng ng!n &x u tr0ng *!Qt 1D 90 +,C& Unh -ut giC trU a1pha 1D .9B
AlphaComposite ac
=AlphaComposite.getinstance(AlphaComposite.SRC_OV
ER, .5f);
Tr0ng vv (b &h0 *a! s3+ a *0!r&' 0v'r a1pha &0-p0*it' 0@N'&t i*
&r'at'( ?ith an a1pha 06 .9 an( a(('( t0 th' graphi&* &0nt',t+ &a!*ing
*!@*'!'nt *hap'* t0 @'
r'n('r'( 90 tran*par'nt.
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.red);
g2.translate(100,50);
// radians=degree * pie / 180
g2.rotate((45*java.lang.Math.Pi)/180);
g2.fillRect(0,0,100,100);
g2.setTransform(new AffineTransform()); //
set to identity
// Create a new alpha composite
AlphaComposite ac =
httpBOOtai1i'!ha3.&0-
92
Lp trnh ha trn Java 2D v 3D
AlphaComposite.getinstance(AlphaComposite.SR
C_OVER,0.5f);
g2.setComposite(ac);
g2.setColor(Color.green);
g2.fillRect(50,0,100,100);
g2.setColor(Color.blue);
g2.fillRect(125,75,100,100);
g2.setColor(Color.yellow);
g2.fillRect(50,125,100,100);
g2.setColor(Color.pink);
g2.fillRect(-25,75,100,100);
}
2.. #enderin" Graphics Pri!itives
Graphics%& &!ng &]p &C& phng th& te0 @xng &h0 &C& & *y
ha nh Shapes+ Text+ vD i"a$esB
drate0 nct &h0 zng vi"n &wa Qi t`Rng Shape @ng &C&h *G
(bng &C& Qi tRng Stroke vD Paint tr0ng ngZ &Wnh Graphics%& .
filltj -ut Qi tRng 2hap' @ng &C&h *G (bng Qi tRng Paint
tr0ng ngZ &Wnh Graphics%& .
dra"tringte0 @xng &C& ,s! vVn @Wn (R& ,C& Unh @ng &C&h
* (bng Qi tRng Paint tr0ng ngZ &Wnh Graphics%& .
drai+agete0 @xng &C& Wnh R& ,C& Unh
2.4.1 Drawing a Shape
[zng @iIn &wa @]t ; Qi tRng Shape &ng R& te0 @xng @ng
phng tha& Graphics%&.dra.
httpBOOtai1i'!ha3.&0-
95
Lp trnh ha trn Java 2D v 3D
Phng tha& vY tt &C& phiIn @Wn tr& &ng R& h\ trR B draLine+
dra(e&t+ dra(ound(e&t+ dra'val+ dra$r&+dra!olyline+
dra!olygon+ dra3D(e&t.
ihi -ut Qi tRng Shape R& vY + th zng @iIn &wa nx *Y R& te0
nct @ng Qi tRng Stroke tr0ng ngZ &Wnh Graphics%&
>ng viE& thict 1p Qi tRng BasicStroke ph_ hRp tr0ng ngZ &Wnh
Graphics%& +thd &x thT vY zng thng vi u rung vD -! nct ge&h @]t
; . [Qi tRng BasicStroke &ng Unh nghha &C& th!u& tvnh end&ap vD
/oin &wa zng thng .
[T te0 @xng &h0 &C& zng @iIn &wa Qi tRng shapeB
1. ihyi te0 &h0 Qi tRng BasicStroke
2. )i phng tha& Graphics%&.set"tro-e
5. ihyi te0 &h0 Qi tRng Shape.
7. )i phng tha& Graphics%&.draf*hap'g.
Tr0ng vv (b *a!+Qi tRng GeneraPath R& *G (bng T Unh nghha
-ut ngji *a0 vD -ut Qi tRng BasicStroke R& thI- vD0 ngZ &Wnh
Graphics%& T Unh nghha &h0 &C& &enh &wa ngji *a0 vi &C& th!u& tvnh
/oin .
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// create and set the stroke
g2.setStroke(new BasicStroke(4.0f));
// Create a star using a general path
object
httpBOOtai1i'!ha3.&0-
97
Lp trnh ha trn Java 2D v 3D
GeneralPath p = new
GeneralPath(GeneralPath.NON_ZERO);
p.moveTo(- 100.0f, - 25.0f);
p.lineTo(+ 100.0f, - 25.0f);
p.lineTo(- 50.0f, + 100.0f);
p.lineTo(+ 0.0f, - 100.0f);
p.lineTo(+ 50.0f, + 100.0f);
p.closePath();
// translate origin towards center of
canvas g2.translate(100.0f, 100.0f);
// render the star's path
g2.draw(p);
}
%.-.% +iin$ a Shape
Phng tha& Graphics%&.fill &x thT R& *G (bng T tj @]t ; Qi
tRng Shape. ihi -ut Qi tRng Shape R& tj+ th phn @U gii hen @yi
ng @a0 &wa Qi tRng *Y R& te0 @xng vi ngZ &Wnh Graphics%& &wa
th!u& tvnh !aint attri@!t'nh )olor+ ,exture!aint+ 0r %radient!aint.
Phng tha& tj tt &C& phiIn @Wn tr& x &wa phn -"- JDi &ng
R& h\ trRB fill(e&t0 fill3D(e&t0 fill(ound(e&t0 fill'val0 fill$r&0
fill!olygon0&lear(e&t1
[T tj -ut Qi tRng 2hap'B
1. rC& Unh -D! tj vD ;iT! tj tr0ng ngZ &Wnh ha @ng
&C&h *G (bng Graphics%&.set)olor ha3
Graphics%&.set!aint.
httpBOOtai1i'!ha3.&0-
99
Lp trnh ha trn Java 2D v 3D
1. ihyi te0 Qi tRng Shape.
2. )i phng tha& Graphics%&.fill T te0 @xng Qi t`ng
2hap'.
Tr0ng vv (b *a! s3 +phng tha& set)olor R& gi T Unh nghha
-D! tj 1D gr''n 6i11 &h0 -ut Qi tRng #ectan$e%&.
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.green);
Rectangle2D r2 = new
Rectangle2D.Float(25,25,150,150);
g2.fill(r2);
}
%.-.* #enderin$ Text
[T te0 @xng vVn @Wn +&n gi Graphics%&.dra"tring+ *a! x &h!3Tn
vD0 ,s! -D @en -!Qn te0 @xng
%.-.- #enderin$ i"a$es
[T te0 @xng vVn @Wn +&n gi Graphics%&.drai+age+ *a! x &h!3Tn
vD0 ,s! -D @en -!Qn te0 @xng .
2.= De-inin" *9st%! *%!p%siti%n #9&es
Cx thT te0 -ut ;iT! -i h0Dn t0Dn &wa phcp ;Jt hRp @Vng &C&h th`&
thi &C& int'r6a&' Co"posite vD Co"positeContext . /ut Qi tRng
Co"posite &!ng &]p -ut Qi tRng Co"positeContext -D th`& &h]t 1D
1! treng thCi vD th& hiEn &jng viE& ;Jt hRp. Shi"! Qi tRng
httpBOOtai1i'!ha3.&0-
9:
Lp trnh ha trn Java 2D v 3D
Co"positeContext &x thT R& te0 tt -ut Qi tRng Co"posite T 1!
&C& treng thCi riIng @iEt tr0ng -ji trzng a 1!ng f-!1tithr'a('(
'nvir0n-'nt.g
2.> #enderin" in a $9&ti?@creen Envir%n!ent
Tr0ngJavaT/ 2 2Di+ v'r*i0n 1.5+ Java 2DT/ #P$ h\ trR nhZng &]!
hnh a -Dn hiTn thi ;hC& nha! -D &x thT R& &]! hnh @yi -ut -ji
trzng -D B
Cx hai h0& nhi"! -Dn hnh u& 1p
Cx hai h0& nhi"! -Dn hnh ni &h &x -ut -Dn hnh &hvnh vD
&C& -Dn hiTn thU ;hC& *Y &0p3 nhZng hnh Wnh ,!Ct hiEn trIn -Dn
hnh &hvnh
Kai h0& nhi"! -Dn hnh -D &x (eng nh -ut -C3 W0 vD nx &h0
phcp gi &C& thiJt @U W0.
Java 2D #P$ &h0 phcp te0 &C& Qi tRng +ra"e+ >+ra"e@ Aindo1+
h0& >1indo1 .Xi -ut Qi tRng GraphicsConfi$uration T ,C& Unh
&C& thiJt @U hiTn thU &h0 !C trnh te0 @xng. Tr0ng &W @a &]! hnh+-\i thiJt
@U hiTn thU R& @iT! (ikn @yi -ut Qi tRng Graphics&evice./ut Qi
tRng Graphics&evice &x nhi"! Qi tRng GraphicsConfi$uration ;Jt
hRp vi nx .
ihi hai h0& nhi"! -Dn hnh R& *G (bng T te0 -ut thiJt @U W0 +hE
ta u W0 f-D tn tei u& 1p vi thiJt @U hiTn thU vt 1H gR& *G (bng T
@iT! (ikn thiJt @U W0 x . CC& @iIn &W! -\i Qi tRng
GraphicsConfi$uration tr0ng &]! hnh a -Dn hiTn thU &x !an hE vi
hE ta u W0 . /ut -Dn hiTn thU tr0ng -ji trzng nD3 R& ,C& Unh nh
1D -Dn hiTn thU &hvnh vD te vU trv f0+ 0g &wa hE ta u W0 . D`a trIn vU trv
&wa -Dn hiTn thU &hvnh +thiJt @U W0 &x thT &x ta u s- +nh tr0ng hnh 2P
10B
httpBOOtai1i'!ha3.&0-
9<
Lp trnh ha trn Java 2D v 3D
[T ,C& Unh nJ! 1D -ji trzng thiJt @U W0 ni -D -ut Qi tRng
Aindo1
ha3 +ra"e &x thT ,!]t hiEn trIn hai ha3 nhi"! -Dn hnh vt 1H +th gi
phng tha& get2ounds trIn -\i Qi tRng GraphicsConfi$uration
tr0ng hE thQng vD ;iT- tra nJ! gQ& ta u ;hC& vU trv f0+ 0g. Phng tha&
get2ounds &wa Qi tRng GraphicsConfi$uration trW v" -ut Qi tRng
hnh .'&tang1' tr0ng hE ta u W0 .X v3 +nJ! -ut gQ& ta u ;hjng phWi
vU trv f0+ 0g+ th -ji trzng x &hvnh 1D -ji trzng W0.
Tr0ng -ji trzng thiJt @U W0 +&C& ta u &wa &C& Qi tRng
GraphicsConfi$uration &x !an hE vi hE ta u W0 . X v3+ phWi *G
(bng ta u W0 ;hi gi phng tha& setLo&ation &wa Qi tRng +ra"e
ha3 Aindo1. Ch0 vv (b+[0en - nD3 *Y 1]3 zng @a0 &wa -ut Qi
tRng GraphicsConfi$uration vD *G (bng &C& zng @a0 T thiJt 1p vU
trv &wa Qi tRng +ra"e tei ta u f10+ 10g tr0ng hE ta u &wa -Dn hiTn
thU vt 1H .
Frame f = new Frame(GraphicsConfiguration
gc);
Rectangle bounds = gc.getBounds();
httpBOOtai1i'!ha3.&0-
9=
Lp trnh ha trn Java 2D v 3D
f.setLocation(10 + bounds.x, 10 +
bounds.y);
SJ! &C& zng @a0 &wa Qi tRng GraphicsConfi$uration ;hjng
R& tvnh Jn + th Qi tRng +ra"e R& hiTn thU tei vU trv f10+ 10g trIn
-D hnh vt 1H &hvnh + i"! nD3 &x thT ;hC& vi -D hnh vt 1H &wa Qi
tRng GraphicsConfi$uration R& ,C& Unh .
Phng tha& get2ounds &x thT R& *G (bng T ,C& Unh &C& zng
@iIn &W! thiJt @U W0. )i phng tha& get2ounds trIn -\i Qi tRng
GraphicsConfi$uration tr0ng hE thQng . [T ,C& (Unh &C& zng @a0 &W!
thiJt @U W0 + tvnh t0Cn *` ;Jt hRp &wa &C& zng @a0. ih th!t nD3 R& *G
(bng tr0ng vv (b *a!.
Rectangle virtualBounds = new
Rectangle();
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnviron
ment();
GraphicsDevice[] gs =
ge.getScreenDevices();
for (int j = 0; j < gs.length; j+
+) {
GraphicsDevice gd = gs[j];
GraphicsConfiguration[] gc =
gd.getConfigurations();
httpBOOtai1i'!ha3.&0-
99
Lp trnh ha trn Java 2D v 3D
for (int i = 0; i < gc.length; i+
+) {
virtualBounds =
virtualBounds.union(gc[i].getBounds());
}
}
#pp1't *a! *Y te0 -ut Qi tRng >+ra"e vi -\i Qi tRng
GraphicsConfi$uration &wa -\i Qi tRng Graphics&evice tr0ng Qi
tRng Graphics)nviron"ent. /\i Qi tRng >+ra"e hiTn thU -ut tp
&C& ve&h + ,anh - +,anh nhet+*Q 1Rng &C& -Dn hiTn thU *Q 1Rng &C&
Qi tRng GraphicsConfi$uration vD &C& zng @a0 &!W Qi tRng
GraphicsConfi$uration. [0en - *a! phWi R& &he3 vi JavaT/ 2
2Di+ v'r*i0n 1.5 h0& &a0 hn.
/*
* Transform.java
* 1.0
* 27/03/06
* Day la doan chuong trinh mieu ta cac phep bien
doi.
*/
import java.awt.*;
import javax.swing.*;
httpBOOtai1i'!ha3.&0-
:0
Lp trnh ha trn Java 2D v 3D
/*
* Chuong trinh nay tao bong mot hinh duoc chon
boi nguoi su dung.Voi cac phuong
* thuc paint,stroke, va rendering cung duoc lua
chon boi nguoi su dung.
*/
/**
* @author Administrator
*
*/
public class Transform extends JApplet implements
itemListener, ActionListener {
/**
*
*/
private static final long serialVersionUiD =
-2514519718222913151L;
JLabel primLabel, lineLabel, paintLabel,
transLabel, strokeLabel;
TransPanel display;
static JComboBox primitive, line, paint,
trans, stroke;
JButton redraw;
public static boolean no2D = false;
httpBOOtai1i'!ha3.&0-
:1
Lp trnh ha trn Java 2D v 3D
public void init() {
GridBagLayout layOut = new
GridBagLayout();
getContentPane().setLayout(layOut);
GridBagConstraints c = new
GridBagConstraints();
c.weightx = 1.0;
c.fill = GridBagConstraints.BOTH;
primLabel = new JLabel();
primLabel.setText("Hnh g c"); 3
Font newFont = getFont().deriveFont(1);
primLabel.setFont(newFont);
primLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(primLabel, c);
getContentPane().add(primLabel);
lineLabel = new JLabel();
lineLabel.setText("Cc ng"); 456
lineLabel.setFont(newFont);
lineLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(lineLabel, c);
getContentPane().add(lineLabel);
paintLabel = new JLabel();
paintLabel.setText("Ki u v "); 7 8
httpBOOtai1i'!ha3.&0-
:2
Lp trnh ha trn Java 2D v 3D
paintLabel.setFont(newFont);
paintLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(paintLabel, c);
getContentPane().add(paintLabel);
c.gridwidth =
GridBagConstraints.RELATiVE;
transLabel = new JLabel();
transLabel.setText("Cc php bi n i"); 9 4:
transLabel.setFont(newFont);
transLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(transLabel, c);
getContentPane().add(transLabel);
c.gridwidth =
GridBagConstraints.REMAiNDER;
strokeLabel = new JLabel();
strokeLabel.setText("T trt");
strokeLabel.setFont(newFont);
strokeLabel.setHorizontalAlignment(JLabel.CENTER)
;
layOut.setConstraints(strokeLabel, c);
getContentPane().add(strokeLabel);
httpBOOtai1i'!ha3.&0-
:5
Lp trnh ha trn Java 2D v 3D
GridBagConstraints ls = new
GridBagConstraints();
ls.weightx = 1.0;
ls.fill = GridBagConstraints.BOTH;
primitive = new JComboBox(new Object[]
{ "Hnh ch nh t", "Hnh elip", ; <
"V n b n" }); = >
primitive.additemListener(this);
newFont = newFont.deriveFont(0, 14.0f);
primitive.setFont(newFont);
layOut.setConstraints(primitive, ls);
getContentPane().add(primitive);
line = new JComboBox(new Object[]
{ "M nh", " m", "Nt t" }); > ?< 4@
line.additemListener(this);
line.setFont(newFont);
layOut.setConstraints(line, ls);
getContentPane().add(line);
paint = new JComboBox(new Object[]
{ " ng nh t", "T loang", "polka" }); ?A B
paint.additemListener(this);
paint.setFont(newFont);
layOut.setConstraints(paint, ls);
getContentPane().add(paint);
ls.gridwidth =
GridBagConstraints.RELATiVE;
httpBOOtai1i'!ha3.&0-
:7
Lp trnh ha trn Java 2D v 3D
trans = new JComboBox(new Object[]
{ "identity", "Quay", "T l ", C D
"shear" });
trans.additemListener(this);
trans.setFont(newFont);
layOut.setConstraints(trans, ls);
getContentPane().add(trans);
ls.gridwidth =
GridBagConstraints.REMAiNDER;
stroke = new JComboBox(new Object[]
{ " ng nt", "T y", ?56 4E
" ng nt va T y" }); ?56 4E
stroke.additemListener(this);
stroke.setFont(newFont);
layOut.setConstraints(stroke, ls);
getContentPane().add(stroke);
GridBagConstraints button = new
GridBagConstraints();
button.gridwidth =
GridBagConstraints.REMAiNDER;
redraw = new JButton("V l i"); 8 F
redraw.addActionListener(this);
redraw.setFont(newFont);
layOut.setConstraints(redraw, button);
getContentPane().add(redraw);
GridBagConstraints tP = new
GridBagConstraints();
httpBOOtai1i'!ha3.&0-
:9
Lp trnh ha trn Java 2D v 3D
tP.fill = GridBagConstraints.BOTH;
tP.weightx = 1.0;
tP.weighty = 1.0;
tP.gridwidth =
GridBagConstraints.REMAiNDER;
display = new TransPanel();
layOut.setConstraints(display, tP);
display.setBackground(Color.white);
getContentPane().add(display);
validate();
}
public void itemStateChanged(itemEvent e) {
}
public void actionPerformed(ActionEvent e) {
display.setTrans(trans.getSelectedindex());
display.renderShape();
}
@SuppressWarnings("deprecation")
public static void main(String[] argv) {
if (argv.length > 0 && argv[0].equals("-
no2d")) {
Transform.no2D = true;
}
httpBOOtai1i'!ha3.&0-
::
Lp trnh ha trn Java 2D v 3D
JFrame frame = new JFrame("Cc php
chuy n i"); 7 4:
frame.addWindowListener(new
WindowAdapter() {
public void
windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet applet = new Transform();
frame.getContentPane().add(BorderLayout.CENTER,
applet);
applet.init();
frame.setSize(550, 400);
frame.show();
}
}
@SuppressWarnings("serial")
class TransPanel extends JPanel {
AffineTransform at = new AffineTransform();
int w, h;
httpBOOtai1i'!ha3.&0-
:<
Lp trnh ha trn Java 2D v 3D
Shape shapes[] = new Shape[3];
Bufferedimage bi;
boolean firstTime = true;
public TransPanel() {
setBackground(Color.white);
shapes[0] = new Rectangle(0, 0, 100,
100);
shapes[1] = new Ellipse2D.Double(0.0,
0.0, 100.0, 100.0);
TextLayout textTl = new
TextLayout("Brother Hood", new Font("Tomaha",
1, 76), new
FontRenderContext(null, false, false));
AffineTransform textAt = new
AffineTransform();
textAt.translate(0, (float)
textTl.getBounds().getHeight());
shapes[2] = textTl.getOutline(textAt);
}
public void setTrans(int transindex) {
switch (transindex) {
case 0:
at.setToidentity();
at.translate(w / 2, h / 2);
break;
httpBOOtai1i'!ha3.&0-
:=
Lp trnh ha trn Java 2D v 3D
case 1:
at.rotate(Math.toRadians(45));
break;
case 2:
at.scale(0.5, 0.5);
break;
case 3:
at.shear(0.5, 0.0);
break;
}
}
public void renderShape() {
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!Transform.no2D) {
Graphics2D g2 = (Graphics2D) g;
Dimension d = getSize();
w = d.width;
h = d.height;
String instruct = "Nh p m t hnh c < G H
s ban u, ki u ng,ki u v , php bi n i,"; I 4E 7 456 7 8 9 4:
TextLayout thisTl = new
TextLayout(instruct, new Font("Helvetica",
httpBOOtai1i'!ha3.&0-
:9
Lp trnh ha trn Java 2D v 3D
0, 10),
g2.getFontRenderContext());
float width = (float)
thisTl.getBounds().getWidth();
float height = (float)
thisTl.getBounds().getHeight();
thisTl.draw(g2, w / 2 - width / 2,
15);
instruct = "v cc ph ng th c t o 5H @ F
bng sau nh n nt VE LAi."; 4 B
thisTl = new TextLayout(instruct,
new Font("Helvetica", 0, 10), g2
.getFontRenderContext());
width = (float)
thisTl.getBounds().getWidth();
thisTl.draw(g2, w / 2 - width / 2,
height + 17);
// initialize the transform.
if (firstTime) {
at.setToidentity();
at.translate(w / 2, h / 2);
firstTime = false;
}
// Sets the Stroke.
Stroke oldStroke = g2.getStroke();
httpBOOtai1i'!ha3.&0-
<0
Lp trnh ha trn Java 2D v 3D
switch
(Transform.line.getSelectedindex()) {
case 0:
g2.setStroke(new
BasicStroke(3.0f));
break;
case 1:
g2.setStroke(new
BasicStroke(8.0f));
break;
case 2:
float dash[] = { 10.0f };
g2.setStroke(new
BasicStroke(3.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOiN_MiTER,
10.0f, dash, 0.0f));
break;
}
// Sets the Paint.
Paint oldPaint = g2.getPaint();
switch
(Transform.paint.getSelectedindex()) {
case 0:
g2.setPaint(Color.blue);
break;
case 1:
g2.setPaint(new GradientPaint(0,
0, Color.lightGray, w - 250,
httpBOOtai1i'!ha3.&0-
<1
Lp trnh ha trn Java 2D v 3D
h, Color.blue, false));
break;
case 2:
Bufferedimage buffi = new
Bufferedimage(15, 15,
Bufferedimage.TYPE_iNT_RGB);
Graphics2D buffig =
buffi.createGraphics();
buffig.setColor(Color.blue);
buffig.fillRect(0, 0, 15, 15);
buffig.setColor(Color.lightGray);
buffig.translate((15 / 2) - (5 /
2), (15 / 2) - (5 / 2));
buffig.fillOval(0, 0, 7, 7);
Rectangle r = new Rectangle(0,
0, 25, 25);
g2.setPaint(new
TexturePaint(buffi, r));
break;
}
// Sets the Shape.
Shape shape =
shapes[Transform.primitive.getSelectedindex()];
Rectangle r = shape.getBounds();
// Sets the selected Shape to the
center of the Canvas.
httpBOOtai1i'!ha3.&0-
<2
Lp trnh ha trn Java 2D v 3D
AffineTransform saveXform =
g2.getTransform();
AffineTransform toCenterAt = new
AffineTransform();
toCenterAt.concatenate(at);
toCenterAt.translate(-(r.width / 2),
-(r.height / 2));
g2.transform(toCenterAt);
// Sets the rendering method.
switch
(Transform.stroke.getSelectedindex()) {
case 0:
g2.draw(shape);
break;
case 1:
g2.fill(shape);
break;
case 2:
Graphics2D tempg2 = g2;
g2.fill(shape);
g2.setColor(Color.darkGray);
g2.draw(shape);
g2.setPaint(tempg2.getPaint());
break;
}
g2.setStroke(oldStroke);
g2.setPaint(oldPaint);
httpBOOtai1i'!ha3.&0-
<5
Lp trnh ha trn Java 2D v 3D
g2.setTransform(saveXform);
}
}
}
iJt !W *a! ;hi &he3 &hng trnh B
httpBOOtai1i'!ha3.&0-
<7
Lp trnh ha trn Java 2D v 3D
Chng "
C# $%i t&ng h'nh h(a
Java 2DA #P$ &!ng &]p -ut *Q 1p T Unh nghha &C& Qi tRng
g'0-'tri& fhnh h&g+&hng hen nh iT-+zng thng+zng
&0ng+hnh &hZ nht.ShZng 1p hnh h& -i x 1D -ut phn &wa gxi
0ava.a1t.$eo".[T &x thT tng thv&h vi &C& phiIn @Wn &+&C& 1p
$eo"etr' &x &haa tr0ng &C& phiIn @Wn tr& x &wa @u JDi *06t?ar'+nh
rectan$e+point vD po'$on+R& &haa tr0ng gxi 0ava.a1t.
CC& Qi tRng hnh h& tr0ng Java 2D #P$ nh GenneraPath+!rc%&
vD #ectan$e%& &h0 phcp th`& thi viE& te0 gia0 (iEn @E -t R& Unh nghha tr0ng
gxi 0ava.a1t.Knh (Cng &b thT &!ng &]p &h0 ta -ut phng tha& &h!ng &h0 viE&
-iI! tW vD ;iT- tra zng (n &wa &C& Qi tRng hnh h&./ut gia0 (iEn -i
Pathterator+&!ng &]p &C& phng tha& Unh nghha viE& ;hji phb& &C& phn tG tt
-ut Qi tRng hnh h&. 2G (bng &C& 1p hnh h& @en &x thT (k (Dng ,C& Unh vD
tha0 tC& vi nhi"! Qi tRng hai &hi"!.
<.1 Gia% di4n v3 &p.
>Wng (i s3 1iEt ;I nhZng gia0 (iEn vD &C& 1p &hvnh &wa &C& Qi
tRng hnh h&.K! hJt tr0ng *j &C& gia0 (iEn vD &C& 1p 1D thDnh phn
&wa gxi 0ava.a1t.$eo"./ut *Q+&hng hen nh Shape+1D thDnh phn &wa
gxi 0ava.a1t+thDnh phn &hvnh T &x thT tng thv&h vi &C& phiIn @Wn
tr& s3 &wa @u JDi.
CC& 1p vD gia0 (iEn &wa 0ava.a1t.$eo"
httpBOOtai1i'!ha3.&0-
<9
Lp trnh ha trn Java 2D v 3D
)ia0 (iEn /j tW
Path$t'rat0r [Unh nghha &C& phng tha& &h0 viE& phb& h$ &C&
phn tG tt -ut zng (n.
2hap'
fNava.a?tg
C!ng &]p -ut tp &C& phng tha& &h0 viE& -iI! tW
vD ;iT- tra zng (n hnh h&.[R& th`& thi @y$
)an'ra1Path vD &C& 1p hnh h& ;hC&.
CC& 1p
#r&2D #r&2D.D0!@1'
#r&2D.810at
/y rungB.'&tang!1ar2hap'
/iI! tW -ut zng &0ng R& Unh nghha @ng
-ut hnh &hZ nht &x gi$ hen+gx& @an !+vD
-ut ;iT! xng ;vn.XiE& th`& thi &h r nhZng
zng &0ng tr0ng ;iT! *Q 610at vD (0!@1'.
Chvnh ,C&B#r&2D.810at vD #r&2D.D0!@1'.#r'a
#r'a Lp th`& thiB2hap'+C10n'a@1'.
/iI! tW -ut (iEn tv&h hnh h& -D h\ trR &C&
phcp t0Cn nhU phsn.
C!@i&C!rv'2D
C!@i&C!rv'2D.D0!@1
'
C!@i&C!rv'2D.810at
$-p1'-'nt*B 2hap'
Lp th`& thiB2hap'.
/iI! tW &C& 0en zng &0ng tha- *Q @& @a
tr0ng ;hjng gian ta u.XiE& th`& thi T &h r
&C& zng &0ng @& @a v$ u &hvnh ,C& 610at vD
(0!@1' (0 hai 1pB C!@i&C!rv'2D.810at an(
C!@i&C!rv'2D.D0!@1'.
Di-'n*i0n2D [xng gxi &W &hi"! rung vD &hi"! &a0./ut *iI!
1p tr! tRng &h0 t]t &W &C& Q$ tRng 1! trZ
(_ng T 1! trZ &C& Q$ tRng hai &hi"!.
httpBOOtai1i'!ha3.&0-
<:
Lp trnh ha trn Java 2D v 3D
%11ip*'2D
%11ip*'2D.D0!@1'
%11ip*'2D.810at
/y rungB .'&tang!1ar2hap'
/iI! tW viE& Unh nghha zng 'P1ip @ng &C&
hnh &hZ nht gi$ hen.Cjng &b T &h r &C&
zng &0ng '1ip v$ u &hvnh ,C& 610at vD
(0!@1'B %11ip*'2D.810at vD %11ip*'2D.D0!@1'
81att'ningPath$t'rat0r TrW v" -ut 61att'n'( vi'? &wa -ut Qi tRng
PathLt'rat0r.
Cx thT *G (bng T &!ng &]p &C& 61att'ning
@'havi0r &h0 &C& Qi tRng 2hap' -D nx ;hjng
th`& hiEn viE& tvnh t0Cn &C& thDnh phn thI- vD0.
)'n'ra1Path Th`& thi Qi tRng 2hap'
/iI! tW -ut ;h!ng hinhg R& ,s3 (`ng tt &C&
zng thng vD &C& zng @& hai vD @& @a
Lin'2D
Lin'2D.D0!@1'
Lin'2D.810at
Th`& thi Qi tRng 2hap'.
/iI! tW -ut 0en thng tr0ng ;hjng gian ta u
f,+3g .[R& th& thi T ,C& Unh &C& zng thng
vi u &hvnh ,C& 610at vD (0!@1'BB Lin'2D.810at
vD Lin'2D.D0!@1'.
P0int2D
P0int2D.D0!@1'
P0int2D.810at
/ut iT- -iI! tW -ut vU trv tr0ng ;hjng gian ta
u f,+3g.[R& th`& thi T ,C& inh &C& iT- vi
u &hvnh ,C& 610at vD (0!@1'B P0int2D.810at vD
P0int2D.D0!@1'.
F!a(C!rv'2D
F!a(C!rv'2D.D0!@1
'
F!a(C!rv'2D.810at
Th`& thi Qi tRng 2hap'.
/iI! tW -ut 0en zng &0ng tha- *Q @& hai
tr0ng ;hjng gian ta u f,+3g.[R& th`& thi T
,C& Unh &C& zng @& hai vi u &hvnh ,C&
610at vD (0!@1'B F!a(C!rv'2D.810at vD
F!a(C!rv'2D.D0!@1'.
.'&tang1'2D /y rungB .'&tang!1ar2hap'
httpBOOtai1i'!ha3.&0-
<<
Lp trnh ha trn Java 2D v 3D
.'&tang1'2D.D0!@1'
.'&tang1'2D.810at
/iI! tW -ut hnh &hZ nht R& Unh nghha @yi
-ut vU trv f,+3g vD ;v&h th&f?+,+hg. [R& th`&
thi T ,C& inh &C& hnh &h nht vi u &hvnh
,C& 610at vD (0!@1'B .'&tang1'2D.810at vD
.'&tang1'2D.D0!@1'.
.'&tang!1ar2hap' Th`& thi Qi tRng 2hap'.
C!ng &]p *` tha0 tC& &h!ng &h0 &C& tC& ung 1In
&C& Qi tRng 2hap' -D nx &x &C& hnh &hZ nht
@iIn.
.0!n(.'&tang1'2D
.0!n(.'&tang1'2D.D
0!@1'
.0!n(.'&tang1'2D.81
0at
/y rungB .'&tang!1ar2hap'
/iI! tW -ut hnh &hZ nht &C& gx& R& 1D- trdn
R& Unh nghha @ng -ut vU trv f,+ 3g+-ut ;v&h
th& f? , hg+vD &hi"! rung vD &hi"! &a0 &wa
gx& &!ng. [R& th`& thi T ,C& inh &C& hnh &hZ
nht &x gx& trdn vi u &hvnh ,C& 610at vD (0!@1'B
.0!n(.'&tang1'2D.810at vD
.0!n(.'&tang1'2D.D0!@1'.
<.2 *2c (h2i ni4! hnh hcA
Shape 1D -ut thT hiEn &wa nhi"! 1p -D nx th`& thi Shape
int'r6a&'+nh

GeneraPath 0r #ectan$e%& .810at .
[zng vi"n f0!t1in'g &dn R&
Unh nghha 1D path.
ihi -ut Shape R& vY+;iT! zng nct vY R& Ung nghha @yi Qi
tRng Stroke tr0ng th viEn ha 2D+R& Cp (bng &h0 ShapeB*
path.ihi -ut Shape R& phw 3+Paint tr0ng th viEn ha 2D R&
Cp (bng &h0 phn (iEn tv&h @In tr0ng zng vi"n &wa nx.[T @iJt thI-
thjng tin+@en ,'- thI- phn .'n('ring ?ith )raphi&*2D.
httpBOOtai1i'!ha3.&0-
<=
Lp trnh ha trn Java 2D v 3D
[zng vi"n &wa -ut hnh &ng &x thT R& *G (bng T Unh nghha
-ut &lipping path./ut &lipping path ,C& Unh nhZng iT- Wnh nD0 R&
a rafr'n('rg. &lipping path 1D -ut phn &wa )raphi&* 2D. [T @iJt thI-
thjng tin+@en ,'- thI- phn 2'tting th' C1ipping Path.
/ut GeneraPath 1D -ut shape -D nx &x thT R& *G (bng
T -iI! tW -ut *Q Qi tRng 2 &hi"! &x thT R& vY tt &C& zng
vD &C& zng @& hai h0& @& @a.[T th!n 1Ri+ 0ava.a1t.$eo"
&!ng &]p thI- &C& thDnh phn th`& thi &wa gia0 tiJp 2hap' -D
nx -iI! tW &C& Qi tRng ha ph @iJn nh hnh &hZ
nht+hnh '1ip+&!ng trdn vD &C& zng &0ng. Th' Java2DA #P$ &dn
&!ng &]p -ut ;iT! *hap' & @iEt h\ trR &h0 viE& ,s3 (`ng (iEn tv&h hnh
h&.
*.%.( Constructive !rea Geo"etr'
C0n*tr!&tiv' #r'a )'0-'tr3 fC#)g 1D -ut !C trnh te0 ra &C& Qi
tRng hnh h& -i @ng viE& th`& hiEn &C& phcp t0Cn nhU phsn tr0ng &C&
Qi tRng tn tei.Tr0ng Java 2D #P$ -ut ;iT! & @iEt &wa Shape
R& gi 1D !rea h\ trR &C& phcp t0Cn nhU phsn.>en &x thT te0 ra -ut Qi
tRng !rea tt -ut *Q Shape.
CC& !rea h\ trR &C& phcp t0Cn nhU phsn *a!B
4ni0nfhRpg
int'r*'&ti0nfgia0g
2!@tra&ti0nftrtg
%,&1!*iv' M. frM.g fM. (Dnh riIngg
CC& phcp t0Cn x R& -iI! tW nh hnh 5P1 (i s3B
httpBOOtai1i'!ha3.&0-
<9
Lp trnh ha trn Java 2D v 3D
*.%.% Bounds and 7it Testin$
/ut 3ounding 3ox 1D -ut hnh &hZ nht @a0 @& h0Dn t0Dn -ut -ut
thT thiEn hnh h&. 3ounding 3ox R& *G (bng T !Jt Unh -ut Qi
tRng &x R& &hn ha3 ;hjng h0& R& hit @yi ngzi *G (bng.
)ia0 (iEn Shape ,C& Unh hai phng tha& &h0 viE& tr!3 1ei -ut
*hap'* @0!n(ing @0,+x 1D get2ounds vD get2ounds2D.Phng tha&
get2ounds2D trW v" -ut Qi tRng #ectan$e%& + -ut thT hiEn &wa
#ectan$e .C!ng &]p -ut u &hvnh ,C& &a0 hn tr0ng viE& -iI! tW
*hap'* @0!n(ing @0,.
Shape &ng &!ng &]p nhi"! phng tha& &h0 viE& ,C& Unh B
/ut iT- &b thT @In tr0ng @a0 xng &wa hnh
thTf&0ntain* g
/ut hnh &hZ nht &b thT n- h0Dn t0Dn @In tr0ng -ut
@a0 xng &wa hnh thT. f&0ntain* g
/ut hnh &hZ nht &b thT phsn &^t hnh thT fint'r*'&t* g
/*
* Composite.java
* 1.0
* 20/03/06
*/
import java.awt.*;
httpBOOtai1i'!ha3.&0-
=0
Lp trnh ha trn Java 2D v 3D
import javax.swing.*;
/*
* Chuong trinh nay la mot vi du ve cac luat ket
hop giua cac hinh.
*/
@SuppressWarnings("serial")
public class Composite extends JApplet implements
itemListener {
CompPanel comp;
JLabel alphaLabel, rulesLabel;
JComboBox alphas, rules;
String alpha = "1.0";
int rule = 0;
public void init() {
GridBagLayout layOut = new
GridBagLayout();
getContentPane().setLayout(layOut);
GridBagConstraints l = new
GridBagConstraints();
l.weightx = 1.0;
httpBOOtai1i'!ha3.&0-
=1
Lp trnh ha trn Java 2D v 3D
l.fill = GridBagConstraints.BOTH;
l.gridwidth =
GridBagConstraints.RELATiVE;
alphaLabel = new JLabel();
alphaLabel.setText("C ng m u"); 56 4G E
Font newFont = getFont().deriveFont(1);
alphaLabel.setFont(newFont);
alphaLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(alphaLabel, l);
getContentPane().add(alphaLabel);
getContentPane().setLayout(layOut);
l.gridwidth =
GridBagConstraints.REMAiNDER;
rulesLabel = new JLabel();
rulesLabel.setText("Cc lu t k t h p."); < 9 J
newFont = getFont().deriveFont(1);
rulesLabel.setFont(newFont);
rulesLabel.setHorizontalAlignment(JLabel.CENTER);
layOut.setConstraints(rulesLabel, l);
getContentPane().add(rulesLabel);
GridBagConstraints a = new
GridBagConstraints();
a.gridwidth =
GridBagConstraints.RELATiVE;
a.weightx = 1.0;
httpBOOtai1i'!ha3.&0-
=2
Lp trnh ha trn Java 2D v 3D
a.fill = GridBagConstraints.BOTH;
alphas = new JComboBox();
layOut.setConstraints(alphas, a);
alphas.additem("1.0");
alphas.additem("0.75");
alphas.additem("0.50");
alphas.additem("0.25");
alphas.additem("0.0");
alphas.additemListener(this);
getContentPane().add(alphas);
a.gridwidth =
GridBagConstraints.REMAiNDER;
rules = new JComboBox();
layOut.setConstraints(rules, a);
rules.additem("SRC");
rules.additem("DST_iN");
rules.additem("DST_OUT");
rules.additem("DST_OVER");
rules.additem("SRC_iN");
rules.additem("SRC_OVER");
rules.additem("SRC_OUT");
rules.additem("CLEAR");
rules.additemListener(this);
getContentPane().add(rules);
GridBagConstraints fC = new
GridBagConstraints();
fC.fill = GridBagConstraints.BOTH;
fC.weightx = 1.0;
httpBOOtai1i'!ha3.&0-
=5
Lp trnh ha trn Java 2D v 3D
fC.weighty = 1.0;
fC.gridwidth =
GridBagConstraints.REMAiNDER;
comp = new CompPanel();
layOut.setConstraints(comp, fC);
getContentPane().add(comp);
validate();
}
public void itemStateChanged(itemEvent e) {
if (e.getStateChange() !=
itemEvent.SELECTED) {
return;
}
Object choice = e.getSource();
if (choice == alphas) {
alpha = (String)
alphas.getSelecteditem();
} else {
rule = rules.getSelectedindex();
}
comp.changeRule(alpha, rule);
}
public static void main(String s[]) {
JFrame f = new JFrame("K t h p"); 9 J
f.addWindowListener(new WindowAdapter() {
httpBOOtai1i'!ha3.&0-
=7
Lp trnh ha trn Java 2D v 3D
public void
windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet applet = new Composite();
f.getContentPane().add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(300, 300));
f.show();
}
}
class CompPanel extends JPanel {
AlphaComposite ac =
AlphaComposite.getinstance(AlphaComposite.SRC);
float alpha = 1.0f;
public CompPanel() {
}
public void changeRule(String a, int rule) {
alpha = Float.valueOf(a).floatValue();
ac =
AlphaComposite.getinstance(getRule(rule), alpha);
repaint();
}
httpBOOtai1i'!ha3.&0-
=9
Lp trnh ha trn Java 2D v 3D
public int getRule(int rule) {
int alphaComp = 0;
switch (rule) {
case 0:
alphaComp = AlphaComposite.SRC;
break;
case 1:
alphaComp = AlphaComposite.DST_iN;
break;
case 2:
alphaComp = AlphaComposite.DST_OUT;
break;
case 3:
alphaComp = AlphaComposite.DST_OVER;
break;
case 4:
alphaComp = AlphaComposite.SRC_iN;
break;
case 5:
alphaComp = AlphaComposite.SRC_OVER;
break;
case 6:
alphaComp = AlphaComposite.SRC_OUT;
break;
case 7:
alphaComp = AlphaComposite.CLEAR;
break;
}
return alphaComp;
httpBOOtai1i'!ha3.&0-
=:
Lp trnh ha trn Java 2D v 3D
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Dimension d = getSize();
int w = d.width;
int h = d.height;
Bufferedimage buffimg = new
Bufferedimage(w, h,
Bufferedimage.TYPE_iNT_ARGB);
Graphics2D gbi =
buffimg.createGraphics();
g2.setColor(Color.white);
g2.fillRect(0, 0, d.width, d.height);
int rectx = w / 4;
int recty = h / 4;
gbi.setColor(new Color(0.0f, 0.0f, 1.0f,
1.0f));
gbi.fill(new Rectangle2D.Double(rectx,
recty, 150, 100));
gbi.setColor(new Color(1.0f, 0.0f, 0.0f,
1.0f));
gbi.setComposite(ac);
gbi.fill(new Ellipse2D.Double(rectx +
rectx / 2, recty + recty / 2,
httpBOOtai1i'!ha3.&0-
=<
Lp trnh ha trn Java 2D v 3D
150, 100));
g2.drawimage(buffimg, null, 0, 0);
}
}
8Jt !W &wa &hng trnh B
<.< *%!+inin" 0reas t% *reate Be) @hapes
CC& !rea &x thT R& *G (bng T te0 ra -ut &C&h nhanh &hxng
&C& Shape pha& tep nh &C& hnh trdn vD &C& hnh v!jng.Te0 -ut
hnh thT pha& tep -i @ng &C&h ;Jt hRp &C& !rea nh *a!B
1.2G (bng &C& Shape+te0 ra &C& !rea T ;Jt hRp 1ei.
2.)i &C& t0Cn tG nhU phsn thv&h hRpB add+su3tra&t +interse&t +
ex&lusive'r
Xv (b+C#) &x thT R& *G (bng T te0 ra !W 1I giQng nh hnh 5P2 (i
s3B
httpBOOtai1i'!ha3.&0-
==
Lp trnh ha trn Java 2D v 3D
CC&h th`& hiEnB
Thsn &wa !W 1I R& te0 ra @ng &C&h ;Jt hRp &C& tha0 tC& tr0ng 2
0v'rP 1apping #r'a* B &ir&le vD oval.CCi 1C R& te0 ra @ng &C&h th`&
hiEn -ut phcp gia0 trIn hai vdng trdn &hng 1In nha! vD *a! x R& a
vD0 -ut Shape n thjng !a phcp hRp.XiE& nep &hng &C& vdng trdn
&dn R& *G (bng T te0 &!Qng 1C thjng !a hai phcp trt.
Chng trnhB
/*
* @(#)Pear.java 1.0 27/03/06
*/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import javax.swing.JApplet;
import javax.swing.JFrame;
httpBOOtai1i'!ha3.&0-
=9
Lp trnh ha trn Java 2D v 3D
/*
* Chuong trinh nay ve mot qua le,su dung phuong
thuc ket hop giua cac vung.
*/
@SuppressWarnings("serial")
public class Pear extends JApplet {
Ellipse2D.Double circle, oval, leaf, stem;
Area circ, ov, leaf1, leaf2, st1, st2;
public void init() {
circle = new Ellipse2D.Double();
oval = new Ellipse2D.Double();
leaf = new Ellipse2D.Double();
stem = new Ellipse2D.Double();
circ = new Area(circle);
ov = new Area(oval);
leaf1 = new Area(leaf);
leaf2 = new Area(leaf);
st1 = new Area(stem);
st2 = new Area(stem);
setBackground(Color.white);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Dimension d = getSize();
httpBOOtai1i'!ha3.&0-
90
Lp trnh ha trn Java 2D v 3D
int w = d.width;
int h = d.height;
double ew = w / 2;
double eh = h / 2;
g2.setColor(Color.green);
leaf.setFrame(ew - 16, eh - 29, 15.0,
15.0);
leaf1 = new Area(leaf);
leaf.setFrame(ew - 14, eh - 47, 30.0,
30.0);
leaf2 = new Area(leaf);
leaf1.intersect(leaf2);
g2.fill(leaf1);
leaf.setFrame(ew + 1, eh - 29, 15.0,
15.0);
leaf1 = new Area(leaf);
leaf2.intersect(leaf1);
g2.fill(leaf2);
g2.setColor(Color.black);
stem.setFrame(ew, eh - 42, 40.0, 40.0);
st1 = new Area(stem);
stem.setFrame(ew + 3, eh - 47, 50.0,
50.0);
st2 = new Area(stem);
st1.subtract(st2);
g2.fill(st1);
g2.setColor(Color.yellow);
circle.setFrame(ew - 25, eh, 50.0, 50.0);
oval.setFrame(ew - 19, eh - 20, 40.0,
70.0);
httpBOOtai1i'!ha3.&0-
91
Lp trnh ha trn Java 2D v 3D
circ = new Area(circle);
ov = new Area(oval);
circ.add(ov);
g2.fill(circ);
}
public static void main(String s[]) {
JFrame f = new JFrame("Qu l"); >
f.addWindowListener(new WindowAdapter() {
public void
windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet applet = new Pear();
f.getContentPane().add("Center", applet);
applet.init();
f.pack();
f.setSize(new Dimension(600, 400));
f.show();
}
}
iJt !W &wa &hng trnhB
httpBOOtai1i'!ha3.&0-
92
Lp trnh ha trn Java 2D v 3D
httpBOOtai1i'!ha3.&0-
95
Lp trnh ha trn Java 2D v 3D
Chng ):
*i+n th, -.nt v/ v0n 12n
>en &x thT *G (bng &C& phcp @iJn i vD &C& &jng &b (ra?ing &wa
Java 2DA #P$ vi vVn @Wn.Kn nZa+ Java 2DA #P$ &dn &!ng &]p &C&
1p 1iIn !an ti vVn @Wn h\ trR &C& i"! ;hiTn 60nt vD &C& &C&h @Q trv vVn
@Wn pha& tep.Sx &dn @a0 g- &W 1p +ont vD 1p TextLa'out.
Chng nD3 tp &h!ng vD0 ;hW nVng h\ trR &C& ;iT! 60nt vD &C& &C&h
@Q trv vVn @Wnft',t 1a30!tg @ng viE& *G (bng &C& gia0 (iEn vD &C& 1p
tr0ng 0ava.a1t vD 0ava.a1t.font.
[T &x thI- thjng tin v" phsn tv&h vVn @Wn+@en tha- ;hW0 thI- vVn
@Wn hng (n v" Nava.t',t vD th'0 (i phn Lriting )10@a1 Pr0gra-*
tr0ng @u Java T!t0ria1.
[T &x thI- thjng tin v" &C&h *G (bng &jng &b @Q trv vVn @Wn @ng &C&h
*G (bng 2?ing+@en ,'- thI- phn 0ava.a1t.s1in$.text vD 4*ing th'
J8CO2?ing Pa&;ag'* tr0ng Java T!t0ria1.
..1.Gia% di4n v3 &p.
>Wng (i s3 1iEt ;I &C& gia0 (iEn vD &C& 1p &hvnh *G (bng &h0 font
vD texta'out.K! hJt tr0ng *Q gia0 (iEn vD 1p nD3 1D thDnh phn &wa $i
ava.a1t.font./ut *Q+nh 80nt+1D -ut phn &wa gxi 0ava.a1t R& *G
(bng T W- @W0 tvnh tng thv&h vi &C& phiIn @Wn tr& x &wa @u JDi.
>Wng -j tW gia0 (iEn vD 1p B
)ia0 (iEn /iI! tW
/!1tip1'/a*t'
r
/iI! tW &C& 60nt ;iT! 1 vi nhi"! zng.[R& th`& thi
@yi &C& Qi tRng 80nt -D &hng 1D &C& ;iT! 60nt nhi"!
zng T &x thT tr!3 &p Jn &C& thiJt ;J i"! ;hiTn.
Mp'nT3p' /iI! tW &C& 60nt ;iT! -yfMp'n T3p'gvD ;iT! th`&fTr!'
httpBOOtai1i'!ha3.&0-
97
Lp trnh ha trn Java 2D v 3D
T3p'g.[R& th`& thi @yi &C& Qi tRng 80nt -D &hng 1D
&C& 60nt Mp'n T3p' h0& Tr!' T3p' &x thT tr!3 &p Jn
&C& @Wng 60nt* *6nt.
Lp /j tW
80nt
fNava.a?tg
/iI! tW -ut thT hiEn &wa @" -t 60ntf60nt 6a&'g
tt tp hRp &C& 60nt 6a&' &x *n tr0ng -C3.K\
trR viE& & tW &hi tiJt v" thjng tin 60nt vD &!ng
&]p ;hW nVng tr!3 &p ti &C& thjng tin v" &C&
;iT! 60nt vD &C& zng nct &wa nx.
80nt.'n('rC0nt',t [xng gxi thjng tin &n thiJt &h0 &C& phcp 0 vVn
@Wn -ut &C&h &hvnh ,C&.
)13phJ!*ti6i&ati0n$n60 /iI! tW &C& thjng tin v" & tvnh &Vn 1" &wa -ut
zng nct+nh trng 1Rng f&hZg+u ! tiIn+*`
th! ht vD gii hen.
)13ph/'tri&* C!ng &]p &C& phcp 0 &h0 -ut zng nct n.
)13phX'&t0r /ut tp hRp &C& zng nct vD &C& vU trv.
)raphi&#ttri@!t' LD 1p & *y &h0 th!u& tvnh T',tLa30!t -D nx
& tW -ut Qi tRng )raphi&* T R& nh!ng(
vD0 vVn @Wn.[R& th`& thi @yi
2hap)aphi&#ttri@!t' vD
$-ag')raphi&#ttri@!t'+-D nx &x thT &h0 phcp
&C& Qi tRng 2hap' vD Qi tRng $-ag' nhng
vD0 -ut Qi tRng T',tLa30!t.Cx thT phsn 1p
T th`& thi ;v t` t_3 &hn T tha3 thJ &C&
graphi&.
$-ag')raphi&#ttri@!t' /y rungB)raphi&#ttri@!t'
/ut Qi tRng )raphi&*#ttri@!t' R& *G (bng
T vY &C& Wnh @In tr0ng -ut T',tLa30!t.
Lin'>r'a;/'a*!r'r Chia -ut ;hQi vVn @Wn thDnh nhi"! (dng tr0ng
&C& Qi tRng T',tLa30!t -D nx ;hit @In tr0ng
-ut (0ng.
httpBOOtai1i'!ha3.&0-
99
Lp trnh ha trn Java 2D v 3D
Lin'/'tri&* C!ng &]p ;hW nVng tr!3 &p Jn &C& th& 0
60nt &n thiJt T hiTn thU &C& ;v t` trIn -ut hDng
vD hiTn thU tp &C& hDng x.CC& th& 0 @a0
g- phn nhj 1In+phn phva (i+phn -+&hi"!
&a0 vD thjng tin zng & @Wnfa*&'nt+ ('*&'nt+
1'a(ing+ h'ight+ an( @a*'1in' in60r-ati0ng.
2hap')raphi&#ttri@!t' /y rungB)raphi&#ttri@!t'
/ut Qi tRng )raphi&*#ttri@!t' R& *G
(bng T vY &C& Qi tRng 2hap' tr0ng -ut Qi
tRng T',tLa30!t
T',t#ttri@!t' [Unh nghha &C& th!u& tvnh !an trng vD &C& giC
trU R& *G (bng &h0 viE& te0 @xng vVn @Wnft',t
r'n('ringg.
T',tKit$n60 /iI! tW thjng tin hit t'*t &h0 &C& ;v t` tr0ng -ut
Qi tRng T',tLa30!t
T',tLa30!t Th`& thiBC10n'a@1'
C!ng &]p -ut *` @iT! (ikn ha &Q Unh &wa
&C& (Z 1iE! ;v t` R& Unh ;iT!+@a0 g- &W
&C& vVn @Wn hai &hi"!.
..2.*2c (h2i ni4! vC D%nt
Lp +ont R& &Wi tiJn T h\ trR viE& & tW &hi tiJt thjng tin v"
;iT! 60nt vD &x thT *G (bng &C& & tvnh pha& tep.
/ut Qi tRng +ont -iI! tW -ut thT hiEn &wa ;iT! 60nt tr0ng tp hRp
&C& 60nt &wa hE thQng.CC& 60nt thng ha3 R& *G (bng nh 60nt K'1v't
>01( vD C0!ri'r >01( ita1i&.
Cx @a ;iT! tIn &h0 -ut Qi tRng 80ntPx 1D 10gi&a1 na-'+ 6a-i13
na-'+ vD 60nt 6a&' na-'B
httpBOOtai1i'!ha3.&0-
9:
Lp trnh ha trn Java 2D v 3D
/ut 10gi&a1 na-' &wa Qi tRng +ont 1D tIn R& Cnh ,e Jn -ut
tr0ng nhi"! 60nt &b thT &x *n tr0ng p1at60r-. 10gi&a1 na-' 1D tIn 60nt
R& *G (bng T &h r -ut Qi tRng +ont tr0ng JDi 1.1 vD &C& phiIn
@Wn tr& x.ihi &h Unh -ut Qi tRng 80nt tr0ng JavaA 2 2Di @en
nIn *G (bng 60nt 6a&' na-' tha3 &h0 10gi&a1 na-'.>en &x thT nhn
10gi&a1 na-' tt Qi tRng 60nt @ng &C&h g0i N phng tha& get4a+e.[T
nhn R& (anh *C&h &C& 10gi&a1 na-'+h3 gi
0ava.a1t.Tookit.$et+ontList.
*5t fa+ily na+e &6a 7i t89ng .ont 1D tIn tr0ng h 60nt -D nx Unh
nghha &C&h thiJt ;J viE& in thjng !a -ut *Q @" -t+&hng hen nh ;iT!
&hZ K'1v'ti&a.>en 1]3 h tIn 60nt @ng &C&h *G (bng phng tha&
get.a+ily.
*5t font fa&e na+e &6a 7i t89ng .ont (_ng T C- &h ;v&h th&
tht &wa 60nt R& &Di t tr0ng hE thQng.[x 1D tIn -D @en &x thT *G (bng
;hi &h r -ut ;iT! 60nt tr0ng Java 2 2Di.Sx &ng thzng R& C- &h
&h0 60nt na-'.>en &x thT 1]3 tIn 60nt @ng &C&h gi phng tha&
ge.ont4a+e.[T ,C& Unh ;iT! 60nt nD0 R& *G (bng tr0ng hE thQng+@en
&x thT gi phng tha& Graphics)nviron"ent.get$ll.onts.
>en &x thT tr!3 ,!]t &C& thjng tin v" -ut Qi tRng 80nt @ng viE&
gi phng tha& get$ttri3utes. CC& th!u& tvnh &wa 80nt @a0 g- tIn+;v&h
& 60nt+tran*60r-+& tvnh 60nt nh hnh (Cng 60nt.
/ut Qi tRng Line/etrics xng gxi &C& thjng tin v" &C& *Q 0 &wa
80nt+nh a*&'nt+('*&'nt vD ;h0Wng &C&h giZa &C& (dng &hZ.
scent 1D ;h0Wng &C&h tt zng @a*'1in' Jn zng
a*&'n('r.ih0Wng &C&h nD3 -iI! tW &hi"! &a0 &wa &C& &hZ viJt h0a+nhng
-ut *Q ;v t` &x thT -y rung v" phva trIn &wa zng a*&'n('r.
Descent 1D ;h0Wng &C&h tt zng @a*'1in' Jn zng
('*&'n('r.[iT- th]p nh]t &wa h! hJt &C& ;v t` *Y n- @In tr0ng
httpBOOtai1i'!ha3.&0-
9<
Lp trnh ha trn Java 2D v 3D
('*&'nt+nhng &x -ut *Q ;v t` &x thT -y rung v" phva (i &wa zng
('*&'n('r.
6ea'ing R& nxi ti nh 1D ;h0Wng &C&h tt C3 &wa zng
('*&'n('r Jn nh &wa (dng tiJp th'0.
Thjng tin nD3 R& *G (bng T Unh vU -ut &C&h &hvnh ,C& &C& ;v
t` (& th'0 -ut (dng+vD &C& zng &x thT 1iIn !an Jn &C& zng ;hC&.
>en &x thT tr!3 ,!]t nhZng phcp 0 &C& 1in' @ng viE& *G (bng &C&
phng tha& get$s&ent+ getDes&ent+ vD getLeading .>en &ng &x thT
tr!3 ,!]t thjng tin vI ?'ight+ @a*'1in' vD !n('r1in' &wa +ont thjng !a
Line/etrics.
..< *2c (h2i ni4! vC Tet La,%9t.
Tr& ;hi -ut 0en &hZ &x R& hiTn thU+nx &n phWi R& &h r v"
hnh (Cng &ng nh vU trv hiTn thU @ng viE& *G (bng &C& nct &hZ vD &C&
&C&h ;Jt hRp -ut thv&h hRp.F!C trnh nD3 R& gi 1D t',t 1a30!t+@a0 g-
&C& giai 0en *a!B
2^p t &C& &hZ *G (bng &C& nct &hZ vD &C& &C&h ;Jt hRp thv&h
hRp.
Mr('ring &C& 0en t',t thv&h hRp.
[Cnh giC vD @Q trv &C& 0en t',t.
httpBOOtai1i'!ha3.&0-
9=
Lp trnh ha trn Java 2D v 3D
CC& thjng tin &h0 R& *G (bng T hiTn thU t',t &ng r]t &n thiJt &h0
viE& @iT! (ikn t',t nh &ar't p0*iti0ning+ hit ('t'&ti0n+ vD high1ighting.
[T phCt triTn &C& phn -"- &x thT triTn ;hai trIn t0Dn &!+t',t phWi R&
thT hiEn trIn nhi"! ngjn ngZ ;hC& nha! @ng nhi"! T &x thT thv&h hRp
vi !3 t^& &wa &C& hE thQng vVn @Wn thv&h hRp.
-.*.( CD chE.
)3phfnct &hZg 1D -ut &C&h hiTn thU tr`& !an &h0 -ut ha3 nhi"! ;v
t`.Knh (Cng+;v&h th&+vD vU trv &wa g13ph phb th!u& vD0 vVn &Wnh &wa
nx..]t nhi"! 10ei g13ph &x thT R& *G (bng T -iI! tW -ut ;v t` n
h0& nhiI! ;v t` ;Jt hRp vi nha!+phb th!u& vD0 60nt vD ;iT! (Cngf*t31'g.
Xv (b nh tr0ng 0en t',t viJt @ng ta3+&C& ;v t` & @iEt &x thT thT
hiEn &C& hnh (Cng &hZ ;hC& nha! phb th!u& vD0 &C&h nx ;Jt hRp vi &C&
;v t` 1i"n ;" vi nx.
Tr0ng -ut *Q hE thQng vVn @Wn+& @iEt 1D &hZ .p+ th' &0nt',t 06 a
g13ph -!*t a1?a3* @' ta;'n int0 a&&0!nt .ihjng giQng tiJng #nh+&C&
&!r*iv' 60r- &x tvnh @^t @!u& tr0ng &hZ .p.
Phb th!u& vD0 ttng &0nt',t+&C& &!r*iv' 60r- &x thT ;hC& nha! h0Dn
t0Dn v" hnh (Cng.Xv (b+&hZ h'h tr0ng tiJng .p &x @Qn &!r*iv' 60r-
httpBOOtai1i'!ha3.&0-
99
Lp trnh ha trn Java 2D v 3D
nh tr0ng hnh 7P2 (i s3B
/& (_ @Qn ;iT! 60r- nD3 &h ;hC& nha! ji &ht *0 vi &C 60r-
;hC&+nhng nhZng *` tha3 i v" hnh (Cng ;hjng phWi 1D *` ;hC& @iEt &
@Wn v" &!r*iv' tr0ng tiIng #nh.
Tr0ng -ut *Q ngZ &Wnh+hai g13ph &x thT tha3 i hnh (Cng -ut &C&h
& @Wn vD ;Jt hRp vD0 60r- -ut g13ph n.iiT! ;Jt hRp nD3 R& gi 1D
1igat!r'.Xv (b+h! hJt &C& 60nt tiJng anh &haa 1igat!r' nh tr0ng hnh 7P
5.XiE& hda hRp g13ph a vD0 tvnh t0Cn phn nhj ra tr0ng ;v t` 6 vD ;Jt
hRp &C& ;v t` th'0 -ut &C&h t` nhiIn+tha3 v &C& ;v t` ;" nha!
httpBOOtai1i'!ha3.&0-
100
Lp trnh ha trn Java 2D v 3D
CC& &hZ ghcp &ng R& *G (bng tr0ng tiJng rp vD &C&h *G (bng
&wa -ut *Q &hZ ghcp i* -an(at0r3Pnx ;hjng R& &h]p nhn T hiTn thU
&C& ;v t` ;Jt hRp &hvnh ,C& -D ;hjng *G (bng &hZ ghcp thv&h hRp.ihi &C&
&hZ ghcp R& te0 thDnh tt &C& ;v t` .p+hnh (Cng tha3 i -ut &C&h
& @Wn hn *0 vi tiJng #nh.Xv (b+nh tr0ng hnh 7P7 -iI! tW &C&h hai
&hZ &Ci rp ;Jt hRp vi nha! thDnh -ut &hZ ghcp ;hi &hng ,!]t hiEn
&_ng nha!.
-.*.% Frderin$ Text
Tr0ng ngjn ngZ 1p trnh Java+vVn @Wn R& - hxa @ng &C&h *G
(bng &C& ;v t` - hxa 4ni&0('.XVn @Wn *G (bng ;v t` - hxa 4ni&0('
R& 1! trZ tr0ng @u nh tr0ng 10gi&a1 0r('r. 10gi&a1 0r('r 1D ni -D
tr0ng x &C& ;v t` vD &C& tt R& & vD ghi. 10gi&a1 0r('r ;hjng nh]t
thiJt phWi giQng nh vi*!a1 0r('r+1D ni -D tr0ng x &C& g13ph tng ang
R& hiTn thU.
Xi*!a1 0r('r &h0 &C& g13ph tr0ng hE thQng ghi &b thTf*&riptg R& gi
1D *&ript 0r('r.Xv (b+ *&ript 0r('r &h0 vVn @Wn ;iT! .0-an R& @Q trv tt
trCi !a phWi vD *&ript 0r('r &h0 &C& vVn @Wn #ra@i& vD K'@r'? R& @Q
trv tt phWi *ang trCi.
/ut *Q hE thQng ghif?riting *3*t'-*g &x &C& ng!3In t^& tr0ng viE& thI-
&C& *&ript 0r('r &h0 viE& *^p ,Jp &C& g13ph vD &C& tt tr0ng nhi"! (dng &wa
vVn @Wn.Xv (b+ &C& *Q #ra@i& vD K'@r'? &he3 tt trCi !a phWi+-& ( &C&
httpBOOtai1i'!ha3.&0-
101
Lp trnh ha trn Java 2D v 3D
;v t` &he3 tt phWi !a trCi.f[i"! nD3 &x nghha #ra@i& vD K'@r'?+nga3 &W
;hi ;hjng &x &C& vVn @Wn @ng tiJng #nh nhng vD0+&hng vn th`& *` 1D
f;h th!tg hai &hi"!g
/ut hE thQng ghi vi*!a1 0r('r phWi ;hjng R& tha3 i nga3 &W ;hi
&C& ngjn ngZ hda trun vi nha!.[i"! nD3 R& -j tW tr0ng hnh 7P9+-iI!
tW -ut nhx- tt #ra@i& nhng vD0 -ut &s! vVn @Wn tiJng #nh.
Ch HBTr0ng vv (b nD3 vD tr0ng &C& vv (b *a!+ &C& vVn @Wn #ra@i& vD
K'@r'? R& hiTn thU @ng &C& &hZ &Ci in h0a vD &C& ;h0Wng &C&h giZa
&C& &hZ R& hiTn thU @ng (]! ge&h (i./\i phn -iI! tW &hia thDnh
hai phnBviE& hiTn thU &wa &C& ;v t` R& 1! trZ tr0ng @u nhf&C& ;v t`
tr0ng 10gi&a1 0r('rg *a! x 1D &C&h hiTn thU &wa nhZng ;v t` R& hiTn
thUf&C& ;v t` tr0ng vi*!a1 0r('rg.CC& *Q @In (i ;h!ng ;v t` &h Unh
in*'rti0n 066*'t*.
Knh 7P9 >i(ir'&ti0na1 T',t
Ch0 (_ &hng 1D -ut phn tr0ng -ut &s! tiJng #nh+&C& tt #ra@i&
R& hiTn thU tr0ng &C& #ra@i& *&ript+tt phWi !a trCi.
ihi -ut (dng vVn @Wn vi -ut *` pha trun hai &C&h @Q trv tt trCi !a
phWi vD tt phWi !a trCi R& hiTn thU+ @a*' (ir'&ti0n *Y R& &h
Unh.>a*' (ir'&ti0n 1D -ut *&ript 0r('r &wa hE thQng ghi.Xv (b+nJ! vVn
httpBOOtai1i'!ha3.&0-
102
Lp trnh ha trn Java 2D v 3D
@Wn gQ& 1D tiJng #nh vi -ut *Q &hZ #ra@i& R& nhng vD0+th @a*'
(ir'&ti0n *Y 1D tt trCi !a phWi.SgR& 1ei+nJ! vVn @Wn gQ& 1D tiJng #ra@i&
vi -ut *Q &hZ #nh nhng vD0 h0& &C& &0n *Q+th @a*' (ir'&ti0n *Y 1D tt
phWi !a trCi.
>a*' (ir'&ti0n ,C& Unh &C& @Q trv tr0ng -\i 0en &wa vVn @Wn vi -ut
&0--0n (ir'&ti0n R& hiTn thU.Tr0ng vv (b 9P7+ @a*' (ir'&ti0n 1D tt trCi
!a phWi.Cx @a hng @Q trv vVn @Wn tr0ng vv (b nD3+vVn @Wn tiJng #nh y
0en ! &wa &s! &he3 tt trCi !a phWi+vVn @Wn #ra@i& &he3 tt phWi !a
trCi+vD &C& vVn @Wn ;hC& &he3 tt trCi !a phWi.
-.*.* Go v Hnh vH vIn ,Jn
Trt ;hi @en 1D- viE& vi 60nt n &C&h+&C& ;v t` ;hC& nha! tr0ng ;iT!
60nt &x &hi"! rung ;hC& nha!.[i"! nD3 &x nghha t]t &W &C& vU trv vD ;v&h
th& &wa &C& vVn @Wn phWi R& tvnh t0Cn -ut &C&h &hvnh ,C& vi &C& ;v
t` R& *G (bng.Xv (b+ -ut &ut &C& &hZ *Q R& &Vn 1" phWi R& hiTn thU
tr0ng ;iI! 60nt &sn ,ang+@en ;hjng thT (k (Dng *G (bng &C& ;hjng gian
-y rung &h0 vU trv &wa &C& vVn @Wn.[ &Vn 1" &C& &ut -ut &C&h ng
^n+@en &n phWi @iJt &hvnh ,C& &hi"! rung &wa -\i *Q -D @en &x thT i"!
&hnh *a0 &h0 ph_ hRp.
CC& vVn @Wn thzng *G (bng &C&h hiTn thU th'0 nhi"! (dng vD nhi"!
;iT! (Cng+nh th'0 ;iT! nct - vD in nghiIng.Tr0ng trzng hRp nD3+&C&
;v t` giQng nha! &x thT &x &C& hnh (Cng ;hC& nha! v" &hi"! rung+phb
th!u& vD0 &C&h nx thT hiEn ;iT ! (Cng.[T &x vU trv +;v&h th& vD r'n('r
t',t &hvnh ,C&+@en &n phWi ;iT- tra -\i ;v t` riIng 1 vD ;iT! (Cng R&
*G (bng &h0 ;v t` x.Tht -a3 1D 1p TextLa'out 1D- i"! nD3 &h0
@en.
[T hiTn thU &C& vVn @Wn ng tr0ng nhi"! ngjn ng &hng hen nh
K'@r'? vD #ra@i&+-\i ;v t` &n phWi R& &sn nh^& vD t vD0 @In tr0ng
-ut ngZ &Wnh vi &C& ;v t` @In &enh.>yi v hnh (Cng vD vU trv &wa &C& ;v
httpBOOtai1i'!ha3.&0-
105
Lp trnh ha trn Java 2D v 3D
t` &x thT tha3 i R& phb th!u& vD0 ttng ngZ &Wnh+viE& &sn nh^& vD *^p
t &C& 0en vVn @Wn -D ;hjng &n ,ct Jn vVn &Wnh 1D -ut i"! ;hjng
R& tCn thDnh.
-.*.- 7K trL thao tMc vNi vIn ,Jn.
[T &h0 phcp ngzi (_ng &x thT *Ga i t',t R& hiTn thU+@en phWiB
KiTn thU (]! &ar't -D nx &h Un ni -ut ;v t` -i *Y R& thI-
vD0 ;hi ngzi (_ng thI- vD0 t',t.
Di &h!3Tn (]! &ar't vD iT- &hn tr0ng &s! trW 1zi ;hi ngzi (_ng
a vD0.
PhCt hiEn *` 1`a &hn &wa ngzi (_ngfhit ('t'&ti0ng.
LD- ni @t 0en t',t R& 1`a &hn.
7.(.7.1 8i9n th: ';u nh<c
Tr0ng &C& t',t &x thT &hnh *Ga R&+(]! &ar't R& *G (bng T hiTn
thU iT- &hn hiEn tei+vU trv tr0ng 0en t',t ni -D &C& ;v t` -i *Y R&
&hn vD0.Thjng thzng+-ut (]! &ar't R& thT hiEn 1D -ut thanh thng
ang nh]p nhC3 giZa hai g13ph.iv t` -i R& &hn vD0 vD R& hiTn thU
tei vU trv &wa (]! &ar't.
XiE& tvnh t0Cn vU trv (]! &ar't &x thT r]t pha& tep+& @iEt 1D tr0ng &C&
t',t hai &hi"!.CC& 0en &hn vD0 tr0ng &C& zng @iIn Unh hng &x hai
vU trv &x thT &hn @yi v hai g13ph x ph_ hRp vi ;h0Wng ;v t` ;hjng
R& hiTn thU *Ct nga3 &C& ;v t` ;hC&.[i"! nD3 R& -iI! tW tr0ng hnh 7P
:.Tr0ng hnh vY nD3+&C& (]! &ar't R& thT hiEn 1D &C& (]! ng0& v!jng.
httpBOOtai1i'!ha3.&0-
107
Lp trnh ha trn Java 2D v 3D
Knh 7P: D!a1 Car't*
iv t` y vU trv tha = n- *a! (]! vD n- tr& ;v t` #.SJ! ngzi
(_ng -!Qn thI- -ut ;v t` #ra@i& vD0 &h\ x+g13ph &wa nx R& hiTn thU
@In phWifphva tr&g &wa ;v t` #.Cdn nJ! ngzi (_ng -!Qn &hn -ut ;v
t` %ng1i*h+g13ph &wa nx R& hiTn thU @In trCifphva *a!g &wa (]! .
[T 1D- & i"! nD3 -ut *Q hE thQng hiTn thU hai (]! &ar't+-ut
(]! 1D &hvnh fpri-ar3g &dn -ut (]! 1D phb f*'&0n(ar3g.D]! &ar't &hvnh
&h Unh ni -D -ut ;v t` &hn vD0 R& hiTn thU ;hi hng &wa ;v t` x
&_ng vi hng & *y &wa &W 0en t',t.Cdn (]! &ar't phb &h0 @iJt -ut ;v
t` &hn vD0 *Y R& hiTn thU ;hi hng &wa ;v t` x ngR& vi hng &
*y &wa 0en t',t.Lp TextLa'Fut t` ung h\ trR &W hai (]! &ar't+&dn 1p
>textCo"ponent th ;hjng.
ihi 1D- viE& vi vVn @Wn hai &hi"!+@en ;hjng thT n giWn thI- vD0
@" rung &wa &C& g13ph tr& -ut ;h0Wng trQng &wa ;v t` T tvnh t0Cn vU trv
(]! &ar't.SJ! @en 1D- v3+(]! &ar't &x thT hiEn ra tei vU trv *ai nh @en
th]3 tr0ng hnh 7P<B
8ig!r' 7P< Car't Dra?n in&0rr'&t13
[T (]! &ar't &x thT hiTn thU y -ut vU trv hRp 1H+@" rung &wa &C& g13ph
y phva @In trCi &wa ;h0Wng trQng &n phWi R& thI- vD0 vD ngZ &Wnh
httpBOOtai1i'!ha3.&0-
109
Lp trnh ha trn Java 2D v 3D
hiEn tei a vD0 tvnh t0Cn.Trt ;hi ngZ &Wnh R& a vD0 tvnh t0Cn+&C&
phcp 0 g13ph *Y ;hjng &n thiJt ;hp vi viE& hiTn thU.
7.(.7.2 Di chu&9n ';u nh<c.
T]t &W &C& trnh @iIn *0en vVn @Wn "! &h0 phcp ngzi *G (bng (i
&h!3Tn (]! &ar't vi &C& phv- -i tIn.Sgzi *G (bng -0ng -!Qn (]!
&ar't *Y (i &h!3Tn th'0 hng &wa &C& phv- -i tIn & ]n.Tt trCi !a
phWi &wa 0en t',t+viE& (i &h!3Tn &C& ;h0Wng trQng thI- vD0 r]t n
giWnBPhv- -i tIn phWi 1D- tVng ;h0Wng trQng R& thI- vD0 @ng &dn
phv- -i tIn trCi 1D- giW- i.Tr0ng &C& vVn @Wn hai &hi"! h0& &C& vVn
@Wn &x nhi"! &hZ ghcp+&C&h 1D- nD3 &x thT ;hiJn (]! &ar't nh3 !a &C&
g13ph th'0 hng &wa zng @iIn vD (i &h!3Tn tr0ng th'0 hng ngR&
1ei.
[T (i &h!3Tn (]! &ar't -ut &C&h -Rt -Df*-00th13g !a vVn @Wn hai
&hi"!+@en &n phWi tvnh t0Cn hng &wa vVn @Wn thi hDnh..>en ;0 thT n
giWn tVng ;h0Wng trQng thI- vD0 ;hi phv- -i tIn phWi R& ]n vD giW-
nx ;hv phv- -i tIn trCi R& ]n.SJ! ;h0Wng trQng thI- vD0 hiEn tei
n- @In tr0ng -ut thi hDnh &wa &C& ;v t` tt phWi !a trCi+th phv- -i
tIn phWi &x thT 1D- giW- ;h0Wng trQng thI- vD0 vD phv- -i tIn trCi *Y
1D- tVng nx.
Di &h!3Tn (]! &ar't ngang !a hng zng @iIn 1D -ut viE& ;hC
pha& tep nh tr0ng hnh 7P= (i s3B

httpBOOtai1i'!ha3.&0-
10:
Lp trnh ha trn Java 2D v 3D
8ig!r' 7P= Car't /0v'-'nt
Ch^& &h^n &C& g13ph *Y ;hjng @a0 giz &x (]! &ar't giZa &hng.tha3
vD0 x (]! &ar't (i &h!3Tn !a &C& hiTn thU &wa g13ph -ut ;v t` n.Xv
(b+;hjng @a0 giz &x -ut (]! &ar't @In tr0ng &hZ 0 vD -ut *` @iJn s-fan
!-1a!tg nJ! &hng R& hiTn thU @ng hai ;v t` phsn &C&h.Lp
TextLa'Fut &!ng &]p &C& phng tha& get4ext(ight:it an(
get4extLeft:it T &x thT (k (Dng (i &h!3Tn (]! &ar't -ut &C&h -Rt -D
!a &C& vVn @Wn hai &hi"!.
7.(.7.( 8it "esting
Thjng thzng+-ut vU trv tr0ng ;hjng gian &wa &jng &b phWi R&
&h!3Tn thDnh ;hjng gian trQng &wa t',t.Xv (b nh+;hi ngzi *G (bng
nh]n &h!ut vD0 vVn @Wn R& &hn+vU trv &wa &h!ut R& &h!3Tn thDnh
;h0Wng trQng vD R& *G (bng nh iT- &!Qi &wa v_ng 1`a &hn.Th'0
-ut &C&h 10gi&+nx R& &h!3Tn ngR& thDnh vU trv &wa (]! &ar't.
ihi @en 1D- viE& vi vVn @Wn hai &hi"!+-ut vU trv tr`& !an tr0ng
phn hiTn thU &x thT Cp ang &h0 hai 066*'t ;hC& nha! tr0ng 0en vVn @Wn
gQ&+nh tr0ng hnh 7P9 (i s3B
Knh 7P9 Kit T'*ting >i(ir'&ti0na1 T',t
>yi v -ut vU trv tr`& !an &x thT Cp ang &h0 hai 066*'t ;hC& nha!+
hit t'*ting &C& vVn @Wn hai &hi"! ;hjng phWi 1D !an trng &wa &C& phcp 0
@" rung &wa &C& zng nct f-'a*!ring g13ph ?i(th*g trt g13ph tei &C& vU
httpBOOtai1i'!ha3.&0-
10<
Lp trnh ha trn Java 2D v 3D
trv &hvnh ,C& R& t- th]3 vD *a! x Cnh ,e vU trv x Jn -ut &hara&t'r
066*'t.
>en &x thT th`& hiIn hit t'*ting @ng viE& *G (bng 1p
TextLa'out.hitTestChar. Thjng tin v" hit R& xng gxi tr0ng Qi
Text7itinfo @a0 g- &C& thjng tin v" &enh -D viE& hit R& th]3 trIn x.
7.(.7.7 =nh ';u v>ng l?a ch@n.
/ut v_ng &C& ;v t` R& 1`& &hn R& hiTn thU ha @ng -ut
v_ng R& tj *Cng+x 1D v_ng -D -\i zng nct R& hiTn thU vi -D!
trCi ngR& vi -D! n"n.
X_ng R& tj *Cng+giQng nh (]! &ar't+&x nhi"! pha& tep tr0ng &C& vVn
@Wn hai &hi"! hn 1D tr0ng &C& vVn @Wn -ut &hi"!f-0n0(ir'&ti0na1
t',tg.Tr0ng vVn @Wn hai &hi"!+-ut (Wi 1iIn tb& &C& ;v t` &x thT ;hjng &x
-ut v_ng R& tj *Cng 1iIn tb& ;hi hiTn thU.SgR& 1ei+-ut v_ng *Cng 1iIn
tb& &h0 th]3 -ut &C&h tr`& !an -ut (Wi 1iIn tb& &C& nct &x thT ;hjng ph_
hRp vi -ut ;v t` n+(Wi 1iIn tiJp &wa &C& ;v t`.
Cx hai &C&h T 1`a &hn v_ng *Cng tr0ng vVn @Wn hai &hi"!B
A 6ogical highlightingBv>ng sng logicC P Xi v_ng *Cng 10gi&+&C&
;v t` R& 1`a &hn thzng 1iIn tiJp nha! tr0ng -0 hnh vVn @Wnft',t
-0('1g+vD v_ng *Cng R& 1`a &hn -ut &C&h 1iIn tiJp.r'- vv (b v"
10gi&a1 high1ighting+,'- hnh 7P10.
A Disual highlightingBv>ng sng tr?c EuanC F vi vi*!a1
high1ighting+@en &x thT &x nhi"! (Wi &C& ;v t` R& 1`a &hn+nhng v_ng
*Cng thjng thzng 1iIn tiJp nha!.Xv (b v" vi*!a1 high1ighting+,'- hnh 7P
11.
httpBOOtai1i'!ha3.&0-
10=
Lp trnh ha trn Java 2D v 3D
Knh 7P10 L0gi&a1 Kigh1ighting f&0ntig!0!* &hara&t'r*g
Knh 7P11 Xi*!a1 Kigh1ighting f&0ntig!0!* high1ight r'gi0ng
L0gi&a1 high1ighting n giWn hn tr0ng viE& th`& thi+&C& ;v t` R& 1`a
&hn thzng 1iIn tiJp nha!.
-.*.2 ThOc thi viPc hiQn thH vIn ,Jn tron$ Rn$ dSn$ >avaT .
Phb th!u& vD0 JavaA #P$* -D @en *G (bng+@en &x thT &x vt h0&
nhi"! &C& i"! ;hiTn v" t',t 1a30!t fhiTn thU vVn @Wng nh @en &nB
1. SJ! @en -!Qn hiTn thU &W -ut ;hQi t',t h0& &n &C& i"! ;hiTn
&hnh *Ga t',t+@en &x thT *G (bng >textCo"ponent+nx *Y th`& hiEn
t',t 1a30!t &h0 @en. >textCo"ponent R& thiJt ;J T i"! ;hiTn
viE& &n thiJt &wa h! hJt &C& ang (bng vD h\ trR &h0 &C& vVn @Wn
hai &hi"!.[T thI- thjng tin v" >textCo"ponent @en ,'- thI-
phn 4*ing th' J8CO2?ing Pa&;ag'* &wa @u Java T!t0ria1.
2. SJ! @en -!Qn hiTn thU -ut 0en &h!\i ;v t` n giWn+@en &x thT
gi Qi tRng Graphics%&.dra"tring vD 3I! &! Java 2D hiTn thU
&h!\i ;v t` &h0 @en.>en &ng &x thT *G (bng dra"tring T
httpBOOtai1i'!ha3.&0-
109
Lp trnh ha trn Java 2D v 3D
r'n('rftrW v"g ;iT! &wa ,s! ;v t` vD &C& ,s! ;v t` x &haa ;iT! vVn
@Wn hai &hi"!.[T &x thI- thjng tin v" r'n('ring t',t !a 1p
Graphics%&+@en ,'- thI- phn .'n('ring )raphi&* Pri-itiv'*.
5. SJ! @en -!Qn th`& thi viE& &hnh *Ga vVn @Wn &wa @en+@en &x thT
*G (bng T',tLa30!t T i"! ;hiTn viE& hiTn thU vVn @Wnft',t
1a30!tg+tj *Cngf high1ightingg+vD hit ('t'&ti0n.CC& tiEn 1Ri R&
&!ng &]p @yi 1p TextLa'out &h0 h! hJt &C& trzng hRp ph
@iJn+@a0 g- &C& ,s! vVn @Wn vi viE& pha trun &C& ;iT! 80nt+pha
trun &C& ;iT! ngjn ngZ+vD vVn @Wn hai &hi"!.[T &x thI- thjng tin
v" &C&h *G (bng TextLa'out+@en ,'- thI- phn /anaging T',t
La30!t.
7. SJ! @en -!Qn i"! ;hiTn t0Dn @u viE& 1D- thJ nD0 T t',t R&
*hap' vD R& Unh vU trv+@en &x thT ,s3 (`ng 1p G'phvector &wa
@en @ng &C&h *G (bng 80nt vD *a! x r'n('r &hng (`a trIn 1p
Graphics%&.[T &x thI- thjng tin v" &C&h th`& thi &jng &b t',t
1a3p!t &wa @en+@en ,'- thI- phn i-p1'-'nting a C!*t0- T',t
La30!t /'&hani*- .
Thjng thzng+@en ;hjng &n phWi th`& hiEn t',t 1a30!t.Ch0 h! hJt
&C& ang (bng+Jt',tC0-p0n'nt 1D giWi phCp tQt nh]t &h0 viE& hiTn thU &C&
vVn @Wn thnh vD vVn @Wn &x thT &hnh *Ga.T!3 nhiIn+ Jt',tC0-p0n'nt
;hjng h\ trR viE& hiTn thU (]! &ar't ;cp h0& &C& 0en 1`a &hn 1iIn tiJp
tr0ng vVn @Wn hai &hi"!.SJ! ang (bng &wa @en 3I! &! nhZng & tvnh
trIn+h0& @en thv&h th`& hiEn viE& &hnh *Ga vVn @Wn &wa @en+@en &x thT
*G (bng Java 2D t',t 1a30!t #P$*.
E9Fn &G vi4c hiHn thI vJn +Fn.
Lp TextLa'out h\ trR &C& t',t -D nx &haa `ng nhi"! ;iT!
(Cngf*t31'g vD nhi"! ;v t` tt &C& hE thQng ?riting ;hC& nha!+@a0 g-
httpBOOtai1i'!ha3.&0-
110
Lp trnh ha trn Java 2D v 3D
#ra@i& vD K'@r'?f#ra@i& vD K'@r'? 1D &C& ;iT! & @iEt ;hx T hiTn thU
@yi v @en phWi r'*hap' vD r'0r('r vVn @Wn T R& &h]p nhn hiTn thUg.
Lp TextLa'out 1D- n giWn viE& *G 1H &C&h hiTn thU -D &C& phcp
0 vVn @Wn nJ! @en 1D- viE& vi &C& vVn @Wn &h &x tiJng #nh.>ng viE&
*G (bng T',tLa30!t @en &x thT et R& viE& te0 &hZ vi &h]t 1Rng &a0
-D ;hjng tQn nhi"! &jng *a&.
"ext 6a&out -er!or#ance
Lp T',tLa30!t gip @en tr0ng viE& ,C& Unh vU trv vD tha t` &wa &C&
zng nct.>en &x thT (_ng T',tLa30!t TB
KiTn thU &C& vVn @Wn -ut hng vD vVn @Wn hai hng.
KiTn thU vD (i &h!3Tn (]! &ar't.
Th`& hiEn hit t'*ting trIn vVn @Wn.
Tj *Cng v_ng vVn @Wn R& 1`a &hn.
zng hRp+@en &x thT tvnh t0Cn &C&h @Q trv vVn @Wn &wa @en @ng &C&h
i"! ;hiTn -ut &C&h &hvnh ,C& &C& zng nct -D @en *G (bng vD ni
&hng *Y R& tfvD0 vVn @Wng.XiE& *G (bng &C& thjng tin nh &C& ;v&h
& zng nctfg13ph *i'*g+&C& @Wng &0 ;c0f;'rning ta@1'*g+vD &C&h ghcp
&hZf1igat!r' in60r-ati0ng+@en &x thT ,s3 (`ng giWi th!t &wa @en T tvnh
t0Cn &C&h @Q trv vVn @Wn+@3pa**ing &jng &b @Q trv &wa hE thQngf@3pa**ing
th' *3*P t'-* 1a30!t -'&hani*-g.[T &x thI- thjng tin @en ,'- thI-
phn i-p1'-'nting a C!*t0- T',t La30!t /'&hani*-.
-.-.( TrUnh ,' vIn ,Jn.
Lp TextLa'out *Y t vVn @Wn -ut &C&h t` ung+;T &W &C& vVn @Wn
-ut hngf>iDiP@i(ir'&ti0na1g+vi viE& te0 hnh (Cngf*hapingg vD
0r('ring &hvnh ,C&.[T *hap' vD 0r('r -ut &C&h &hvnh ,C&+&C& zng nct
phWi -iI! tW &C& zngf1in'g &wa vVn @Wn+ TextLa'out phWi @iJt t0Dn @u
ngZ &Wnh &wa vVn @WnB
httpBOOtai1i'!ha3.&0-
111
Lp trnh ha trn Java 2D v 3D
SJ! vVn @Wn n- trIn -ut zng nf*ing1' 1in'g +&hng hen nh
-ut tt n &wa nhnf1a@'1g &h0 -ut nt 1Enh h0& -ut zng tr0ng hup
th0eif(ia10g @0,g+@en &x thT ,s3 (`ng -ut Qi tRng TextLa'out tr`&
tiJp tt vVn @Wn.
SJ! @en &x nhi"! vVn @Wn hn 1D &h &x -ut (dng h0& @en -!Qn
&hia vVn @Wn tt &C& *ing1' 1in' thDnh &C& 0en+@en ;hjng thT ,s3 (`ng
Qi tRng TextLa'out -ut &C&h tr`& tiJp.>en phWi *G (bng Qi tRng
LineBreak/easure T Cp ang w &C& ngZ &Wnh.
Kng & @Wn &wa -ut vVn @Wn thzng R& thiJt 1p @ng &C& th!u&
tvnhf;iT! (Cngg trIn vVn @Wn.SJ! th!u& tvnh x @U thiJ!+1p TextLa'out
*G (bng giWi th!t &wa @Wng - hai &hi"! 4ni&0('+vD nhn R& hng
& @Wn tt &C& ;v t` @^t ! tr0ng 0en.
7iQn thH dVu nhWc kXp.
Lp TextLa'out &haa &C& thjng tin v" (]! &ar't nh hnh (Cng &wa
(]!f&ar't *hap'g+vU trv vD gx&fang1'g.>en &x thT *G (bng &C& thjng tin nD3
T (k (Dng hiTn thU (]! &ar't tr0ng &W vVn @Wn -ut hng vD hai
hng.ihi @en vY (]! &ar't &h0 vVn @Wn -ut &hi"!+viE& *G (bng 1p
TextLa'out *Y W- @W0 (]! &ar't R& t vU trv -ut &C&h &hvnh ,C&.
TextLa'out &!ng &]p &h0 ta nhi"! hnh (Cng -& Unh &wa (]! &ar't
vD h\ trR -ut &C&h t` ung (]! &ar't ;cp+nh @en th]3 tr0ng hnh 7P
12.CC& vv trv &wa (]! &ar't x &ng R& *G (bng nh zng @iIn giZa
&C& zng nct &h0 viE& tj *Cng vD hit t'*ting.
Knh 7P12 #ng1'( Car't*
httpBOOtai1i'!ha3.&0-
112
Lp trnh ha trn Java 2D v 3D
CVn &a vD0 ;h0Wng trQng R& thI- vD0+phng tha&
get)aret"hapes trW v" -ut -Wng hai phn tG &wa *hap'Bphn tG tha nh]t
&haa (]! &ar't &hvnh vD phn tG tha hai &haa (]! &ar't phb+nJ! &hng
&_ng tn tei.[T hiTn thU &W hai (]! &ar'tf(]! &ar't ;cpg+@en n giWn &h
1D vY &W hai *hap' &wa (]! &ar't&C& (]! &ar't *Y R& r'n('r -ut &C&h t`
ung tei nhZng vU trv &hvnh ,C&.
SJ! @en -!Qn *G (bng *hap' &wa (]! &ar't -ut &C&h t_3 thv&h+@en &x
thT t- Jn vU trv vD gx& &wa &C& (]! &ar't @ng Qi tRng TextLa'out vD
vY &hng th'0 &C&h &wa @en.
Tr0ng vv (b (i s3+hnh (Cng &wa (]! &ar't &hvnh vD phb -& Unh
R& vY trIn &C& -D! ;hC& nha!.[s3 1D &C&h ph @iJn T te0 *` ;hC& @iEt
&wa hai (]! &ar't .
0hapeKL caret0hapes =
*a,out.getCaret0hapes(hit&'
g(.setCo*or($iM/$Y"C/$!T"C-N-$&'
g(.draw(caret0hapesK+L&'
if (caret0hapesKOL P= nu**&Q
g(.setCo*or(0!C-#)/$Y"C/$!T"C-N-$&'
g(.draw(caret0hapesKOL&'
2
-.-.* &i chu'Qn dVu nhWc.
>en &ng &x thT *G (bng 1p TextLa'out T ,C& Unh ;Jt !W &wa
viE& thI- vD0 &C& ;h0Wng trQng ;hi ngzi *G (bng ]n &C& phv- -i tIn
trCi h0& phWi.D`a vD0 Qi tRng Text7itinfo+nx &h0 ta @iJt vU trv hiEn tei
&wa ;h0Wng trQng thI- vD0+phng tha& get4ext(ight:it trW v" ;iT! Qi
tRng Text7itinfo -D nx &h0 @iJt &hvnh ,C& vU trv &wa ;h0Wng trQng thI-
httpBOOtai1i'!ha3.&0-
115
Lp trnh ha trn Java 2D v 3D
vD0 ;hi phv- -i tIn phWi R& nh]n.Cdn phng tha& get4extLeft:it
&h0 ta thjng tin nh v3 ;hi phv- -i tIn trCi R& nh]n.
Tr0ng vv (b (i s3+vU trv hiEn tei &wa ;h0Wng trQng &hn vD0 R&
(i &h!3Tn Jn ni tng ang ;hi -D phv- phWi R& ]n.
Text1itinfo newinsertion-ffset =
*a,out.get#ext$ight1it(insertion-ffset&'
if (newinsertion-ffset P= nu**&
Q
0hapeKL caret0hapes =
*a,out.getCaret0hapes(newinsertion-ffset&'
// draw carets
...
insertion-ffset = newinsertion-ffset'
2
-.-.- 7it Testin$
Lp TextLa'out &h0 ta -ut &jng &b n giWn T hit t'*ting vVn
@Wn.Phng tha& hitT'*tChar *Y 1]3 ta u , vD 3 tt &h!utfta;'* , an( 3
&00r(inat'* 6r0- th' -0!*'g nh &C& Qi *Q vD trW v" ;iT! Qi tRng
Text7itinfo.[Qi tRng Text7itinfo &haa ;h0Wng trQng &hn vD0 &h0 vU
trv vD &enh -D viE& hit ?a* 0n.
Tr0ng vv (b (i s3+phng tha& hit,est)har R& gi tr0ng Qi tRng
TextLa'out vD *a! x phng tha& getinsertindex R& *G (bng T 1]3
1ei ;h0Wng &haa trQng.
Text1itinfo hit = *a,out.hitTestChar(x, ,&'
int insertindex = hit.getinsertindex(&'
httpBOOtai1i'!ha3.&0-
117
Lp trnh ha trn Java 2D v 3D
-.-.2 GMnh dVu vYn$ Oa chZn.
>en &x thT nhn -ut Qi tRng Shape -D nx hiTn thU v_ng *Cng tt Qi
tRng TextLa'out. [Qi tRng TextLa'out *Y t` ung giZ ngZ &Wnh tr0ng
-ut -Wng ;hi tvnh t0Cn *Q &hi"! &wa v_ng R& tj *Cng.Lp TextLa'out
h\ trR &W v_ng *Cng 10gi& vD v_ng *Cng tr`& !an.
Tr0ng vv (b (i s3+v_ng *Cng R& i"n vi -D! *Cng vD *a! x
Qi tRng TextLa'out *Y vY t0Dn @u v_ng R& i"n x.[s3 1D -ut &C&h
n giWn T hiTn thU 0en vVn @Wn R& tj *Cng.
Shape highlightRegion =
layout.getLogicalHighlightShape(hit1,
hit2);
graphics.setColor(HiGHLiGHT_COLOR);
graphics.fill(highlightRegion);
graphics.drawString(layout, 0, 0);
-.-.3 6uer'in$ La'out /etrics
Lp TextLa'out &!ng &]p &C&h tr!3 &p Jn &C& phcp 0 ha &h0
t0Dn @u (Wi vVn @Wn hiTn thU.CC& phcp 0 &x *n tr0ng 1p TextLa'out
@a0 g- ascent+'escent+lea'ingf;h0Wng &C&h giZa &C& (dng &hZ *0 vi
(dng & *yg+ a(van&'+ vi*i@1' a(van&' vD @0!n(ing r'&tang1' fgii hen
&wa ;h!ng hnh &hZ nhtg.
Cx nhi"! hn -ut Qi tRng +ont &x thT R& 1iIn ;Jt vi -ut Qi
tRng TextLa'outB*` ;hC& nha! v" ;iT! (Cng ;hi th`& thi &x thT *G (bng
&C& ;i"! 60nt ;hC& nha!.CC& giC trU ascent vD 'escent &wa t0Dn @u ;iT!
60nt R& *G (bng tr0ng Qi tRng TextLa'out.XiE& tvnh t0Cn giC trU
1'a(ing &wa Qi tRng T',tLa30!t th pha& tep hn nhi"!+nx ;hjng &x giC
trU 1'a(ing &`& ei.
httpBOOtai1i'!ha3.&0-
119
Lp trnh ha trn Java 2D v 3D
)iC trU a(van&' &wa Qi tRng TextLa'out &hvnh 1D &hi"! (Di &wa
nxBx 1D ;h0Wng &C&h tt &enh @In trCi &wa nct @In trCi nh]t Jn &enh @In
phWi &wa nct @In phWi nh]t.)iC trU a(van&' thzng R& &h Unh 1D t0ta1
a(van&'.Cdn giC trU vi*i@1' a(van&' 1D &hi"! (Di &wa Qi tRng
TextLa'out -D ;hjng &x &C& ;h0Wng tr^ng.
ih!ng gii hen &wa -ut Qi tRng TextLa'out @a0 !anh t0Dn @u
vVn @Wn tr0ng phn @Q trv..Sx @a0 g- t0Dn @u &C& zn nct tr`&
!anfth]3 R&g vD &C& (]! &ar't @iIn.f/ut *Q tr0ng x &x thT R& 1]3 tt
gQ& h0& gQ& a(van&'g.ih!ng gii hen &x !an hE vi ng!n gQ& &wa
Qi tRng TextLa'out+;hjng 1iIn !an Jn vU trv trIn -Dn hnh.
Tr0ng vv (b (i s3+vVn @Wn tr0ng -ut Qi tRng TextLa'out R&
vY @In tr0ng -ut ;h!ng gii hen.
graphics.drawString(layout, 0, 0);
Rectangle2D bounds = layout.getBounds();
graphics.drawRect(bounds.getX()-1,
bounds.getY()-1,
bounds.getWidth()+2, bounds.getHeight()+2);
-.-.? CD vIn ,Jn tr[n nhi\u d]n$.
Lp TextLa'out &dn &x thT R& *G (bng T hiTn thU 0en t',t -D
nx &x nhi"! (dng.Xv (b nh+@en &x thT 1]3 -ut 0en &wa vVn @Wn+&hng
&C& 1in' &wa vVn @Wn x -ut @" rung nD0 x+vD hiTn thU &C& 0en nh
nhi"! (dng &wa vVn @Wn.
[T 1D- R& i"! nD3+@en ;hjng phWi 1D- tr`& tiJp @ng viE& te0 ra
nhi"! Qi tRng TextLa'out -D @en hiTn thU -\i (dng &wa vVn @WnP
phng tha& Lin'>r'a;/'a*!r' *Y 1D- i"! x &h0 @en.CC& ;iT! vVn @Wn
hai &hi"! ;hjng thT th`& hiEn i"! nD3 -ut &C&h &hvnh ,C& trt ;hi t]t &W
httpBOOtai1i'!ha3.&0-
11:
Lp trnh ha trn Java 2D v 3D
vVn @Wn tr0ng -ut 0en &x *n.Phng tha& Line2rea-*easure xng
gxi t0Dn @u thjng tin v" ngZ &Wnh T te0 ra &C& Qi tRng TextLa'out
&hvnh ,C&.
ihi vVn @Wn R& hiTn thU !a nhi"! (dng+&hi"! (Di &wa nhZng (dng
x thzng R& ,C& Unh @ng &hi"! rung &wa v_ng hiTn thU.2` &hia
(dngfLin' @r'a;ing ha3 1in' ?rappingg 1D viE& ,C& Unh ni -D nhZng
(dng @^t ! vD ;Jt th&.
/*
* FontSelection.java
* 1.0
* 12/03/06
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.itemEvent;
import java.awt.event.itemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JApplet;
httpBOOtai1i'!ha3.&0-
11<
Lp trnh ha trn Java 2D v 3D
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/*
* Applet nay hien thi mot xau voi lua chon cua
nguoi su dung.
*/
public class FontSelection extends JApplet
implements itemListener {
/**
*
*/
private static final long serialVersionUiD =
5469031020823166920L;
JLabel fontLabel, sizeLabel, styleLabel;
FontPanel fontC;
JComboBox fonts, sizes, styles;
int index = 0;
String fontchoice = "L a ch n Font"; R S
int stChoice = 0;
httpBOOtai1i'!ha3.&0-
11=
Lp trnh ha trn Java 2D v 3D
String siChoice = "10";
@SuppressWarnings("unchecked")
public void init() {
getContentPane().setLayout(new
BorderLayout());
JPanel topPanel = new JPanel();
JPanel fontPanel = new JPanel();
JPanel sizePanel = new JPanel();
JPanel stylePanel = new JPanel();
JPanel sizeAndStylePanel = new JPanel();
topPanel.setLayout(new BorderLayout());
fontPanel.setLayout(new GridLayout(2,
1));
sizePanel.setLayout(new GridLayout(2,
1));
stylePanel.setLayout(new GridLayout(2,
1));
sizeAndStylePanel.setLayout(new
BorderLayout());
topPanel.add(BorderLayout.WEST,
fontPanel);
sizeAndStylePanel.add(BorderLayout.WEST,
sizePanel);
httpBOOtai1i'!ha3.&0-
119
Lp trnh ha trn Java 2D v 3D
sizeAndStylePanel.add(BorderLayout.CENTER,
stylePanel);
topPanel.add(BorderLayout.CENTER,
sizeAndStylePanel);
getContentPane().add(BorderLayout.NORTH,
topPanel);
fontLabel = new JLabel();
fontLabel.setText("Fonts");
Font newFont = getFont().deriveFont(1);
fontLabel.setFont(newFont);
fontLabel.setHorizontalAlignment(JLabel.CENTER);
fontPanel.add(fontLabel);
sizeLabel = new JLabel();
sizeLabel.setText("Kch C "); T
sizeLabel.setFont(newFont);
sizeLabel.setHorizontalAlignment(JLabel.CENTER);
sizePanel.add(sizeLabel);
styleLabel = new JLabel();
styleLabel.setText("Ki u ch "); 7 ;
styleLabel.setFont(newFont);
styleLabel.setHorizontalAlignment(JLabel.CENTER);
httpBOOtai1i'!ha3.&0-
120
Lp trnh ha trn Java 2D v 3D
stylePanel.add(styleLabel);
GraphicsEnvironment gEnv =
GraphicsEnvironment
.getLocalGraphicsEnvironment();
String envfonts[] =
gEnv.getAvailableFontFamilyNames();
Vector vector = new Vector();
for (int i = 1; i < envfonts.length; i++)
{
vector.addElement(envfonts[i]);
}
fonts = new JComboBox(vector);
fonts.setMaximumRowCount(9);
fonts.additemListener(this);
fontchoice = envfonts[0];
fontPanel.add(fonts);
sizes = new JComboBox(new Object[]
{ "10", "12", "14", "16", "18" });
sizes.setMaximumRowCount(9);
sizes.additemListener(this);
sizePanel.add(sizes);
styles = new JComboBox(new Object[]
{ "PLAiN", "BOLD", "iTALiC",
"BOLD & iTALiC" });
styles.setMaximumRowCount(9);
styles.additemListener(this);
sizes.setMaximumRowCount(9);
httpBOOtai1i'!ha3.&0-
121
Lp trnh ha trn Java 2D v 3D
stylePanel.add(styles);
fontC = new FontPanel();
fontC.setBackground(Color.white);
getContentPane().add(BorderLayout.CENTER,
fontC);
}
public void itemStateChanged(itemEvent e) {
if (e.getStateChange() !=
itemEvent.SELECTED) {
return;
}
Object list = e.getSource();
if (list == fonts) {
fontchoice = (String)
fonts.getSelecteditem();
} else if (list == styles) {
index = styles.getSelectedindex();
stChoice = index;
} else {
siChoice = (String)
sizes.getSelecteditem();
}
fontC.changeFont(fontchoice, stChoice,
siChoice);
}
httpBOOtai1i'!ha3.&0-
122
Lp trnh ha trn Java 2D v 3D
public static void main(String s[]) {
JFrame f = new JFrame("Ch n ki u Font"); S 7
f.addWindowListener(new WindowAdapter() {
public void
windowClosing(WindowEvent e) {
System.exit(0);
}
});
JApplet fontSelection = new
FontSelection();
f.getContentPane().add(fontSelection,
BorderLayout.CENTER);
fontSelection.init();
f.setSize(new Dimension(550, 250));
f.setVisible(true);
}
}
class FontPanel extends JPanel {
/**
*
*/
private static final long serialVersionUiD =
7850814263388447528L;
Font thisFont;
public FontPanel() {
httpBOOtai1i'!ha3.&0-
125
Lp trnh ha trn Java 2D v 3D
thisFont = new Font("Arial", Font.PLAiN,
10);
}
public void changeFont(String f, int st,
String si) {
integer newSize = new integer(si);
int size = newSize.intValue();
thisFont = new Font(f, st, size);
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int w = getWidth();
int h = getHeight();
g2.setColor(Color.darkGray);
g2.setFont(thisFont);
String change = "Ch n Font ,c ch v S T ;
ki u ch ."; 7 ;
FontMetrics metrics =
g2.getFontMetrics();
int width = metrics.stringWidth(change);
int height = metrics.getHeight();
g2.drawString(change, w / 2 - width / 2,
h / 2 - height / 2);
}
}
httpBOOtai1i'!ha3.&0-
127
Lp trnh ha trn Java 2D v 3D
iJt !W &wa &hng trnhB
httpBOOtai1i'!ha3.&0-
129
Lp trnh ha trn Java 2D v 3D
Chng 3
T4. 2nh
Java 2DA #P$ h\ trR 5 -0('1 vY Wnh.
/0('1 ;hC&h &hw fpr0(!&'rO&0n*!-'rg h\ trR tr0ng phiIn @Wn
tr& &wan @Wn JDi.
/0('1 tr!ng gian fi--'(iat' -0(' -0('1g R& gii thiE! tr
0ng JavaA 2 2Di r'1'a*'.
/0('1 zng Qng tng thv&h vi -0('1 tr!ng gian vD *', R&
&Di t 3 w tr0ng @Wn Java #(van&'( i-aging #P$ *^p ti.
Tr0ng &hng nD3 &hng ta tp tr!ng vD0 &C& Qi tRng vD &C& &jng
nghE &wa -0('1 te0 Wnh -0(' tr!ng gianfi--'(iat' -0('g. CC& 1p -0('
tr!ng gian vD &C& gia0 (iEn &wan Java 2D #P$ &!ang &]p &C& &jng nghE
&h0 viE& ,G 1H Cnh ,e &C& iT- vi (Z 1iE &wa nx tr0ng @u nh. KD- #P$
nD3 h\ trR &h0 viE& tr!3 nhp (Z 1iE! Wnh tng &C& Unh (eng 1! trZ ;hC&
nha! vD tha0 tC& vi (Z 1iE! Wnh !a vDi10ei phcp t0Cn 1&.
=.1 *2c "ia% di4n v3 c2c &p
CC& #P$ te0 Wnh -0(' tr!ng gian tr0ng Java 2DA #P$ &x thT
R& nhx- 1ei tr0ng :
Cata10g' *a!B CC& gia0 (iEn+ &C& 1p (Z 1iE! Wnh+ &C& 1p tha0 t0Cn tG Wnh+
&C& 1p -0('1 -!+ &C& 1p -0('1 -D!+ &C& ng0ei 1E f',&'pti0n*g.
httpBOOtai1i'!ha3.&0-
12:
Lp trnh ha trn Java 2D v 3D
2.(.( CMc $iao diPn i"a$in$ <i"a$in$ interfaces=
$nt'r6a&' D'*&ripti0n
>!66'r'($-ag'Mp /j tW &C& tha0 tC& vD0 n ra n th`& hiEn
trIn Qi tRng >!66'r'(i-ag'. [R& &Di t
@yi #66in'Tran*60r-Mp+ C010rC0nv'rtMp+
C0nv01v'Mp+ L00;!pMp vD .'*&a1'Mp.
.a*t'rMp [Unh nghha &C& tha0 tC& vD0 ra n th`& hiEn
trIn &C& ji tRng .a*t'r [R& &Di t @yi
#66in'Tran*60r-Mp+ >an(C0-@in'Mp+
C010rC0nv'rtMp+ C0nv01v'Mp+ L00;!pMp vD
.'*&a1'Mp.
.'n('r'($-ag' [Unh nghha gia0 tha& &h0 &C& Qi tRng &haa
h0& &x thT *Wn *inh (Z 1iE! Wnh tr0ng ;iT!
.a*t'r*
Lrita@1'.'n('r'($-ag
'
/y rung .'n('r'(i-ag'
[Unh nghha &a& gia0 tha& &h0 &C& xi tRng
&haa h0& *Wn *inh (Z 1iE! Wnh tr0ng ;iI!
.a*t'r &x thT R& tha3 i.
Ti1'M@*'rv'r [Unh nghha &C& Qi tRng -!Qn R& @C0 ;hi
trang thCi &hnh *wa &wa -ut
Lrita@1'.'n('r'(i-ag' tha3 i.
.
2.(.% CMc Np dE iPu Jnh<i"a$e &ata Casses=
C1a*'* D'*&ripti0n
>!66'r'(i-ag' /y rjng i-ag' &Di t Lrit'a@1'.'n('r'(i-ag'
/ut Wnh vi -ut @u E- (Z 1iE! &x thT tr!3 &p.
httpBOOtai1i'!ha3.&0-
12<
Lp trnh ha trn Java 2D v 3D
/ut >!66'r'(i-ag' &x -ut C010r/0('1 vD -ut
.a*t'r (Z 1iE! Wnh.
>3t'L00;!pTa@1' /y rung L00;!pTa@1'
/ut L00;!pTa@1' &haa &C& @3' (Z 1iE!.
Data>!66'r >a0 @& -ut ha3 nhi"! &C& -Wng (Z 1iE! &haa (Z
1iE! iT-. /\i -Wng R& gi 1D @an;
Data>!66'r>3t' /y rung Data>!66'r. /ut @u E- (Z 1iE! &haa &C&
@3t' (Z 1iE!. f (_ng tr0ng Java #(van&'(
i-aging #P$g
Data>!66'rint /y rung Data>!66'r f8ina1gg
/ut @u E- (Z 1iE! &haa (Z 1iE! *Q ng!3In fa
(_ng tr0ng Java #van&' i-aging #P$g
Data>!66'r2h0rt /y rung Data>!66'r f8ina1g
/ut @u E- (Z 1iE! &haa (Z 1iE! *Q ng!3In *h0rt
f (_ng tr0ng Java #(van&'( i-anging #P$g.
Data>!66'r42h0rt /y rung Data>!66'r f8ina1g
/ut @u E- (Z 1iE! &haa (Z 1iE! *Q ng!3In *h0rt
;hjng (]!.
i'rn'1 /ut -a trn -j tW &C&h nhp -ut (Z
1iE! vD &C& iT- @iIn &wa nx tC& ung Jn giC trU
&wa iT- tr0ng @u 1& C0nv01v'MP
L00;!pTa@1' /y rung M@N'&t
/ut @Wng Cnh ,e &C& giC trU tt (Z 1iE! iT- n
@Vng ti &C& giC trU -D!.
.a*t'r /ut -Wng &C& iT- gx& tt x @en &x thT nhn v"
&C& (Z 1iE! iT-. /ut .a*t'r &haa -ut Data>!66'r
vD -ut 2a-p1'/0('1.
2h0rtL00;!pTa@1' /y rung L00;!pTa@1'
/ut @Wng tha- &hiJ! &haa &C& (Z 1iE! *Q ng!3In
*h0rt
Lrita@1'.a*t'r /y rung .a*t'r
/ut .a*t'r &x thT &hnh *Ga.
httpBOOtai1i'!ha3.&0-
12=
Lp trnh ha trn Java 2D v 3D
2.(.* i"a$e Fperation Casses
C1a*'* D'*&ripti0n
#66in'Tran*60r-Mp CDi t B >!66'r'(i-ag'Mp+ .a*t'rMp
/ut 1p Unh nghha -ut @iJn i a66in' T th`&
hiEn -ut *` Cnh ,e t!3Jn tvnh tt &C& t0e u 2D
tr0ng -ut Wnh ng!n h0& .a*t'r *ang &C& t0e u
2D tr0ng Wnh v&h h0& .a*t'r. Lp nD3 &x thT th`&
hiEn &W Cnh ,e *0ng Cnh vD &C& phcp t0Cn @iJn i
1Cng gi"ng gn nh]t.
>an(C0-@in'Mp CDi t .a*t'rMp
D_ng -ut -a trn ,C& Unh+ tha0 tC& nD3 th`& hiEn
-ut *` ;Jt hRp t!3Jn tvnh t! H &wa &C& (Wi @an(
tr0ng -ut .a*t'r.
>!66'r'(i-ag'8i1t'r /y rung i-ag'8i1t'r
/ut i-ag'8i1t'r &!ng &]p -ut &C&h n giWn &wa
viE& *_ng -ut >!66'r'(i-ag'Mpft0Cn tG -ut
ng!n n O-ut v&h ng T 1& -ut
>!66'r'(i-ag' h0& .a*t'r.
C010rC0nv'rtMp CDi t >!66'r'(i-ag'Mp+ .a*t'rMp
Th`& hiIn *` &h!3Tn i (Z 1iE! -D! iT- th'0
iT- tr0ng Wnh ng!n.
C0nv01v'Mp CDi t >!66'r'(i-ag'Mp+ .a*t'rMp
D_ng -ut i'rn'1 T th`& hiEn &Wi thiEn Wnh ng!n.
/ut *` &Wi thiEn 1D -ut *` ta0 tC& ;hjng gian ni
&C& iT- &n @iIn vD0 R& nhsn @ui @yi -ut giC
trU i'rn'1 T te0 giC trU &wa iT- ra. i'rn'1 Unh
nghha -ut &C&h t0Cn h& !an hE giZa &C& iT-
tr0ng !an hE 1Cng gi"ng tr!ng gian &wa iT- vD0
vD iT- ra.
httpBOOtai1i'!ha3.&0-
129
Lp trnh ha trn Java 2D v 3D
L00;!pMp CDi t >!66'r'(i-ag'Mp+ .a*t'rMp
Th`& hiEn tha0 tC& tha- &hiJ! tt ng!n ti v&h.
Xi &C& .a*t'r+ &C& tha0 tC& tha- &hiJ! trIn &C& giC
trU -!+ &C& >!66'r'(i-ag'+ tha0 tC& tha- &hiJ!
trIn thDnh phn -D! vD thDnh phn a1pha.
.'*&a1'Mp CDi t >!66'r'(i-ag'Mp+ .a*t'rMp
Th`& hiEn viE& vY 1ei iT- @yi iT- fpi,'1 @3 pi,'1
r'*&a1ingg &wa (Z 1iE tr0ng Wnh ng!n @yi viE& nhsn
-\i giC trU iT- vi hE *Q vD *a! x thI- vD0 -ut
phn &hInh fan 066*'tg.
2.(.- Sa"pe /ode Casses
C1a*'* D'*&ripti0n
>an('(2a-p1'/0('1 /y rung C0-p0n'nt2a-p1'/0('1
f8ina1g
C!ng &]p tr!3 &p (Z 1iE! Wnh &haa
giQng nh &C& -! &haa nh nhZng
(Wi f@an(*g tr0ng &C& @an; riIng @iEt
&wa Data>!66'r. /ut iT- @a0 g-
-ut -! tt -\i (Wi f@an(g
C0-p0n'nt2a-p1'/0('1 /y rung 2a-p1'/0('1
C!ng &]p tr!3 &ep ti (Z 1iE! Wnh &haa
vi -\t -! &wa -jt iT- tsp tr!ng
tr0ng -\i phn tG riIng @iEt &wa
Data>!66'r. CC& 10ei &hn iT- ;hC&
nha! R& h\ trR
/!1tiPi,'1Pa&;'(2a-p1'/0('1 /y rung 2a-p1'/0('1
Pi,'1int'r1'av'(2a-p1'/0('1 /y rung C0-p0n'nt2a-p1'/0('1
C!ng &]p tr!3 nhp ti (Z 1iE! Wnh
&haa (Z 1iE! -! &h0 -\i iT- tr0ng
httpBOOtai1i'!ha3.&0-
150
Lp trnh ha trn Java 2D v 3D
&C& phn tG hiE! &hnh &wa -Wng (Z
1iE!+ vD t]t &W &C& phn tG tr0ng @an;
n &wa -ut Data>!66'r.
2a-p1'/0('1 /ut 1p trt! tRng Unh nghha -ut &
&hJ &h0 vik& ,!]t ra (Z 1iE! -! tt -ut
Wnh -D ;hjng @iJt &C&h (Z 1iE! R&
&haa tr0ng -ut Data>!66'r.
2ing1'Pi,'1Pa&;'(2a-p1'/0('
1
/y rung 2a-p1'/0('1
C!ng &]p tr!3 nhp ti (Z 1iE! Wnh
R& @W0 !Wn vi t]t &W &C& -! phb
th!u& vD0 &C& iT- riIng 1 gxi vD0
tr0ng -ut phn tG &wa -ut Data>!66'r.
Coor /ode Casses
C1a*'* D'*&ripti0n
C010r/0('1 CDi t 1p tr0ng *!Qt Unh nghha &C&
phng tha& &h0 viE& &h!3Tn i tt &C& giC
trU iT- Cnh ti &C& thDnh phn -D! nh +
,anh 1C &s3+ ,anh (a trzi fr'(+ gr''n+ @1!'g.
C0-p0n'ntC010r/0('1 /y rung C010r/0('1
/ut C010r/0('1 &x thT giZ -ut C010r2pa&'
&x thT tha3 i+ -ut -Wng &C& thDnh phn
-D! ang vi C010r2pa&'. Lp nD3 &x thT
R& (_ng T @iT! (ikn h! hJt &C& -0('1
-D! trIn h! hJt &C& 10ei thiJt @U h0e
f)raphi&*D'vi&'*g
httpBOOtai1i'!ha3.&0-
151
Lp trnh ha trn Java 2D v 3D
Dir'&tC010r/0('1 /y rung 1p Pa&;'(C010r/0('1 JDi1.1 .
/ut C010r/0('1 @iT! (ikn &C& giC trU &x
&C& thDnh phn -D! .)> nhng tr`& tiJp
tr0ng &C& @it &wa iT-. /0('1 -D! nD3
tng t` vi -ut r11 Tr!'C010r. .)>
C010r/0('1 -& Unh R& trW v" @yi
C010r/0('1.g't.)>('6a!1t nh -ut
Dir'&tC010r/0('1. in(',C010r/0('1
%,t'n(*B C010r/0('1
Pa&;'(C010r/0('1 /y rung C010r/0('1.
/ut C010r/0('1 trt! tRng @iT! (ikn &C&
giC trU iT- &x &C& thDnh phn nhng tr`&
tiJp tr0ng &C& @it &wa -ut iT-.
Dir'&tC010r/0('1 -y rung
Pa&;'(C010r/0('1 T h\ trR &C& iT- &haa
&C& thDnh phn -D! .)>.
2a-p1'/0('1 /ut 1p trt! tRng Unh nghha -ut & &hJ
&h0 vik& ,!]t ra (Z 1iE! -! tt -ut Wnh -D
;hjng @iJt &C&h (Z 1iE! R& &haa tr0ng
-ut Data>!66'r.
2.(.3 )xception Casses
C1a*'* D'*&ripti0n
i-agingMp%,&'pti0n /y rung .!nti-%,&'pti0n.
[a ra nJ! -ut tr0ng &C& phng tha&
>!66'r'(i-ag'Mp h0& .a*t'rMp ;hjng thT
,G 1H Wnh.
.a*t'r80r-at%,&'pti0n /y rung .!nti-%,&'pti0n.
httpBOOtai1i'!ha3.&0-
152
Lp trnh ha trn Java 2D v 3D
Te0 ra nJ! &x -ut thjng tin @Q trv ;hjng
hRp 1E tr0ng .a*t'r.
=.2 1!!ediate $%de i!a"in" *%ncepts
/0('1 te0 Wnh -0(' tr!ng gian h\ trR &C& phsn giWi &Q Unh &haa
tr0ng @u nh. /0('1 &ng h\ trR &C& tha0 tC& 1& trIn (Z 1iE! Wnh. /ut *Q
&C& 1p vD &C& gia0 (iEn R& (_ng tr0ng -0('1 nD3
Knh 9P1 >!66'r'(i-ag' vD &C& 1p h\ trR.
Sh hnh 9P1+ Bufferedi"a$e &!ng &]p viE& !Wn 1H Wnh &h!ng. /ut
Bufferi"a$e &x thT R& te0 tr`& tiJp tr0ng @u nh vD R& (_ng T giZ
vD tha0 tC& (Z 1iE! Wnh nhn tt -ut 6i1' h0& 4.L. /ut
Bufferedi"a$e &x thT R& hiTn th (_ng @]t &a Qi tRng Graphics%&
nD0 &h0 -ut thiJt @U -Dn hnh+ h0& 3 ti @]t &a v&h nD0 ;hC& (_ng
ngZ &Wnh tng thv&h Graphics%&. /ut Qi tRng Bufferedi"a$e &haa 2
Qi tRng ;hC&B -ut #aster vD -ut Coor/ode.
Lp #aster &!ng &]p !Wn 1H (Z 1iE! Wnh. Sx @iT! (ikn t0e u ('P&a&
&wa Wnh vD (!3 tr (Z 1iE! Wnh tr0ng @u nh+ vD &!ng &Cp -ut & &hJ &h0
httpBOOtai1i'!ha3.&0-
155
Lp trnh ha trn Java 2D v 3D
ta0 Wnh v nhi"! Wnh nh tt -ut @u E- (Z 1iE! Wnh n. Sx &ng &!ng
&]p &C& phng tha& &h0 viE& tr!3 &p &C& iT- ,C& Unh vi -ut
Wnhfi-ag'g. /ut i tRng #aster &haa hai Qi tRng ;hC&+ -ut
&ataBuffer vD -ut 2a-p1'/0('1.
Lp &ataBuffer giZ (Z 1iE! iT- tr0ng @u nh.
Lp Sa"pe/ode thT hiEn (Z 1iE! tr0ng @u E- vD &!ng &]p n0 nh
&C& iT- riIng rY h0& (Wi iT- &hZ nht.
i"a$e Pa&;ag' &!ng &]p thI- &C& 1p Unh nghha &C& tha0 tC& 1&
trIn &C& Qi tRng Bufferedi"a$e vD #aster. /i tha0 tC& ,G 1H Wnh
R& nhng tr0ng 1p &Di t gia0 (iEn Bufferedi"a$eFp+ gia0 (iEn
#asterFp+ h0& &W hai gia0 (iEn. 1p tha0 tC& Unh nghha &C& phng tha&
1& f6i1t'rg th`& hiEn tha0 tC& Wnh th`& *`.
Knh 9P2 -inh h0e -0('1 & @Wn &h0 Java 2DA #P$ i-ag' ,G 1H
Wnh.
CC& tha0 tC& h\ trR @a0 g-B
>iJn i #66in'
#-p1it!(' *&a1ing
L00;!pPta@1' -0(i6i&ati0n
Lin'ar &0-@inati0n 06 @an(*
C010r &0nv'r*i0n
httpBOOtai1i'!ha3.&0-
157
Lp trnh ha trn Java 2D v 3D
C0nv01!ti0n
Ch H rng nJ! @en thv&h hiTn thU vD tha0 tC& &C& Wnh+ @en &h &n
hiT! 1p Bufferedi"a$e vD &C& 1p tha0 tC& 1&. /t ;hC&+ nJ! @en &x H
Unh viJt &C& @u 1& h0& tr`& tiJp tr!3 nhp (Z 1iE! Wnh+ @en &n phWi
hiT! &C& 1p 1iIn !an vi Bufferedi"a$e.
2.%.( Ter"inoo$'
s3 &x vDi ;hCi niE- R& (_ng !a &C& thW0 1!n (i s3B
CC& phn tG (Z 1iE!PData %1'-'nt*B &C& 10ei ng!3In tQ (_ng nh 1D &C&
n vU 1! trZ (Z 1iE! Wnh. CC& Data '1'-'nt 1D &C& thDnh viIn riIng 1
&wa -ut -Wng Data>!66'r. >Q trv f1a30!tg&wa &C& phn tG tr0ng @u E- (Z
1iE! 1D u& 1p vi &C&h @iT! ikn &wa (Z 1iE! nh 1D &C& iT- @yi -ut
2a-p1'/0('1 &wa Wnh.
Cc #Gu F Sa#plesB CC& thDnh viIn riIng @iEt &wa &C& iT- &wa -ut
Wnh. /ut 2a-p1'/0('1 &!ng &]p -ut & &hJ &h0 viE& &h!3Tn i &C&
phn tG tr0ng Data>!66'r *ang &C& iT- vD &C& -! &wa nx. CC& -! &wa
-ut iT- &x thT @iT! (ikn &C& giC trU ng!3In th! tr0ng -0('1 -D! &b
thT. Xv (b+ -ut iT- tr0ng -0('1 -D! .)> @a0 g- 5 -! B r'(+ gr''n
vD @1!'.
Cc thHnh phIn F Co#ponentsB CC& giC trU &wa &C& iT- u& 1p vi
*` @iT! (ikn -D!. 2` phsn @iEt giZa thDnh phnf&0-p0n'ntg vD
-!f*a-p1'g 1D hZ! v&h vi in(',C010r/0('1+ ni -D &C& thDnh phn
iT- R& Cnh &h *Q *ang L00;!pTa@1'.
DJi F Kan'B Tp t]t &W &C& -! &wa -ut 10ei tr0ng -ut Wnh+ giQng nh
t]t &W &C& -! -D! h0& t]t &W &C& -! -D! ,anh 1C &s3. DZ 1iE! iT-
&x thT R& &haa tr0ng -ut *Q &C&h+ h\ trR hai tr0ng Java 2D #P$ ang
R& tb hp vD thI- vD0. L! trZ tp hRp t &ha& (Z 1iE! Wnh @yi &C& (Wi
f@an(*g+ vD -ut iT- R& trang @U -t (Z 1iE! -! tt vU trv -! vi
httpBOOtai1i'!ha3.&0-
159
Lp trnh ha trn Java 2D v 3D
-Wng n &haa t]t &W &C& iT-+ vD &C& (Wi @a0 g- tp &C& -! &_ng &h
*Q vU trv tr0ng -\i iT-.
Cc ngu&n tL F -ri#ariesB CC& thDnh viIn phsn @iEt &wa -ut giC trU
-D! tr0ng -ut -0('1 -D! ,C& Unh+ vv (b -0('1 .)> (eng &C& giC trU
-D! tt &C& ng!3In tQ r'(+ gr''n+ vD @1!'.
=.< Ksin" '9--eredi!a"es
Lp Bufferedi"a$e 1D 1p &hvnh h\ trR -0(' te0 Wnh tr!ng gian. Sx
&ng !Wn 1H -t Wnh tr0ng @u nh+ &!ng &]p &C& &C&h T 1! &C& (Z 1iE!
iT-+ @iT! (ikn (Z 1iE! iT-+ vD 3 (Z 1iE! iT- ti -ut )raphi&* h0&
ngZ &Wnh Graphics%&.
2.*.( Creatin$ a Bufferedi"a$e
[T te0 -ut Bufferedi"a$e+ gi Co"ponent.createi"a$et+ hD- nD3
trW v" -t Bufferedi"a$e &C& & tvnh vY &wa nx tng ang &C& thDnh
phn (_ng te0 nx. nh R& te0 1D ;hjng r + phn ni vD phn n"n
&x &C& -D! &wa &C& thDnh phn @en ;hjng thT hiE! &hnh u tr0ng &wa
-ut Wnh.>en &x thT (_ng ; th!t nD3 ;hi @en -!Qn 1D- g]p ji @u I-
vY Wnh &h0 *` ung tr0ng -ut thDnh phn.
pub*ic %raphics() create)emo%raphics()(%raphics
g& Q
%raphics() g( = nu**'
int width = get0ize(&.width'
int height = get0ize(&.height'
if (offimg == nu** UU offimg.getVidth(& P=
width UU
offimg.get1eight(& P= height& Q
httpBOOtai1i'!ha3.&0-
15:
Lp trnh ha trn Java 2D v 3D
offimg = (Bufferedimage& createimage(width,
height&'
2
if (offimg P= nu**& Q
g( = offimg.create%raphics(&'
g(.setBacWground(getBacWground(&&'
2
// .. c*ear can.as .. g(.c*ear$ect(+, +,
width, height&'
return
2
>en &ng &x thT te0 -ut Bufferedi"a$e trQng tr0ng @u nh (_ng
-ut vDi hD- te0 R& &!ng &]p.
2.*.% &ra1in$ in an Fffscreen Buffer
Lp Bufferedi"a$e &x thT !R& _ng T &h!n @U &C& phn tG h0e
;hjng hiITn thU f066*&r''n g*a! x &0p3 &hng ra -Dn hnh. i th!t nD3
hZ! v&h & @iEt ;hi -ut graphi& pha& tep h0& (_ng 1p 1ei. Xv (b+ nJ!
@en -!Qn hiTn thUhnh Wnh tinh vi tr0ng vDi 1n+ @en &x thT vY nx -ut 1n
tr0ng @u E- 066*&r''n vD *a! x &0p3 nx ti &C& vU trv ;hC& nha! trIn &Ga
*. >ng viE& vY &C& hnh -ut 1n vD viE& *a0 &hcp nx @en &x thT hiTn thU
h0e nhanh hn.
>ava.a1t pa&;ag' &x ;hW nVng (_ng &C& @u E- 066*&'a- @yi i"!
nD3 @en vY -ut Qi tRng Wnh &_ng &C&h -D @en vY ra &Ga *. T]t &W &C&
httpBOOtai1i'!ha3.&0-
15<
Lp trnh ha trn Java 2D v 3D
tvnh nVng 3 fr'n('ringg y Java 2DA #P$ &x thT R& (_ng ;hi vY &C&
Wnh 066*&r''n.
CC& @u E- 066*&r''n thzng R& (_ng &h0 h0et h0e. Xv (b+ @en &x
thT (_ng -ut @u E- 066*&r''n T vY -ut Qi tRng -ut 1n vD *a! x
&h0 nx &h!3Tn ung tr0ng -ut &Ga *. Tng t`+ @en &x thT (_ng -ut @u
E- 066*&r''n T &!ng &]p *` hi tiJp nh ;hi ngzi (_ng (i &h!3Tn -ut
hnh (_ng &h!ut. Tha3 vD0 viE& vY 1ei hnh tei -\i vU trv+ @en &x thT vY
hnh -ut 1n ra @u E- 066*&r''n vD *a! x &0p3 nx ti vU trv &h!ut nh
;hi ngzi (_ng thW &h!utf(rag th' -0!*'g.
Knh 9P54*ing an M66*&r''n >!66'r
Knh 9P5 -j tW &C&h -ut &hng trnh &x thT vY ra -ut 066*&r''n
i-ag' *a! x *a0 &hcp nx ra -ut &Ga * nhi"! 1n. Ln &!Qi &_ng Wnh
R& *a0 &hcp+ nx R& @iJn i. Ch H rng *` @iJn i Wnh tha3 &h0
viE& vY 1ei nx vi *` @iJn i &x thT ;Jt !W ;hjng R& th0W -n.
M.(.2.1 Creating an 1!!screen Ku!!er
httpBOOtai1i'!ha3.&0-
15=
Lp trnh ha trn Java 2D v 3D
CC&h n giWn nh]t T te0 ra -ut i-ag' -D @en &x thT (_ng nh -ut
066*&r''n @!66'r 1D (_ng phng tha& Co"ponent.createi"a$e.
>ng viE& te0 -ut i-ag' -D ;hjng gian -D! &wa nx+ *s!+ vD @Q trv
&C& iT- &hvnh ,C& vi &Ga * tr0ng x @en ang vY+ i-ag' &x thT R&
a ti f@1itt'(g thiJt @U h0e -ut &C&h hiE! !W. [i"! nD3 &h0 phcp
hD- (ra?i-ag' 1D- viE& nhanh &hxng.
>en &ng &x thT te0 -ut Qi tRng Bufferedi"a$e tr`& tiJp T (_ng nh
1D -ut 066*&r''n @!66'r. [i"! nD3 r]t hZ! v&h ;hi @en &n i"! ;hiTn !a
;iT! &wa 066*&r''n h0& tr0ng *!Qt.
Bufferedi"a$e h\ trR vDi ;iT! Unh nghha tr&B
T|P%5>|T%>).
T|P%7>|T%#>).
T|P%7>|T%#>).P.%
T|P%>|T%>iS#.|
T|P%>|T%).#|
T|P%>|T%iSD%r%D
T|P%C42TM/
T|P%iST#.)>P.%
T|P%iST#.)>
T|P%iST>).
T|P%iST.)>
T|P%42KM.T999.)>
T|P%42KM.T9:9.)>
T|P%iST).#|
/ut Qi tRng Bufferedi"a$e &x thT &haa -ut ;Inh a1pha. Tr0ng
hnh 9P5+ -ut ;Inh a1pha R& (_ng T phsn @iEt &C& v_ng R& vY vD
;hjng R& vY+ &h0 phcp -ut hnh (eng @]t !3 t^& ,!]t hiEn !a &C&
hnh -D @en vY ftr0ng trzng hRp nD3+ -ut hnh &hZ nht @xngg. Tr0ng
httpBOOtai1i'!ha3.&0-
159
Lp trnh ha trn Java 2D v 3D
vDi trzng hRp ;hC&+ @en &x thT (_ng -ut ;Inh a1pha T trun &C& -D! &wa
-ut Wnh -i vD0 nx tr0ng -ut Wnh tn tei.
ChN ; tr< -hi 3=n &>n +5t d? li@u Anh alpha &ho rB rng0 nh8 vCi
+5t hnh Anh d=ng 3Dt th8Eng 3iFu diGn trong hnh HI20 3=n nn trJnh
t=o +5t 35 @+ offs&ree+ alpha1 DKng alpha L nMi nN -hOng &>n l+
&h+ hi@u nPng render1
%raphi&s)onfiguration &ung &Dp &J& ph8Mng thQ& thun ti@n tR 5ng t=o
&J& 35 @+ Anh trong Snh d=ng t8Mng thT&h vCi &Du hnh &6a 3=n1 2=n
&Ung &N thF lDy vV &Du hnh ho= lin -Wt vCi thiWt 3S ho= trn N &Xa
sY tp trung F lDy thOng tin0 3=n &>n -hLi t=o +5t 7i t89ng
2ufferedi+age thT&h h9p
M.(.2.2 Dra/ing in an 1!!screen Ku!!er
[T vY tr0ng -ut @u E- Wnh+ )i Bufferi"a$e.&reate%raphi&sfg + tra
v" -ut Qi tRng Graphics%&. Xi Qi tRng nD3+ &x thT gi tCt &W &C&
phng tha& Graphics%& T vY &C& hnh Wnh ng!3In tQ+ t',t+ vD r'n('r
&C& hnh Wnh ;hC& tr0ng i-ag'. i th!t vY nD3 h\ trR viE& r!ng ung vD
&C& &Wi thiEn ;hC& R& &!ng &]p @yi 2D i-aging pa&;ag'.
[0en &0(' (i s3 -inh h0e *G (bng 066*&r''n @!66'ring B
pub*ic .oid update(%raphics g&Q
%raphics() g( = (%raphics()&g'
if(firstTime&Q
)imension dim = get0ize(&'
int w = dim.width'
int h = dim.height'
area = new $ectang*e(dim&'
bi = (Bufferedimage&createimage(w, h&'
big = bi.create%raphics(&'
httpBOOtai1i'!ha3.&0-
170
Lp trnh ha trn Java 2D v 3D
rect.setNocation(w/(X5+, h/(X(5&'
big.set0troWe(new Basic0troWe(Y.+f&&'
firstTime = fa*se'
2
// C*ears the rectang*e that was pre.ious*,
drawn. big.setCo*or(Co*or.white&'
big.c*ear$ect(+, +, area.width, area.height&'
// )raws and fi**s the new*, positioned
rectang*e to the buffer.
big.setaint(stroWeo*Wa&'
big.draw(rect&' big.setaint(fi**o*Wa&'
big.fi**(rect&'
// )raws the buffered image to the screen.
g(.drawimage(bi, +, +, this&'
2
2.*.* /anipuatin$ Bufferedi"a$e &ata &irect'
C_ng vi viE& vY Wnh tr`& tiJp tr0ng Bufferedi"a$e+ @en &x thT tr!3
&p tr`& tiJp vD ,G 1H (Z 1iE! iT- Wnh tr0ng 2 &C&h. ShZng &C&h nD3 hZ!
v&h nJ! ven ang &Di t gia0 (iEn @u 1& Bufferedi"a$eFp nh R&
-j tW tr0ng &hng ,G 1H vD &Wi thiEn Wnh.
>en &ng &x thT (_ng phng tha& Bufferedi"a$e.set(%2 T t
tr`& tiJp giC trU &wa -ut iT- h0& -ut -Wng &C& iT- ti -ut giC trU
.)> ,C& Unh. Ch H rng+ ;hjng &x *` 1a3 ung ;hi @en -0(i63 &C&
httpBOOtai1i'!ha3.&0-
171
Lp trnh ha trn Java 2D v 3D
iT- -ut &C&h tr`& tiJp. >en &ng &x thT ,G 1H (Z 1iE! iT- Wnh @yi viE&
,G 1H -ut Qi tRng Arita,e#aster 1iIn ;Jt vi -ut Bufferedi"a$e
2.*.- +iterin$ a Bufferedi"a$e
>en &x thT ang (bng -ut @u 1& &h0 -ut Bufferedi"a$e (_ng -ut
Qi tRng &Di t Bufferedi"a$eFp. XiE& 1& vD &C& 1p &!ng &]p gia0
(iEn 1& thW0 1!sn tr0ng phn rG 1H vD &Wi thiEn Wnh fi-ag' Pr0&'**ing
an( %nhan&'-'ntg.
2.*.2 #enderin$ a Bufferedi"a$e
[T r'n('r -ut @u E- Wnh vD0 tr0ng -ut ngZ &Wnh &b thT+ gi hD-
(ra?ia-g' &wa ngZ &Wnh &wa Qi tRng )raphi&*. Xv (b ;hi r'n('ring
tr0ng phng tha& Co"ponent.paint+ @en gi drai+agefg trIn Qi
tRng h0e tr!3"n &h0 phng tha&.
pub*ic .oid paint(%raphics g& Q
if (get0ize(&.width Z= + UU get0ize(&.height
Z= +&
return'
%raphics() g( = (%raphics()& g'
if (offimg P= nu** [[ is0howing(&& Q
g(.drawimage(offimg, +, +, this&'
2
2
Chng trnh vv (bB
httpBOOtai1i'!ha3.&0-
172
Lp trnh ha trn Java 2D v 3D
import \a.a.awt.]'
import \a.a.awt.e.ent.]'
import \a.a.app*et./pp*et'
import \a.a.awt.image.]'
pub*ic c*ass Buffered0hapeMo.er extends /pp*et Q
static protected Nabe* *abe*'
pub*ic .oid init(& Q
setNa,out(new BorderNa,out(&&'
add(new B0MCan.as(&&'
*abe* = new Nabe*(^?_t h`nh ch; nh<t na,
xung buanh .cng frame.^&'
add(^0outh^, *abe*&'
2
pub*ic static .oid main(0tring sKL& Q
drame f = new
drame(^Buffered0hapeMo.er^&'
f.addVindowNistener(new Vindow/dapter(& Q
pub*ic .oid
windowC*osing(Vindow!.ent e& Q
0,stem.exit(+&'
2
2&'
/pp*et app*et = new Buffered0hapeMo.er(&'
f.add(^Center^, app*et&'
httpBOOtai1i'!ha3.&0-
175
Lp trnh ha trn Java 2D v 3D
app*et.init(&'
f.pacW(&'
f.set0ize(new )imension(55+, (5+&&'
f.show(&'
2
2
c*ass B0MCan.as extends Can.as imp*ements
MouseNistener, MouseMotionNistener Q
$ectang*e rect = new $ectang*e(+, +, O++,
5+&'
Bufferedimage bi'
%raphics() big'
int *ast"x, *ast",'
boo*ean firstTime = true'
Textureaint fi**o*Wa, stroWeo*Wa'
$ectang*e area'
boo*ean press-ut = fa*se'
pub*ic B0MCan.as(& Q
httpBOOtai1i'!ha3.&0-
177
Lp trnh ha trn Java 2D v 3D
setBacWground(Co*or.white&'
addMouseMotionNistener(this&'
addMouseNistener(this&'
bi = new Bufferedimage(5, 5,
Bufferedimage.TY!"i#T"$%B&'
big = bi.create%raphics(&'
big.setCo*or(Co*or.pinW&'
big.fi**$ect(+, +, e, e&'
big.setCo*or(Co*or.c,an&'
big.fi**-.a*(+, +, f, f&'
$ectang*e r = new $ectang*e(+, +, 5, 5&'
fi**o*Wa = new Textureaint(bi, r&'
big.dispose(&'
bi = new Bufferedimage(5, 5,
Bufferedimage.TY!"i#T"$%B&'
big = bi.create%raphics(&'
big.setCo*or(Co*or.c,an&'
big.fi**$ect(+, +, e, e&'
big.setCo*or(Co*or.pinW&'
big.fi**-.a*(+, +, f, f&'
r = new $ectang*e(+, +, 5, 5&'
stroWeo*Wa = new Textureaint(bi, r&'
big.dispose(&'
2
pub*ic .oid mouseressed(Mouse!.ent e& Q
*ast"x = rect.x X e.getg(&'
httpBOOtai1i'!ha3.&0-
179
Lp trnh ha trn Java 2D v 3D
*ast", = rect., X e.getY(&'
if (rect.contains(e.getg(&, e.getY(&&& Q
updateNocation(e&'
2 e*se Q
Buffered0hapeMo.er.*abe*
.setText(^?Eu tihn 4_t con
tri *hn h`nh ch; nh<t .a Wjo.^&'
press-ut = true'
2
2
pub*ic .oid mouse)ragged(Mouse!.ent e& Q
if (Ppress-ut& Q
updateNocation(e&'
2 e*se Q
Buffered0hapeMo.er.*abe*
.setText(^?Eu tihn 4_t con
tri *hn h`nh ch; nh<t .a Wjo.^&'
2
2
pub*ic .oid mouse$e*eased(Mouse!.ent e& Q
if (rect.contains(e.getg(&, e.getY(&&& Q
updateNocation(e&'
2 e*se Q
Buffered0hapeMo.er.*abe*
httpBOOtai1i'!ha3.&0-
17:
Lp trnh ha trn Java 2D v 3D
.setText(^?Eu tihn 4_t con
tri *hn h`nh ch; nh<t .a Wjo.^&'
press-ut = fa*se'
2
2
pub*ic .oid mouseMo.ed(Mouse!.ent e& Q
2
pub*ic .oid mouseC*icWed(Mouse!.ent e& Q
2
pub*ic .oid mouse!xited(Mouse!.ent e& Q
2
pub*ic .oid mouse!ntered(Mouse!.ent e& Q
2
pub*ic .oid updateNocation(Mouse!.ent e& Q
rect.setNocation(*ast"x k e.getg(&,
*ast", k e.getY(&&'
if (checW$ect(&& Q
Buffered0hapeMo.er.*abe*.setText(^1`nh ch;
nh<t I .l trm n ^
k rect.getg(& k ^X ^ k
rect.getY(&&'
2 e*se Q
httpBOOtai1i'!ha3.&0-
17<
Lp trnh ha trn Java 2D v 3D
Buffered0hapeMo.er.*abe*
.setText(^?ong c3 gpng 45a
h`nh ra ngoai frame.^&'
2
repaint(&'
2
pub*ic .oid paint(%raphics g& Q
update(g&'
2
pub*ic .oid update(%raphics g& Q
%raphics() g( = (%raphics()& g'
if (firstTime& Q
)imension dim = get0ize(&'
int w = dim.width'
int h = dim.height'
area = new $ectang*e(dim&'
bi = (Bufferedimage& createimage(w,
h&'
big = bi.create%raphics(&'
rect.setNocation(w / ( X 5+, h / ( X
(5&'
big.set0troWe(new
Basic0troWe(Y.+f&&'
firstTime = fa*se'
2
httpBOOtai1i'!ha3.&0-
17=
Lp trnh ha trn Java 2D v 3D
big.setCo*or(Co*or.white&'
big.c*ear$ect(+, +, area.width,
area.height&'
big.setaint(stroWeo*Wa&'
big.draw(rect&'
big.setaint(fi**o*Wa&'
big.fi**(rect&'
g(.drawimage(bi, +, +, this&'
2
boo*ean checW$ect(& Q
if (area == nu**& Q
return fa*se'
2
if (area.contains(rect.x, rect.,, O++,
5+&& Q
return true'
2
int new"x = rect.x'
int new", = rect.,'
if ((rect.x k O++& q area.width& Q
new"x = area.width X rr'
2
if (rect.x Z +& Q
new"x = XO'
2
if ((rect., k 5+& q area.height& Q
httpBOOtai1i'!ha3.&0-
179
Lp trnh ha trn Java 2D v 3D
new", = area.height X sr'
2
if (rect., Z +& Q
new", = XO'
2
rect.setNocation(new"x, new",&'
return fa*se'
2
2
=.. $ana"in" and $anip9&atin" #asters
/ut Qi tRng Bufferedi"a$e (_ng -ut .a*t'r T !Wn 1H -Wng (Z
1iE! iT- 2 &hi"!. Lp #aster Unh nghha &C& trzng &h0 t0e u hE thQng
&wa WnhP u rung + u &a0+ vD gQ& t0e u. /ut Qi tRng .a*t'r t` nx (_ng
2 Qi tRng T !Wn 1H (Z 1iE! iT-+ -ut &ataBuffer vD -ut
Sa"pe/ode. &ataBuffer 1D Qi tRng 1! giZ (Z 1iE! iT- &h0 ra*t'r
&!ng &]p *` @iT! (ikn @In tr0ng &wa (Z 1iE! iT- tt &ataBuffer.

2.-.( Creatin$ a #aster
Tr0ng h! hJt &C& trzng hRp+ ;hjng &n phWi te0 -ut .a*t'r tr`&
tiJp+ @yi v -ut #aster R& &!ng &]p vi @]t &a Bufferedi"a$e @en te0
tr0ng @u nh. T!3 nhiIn+ -ut tr0ng nhZng hD- ;hyi te0 &wa
Bufferedi"a$e &h0 phcp te0 -ut #aster @yi tr!3"n vD0 tr0ng -ut
Arita,e#aster.
Lp #aster &!ng &]p -ut *Q *Wn *inh f6a&t0r3g hD- thnh &h0 te0 ra
&C& .a*t'r vi &ataBuffers vD Sa"pe/odes @en ,C& Unh. >en &ng &x
thT (_ng &C& @u *Wn *inh nD3 ;hi &Di t &C& 1p @u 1& #asterFp.
httpBOOtai1i'!ha3.&0-
190
Lp trnh ha trn Java 2D v 3D
2.-.% Parent and Chid #asters
Lp #aster ;Jt hRp H tyng &C& ra*t'r &ha vD &0n. [i"! nD3 &x thT &Wi
tiJn hiE! !W 1! trZ @ng viE& &h0 phcp te0 @]t ; *Q @u E- Wnh tt &_ng
-ut &ha. Cha vD &C& &0n &wa nx tha- &hiJ! ti &_ng -ut @u E- (Z 1iE!+
vD -\i &0n &x -ut fu 1E&hg 066*'t ,C&h Unh vD (anh gii &h Unh ti vU
trv Wnh &wa nx tr0ng @u E-. /ut &0n ,C& Unh &ha &wa nx !a @ng hD-
get!arentfg.
[T te0 ra -ut .a*t'r &0n f*!@ra*t'rg+ (_ng phng tha&
#aster.&reate"u3(aster. ihi te0 -ut *!@ra*t'r+ ,C& Unh v_ng &wa &ha
&wa nx -D nx &hiJ- vD ,C& Unh 066*'t &wa nx tt gx& t0e u &wa &ha.
1perations on a 2aster
Lp #aster Unh nghha -ut *Q &C&h T tr!3 &p tr`& tiJp &C& iT- vD
(Z 1iE! iT-. [i"! x r]t hZ! v&h ;hi ;hi @en &Di t gia0 (iEn #asterFp+
nx &!ng &]p @u 1& &]p vD ,G 1H (Z 1iE! &wa Wnh+ h0& ;hi &Di t @]t &a
-ut phng tha& nD0 -D &n th`& hiEn ,G 1H iT- y -a& th]p.
CC& phng tha& #aster.get!ixel &h0 phcp 1]3 v" -ut iT- riIng
@iEt+ nx trW v" nh 1D -ut -! riIng @iEt tr0ng -ut -Wng. CC& phng
tha& #aster.getDataZle+ents trW v" -ut phn tG th`& thi &b thT &wa (ikn
(Z 1iE! Wnh ;hjng thT hiEn tt &ataBuffer. Phng tha&
#aster.get"a+ple[\ trW v" -! &wa -ut iT- &b thT. Phng tha&
get"a+ples trW v" -ut (Wi f@an(g &h0 -ut v_ng &b thT &wa -ut i-ag'.
C_ng vi &C& phng tha& x+ Cng &x thT tr!3 &p (Z @u E- vD
-0('1 -! !a &C& @iJn thT nghiE- fin*tan&' varia@1'*g &wa 1p #aster .
CC& Qi tRng nD3 &!ng &]p thI- &C& &C&h tr!3 &p vD @iT! (ikn (Z 1iE!
iT- &wa .a*t'r.
2.-.- The Arita,e#aster Su,cass
Lp &0n Arita,e#aster &!ng &Cp &C& phng tha& T t (Z 1iE!
iT- vD &C& -!. #aster 1iIn ;Jt vi -ut Bufferedi"a$e th`& ra 1D -ut
httpBOOtai1i'!ha3.&0-
191
Lp trnh ha trn Java 2D v 3D
Arita,e#aster v &!ng &]p tr!3 &p 3 w T ,G 1H (Z 1iE! iT- &wa
nx.
=.= 1!a"e Data and Data'9--ers
&ataBuffer phb th!u& vD0 -ut #aster @iT! (ikn -ut -Wng &C& (Z
1iE! Wnh. ihi @en te0 -ut #aster tr`& tiJp h0& !a &C& hD- te0
Bufferedi"a$e+ @en ,C& Unh u rung vD &hi"! &a0 tr0ng &C& pi,'1+ &_ng
vi -ut Sa"pe/ode &h0 (Z 1iE! Wnh. CC& thjng tin x &ng R& (_ng
T te0 -ut &ataBuffer vi (Z 1iE! vD ;iT! vD ;v&h th& ph_ hRp.
Cx 5 1p &0n &wa &ataBuffer+ -\i 1p @iT! (ikn -ut 10ei ;hC& nha!
&wa -ut phn tG (Z 1iE!B
DataKu!!erK&te fr'pr'*'nt* =P@it va1!'*g
DataKu!!erint fr'pr'*'nt* 52P@it va1!'*g
DataKu!!erShort fr'pr'*'nt* 1:P@it va1!'*g
DataKu!!erUShort fr'pr'*'nt* !n*ign'( *h0rt va1!'*g
Sh Unh nghha tt tr&+ &C& phn tG 1D &C& thDnh phn rzi re& &wa
-Wng (Z 1iE! @u E-+ vD &C& thDnh phn h0& &C& -! 1D &C& giC trU rzi
re& ;Jt hRp vi nha! te0 nIn -ut iT-. Cx nhi"! &C&h Cnh ,e giZa ;iT!
&wa phn tG tr0ng -ut &ataBuffer vD ;iT! &wa iT- R& @iT! (ikn @yi
-ut Sa"pe/ode. CC& 1p &0n Sa"pe/ode &ng &x ;hW nVng &Di t
Cnh ,e vD &!ng &]p &C&h T 1]3 &C& iT- ,C& Unh tt -ut &ataBuffer &b
thT.
CC& hD- te0 &ataBuffer &!ng &]p &C& &C&h T te0 &C& @u E- vi
-ut & ,C& Unh vD -ut *Q &C& @an; ,C& Unh.
>en &x thT tr!3 &p (Z 1iE! &wa -ut Wnh tr0ng &ataBuffer -ut &C&h
tr`& tiJp+ @en &ng (k (Dng vD th!n tiEn 1D- i"! x hn !a &C& phng
tha& &wa &C& 1p .a*t'r vD Arita,e#aster.
httpBOOtai1i'!ha3.&0-
192
Lp trnh ha trn Java 2D v 3D
=.> Etractin" Pie& Data -r%! a @a!p&e$%de&
Lp trt! tRng Sa"pe/ode Unh nghha &C& phng tha& &h0
',tra&ting &C& -! &wa -ut Wnh -D ;hjng &n @iJt &C&h (Z 1iE! R& 1!
trZ y @In (i. Lp &!ng &]p &C& trzng &h0 viE& ghi 1ei &hi"! &a0 vD
&hi"! rung &W (Z 1iE! Wnh tr0ng &ataBuffer 1iIn ;It nx + vD &h0 viE& -j
tW *Q 1Rng &C& @an( vD ;iT! (Z 1iE! E-. CC& phng tha& 2a-p1'/0('1
&!ng &]p (Z 1iE! Wnh nh tpf&011'&ti0ng &C& iT-+ vi -\i iT- @a0 g-
&x -ut *Q &C& -! h0& &C& thDnh phn.
0ava.a1t.i"a$e pa&;ag' &!ng &]p nV- 10ei -0('1 -!B
Co#ponentSa#ple%o'el [R& (_ng T ',tra&t &C& iT- tt &C&
i-ag' &haa &C& -! (Z 1iE! tr0ng &C& phn tG -Wng (Z 1iE! riIng tr0ng
-ut @an; &wa -ut Data>!66'r
Kan'e'Sa#ple%o'el [R& (_ng T ',tra&t &C& iT- tt &C&
i-ag' &haa -\i -! tr0ng -ut phn tG (Z 1iE! riIng vi &C& @an( &haa
tr0ng -ut (3 &C& phn tG (Z 1iE!.
-ixelinterleave'Sa#ple%o'el [R& (_ng T ',tra&t &C& iT- tt
&C& i-ag' &haa -\i *a-p1' tr0ng -ut phn tG riIng vxi &C& iT- R&
1! tr0ng -ut (3 t!sn t` f*'!'n&'g &wa &C& phn tG (Z 1iE!.
%ulti-ixel-ac)e'Sa#ple%o'el [R& (_ng T ',tra&t &C& iT-
tt &C& ia-g' n @an( &haa nhi"! -! -ut &C& iT- tr0ng -ut phn tG
(Z 1iE!f !*'( t0 ',tra&t pi,'1* 6r0- *ing1' @an('( i-ag'* that *t0r'
-!1tip1' 0n'P*a-p1' pi,'1* in 0n' (ata '1'-'nt g.
Single-ixel-ac)e'Sa#ple%o'el!*'( t0 ',tra&t *a-p1'* 6r0-
i-ag'*
that *t0r' *a-p1' (ata 60r a *ing1' pi,'1 in 0n' (ata arra3 '1'-'nt in th'
6ir*t
@an; 06 a Data>!66'r.
DZ 1iE! iT- R& @iT! (ikn @yi Sa"pe/ode &x h0& ;hjng thT
1iIn !an tr`& tiJp ti -ut (Z 1iE! -D! @iT! (ikn -ut -0('1 -D! &b thT.
httpBOOtai1i'!ha3.&0-
195
Lp trnh ha trn Java 2D v 3D
phb th!u& vD0 (Z 1iE! ng!n. Xv (b+ tr0ng (Z 1iE! Wnh h0e ph0t0+ &C&
-! &x thT @iT! (ikn (Z 1iE! .)>. Tr0ng (Z 1iE! Wnh tt -ut thiJt @U Wnh 3
tJ+ &C& -! &x thT @iT! (ikn &C& 10ei (Z 1iE! ;hC& nha! gijng nh nhiEt u
h0& -t u ,ng.
Cx @a &at'g0r3 &wa &C& phng tha& &h0 tr!3 &p (Z 1iE! Wnh. CC&
phng tha& g'tPi,'1 trW v" &W -ut iT- tr0ng -ut -Wng+ vi -\i !
vD0 &h0 -\i -!. CC& phng tha& getDataZle+ent &!ng &]p tr!3 &p ti
(Z 1iE! thj+ ;hjng thT hiEn R& &haa tr0ng &ataBuffer. CC& phng
tha& get"a+ple &!ng &]p tr!3 nhp ti &C& thDnh phn iT- &h0 -ut @an(
,C& Unh.
=.L *%&%r$%de&s and *%&%r Data
C_ng vi .a*t'r &h0 !Wn 1H (Z 1iE! Wnh+ 1p Bufferedi"a$e @a0
g- -ut Coor/ode &h0 @iT! (ikn (Z 1iE! nh &C& giC trU iT- -D!.
Lp trt! tRng Coor/ode Unh nghha &C& phng tha& &h0 viE& t &C&
iT- &wa i-ag' -ut giC trU -D! tr0ng CoorSpace 1iIn ;Jt vi nx.
)xi 0ava.a1t.i"a$e &!ng &]p @Qn 10ei -0('1 -D!B
-ac)e'Color%o'el /ut C010r/0('1 trt! tRng @iT! (ikn &C&
giC trU iT- &x &C& thDnh phn -D! R& nhng tr`& tiJp tr0ng &C& @it &wa
-ut iT- ng!3In. Dir'&tC010r/0('1 1D -ut 1p &0n f*!@&1a**g &wa
Pa&;'(C010r/0('1.
DirectColor%o'el-ut C010r/0('1 @iT! (ikn &C& giC trU iT- &x
&C& thDnh phn -D! .)> R& nhng tr`& tiJp tr0ng &C& @it &wa iI-.
Dir'&tC010r/0('1 -0('1 tng t` vi -ut r11 Tr!'C010r vi*!a1.
Co#ponentColor%o'el-ut C010r/0('1 &x thT han(1' -ut
C010r2pa&' tha3 i vD -ut -Wng &C& thDnh phn -D! tng ang vi
C010r2pa&'.
in'exColor%o'el /ut C010r/0('1 @iT! (ikn &C& giC trU -D! vD0
tr0ng @Wn -D! tr0ng ;hjng gian -D! *.)>.
httpBOOtai1i'!ha3.&0-
197
Lp trnh ha trn Java 2D v 3D
D`a trIn (Z 1iE! tr0ng &ataBuffer+ Sa"pe/ode &!ng &]p
Coor/ode &h0 iT-+ Coor/ode *a! x @iT! (ikn nh -ut -D!.
2.?.( Lookup Ta,e
/ut @Wng tha- &hiJ! f100;!p ta@1'g &haa (Z 1iE! &h0 -ut h0& nhi"!
;Inh h0& &C& thDnh phn+ vv (b+ &C& -Wng riIng .+ ) vD >. )0i
0ava.a1t.i"a$e Unh nghha 2 ;iT! @Wng tha- &hiJ! -y rung 1p
L00;!pTa@1' trt! tRng+ -ut &haa @3t' (Z 1iE! vD -ut &haa *h0rt (ata
f>3t'L00;!pTa@1' an( 2h0rtL00;!pDatag.
=.M i!a"e Pr%cessin" and Enhance!ent
$-ag' pa&;ag' &!ng &]p -ut &p gia0 (iEn Unh nghha &C& tha0 tC&
trIn Bufferedi"a$e vD .a*t'r B Bufferedi"a$eFP vD #asterFp.
CC& 1p &Di t nhZng gia0 (iEn nD3 @a0 g- !ffineTransfor"Fp+
BandCo",ineFp+ CoorConvertFp+ ConvoveFp+ LookupFp+
#escaeFp. CC& 1p nD3 &x thT R& (_ng T @iJn i hnh h&+ 1D- -z+
1D- *^&+ thiEn u tng phWn+ ngng+ vD 1D- ng -D!.f @1!r+ *harp'n+
'nhan&' &0ntra*t+ thr'*h01(+ an( &010r &0rr'&t i-ag'*g.
Knh 9P7 -inh h0e phCt hiEn @iIn vD &Wi thiEn + -ut tha0 tC& 1D- @xng
+tha3 i tVng &zng u tr0ng -ut Wnh. PhCt hiEn @iIn thzng R& (_ng
tr0ng ,G 1H Wnh 3 tJ vD &C& ang (bng @Wn . PhCt hiEn @iIn R& (_ng
tVng u tng phWn giZa &]! tr& ;" tr0ng -ut Wnh+ &h0 phcp vi'?'r T
phsn @iEt &hi tiJt hn.
httpBOOtai1i'!ha3.&0-
199
Lp trnh ha trn Java 2D v 3D
8ig!r' 9P7 PhCt hiEn @iIn vD &Wi thiEn Wnh
[0en &0(' *a! s3 -inh h0e phCt hiEn @iInB

f*oatKL e*ements = Q +.+f, XO.+f, +.+f,
XO.+f, s.f, XO.+f,
+.+f, XO.+f, +.+f2'
...
Bufferedimage bimg = new
Bufferedimage(bw,bh,Bufferedimage.TY!"i#T"$%B&'
terne* Werne* = new terne*(f, f, e*ements&'
Con.o*.e-p cop = new Con.o*.e-p(Werne*,
Con.o*.e-p.!)%!"#-"-, nu**&'
cop.fi*ter(bi,bimg&'
Knh 9 P9 ('-0 ,G 1H @Wng tha- &hiJ!. rG 1H @Wng tha- &hiJ! &x thT
R& (_ng T tha3 &h0 &C& thDnh phn riIng 1 &wa -ut iT-.
Knh 9P9 rG 1H L00;!pPTa@1'
[0en &0(' *a! ('-0 tha0 tC& L00;!pPta@1'B
httpBOOtai1i'!ha3.&0-
19:
Lp trnh ha trn Java 2D v 3D
b,te re.erseKL = new b,teK(5uL'
for (int \=+' \Z(++' \kk&Q
re.erseK\L=(b,te&((5uX\&'
2
B,teNooWupTab*e b*ut=new B,teNooWupTab*e(+,
re.erse&'
NooWup-p *op = new NooWup-p(b*ut, nu**&'
*op.fi*ter(bi,bimg&'
Knh 9P: -inh h0e r'*&a1ing. 2escaling &x thT tVng h0& giW- &zng
u &wa t]t &W &C& iT-. 2escaling &x thT R& (_ng T tVng (Wi ung &wa
&C& Wnh t` nhiIn ;hC&+ a ra &hi tiJt tr0ng &C& v_ng t` nhiIn h0&
phng.
Knh 9P: .'*&a1ing
[0en C0(' (i s3 -inh h0e r'*&a1ingB
httpBOOtai1i'!ha3.&0-
19<
Lp trnh ha trn Java 2D v 3D
$esca*e-p rop = new $esca*e-p(O.5f, O.+f,
nu**&'
rop.fi*ter(bi,bimg&'
2.^.( _sin$ an i"a$e Processin$ Fperation
Convolution 1D !C trnh @In (i h! hJt &C& th0t t0Cn 1& ;hjng
gian. C0nv01!ti0n 1a !C trnh Cnh giC f?'ightingg h0& 1D- "!
fav'ragingg giC trU &wa -\i iT- tr0ng -ut Wnh vi &C& gva trU iT- 1sn
&n. [i"! nD3 &h0 phcp -\i iT- ra R& et @yi 1sn &n tr!ng gian
tr0ng &C&h -D( &x thT R& ,C& Unh vi -ut nhsn f;'rn'1g
Knh 9 P< -inh h0e C0nv01!ti0n
[0en - *a! -inh h0e &C&h (_ng -ut tr0ng &C& 1p ,G 1H hnh Wnh+
1p ConvoveFp. Tr0ng vv (b nD3+ -\i iT- tng Wnh ng!n R& 1D-
&sn @ng vi = iT- ,!ng !anh nx.
f*oat weight = O.+f/r.+f'
f*oatKL e*ements = new f*oatKrL' // create
() arra,
// fi** the arra, with nine ebua* e*ements
for (i = +' i Z r' ikk& Q
e*ementsKiL = weight'
2
httpBOOtai1i'!ha3.&0-
19=
Lp trnh ha trn Java 2D v 3D
// use the arra, of e*ements as argument
to create a terne*
pri.ate terne* m,terne* = new terne*(f, f,
e*ements&'
pub*ic Con.o*.e-p simp*eB*ur = new
Con.o*.e-p(m,terne*&'
// sourceimage and destimage are instances
of Bufferedimage
simp*eB*ur.fi*ter(sourceimage, destimage& //
b*ur the image
>iJn si"peBur &haa -ut thT nghiE- -i &wa ConvoveFP &Di t
t0Cn tG @1!r trIn -ut Bufferedi"a$e h0& -ut #aster. )iW Unh rng
*0!r&'i-ag' vD ('*ti-ag' 1D 2 thT nghiE- &wa Bufferedi"a$e. ihi @en
gi 6i1t'r+ &C& phng tha& &hvnh &wa 1p ConvoveFp t giC trU &wa -\i
iT- tr0ng Wnh v&h @yi viE& @ng giC trU tr!ng @nh &wa = iT- ,!ng
!anh iT- tng ang vi nx tr0ng Wnh ng!n.
Shsn &0nv01!ti0n tr0ng vv (b nD3 &x thT R& @iT! (ikn @yi -a trn
(i s3+ vi &C& phn tG ,C& Unh ti 7 phnB
ihi -ut Wnh R& v0nv01v'(+ giC trU &wa -\i iT- tr0ng Wnh v&h
R& tvnh t0Cn @i viE& (_ng -ut nhsn nh 1D -ut tp vi tr!ng @nh &wa
&C& giC trU ,!ng !anh -\i iT- tng ang tr0ng Wnh ng!n. XiE& ,G 1H
nD3 R& th`& hiEn (`a trIn -\i ;Inh &wa Wnh.
httpBOOtai1i'!ha3.&0-
199
Lp trnh ha trn Java 2D v 3D
Cjng tha& *a! @iT! (ikn &C&h &C& trng *Q tr0ng nhsn R& 1iIn hE vi
&C& iT- tr0ng Wnh ng!n ;hi th`& hiEn &0nv01!ti0n. /\i giC trU tng
nhsn R& ti'( ti &C& vU trv tr0ng hnh Wnh.
)iC trU &wa iT- v&h tng tng &C& ;Jt !W &wa trng *Q tr0ng nhsn
R& nhsn vi giC trU &wa &C& iT- ng!n tng ang. Xi nhi"! @u 1&
n giWn+ ;'rn'1 1D -ut -a trn v!jng
C0nv01!ti0n ;'rn'1 tr0ng vv (b nD3 1iIn !an n giWn. Sx 0
f?'ight*g -\i iT- tt hnh Wnh ng!n @yi &hn -ut nhsn 0 f?'ight*g
Wnh ng!n y -a& &a0 hn h0& th]p hn+ -ut &hng trnh &x thT tVng
h0& giW- &zng u &wa Wnh v&h. [Qi tRng 8erne+ R& t tr0ng ;hyi
te0 &wa ConvoveFP + ,C& Unh ;iT! @u 1& nx th`& thi. >yi viE& t &C&
gva trU ;hC&+ @en &x thT th`& hiEn &C& ;iT! &0nv01!ti0n ;hC& nha! @a0 g-
@1!rring fnh )a!**ian @1!r+ ra(ia1 @1!r+ vD -0ti0n @1!rg+ *harp'ning+ vD
*-00thing
Knh 9P= -inh h0e *harp'ning (_ng C0nv01!ti0n.
Knh 9P= 2harp'ning ?ith C0nv01!ti0n
[0en &0(' (i s3 -inh h0e *harp'ning vi
f*oatKL e*ements = Q +.+f, XO.+f, +.+f,
httpBOOtai1i'!ha3.&0-
1:0
Lp trnh ha trn Java 2D v 3D
XO.+f, 5.f, XO.+f,
+.+f, XO.+f, +.+f 2'
...
terne* Werne* = new terne*(f,f,e*ements&'
Con.o*.e-p cop = new Con.o*.e-p(Werne*,
Con.o*.e-p.!)%!"#-"-,
nu**&'
cop.fi*ter(bi,bimg&'
httpBOOtai1i'!ha3.&0-
1:1
Lp trnh ha trn Java 2D v 3D
Chng 5
67u !8
XY Wnh -D! 1D -ut tr0ng nhZng thDnh phn n"n tWng &wa &C& hE thQng
ha vD nx 1!jn 1D ng!n gQ& &wa *` pha& tep tr0ng nhZng j hnh te0
Wnh.Th viEn Java 2DA #P$ &!ng &]p
2` h\ trR &h0 *` te0 Wnh -D! &h]t 1Rng &a0 nhng 1ei (k (Dng *G (bng
CC& 1p !Wn 1H -D! tr0ng Java 2D #P$ gj- CororSpace+ Coor.
/ut CoorSpace @iT! (ikn &h0 -ut hE thjng &h0 viE& Unh 1Rng
-D!+ TiI! @iT! nh @iT! (ikn @ng 5 giC trU *Qf.)>g hV& &C& thDnh
phn.. Lp CoorSoace &haa &C& phng tha& &h0 &h!3Tn i &C& ;hjng
gian -D! vD hai ;hjng gian -D! &h!n 1D Ci%| vD ).>.
/ut Coor 1D -ut -D! &Q Unh a R& ,C& Unh tr0ng Unh nghha
&wa &C& thDnh phn &wa nx tr0ng -ut CoorSpace &b thT. [T vY -ut
Shape vi -ut -D!. &hng hen -D! . @en phWi tr!3"n -t Qi tRng&
Coor @I! (ikn -D! vi ngZ &Wnh h0e 2D. C010r R& inh nghha
tr0ng 0ava.a1t.Coor/ode -iI! tW -ut &C&h &b thT nhZng iT- R&
Cnh ,e ti &C& -D!.
Coor/ode `0& hE tiI! @iT! vi -ut i-ag' h0& -ut >u E- hnh
Wnhf>!66'ri-ag'g vD &!ng &]p thjng tin &n thiIt thv& hRp T @iT! (ikn
&C& gva trU I-. Coor/ode R& Unh nghha tr0ng 0ava.a1t.i"a$e
httpBOOtai1i'!ha3.&0-
1:2
Lp trnh ha trn Java 2D v 3D
>.1 *2c &p
C1a*'* D'*&ripti0n
C010r2pa&' $('nti6i'* th' &010r *pa&' 06 a C010r 0@N'&t+
$-ag'+ >!66'r'($-ag'+ 0r )raphi&*D'vi&'.
Ka* -'th0(* t0 tran*60r- @'t?''n .)> an(
C$%r| &010r *pa&'*.
$CCC010r2pa&' %,t'n(*B C010r2pa&'
.'pr'*'nt* ('vi&'Pin('p'n('nt an( ('vi&'P
('p'n('nt &010r *pa&'* @a*'( 0n th' $CC
Pr06i1' 80r-at 2p'&i6i&ati0n.
$CCPr06i1' # r'pr'*'ntati0n 06 &010r pr06i1' (ata 60r
('vi&' in('p'n('nt an( ('vi&' ('p'n('nt
&010r *pa&'* @a*'( 0n th' $CC Pr06i1'
80r-at 2p'&i6i&ati0n.
$CCPr06i1')ra3 %,t'n(*B $CCPr06i1'
# r'pr'*'ntati0n 06 &010r *pa&' t3p' gra3.
$CCPr06i1'.)> %,t'n(*B $CCPr06i1'
# r'pr'*'ntati0n 06 &010r *pa&' t3p' .)>.
>.2 BhNn" Inh n"hOa vC !9 sPc.
/ut Coor/ode R& *G (bng T @iT! (ikn -ut (Z 1iE! (iT- tr0ng
Wnh. [i"! nD3 @a0 g- &W Cnh ,e &C& thDnh phn tr0ng nhZng (Wif@an(*g
&wa -ut Wnh ti &C& thDnh phn &wa -ut ;hjng gian -D! &b thT. Sx &x thT
&ng @a0 hD- &W ,!]t &C& thDnh phn iT- tt -ut (Z 1iE! (iT- (xng gxi
ha3 nhn v" nhi"! thDnh phn tt -ut (Wi n @ng *G (bng &C& -t ne. vD
&h!3Tn (Z 1iE! iT- !a -ut @Wng tha- &hiJ!f100;!p ta@1'g
[T ,C& Unh R& giC trU -D! &wa -ut iT- &b thT tr0ng Wnh @en phWi
@iJt &C& - h0C thjng tin &h0 -\i iT-. Coor/ode 1iIn hE vi -ut Wnh
*Y xng gxi (Z 1iE! vD &C& phng tha& &n thiJt &h0 viE& &h!3Tn i giC
trU iT- ti vD tt &C& n vU thDnh phn -D!.
httpBOOtai1i'!ha3.&0-
1:5
Lp trnh ha trn Java 2D v 3D
Java 2DA #P$ &!ng &]p 2 &010r -0('1 va thI- vD0 &irectCoor
/ode vD indexCoor/ode R& Unh nghha tr0ng JDi 1.1 r'1'a*'.B
Co"ponentCoor/ode &0 thT giZ -ut CoorSpace ;hjng hen
&hJ vD -ut -Wng thDnh phn -D! ang vi CoorSpace. /0('1 nD3 &x thT
*G (bng T @iT! (ikn h! hJt &C& -0('1 -D! trJn h! hJt &C& 10ei ThiJt @U
h0ef)rphi&*D'vi&'* g.
PackedCoor/ode 1D 1p & *y &h0 &C& -0('1 @iT! (ikn giC trU
iT- @a0 g- &C& thDnh phn -D! nhng tr`& tiJp tr0ng &C& @it &wa -ut
iT- ng!3In.
PackedCoor/ode &haa &a& thjng tin gxi -j tW &C&h &C& thDnh phn
-D! vD a1pha R& ,!]t ra tt -ut ;Inh. [ir'&tC010r/0('1 tr0ng JDi 1.1
r'1'a*' 1a -ut Pa&;'(C010r/0('1.
3.%.( 8h`n$ $ian "u
[Qi tRng CoorSpace @iT! (ikn -ut hE thQng &h0 viE& Unh 1Rng
&C& -D!+ tiI! @iT! nh viE& *G (bng 5 giC trU *Q riIng @iEt.Xv (b .)>+
C/|i 1D &C& ;hjng gian -D!.fC010r2pa&'g.
/ut Qi tRng CoorSpace (_ng nh 1D th -ut &010r*pa&' ,C& Unh
;hjng gian -D! &b thT &wa Qi tng -D! h0& !a -ut Qi tRng
Coor/ode + &wa -ut i-a' + -ut Bufferedi"a$e+ h0& -ut
GraphicsConfi$uration. CoorSpace &!ng &]p &C& phng tha& &h!3Tn
i &C& -D! tr0ng ;hjng gian ,C& Unh ti vD tt .)> vD ti vD tt ;hjng
gian Ci%r|.
T]t &W Qi tRng CoorSpace phWi &x thT Cnh ,e -ut -D! tt ;hjng
gian @iT! (ikn *ang *.)> vD &h!3Tn i -ut -D! *.)> *ang ;hjng gian
@iT! (ikn -D! x. X -\i C010r &haa -ut Qi tRng CoorSpace t
tzng -inh h0& -& Unh. -\i C010r &ng &x thT &h!3Tn tt *.)>+ /\i
GraphicsConfi$uration (R& 1iIn hE vi -ut Qi tRng C010r2pa&' ;hi
&x R& 1iIn hE vi CoorSpace. /ut -D! R& ,C& Unh tr0ng @]t &a
httpBOOtai1i'!ha3.&0-
1:7
Lp trnh ha trn Java 2D v 3D
;hjng gian -D! nD0 &!ng &x thT hiTn thU R& @yi @]t &a thiJt @U nD0 @yi
viE& Cnh ,e nx ti *.)> nh -ut ;hjng gian -D! tr!ng gian.
CC& phng tha& R& (_ng &h0 !C trnh nD3 1D to(%2fg vD
fro+(%2fg+ to(%2 &h!3Tn -ut C010r tr0ng ;hjng gian -D! ti -ut -D!
tr0ng *.)> 6r0-.)> nhn -ut -D! tr0ng *.)> vD &h!3Tn nx *ang
;hjng gian -!
/& (_ viE& Cnh ,e !a *.)> 1!jn th`& hiEn nhng nx ;hjng 1!jn
1!jn 1a phCp tQt nh]t.
Xv (b. *.)> ;hjng thT @iT! (ikn -i -D! tr0ng &W giWi -D! Ci%r|.
SJ! -ut -D! `& ,C& Unh tr0ng -ut vDi ;hjng gian &x giWi ph
-D! ;hC& nha! hn *.)>
Th viE& *G (bng *.)> nh 1D -ut ;hjng gian tr!ng gian vD y x @U -]t
thjng tin. T giWi !3Jt v]n " nD3+ 1p CoorSpace &x thT Cnh ,e &C&
-D! ti vD tt ;hjng gian -D! ;hC& + nh Ci%r|r
CC& phng tha& t0Ci%r| vD 6r0-Ci%r| Cnh ,e giC trU -D! tt
;hjng gian -D! ti ;hjng gian ;hC& fCi%r|g. CC& phng tha& nD3 @
trR &h!3Tn i giZa hai ;hjng gian -D! @]t ; vi -t u vD &]p u &a0+
vi -ut C010r -ut 1&.T!3 nhiIn &ng hi vng rng &Di t Java 2D #P$
*' @ trR &h0 &h!3Tn i vi hiE! nVng &a0 (`a trIn hE thjng !Wn 1H
-D!+ tha0 tC& trIn t0Dn Wnh.f r'- C010rC0nv'rtMp tr0ng i-aging trang
:<g
Knh :P1 vD :P2 -inh h0e !C trnh tran*1ating -ut -D! R& ,C&
Unh tr0ng ;hjng gian -D! C/|i T hiTn thU trIn -Dn hnh .)>. Knh
:P1 @iT! (ikn -apping !a *.)>. Sh hnh -inh h0e+ *` &h!3Tn i &wa
-D! C/|i *ang -D! .)> ;hjng &hvnh ,C& @yi *` ;hjng tng ang
h0Dn t0Dn.
T]t nhiIn+ nhZng -D! R& *G (bng tr0ng &C& nD3 -ang tvnh &h]t
@iT! -inh h0e vD ;hjng &hvnh ,C&. ShZng iI- -D! *Y ;hjng R&
httpBOOtai1i'!ha3.&0-
1:9
Lp trnh ha trn Java 2D v 3D
Cnh ,e ng giZa &C& ;hjng gian -D! trt ;hi &x -ut *` &h!3Tn i ;hjng
gian ph_ hRp R& *G (bng.
Knh :P2 @iT! (ikn &_ng !C trnh *G (bng Ci%r| nh 1D ;hjng
gian -D! &h!3Tn i. ihi Ci%r| R& *G (bng+ -D! R& &h!3Tn !a
-ut &C&h ang ^n.
CoorSpace 1a th`& ra 1D -ut 1p trt! tRng. Java 2D #P$ &!ng &]p
*` &Di t iCCPr06i1' 1p (`a trIn (Z 1iE! iCC Pr06i1' nh R& @iT!
(ikn @yi 1p iCCPr06i1'. >en &x thT Unh nghha 1p &0n &wa @en T @iT!
(ikn &C& ;hjng gian -D! &h!3Tn i -ikn 1D &C& phng tha& R& thW0
1!n trIn R& &Di t. T!3 nhiIn h! hJt &C& ('v'10p'r* &x thT *G (bng
-ut &C&h n giWn 1p CoorSpace -& Unh h0& &C& ;hjng gian -D!
R& @iT! (ikn @yi &C& iCC Pr06i1'* thjng thzng+ giQng nh &C& thjng
tin &h0 -Dn hnh vD -C3 in+ h0& thjng tin R& nhang tr0ng (Z 1iE! Wnh.
CoorSpace tr0ng trang 90 -iI! tW &C&h Qi tRng CoorSpace @iT!
(ikn -ut ;hjng gian -D! vD @iT! (ikn &C& -D! tr0ng ;hjng gian -D! &x
thT Cnh ,e ti vD tt -ut ;hjng gian &h!3Tn i. CC& hE thQng !Wn 1H
-D! thzng R& *G (bng T giZ Cnh ,e giZa &C& ;hjng gian -D!. TiI!
httpBOOtai1i'!ha3.&0-
1::
Lp trnh ha trn Java 2D v 3D
@iT! nh hE thjng !Wn 1H -D! fC/2g !Wn 1H &C& thjng tin iCC fiCC
pr06i1'*g nx gijng nh Qi tRng C010r2pa&' iCC pr06i1'* -j tW -ut
;hjng gian vD0 vD ;hjng gian ;Jt nQi+ vD Unh nghha &C&h Cnh ,e giZ
&hng. KE thQng !Wn 1H -D! r]t tQt y viE& &h ra &C&h Cnh ,e -ut -D!
R& g^n vi -ut pr06i1' vD0 tr0ng ;hjng gian -D! &wa -ut pr06i1' ;hC&.
Java 2D #P$ Unh nghha -ut 1p gi 1D iCCPr06i1' giZ (Z 1iE! &h0
-ut @u &h!3Tn i iCC pr06i1'. iCCC010r2pa&' 1D -ut *` &Di t &wa 1p
trt! tRng C010r2pa&'. CC& Qi tRng iCCC010r2pa&' &x thT R& ;hyi
te0 tt &C& iCCPr06i1'.fCx -ut *Q gii hen ;hjng phWi t]t &W &C& iCC
Pr06i1' 1D thv&h hRp &h0 viE& Unh nghha -ut
iCCC010r2pa&'giCCPr06i1' &x vDi 1p &0n tng ang vi &C& 10ei
;hjng gian -D! nh iCCPr06i1'.)> vD iCCPr06i1')ra3. /\i 1p &0n
&wa nx &x -ut ;hjng gian vD0 R& Unh nghha thv&h hRpfgijng nh
;hjng gian .)>g vD ;hjng gian ;Jt nQi thv&h hRp f;hjng gian Ci%r|g.
Java 2D #P$ &x thT *G (bng hE thjng n"n C/2 fp1at60r-* C/2 g T tr!3
nhp &C& thjng tin -D! &0 nhi"! 10ei thiJt @U a (eng gijng nh
*&ann'r +-C3 in+ -Dn hnh. Cng &x thT *G (bng C/2 T t- *` Cnh ,e
tQt nh]t giZa &C& pr06i1'*
3.%.( BiQu dian "u
Lp Coor &!ng &]p *` -j tW -D! tr0ng ;hjng gian -D! &b thT. -ut
thT nghiE- &wa Coor &haa giC trU &C& thDnh phn -D! vD -ut Qi tRng
CoorSpace. >yi -ut Qi tRng C010r2pa&' &x thT R& ,C& Unh thI-
vD0 &C& thDnh phn -D! ;hi -ut thT nghiE- -i &wa -D R& te0 ra nIn
1p Coor &x thT giZ &C& -D! tr0ng @]t &a ;hjng gian -D! nD0.
Lp Coor &x -ut *Q phng tha& @ trR &h0 ;hjng gian -D! &h!n
.)> R& gi 1D *.)>ftha- ;hW0 httpBOO ???. L5.
0rgOp!@O???O)raphi&*O&010rO*.)>.ht-1g. *.)> 1a ;hjng gian -D! -&
Unh &h0 Java 2D #P$. Xai hD- ;hyi te0 R& Unh nghha @yi 1p Coor
httpBOOtai1i'!ha3.&0-
1:<
Lp trnh ha trn Java 2D v 3D
&h0 phcp @ !a tha- *Q CoorSpace. CC& ;hyi te0 nD3 -& Unh rng
giC trU -D! .)> R& Unh nghha tr0ng *.)>+ vD *G (bng thT nghiE-
-& Unh &wa CoorSpace T @iT! (ikn &h0 ;hjng gian x.
Java 2D #P$ (_ng *.)> te0 th!n 1i &h0 &C& 1p trnh viIn 1p trnh
ang (bng+ ;hjng phWi 1D tha- &hiJ! ;hjng gian -D! &h0 *` &h!3Tn i
-D!. Shi"! ang (bng &hw 3J! tp tr!ng vD0 anh .)> vD -Dn hnh vD viE&
Unh nghha ;hjng gian -D! .)> 1a- &h0 viE& viJt &hng (k (Dng hn.
Lxp C010r2pa&' Unh nghha &C& phng tha& to(%2 vD fr]+%2 1D- &h0
&C& ('v'10p'r* &x thT nhn &C& -D! -ut &C&h k (Dng tr0ng ;hjng gian
&h!n nD3. CC& phng tha& nD3 ;hjng -0ng Ri *G (bng &h0 -D! vi u
&hvnh ,C& &a0 ha3 viE& &h!3Tn i. f,'- C010r2pa&' trang 90 g
[T te0 ra -ut -D! f&010rg tr0ng -ut ;hjng gian -D! ;hjng phWi 1D *.)>+
@an (_ng hD- te0 Coor vi Qi tRng CoorSpace vD -ut -Wng *0 th`&
@iT! (ikn &C& thDnh phn -D! tng ang vi ;hjng gian x. [Qi tRng
CoorSpace ,C& Unh ;hjng gian -D!.
[T hiTn thU -ut hnh &hZ nht ng -D! giQng nh -D! &3an+ @en
&n -ut &C&h T -j tW -D! nD3 &h0 hE thQng. Cx -ut *Q &C&h ;hC& nha!
T -j tW -ut -D!+ vv (b -ut -D! &x thT R& -j tW @ng -ut tp hRp
&C& thDnh phn f.)>g fr'(g+ ,anh 1C &s3fgr''ng+ ,anh (a trzif@1!'g ha3
tp hRp &C& thDnh phnfC/|ig C3an+ /ag'nta+ |'110?+ >1a&; . CC& ;
th!t ;hC& nha! nD3 &h0 viE& ,C& Unh -D! R& gi 1D &C& ;hjng gian
-D! f&010r *pa&'*g.
Sh @en @iJt+ &C& -D! trIn -ut -Dn hnh -C3 tnh R& te0 @yi *` pha
trun 1Rng ;hC& nha! &wa @a thDnh phn f.'(g+ ,anh 1C &s3 f)r''ng+ ,anh
(a trzi f>1!'g. X thJ nIn (_ng ;hjng gian -D! .)> 1D- &h!n &h0 vY Wnh
trIn -an hnh -C3 tvnh. Tng t`+ !C trnh in 7 -D! (_ng &3an+ -ag'nta+
3'110?+ @1a&; T te0 ra -D! trIn trang gis3 in +&C& -D! in R& ,C& Unh
@ng t 1E phn trV- tr0ng ;hjng gian -D! C/|i.
httpBOOtai1i'!ha3.&0-
1:=
Lp trnh ha trn Java 2D v 3D
[T thv&h hRp vi *` ph @iJn &wa &W -Dn hnh vD -C3 in -D!+ &W hai
;hjng gian -D! .)> vD C/|i R& (_ng T @iT! (ikn -D!. T!3 nhiIn+
&W 2 10ei ;hjng gian -D! &x -ut hen &hJ 1D phb th!u& thiJt @U. -`& &-
the&hf&3ang R& *G (bng @yi -ut -C3 in &x thT ;hjng tng ang vi
-`& &3an &wa -ut -C3 in ;hC&. Tng t`+ -ut -D! @iT! (ikn @ng -ut
-D! .)> &x thT trjng gijng -D! ,anh (a trzi f@1!'g trIn -ut -Dn hnh
vD -D! tva fp!rp1i*hg trIn -ut -Dn hnh ;hC& .
%apping Colors Eua s20K vH Ci,OPQ
Java 2D #P$ (_ng .)> vD C/|i 1a 2 10ei ;hjng gian -D!. /ut
-0('1 -Dn hnh phjt ph0 &b thT ,C& Unh -ut ;hjng gian -D! .)> &wa
nx. Tng t`+ -jt -0('1 -C3 in &ng &x ;hjng gian C/|i &wa nx.
ihjng gian ;hC& nha! + ihjng gian .)> h0& ;hjng gian C/|i &x thT
1iIn hE vi nha! !a ;hjng -D! gian u& 1p thiJt @U
CC& &h!n &h0 viE& ,C& inh -D! u& 1p thiJt @U R& Unh nghha
@yi int'rnati0na1 C0--i**i0n 0n i11!-inati0n fCi%g. ihjng gian -D! u&
1p thiJt @U thzng `& (_ng nh]t 1D ;hjng gian 5 thDnh phn -D!
fthr''P&0-p0n'nt r| g R& phCt triTn @yi Ci%. ihi @en ,C& Unh -ut
-D! (_ng Ci%r|+ @en R& &C&h 13 vi u& 1p thiJt @U.
Tht ;hjng -a3 -^n+ ;hjng phWi 1& nD0 &ng (_ng ;hjng gian -D!
Ci%r|+ &x -ut *Q 1H (0 &h0 viE& @iT! (ikn -D! tr0ng &C& ;hjng gian
-D! ;hC&. [T et R& ;Jt !W n Unh ;hi -ut -D! `& @iT! (ikn (!ng
;hjng gian phb th!u& thiJt @U nh ;hjng gian .)>+ &n @iT! (ikn &hC&
;hjng gian .)> 1iIn hE v ;hjng gian u& 1p thiJt @U giQng nh
Ci%r|.
/ut &C&h T Cnh ,e giZa &C& ;hjng gian -D! 1D thI- thjng tin vD0
&C&h ;hjng gian phb th!u& thiJt @U 1iIn hE vi ;hjng gian u& 1p thiJt @U.
ShZng thjng tin thI- nD3 R& gi 1D pr06i1'. C010r pr06i1' thzng *G
(bng 1D iCC C010r Pr06i1'+ R& Unh nghha @yi int'rnati0na1 C010r
httpBOOtai1i'!ha3.&0-
1:9
Lp trnh ha trn Java 2D v 3D
C0n*0rti!-. Chi tiJt ,'- iCC C010r 80r-at 2p'&i6i&ati0n+ phiIn @Wn 5.7
trIn trang httpBOO ???.&010r. Mrg.
Knh :P5 -inh h0e -ut -D! n f201i( &010rg vD -ut Wnh !ct R&
tr!3"n &h0 Java 2D #P$ vD &C&h &hng hiTn thU @yi &C& thiJt @U ra a (eng.
Sh @en th]3 tr0ng :P5 &W -D! vD0 vD Wnh &x &C& pr06i1' R& g^n vD0.
ihi #P$ &x -ut -D! ,C& Unh -ut &C&h &hvnh ,C&+ nx phWi te0 1ei -D!
trIn thiJt @U ra+ nh -Dn hnh vD -C3 in. CC& thiJt @U nD3 &x &C& & tvnh
te0 Wnh &wa nx W- @W0 rng ;Jt !W te0 ra 1D &hvnh ,C&. /ut pr06i1' R&
1iIn ;Jt vi -\i thiJt @U ra T -j tW &C&h &C& -D! &n R& &h!3Tn i T
te0 ra ;Jt !W &hvnh ,C&.
XiE& et R& -D! n Unh vD &hvnh ,C& 3I! &! &W -D! vD0 vD thiJt
@U ra a thI- thjng tin try 1ei &h0 ;hjng gian -D! &h!n. Xv (b+ -ut
-D! vD0 &x thT Cnh ,e tt ;hjng gian -D! gQ& &wa nx *ang ;hjng gian
-D! u& 1p thiJt @U &h!n+ vD *a! x tt ;hjng gian x *ang ;hjng gian
-D! thiJt @U ra. Tr0ng nhi"! ;hva &enh+ *` &h!3Tn i -D! @^t &h& *`
&h!3Tn i &wa Qi tRng h0e tr0ng ;hjng gian t0e u ,+ 3. CW 2
trzng hRp+ *` &h!3Tn i R& (_ng T ,C& Unh t0e u tr0ng ;hjng gian
httpBOOtai1i'!ha3.&0-
1<0
Lp trnh ha trn Java 2D v 3D
&h!n vD *a! x Cnh ,e t0e u x *ang ;hjng gian thiJt @U ,C& Unh &h0
! ra.
Chng 9
In :n
Java Printing #P$ &h0 phcp ang (bng &h0B
1. $n vi #LT vD h0e Java 2DA + @a0 g- h0e a hRp
f&0-p0*it'( graphi&*g vD hnh Wnh.
2. CC& hD- i"! ;hiTn &C& hD- tDi 1iE! a hRp nh *0 *Cnh -"-+
tha t` in+ vD @00;1't printing.
5. CC& hD- in ,C& Unh trR gip nh in (!p1', f(!p1', printingg
vD *tap1ing.
7. $n vi t]t &W &C& p1at60r-+ &W Lin(0?* vD 201ari*. [i"! nD3 @a0
g- -C3 in R& g^n tr`& tiJp vi -C3 tvnh &ng nh vi
p1at60r- *06t?ar' &h0 phcp tr!3 &p *G (bng &C& gia0 tha& in
!a -eng.
ihjng phWi t]t &W &C& tvnh nVng x R& @ trR vD R& &Di t tr0ng
in ]n vi JavaA 2 2Di #P$. Shng #P$ *Y R& -y rung T @u trR &h0
t]t &W &C& th!u& tvnh nD3 y &C& @Wn r'1'a*' tr0ng tng 1ai.
L.1 *2c "ia% di4n v3 c2c &p
httpBOOtai1i'!ha3.&0-
1<1
Lp trnh ha trn Java 2D v 3D
.nterface &escription
Printa@1' Th' Printa@1' int'r6a&' i* i-p1'-'nt'( @3 'a&h pag'
paint'r+ th' app1i&ati0n &1a**f'*g &a11'( @3 th'
printing *3*t'- t0 r'n('r a pag'. Th' *3*t'- &a11* th'
pag' paint'r* print -'th0( t0 r'!'*t that a pag' @'
r'n('r'(.
Pag'a@1' Th' Pag'a@1' int'r6a&' i* i-p1'-'nt'( @3 a
(0&!-'nt that i* t0 @' print'( @3 th' printing *3*t'-.
Thr0!gh th' Pag'a@1' -'th0(*+ th' *3*t'- &an
('t'r-in' th' n!-@'r 06 pag'* in th' (0&!-'nt+ th'
60r-at t0 !*' 60r 'a&h pag'+ an( th' pag' paint'r t0
!*' t0 r'n('r 'a&h pag'.
Print'r)raphi&* Th' )raphi&*2D 0@N'&t* that a pag' paint'r !*'* t0
r'n('r a pag' i-p1'-'nt th' Print'r)raphi&*
int'r6a&'. Thi* 'na@1'* an app1i&ati0n t0 g't th'
Print'rJ0@ 0@N'&t that i* &0ntr011ing th' printing.
Printa@1' Th' Printa@1' int'r6a&' i* i-p1'-'nt'( @3 'a&h pag'
paint'r+ th' app1i&ati0n &1a**f'*g &a11'( @3 th'
printing *3*t'- t0 r'n('r a pag'. Th' *3*t'- &a11* th'
pag' paint'r* print -'th0( t0 r'!'*t that a pag' @'
r'n('r'(.
Cass &escription
>00; $-p1'-'nt*B Pag'a@1'
.'pr'*'nt* a (0&!-'nt in ?hi&h pag'* &an hav'
(i66'r'nt pag'
60r-at* an( pag' paint'r*. Thi* &1a** !*'* th'
Pag'a@1'
int'r6a&' t0 int'ra&t ?ith a Print'rJ0@.
Pag'80r-at D'*&ri@'* th' *i' an( 0ri'ntati0n 06 a pag' t0 @'
httpBOOtai1i'!ha3.&0-
1<2
Lp trnh ha trn Java 2D v 3D
print'(+ a*
?'11 a* th' Pap'r !*'( t0 print it. 80r ',a-p1'+
p0rtrait
an( 1an(*&ap' pap'r 0ri'ntati0n* ar' r'pP r'*'nt'( @3
Pag'80r-at.
Pap'r D'*&ri@'* th' ph3*i&a1 &hara&t'ri*ti&* 06 a pi'&' 06
pap'r.
Print'rJ0@ Th' prin&ipa1 &1a** that &0ntr01* printing. Th'
app1i&ati0n &a11* Print'rJ0@ -'th0(* t0 *'t !p a N0@+
(i*p1a3 a print (ia10g t0 th' !*'r f0pti0na1g+ an( t0
print th' pag'* in th' N0@.
CMc Hnh n$h9a v\ in
Java Printing #P$ (`a trIn -j hnh in &a11@a&; tr0ng x hE thjng in+
;hjng phWi ng (bng *Y i"! ;hiTn ;hi &C& trang R& in. ng (bng &!ng
&]p thjng tin v" tDi 1iE! R& in vD hE thQng in *Y 3I! &! ang (bng 3
ti &C& trang in ;hi nx &n &hng.
KE thQng in &x thT 3I! &! rng -ut trang in riIng @iEt R& a ra
hn -ut 1n h0& 3I! &! &C& trang R& a ra ng0Di th'0 tha t`. ng
(bng phWi &h0 phcp te0 ra hnh Wnh ng &wa trang+ ;hjng phb th!u&
trang nD0 hE thQng in 3I! &!. Tr0ng ;hva &enh x+ hE thQng in gijng nh
?in(0? t001;it+ &x thT 3I! &! &C& thDnh phn T vY 1ei @st & 1& nD0
tr0ng tha t` nD0.
/j hnh in &a11@a&; -"- (0 hn &C& -j hnh ang (bng i"! ;hiTn in
tr!3"n thQng vD @ trR &h0 viE& in trIn (Wi rung hn &C& hE thQng vD &C&
-C3 in.
httpBOOtai1i'!ha3.&0-
1<5
Lp trnh ha trn Java 2D v 3D
Xv (b+ nJ! -ut -C3 in th`& hiEn a ra &C& trang tr0ng tha t` W0 ngR&+
hE thQng in &x thT 3I! &! ang (bng te0 &C& trang tr0ng tha t` W0 ngR&
*a0 &h0 tC& vb &!Qi &_ng 1D ng tha t` & .
/j hnh nD3 &ng &h0 phcp ang (bng T in ra &C& -C3 in Wnh nhU
phsn tt -C3 tvnh -D ;hjng &x w @u nh hD3 ;hjng gian ha T E- &h0
t0Dn trang @it-ap. Tr0ng tnh h!Qng nD3+ -ut trang R& in nh 1D -ut
(3 &C @it-ap nh ha3 &C& (Wi f@an(*g. Xv (b+ n"! @u nh &h w E- &h0
1O10 trang in+ thi trang *Y R& &h thDnh 10 (Wi. KE thQng in di hi ang
(bng 3 -\i trang 10 1n+ -\i 1n i"n vD0 -\i (Wi. ng (bng ;hjng
&n @iJt *Q 1Rng ha3 & &wa &C& (Wi+ nx &h n giWn ;hW 3 -\i trang
;hi R& 3I! &!.
?.%.( Supportin$ Printin$
/ut ang (bng phWi th`& hiEn 2 tC& v! T @ trR &h0 viE& in 1DB
1. [i"! ;hiTn infJ0@ &0ntr01gP ihyi te0 vD !Wn 1H viE& in.
2. $n fi-agingg [3 fr'n('ringg (Z 1iE! ra -\i trang ;hi hE thQng in
3I! &! nx
$.2.1.1 =iRu )hi9n in B+o4 ControlC
Sgzi *G (bng thzng ;hyi te0 viE& in @yi viE& ;v&h -ut nt h0&
&hn -b& in trIn -'n! tr0ng -ut ang (bng. ihi -ut tha0 tC& in R&
;v&h h0et @yi ngzi *G (bng+ ang (bng te0 ra -ut Qi tRng Printer>o,
vD (_ng nx T !Wn 1H !C trnh in.
ng (bng &x ;hW nVng Cp ang &h0 viE& &Di t i"! ;hiTn in+ hiTn thU
&C& hup th0ei &h0 ngzi *G (bng+ vD @^t ! !C trnh in.
i-aging
ihi -ut tDi 1iE! R& in+ ang (bng phWi 3 (Z 1iE! -\i trang ;hi hE
thQng in 3I! &! nx. [T @ trR &h0 ; th!t nD3+ ang (bng &!ng &]p -ut
httpBOOtai1i'!ha3.&0-
1<7
Lp trnh ha trn Java 2D v 3D
pag' paint'r &Di t gia0 (iEn Printa,e. ihi hE thQng in &n -ut trang
R& s3 ra+ nx gi phng tha& in &wa pag' paint'r.
ihi -ut phng tha& &wa pag' paint'r R& gi+ nx R& tr!3"n &h0
-ut ngZ &Wnh h0e f)raphi&* &0nt',tg (_ng T 3 hnh anh trang. Sx
&ng R& tr!3"n &h0 -ut Qi tRng Pa$e+or"at ,C& Unh f*p'&i6i'*g
hnh hiEn ra &wa trang+ vD &h *Q ,C& Unh tha t` vU trv &wa trang tr0ng viE&
in.
KE thQng in h\ trR &W viE& 3 Graphics vD Graphics%&+ T in Java
2DA 2hap'* +T',t vD i-ag'*+ @en a -ut Qi tRng Graphics &h0
phng tha& in &h0 raphics%&
[T in &C& tDi 1iE! tr0ng x &C& trang (_ng &C& pag' paint'r ;hC& nha!
vD &x &C& Unh (eng ;hC& nha!+ @en (_ng -ut pa$ea,e0o,. [T te0 -ut
pag'a@1' N0@+ @en &x thT (_ng 1p >00; h0& &Di t gia0 (iEn Pa$ea,e
&wa @en.
[T &Di t &C& tha0 tC& in n giWn+ @en ;hjng &n (_ng -ut pag'a@1'
print N0@+ PrintP a@1' &x thT R& (_ng -ikn 1D t]t &W &C& trang &hia * &_n
-ut Unh (eng vD -ut -C3 in
?.%.% Pa$e Painters
XiE& &hw 3J! &wa -ut pag' paint'r 1D 3 ra -ut trang (_ng ngZ &Wnh
h0e R& &!ng &]p @yi hE thQng in. /ut pag' paint'r &Di t ph0ng
tha& Printa,e.printB
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
SgZ &Wnh h0e R& tr!3"n &h0 phng tha& in 1D -ut thT nghiE-
&wa )raphi&* h0& Graphics%&+ phb th!u& vD0 &C& pa&;ag' R& 10a(
tr0ng Java Xt!a1 /a&hin' &wa @en. [T (_ng &C& tvnh nVng Graphics%& +
httpBOOtai1i'!ha3.&0-
1<9
Lp trnh ha trn Java 2D v 3D
@en &x thT tha3 Qi tRng Graphics @ng Graphics%&. ThT nghiE-
Graphics R& tr!3"n T in &ng &Di t gia0 (iEn PrinterGraphics.
Pa$e+or"at R& tr!3"n &h0 -ut Printa,e -j tW hnh Wnh &wa -ut
trang R& in. KE ta u &wa ngZ &Wnh h0e R& tr!3"n T in R&
6i,'( vi trang B gQ& t0e u &wa hE thQng 1D gx& trCi trIn &wa trang+ r tVng
th'0 &hi"! phWi *ang trCi+ | th'0 &hi"! tt trIn ,Qng (i+ vi n v 1D
1O<2 in&h.
SJ! trang tr0ng hng p0rtrait+ trb& , &Vn th'0 &hi"! rung &wa trang gi]3+
vD trb& 3 th'0 &hi"! &a0 &wa trang. fThjng thzng+ nhng ;hjng phWi
1!jn 1!jn+ &hi"! &a0 &wa trang (Di hn vi &hi"! rung &wa nxg. SJ! trang
th'0 hng 1an(*&ap'+ th ngR& 1eiB trb& , &Vn th'0 &hi"! &a0 &wa trang
&dn trb& 3 &Vn th'0 &hi"! rung &wa nx.
>yi nhi"! -C3 in ;hjng thT trIn &W @" -t trang+ Pa$e+or"at ,C&
Unh f*p'&i6i'*g v_ng in fi-ag'a@1' ar'ag &wa trangB phn &wa trang -D nx
3 ra an t0Dn. 2` ,C& Unh &wa v_ng in ;hjng tha3 i th'0 t0e u hE
thQng+ nx R& &!ng &]p *a0 &h0 nui (!ng &wa trang &x thT R& 3 ra
*a0 &h0 &hng ;hjng thT -y rjng vD0 tr0ng v!ng -D -C3 in ;hjng thT
in.
SgZ &Wnh h0e R& tr!3"n T in &x -ut -i"n ,cn -j tW phn -i"n
&x thT in -D &n R& in. Sx &ng 1!jn an t0Dn T in t0Dn @u trang vD0
tr0ng ngZ &Wnh x+ hE thQng in *Y n^- (Z v_ng ,cn &n thiJt.
T!3 nhiIn+ T 10ei 0v'rh'a( &wa &C& phn vY &wa trang ;hjng R& in+
@en &x thT (_ng -i"n &^t ,cn T gii hen v_ng 3 ra. [T 1]3 v_ng &^t
,cn tt ngZ &Wnh h0e+ gi hD- Graphics.get)lip. X_ng &^t ,cn r]t
-enh -Y T giW- @t r'n('ring 0v'rh'a(.
[ji ;hi -0ng -!Qn &W tha0 tC& in th`& hiEn ng- T &h0 ngzi (_ng
&x thT tiJp tb& ta0 tC& vxi ng (bng tr0ng ;hi &C& trang ang R& 3 ra
fang ing. [T 1D- i"! nD3+ gi hD- Print'rJ0@.print tr0ng -ut t!3Jn
riIng.
httpBOOtai1i'!ha3.&0-
1<:
Lp trnh ha trn Java 2D v 3D
SJ! &x thT+ @en nIn trCnh &C& tha0 tC& h0e -D 3I! &! thjng tin v"
nui (!ng &wa i-ag' tr& x+ giQng nh &opy$rea+ set^'(+ vD *` 1iIn
hRp f&0-p0*itingg.
CC& tha0 tC& nD3 &x thT 3 ra &h- vD &C& ;Jt !W &x thT ;hjng n
Unh.
?.%.* Printa,e >o,s and Pa$ea,e >o,s
/ut Printa,e N0@ &!ng &]p &C&h n giWn nh]t T in. Ch -ut pag'
paint'r R& (_ng + ang (bng &!ng &]p -ut 1p n &Di t gia0 (iEn
Printa@1'. ihi in+ hE thQng g0i phng tha& in &wa pag' paint'r T 3 ra
-\i trang. CC& trang R& 3I! &! th'0 tha t`+ @^t ! vi trang &x &h *Q
1D 0. T!3 nhiIn+ pag' paint'r &x thT R& 3I! &! T 3 -\i trang vDi 1n
tr& ;hi nx *ang trang tiJp. ihi trang &!Qi &_ng R& in+ phng tha& in
&wa pag' paint'r trW v" SM24CKP#)%.
Tr0ng -ut Printa,e N0@B
1. T]t &W &C& trang (_ng &!ng -ut pag' paint'r vD Pa$e+or"at. SJ!
-ut hup th0ei in R& hiTn thU+ nx &ng *Y ;hjng hiTn thU *Q trang
tr0ng tDi 1iE! v thjng tin x ;hjng &x vi hE thQng in.
2. KE thQng in 1!jn di hi pag' paint'r T in -\i trang ng tha t`+
@^t ! vi trang &x &h *Q 1D 0. ihjng trang nD0 @U !In. Xv (b+
nJ! ngzi (_ng 3I! &! in trang 2 vD trang 5 &wa -ut tDi 1iE!+ th
pag' paint'r *Y R& gi vi &C& &h *Q 0+ 1+ 2. KE thQng in &x thT
3I! &! -ut trang R& 3 ra nhi"! 1n tr& ;hi &h!3Tn *ang
trang ;J.
5. Pag' paint'r @C0 &h0 hE thQng in ;hi nx Jn &!Qi tDi 1iE!.
7. T]t &W &C& pag' paint'r R& gi tr0ng &_ng -ut t!3Jn.
9. [ji ;hi hE thQng in &x thT ;hjng &x ;hW nVng @iJt R& -b& v&h
a ra. Xv (b+ tC& vb &wa &C& trang hiEn ra tt -C3 in &x thT 1D tha t`
httpBOOtai1i'!ha3.&0-
1<<
Lp trnh ha trn Java 2D v 3D
*ai+ h0& &C& trang &x thT ;hjng R& ;iT- tra tha t` nJ! nhi"! @Wn
*a0 R& 3I! &!.
:. /ut Pag'a@1' N0@ 1inh h0et hn -ut Printa@1' N0@. ihjng giQng
nh &C& trang tr0ng Printa@1' N0@+ &C& trang tr0ng Pag'a@1' N0@ &x
thT ;hC& v" &C&h @Q trv vD &Di t.
[T !Wn 1H -ut Pag'a@1' N0@+ @en &x thT (_ng 1p >00; ha3 &Di t
1p Pa$ea,e &wa @en. F!a Pa$ea,e+ hE thQng in &x thT ,C& Unh *Q
1Rng trang T in+ vD pag' paint'r (_ng &h0 -\i trang+ vD Pa$e+or"at
&h0 -\i trang. CC& ang (bng &n in &C& tDi 1iE! &x -ut &]! tr& Unh vD
Unh (eng nIn (_ng &C& Pag'a@1' N0@.
Tr0ng -ut Pag'a@1' N0@B
CC& trang ;hC& nha! &x thT (_ng &C& pag' paint'r vD &C&
Pa$e+or"at ;hC& nha!.
KE thQng in &x thT di hi &C& pag' paint'r T in &C& trang tr0ng
-ut tha t` t! H vD -ut trang &x thT R& @ !a. Xv (b+ SJ! ngzi (_ng
3I! &! in &C& trang 2 vD 5 &wa -ut tDi 1iE!+ th pag' paint'r *' R& gi
vi &h *Q 1 vD 2 &dn trang &h *Q 0 *Y R& @ !a.
Pag'a@1' N0@ ;hjng &n @iJt &x @a0 nhiI! trang tiJp th'0 tr0ng tDi
1iE!. T!3 nhiIn+ ;hjng giQng vi Printa@1' N0@+ &hng phWi &x ;hW nVng
3 ra &C& trang tr0ng @]t ; tha t`. Cx thT &x &C& &h\ trQng tr0ng tha t`
vD hE thQng in &x thT 3I! &! -ut trang R& 3 ra nhi"! 1n tr& ;hi
&h!3Tn *ang trang tiJp th'0. Xv (b+ 3I! &! T in trang 2 vD 5 &wa -ut tDi
1iE! &x thT ;Jt !W tr0ng (3 1zi gi 1D &C& trang 3I! &! vi &h *Q 2+ 2+ 1+
1 vD 1.
9;2;) T<pia= >i?e@C<=e .? a PrinterJ.1
/ut ang (bng hng th'0 Qi tRng Printer>o, !a -ut (3 &C&
@& T h0Dn thDnh &jng viE& in. Tha t` n giWn nh]t R& (_ng @yi
ang (bng 1DB
httpBOOtai1i'!ha3.&0-
1<=
Lp trnh ha trn Java 2D v 3D
L]3 -ut Qi tRng Printer>o, -i @yi viE& gi
Printer>o,.get!rintJo3
rC& Unh Pa$e+or"at T (_ng &h0 viE& in. /ut Pa$e+or"at -&
Unh &x thT 1]3 v" @yi gi hD- default!age. h0& @en &x thT gi
-ut hup th0ei &h0 phcp ngzi (_ng ,C& Unh Unh (eng .
rC& Unh &C& & iT- &wa &jng viE& T in &h0 Print'rJ0@. Ch0
-ut Printa@1' N0@+ gi set!rinta3le vi Pag'a@1' N0@+ gi
set!agea3le. Ch H -ut Qi tRng >00; 1D -ut -! tr!3"n &h0
set!agea3le.
rC& Unh &C& th!u& tvnh thI- &h0 viE& in+ giQng nh *Q @Wn *a0 T
in ha3 tIn &wa &jng viE& trIn ! " trang.
)i hD- printDialog T hiTn thU hup th0ei &h0 ngzi (_ng. [i"! nD3
1D t! &hn. ShZng nui (!ng vD hnh (eng &wa hup th0ei &x thT a
(eng vi &C& p1at60r- vD &C& -C3 in ;hC& nha!. TrIn h! hJt &C&
p1at60r-+ ngzi (_ng &x thT (_ng hup th0ei nD3 T tha3 i &C& 1`a
&hn &wa -C3 in. SJ! ngzi (_ng h! viE& in+ phng tha&
printDia10g trW v" 8#L2%.
)i Printer0o,.print T in. Phng tha& nD3 ;hi trW v" gi print
trIn &C& pag' paint'r tng ang.
/ut &jng viE& &x thT @U ng^t !C trnh in nJ!B
/ut Printer)xception R& a vD0 ng0ei 1E R& @^t @0i
phng tha& in vD &jng viE& *Y @U (tng. /ut pag' paint'r a ra
-ut Print'r%,&'pti0n nJ! nx phCt hiEn -ut tr- trng 1\i f6ata1
'rr0rg.
Printer>o,.&an&el R& gi. vdng 1p in *Y @U &h]- (at vD &jng
viE& @U h! @. Phng tha& &an&'1 &x thT R& gi tt -ut t!3Jn
riIng @iEt &Ci hiTn thU -ut hup th0ei vD &h0 phcp ngzi (_ng hw3
@ viE& in @yi @]- vD0 -ut nt trIn hup th0ei x.
httpBOOtai1i'!ha3.&0-
1<9
Lp trnh ha trn Java 2D v 3D
CC& trang phsn ra tr& ;hi -ut &jng viE& in @U (tng &x thT 1D ;hjng
R& in h0& R& in. XiE& in thzng ;hjng ;It th& f6ini*h'(g ;hi
phng tha& in tra v". XiE& nD3 thzng vn ang R& th`& hiEn @yi trnh
i"! ;hiJn -C3 in.
Treng thCi &wa Qi tRng Printer>o, &x thT ;hjng phWn Cnh treng thCi
th`& tJ &wa &jng viE& ang R& in.
D0 treng thCi &wa -ut Printer>o, tha3 i tr0ng !C trnh vdng zi
&wa nx. ihjng hRp 1H 3I! &! &C& phng tha& vD0 nhi"! 1&. Xv (b+ viE&
gi set!agea3le *a! ;hi @en gi hD- print 1D ;hjng hRp 1H. ihi &x &C&
1zi gi ;hjng hRp 1H R& phCt hiEn Printer>o, *Y a vD0 -ut ng0ei 1E
0ava.an$.ie$aStat)xception.
Dia10g*
Java Printing #P$ 3I! &! &C& ang (bng &n Jn hup th0ei gia0 tiJp
vi ngzi (_ng -ut &C&h tzng -inh. CC& hup th0ei nD3 &x thT R&
&!ng &]p @yi hE i"! hDnh fp1at60r- *06t?ar'g h0& @yi *` &Di t phn
-"- JavaA 2 2Di . Xi &C& ang (bng tng tC&+ nIn (_ng hup th0ei.
T!3 nhiIn+ &C& ang (bng in ;Jt wafpr0(!&ti0n printing app1i&ati0ng+ &C&
hup th0ei ;hjng &n thiJt+ vv (b nh+ @en ;hjng &n hiTn thU hup th0ei ;hi
t` ung te0 vD in -ut @C0 &C0 & *y (Z 1iE!. /ut viE& in ;hjng 3I! &!
tng tC& vi ngzi (_ng ji ;hi R& gi 1D *i1'nt print N0@.
-age setup 'ialog
>en &x thT &h0 phcp ngzi (!ng tha3 i thjng tin &Di t trangfpag'
*'t!p in60r-ati0ng &haa tr0ng Pa$e+or"at @yi hiTn thU hup th0ei pag'
*'t!p. [T hiTn thU -ut hup th0ei pag' *'t!p @en gi hD-
Printer>o,.pa$e&iao$. Kup th0ei pag' *'t!p R& ;hyi te0 (_ng tha-
*Q tr!3"n &h0 pageDialog. SJ! ngzi (_ng &1i&; vD0 nt Mi tr0ng hup
th0ei+ thU -ut thT nghiE- &wa Pag'80r-at R& te0f&10n'(g+ vD tha3 i
httpBOOtai1i'!ha3.&0-
1=0
Lp trnh ha trn Java 2D v 3D
th'0 ti &C& &hn 1`a &wa ngzi (_ng ri trW v". S"! ngzi (_ng ]n
&an&'1+ th pa$e&iao$ trW v" Pa$e+or"at &ha @U tha3 i.
-rint 'ialog
Thjng thzng+ -ut ang (bng hiTn thU -ut hup th0ei in &h0 ngzi
(!ng ;hi R& ;v&h h0et y th`& n ha3 @yi nt @]-. [T hiTn thU hup
th0ei in nD3+ @en gi hD- printDialog &wa Printer>o,. CC& 1`a &hn &wa
ngzi (_ng tr0ng hup th0ei R& rDng @!u& (`a trIn *Q vD Unh (eng &wa
&C& trang tr0ng Printa,e h0& Pa$ea,e R& &!ng &]p &h0
Printer>o,. SJ! ngzi (_ng &1i&; Mi tr0ng hup th0ei in+ print&iao$ trW
v" T.4%. Cdn &1i&; vD0 Can&'1 nx trW v" 8#L2% vD viE& in &0i nh @
!a.
L.< Printin" )ith Printa+&es
C!ng &]p @ h\ trR in & @WnB
1. CDi t gia0 (iEn Printa,e T &!ng &]p -ut pag' paint'r &x thT
3 -\i trang ra T in.
2. Te0 -ut Printer>o,.
5. )i set!rinta3le T thjng @C0 &h0 Printer>o, &C&h tha& in tDi 1iE!.
)i hD- print &wa Qi tRng Printer>o, T @^t ! &jng viE&.
Tr0ng vv (b (i s3+ -ut Printa,,e N0@ R& (_ng T in 9 trang+
-\i &Ci hiTn thU -ut *Q trang -D! ,anh. [i"! ;hiTn &jng viE& R& !Wn
1H tr0ng phng tha& &hvnh+ phng tha& 1]3 v" vD i"! ;hiTn Print'rJ0@.
XiE& 3 ra f.'n('ringg R& th`& hiEn tr0ng phng tha& print &wa pag'
paint'r.
import \a.a.awt.]' import \a.a.awt.print.]'
pub*ic c*ass 0imp*erint imp*ements rintab*e
Q
httpBOOtai1i'!ha3.&0-
1=1
Lp trnh ha trn Java 2D v 3D
pri.ate static dont fnt = new
dont(^1e*.etica^,dont.N/i#,(s&'
pub*ic static .oid main(0tringKL args&
Q
// %et a rintervob
rintervob \ob = rintervob.getrintervob(&'
// 0pecif, the rintab*e is an instance of
0imp*erint \ob.setrintab*e(new 0imp*erint(&&'
// ut up the dia*og box if
(\ob.print)ia*og(&&
Q
// rint the \ob if the user didnwt
cance* printing
tr, Q \ob.print(&' 2
catch (!xception e&
Q /] hand*e exception ]/ 2
2
0,stem.exit(+&'
2
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
// pageindex + to s corresponds to page
numbers O to 5.
httpBOOtai1i'!ha3.&0-
1=2
Lp trnh ha trn Java 2D v 3D
if (pageindex q= 5& return
rintab*e.#-"0xC1"/%!'
g.setdont(fnt&'
g.setCo*or(Co*or.green&'
g.draw0tring(^age ^ k (pageindexkO&, O++,
O++&'
return rintab*e./%!"!gi0T0'
2
2
Using 0raphics2D !or 2en'ering
>en &x thT &n &C& hD- Graphics%& tr0ng phng tha& print &wa
pag' paint'r @yi tr& tiIn &h!3Tn ngZ &Wnh Graphics ti -ut
Graphics%&
Tr0ng vv (b (i s3+ &C& *Q trang R& 3 ra (_ng -ut hng r'(P
gr''nfr'(Pgr''n gra(i'ntg. [T 1D- i"! nD3+ -ut GradientPaint R& t
tr0ng ngZ &Wnh Graphics%&.
import \a.a.awt.]' import \a.a.awt.print.]'
pub*ic c*ass 0imp*erint() imp*ements
rintab*e
Q
pri.ate static dont fnt = new
dont(^1e*.etica^,dont.N/i#,(s&'
pri.ate aint pnt = new %radientaint(O++f,
O++f, Co*or.red,
httpBOOtai1i'!ha3.&0-
1=5
Lp trnh ha trn Java 2D v 3D
Ofuf, O++f, Co*or.green, true&'
pub*ic static .oid main(0tringKL args&
Q
// %et a rintervob
rintervob \ob = rintervob.getrintervob(&'
// 0pecif, the rintab*e is an instance of
0imp*erint()
\ob.setrintab*e(new 0imp*erint()(&&'
// ut up the dia*og box
if (\ob.print)ia*og(&&
Q
// rint the \ob if the user didnwt
cance* printing
tr, Q \ob.print(&' 2
catch (!xception e& Q /] hand*e exception
]/ 2
2
0,stem.exit(+&'
2
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
// pageindex + to s corresponds to page
numbers O to 5.
if (pageindex q= 5& return
rintab*e.#-"0xC1"/%!'
httpBOOtai1i'!ha3.&0-
1=7
Lp trnh ha trn Java 2D v 3D
%raphics() g( = (%raphics()& g'
// xse the font defined abo.e
g(.setdont(fnt&'
// xse the gradient co*or defined abo.e
g(.setaint(pnt&'
g(.draw0tring(^age ^ k (pageindexkO&, O++f,
O++f&'
return rintab*e./%!"!gi0T0'
2
2
?.*.% Printin$ a +ie
ihi -jt phng tha& in &wa pag' paint'r R& 3I! &! vDi 1n &h0
&_ng trang+ nx phWi R& *inh ra &_ng ! ra -\i 1n.
Cx nhi"! &C&h T &h^& &h^n rng &C& 3I! &! 1p 1ei T 3 ra -ut
trang th!n tiEn ra &_ng ! ra. Xv (b+ T &h^& &h^n rng &_ng ! ra
R& *inh ra -\i 1n hE thQng in 3I! &! &C& trang &b thT &wa -ut 6i1'
vVn @Wn+ pag' paint'r &x thT 1! trZ vD *G (bng 1ei &C& &0n tr 6i1' &h0
-\i trang h0& &haa (Z trang th`& tJ.
Tr0ng vv (b (i s3+ -ut (anh *C&h &C& 6i1' vVn @Wn R& in. TIn
&wa 6i1' R& tr!3"n nh 1D Qi *Q &h0 hD- -ain. Lp
PrintListin$Painter &haa &0n tr 6i1' th`& tJ y 1& @^t ! &wa -\i trang
-i nx R& 3I! &! T 3 raft0 r'n('rg. ihi &_ng trang R& s3 ra 1n
nZa+ &0n tr 6i1' R& r'*'t ti vU trv nh.
import \a.a.awt.]'
import \a.a.awt.print.]'
import \a.a.io.]'
httpBOOtai1i'!ha3.&0-
1=9
Lp trnh ha trn Java 2D v 3D
pub*ic c*ass rintNisting
Q
pub*ic static .oid main(0tringKL args&
Q
// %et a rintervob
rintervob \ob = rintervob.getrintervob(&'
// /sW user for page format (e.g.,
portrait/*andscape&
agedormat pf =
\ob.page)ia*og(\ob.defau*tage(&&'
// 0pecif, the rintab*e is an instance of
// rintNistingainter' a*so pro.ide gi.en
agedormat
\ob.setrintab*e(new
rintNistingainter(argsK+L&, pf&'
// rint O cop,
\ob.setCopies(O&'
// ut up the dia*og box
if (\ob.print)ia*og(&&
Q
// rint the \ob if the user didnwt
cance* printing
tr, Q \ob.print(&' 2
catch (!xception e& Q /] hand*e exception
]/ 2
2
0,stem.exit(+&'
2
httpBOOtai1i'!ha3.&0-
1=:
Lp trnh ha trn Java 2D v 3D
2
c*ass rintNistingainter imp*ements rintab*e
Q
pri.ate $andom/ccessdi*e raf'
pri.ate 0tring fi*e#ame'
pri.ate dont fnt = new dont(^1e*.etica^,
dont.N/i#, O+&'
pri.ate int rememberedageindex = XO'
pri.ate *ong remembereddi*eointer = XO'
pri.ate boo*ean remembered!-d = fa*se'
pub*ic rintNistingainter(0tring fi*e&
Q
fi*e#ame = fi*e'
tr,Q
// -pen fi*e
raf = new $andom/ccessdi*e(fi*e, ^r^&'
2
catch (!xception e& Q remembered!-d = true'
2
2
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
tr,
Q
httpBOOtai1i'!ha3.&0-
1=<
Lp trnh ha trn Java 2D v 3D
// dor catching i-!xception
if (pageindex P= rememberedageindex&
Q
// dirst time wew.e .isited this page
rememberedageindex = pageindex'
// if encountered !-d on pre.ious page,
done
if (remembered!-d& return
rintab*e.#-"0xC1"/%!'
// 0a.e current position in input fi*e
remembereddi*eointer = raf.getdi*eointer(&'
2
e*se raf.seeW(remembereddi*eointer&'
g.setCo*or(Co*or.b*acW&'
g.setdont(fnt&'
int x = (int& pf.getimageab*eg(& k O+'
int , = (int& pf.getimageab*eY(& k O('
// Tit*e *ine
g.draw0tring(^di*en ^ k fi*e#ame k ^, pagen
^ k
(pageindexkO&, x, ,&'
// %enerate as man, *ines as wi** fit in
imageab*e area
, k= fu'
whi*e (, k O( Z pf.getimageab*eY(&
kpf.getimageab*e1eight(&&
Q
0tring *ine = raf.readNine(&'
if (*ine == nu**&
httpBOOtai1i'!ha3.&0-
1==
Lp trnh ha trn Java 2D v 3D
Q
remembered!-d = true'
breaW'
2
g.draw0tring(*ine, x, ,&'
, k= O('
2
return rintab*e./%!"!gi0T0'
2
catch (!xception e& Q return
rintab*e.#-"0xC1"/%!'2
2
2
)ia0 (iEn &wa &hng trnhB
httpBOOtai1i'!ha3.&0-
1=9
Lp trnh ha trn Java 2D v 3D
-rinting /ith -agea4les an' Koo)s
CC& Pa$ea,e R& 1D- ph_ hRp vi &C& ang (bng (`a trIn @iT! (ikn 1ei
tng -inh (Z 1iE!+ trang @yi trang. Lp Book 1D -ut &C&h th!n 1Ri T
(_ng &C& Pa$ea,e+ nhng @en &ng &x thT ,s3 (`ng &! tr& Pa$ea,e
&wa &hvnh @en nJ! >00; ;hjng ph_ hRp vi &Ci &wa @en &n. Phn nD3 &h
&h0 @en &C&h (_ng >00;.
CC& Pag'a@1' N0@ R& " &p !a &C& Printa@1' N0@ @yi v hE thQng in
&x ;hW nVng 1inh h0et hn. /ut &Wi tiJn &hvnh &wa Pag'a@1' 1D *Q trang
tr0ng tDi 1iE! thzng R& @iJt vD &x thT hiEn thU &h0 ngzi (_ng tr0ng
hup th0ei in. [i"! nD3 trR gip &h0 ngzi (_ng T &h^& &h^n rng &jng
viE& fN0@g R& th`& hiEn f*p'&i6i'(g &hvnh ,C& h0& &hn -ut (Wi &C&
trang T in.
/ut >00; @iT! (ikn -ut tp &C& trang. CC& trang tr0ng -ut @00; ;hjng
phWi &ng &+ &_ng hng+ h0& pag' paint'r. Xv (b+ -ut >00; &x thT
&haa &C& trang vi 2 & &hZ tr0ng hng p0rtrait vD -ut trang & &hZ
tr0ng hng 1an(*&ap'.
ihi -ut Book ;hyi te0 D! tiIn+ nx trQng r\ng. [T thI- &C& trang vD0
-ut >00;+ @en (_ng phng tha& app'n(. Phng tha& nD3 nhn 2 Qi
tRng Pa$e+or"at ,C& Unh f('6in'*g & trang+ v_ng &x thT in+ hng vD
-ut pag' paint'r &Di t gia0 (iEn Printa,e.
Shi"! trang tr0ng -ut >00; &x thT (_ng &h!ng &_ng Unh (ang vD
paint'r. Phng tha& app'n( R& nep &hng T &h0 phcp @en thI- vD0
-ut (3 &C& trang -6 &x &_ng thR& tvnh @yi viE& ,C& Unh tha- *Q tha 5+
*Q 1Rng &C& trang.
SJ! @en ;hjng @iJt tng *Q trang tr0ng -ut >00;+ @en &x thT &h!3Tn
&h0 giC trU 4SiSMLS4/>%.M8P#)%2 &h0 phng tha& app'n(.
KE thQng in *a! x *Y gi &C& pag' paint'r &wa @en th'0 tha tb tVng (n
&h *Q trang J ;hi -ut tr0ng &hng trW v" SM24CKP#)%.
httpBOOtai1i'!ha3.&0-
190
Lp trnh ha trn Java 2D v 3D
Phng tha& set!age &x thT R& (_ng T tha3 i Unh (eng trang
h0& paint'r. Trang T tha3 i R& ,C& Unh fi('nti6i'(g @yi &h *Q trang
&Ci &h ra vU trv &wa trang tr0ng >00;.
>an gi set!agea3le vD tr!3"n tr0ng Book T &h!n @U &h0 viE& in.
KD- set!agea3l3e vD hD- set!rinta3le 1D 10ei trt nha!. D0 x @en gi
-ut h0& &Ci nD3 h0& &Ci ;ia &ha ;hjng thT &W hai ;hi ang &h!n @U in
Print'rJ0@.
?.-.( _sin$ a Pa$ea,e >o,
Xv (b *a!+ -ut Book R& (_ng T te0 1ei vv (!N in n giWn !
tiInf D0 trzng hRp nD3 a n giWn+ &x r]t it 1Ri v&h tr0ng viE& (_ng
-ut Pa$ea,e N0@ tha3 &h0 -ut Printa,e N0@+ nhng nx -inh h0e & @Wn
&C&h &_ng -ut >00;g Ch H rng @en vn phWi &Di t gia0 (iEn Printa@1'
vD th`& hiEn pag' r'n('ring tr0ng phng tha& print &wa pag' paint'r.
import \a.a.awt.]'
import \a.a.awt.print.]'
pub*ic c*ass 0imp*erintBooW imp*ements
rintab*e
Q
pri.ate static dont fnt = new
dont(^1e*.etica^,dont.N/i#,(s&'
pub*ic static .oid main(0tringKL args&
Q
// %et a rintervob
rintervob \ob = rintervob.getrintervob(&'
// 0et up a booW
BooW bW = new BooW(&'
httpBOOtai1i'!ha3.&0-
191
Lp trnh ha trn Java 2D v 3D
bW.append(new 0imp*erintBooW(&,
\ob.defau*tage(&, 5&'
// ass the booW to the rintervob
\ob.setageab*e(bW&'
// ut up the dia*og box
if (\ob.print)ia*og(&&
Q
// rint the \ob if the user didnwt
cance* printing
tr, Q \ob.print(&' 2
catch (!xception e& Q /] hand*e exception
]/ 2
2
0,stem.exit(+&'
2
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
g.setdont(fnt&'
g.setCo*or(Co*or.green&'
g.draw0tring(^age ^ k (pageindexkO&, O++,
O++&'
return rintab*e./%!"!gi0T0'
2
2
)ia0 (iEn &wa &hng trnhB
httpBOOtai1i'!ha3.&0-
192
Lp trnh ha trn Java 2D v 3D
?.-.% _sin$ /utipe Pa$e Painters
Xv (b (i s3+ &x hai pag' paint'r ;hC& nha! R& *G (bngB -ut &h0
@a vD -ut &h0 &C& trang @In tr0ng. Trang @a R& in tr0ng 1an(*&ap'
-0(' vD nui (!ng in p0rtrait -0('.
import \a.a.awt.]'
import \a.a.awt.print.]'
pub*ic c*ass rintBooW
Q
pub*ic static .oid main(0tringKL args&
Q
// %et a rintervob
rintervob \ob = rintervob.getrintervob(&'
// Create a *andscape page format
agedormat pf* = \ob.defau*tage(&'
pf*.set-rientation(agedormat.N/#)0C/!&'
// 0et up a booW
BooW bW = new BooW(&'
httpBOOtai1i'!ha3.&0-
195
Lp trnh ha trn Java 2D v 3D
bW.append(new aintCo.er(&, pf*&'
bW.append(new aintContent(&,
\ob.defau*tage(&, (&'
// ass the booW to the rintervob
\ob.setageab*e(bW&'
// ut up the dia*og box
if (\ob.print)ia*og(&&
Q
// rint the \ob if the user didnwt
cance* printing
tr, Q \ob.print(&' 2
catch (!xception e& Q /] hand*e exception
]/ 2
2
0,stem.exit(+&'
2
2
c*ass aintCo.er imp*ements rintab*e
Q
dont fnt = new dont(^1e*.eticaXBo*d^,
dont.N/i#, e(&'
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
g.setdont(fnt&'
g.setCo*or(Co*or.b*acW&'
httpBOOtai1i'!ha3.&0-
197
Lp trnh ha trn Java 2D v 3D
int ,c = (int& (pf.getimageab*eY(& k
pf.getimageab*e1eight(&/(&'
g.draw0tring(^Vidgets, inc.^, e(, ,ckfu&'
return rintab*e./%!"!gi0T0'
2
2
c*ass aintContent imp*ements rintab*e
Q
pub*ic int print(%raphics g, agedormat pf,
int pageindex&
throws rinter!xception
Q
%raphics() g( = (%raphics()& g'
int use$ed = +'
int xo = (int& pf.getimageab*eg(&'
int ,o = (int& pf.getimageab*eY(&'
// di** page with circ*es or sbuares,
a*ternating red [ green
for (int x = +' xk(Y Z
pf.getimageab*eVidth(&' x k= fu&
for (int , = +' ,k(Y Z
pf.getimageab*e1eight(&' , k= fu&
Q
if (use$ed == +& g.setCo*or(Co*or.red&'
e*se g.setCo*or(Co*or.green&'
use$ed = O X use$ed'
httpBOOtai1i'!ha3.&0-
199
Lp trnh ha trn Java 2D v 3D
if (pageindex y ( == +& g.draw$ect(xokxks,
,ok,ks, (Y, (Y&'
e*se g.draw-.a*(xokxks, ,ok,ks, (Y, (Y&'
2
return rintab*e./%!"!gi0T0'
2
)ia0 (iEn &!a &hng trnhB
Xv (b in -ut -ut &hng trnh.
import \a.a.awt.geom.]'
import \a.a.awt.e.ent./ctionNistener'
import \a.a.awt.e.ent./ction!.ent'
import \a.a.awt.print.rintervob'
import \a.a.awt.e.ent.]'
import \a.a.awt.]'
import \a.ax.swing.]'
httpBOOtai1i'!ha3.&0-
19:
Lp trnh ha trn Java 2D v 3D
import \a.a.awt.print.]'
pub*ic c*ass 0hapesrint extends vane*
imp*ements rintab*e, /ctionNistener Q
fina* static Co*or bg = Co*or.white'
fina* static Co*or fg = Co*or.b*acW'
fina* static Co*or red = Co*or.red'
fina* static Co*or white = Co*or.white'
fina* static Basic0troWe stroWe = new
Basic0troWe((.+f&'
fina* static Basic0troWe wide0troWe = new
Basic0troWe(Y.+f&'
fina* static f*oat dashOKL = Q O+.+f 2'
fina* static Basic0troWe dashed = new
Basic0troWe(O.+f,
Basic0troWe.C/"BxTT,
Basic0troWe.v-i#"MiT!$, O+.+f, dashO, +.+f&'
fina* static vButton button = new
vButton(^in^&'
httpBOOtai1i'!ha3.&0-
19<
Lp trnh ha trn Java 2D v 3D
pub*ic 0hapesrint(& Q
setBacWground(bg&'
button.add/ctionNistener(this&'
2
pub*ic .oid actionerformed(/ction!.ent e& Q
if (e.get0ource(& instanceof vButton& Q
rintervob printvob =
rintervob.getrintervob(&'
printvob.setrintab*e(this&'
if (printvob.print)ia*og(&& Q
tr, Q
printvob.print(&'
2 catch (!xception ex& Q
ex.print0tacWTrace(&'
2
2
2
2
pub*ic .oid paintComponent(%raphics g& Q
super.paintComponent(g&'
%raphics() g( = (%raphics()& g'
draw0hapes(g(&'
2
pub*ic .oid draw0hapes(%raphics() g(& Q
)imension d = get0ize(&'
int gridVidth = s++ / u'
httpBOOtai1i'!ha3.&0-
19=
Lp trnh ha trn Java 2D v 3D
int grid1eight = f++ / ('
int rowspacing = 5'
int co*umnspacing = e'
int rectVidth = gridVidth X
co*umnspacing'
int rect1eight = grid1eight X rowspacing'
Co*or fgf) = Co*or.*ight%ra,'
g(.setaint(fgf)&'
g(.draw$ect(Y+, Y+, s++ X O, fO+&'
g(.setaint(fg&'
int x = Y5'
int , = Ye'
g(.draw(new Nine().)oub*e(x, , k
rect1eight X O, x k rectVidth, ,&&'
x k= gridVidth'
g(.set0troWe(stroWe&'
g(.draw(new $ectang*e().)oub*e(x, ,,
rectVidth, rect1eight&&'
x k= gridVidth'
g(.set0troWe(dashed&'
g(
.draw(new
$ound$ectang*e().)oub*e(x, ,, rectVidth,
rect1eight,
O+, O+&&'
x k= gridVidth'
g(.set0troWe(wide0troWe&'
g(.draw(new /rc().)oub*e(x, ,, rectVidth,
rect1eight, r+, Of5,
httpBOOtai1i'!ha3.&0-
199
Lp trnh ha trn Java 2D v 3D
/rc().-!#&&'
x k= gridVidth'
g(.set0troWe(stroWe&'
g(.draw(new !**ipse().)oub*e(x, ,,
rectVidth, rect1eight&&'
x k= gridVidth'
int xOointsKL = Q x, x k rectVidth, x, x
k rectVidth 2'
int ,OointsKL = Q ,, , k rect1eight, , k
rect1eight, , 2'
%enera*ath po*,gon = new
%enera*ath(%enera*ath.Vi#)"!z!#"-)),
xOoints.*ength&'
po*,gon.mo.eTo(xOointsK+L, ,OointsK+L&'
for (int index = O' index Z
xOoints.*ength' indexkk& Q
po*,gon.*ineTo(xOointsKindexL,
,OointsKindexL&'
2
'
po*,gon.c*oseath(&'
g(.draw(po*,gon&'
x = Y5'
, k= grid1eight'
int x(ointsKL = Q x, x k rectVidth, x, x
k rectVidth 2'
int ,(ointsKL = Q ,, , k rect1eight, , k
rect1eight, , 2'
httpBOOtai1i'!ha3.&0-
200
Lp trnh ha trn Java 2D v 3D
%enera*ath po*,*ine = new
%enera*ath(%enera*ath.Vi#)"!z!#"-)),
x(oints.*ength&'
po*,*ine.mo.eTo(x(ointsK+L,
,(ointsK+L&'
for (int index = O' index Z
x(oints.*ength' indexkk& Q
po*,*ine.*ineTo(x(ointsKindexL,
,(ointsKindexL&'
2
'
g(.draw(po*,*ine&'
x k= gridVidth'
g(.setaint(red&'
g(.fi**(new $ectang*e().)oub*e(x, ,,
rectVidth, rect1eight&&'
g(.setaint(fg&'
x k= gridVidth'
%radientaint redtowhite = new
%radientaint(x, ,, red, x k rectVidth,
,, white&'
g(.setaint(redtowhite&'
g(
.fi**(new
$ound$ectang*e().)oub*e(x, ,, rectVidth,
rect1eight,
O+, O+&&'
g(.setaint(fg&'
x k= gridVidth'
httpBOOtai1i'!ha3.&0-
201
Lp trnh ha trn Java 2D v 3D
g(.setaint(red&'
g(.fi**(new /rc().)oub*e(x, ,, rectVidth,
rect1eight, r+, Of5,
/rc().-!#&&'
g(.setaint(fg&'
x k= gridVidth'
redtowhite = new %radientaint(x, ,, red,
x k rectVidth, ,, white&'
g(.setaint(redtowhite&'
g(.fi**(new !**ipse().)oub*e(x, ,,
rectVidth, rect1eight&&'
g(.setaint(fg&'
x k= gridVidth'
int xfointsKL = Q x, x k rectVidth, x, x
k rectVidth 2'
int ,fointsKL = Q ,, , k rect1eight, , k
rect1eight, , 2'
%enera*ath fi**edo*,gon = new
%enera*ath(%enera*ath.Vi#)"!z!#"-)),
xfoints.*ength&'
fi**edo*,gon.mo.eTo(xfointsK+L,
,fointsK+L&'
for (int index = O' index Z
xfoints.*ength' indexkk& Q
fi**edo*,gon.*ineTo(xfointsKindexL,
,fointsKindexL&'
2
'
httpBOOtai1i'!ha3.&0-
202
Lp trnh ha trn Java 2D v 3D
fi**edo*,gon.c*oseath(&'
g(.setaint(red&'
g(.fi**(fi**edo*,gon&'
g(.setaint(fg&'
g(.draw(fi**edo*,gon&'
2
pub*ic int print(%raphics g, agedormat pf,
int pi& throws rinter!xception Q
if (pi q= O& Q
return rintab*e.#-"0xC1"/%!'
2
draw0hapes((%raphics()& g&'
return rintab*e./%!"!gi0T0'
2
pub*ic static .oid main(0tring sKL& Q
VindowNistener * = new Vindow/dapter(& Q
pub*ic .oid
windowC*osing(Vindow!.ent e& Q
0,stem.exit(+&'
2
pub*ic .oid windowC*osed(Vindow!.ent
e& Q
0,stem.exit(+&'
2
2'
vdrame f = new vdrame(&'
httpBOOtai1i'!ha3.&0-
205
Lp trnh ha trn Java 2D v 3D
f.addVindowNistener(*&'
vane* pane* = new vane*(&'
pane*.add(button&'
f.getContentane(&.add(BorderNa,out.0-xT1,
pane*&'
f.getContentane(&.add(BorderNa,out.C!#T!$,
new 0hapesrint(&&'
f.set0ize(5Y+, 5++&'
f.show(&'
2
2
)ia0 (iEn &wa &hng trnhB
httpBOOtai1i'!ha3.&0-
207
Lp trnh ha trn Java 2D v 3D
httpBOOtai1i'!ha3.&0-
209
Lp trnh ha trn Java 2D v 3D
Ph7n 2
Lp trnh ha vi Java <D
httpBOOtai1i'!ha3.&0-
20:
Lp trnh ha trn Java 2D v 3D
C*ABCG 1
C*DP 6EC >DP TRFC* TRGC JAHA "D
1.1 T7n" 89an vC Java <D 0P1 /
Java 5D #P$ R& thta ;J tt &C& 1p &wa Nava &h0 phcp te0 &C& gia0
(iEn pha& tep nh hE thQng s- thanh vD hnh Wnh 5 &hi"!. Sgzi 1p trnh
&x thT *G (bng nx T ,s3 (`ng i"! ;hiTn &C& Qi tRng hnh h& 5 &hi"!.
ShZng Qi tRng nD3 & tr trIn -ut -ji trzng W0 *a! x -i R&
(`ng hnh 1ei. CC& hD- #P$ R& thiJt ;J r]t 1inh ung &h0 phcp te0 -ut
trzng W0 x &hvnh ,C& vi r]t nhi"! (eng ;v&h & tt 1n Jn @c.
D_ &x nhi"! &ha& nVng nh v3 nhng &C& hD- #P$ vn &x thT *G
(bng r rDng. CC& &hi tiJt R& (ng hnh t` ung. 2G (bng 1Ri thJ &wa
&C& 1!ng tr0ng Nava+ viE& (`ng hnh tr0ng Java 5D &h0 phcp 1D- *0ng
*0ng+ ng thzi &ng &h0 phcp tQi h! hxa viE& (`ng hnh. Chng trnh
Java 5D te0 &C& in*tan&'* &wa &C& Qi tRng vD a &hng vD0 & *y (Z
1iE! thU ;h!ng &Wnh. [ thU ;h!ng &Wnh 1D -ut *^p ,Jp &C& Qi tRng
Java 5D trIn -ut &]! tr& &s3 &h0 phcp &h ra nui (bng &wa -ut thJ gii
W0 vD &hng &x thT R& (`ng hnh nh thJ nD0.
Chng trnh Java 5D &x thT R& viJt T &he3 u& 1p ha3 nh 1D -ut
app1't trIn &C& trnh (!3Et h\ trR Java 5D h0& &W 2.
httpBOOtai1i'!ha3.&0-
20<
Lp trnh ha trn Java 2D v 3D
1.2 *2c vQn C cR +Fn vC Java <D 0P1/
Java 5D #P$ Unh nghha hn 100 1p tr0ng gxi 0avax."edia.0*d
nhZng 1p nD3 R& &0i nh 1D nhZng 1p & @Wn nh]t &wa Java 5D.
Cx Jn hDng trV- trzng vD phng tha& tr0ng &C& 1p &wa Java 5D
#P$ t!3 nhiIn -ut -ji trzng W0 n giWn &h &n (_ng -ut vDi 1p.
Chng nD3 -j tW tp nh nh]t &C& Qi tRng vD tng tC& giZa &hng T
(`ng nIn -ut -ji trzng W0.
Chng nD3 &dn @a0 g- vv (b K'110Java5D hiTn thi -ut ;hQi 1p
phng !a3. Xv (b nD3 R& phCt triTn th'0 ttng @& 1n 1Rt thT hiEn
&C& phn ,G 1v tr0ng 1p trnh Java 5D.
Sg0Di gxi nhsn Java 5D &hng ta &dn *G (bng thI- -ut gxi nZa 1D
&0-.*!n.N5(.!ti1* thzng gi 1D &C& 1p tiEn (bng+ &hng @ *!ng thI-
nhZng tvnh nVng hiE! !W vD r]t -enh &h0 nhsn.
Lp !ti1it3 g- 7 -b&B &0nt'nt 10a('rfnep nui (!ngg+ h\ trR ,s3 (`ng
thU ;h!ng &Wnh+ &C& 1p hnh h&+ vD &C& &jng &b tiEn v&h.
T]t nhiIn 1D ng0Di gxi nhsn vD gxi tiEn v&h th -i &hng trnh Nava
"! *G (bng &C& 1p tt gxi 0ava.a1t vD 0avax.vec"ath. )xi 0ava.a1t
Unh nghha &C& 1p #LT &h0 phcp te0 &Ga * &h0 viE& (`ng hnh. )xi
0avax.vec"ath Unh nghha &C& 1p &h0 iT-+ v'&t0r -a trn vD nhZng Qi
tRng t0Cn h& ;hC&.
Tr0ng phn &dn 1ei &wa giC0 trnh nD3 tt vi*!a1 0@N'&tfQi tRng !an *Ctg
R& *G (bng tha3 &h0 -ut Qi tRng tr0ng thU ;h!ng &Wnh.f&hng
henB -ut hnh 1p phng ha3 hnh &!g. Tt 0@N'&t R& *G (bng &h0 -ut
in*tan&' &wa -ut 1p. C0nt'nt tng ang vi nhZng Qi tRng !an *Ct
tr0ng -ut thU ;h!ng &Wnh.
1.< ST, dUn" thI (h9n" cFnh
/ji trzng W0 tr0ng Java 5D R& te0 tt -ut thU ;h!ng &Wnh+ -ut
thU ;h!ng &Wnh R& te0 nIn @yi &C& in*tan&' &wa &C& 1p Java 5D. [
httpBOOtai1i'!ha3.&0-
20=
Lp trnh ha trn Java 2D v 3D
thU ;h!ng &Wnh x R& ghcp nQi @yi &C& Qi tRng R& Unh nghha v"
-t hnh h&+ s- thanh vD Cnh *Cng+ vU trv+ hng vD @" ng0Di v" tr`&
!an &ng nh s- thanh &wa Qi tRng. Xi -ut thU @nh thzng th
&]! tr& (Z 1iE! ha3 (_ng 1D &C& nt vD &C& &!ng. /ut nt &wa thU
;h!ng &Wnh 1D -ut in*tan&' &wa -ut 1p Java 5D. CC& &!ng ei (iEn &h0 2
(eng !an hE giZa &C& in*tan&'* &wa Java 5D.
F!an hE ha3 gp nh]t 1D !an hE &ha &0n -ut nt &ha &x r]t nhi"! nt
&0n. /ut !an hE ;hC& 1D !an hE tha- &hiJ!. /ut tha- &hiJ! 1iIn ;Jt
-ut Qi tRng bodeCo"ponent vi -ut nt &wa thU ;h!ng &Wnh.
bodeCo"ponent Unh nghha v" -t hnh h& vD &C& th!u& tvnh @" -t
R& *G (bng T (`ng nIn Qi tRng !an *Ct.
[ thU ;h!ng &Wnh tr0ng Java 5D R& &]! thDnh tt &C& nt Qi tRng
tr0ng &C& -Qi 1iIn hE &ha &0n Unh ra -ut &]! tr& &s3. Tr0ng &s3 nD3 &h
&x -ut nt gQ&. CC& nt &dn 1ei R& tr!3 &p ti thjng !a &C& &!ng i tt
nt gQ&+ &C& &!ng trIn &s3 ;hjng te0 thDnh &h! trnh. /ut thU ;h!ng
&Wnh R& Unh (eng tt &C& &s3 -D gQ& tei &C& Qi tRng ,W3 ra.
bodeCo"ponent vD &C& &!ng tha- &hiJ! ;hjng phWi 1D -ut phn &wa
thU ;h!ng &Wnh.
Ch tn tei -ut zng (!3 nh]t tt gQ& &wa &s3 Jn -ut 1C+ tt x &h &x
-ut zng i (!3 nh]t tt gQ& &wa -ut thU ;h!ng &Wnh Jn -\i nt 1C.
[zng i x gi 1D zng i &wa thU ;h!ng &Wnh. Tt x &h &x -ut
zng i thU ;h!ng &Wnh Jn -\i 1C tr0ng -ut thU ;h!ng &Wnh.
/\i (zng i thU ;h!ng &Wnh tr0ng thU ;h!ng &Wnh &wa Java 5D
&h ra thjng tin v" treng thCi &wa 1C. Thjng tin treng thCi x @a0 g- Ua
iT-+ hng+ vD ;v&h th& &wa Qi tRng !an *Ct. iJt !W 1D &C& th!u&
tvnh tr`& !an &wa -\i Qi tRng !an *Ct phb th!u& vD0 -\i zng i
trIn thU ;h!ng &Wnh &wa nx. >u (`ng hnh Java 5D (`a trIn iT- nD3
T (`ng nIn &C& 1C th'0 tha t` hiE! !W nh]t. ShZng ngzi 1p trnh Java
5D thzng ;hjng phWi i"! ;hiTn !C trnh nD3.
httpBOOtai1i'!ha3.&0-
209
Lp trnh ha trn Java 2D v 3D
X" -t ha th -ut thU ;h!ng &Wnh R& (_ng nh 1D -ut &jng
&b thiJt ;J h0& tDi 1iE! hxa &h0 &C& trng trnh Java 5D. [ thU ;h!ng
&Wnh R& vY trIn &C& @iT! tRng nh hnh 1.1. Chng trnh Java 5D &x
thT &x nhi"! Qi tRng hn *0 vi nhZng Qi tRng y tr0ng thU nD3.
Sh v3 T thiJt ;J -ji trzng W0+ thU ;h!ng &Wnh R& vY (`a
trIn nhZng @iT! tRng &h!n. 2a! ;hi viE& thiJt ;J h0Dn thDnh+ *
thU ;h!ng &Wnh *Y 1D tiI! &hv &wa &hng trnh. 2a! ;hi &hng trnh h0Dn
thDnh+ -ut thU ;h!ng &Wnh tng t` ei (iEn &h0 &hng trnh fgiW *G
1D nhZng & iT- x R& t!sn th'0g. [ thU R& vY tt &hng trnh
-inh &hang &h0 thU -D &hng trnh te0 ra.
/\i -ut @iT! tRng y phva @In trCi &wa hnh 1.1 ei iEn &h0 -ut Qi
tRng n 1 ;hi *G (bng tr0ng thU ;h!ng &Wnh. 2 @iT! tRng ! tiIn
ei (iEn &h0 &C& Qi tRng &wa 2 1p & @iEt Cirtua_niverse vD Locae.
5 @iT! tRng tiJp th'0 ei (iEn &h0 &C& Qi tRng &wa &C& 1p Group+
Leaf vD bodeCo"ponent. 5 @iT! tRng *a! x thzng R& (_ng T &h
&C& 1p &0n &wa nhZng Qi tRng trIn. >iT! tRng &!Qi &_ng @In trCi ei
(iEn &h0 @]t &a 1p &wa Qi tRng nD0.
/i tIn 1i"n ei (iEn &h0 -ut 1iIn ;Jt &ha &0n giZa 2 Qi tRng. Sct at
&h tha- &hiJ! Jn -ut Qi tRng ;hC&. [Qi tRng R& tha- &hiJ! &x
httpBOOtai1i'!ha3.&0-
210
Lp trnh ha trn Java 2D v 3D
thT &hia * giZa &C& nhCnh ;hC& nha! &wa -ut thU ;h!ng &Wnh. Di
s3 1D -ut vv (b fKnh 1.2g
.]t (k ,s3 (`ng -ut thU ;h!ng &Wnh *ai. /ut vv (b *ai n giWn &x
thT ,'- y hnh 1P5. [ thU nD3 *ai @yi v nx vi phe- nhZng & tvnh &wa
D#). X]n " n- y &h\ &h vi 2 Qi tRng Transfor"Group &x &h!ng
-ut Qi tRng 1C Shape*& 1D &0n. Sh rng -ut Qi tRng 1C &h &x thT
&x 1 &ha (!3 nh]t. Sxi &C&h ;hC& &h &x -ut zng i tt Qi tRng
L0&a1' Jn 1 1C fha3 1D zng tt -ut 1C Jn -ut Locaeg.
>en &x thT nghh &]! tr& ,s3 (`ng tr0ng hnh 1P5 Unh nghha 5 Qi
tRng !an *Ct tr0ng -ut -ji trzng W0+ Sx ,!]t hiEn trIn @iT! ;h!ng
&Wnh (`a trIn Unh nghha 2 Qi tRng !an *Ct thjng !a *G (bng Qi
tRng !an *Ct Shape*& phva @In phWi &wa thU. /D (`a trIn &C& ;hCi
niE-+ -\i Qi tRng Transfor"Group &ha &h!ng &wa Qi tRng
Shape*& phWi t -ut hnh Wnh &wa Qi tRng !an *Ct trIn &C& vU trv
;hC& nha!. T!3 nhiIn s3 1D -ut thU ;hjng hRp 1E v &!ng &ha &0n
httpBOOtai1i'!ha3.&0-
211
Lp trnh ha trn Java 2D v 3D
;hjng Unh ra -ut &s3. Tr0ng vv (b nD3+ ;Jt !W 1D Qi tRng Shape*& &x
hn 1 &ha.
2` tranh &i v" &]! tr& &wa &s3 vD D#) 1D &hvnh ,C&. T!3 nhiIn hE
thQng r!nti-' &wa Java 5D a ra thjng @C0 &x 1\i tr0ng -Qi !an hE &ha
&0n. X ;Jt !W &wa *` gii hen &]! tr& &s3 -D -\i Qi tRng Shape*&
@U hen &hJ &h &x -ut &ha. Xi vv (b tr0ng hnh 1P5+ 1\i thjng @C0 1D &hvnh
1D viE& &x nhi"! &ha. TrIn hnh 1P7 a ra giWi phCp &h0 v]n " nD3.
Chng trnh Java 5D -D &x thU ;h!ng &Wnh ;hjng hRp 1E &x thT
(U&h R& nhng ;hjng thT (U&h R&. ihi -ut &hng trnh Java 5D &x
thU ;h!ng &Wnh ;hjng hRp 1E R& &he3+ hE thjng Java 5D *Y phCt hiEn
ra v]n ". XD ;hi v]n " R& phCt hiEn th hE thQng Java 5D *Y thjng
@C0 1\i. Chng trnh &x thT vn &he3 nhng vn &n phWi (tng 1ei v
&hng &x hnh Wnh nD0 (`ng nIn &W.
/\i thU ;h!ng &Wnh &h &x -ut -ji trzng W0. [Qi tRng -ji trzng
W0 &x -ut (anh *C&h &C& Qi tRng Locae. /ut Qi tRng Locae &!ng
&]p -ut iT- tha- &hiJ! tr0ng -ji trzng W0 x. Cx thT &0i nh Qi
httpBOOtai1i'!ha3.&0-
212
Lp trnh ha trn Java 2D v 3D
tRng Locae 1D &ut -Q& *G (bng T ,C& Unh vU trv &wa &C& Qi tRng
!an *Ct tr0ng -ji trzng W0.
thT &x nhi"! -ji trzng W0 tr0ng -ut &hng trnh Java 5D+ v thJ &x
thT Unh nghha nhi"! hn -ut -ji trzng W0. T!3 nhiIn+ ;hjng &x &C&h
&Q Unh nD0 &h0 viE& 1iIn 1e& giZa &C& -ji trzng W0 nD3. ra hn+ -ut Qi
tRng thU ;h!ng &Wnh ;hjng thT tn tei tr0ng a -ji trzng W0 &_ng
-ut 1&. D0 x &h nIn *G (bng -ut vD &h -ut in*tan&' &wa -ji trzng
W0 tr0ng -\i &hng trnh Java 5D.
Tr0ng ;hi -ut Qi tRng -ji trzng W0 &x thT tha- &hiJ! Jn nhi"! Qi
tRng Locae th h! hJt &C& &hng trnh Java 5D &h &x -ut Qi tRng
L0&a1'. /\i Qi tRng L0&a1' &x thT phb& vb nh 1D gQ& &wa nhi"! thU
&0n &wa thU ;h!ng &Wnh. Th'0 vv (b y hnh 1P2 &x thT th]3 Qi tRng
L0&a1' &x 2 nhCnh thU &0n tt nx.
CC& thU &0n th phsn ra 1D- 2 10ei nhCnh hnh tha& vD nhCnh nui
(!ng. ShCnh nui (!ng &h ra nui (!ng &wa -ji trzng W0 hnh h&+ @"
-t+ hDnh vi+ Ua iT-+ s- thanh+ vD Cnh *Cng. ShCnh hnh tha& &h ra &C&
tha- *Q &h0 phcp ,'- nh Ua iT- ,'- vD hng ,'-.
httpBOOtai1i'!ha3.&0-
215
Lp trnh ha trn Java 2D v 3D
(.*.( Thca kd cVp cao tc >ava *& !P.
Cx 5 &]p thta ;J tt Java 5D #P$ thT hiEn tr0ng hnh 9P1. Thjng !a
&]! tr& nD3 &hng ta *Y hnh (!ng R& &hng trnh Java 5D nh thJ
nD0.
Lp node
Lp n0(' 1D 1p &ha &wa 2 1p Group vD Leaf+ Unh nghha nhZng
phng tha& &h!ng vD r]t !an trng &h0 &C& 1p &0n &wa nx. Thjng tin
v" &C& phng tha& nD3 *Y R& -j tW y phn *a! &wa tDi 1iE!
Lp Group
Lp gr0!p 1D 1p gQ& *G (bng T &h ra vU trv vD hng &wa Qi tRng
!an *Ct tr0ng -ut -ji trzng W0. 2 1p &0n &wa 1D BranchGroup vD
Transfor"Group. Tr0ng thU ;h!ng &Wnh hnh Wnh ei (iEn &wa 2 1p
nD3 &x @iT! tRng 1D hnh trdn vD thzng R& viJt t^t thDnh >) vD T).
Lp Leaf
httpBOOtai1i'!ha3.&0-
217
Lp trnh ha trn Java 2D v 3D
Lp Leaf 1D 1p gQ& T Unh nghha hnh (eng+ s- thanh+ vD hDnh vi
&wa Qi tRng !an *Ct tr0ng -ui trzng W0. /ut vDi 1p &0n &wa 1p nD3
1D Shape*&+ Li$ht+ Behavior vD Sound. ShZng Qi tRng nD3 &x thT
;hjng &x 1p &0n nhng phWi tha- &hiJ! Jn bodeCo"ponent.
Lp bodeCo"ponent
Lp bodeCo"ponent 1D 1p gQ& *G (bng T -j tW v" hnh h&+ @"
-t+ t',t!r' vD nhZng th!u& tvnh &wa n0(' Shape*&. bodeCo"ponent
;hjng phWi 1D -ut phn &wa thU ;h!ng &Wnh nhng 1ei R& tha- &hiJ!
Jn. /ut bodeCo"ponent &x thT R& tha- &hiJ! @i nhi"! Qi tRng
Shape*&.
httpBOOtai1i'!ha3.&0-
219
Lp trnh ha trn Java 2D v 3D
1;) C#h thI $+ viJt KLt hng tr'nh Java "D
XiE& ,s3 (`ng -ut &hng trnh Java 5D g- &x < @& R& gii
thiE! tr0ng hnh 1P:. [s3 1D &jng tha& hZ! v&h T ,s3 (`ng &C& ang (bng
Java 5D.
Cjng tha& nD3 &ng @ !a -jt vDi &hi tiJt nhng (ikn tW phn 1n
nhZng &jng viE& &n 1D- tr0ng x viE& te0 &C& nhCnh thU &wa thU
;h!ng &Wnh 1D &jng viE& !an trng nh]t &wa viE& 1p trnh. Tr0ng phn
ti &hng ta *Y R& @iJt 1D- thT nD0 T te0 -ut thU ;h!ng &Wnh -D
;hjng phWi 1p trnh nhi"!.
(.-.( C`n$ thRc ;n $iJn Q vidt "et chf;n$ trUnh >ava *&
CC& &hng trnh &wa Java 5D R& viJt *G (bng &jng tha& trIn &x
nhCnh thU hnh tha& &x &]! tr& ng ^n+ vD &]! tr& nD3 *n &x
tr0ng 1p 2i-p1'4niv'r*'. /\i in*tan&' &wa 1p nD3 th`& hiEn &C& @&
2+5+7 trIn &jng tha& & @Wn trIn i"! x gip &h0 ngzi 1p trnh giW-
thiT! thzi gian vD &jng *a& T te0 nhCnh hnh tha& !a x tp tr!ng vD0
&jng viE& &hvnh 1D nui (!ng hn. Cjng viE& th`& *` ;hi viJt -ut &hng
trnh Java 5D 1D nh v3.
1. Cr'at' a Canva*5D 0@N'&t
2. Cr'at' a Xirt!a14niv'r*' 0@N'&t
5. Cr'at' a L0&a1' 0@N'&t+ atta&hing it t0 th' Xirt!a14niv'r*' 0@N'&t
7. C0n*tr!&t a vi'? @ran&h graph
a. Cr'at' a Xi'? 0@N'&t
@. Cr'at' a Xi'?P1at60r- 0@N'&t
&. Cr'at' a Ph3*i&a1>0(3 0@N'&t
(. Cr'at' a Ph3*i&a1%nvir0n-'nt 0@N'&t
'. #tta&h Xi'?P1at60r-+ Ph3*i&a1>0(3+ Ph3*i&a1%nvir0n-'nt+ an(
Canva*5D 0@N'&t* t0 Xi'? 0@N'&t
httpBOOtai1i'!ha3.&0-
21:
Lp trnh ha trn Java 2D v 3D
9. C0n*tr!&t &0nt'nt @ran&h graphf*g
:. C0-pi1' @ran&h graphf*g
<. $n*'rt *!@graph* int0 th' L0&a1'
XiE& *G (bng 1p nD3 &h0 phcp ngzi 1p trnh te- !In i nhCnh
thU hnh tha&. T!3 nhiIn nx ;hjng &h0 phcp &x nhi"! vi'? tr0ng -ji
trzng W0 &wa nx.
Si#pleUniverse Class
KD- ;hyi te0 &wa Qi tRng Si"pe_niverse te0 nIn thU ;h!ng
&Wnh @a0 g- &C& Qi tRng Cirtua_niverse vD Locae vD -ut nhCnh
thU hnh tha& h0Dn thiEn.
ShCnh nD3 *G (bng in*tan&'* &wa &C& 1p Cie1in$Patfor" vD Cie1er
tr0ng nhsn &wa 1p T te0 thDnh nhCnh thU hnh tha&. [Qi tRng
Si"pe_niverse &!ng &]p t]t &W &C& &ha& nVng R& &h ra tr0ng hnh 1P
<.
)xi co".sun.0*d.utis.universe &haa &C& 1p Si"pe_niverse+
Cie1in$Patfor" vD Cie1er.
httpBOOtai1i'!ha3.&0-
21<
Lp trnh ha trn Java 2D v 3D
XiE& *G (bng 1p Si"pe_niverse 1D &h0 &jng viE& n giWn hn r]t
nhi"!. Knh 1P= a ra &jng tha& n giWn hn tr0ng x &C& @& 2+5+7
R& tha3 @ng @& 2 &wa &jng tha& -i.
1. Cr'at' a Canva*5D M@N'&t
2. Cr'at' a 2i-p1'4niv'r*' 0@N'&t ?hi&h r'6'r'n&'* th' 'ar1i'r
Canva*5D 0@N'&t
a. C!*t0-i' th' 2i-p1'4niv'r*' 0@N'&t
5. C0n*tr!&t &0nt'nt @ran& h
7. C0-pi1' &0nt'nt @ran&h graph
9. $n*'rt &0nt'nt @ran&h graph int0 th' L0&a1' 06 th' 2i-p1'4niv'r*'
Si"pe_niverse Constructor $xi &0-.*!n.N5(.!ti1*.!niv'r*'
Lp tiEn v&h nD3 &h0 phcp (k (Dng &Di t -ji trzng ngzi (_ng+ te0
&C& Qi tRng &n thiJt &h0 thU nhCnh hnh tha&. Lp nD3 te0 nIn &C&
Qi tRng L0&a1'+ Xirt!a14niv'r*'+ Xi'?ingP1at60r- vD Xi'?'r fvi t]t
&W &C& giC trU -& Unh &wa &hngg. CC& Qi tRng nD3 1iIn hE vi nha! T
te0 nIn thU nhCnh hnh tha&.
Phng tha& ;hyi te0 !an trng
"i+ple_niverse [\
ihyi te0 -ut -ji trzng W0
"i+ple_niverse [)anvas3D &anvas3D\
ihyi te0 -ut -ji trzng W0 vi tha- &hiJ! Jn Qi tRng R& t
tIn 1D Canva*5D
[Qi tRng Si"pe_niverse te0 thDnh -ut thU nhCnh hnh tha&
h0Dn thiEn &h0 -ut -ji trzng W0. [ thU nD3 @a0 g- -ut @Wng hnh
Wnh. /ut @Wng hnh Wnh 1D -ut (eng hnh &hZ nht 1D ni -D nui (!ng &wa
R& &hiJ! Jn T Unh (eng hnh Wnh &n (`ng. [Qi tRng Canvas*&
&!ng &]p hnh Wnh trIn -ut &Ga * trIn -Dn hnh hiTn thU &wa -C3 tvnh+ &x
thT &0i nh 1D -ut @Wng hnh Wnh v3. [T r hn &hng ta !an *Ct hnh
httpBOOtai1i'!ha3.&0-
21=
Lp trnh ha trn Java 2D v 3D
Wnh (i s3+ hnh 1P9 &h ra -Qi !an hE giZa @Wng hnh Wnh fi-ag'
p1at'g vD vU trv &wa -^t+ -ji trzng W0. XU trv &wa -^t 1D ng *a! @Wng
hnh Wnh. [Qi tRng !an *Ct ang tr& @Wng hnh Wnh R& (`ng trIn
@Wng hnh Wnh. XiE& (`ng hnh &ng vv nh &hiJ! -ut Qi tRng !an *Ct
1In @Wng hnh Wnh.
/& Unh @Wng hnh Wnh t tr!ng ts- &wa Si"pe_niverse @an !+
hng -& Unh 1D nhn th'0 trb& +. Tt vU trv nD3 trb& , 1D zng @iIn
ngang &wa @Wng hnh Wnh vi hng (ng 1D @In phWi. Trb& 3 1D &enh
ngang &wa @Wng hnh Wnh vi giC trU (ng hng 1In trIn. Thjng thzng
th vU trv f0+0+0g 1D ts- &wa @Wng hnh Wnh.
Chng trnh Java 5D thjng thzng *Y &h!3Tn iT- nhn ra phva *a!
fhng (ng &wa trb& g T 1D- &h0 Qi tRng y vU trv h0& gn *0 vi vU
trv @an ! giZa hng nhn. Lp Si"pe_niverse &x -ut 1p thDnh viIn
1D Cie1in$Patfor"+ 1p nD3 &x phng tha&
set4o+inal`ieing,ransfor+ &h0 phcp &h!3Tn vU trv &wa -^t nhn ti
tr!ng ts- 1D f0+0+ 2.71g nhn tt phva s- &wa trb& *0 vi vU trv @an !.
LNp Cie1in$Patfor"+ phng tha& set4o+inal`ieing,ransfor+ fg
Pa&;ag'B &0-.*!n.N5(.!ti1*.!niv'r*'
httpBOOtai1i'!ha3.&0-
219
Lp trnh ha trn Java 2D v 3D
Lp Xi'?ingP1at60r- R& *G (bng T thiJt 1p thU nhCnh hnh
tha& &wa thU ;h!ng &Wnh Java 5D vi Qi tRng 2i-p1'4niv'r*'.
Phng tha& nD3 thzng R& *G (bng T ;Jt nQi vi phng tha&
g'tXi'?ingP1at60r- &wa 1p 2i-p1'4niv'r*'.
void set4o+inal`ieing,ransfor+[\
2't t- nhn ;h0Wng &C&h ;h0Wng 2.71 -ct tt tr0ng @iJn i t-
nhn &wa -ut 2i-p1'4niv'r*'. Tei ;h0Wng &C&h nD3 vD th Qi tRng vi
&hi"! &a0 ;h0Wng 2 -ct *0 thT vta vn vi @Wng hnh Wnh.
2a! ;hi te0 ,0ng &C& Qi tRng Canvas*& vD Si"pe_niverse+ @&
tiJp th'0 1D te0 thU nhCnh nui (!ng. F!3 t^& &wa &]! tr& R& t- th]3
tr0ng thU nhCnh hnh tha& f(0 viE& *G (bng 1p Si"pe_niverseg. [
thU nhCnh nui (!ng @iJn i ;hC& nha! tt &hng trnh nD3 Jn &hng
trnh ;hC& (0 x &x thT ,s3 (`ng &hi tiJt tr0ng &jng tha&. [i"! x &x
nghha 1D ;hjng &x nhZng 1p nui (!ng n giWn &h0 @]t &a -ji trzng
nD0 -D @en -!Qn thiJt 1p.
2a! ;hi te0 ,0ng thU nhCnh nui (!ng+ nx R& &hn vD0 -ji trzng *G
(bng phng tha& add2ran&h%raph &wa Si"pe_niverse. Phng tha&
nD3 1]3 -ut in*tan&' &wa BranchGroup nh 1D tha- *Q (!3 nh]t.
BranchGroup nD3 &h R& thI- vD0 nh 1D -ut &0n &wa Qi tRng
Locae R& te0 @yi Si"pe_niverse.
CMc phf;n$ thRc Si"pe_niverse
Pa&;ag'B co".sun.0*d.utis.universe
void add2ran&h%raph[2ran&h%roup 3g\
2G (bng T thI- nt vD0 Qi tRng L0&a1' &wa thU ;h!ng &Wnh
R& te0 @yi 2i-p1'4niv'r*'. [i"! nD3 *G (bng T thI- vD0 -ut thU
nhCnh nui (!ng ti -ji trzng W0.
`ieing!latfor+ get`ieing!latfor+[\
httpBOOtai1i'!ha3.&0-
220
Lp trnh ha trn Java 2D v 3D
2G (bng T 1]3 thjng tin tt Qi tRng Xi'?ingP1at60r- -D
2i-p1'4niv'r*' &h ra. Phng tha& nD3 *G (bng vi phng tha&
*'tS0-ina1Xi'?ingTran*60r- fg &wa 1p Xi'?ingP1at60r- T i"! &hnh
vU trv !an *Ct.
1.= $Vt v3i th9t n"N tr%n" Java <D
Kai th!t ngZ R& nxi tr0ng phn nD3 1D 1iv' vD &0-pi1'(. ihi
&hn -ut thU nhCnh vD0 L0&a1' 1D- &h0 nx &x thT *Qng f1iv'g vD ;Jt
!W 1D -\i Qi tRng &wa thU nhCnh try thDnh *Qng. ShZng Qi tRng
*Qng 1D nhZng Qi tRng -D &h!n @U R& (`ng hnh+ &h0 nIn nhZng
tha- *Q &wa -ut Qi tRng *Qng ;hjng thT tha3 i trt ;hi ;hW nVng
tng ang &wa nx R& thiJt 1p tr& ;hi Qi tRng *Qng f&apa@i1it3 R&
-j tW tr0ng phn 1.=.2g.
ihi &C& Qi tRng BranchGroup R& (U&h f&0-pi1'(g. XiE& (U&h
BrandGroup &h!3Tn Qi tRng BranchGroup vD t]t &W nhZng hnh tha&
* ;hai &wa nx thDnh (eng ph_ hRp T (`ng hnh. /b& v&h &wa &jng viE&
nD3 1D &h!n @U @& &!Qi &_ng tr& ;hi 1D- &h0 Qi tRng x *Qng.
Phng tha&
2ran&e%roup &o+pile [\
`oid &o+pile [\
DU&h ng!n >ran&h)r0!p tng ang vi Qi tRng @ng &C&h te0 vD
E- -ut thU ;h!ng &Wnh R& (U&h.
C *y &wa viE& (U&h vD *Qng R& @ *!ng tr0ng 1p
SceneGraphF,0ect. 2 phng tha& &wa "&ene%raph'3/e&t R& -j tW
(i s3.
Danh *C&h &C& phng tha& & @Wn &wa SceneGraphF,0ect
2&'n')raphM@N'&t 1D 1p & @Wn &wa t]t &W &C& 1p 1sn &n (_ng T te0
thU ;h!ng &Wnh @a0 g- )r0!p+ L'a6+ vD S0('C0-p0n'nt.
httpBOOtai1i'!ha3.&0-
221
Lp trnh ha trn Java 2D v 3D
2&'n')raphM@N'&t &!ng &]p ;hC nhi"! phng tha& vD th!u& tvnh &h0 &C&
1p &0n &wa nx+ 2 phng tha& R& trnh @D3 (i s3.
3oolean is)o+piled[\
TrW v" -ut giC trU &z &h ra ;hi nD0 th n0(' f1D -ut phn &wa thU
;h!ng &Wnh R& (U&hg
3oolean isLive [\
TrW v" giC trU &z &h ra ;hi nD0 n0(' 1D -ut phn &wa thU ;h!ng
&Wnh *Qng
Ch H rng ;hjng &x @& @^t ! (`ng hnh&W tr0ng &jng tha& &
@Wn 1n &jng tha& n giWn nxi y trIn. >u (`ng hnh &wa Java 5D @^t
! &he3 tr0ng -ut vdng 1p vj hen ;hi -ut thU nhCnh &haa -ut
in*tan&' &wa Xi'? @Vt ! *Qng tr0ng -ut -ji trzng W0. ihi @^t !+
@u (`ng hnh Java 5D th`& hiEn h0et ung nh hnh 1P10
?hi1'ftr!'g
Pr0&'** inp!t
$6 fr'!'*t t0 ',itg @r'a;
P'r60r- >'havi0r*
Trav'r*' th' *&'n' graph
an( r'n('r vi*!a1 0@N'&t*

C1'an!p an( ',it


Phn tr& x giWi thv&h &]! tr& &wa -ut -ji trzng W0 n giWn
-D ;hjng &x thU nhCnh nui (!ng. XiE& te0 thU nhCnh nui (!ng 1D &hw
" &wa -ut *Q phn tiJp th'0. ShZng thW0 1!n ,!ng !anh thU nhCnh
nui (!ng R& ,0a3 !anh &C& vv (b &wa &hng trnh.
httpBOOtai1i'!ha3.&0-
222
Lp trnh ha trn Java 2D v 3D
1.> WX dY Rn "iFnA Ze&&%Java<Da
Chng trnh Java 5D @^t ! @ng viE& Unh nghha 1p -i -y rung
tt 1p #pp1't. Tr0ng vv (b 7eo>ava*&a.0ava (i s3 ta &ng &x 1p
7eo>ava*&a R& -y rung tt 1p #pp1't+ vD viE& *G (bng nx gip n
giWn i r]t nhi"! *0 vi &hng trnh Java 5D R& viJt nh ang (bng u&
1p.
Lp &hvnh &wa &hng trnh Java 5D thzng Unh nghha phng tha&
thiJt 1p thU nhCnh nu (!ng. Tr0ng vv (b nD3 phng tha& nh thJ
R& t tIn 1D &reat"&ene%raphfg.
/i @& th'0 &jng tha& phva trIn "! R& thT hiEn tr0ng 1p
K'110Java5Da. >& 1+te0 Qi tRng Canvas*& f(dng 7 Jn (dng :g.
>& 2 te0 Qi tRng Si"pe_niverse h0Dn thDnh y (dng 1<.
>& 5 te0 nhCnh nui (!ng+ R& h0Dn thDnh @ng 1zi gi y Jn
phng tha& &reat"&ene%raphfg.
>& 7 (U&h thU nhCnh nui (!ng R& th`& hiEn tr0ng (dng 10.
C!Qi &_ng @& tha 9 &hn thU nhCnh nui (!ng vD0 Locae &wa
Si"pe_niverse th`& ,0ng y (dng 19.
public class 1e**ova.af)a extends /pp*et Q
public 1e**ova.af)a(& Q
setNa,out(new BorderNa,out(&&'
Can.asf) can.asf) = new Can.asf)(null&'
add(^Center^, can.asf)&'
Branch%roup scene = create0cene%raph(&'
// 0imp*exni.erse is a Con.enience
xti*it, c*ass
httpBOOtai1i'!ha3.&0-
225
Lp trnh ha trn Java 2D v 3D
0imp*exni.erse simp*ex = new
0imp*exni.erse(can.asf)&'
// This wi** mo.e the ziew*atform bacW a
bit so the
// ob\ects in the scene can be .iewed.
simp*ex.getziewing*atform(&.set#omina*ziewingTra
nsform(&'
simp*ex.addBranch%raph(scene&'
2 // end of 1e**ova.af)a (constructor&
Ta th]3 @& 5 &wa &jng tha& nD3 1D te0 thU nhCnh nui (!ng. /ut
thU nhCnh nui (!ng R& te0 tr0ng 0en - 1P2. [x 1D thU nhCnh nui
(!ng n giWn nh]t &x thT. Sx &haa -ut Qi tRng ha thnh x 1D hnh
1p phng -D!. Knh nD3 R& t y vU trv @an ! tr0ng hE thQng thJ
gii W0. Xi vU trv vD hng nhn nD3+ hnh 1p phng nD3 ,!]t hiEn nh
hnh &hZ nht ;hi R& (`ng 1In.
public Branch%roup create0cene%raph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
ob\$oot.addChi*d(new Co*orCube(+.s&&'
return ob\$oot'
httpBOOtai1i'!ha3.&0-
227
Lp trnh ha trn Java 2D v 3D
2 // end of Create0cene%raph method of
1e**ova.af)a
Lp 7eo>ava*&a R& thta ;J tt #pp1't nhng &hng trnh &x
thT &he3 nh 1D -ut ang (bng vi viE& *G (bng 1p /ain+ra"e. Lp
#pp1't R& *G (bng 1D 1p & *y T (k (Dng &h0 viE& viIt -ut &hng
trnh Java 5D &he3 trIn -ut &Ga *. /ain+ra"e &!ng &]p -ut #LT
6ra-' f&Ga *g &h0 -ut app1' i"! x &h0 phcp app1' &he3 nh -ut ang
(bng. iv&h th& &wa &Ga * R& &h ra tr0ng phn thiJt 1p &wa 1p
/ain+ra"e. [0en - 1P5 @In (i *Y &h ra &C&h *G (bng tr0ng
7eo>ava*&a.0ava.
/ain+ra"e ConStructor
pa&;ag'B &0-.*!n.N5(.!ti1*.app1't
/ain8ra-' gip &h0 -ut app1't &x thT &he3 nh -ut ang (bng. /ut
1p thta ;J tt app1't &x thT &x phng tha& -ainfg (_ng T gi hD- ;hyi
te0 &wa /ain8ra-'. /ain8ra-' -y rung tt Nava.a?t.8ra-' vD @ *!ng
thI- tt Nava.1ang..!nna@1'+ Nava.app1't.#pp1't2t!@+ vD
Nava.app1't.#pp1'tC0nt',t.
KD-
*ain.ra+e[/ava1applet1$pplet applet0 int idth0 int height\
Te0 te0 Qi tRng /ain6ra-' &h0 phcp app1't &he3 nh ang (bng u&
1p.
Tha- *QB #pp1't KD- te0 &wa -ut 1p thta ;J tt app1't.
/ain8ra-' &!ng &]p #LT 6ra-'
public static void main(0tringKL args& Q
drame frame = new Maindrame(new
1e**ova.af)a(&, (5u, (5u&'
httpBOOtai1i'!ha3.&0-
229
Lp trnh ha trn Java 2D v 3D
2 // end of main (method of 1e**ova.af)a&
>a 0en - 1P1+ 1P2+ 1P5 trIn Unh nIn -ut &hng trnh Java 5D
h0Dn thiEn ;hi &C& &s! 1Enh i-p0rt R& *G (bng. K! hJt &C& 1p *G (bng
tr0ng &hng trnh Java 5D y tr0ng &C& gxi 0avax."edia.0*d+ h0&
0avax.vec"ath. Tr0ng vv (b nD3 1p tiEn v&h CoorCu,e R& t- th]3
tr0ng gxi &0-.sun.0*d.utis.$eo"etr' ;Jt !W 1D h! hJt &hng trnh
Java 5D "! &x nhZng &s! 1Enh T i-p0rt &C& th viEn nh hnh 1P7+
ng0ei trt 1p tiEn v&h CoorCu,e.
import \a.a.app*et./pp*et'
import \a.a.awt.BorderNa,out'
import \a.a.awt.drame'
import \a.ax.media.\fd.Branch%roup'
import \a.ax.media.\fd.Can.asf)'
import com.sun.\fd.uti*s.app*et.Maindrame'
import com.sun.\fd.uti*s.geometr,.Co*orCube'
import com.sun.\fd.uti*s.uni.erse.0imp*exni.erse'
Tr0ng vv (b phva trIn -ut Qi tRng ha n R& t tr0ng -ut vU
trv n. Ta &x thU ;h!ng &Wnh nh @In (iB
httpBOOtai1i'!ha3.&0-
22:
Lp trnh ha trn Java 2D v 3D
/ ng!n &wa &hng trnh 1DB
pa&;ag' K'110Java5D
i-p0rt Nava.app1't.#pp1't
i-p0rt Nava.a?t.>0r('rLa30!t
i-p0rt Nava.a?t.8ra-'
i-p0rt Nava,.-'(ia.N5(.>ran&h)r0!p
i-p0rt Nava,.-'(ia.N5(.Canva*5D
i-p0rt &0-.*!n.N5(.!ti1*.app1't./ain8ra-'
i-p0rt &0-.*!n.N5(.!ti1*.g'0-'tr3.C010rC!@'
i-p0rt &0-.*!n.N5(.!ti1*.!niv'r*'.2i-p1'4niv'r*'
OO K'110Java5Da r'n('r* a *ing1'+ r0tating &!@'.
p!@1i& &1a** K'110Java5Da ',t'n(* #pp1't
p!@1i& K'110Java5Dafg
*'tLa30!tfn'? >0r('rLa30!tfgg
Canva*5D &anva*5D n'? Canva*5Dfn!11g
a((fC'nt'r+ &anva*5Dg
>ran&h)r0!p *&'n' &r'at'2&'n')raphfg
OO 2i-p1'4niv'r*' i* a C0nv'ni'n&' 4ti1it3 &1a**
2i-p1'4niv'r*' *i-p1'4 n'? 2i-p1'4niv'r*'f&anva*5Dg
OO Thi* ?i11 -0v' th' Xi'?P1at60r- @a&; a @it *0 th'
OO 0@N'&t* in th' *&'n' &an @' vi'?'(.
*i-p1'4.g'tXi'?ingP1at60r-fg.*'tS0-ina1Xi'?ingTran*60r-fg
httpBOOtai1i'!ha3.&0-
22<
Lp trnh ha trn Java 2D v 3D
*i-p1'4.a((>ran&h)raphf*&'n'g
OO 'n( 06 K'110Java5Da f&0n*tr!&t0rg
p!@1i& >ran&h)r0!p &r'at'2&'n')raphfg
OO Cr'at' th' r00t 06 th' @ran&h graph
>ran&h)r0!p 0@N.00t n'? >ran&h)r0!pfg
0@N.00t.a((Chi1(fn'? C010rC!@'f0.7gg
r't!rn 0@N.00t
OO 'n( 06 Cr'at'2&'n')raph -'th0( 06 K'110Java5Da
OO Th' 60110?ing a110?* thi* t0 @' r!n a* an app1i&ati0n
OO a* ?'11 a* an app1't
p!@1i& *tati& v0i( -ainf2tring arg*g
8ra-' 6ra-' n'? /ain8ra-'fn'? K'110Java5Dafg+ 29:+
29:g
OO 'n( 06 -ain f-'th0( 06 K'110Java5Dag
OO 'n( 06 &1a** K'110Java5Da
iJt !W &wa &hng trnh &he3 1DB
httpBOOtai1i'!ha3.&0-
22=
Lp trnh ha trn Java 2D v 3D
1.>.1 *2c &p c[a Java <D *&asses \]c s^ dYn" tr%n"
Ze&&%Java<Da
[T hiT! &hi tiJt hn v" &C& 1p Java 5D vD vv (b trIn &hng ta !an
ts- Jn nhZng 1p *a!B
LNp BranchGroup
[Qi tRng ;iT! nD3 thzng R& (_ng T Unh (eng thU ;h!ng &Wnh.
/\i in*tan&' &wa BranchGroup 1D gQ& &wa -ut thU &0n. [Qi tRng
BranchGroup &h R& phcp 1D &0n &wa Qi tRng Locae.
BranchGroup &x thT &x nhi"! &0n+ &0n &wa nx &x thT 1D Group h0&
Leaf.
BranchGroup constructor
2ran&h%roup [\
$n*tan&' &wa >ran&h)r0!p R& &0i 1D gQ& &wa -ut nhCnh thU+ -\i
Qi tRng >ran&h)r0!p &h 1D Qi tRng &x thT &hn vD0 tp &C& Qi
tRng &wa L0&a1'*.
httpBOOtai1i'!ha3.&0-
229
Lp trnh ha trn Java 2D v 3D
LNp Canvas*&
LNp Canvas*& R& thta ;J tt Canvas &wa #LT. TQi thiT! -ut Qi
tRng Canvas*& phWi R& tha- &hiJ! Jn tr0ng -ut thU nhCnh hnh
tha& &wa thU ;h!ng &Wnh.
Canvas*& constructor
)anvas3D[%raphi&s)onfiguration graphi&s&onfiguration\
ihyi te0 vD thiJt 1p -ut Qi tRng Canva*5D -i &h0 phcp Java 5D
&x thT (`ng nIn &]! hnh ng ^n &wa Qi tRng
f)raphi&*C0n6ig!rati0ng. Sx 1D phn -y rung &wa 1p #LT Canva*.
6Sp "rans!or#(D
[Qi tRng Transfor"*& ei iEn &h0 viE& @iJn hnh &wa hnh h& 5D
nh (U&h vD !a3. ShZng Qi tRng nD3 thzng &h *G (bng T te0 -ut
Qi tRng Transfor"Group. [! tiIn Qi Transfor"*& R& ;hyi te0+
&x ;hW nVng 1iIn ;Jt vi &C& Qi tRng Transfor"*& ;hC&. 2a! x
Transfor"Group R& ;hyi te0 *G (bng Transfor"*& vta te0.
Transfor"*& &efaut Constructor
/ui Qi tRng tng !an ;hi tha3 i hnh (Cng thjng !a -ut -a
trn 7,7 vi &C& iT- th`&. [Qi tRng Tran*60r-5D ;hjng R& *G (bng
tr0ng thU ;h!ng &Wnh. Sx &h R& (_ng T &h ra *` @iJn hnh &wa -ut
Qi tRng Tran*60r-)r0!p.
,ransfor+3D[\
Te0 Qi tRng Tran*60r-5D -D ei (iEn &h0 -a trn @an ! f;hjng
&x @iJn ig
/ut Qi tRng Transfor"*& &x thT ei (iEn &h0 tUnh tiJn+ !a3+ @iJn
hnh th'0 !3 -j+h0& 1D ;Jt hRp &C& phng phCp trIn 1ei. ihi &x hiEn
tRng !a3+ gx& R& thT hiEn (i (eng ra(ian*. /ut vdng !a3 3 w
httpBOOtai1i'!ha3.&0-
250
Lp trnh ha trn Java 2D v 3D
1D 2 P$ ra(ian*. /ut &C&h T &h ra gx& !a3 1D *G (bng hng /ath.P$+ nJ!
;hjng th &x thT &h ra gx& !a3 &hvnh ,C&.
CMc phf;n$ thRc cga Transfor"*&
[Qi tRng Tran*60r-5D ei (iEn &h0 &C& phcp @iJn i hnh h& nh
!a3+(U&h phxng 1n th! nh. Tran*60r-5D 1D -ut tr0ng *Q it &C& 1p
;hjng tr`& tiJp *G (bng tr0ng thU ;h!ng &Wnh. XiE& @iJn hnh (0
Tran*60r-5D i"! ;hiTn "! R& tC& ung 1In Qi tRng
Tran*60r-)r0!p -D R& *G (bng trIn thU ;h!ng &Wnh.
void rot^[dou3le angle\
Phcp !a3 vi trb& r ngR& &hi"! ;i- ng h+ vi gx& fang1'g 1D giC
trU ra(ian.
void rota[dou3le angle\
Phcp !a3 vi trb& | ngR& &hi"! ;i- ng h+ vi gx& fang1'g 1D giC
trU ra(ian.
void rotb[dou3le angle\
Phcp !a3 vi trb& ngR& &hi"! ;i- ng h+ vi gx& fang1'g 1D giC
trU ra(ian.
void set[`e&tor3f translate\
Te0 giC trU @iJn i &wa -a trn &h0 giC trU &wa tha- *Q X'rt0r56+ vD
te0 &C& thDnh phn ;hC& &wa -a trn nJ! viE& @iJn hnh (`a trIn -a trn.

6Sp "rans!or#0roup
[s3 1D 1p &0n &wa 1p )r0!p+ -\i in*tan&' &wa Transfor"Group
R& *G (bng T te0 thU ;h!ng &Wnh vD &x -ut tp &C& Qi tRng nt
&0n. [Qi tRng Transfor"Group giZ giC trU @iJn hnh. XiE& @iJn hnh
thzng R& te0 trIn Qi tRng Transfor"*& vQn ;hjng phWi 1D -ut Qi
tRng &wa thU ;h!ng &Wnh.
Transfor"Group Constructors
httpBOOtai1i'!ha3.&0-
251
Lp trnh ha trn Java 2D v 3D
,ransfor+%roup[\
ihyi te0 vD thiJt 1p -ut Qi tRng Tran*60r-)r0!p *G (bng phcp
@iJn i ng nh]t
,ransfor+%roup[,ransfor+3D tc\
ihyi te0 vD thiJt 1p -ut Qi tRng Tran*60r-)r0!p tt -ut Qi tRng
Tran*60r-5D
Tha- *QB t1 Qi tRng Tran*60r-5D
Phcp @iJn hnh 1! tr0ng Qi tRng Tran*60r-5D R& &0p3 vD0 -ut
Qi tRng Tran*60r-)r0!p ;hi Qi tRng Tran*60r-)r0!p R& te0 h0&
@ng &C&h *G (bng phng tha& Tran*60r- fg.
,ransfor+%roup set,ransfor+[\
void set,ransfor+[,ransfor+3D tc\
Lp thDnh phn @iJn hnh &wa Tran*60r-)r0!p &h0 giC trU &wa phcp
@iJn hnh tr& x
Tha- *QB T1 phcp @iJn hnh &n *a0 &hcp
6Sp Dertor(!
LD 1p t0Cn h& tr0ng gxi 0avax.vec"ath T Unh ra -ut v'rt0r *G
(bng 5 iT- *Q th`&. CC& Qi tRng v'rt0r thzng R& *G (bng T &h ra
phcp @iJn hnh tr0ng hnh h&. [Qi tRng Certor*f ;hjng R& *G (bng
tr`& tiJp tr0ng &]! tr& &wa thU ;h!ng &Wnh. Chng thzng R& *G
(bng T &h ra &C& & vnh @iJn i.
`e&tor3f )onstru&tors
`e&tor3f[\
Te0 vD thiJt 1p &C& giC trU X'rt0r56 &h0 f0+0+0g
`e&tor3f[float x0 float y0 float d\
Te0 vD thiJt 1p &C& giC trU X'rt0r56 &h0 f,+3+g
CoorCu,e
httpBOOtai1i'!ha3.&0-
252
Lp trnh ha trn Java 2D v 3D
CoorCu,e Constructors
Pa&;ag'B &0-.*!n.N5(.!ti1*.g'0-'tr3
LD -ut hnh 1p phng &C& -t &x &C& -D! ;hC& nha!+ R& -y
rung tt 1p 2hap'5D+ tt x 1D -ut nt 1C. C010rC!@' r]t (k *G (bng ;hi
a vD0 trjng -ut -ji trzng W0.
)olor)u3e [\
Te0 -ut hnh 1p phng vi ;v&h th& -& Unh+ vU trv y 1 -ct &C&h
-\i trb& ta ,3
)olor)u3e[dou3le s&ale\
T4. nMn h'nh =Np phng O PQh thR $& $,nh ra 1Si #
gi# tr, h. trR;
1.L E9a, hnh &p ph\Rn"
[T !a3 hnh 1p phng &hng ta vta te0 th @& ! tiIn 1D te0
phcp @iJn hnh -0ng -!Qn *G (bng Qi tRng Transfor"*&. [0en -
1P9 a ra -ut Qi tRng Transfor"*& tr0ng thU ;h!ng &Wnh T !a3
hnh 1p phng !anh trb& ,. D0 x phcp @iJn hnh ! tiIn 1D !a3. [Qi
tRng Transfor"*& R& te0 ra y (dng :+ *G (bng phng tha& rot^fg y
(dng =. [Qi tng Transfor"Group *a! x R& te0 giZ thjng tin !a3
y (dng tha 10.
tha- *Q &h ra phcp !a3 nD3B1D trb& vD gx& !a3. Tr0ng x gx& !a3
R& ,C& Unh thjng !a tha- *Q ! vD0. [Qi tRng Transfor"*& R&
te0 ,0ng th R& *G (bng T te0 Qi tRng Transfor"Group 1D
0@N.0tat'. [Qi tRng Transfor"*& R& *G (bng tr0ng thU ;h!ng
&Wnh Qi tRng 0@N.0tat' *a! x 1]3 Qi tRng C010rC!@' 1D- &0n &wa
nx. [Jn 1Rt o,0#oot 1ei 1]3 o,0#otate 1D- &0n.
public Branch%roup create0cene%raph(& Q
httpBOOtai1i'!ha3.&0-
255
Lp trnh ha trn Java 2D v 3D
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
// rotate ob\ect has composited
transformation matrix
Transformf) rotate = new Transformf)(&'
Transformf) temp$otate = new Transformf)(&'
rotate.rotg(Math.PI/s.+d&'
temp$otate.rotY(Math.PI/5.+d&'
rotate.mu*(temp$otate&'
Transform%roup ob\$otate = new
Transform%roup(rotate&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(new Co*orCube(+.s&&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2
Sh v3 @In thU nhCnh nui (!ng &x &C& Qi tRng nh hnh (i+
&h H 1D Qi tRng BranchGroup @a0 giz &ng 1D &0n &wa -ut L0&a1'.
httpBOOtai1i'!ha3.&0-
257
Lp trnh ha trn Java 2D v 3D
(.?.( SO kdt hLp cga cMc phXp ,idn hUnhh 7eo>ava*&,
Tr0ng trzng hRp &x nhi"! phcp @iJn hnh ng thzi ,W3 ra+ y vv (b
&wa &hng ta 1D *Y &x 2 phcp @iJn hnh ng thzi+ *Y R& &h trIn -ut Qi
tRng !an *Ct (!3 nh]t. 2 phcp @iJn i &x thT thjng !a -ut -a trn
@iJn i vD R& giZ @yi -ut Qi tRng Transfor"Group.
Tr0ng vv (b hnh 1P: &hng ta !an *Ct (i s3 th`& hiEn 2 phcp
!a3 trIn 2 trb& , vD 3. 2 Qi tRng Transfor"*& vi -\i phcp !a3
R& te0 ra y (dng : vD <. 2a! x 2 phcp !a3 riIng rY nD3 R& &h ra
trIn 2 Qi tRng Transfor"Group f(dng 9 vD 10g. 2a! x &C& phcp !a3
R& nQi 1ei vi nha! @ng &C& nhsn Qi tRng
Di s3 1D thU ;h!ng &Wnh vD ;Jt !W &he3 &hng trnh
iJt !WB
httpBOOtai1i'!ha3.&0-
259
Lp trnh ha trn Java 2D v 3D
1.M _hF nJn" v3 h%`t Vn"
[ thU ;h!ng &Wnh R& te0 @yi &hng trnh Java 5D &x thT *G (bng
tr`& tiJp tr0ng viE& (`ng hnh+ t!3 nhiIn -j tW &wa nx 1ei ;hjng hiE! !W.
Xi -ut -iI! tW tQt hn &wa -ji trzng W0 *Y tVng &zng ;hW nVng (`ng
hnh r]t nhi"!.
(.^.( &Hch cMc nei dun$
[Qi tRng BranchGroup &x -ut phng tha& (U&h. Phng tha& nD3
&h!3Tn t0Dn @u thU nhCnh (i thDnh &C& -j tW Java 5D tr0ng &wa
thU nhCnh. ThI- vD0 x+ nhZng -j tW @In tr0ng nD3 &x thT tQi ! hxa th'0
&C&h nD3 ha3 &C&h ;hC&.
/ut tr0ng nhZng &C&h x 1D+ ;Jt hRp Transfor"Groups vi zng i
thU ;h!ng &Wnh . Xv (b nJ! -ut thU ;h!ng &Wnh &x 2 Qi tRng
Transfor"Group tr0ng -ut -Qi 1iIn hE &ha &0n &hng &x thT ei (iEn
@ng -ut Qi tRng Transfor"Group. /ut &C&h ;hC& 1D 1iIn ;Jt Qi
tRng Shape*& vQn &x -Qi 1iIn hE vt 1v thnh.
Knh 1P1: (i s3 a ra -ut -j tW -i hiE! !W hn.
httpBOOtai1i'!ha3.&0-
25:
Lp trnh ha trn Java 2D v 3D
(.^.% 8hJ nIn$
/ut ;hi thU nhCnh R& 1D- &h0 *Qng vD (U&h+ hE thQng (`ng hnh
&wa Java 5D &h!3Tn thU nhCnh *ang -ut -j tW @In tr0ng hiE! !W hn+
!a x &ng tVng &a0 hiE! nVng (`ng hnh.
XiE& @iJn i !a -j tW @In tr0ng &x nhZng tC& ung ;hC& nha!. /ut
tr0ng *Q x 1D &Q Unh giC trU @iJn hnh vD &C& Qi tRng tr0ng thU
;h!ng &Wnh. Trt phi &x &h ra &hi tiJt &wa &hng trnh+ th *Y ;hjng &x
;hW nVng tha3 i giC trU &wa &C& Qi tRng thU ;h!ng &Wnh *a! ;hi
&hng *Qng.
Cx nhZng trzng hRp -ut &hng trnh vn &n ;hW nVng tha3i giC
trU &wa &hng tr0ng -ut Qi tRng thU ;h!ng &Wnh *a! ;hi nx *Qng.
Xv (b nh viE& tha3 i giC trU &wa -ut Qi tRng Transfor"Group te0
h0et ha. /ut (anh *C&h &C& tha- *Q &x thT tr!3 &p R& vD ;hi x
ngzi ta gi 1D nVng 1`& f&apa@i1it3g &wa -ut Qi tRng.
/\i Qi tRng SceneGraphF,0ect &x -ut tp &C& @it nVng 1`&. )iC
trU &wa &C& @it nD3 ,C& Unh ;hW nVng &x thT tn tei &h0 Qi tRng *a! ;hi
httpBOOtai1i'!ha3.&0-
25<
Lp trnh ha trn Java 2D v 3D
nx R& (U&h ha3 *Qng. Tp &C& nVng 1`& nD3 @iJn i ;hC& nha! trIn &C&
1p.
SceneGraphF,0ect /ethods
2&'n')raphM@N'&t 1D 1p gQ& thzng R& *G (bng T te0 -ut thU
;h!ng &Wnh @a0 g- &W )r0!p+ L'a6 vD S0('C0-p0n'nt.
void &lear)apa3ility[int 3it\
rxa &C& @it ;hW nVng
3oolean get)apa3ility[int 3it\
Phb& hi.
Sh tr0ng -ut vv (b nxi+ T &x thT & R& giC trU @iJn hnh ei
(iEn &h0 -ut Qi tng Transfor"Group+ th &C& ;hW nVng &wa nx phWi
R& thiJt 1p tr& ;hi h0& nx R& (U&h h0& try nIn *Qng.
Tr0ng phn ti+ &C& h0et ha &x thT R& te0 ra t_3 th'0 &C& thzi gian
;hC& nha! &wa phcp @iJn hnh. /!Qn &x i"! nD3 Tran*60r-)r0!p phWi
&x tp ;hW nVng #LLMLT.#S28M./L.$T% tr& ;hi nx R&
(U&h h0& *QngXiE& i"! ;hiTn ;h nVng tr!3 &p Jn &C& 1hnh v`& ;hC&
&wa Qi tRng Transfor"Group &ng nh v3. [Qi tRng
Transfor"Group.
Tran*60r-)r0!p Capa@i1iti'*
;hW nVng (i s3 1D -ut tr0ng nhZng ;hW nVng R& Unh nghha @yi
Tran*60r-)r0!p. Tran*60r-)r0!p thta ;J r]t nhi"! @it ;h nVng &wa 1p
ti"n @Qi &wa nx 1D )r0!p vD S0('. CC& ;hW nVng nh *'t+r'*'t ha3 r'tri'v'
R& Ung nghha y 2&'n')raphM@N'&t.
#LLMLT.#S28M./.%#D
Ch ra &C& nt &h0 phcp tr!3 &p ti thjng tin @iJn hnh &wa Qi tRng
&wa nx.
#LLMLT.#S28M./L.$T%
Ch0 phcp ghi ti thjng tin @iJn hnh &wa Qi tRng &wa nx.
httpBOOtai1i'!ha3.&0-
25=
Lp trnh ha trn Java 2D v 3D
)r0!p Capa@i1iti'*
Tran*60r-)r0!p thta ;J &C& ;hW nVng tt &C& 1p &ha &wa nx.
#LLMLCK$LD.%S%rT%SD
ThiJt 1p ;hW nVng &h0 phcp &0n &x thT thI- vD0 n!t )r0!p *a! ;hi nx
R& (U&h h0& *Qng.
#LLMLCK$LD.%S.%#D
ThiJt 1p ;hW nVng &h0 phcp &C& tha- &hiJ! Jn &0n &wa nt )r0!p &x thT
R& & *a! ;hi nx R& (U&h h0& *Qng.
#LLMLCK$LD.%SL.$T%
ThiJt 1p ;hW nVng &h0 phcp th'- &hiJ! Jn &C& &0n &wa nt )r0!p T ghi
ha3 tha3 i *a! ;hi nx R& (U&h h0& *Qng.
1.a Thb! v3% c2c h3nh vi ani!ati%n
Tr0ng Java 5D+ >'havi0r 1D -ut 1p !an trng v" ani-ati0n vi &C&
tng tC& &wa &C& Qi tRng. Sgzi 1p trnh &x thT tha3 i @]t &a th!u&
tvnh nD0 &wa -ut Qi tRng !an *Ct.
2` ;hC& nha! giZa ani-ati0n vD int'ra&ti0n 1D ;hi nD0 th!u& tvnh R&
;v&h h0et ;hi phDn hi !a thzi gian ha3 phWn hi !a &C& hDnh ung &wa
ngzi *G (bng.
Xi -\i Qi tRng !an *Ct tr0ng -ut -ji trzng W0 &x thT &x nhZng
hDnh vi *n &x &wa nx. Th`& tJ th thzng &x nhi"! hDnh vi . [T &h ra -ut
hDnh vi &h0 -ut Qi tRng !an *Ct+ ngzi 1p trnh te0 -ut Qi tRng -D
&h ra hDnh vi x+ thI- vD0 &C& Qi tRng !an *Ct ti thU ;h!ng &Wnh
vD ,s3 (`ng nhZng tha- &hiJ! giZa &C& Qi tRng thU vD &C& Qi tRng
hDnh vi.
Tr0ng -ut -ji trzng W0 vi r]t nhi"! hDnh vi+ th &n -ut 1Rng tvnh
t0Cn r]t 1n. ihi &W viE& (`ng hnh vD &C& hDnh vi *G (bng &_ng &h!ng
nhi"! pr0&'**+ th tht ;hx &x thT nsng &a0 hiE! nVng h0et ung R&.
httpBOOtai1i'!ha3.&0-
259
Lp trnh ha trn Java 2D v 3D
Java 5D &h0 phcp 1p trnh viIn &x thT- !Wn 1v v]n " nD3 @ng &C&h
&h ra vU trv &wa -ut hDnh vi. ih! v`& nD3 R& gi 1D *&h'(!1ing r'gi0n.
/ut hDnh vi ;hjng h0et ung tr phi a&tivati0n v01!-' &wa
Cie1Patfor" phsn &^t -ut v_ng (anh -b& x. Sxi &C&h ;hC&+;hjng &x
&h\ tr0ng rtng T 1C ri th *Y ;hjng &x 1C ri. Tvnh nVng v_ng (anh -b&
1D- &h0 Java 5D hiE! !a hn tr0ng viE& n^- @^t -ut -ji trzng W0 vi
r]t nhi"! hDnh vi.
Knh 1P< &h ra &C& @& @a0 g- &W viE& Unh ra -ut ani-ati0n vi
-ut Qi tRng thI- vD0.
1. Cr'at' a targ't Tran*60r-)r0!p
2't th' #LLMLT.#S28M./L.$T% &apa@i1it3
2. Cr'at' an #1pha9 0@N'&t
2p'&i63 th' ti-' para-'t'r* 60r th' a1pha
5. Cr'at' th' int'rp01at0r 0@N'&t
Kav' it r'6'r'n&' th' #1pha an( Tran*60r-)r0!p 0@N'&t*
C!*t0-i' th' @'havi0r para-'t'r*
7. 2p'&i63 a *&h'(!1ing r'gi0n
2't th' *&h'(!1ing r'gi0n 60r th' @'havi0r
9. /a;' th' @'havi0r a &hi1( 06 th' Tran*60r-)r0!p
(.i.( GHnh n$h9a cMc hnh vi ani"ation
/ut hDnh vi &x thT tha3 i trIn Ua iT- fP0*iti0n$nt'rp01at0rg+
hng f.0tati0n$nt'rp01at0rg+ ;v&h &f2&a1'$nt'rp01at0rg+ -D!
*^&fC010r$nt'rp01at0rg h0& u tr0ng *!QtfTran*par'n&3$nt'rp01at0rg &wa
-ut Qi tRng !an *Ct. Sh nxi y phva trIn .nterpoator 1D &C& 1p
hDnh vi R& Unh nghha tr&. T]t &W &C& hDnh vi nxi trIn "! &x thT *G
(bng -D ;hjng &n Unh tr& t!3 nhiIn viE& Unh tr& &h0 phcp viE&
httpBOOtai1i'!ha3.&0-
270
Lp trnh ha trn Java 2D v 3D
te0 &C& hDnh vi try nIn (k (Dng hn r]t nhi"!. CC& 1p Unh tr& nD3
&!ng &]p &C& hDnh ung ;hC& nha! th- &hv ;Jt nQi &C& hDnh ung x.
6Sp 2otation3nterpolator
Lp nD3 *G (bng T &h ra -ut hDnh vi !a3 &wa -ut Qi tRng !an *Ct
h0& -ut nhx- &C& Qi tRng nh v3. /ut Qi tRng
#otation.nterpoator tha3 i -ut Qi tRng Transfor"Group !a -ut
phcp !a3 ;hi phWn hi giC trU &wa -ut Qi tRng !pha. ihi giC trU &wa
Qi tRng !pha tha3 i !a thzi gian viE& tha3 i phcp !a3 &ng (k
(Dng. /ut Qi tRng #otation.nterpoator r]t 1inh ung tr0ng viE& &h ra
trb& !a3+ gx& !a3 @an ! gx& !a3 ;Jt th&.
#otation.nterpoator Constructor
(otationenterpolator[$lpha alpha0 ,ransfor+%roup target\
KD- ;hyi te0 nD3 *G (bng &C& giC trU -& Unh &h0 -ut vDi tha- *Q
&wa hDnh vi -& Unh T ;hyi te0 -ut phcp !a3 3 w trIn trb& 3+ @ng
Qi tRng Tran*60r-)r0!p R& &h ra @ng hDnh vi -& Unh.
Tha- *QB
a1pha thzi gian hD- tha3 i T tha- &hiJ!
targ't Qi tRng Tran*60r-)r0!p &n tha3 i
9 #1pha 1D -ut 1p tr0ng Java 5D T te0 ra &C& hD- @iJn i thzi gian.
(.i.% CMc h" ,idn ji v\ thi $ianh knh xl "et hnh vi vNi thi $ian
XiE& Cnh ,e -ut Qi tRng vi thzi gian thjng !a -ut Qi tRng #1pha.
6Sp lpha
Lp nD3 R& *G (bng T te0 hD- @iJn i th'0 thzi gian. Lp nD3
&!ng &]p &C& giC trU giZa 0 vD 1+. )iC trU nD3 phb th!u& vD0 thzi iT- vD
thjng *Q &wa Qi tRng !pha. [Qi tRng !pha thzng R& *G (bng
vi &C& Qi tRng hDnh vi *n &x T th`& hiEn &C& tha3 i h0et ha &wa
&C& Qi tRng !an *Ct.
httpBOOtai1i'!ha3.&0-
271
Lp trnh ha trn Java 2D v 3D
Cx 10 tha- *Q &h0 !pha+ (0 x gip &h0 ngzi 1p trnh *G (bng
1inh ung. /\i in*tan&' &wa Qi tRng !pha &x thT (k (Dng ;Jt hRp vi
-ut hDnh vi T a ra &C& phcp !a3 n giWn+ &Cnh @a3+ &Ga -y+ha3 @^n
r0&;'t.
!pha Constructor
$lpha[\
LiIn tb& 1p vi thzi gian Unh ; 1D 1 gis3
$lpha[int loop)ount0 long in&reasing$lphaDuration\
KD- ;hyi te0 nD3 1]3 100pC0!nt vD in&r'a*ing#1phaD!rati0n nh 1D
tha- *Q vD Vng ;v giC trU -& Unh &h0 t]t &W &C& tha- *Q &dn 1ei. [Qi
tRng #1pha te0 ra &!ng &]p giC trU ;hyi ! tt 0 1In 1. [i"! nD3 1p i
1p 1ei nhi"! 1n thjng !a 100pC0!nt. SJ! 100pC0!nt P1 Qi tRng
a1pha 1p i 1p 1ei vj hen.
Tha- *QB
100pC0!nt *Q 1n &he3 Qi tRng a1pha nD3+ giC trU @ng P1 1p
vj hen
in&r'a*ing#1phaD!rati0n thzi gian tvnh @ng gis3 giZa @&
nh3 tt 0 1In 1
(.i.* L:p danh "Sc cMc vYn$
Sh nxi y phn 1P9 -\i hDnh vi &x -ut v_ng (anh -b&. X_ng nD3
!anh &C& hDnh vi R& thiJt 1p (`a trIn phng tha&
set"&heduling2ounds &wa 1p Behavior.
Cx r]t nhi"! &C&h T Unh nghha v_ng (anh -b& nD3 nhng &C&h n giWn
nh]t 1D te0 Qi tRng BoundSphere . CC& t_3 &hn ;hC& nh @0!n(ing
@0,+ h0& @0!(ing p013t0p'.
Behavior setScheduin$Bounds "ethod
void set"&heduling2ounds[2ounds region\
httpBOOtai1i'!ha3.&0-
272
Lp trnh ha trn Java 2D v 3D
rC& Unh ranh gii &h0 v_ng (anh -b& &wa hDnh vi
Para-'t'r*B
r'gi0n ranh gii &haa >'havi0r* *&h'(!1ing r'gi0n.
6Sp Koun'ingSphere
XiE& Unh nghha -ut v_ng &! phWi i ji vi viE& &h ra iT- tr!ng
ts- vD @Cn ;vnh &wa nx. CC&h thzng 1D- 1D T ts- &wa hnh &! y vU trv
tr!ng ts- 1D f0+0+0g. >Cn ;vnh *a! x R& 1`a &hn w *a0 &h0 hnh &!
&haa Qi tRng !an *Ct+ @a0 g- t]t &W &C& vU trv -D Qi tRng &x thT y
x.
Boundin$ Sphere Constructors
2ounding"phere[\
Te0 -ut hnh &! @a0 -D ts- y vU trv f0+0+0g vi @Cn ;vnh @ng 1
2ounding"phere[!oint3d &enter0 dou3le radius\
2 tha- *Q 1n 1Rt 1D
&'nt'r ta u &wa ts- tr0ng ;hjng gian
ra(i!* @Cn ;vnh &wa hnh &!
(.i.- Cm dS v\ hnh vih 7eo>ava*&c
[0en - hnh 1P< a ra -ut vv (b h0Dn thiEn v" viE& *G (bng 1p
thI- vD0 T te0 ani-ati0n. #ni-ati0n R& te0 tr0ng 0en - nD3 1D
hnh 1p phng !a3 1iIn tb& tr0ng thzi gian 7 gis3.
>& ! tiIn &wa &jng tha& 1D te0 Qi tRng Transfor"Group T
*Ga i tei thzi iT- &he3. [Qi tRng Transfor"Group &wa -jt hDnh vi
*n &x phWi &x ;hW nVng ghi. [Qi tRng Transfor"Group tIn 1D 0@N2pin
R& te0 y (dng <. ihW nVng &wa nx R& thiJt 1p y (dng tha =.
httpBOOtai1i'!ha3.&0-
275
Lp trnh ha trn Java 2D v 3D
>& 2 1D te0 Qi tRng !pha+ r0tati0n#1pha+ R& *G (bng T ,C&
Unh thzi gian !a3 1iIn tb&. 2 tha- *Q &h ra tr0ng (dng 1: &wa 0en -
1D *Q vdng 1p vD thzi gian &h0 -\i vdng . )iC trU P1 &wa *Q vdng 1p thT
hiEn viE& 1p 1iIn tb&. Thzi gian R& tvnh th'0 -i1i gis3 giC trU 7000 R&
*G (bng tr0ng &hng trnh tng ng vi 7 gis3. Tt x hDnh vi 1D
!a3 -ut 1n trIn 7 gis3*.
>& 5 1D te0 Qi tRng thI- vD0. [Qi tRng !a3
#otation.nterpoator R& te0 ra y (0ng 21 vD 22. [Qi tRng thI- vD0
phWi tha- &hiJ! Jn Qi tRng @iJn hnh vD a1pha. [i"! nD3 R& -j tW
tr0ng hD- ;hyi te0. Tr0ng vv (b nD3 hDnh vi -& Unh
.0tati0n$nt'rp01at0r 1D R& *G (bng+ T th`& hiEn phcp !a3 h0Dn t0Dn
!anh trb& 3.
>& 7 &h ra v_ng (anh -b&. Tr0ng 0en -+ -ut Qi tRng
Boundin$Sphere R& *G (bng vi giC trU -& Unh+ R& te0 ra y (dng
29. X_ng &! nD3 1D v_ng @a0 !anh &wa hDnh vi tr0ng (dng 2:.
C!Qi &_ng 1D @& 9 tr0ng &jng tha&+ @iJn hDnh vi thDnh -ut &0n &wa
Transfor"Group trIn (dng 2<.
public Branch%roup create0cene%raph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'

// Create the transform group node and
initia*ize it to the
// identit,. /dd it to the root of the
subgraph.
Transform%roup ob\0pin = new
Transform%roup(&'
ob\0pin.setCapabi*it,(Transform%roup.ALL
OW_TRANSFORM_WRITE&'
httpBOOtai1i'!ha3.&0-
277
Lp trnh ha trn Java 2D v 3D
ob\$oot.addChi*d(ob\0pin&'

// Create a simp*e shape *eaf node, add
it to the scene graph.
// Co*orCube is a Con.enience xti*it,
c*ass
ob\0pin.addChi*d(new Co*orCube(+.s&&'

// Create a new Beha.ior ob\ect that
wi** perform the desired
// operation on the specified transform
ob\ect and add it into
// the scene graph.
/*pha rotation/*pha = new /*pha(XO,
s+++&'

$otation{nterpo*ator rotator =
new
$otation{nterpo*ator(rotation/*pha, ob\0pin&'

// a bounding sphere specifies a region
a beha.ior is acti.e
// create a sphere centered at the
origin with radius of O++
Bounding0phere bounds = new
Bounding0phere(&'
rotator.set0chedu*ingBounds(bounds&'
ob\0pin.addChi*d(rotator&'

httpBOOtai1i'!ha3.&0-
279
Lp trnh ha trn Java 2D v 3D
return ob\$oot'
2 // end of Create0cene%raph method
C0(' 8rag-'nt 1P< &r'at'2&'n')raph -'th0( ?ith .0tati0n$nt'rp01at0r
>'havi0r
[ thU ;h!ng &Wnh &wa &hng trnh vD ;Jt !W &he3 trIn -Dn hnh.
iJt !W
(.i.2 PhXp ,idn hUnh v kdt hLp cMc hnh vi .Cm dSh 7eo>ava*&d
T]t nhiIn &hng ta &x thT ;Jt hRp &C& hDnh vi vi &C& phcp @iJn hnh
!a3 vi vv (b (i s3. Tr0ng thU nhCnh nui (!ng &x nhZng Qi tRng
httpBOOtai1i'!ha3.&0-
27:
Lp trnh ha trn Java 2D v 3D
0@N.0tat' vD 0@N2pin+ phsn @iEt vi nhZng phcp !a3 thnh vD hDnh vi &wa
Qi tRng hnh 1p phng.
[ thU ;h!ng &Wnh
public Branch%roup create0cene%raph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
// rotate ob\ect has composited
transformation matrix
Transformf) rotate = new Transformf)(&'
Transformf) temp$otate = new Transformf)(&'
rotate.rotg(Math.PI/s.+d&'
temp$otate.rotY(Math.PI/5.+d&'
rotate.mu*(temp$otate&'
Transform%roup ob\$otate = new
Transform%roup(rotate&'
// Create the transform group node and
initia*ize it to the
// identit,. !nab*e the T$/#0d-$M"V${T!
capabi*it, so that
// our beha.ior code can modif, it at
runtime. /dd it to the
// root of the subgraph.
Transform%roup ob\0pin = new
Transform%roup(&'
httpBOOtai1i'!ha3.&0-
27<
Lp trnh ha trn Java 2D v 3D
ob\0pin.setCapabi*it,(Transform%roup.ALLOW_TRANSF
ORM_WRITE&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(ob\0pin&'

// Create a simp*e shape *eaf node, add it to
the scene graph.
// Co*orCube is a Con.enience xti*it, c*ass
ob\0pin.addChi*d(new Co*orCube(+.s&&'
// Create a new Beha.ior ob\ect that wi**
perform the desired
// operation on the specified transform
ob\ect and add it into
// the scene graph.
Transformf) ,/xis = new Transformf)(&'
/*pha rotation/*pha = new /*pha(XO, s+++&'
$otation{nterpo*ator rotator =
new $otation{nterpo*ator(rotation/*pha,
ob\0pin, ,/xis,
+.+f, (float&
Math.PI](.+f&'
// a bounding sphere specifies a region a
beha.ior is acti.e
// create a sphere centered at the origin
with radius of O
httpBOOtai1i'!ha3.&0-
27=
Lp trnh ha trn Java 2D v 3D
Bounding0phere bounds = new Bounding0phere(&'
rotator.set0chedu*ingBounds(bounds&'
ob\0pin.addChi*d(rotator&'
return ob\$oot'
2 // end of Create0cene%raph method of
1e**ova.af)d
iJt !W
httpBOOtai1i'!ha3.&0-
279
Lp trnh ha trn Java 2D v 3D
httpBOOtai1i'!ha3.&0-
290
Lp trnh ha trn Java 2D v 3D
C*ABCG 2
T4. # h'nh
2.1 Z4 ta V th6 "ii F%
Tr0ng &hng 1 ta @iJt vi -\i in*tan&' &wa -ut 1p
Xirt!a14niv'r*' &x &ha& nVng nh -ut gQ& &wa thU ;h!ng &Wnh tr0ng
t]t &W &hng trnh Java 5D. Tt ;hxa virt!a1 !niv'r*' 1D &h -ut ;hjng
gian W0 5 &hi"! tr0ng x &x &C& Qi tRng 5D. /\i Qi tRng L0&a1' tr0ng
-ut -ji trzng W0 thiJt 1p -ut thJ gii W0 Cart'*ian. [Qi tRng nD3
tng ng vi -ut &0n tr tha- &hiJ! &h0 -ut Qi tRng !an *Ct
tr0ng -ut -ji trzng W0. Xi -ut Qi tRng L0&a1' tr0ng
2i-p1'4niv'r*' &x -ut hE ta u (!3 nh]t.
KE ta u &wa -ji trzng W0 Java 5D 1D th!n phWi ta& 1D trb& r
hng (ng @In ta3 phWi+ trb& | hng (ng &h 1In trIn+ trb& hng
(ng &h vD0 ngzi nhn vi n vU 1D -ct. Knh 2P1 (i s3 &h ra
hng nhn tr0ng Si"pe_niverse.
httpBOOtai1i'!ha3.&0-
291
Lp trnh ha trn Java 2D v 3D
2.2 Wis9a& c+dect De-initi%n 'asics
Phn 2.2.1 gii thiE! 1p Ch'n &0(' 1ai &h0 r0 rang .+ &dn 1p Ch'n
&0(' 1ai &h0 r0 rang .R& gii thiE! y phn 2.2.2+ *a! ;hi i vD0 nhZng
Unh nghha & @Wn v" hnh h& tr0ng gxi tiEn v&h+ phn &dn 1ei &wa &hng
nD3 *Y thW0 1!n v" gx& u hnh h& vD hnh (Cng &wa &C& nt thDnh phn.
%.%.( !n .nstance of Shape*& &efines a Cisua F,0ect
St thU ;h!ng &Wnh Shape*& Unh nghha -ut Qi tRng !an *Ct.
Shape*& 1D -ut tr0ng &C& 1p &0n &wa 1p Leaf tt x Qi tRng Shape*&
&h &x thT 1D 1C tr0ng thU ;h!ng &Wnh. [Qi tRng Shape*& ;hjng &haa
thjng tin v" hnh (eng ha3 -D! *^& &wa -ut Qi tRng !an *Ct. Thjng tin
nD3 R& 1! tr0ng Qi tRng bodeCo"ponent R& &h!3Tn Jn @i Qi
tRng Shape*&. /ut Qi tng Shape*& &x thT !3 vD0 -ut nt thDnh
phn hnh h& vD -ut nt thDnh phn gia0 (iEn.
Tr0ng thU ;h!ng &Wnh K'110Nava5D y &hng 1+ @iT! tRng hnh ta
giC& (_ng T ei (iEn &h0 Qi tRng CoorCu,e. [ thU ;h!ng &Wnh tr0ng
hnh 2P2 &h ra Qi tRng !an *Ct R& ei (iEn @yi -ut 1C Shape*&
fhnh ta- giC&g vD 2 bodeCo"ponent fj vang tha3 &h0 hnh (eng ta giC&.
httpBOOtai1i'!ha3.&0-
292
Lp trnh ha trn Java 2D v 3D
/ut Qi tRng !an *Ct &x thT Unh nghha @ng &C&h *G (bng &h (Qi
tRng Shape*& vD -ut nt thDnh phn hnh h&. Xi t_3 &hn nD3+ Qi
tRng Shape*& !3 &h0 -ut nt !ppearance. KD- te0 &h0 Qi tRng
Shape*& &h0 phcp Qi tRng Shape*& R& te0 -D ;hjng &n tha-
&hiJ! &wa nt thDnh phn+ h0& &h vi tha- &hiJ! thDnh phn hnh h&+
h0& &W 2 (eng.
Shape*& C0n*tr!&t0r*
"hape3D[\
ihyi te0 vD thiJt 1p Qi tRng Shape*& -D ;hjng &x nt thDnh phn
hnh h& vD gia0 (iEn
"hape3D[%eo+etry %eo+etry\
ihyi te0 vD thiJt 1p &h vi thDnh phn hnh h&
"hape3D[%eo+etry %eo+etry0 $ppearan&e $ppearan&e\
ihyi te0 vD thiJt 1p &h vi &W 2 thDnh phn.
Ch0 Jn ;hi Qi tRng Shape*& ;hjng *Qng h0& ;hjng R& (U&h
nZa th tha- &hiJ! nt thDnh phn &x thT tha3 i vi &C& phng tha&
(i s3.
Shape*& /'th0(*
httpBOOtai1i'!ha3.&0-
295
Lp trnh ha trn Java 2D v 3D
[Qi tRng Shape*& tha- &hiJ! Jn Qi tRng nt thDnh phn hnh
h& vD gia0 (iEn.
void set%eo+etry[%eo+etry %eo+etry\
void set$ppearan&e[ppearance ppearance\
Shape*& Capa@i1iti'*
[Qi tRng Shape*& thta ;J &C& ;hW nVng tt 2&'n')raphM@N'&t+ S0(' vD
L'a6.
#LLMLG)F/)T#n.%#D - L.$T%
#LLML!PP)!#!bC).%#D - L.$T%
#LLMLCMLL$2$MSBF_b&S.%#D - L.$T%
%.%.% bode Co"ponents
[Qi tRng bodeCo"ponent &haa &C& Unh nghha &hvnh ,C& v" &C&
th!u& tvnh &wa -ut Qi tRng !an *Ct. Xi -\i 1p &0n &wa
bodeCo"ponent Unh nghha v&h ,C& &C& th!u& tvnh !an *Ct. Knh 2P5
&h ra &C& phn thta ;J &wa Java 5D #P$ &haa 1p bodeCo"ponent vD
1p tr& nx. Phn 2P9 *Y gii thiE! v" bodeCo"ponent )'r-'tr3. Phn
2P: gii thiE! v" !ppearance bodeCo"ponent.
httpBOOtai1i'!ha3.&0-
297
Lp trnh ha trn Java 2D v 3D
%.%.* &efinin$ Cisua F,0ect Casses
C_ng -ut Qi tRng !an *Ct *Y thzng ,!]t hiEn nhi"! 1n tr0ng -ut
-ji trzng W0. [i"! x gRi H &h0 viE& Unh nghha -ut 1p T te0 Qi
tRng !an *Ct tha3 v thiJt 1p -\i Qi tRng !an *Ct riIng 1. Cx nhi"!
&C&h T thiJt ;J -ut 1p T Unh nghha -ut Qi tRng !an *Ct.
T &ha& &wa 1p CisuaF,0ect &ng giQng nh 1p CoorCu,e -D
tr0ng x nx R& thta ;J tt Qi tRng CisuaF,0ect. Lp CisuaF,0ect
1D -ut iT- " nghU ! tiIn &h0 viE& Unh nghha &C& 1p nui (!ng T *G
(bng tr0ng ,s3 (`ng thU ;h!ng &Wnh. /\i ngzi 1p trnh Java 5D *Y
t_3 @iJn 1p CisuaF,0ect th'0 H &wa h. Chng ta &x thI- ,'- -ut vv
(b 3 w v" 1p CoorCu,e tr0ng gxi co".sun.0*d.utis.Geo"etr' .
2G (bng Shape*& nh 1D 1p & @Wn &h0 viE& te0 -ut Qi tRng !an
*Ct &h0 phcp (k (Dng *G (bng tr0ng &hng trnh Java 5D. Lp Qi tRng
!an *Ct &x thT R& *G (bng (k (Dng nh 1p CoorCu,e tr0ng vv (b
K'110Java5D tt &hng+ KD- te0 &x thT R& gi vD nhZng Qi tRng
httpBOOtai1i'!ha3.&0-
299
Lp trnh ha trn Java 2D v 3D
-i nh]t R& thI- vD0 nh 1D &0n &wa -ut vDi )r0!p trIn -ut (dng &wa
0en -. Tr0ng 0en - (i s3 0@N.00t 1D -ut in*tan&' &wa )r0!p.
[0en - nD3 te0 -ut CisuaF,0ect vD thI- nx vD0 nh 1D &0ng &wa
0@N.00t tr0ng thU ;h!ng &Wnh.
o452oot.a''Chil'Bne/ Disual145ectBCCT
KD- te0 &wa CisuaF,0ect te0 Qi tRng !an *Ct @ng &C&h tep -ut
Qi tRng Shape*& tha- &hiJ! Jn bodeCo"ponent R& te0 @yi
phng tha& &reate0eo#etr&fgvD &reate$ppearan&e[\1
Phng tha& &reate0eo#etr&fgte0 -ut nt thDnh phn hnh h& R&
*G (bng tr0ng Qi tRng !an *Ct. Phng tha& &reate$ppearan&efg&x
trC&h nhiE- &h0 viE& te0 bodeCo"ponent T Unh nghha @" ng0Di &h0
Qi tRng !an *Ct.
KD- te0 &wa CisuaF,0ect te0 Qi tRng !an *Ct @ng &C&h Unh
nghha -ut 1p &0ntain'r ;hjng ;hjng thta ;J t_ Java 5D #P$. Tr0ng thiJt
;J nD3 1p Qi tRng !an *Ct *Y &haa -ut )r0!p S0(' h0& Shape*&
nh 1D gQ& &wa -ut nhCnh thU nx Unh nghha. Lp nD3 phWi Unh nghha
phng tha& T trW v" -ut tha- &hiJ! Jn gQ&. Cjng nghE nD3 &x thT &x
nhi"! viE& hn nhng 1ei (k (Dng T hiT!. Sg0Di ra &dn &x &C& 1p ;hC&
tr0ng gxi v" hnh h& nh Box+ C0n'+ C31in('r vD 2ph'r'. /\i 1p -y
rung tt Pri-itiv'+ vQn -y rung tt )r0!p.
2.< *2c &p ti4n Xch hnh hc
Phn nD3 @a0 g- t]t &W &C& 1p tiEn v&h (_ng T te0 hnh hup+ hnh
nxn+ hnh trb+ vD hnh &! & @Wn. CC& hnh & @Wn nD3 1D &C&h (k tha hai
T te0 -ut -ji trzng W0. Cdn &C&h (k nh]t ng nhiIn 1D (_ng hnh 1p
phng.
CC& 1p & @Wn nD3 &!ng &]p &h0 ngzi 1p trnh tvnh 1inh ung hn
r]t nhi"! *0 vi 1p hnh 1p phng -D! a ra. Lp CoorCu,e Unh
httpBOOtai1i'!ha3.&0-
29:
Lp trnh ha trn Java 2D v 3D
nghha v" -t hnh h& vD -D! trIn &C& nt thDnh phn hnh h&. iJt !W
1D -i tha ,!ng !anh nx try nIn &Q Unh trt ;v&h th& &wa nx. iv&h
th& hnh 1p phng &h R& ,C& Unh ;hi Qi tRng R& te0.
/ut 1p & @Wn R& gi 1D 1inh ung nJ! nx ,C& Unh hnh (eng -D
;hjng phWi ,C& Unh -D! *^& i ;-. Tr0ng &C& 1p tiEn v&h & @Wn hnh
h&+ ngzi 1p trnh ;hjng thT tha3 i hnh h& nhng &x thT tha3 i @"
ng0Di. CC& 1p nD3 &!ng &]p &h0 ngzi 1p trnh tvnh 1inh ung ;hi &x
nhi"! in*tan&' trIn -ut hnh & @Wn y x -\i phn &x -ut (iEn -e0 ;hC&
nha! @ng &C&h tha- &hiJ! Jn &C& bodeCo"ponent !ppearance ;hC&
nha!.
CC& 1p nD3 R& Unh nghha tr0ng gxi co".sun.0*d.utis.Geo"etr'.
Lp & @Wn nh]t &wa &C& 1p nD3 1D 1p Pri-itiv'+ (i s3 1D hnh2P7 thT
hiEn &s3 thta ;J &C& 1p nD3.
%.*.( Box
Lp gQ& Box fhnh hupg te0 Qi tRng !an *Ct hnh hup 5D. Chi"!
(Di &hi"! rung &hi"! &a0 -& Unh 1D 2 -'t+ vi ts- y gQ&. Chi"! (Di
httpBOOtai1i'!ha3.&0-
29<
Lp trnh ha trn Java 2D v 3D
&hi"! rung &hi"! &a0 R& ,C& Unh tr0ng thzi gian Qi tRng R& te0.
T]t nhiIn Transfor"Group+ (& th'0 zng thU ;h!ng &Wnh ti Box+
&x thT R& *G (bng T tha3 i vU trv vD hng &wa &C& in*tan&' &wa Box
vD &C& Qi tRng !an *Ct ;hC&.
Box C0n*tr!&t0r*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
Box -y rung tt Pri-itiv'+ -ut 1p ;hC& tr0ng gxi
&0-.*!n.N5(.!ti1*.Geo"etr'
Boxfg
ThiJt 1p -ut hnh hup vi -& Unh &hi"! &a0 &hi"! (Di &hi"! rung 1D 2
-'t+ ts- gQ&.
Boxf610at ,(i-+ 610at 3(i-+ 610at (i-+ !ppearance !ppearanceg
ThiJt 1p hnh hup vi hng+ @" ng0Di+ vD ts- y gQ&.
Box+ C0n'+ an( C31in('r /'th0(*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
CC& phng tha& nD3 R& Unh nghha tr0ng -Qi 1p & @WnB Box+ C0n'+
vD C31in('r. CC& 1p & @Wn nD3 R& ;Jt hRp tt &C& Qi tRng Shape*&
tr0ng -ut nhx-.
Shape*& g't2hap'fint i(g
L]3 -ut tr0ng nhZng -t Shape*& tt 1p & @Wn &haa hnh h& vD @"
-t.[Qi tRng Box+ C0n'+ vD C31in('r R& tp hRp tt nhi"! Qi tRng
Shape*&+ vi nt thDnh phn hnh h& &wa nx. )iC trU a ra T ,C& Unh
nt thDnh phn nD0 R& 1]3.
v0i( *'t#pp'aran&'f!ppearance !ppearanceg
httpBOOtai1i'!ha3.&0-
29=
Lp trnh ha trn Java 2D v 3D
%.*.% Cone
Knh nxn Unh nghha Qi tRng hnh nxn+ @Ut n^p ts- tei gQ& ta u
vi trb& *0ng *0ng vi trb& |.
>Cn ;vnh 1D 1 vD &hi"! &a0 1D 2. Ts- &wa hnh nxn R& &0i nh 1D
ts- &wa hnh @a0 &wanx hn 1D ts- th`&.
C0n' C0n*tr!&t0r*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
C0n'fg
KD- ;hyi te0 -& Unh vi @Cn ;vnh 1D 1+ zng ;vnh 1D 2.
C0n'f610at ra(i!*+ 610at h'ightg
KD- ;hyi te0 vi 2 tha- *Q @Cn ;vnh vD &hi"! &a0
%.*.* C'inder
Lp C31in('r fhnh trbg te0 -ut Qi tRng hnh trb @U @Ut ts- y gQ&
vi trb& (& th'0 trb& |. )iC trU -& Unh 1D @Cn ;vnh 1D 1+ &hi"! &a0 1D 2.
C31in('r C0n*tr!&t0r*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
C31in('rfg
KD- ;hyi te0 -& Unh vi @Cn ;vnh 1D 1+ &hi"! &a0 1D 2.
C31in('rf610at ra(i!*+ 610at h'ightg
ihyi te0 vi tha- *Q @Cn ;vnh vD &hi"! &a0.
C31in('rf610at ra(i!*+ 610at h'ight+ !ppearance !ppearanceg
ihyi te0 vi @Cn ;vnh+ &hi"! &a0 vD @" -t.
httpBOOtai1i'!ha3.&0-
299
Lp trnh ha trn Java 2D v 3D
%.*.- Sphere
Lp nD3 te0 Qi tRng hnh &! ts- y gQ&+ @Cn ;vnh -& Unh 1D 1.
2ph'r' C0n*tr!&t0r*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
2ph'r'fg
KD- ;hyi te0 -& Unh+ @Cn ;vnh 1D 1.
2ph'r'f610at ra(i!*g
KD- ;hyi te0 vi @Cn ;vnh ,C& Unh
2ph'r'f610at ra(i!*+ !ppearance !ppearanceg
KD- ;hyi te0 vi @Cn ;vnh+ @" -t &h0 tr&.
2ph'r' /'th0(*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
Shape*& g't2hap'fg
L]3 Qi tRng Shape*& &haa (eng hnh h& vD @" -t.
Shape*& g't2hap'fint i(g
Phng tha& nD3 &ng R& *G (bng vi &C& 1p & @Wn phva trIn. T!3
nhiIn 1 2ph'r' &h &x -ut Qi tRng Shape*& nIn i( 1.
v0i( *'t#pp'aran&'f!ppearance !ppearanceg
Lp @" -t &h0 hnh &!.
httpBOOtai1i'!ha3.&0-
2:0
Lp trnh ha trn Java 2D v 3D
%.*.2 /ore !,out Geo"etric Pri"itives
CC& & @Wn &ha R& Unh nghha v" -D! *^&. CC& hnh ;hjng Unh
nghha -D! -D thta ;J -D! tt nt thDnh phn @" -t &wa nx. SJ! ;hjng
&x tha- &hiJ! Jn nt thDnh phn @" -t+ Qi tRng !an *Ct *Y &x -D!
-& Unh 1D tr^ng.
%.*.3 CoorCu,e
Lp CoorCu,e R& trnh @D3 y s3 thT hiEn *` tng phWn vi &C&
1p hnh & @Wn nh Box+ C0n'+ C31in('r vD 2ph'r'. Lp nD3 -y rung
th'0 hng thta ;J ;hC&+ nx 1D 1p &0n &wa Shape*&. Cs3 thta ;J R&
&h ra tr0ng hnh 2P9.
Lp nD3 &ng 1D 1p (!3 nh]t &!ng &]p vi Java 5D #P$ &h0 phcp
ngzi 1p trnh @ !a &C& phn nh -D! *^& vD Cnh *Cng. X 1v (0 nD3
nIn nx thzng R& (_ng T nhanh &hxng te0 ra -ut thU ;h!ng &Wnh
T ;iT- thG hnh ng!3In -!.
%.*.? )xa"peh Creatin$ a Si"pe noono +ro" T1o Cones
Phn nD3 gii thiE! vv (b n giWn !a viE& *G (bng 1p C0n'+ -b&
tiI! &wa &hng trnh 1D (`ng nIn -ut &0n 30P30. Chng ta phWi (_ng 2
httpBOOtai1i'!ha3.&0-
2:1
Lp trnh ha trn Java 2D v 3D
hnh nxn T te0 nIn R& |0P|0. CC& hDnh &wa Java 5D #P$ &h0 phcp
30P30 &x thT (i &h!3Tn 1In ,!Qng nhng tr0ng phn nD3 *Y ;hjng trnh
@D3 Jn.
Knh 2P9 (i s3 hiTn thU thU ;h!ng &Wnh &wa &hng trnh thiJt
;J 1p C0n'|030 vD C0n'|030#pp. Xv trU -& Unh &wa -ut Qi tRng
C0n' thjng !a hnh @a0 &wa nx ts- y gQ&. Kng &wa hnh nxn 1D hng
(ng+ nh n- trIn trb& |. |0P30 Unh ra 2 hnh nxn -D R& !a3
!anh vD (U&h th'0 trb r T nh &wa &hng tr_ng nha! y gQ&. ShZng
;Jt hRp &wa phcp !a3 vD (U&h &h0 phcp ghcp &C& Qi tRng hnh nxn vi
nha!.
ShCnh tU nD3 @^t ! @ng Qi tRng >ran&h)r0!p R& te0 @i
C0n'|030+ zng &wa thU ;h!ng &Wnh ti -\i Qi tRng C0n' @^t !
@ng Qi tRng Transfor"Group &h ra phcp (U&h+ th'0 x 1D
Transfor"Group ,C& Unh phcp !a3 vD hw3 Qi tRng C0n'.
httpBOOtai1i'!ha3.&0-
2:2
Lp trnh ha trn Java 2D v 3D
/ut vDi thU ;h!ng &Wnh &x thT ei (iEn &h0 &_ng -ut -ji trzng
W0. Tr0ng vv (b hnh 2P: &x -ut vDi tha3 i+ tha3 i ! tiIn 1D Qi
tRng >ran&h)r0!p &x &0n 1D C0n'|030 vD R& &hn vD0 Qi tRng
C0n'|030 tr`& tiJp trIn L0&a1'. >ran&h)r0!p nD3 *a! x 1D T thI- vD0
&C& Qi tRng !an *Ct tr0ng tng 1ai ti thJ gii !an *Ct. /ut tha3 i
;hC& 1D ;Jt nQi 2 Qi tRng Transfor"Group tr0ng Qi tRng
C0n'|030. Phcp @iJn i R& -j tW n giWn nh (i s3.
St Shape*& &wa Qi tRng C0n' tha- &hiJ! Jn nt thDnh phn
hnh h&. [Qi tRng Shape*& &wa C0n' 1D &0n &wa )r0!p tr0ng C0n'.
ihi Qi tRng C0n' thta ;J tt )r0!p+ th C0n' &dn 1ei ;hjng thT *G (bng
thI- 1n nD0 nZa tr0ng thU ;h!ng &Wnh. Knh 2P a ra -ut vv (b v"
thjng @C0 1\i ;hi &Q g^ng *G (bng &_ng -ut Qi tRng C0n' tr0ng thU
;h!ng &Wnh. L\i nD3 ;hjng tn tei tr0ng vv (b &hng trnh a ra.
Knh 2P= &h ra -ut hnh Wnh R& (U&h vi vv (b vta !a. Lp
C0n'|030 R& *Ga 1ei nh tr0ng 0en - 2P2.
httpBOOtai1i'!ha3.&0-
2:5
Lp trnh ha trn Java 2D v 3D
Ddng 17 Jn 21 te0 &C& Qi tRng&wa thU 30P30 . Ddng 25 Jn
29 te0 -Qi !an hE giZa &C& Qi tRng. TiJn trnh nD3 R& 1p 1ei trIn
-ut nGa thU &dn 1ei tt (dng 2< Jn (dng 5=.
Ddng 12 te0 3030#p'ar+ -ut nt thDnh phn @" -t vi giC trU -&
Unh R& *G (bng @yi Qi tRng C0n'. Ddng 21 Jn 57 thiJt 1p @" -t
&h0 2 hnh nxn.
// //////////////////////////////////////
////
//
// create 0hapef) with geometr, and
appearance
// the geometr, is created in method
,o,o%eometr,
// the appearance is created in method
,o,o/ppearance
//
public ConeYo,o(& Q
,o,oB% = new Branch%roup(&'
/ppearance app = new /ppearance(&'
// rotate ob\ect has composited
transformation matrix
Transformf) rotate = new
Transformf)(&'
Transformf) trans*ate = new
Transformf)(&'
httpBOOtai1i'!ha3.&0-
2:7
Lp trnh ha trn Java 2D v 3D
trans*ate.set(new zectorff(+.Of,
+.+f, +.+f&&'
Transform%roup ,o,oT%TO = new
Transform%roup(trans*ate&'
,o,oB%.addChi*d(,o,oT%TO&'
rotate.rot|(Math.PI / (.+d&'
Transform%roup ,o,oT%$O = new
Transform%roup(rotate&'
Cone coneO = new Cone(+.uf, +.(f&'
coneO.set/ppearance(app&'
,o,oT%$O.addChi*d(coneO&'
,o,oT%TO.addChi*d(,o,oT%$O&'
trans*ate.set(new zectorff(X+.Of,
+.+f, +.+f&&'
Transform%roup ,o,oT%T( = new
Transform%roup(trans*ate&'
,o,oB%.addChi*d(,o,oT%T(&'
rotate.rot|(XMath.PI / (.+d&'
Transform%roup ,o,oT%$( = new
Transform%roup(rotate&'
Cone cone( = new Cone(+.uf, +.(f&'
cone(.set/ppearance(app&'
,o,oT%$(.addChi*d(cone(&'
,o,oT%T(.addChi*d(,o,oT%$(&'

httpBOOtai1i'!ha3.&0-
2:9
Lp trnh ha trn Java 2D v 3D
,o,oB%.compi*e(&'

2 // end of ConeYo,o constructor
C0(' 8rag-'nt 2P2 C1a** C0n'|030 8r0- C0n'|030#pp.Nava %,a-p1'
Pr0gra-
#(van&'( T0pi&B )'0-'tri& Pri-itiv' CC& (eng hnh h& & @Wn
Cs3 thta ;J tr0ng hnh 2P7 &h ra Pri-itiv' 1D 1p &ha &wa t]t &W &C&
1p C0n'+ Box+ C31in('r+ vD 2ph'r'*. Sx Unh nghha -ut 1Rng 1n &C&
trzng vD phng tha& &ng nh giC trU -& Unh &wa &C& trzng. /\i 1p
&0n &wa Pri-itiv' &x -ut hD- ;hyi te0 &h0 phcp thiJt 1p &C& &z ;hi Qi
tRng R& ,s3 (`ng. Xv (b nh 1p 2ph'r' &x hD- ;hyi te0 2ph'r' fintg.
Danh *C&h &C& &z y (i s3B
G)F/)T#nSMT2K#.%D S0r-a1* ar' g'n'rat'( a10ng ?ith th'
p0*iti0n*.
)%S%.#T%SM./#L2$SL#.D S0r-a1* ar' 61ipp'( a10ng th'
*!r6a&'.
)%S%.#T%T%rT4.%CMM.D2 T',t!r' &00r(inat'* ar' g'n'rat'(.
G)F/)T#nSMT2K#.%D Th' Geo"etr' &r'at'( ?i11 n0t @'
*har'( @3 an0th'r
n0('.
Lp nD3 &ng &h0 phcp &hia * nt thDnh phn hnh h& giZa &C& in*tan&'
&wa -ut pri-itiv' vi &_ng -ut ;v&h &. /& Unh t]t &C& &C& pri-itiv'*
1D &_ng -ut ;v&h th&+ &hia * -ut nt thDnh phn hnh h&. /ut vv (b
&wa -ut trzng R& Unh nghha tr0ng 1p Pri-itiv' 1D giC trU int'g'r
G)F/)T#nSMT2K#.%D. Trzng nD3 &h ra (eng hnh h& R&
*Y ;hjng R& &hia * vi nhZng in*tan&' ;hC&. ThiJt 1p &z nD3 T trCnh
httpBOOtai1i'!ha3.&0-
2::
Lp trnh ha trn Java 2D v 3D
viE& &hia * giZa &C& pri-itiv' &wa &_ng -ut tha- *Q f&hng hen vi hnh
&! @Cn ;vnh 1g.
C0n' -3C0n' n'? C0n'fPri-itiv'.G)F/)T#nSMT2K#.%Dg
Pri-itiv' /'th0(*
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
Pri-itiv' -y rung tt )r0!p vD 1D 1p &ha &wa &wa &C& 1p Box+ C0n'+
C31in('r vD 2ph'r'.
p!@1i& v0i( *'tS!-X'rti&'*fint n!-g
ThiJt 1p tng *Q nh tr0ng pri-itiv' nD3.
v0i( *'t#pp'aran&'fint parti(+ !ppearance !ppearanceg
ThiJt 1p @" -t &wa &C& phn &0n. CC& Qi tRng Box+ C0n'+ C31in('r
R& g0- 1ei vi hn -ut Qi tRng Shape*&+ -\i tha &x ti"- nVng *G
(bng nt thDnh phn @" -t &wa nx. )iC trU &h0 -\i phn nD3 R& ,C&
Unh ;hi -\i nt thDnh phn @" -t R& thiJt 1p.
v0i( *'t#pp'aran&'fg
ThiJt 1p @" -t &hvnh &wa pri-itiv' ft]t &W &C& phn &0ng ti @" -t tr^ng
-& Unh.
2.. *2c &p t%2n hc
[T te0 Qi tRng !an *Ct+ &n &W 1p hnh h& vD &C& 1p &0n &wa nx.
.]t nhi"! 1p &0n &wa 1p hnh h&-0 tW (`a trIn &C& hnh & @Wn vc& t+
nh iT- zng thng vD a giC&. CC& 1p &0n &wa 1p hnh h& *Y R&
-j tW tr0ng phn 2P9 nhng tr& x &hng ta !an ts- Jn &C& 1p t0Cn
httpBOOtai1i'!ha3.&0-
2:<
Lp trnh ha trn Java 2D v 3D
h& nh iT-+ -D!+ v'rt0r vD t',t&0r( (_ng T Unh nghha &C& (Z 1iE! 1iIn
nh.
Ch H rng vi -\i ;v hiE! &x ng *a! ei (iEn &h0 -ut 1p tIn.
Xv (b T!p1' tng ng vi T!p1'26+ T!p1'2( T!p1'5i.
Tr0ng x &C& &hZ *Q ng *a! &h ra *Q thDnh phn tr0ng t!p1'+ &dn
&C& &hZ &Ci nh &!Qi &_ng ei (iEn &h0 ;iT!. 6 &h 610at+ ( &h (0!@1'+
@ ei (iEn &h0 @3t'+ i 1D int'g'r. X thJ 1p T!p1'56 1D -ut 1p -D !Wn
1v 5 giC trU iT- th`&.
T]t &W &C& 1p t0Cn h& nD3 "! n- tr0ng gxi Nava,.v'&-ath. )xi
nD3 Unh nghha -ut *Q 1p T!p1' nh 1D &C& 1p trt! tRng. .]t nh"! &C&
1p hZ! v&h thta ;J tt &C& 1p nD3. Di s3 1D hnh 2P9 &s3 thta ;J.
httpBOOtai1i'!ha3.&0-
2:=
Lp trnh ha trn Java 2D v 3D
/\i nh &wa -ut Qi tRng !an *Ct &x thT &h ra ti 7 Qi tRng
tr0ng Nava,.v'&-ath ei (iEn &h0 ta u+ -D! @" -t @nh thzng vD @"
-t ta u. CC& 1p thzng R& *G (bngB
!ointf [for &oordinates\
)olorf [for &olors\
`e&torf [for surfa&e nor+als\
,ex)oordf [for texture &oordinates0 see )hapter g\
Tupe%f Constructors
Ch H rng ta u fPointp 0@N'&tg 1D &n thiJt T Ua &h -\i nh.
CC& (Z 1iE! ;hC& 1D t_3 &hn +t_3 th!u& vD0 &C& hnh & @Wn R& (`ng
hnh nh thJ nD0. Xv (b nh -ut -D! &x thT R& Unh nghha tei -\i nh
vD &C& -D! &wa &C& hnh & @Wn 1D R& thI- vD0 giZ! &C& -D! tei &C&
nh. SJ! Cnh Cnh *Cng R& thiJt 1p+ @" -t @nh thzng fX'rt0r
0@N'&tg 1D &n thiJt. SJ! @" -t Cnh ,e R& thiJt 1p th ta u @" -t
&ng &n thiJt v3.
Tst &W &C& 1p &n thiJt R& trnh @D3 @In (i s3.
T!p1'26 C0n*tr!&t0r*
Pa&;ag'B Nava,.v'&-ath
CC& 1p T!p1' thzng ;hjng R& *G (bng tr`& tiJp tr0ng &hng trnh
Java 5D nhng &!ng &]p n"n tWng &h0 Pointp+ C010r+ X'&t0r+
T',C00r(. Xv (b nh T!p1'26 &!ng &]p & *y &h0 P0int26+ C010r26+ vD
T',C00r(26. CC& hD- ;hyi te0 (i s3 "! ng vi &C& 1p &0n tng
tb nh T!p1'56 vD T!p1'76.
T!p1'26fg
ihyi te0 vD thiJt 1p Qi tRng T!p1' vi ta u f0+0g.
T!p1'26f610at ,+ 610at 3g
httpBOOtai1i'!ha3.&0-
2:9
Lp trnh ha trn Java 2D v 3D
ihyi te0 vD thiJt 1p Qi tRng T!p1' vi ta u f,+3g.
T!p1'26f610at tg
ihyi te0 vD thiJt 1p Qi tRng T!p1' tt -ut -Wng & @iEt.
T!p1'26fT!p1'26 tg
ihyi te0 vD thiJt 1p Qi tRng T!p1' tt (Z 1iE! &wa -ut T!p1' ;hC&
T!p1'26fT!p1'2( tg
ihyi te0 vD thiJt 1p Qi tRng T!p1' tt (Z 1iE! &wa -ut T!p1' ;hC&
T!p1'26 /'th0(* fpartia1 1i*tg
Pa&;ag'B Nava,.v'&-ath
CC& 1p T!p1' thzng ;hjng R& *G (bng tr`& tiJp tr0ng &hng trnh
Java 5D nhng &!ng &]p n"n tWng &h0 Pointp+ C010r+ X'&t0r+
T',C00r(. Xv (b nh T!p1'26 &!ng &]p & *y &h0 P0int26+ C010r26+ vD
T',C00r(26. CC& hD- ;hyi te0 (i s3 "! ng vi &C& 1p &0n tng
tb nh T!p1'56 vD T!p1'76. CC& phng tha& &wa &hng &ng tng t`
nh v3.
v0i( *'tf610at ,+ 610at 3g
v0i( *'tf610at tg
Lp giC trU &wa t!p1' nD3 tt -ut giC trU Unh tr&.
@001'an '!a1*fT!p1'26 t1g
TrW v" giC trU tr!' nI! tr0ng T!p1' t1 @ng vi giC trU *n &x &wa t!p1'.
6ina1 v0i( a((fT!p1'26 t1g
Lp giC trU &wa t!p1' nD3 ti v'rt0r tng &wa nx vD T!p1' t1.
v0i( a((fT!p1'26 t1+ T!p1'26 t2g
Lp giC trU &wa t!p1' nD3 ti v'rt0r tng &wa nx vD T!p1' t1 vD t2.
v0i( *!@fT!p1'26 t1+ T!p1'26 t2g
httpBOOtai1i'!ha3.&0-
2<0
Lp trnh ha trn Java 2D v 3D
Lp giC trU &wa t!p1' nD3 ti v'rt0r ;hC& &wa t1 vD t2 fthi* t1 P t2g.
v0i( *!@fT!p1'26 t1g
Lp giC trU &wa t!p1' nD3 ti v'rt0r ;hC& &wa nx vD t1 fthi* thi* P t1g.
v0i( n'gat'fg
L0ei @ giC trU &wa -ut v'rt0r.
v0i( n'gat'fT!p1'26 t1g
Lp giC trU &h0 t!p1' *a! ;hi 10ei @ giC trU &wa nx
v0i( a@*01!t'fg
[i t]t &W thDnh phn &wa t!p1' nD3 thDnh giC trU t!3Et Qi.
v0i( a@*01!t'fT!p1'26 tg
Lp giC trU &wa &C& thDnh phn thDnh giC trU t!3Et Qi vD ghi vD0 t!p1'.
2...1 P%int *&asses
[Qi tRng Pointp thzng R& ei (iEn &h0 ta u &wa -ut nh+
&hng hen nh -ut ve&h !ct Wnh+ -ut iT- ng!n *Cng+ ng!n s- thanh
vD &C& (Z 1iE! iT- ;hC&. KD- te0 &h0 1p Pointp giQng nh hD- te0 &wa
T!p1' ng0ei trt &hng trW v" Qi tRng Pointp.
P0int56 /'th0(* fpartia1 1i*tg
Pa&;ag'B Nava,.v'&-ath
Lp Pointp R& thta ;J tt 1p T!p1'. /\i in*tan&' &wa 1p T!p1' ei
(iEn &h0 -ut iT- n tr0ng 2+ 5 h0& 7 ;hjng gian. ThI- vD0 &C&
phng tha& &wa T!p1'+ 1p Pointp &x thI- &C& phng tha& riIng &wa
nx+ R& &h ra (i s3.
610at (i*tan&'fP0int56 p1g
TrW v" ;h0Wng &C&h giZa iT- nD3 vD iT- p1.
httpBOOtai1i'!ha3.&0-
2<1
Lp trnh ha trn Java 2D v 3D
610at (i*tan&'2!ar'(fP0int56 p1g
TrW v" ;h0Wng &C&h @nh phng giZ! 2 iT- p vD p1.
610at (i*tan&'L1fP0int56 p1g
TrW v" ;h0Wng &C&h L1 f/anhattang giZa iT- nD3 vD iT- p1. ih0Wng
&C&h L1 1DB
a@*f,1 P ,2g a@*f31 P 32g a@*f1 P 2g
%.-.% Coor Casses
[Qi tRng 1p -D! ei (iEn &h0 -ut -D!+ &x thT 1D -ut nh+ th!u&
tvnh &wa &h]t 1iE!+ *ng -_ h0& &C& Qi tRng !an *Ct ;hC&. CC& -D!
R& &h ra h0& 1D C010r5 h0& C010r7 ;iT! (Z 1iE! thzng 1D ;iT!
th`&. C010r5 ,C& Unh -D! thjng !a 5 -D! + ,anh (a trzi vD ,anh
n& @iTn.)iC trU &wa -D! 1D tt 0 Jn 299+ Qi vi giC trU a1pha 1D tt 0.0
Jn 1.0. [Qi vi Qi tRng C010r7 &x thI- giC trU v" u *s!. ihi giC trU
a1pha @ng 1 th -D! hiEn ng!3In vn. )iC trU &wa -D! 1D ;iT! @3t' &x giC
trU P12=+12< t!3 nhiIn Java vn ,G 1v giC trU -D! 0+299.
Xv (b v" -ut 1p -D!B
import \a.ax..ecmath.]'
class Co*orConstantsQ
public static final Co*orff red = new
Co*orff(O.+f,+.+f,+.+f&'
public static final Co*orff green = new
Co*orff(+.+f,O.+f,+.+f&'
public static final Co*orff blue = new
Co*orff(+.+f,+.+f,O.+f&'
httpBOOtai1i'!ha3.&0-
2<2
Lp trnh ha trn Java 2D v 3D
public static final Co*orff yellow = new
Co*orff(O.+f,O.+f,+.+f&'
public static final Co*orff cyan = new
Co*orff(+.+f,O.+f,O.+f&'
public static final Co*orff magenta = new
Co*orff(O.+f,+.+f,O.+f&'
public static final Co*orff white = new
Co*orff(O.+f,O.+f,O.+f&'
public static final Co*orff blac = new
Co*orff(+.+f,+.+f,+.+f&'
2
Ta &x thT th]3 hD- te0 &wa 1p C010r giQng nh 1p T!p1'+ ng0ei
trt 1D nx trW v" Qi tRng C010r. Lp nD3 &h &x -ut hD- ;hyi te0 vD 2
phng tha& thI- vD0 *0 vi 1p &ha &wa nx T!p1'.
C010r C0n*tr!&t0r* fpartia1 1i*tg
Pa&;ag'B Nava,.v'&-ath
/\i in*tan&' tr0ng 1p C010r ei (iEn &h0 -ut -D! n tr0ng 5 thDnh
phn + ,anh 1C &s3 vD ,anh n& @iTn f.)>g+ h0& -ut tr0ng @Qn thDnh
phn 5 -D! vD thI- u a1pha f.)>#g. )iC trU a1pha @ng 0 1D tr0ng *!Qt
&dn @ng 1 1D hiEn ng!3In @Wn.
C010rfC010r &010rg }n'? in 1.2~
Te0 Qi tRng Java 5D C010rfg fC010r5@+ C010r56+ C010r7@+ C010r76g
*G (bng -ut Qi tRng #LT C010r. ihi ;hyi te0 Qi tRng C010r7 *G
(bng Qi tRng #LT C010r giC trU a1pha R& thiJt 1p @ng 1.
httpBOOtai1i'!ha3.&0-
2<5
Lp trnh ha trn Java 2D v 3D
C010r /'th0(*
Pa&;ag'B Nava,.v'&-ath
Lp C010r fC010r5@+ C010r56+ C010r7@+ C010r76g thta ;J tt 1p T!p1'.
/\i in*tan&' &wa 1p nD3 ei iEn &h0 -ut -D! tr0ng 5 f.)>g h0& 7
f.)>#g thDnh phn. Di s3 1D -ut vDi phng tha& tr0ng C010r5 vD
C010r7.
v0i( *'tfC010r &010rg }n'? in 1.2~
Lp -D! *G (bng -! tt Qi tRng #LT C010r
C010r g'tfg }n'? in 1.2~
L]3 -ut -D! &0i 1D -ut -D! &wa Qi tRng #LT C010r.
%.-.* Cector Casses
X'&t0r 0@N'&t* 06t'n r'pr'*'nt *!r6a&' n0r-a1* at v'rti&'* a1th0!gh
th'3 &an a1*0 r'pr'*'nt th' (ir'&ti0n 06 a 1ight *0!r&' 0r *0!n( *0!r&'.
#gain+ th' &0n*tr!&t0r* 60r X'&t0r &1a**'* ar' *i-i1ar t0 th' T!p1'
&0n*tr!&t0r*. K0?'v'r+ X'&t0r 0@N'&t* a(( -an3 -'th0(* that ar' n0t
60!n( in th' T!p1' &1a**'*.
[Qi tRng X'rt0r ei (iEn &h0 @" -t @nh thzng tei &C& Unh (_
&hng &ng &x thT ei (iEn &h0 hng &wa -ut ng!n *Cng h0& ng!n
s- thanh. /ut 1n nZa ta &x thT th]3 &C& hD- te0 &wa X'rt0r &ng tng
t` nh T!p1'.
X'&t0r56 /'th0(* fpartia1 1i*tg
Pa&;ag'B Nava,.v'&-ath
httpBOOtai1i'!ha3.&0-
2<7
Lp trnh ha trn Java 2D v 3D
Lp X'&t0r thta ;J tt T!p1'. /\i in*tan&'* &wa 1p X'&t0r ei (iEn
&h0 -ut nh v'rt0r tr0ng ;hjng gian 1+2+5+7 &hi"!. Sg0Di ra nx &dn &x
thI- nhZng phng tha& nh (i s3.
610at 1'ngthfg
TrW v" u (Di &wa -ut v'rt0r
610at 1'ngth2!ar'(fg
TrW v" giC trU @nh phng u (Di &wa -ut v'rt0r.
v0i( &r0**fX'&t0r56 v1+ X'&t0r56 v2g
Lp -ut v'rt0r try thDnh v'rt0r phCp t!3Jn &wa 2 v'rt0r v1 vD v2.
610at (0tfX'&t0r56 v1g
Tvnh t0Cn vD trW v" tv&h *Q iT- &wa pr0(!&t hiEn tei vD v'rt0r v1.
v0i( n0r-a1i'fg
>nh thzng hxa v'rt0r hiEn tei
v0i( n0r-a1i'fX'&t0r56 v1g
Lp giC trU &wa v'rt0r nD3 vi giC trU &wa v'rt0r v1 R& @nh thzng hxa.
610at ang1'fX'&t0r56 v1g
TrW v" gx& ra(ian* giZa v'rt0r hiEn tei vi v'rt0r tha- *Q+ giC trU nD3 R&
rng @!u& tr0ng ;h0Wng 0+P$.
%.-.- TexCoord Casses
Ch &x 2 1p T',C00r( R& *G (bng nh 1D -ut tp &C& ;Jt &]! @"
-t ta u tei -ut nh+ 1D T',C00r(26 vD T',C00r(56. Xi T',C00r(26
&x -ut &p ta u 1D f*+ tg+ vi T',C00r(56 th &x 5 ta u 1D f*+ t+ rg. KD-
te0 &wa 1p nD3 &ng tng t` nh 1p T!p1' vD ;hjng &x thI- phng
tha& nD0 *0 vi 1p &ha &wa nx.
httpBOOtai1i'!ha3.&0-
2<9
Lp trnh ha trn Java 2D v 3D
2.= *2c &p hnh hc
Tr0ng ha 5D+ -i tha tt hnh ta- giC& n giWn Jn hnh pha&
tep nh -ut &hiJ& -C3 @a3 "! R& -j hnh hxa vD (`ng (i (eng (Z
1iE! th'0 nh. Tr0ng Java 5D -\i Qi tRng Shape*& &x thT gi phng
tha& set0eo#etr&fg &wa nx T tha- &hiJ! Jn -ut h0& &h -ut Qi tRng
Geo"etr'. Chvnh ,C& hn Geo"etr' 1D 1p trt! tRng+ &h0 nIn -ut Qi
tRng tha- &hiJ! 1D -ut in*tan&' &wa 1p &0n &wa Geo"etr'.
CC& 1p &0n &wa Geo"etr' &x nhZng (eng *a!B
1. S0nPin(','( v'rt',P@a*'( Geo"etr' f-\i ;hi Qi tRng !an *Ct
R& (`ng &C& nh &wa nx &h R& *G (bng -ut 1ng
2. $n(','( v'rt',P@a*'( Geo"etr' f-\i ;hi Qi tRng !an *Ct R&
(`ng &C& nh &wa nx R& *G (bng nhi"! 1ng
CC& Qi tRng !an *Ct ;hC& fCC& 1p Geo"etr'+ Text*&+ vD
Co"pressedGeo"etr'g
Phn nD3 &h nxi v" 2 (eng trIn. Cs3 thta ;J R& hiTn thU (i hnh 2P10
httpBOOtai1i'!ha3.&0-
2<:
Lp trnh ha trn Java 2D v 3D
%.2.( Geo"etr'!rra' Cass
Sh &Ci tIn &wa 1p nD3 &h0 @en hnh (!ng 1p &0n nD3 &wa )'0-'tr3
R& *G (bng T Unh nghha iT- zng vD hnh a giC& i"n 3. ShZng
thDnh phn ng!3In tQ (`a trIn iT- nD3 1D 1p &0n &wa &wa 1p trt! tRng
Geo"etr'!rra'+ &h ra -ut -Wng &haa &C& (Z 1iE! v" nh. Xv (b nh
-ut Qi tRng (_ng T &h -ut ta- giC&+ 5 thDnh phn R& Unh nghha+
-\i thDnh phn &h0 -\i nh. Xi -\i thDnh phn &wa -Wng nD3 (!3 tr
-ut vU trv ta u &h0 nh &wa nx f&x thT Unh nghha @ng Pointp vi (Z
1iE! tng t`g . Sg0Di Unh ra ta u th &C& giC trU nD3 &x thT Unh nghha
-D!+ @" -t @nh thzng h0& t',t!r'. X v3 nhZng -Wng n3 &haa ta
u+ -D!+ @" -t thzng+ vD t',t!r'+ (i (eng (Z 1iE! -Wng.
Cx 5 @& tr0ng vdng zi &wa -ut Qi tRng Geo"etr'!rra'
1. Te0 -ut Qi tRng r\ng
2. [i"n 3 Qi tRng vi (Z 1iE!
5. [ng hxa ftha- &hiJ!g Qi tRng tt f1 h0& nhi"!g Qi tRng
Shape*&.
BfNc (B Te0 -ut Qi tRng Geo"etr'!rra' r\ng
ihi -ut Qi tRng Geo"etr'!rra' vta R& ;hyi te0 th &n thiJt
phWi Unh nghha 2 tha
2Q nh+ ha3 *Q thDnh phn &n thiJt
[Unh (eng &wa (Z 1iE! fta u+ -D!+ @" -t thzng+ vD t',t!r'g R&
1! tei -\i nh. Cdn R& gi 1D v'rt', 60r-at fUnh (eng nhg.
Geo"etr'!rra' C0n*tr!&t0r
Geo"etr'!rra'fint v'rt',C0!nt+ int v'rt',80r-atg
KD- te0 nD3 te0 Qi tRng Geo"etr'!rra' r\ng vi nhZng *Q nh vD
Unh (eng nh &h0 tr&. /ut tr0ng nhZng &z riIng 1D &C& @it?i*' M.
httpBOOtai1i'!ha3.&0-
2<<
Lp trnh ha trn Java 2D v 3D
hRp vi nha! T -j tW (Z 1iE! -\i nh. ShZng giC trU &z T Unh (eng
&C& nh 1DB
CMM.D$S#T%2B Ch ra -Wng &C& nh &haa ta u. >it nD3 @!u& phWi
1p.
SM./#L2B Ch ra -Wng nh &haa @" -t thzng.
CMLM.5B Ch ra -Wng nh &haa -D! f;hjng &x thDnh phn tr0ng *!Qtg
CMLM.7B Ch ra -Wng nh &haa -D! f&x thDnh phn tr0ng *!Qtg
T%rT4.%CMM.D$S#T%2B Ch ra -Wng nh &haa 2D t',t!r'
&00r(inat'*.
T%rT4.%CMM.D$S#T%5B Ch ra -Wng nh &haa 5D t',t!r'
&00r(inat'*.
Xi -\i &z Unh (eng R& thiJt 1sp *Y &x -ut -Wng tng ang te0 tr0ng
Qi tRng Geo"etr'!rra'. /\i -Wng nD3 1D *Q nh fv'rt',C0!ntg v"
;v&h &.
X 1p Geo"etr'!rra' 1D 1p trt! tRng nIn ta &h gi phng tha&
thiJt 1p &h0 1p &0n &wa nx nh Lin'#rra3.
Ch H 1p #,i* tr0ng #,i*#pp.Nava 1D ;hC& vi 1p #,i* &hng ta t`
Unh nghha tr0ng vv (b nD3
BfNc %B [i"n 3 (Z 1iE! vD0 Qi tRng Geo"etr'!rra' r\ng
2a! ;hi ;hyi te0 Qi tRng Geo"etr'!rra'+ Vng ;v (Z 1iE! &h0
-Wng tng ang vi te0 Unh (eng &wa &C& nh. Cx thT 1D- viE& nD3 trIn
-\i nh h0& *G (bng -Wng T Vng ;v (Z 1iE! &h0 nhi"! nh &h vi
-ut 1zi gi phng tha& . CC& phng tha& *n &x *a!B
Geo"etr'!rra' /'th0(* fpartia1 1i*tg
httpBOOtai1i'!ha3.&0-
2<=
Lp trnh ha trn Java 2D v 3D
Geo"etr'!rra' 1D 1p trt! tRng &h0 P0int#rra3+ Lin'#rra3+
Triang1'#rra3+ F!a(#rra3+
Geo"etr'2trip#rra3+ vD .ndexedGeo"etr'!rra'.
v0i( *'tC00r(inat'fint in(',+ 610at &00r(inat'g
v0i( *'tC00r(inat'fint in(',+ (0!@1' &00r(inat'g
v0i( *'tC00r(inat'fint in(',+ Pointp &00r(inat'g
Lp ta u tng ang vi nh vi -\i nh R& Unh nghha 1D -ut &h
-b& &h0 Qi tRng nD3. v0i( *'tC00r(inat'*fint in(',+ 610at
&00r(inat'*g
v0i( *'tC00r(inat'*fint in(',+ (0!@1' &00r(inat'*g
v0i( *'tC00r(inat'*fint in(',+ Pointp &00r(inat'*g
Lp &C& ta u tng ang vi nh vi &C& nh R& Unh nghha 1D &h
-b& &h0 Qi tRng nD3.
v0i( *'tC010rfint in(',+ 610at &010rg
v0i( *'tC010rfint in(',+ @3t' &010rg
v0i( *'tC010rfint in(',+ C010r &010rg
Lp -D! tng ang vi nh vi -\i nh R& Unh nghha 1D -ut &h
-b& &h0 Qi tRng nD3. v0i( *'tC010r*fint in(',+ 610at &010r*g
v0i( *'tC010r*fint in(',+ @3t' &010r*g
v0i( *'tC010r*fint in(',+ C010r &010r*g
Lp &C& -D! tng ang vi &C& nh +vi -\i nh R& Unh nghha 1D
-ut &h -b& &h0 Qi tRng nD3.
v0i( *'tS0r-a1fint in(',+ 610at n0r-a1g
v0i( *'tS0r-a1fint in(',+ X'&t0r n0r-a1g
Lp tr`& gia0 tng ang vi -\i nh tei vU trv &h -b& R& &h ra &h0
Qi tRng nD3.
v0i( *'tS0r-a1*fint in(',+ 610at n0r-a1*g
v0i( *'tS0r-a1*fint in(',+ X'&t0r n0r-a1*g
httpBOOtai1i'!ha3.&0-
2<9
Lp trnh ha trn Java 2D v 3D
Lp &C& tr`& gia0 tng ang vi &C& nh tei vU trv &h -b& R& &h ra
&h0 Qi tRng nD3.
v0i( *'tT',t!r'C00r(inat'fint t',C00r(2't+ int in(',+ 610at t',C00r(g
v0i( *'tT',t!r'C00r(inat'fint t',C00r(2't+ int in(',+ T',C00r(
&00r(inat'g
Lp t',t!r' &00r(inat' ang vi -\i nh tei vU trv &h -b& &h0 tr& &h0
-ut tp t',t!r' &00r(inat' &wa Qi tRng.
Geo"etr'!rra' /'th0(* fpartia1 1i*t+ &0ntin!'(g
v0i( *'tT',t!r'C00r(inat'*fint t',C00r(2't+ int in(',+ }n'? in 1.2~
610at t',C00r(*g
v0i( *'tT',t!r'C00r(inat'*fint t',C00r(2't+ int in(',+ }n'? in 1.2~
T',C00r( t',C00r(*g
Lp &C& t',t!r' &00r(inat' ang vi &C& nh tei vU trv &h -b& &h0 tr&
&h0 -ut tp t',t!r' &00r(inat' &wa Qi tRng.
v0i( *'t$nitia1X'rt',$n(',fint initia1X'rt',$n(',g }n'? in 1.2~
Lp &h -b& &h0 nh @an ! vi Qi tRng Geo"etr'!rra'. Ch0 phcp
-ut vDi nh &x thT @ !a tr0ng viE& (`ng hnh+ vD &C& h0et ung ;hC&.
v0i( *'tXa1i(X'rt',C0!ntfint va1i(X'rt',C0!ntg }n'? in 1.2~
Lep &C& giC trU tvnh t0Cn nh ng &h0 Qi tRng Geo"etr'!rra'.
Ch0 phcp -ut vDi (Z 1iE! nh &x thT @ !a ;hi (`ng hnh+ &hn 1& vD
&C& h0et ung ;hC&.
[0en - 2P9 &h ra trzng hRp *G (bng phng tha& &wa
Geo"etr'!rra' T 1! giZ te0 u vD giC trU -D! tr0ng -Wng Lin'#rra3.
[Qi tRng trb& r &h gi phng tha& *'tC00r(inat'fg T 1! trZ (Z 1iE!
ta u. [Qi tRng trb& | gi &W 2 phng tha& *'tC010rfg vD
*'tC00r(inat'fg T nep giC trU -D! .)> vD giC trU ta u. [Qi tRng trb&
th gi 10 1n phng tha& *'tC00r(inat'fg &h0 -\i nh vD gi
*'tC010r*fg -ut 1n T nep &h0 &W 10 nh vi 1 phng tha&.
httpBOOtai1i'!ha3.&0-
2=0
Lp trnh ha trn Java 2D v 3D
// //////////////////////////////////////
////
//
// create axis subgraph
//
public /xis(& Q
axisB% = new Branch%roup(&'
// create *ine for g axis
Nine/rra, axisgNines = new
Nine/rra,((, Nine/rra,.!OOR"INATES&'
axisB%.addChi*d(new
0hapef)(axisgNines&&'
axisgNines.setCoordinate(+, new
ointff(XO.+f, +.+f, +.+f&&'
axisgNines.setCoordinate(O, new
ointff(O.+f, +.+f, +.+f&&'
Co*orff red = new Co*orff(O.+f,
+.+f, +.+f&'
Co*orff green = new Co*orff(+.+f,
O.+f, +.+f&'
Co*orff b*ue = new Co*orff(+.+f,
+.+f, O.+f&'
// create *ine for Y axis
httpBOOtai1i'!ha3.&0-
2=1
Lp trnh ha trn Java 2D v 3D
Nine/rra, axisYNines = new
Nine/rra,((, Nine/rra,.!OOR"INATES
U Nine/rra,.!OLOR_#&'
axisB%.addChi*d(new
0hapef)(axisYNines&&'
axisYNines.setCoordinate(+, new
ointff(+.+f, XO.+f, +.+f&&'
axisYNines.setCoordinate(O, new
ointff(+.+f, O.+f, +.+f&&'
axisYNines.setCo*or(+, green&'
axisYNines.setCo*or(O, b*ue&'
// create *ine for | axis
ointff zO = new ointff(+.+f, +.+f,
XO.+f&'
ointff z( = new ointff(+.+f, +.+f,
O.+f&'
Nine/rra, axis|Nines = new
Nine/rra,(O+, Nine/rra,.!OOR"INATES
U Nine/rra,.!OLOR_#&'
axisB%.addChi*d(new
0hapef)(axis|Nines&&'
axis|Nines.setCoordinate(+, zO&'
axis|Nines.setCoordinate(O, z(&'
axis|Nines.setCoordinate((, z(&'
httpBOOtai1i'!ha3.&0-
2=2
Lp trnh ha trn Java 2D v 3D
axis|Nines.setCoordinate(f, new
ointff(+.Of, +.Of, +.rf&&'
axis|Nines.setCoordinate(s, z(&'
axis|Nines.setCoordinate(5, new
ointff(X+.Of, +.Of, +.rf&&'
axis|Nines.setCoordinate(u, z(&'
axis|Nines.setCoordinate(e, new
ointff(+.Of, X+.Of, +.rf&&'
axis|Nines.setCoordinate(Y, z(&'
axis|Nines.setCoordinate(r, new
ointff(X+.Of, X+.Of, +.rf&&'
Co*orff co*orsKL = new Co*orffKrL'
co*orsK+L = new Co*orff(+.+f, O.+f,
O.+f&'
for (int . = +' . Z r' .kk& Q
co*orsK.L = red'
2
axis|Nines.setCo*ors(O, co*ors&'
2 // end of axis constructor
/D! -& Unh &h0 &C& nh &wa -ut Qi tRng -Wng
Geo"etr'!rra' 1D tr^ng+ nJ! &W CMLM.5 vD CMLM.7 ;hjng R&
Unh nghha. ihi &C& zng h0& a giC& 3 R& (`ng vi &C& -D! ;hC&
nha! tei -\i nh th &C& -D! *Y -Un (n giZa &C& nh *G (bng phcp
Cnh @xng )0!ra!(.
httpBOOtai1i'!ha3.&0-
2=5
Lp trnh ha trn Java 2D v 3D
BfNc *B Te0 Qi tRng Shape*& tha- &hiJ! Jn Qi tRng
Geo"etr'!rra'
[0en - (i s3 &h ra &C&h 1D- thJ nD0 T Qi tRng Shape*&
tha- &hiJ! Jn Qi tRng Geo"etr'!rra'. [Qi tRng Shape*& R&
thI- vD0 -ut >ran&h)r0!p *Y R& thI- vD0 y ni nD0 x trIn thU
;h!ng &Wnh. fShape*& 1D 1p &0n &wa S0('+ v thJ Shape*& &x thT thI-
vD0 thDnh &0n &wa -ut thU ;h!ng &Wnh g
[ thU ;h!ng &Wnh R& &h ra y (i s3B
%.2.% Su,casses of Geo"etr'!rra'
Sh nxi y phn trIn (0 Geo"etr'!rra' 1D 1p trt! tRng 1D 1p
&ha &wa r]t nhi"! 1p &0n hZ! (bng+ &hng hen nh Lin'#rra3. Knh 1P2
&h0 th]3 &s3 thta ;J Qi vi 1p Geo"etr'!rra' vD &C& 1p &0n &wa nx.
Lv (0 tn tei &wa &C& 1p &0n nD3 1D 1D- *a0 T trnh (`ng hnh &wa Java
5D &x thT !3Jt Unh (`ng Qi vi &C& nh &wa &C& 1p x.
httpBOOtai1i'!ha3.&0-
2=7
Lp trnh ha trn Java 2D v 3D
Knh 2P15 &h ra -ut vv (! v" &C& 1p &0n &wa Geo"etr'!rra' g-B
Point!rra'+ Line!rra'+ Trian$e!rra'+ vD 6uad!rra' f&C& 1p nD3
;hjng phWi 1D 1p &0n &wa Geo"etr'Strip!rra'g. Tr0ng hnh nD3+ &C&
tp @In trCi nh]t &wa &C& nh &h ra 5 iT- nh (`ng thDnh : iT-+ 5
zng+ h0& 2 ta- giC&. Knh tha 7 &h ra 7 nh Unh nghha -ut ta giC&.
Ch H rng &C& Unh nD3 ;hjng (_ng &h!ngB -\i zng h0& -ut a giC&
3 R& (`ng u& 1p vi nha!.
Geo"etr'!rra' 2!@&1a** C0n*tr!&t0r*
Te0 -ut Qi tRng r\ng vi *Q nh vD Unh (eng nh &h0 tr&.
P0int#rra3fint v'rt',C0!nt+ int v'rt',80r-atg
Lin'#rra3fint v'rt',C0!nt+ int v'rt',80r-atg
Triang1'#rra3fint v'rt',C0!nt+ int v'rt',80r-atg
F!a(#rra3fint v'rt',C0!nt+ int v'rt',80r-atg
httpBOOtai1i'!ha3.&0-
2=9
Lp trnh ha trn Java 2D v 3D
[T t- hiT! &C&h *G (bng hD- te0 vD phng tha& ,'- 1ei 0en - 2P
7 vD 2P9+2P: *G (bng Qi tRng Line!rra'. SJ! @en ang (`ng -ut hnh
ta giC& &n thn vi &C& nh &x thT te0 thDnh hnh 1-+ t` &^t nha! h0&
;hjng phng. SJ! ,W3 ra+ &hng ;hjng thT (`ng ng R&.
%.2.* Su,casses of Geo"etr'Strip!rra'
Phn tr& -j tW 7 1p &0n &wa Geo"etr'!rra'+ ;hjng &h0 phcp *G
(bng 1ei &C& nh+ t!3 nhiIn &x -ut vDi trzng hRp ta &n *G (bng 1ei &C&
nh+ T &h0 ;Jt !W (`ng hnh tQt hn.
Lp Geo"etr'Strip!rra' 1D 1p trt! tRng tt x -\i th`& thT hnh
h& & @Wn fT ghcp te0 zng vD @" -t g thta ;J.
Geo"etr'Strip!rra' 1D 1p &ha &wa LineStrip!rra'+
Trian$eStrip!rra' vD Trian$e+an!rra'. Ta &x hnh 2P17 &h ra -ut
in*tan&' &wa -ut (eng &C& nh R& *G (bng 1ei.
Lp )'0-'tr32trip#rra3 &x hD- te0 ;hC& vi 1p Geo"etr'!rra'.
KD- te0 &wa nx &x 5 tha- *Q+ -ut -Wng &C&h nh tvnh trIn -\i -Wnh
&h0 phcp -ut Qi tRng &x thT (!3 tr nhi"! -Wnh.
Geo"etr'Strip!rra' &x 2 phng tha& thzng *G (bng Jn 1D
get4u+"tripsfg vD get"trip`ertex)ountsfg.
Geo"etr'2trip#rra3 2!@&1a** C0n*tr!&t0r*
httpBOOtai1i'!ha3.&0-
2=:
Lp trnh ha trn Java 2D v 3D
Te0 -ut Qi tRng r\ng vi giC trU &C& nh vD Unh (eng &C& nh vD -ut
-Wng tvnh t0Cn &C& nh !a &C& -Wnh. [Unh (eng 1D -ut ha3 nhi"! &C&
@it &z M. T -j tW &h0 -\i (Z 1iE! nh. [Unh (eng &C& &z 1D giQng
nha! nh Unh nghha tr0ng 1p Geo"etr'!rra'. Shi"! -Wnh &_ng
-ut 1& &ng R& h\ trR. Tng &C& tvnh t0Cn nh &h0 t]t &W &C& -Wnh
phWi @ng vi tng *Q &C& nh
Lin'2trip#rra3fint vt,C0!nt+ int v'rt',80r-at+ int *tripX'rt',C0!nt*g
Triang1'2trip#rra3fint vt,C0!nt+ int v'rt',80r-at+ int
*tripX'rt',C0!nt*g
Triang1'8an#rra3fint vt,C0!nt+ int v'rt',80r-at+ int
*tripX'rt',C0!nt*g
Ch H rng Java 5D ;hjng h\ trR &C& hnh & @Wn 3 vi nhi"! hn 7
-t. Sgzi 1p trnh phWi &x trC&h nhiE- tr0ng viE& *G (bng ;h th!t tC&h
T tC&h hnh pha& tep ra thDnh nhi"! &C& Qi tRng &wa Java 5D nh -Wng
ta- giC& h0& hnh !et.
Triang!1at0r C1a**
Pa&;ag'B &0-.*!n.N5(.!ti1*.Geo"etr'
2G (bng T &h!3Tn &C& a giC& hnh h& ;hjng &x (eng ta- giC& v" &C&
ta- giC& T &x thT (`ng hnh @ng Java 5D. CC& a giC& phWi 1D 1i+ &_ng
n- trIn -ut -t phng &C& &enh ;hjng gia0 nha!.
Triang!1at0r C0n*tr!&t0r 2!--ar3
Triang!1at0rfg
Te0 -ut Qi tRng ta- giC&.
Triang!1at0r /'th0( 2!--ar3
v0i( triang!1at'fGeo"etr'$n60 gin60g
httpBOOtai1i'!ha3.&0-
2=<
Lp trnh ha trn Java 2D v 3D
Chng trnh &0n nD3 &h!3Tn Qi tRng Geo"etr'$n60 tt (eng & @Wn
PML|)MS#..#| thDnh (eng T.$#S)L%#..#| *G (bng ;h th!t
tC&h a giC&
Tha- *QB
gin60 P &0-.*!n.N5(.!ti1*.Geo"etr'.Geo"etr'$n60 t0 @' triang!1at'(.
Xv (b v" &C&h *G (bngB T.$#S)L%#..#|
Triang!1at0r tr n'? Triang!1at0rfg
tr.triang!1at'fgin60g OO gin60 &0ntain* th' Geo"etr'
*hap'.set0eo#etr&fgin60.g'tGeo"etr'#rra3fgg OO *hap' i* a Shape*&
|0P30 C0(' D'-0n*trat'* Triang1'8an#rra3
[Qi tRng |030 tr0ng &hng trnh |030#pp.Nava *&h ra &C&h *G (bng
Qi tRng Triang1'8an#rra3 T -j hnh hxa &0n 30P30
Knh 2P19 &h 5 hnh (`ng &wa Triang1'8an#rra3.
Tr0ng 0en - 2P<+ phng tha& 3030Geo"etr'fgte0 vD trW v" Qi tRng
Triang1'8an#rra3 -0ng -!Qn.
httpBOOtai1i'!ha3.&0-
2==
Lp trnh ha trn Java 2D v 3D
Ddng 19P1= tvnh t0Cn ts- iT- &h0 7 hnh nxn. /\i hnh nxn &x 1= nh
R& tvnh t0Cn y (dng 20P2=. Ddng 50P52 te0 -ut Qi tRng
Triang1'8an#rra3 vD (dng 57 1D ni T tvnh t0Cn (Z 1iE! ta u ftt (dng
19P2=g T 1! Qi tRng
1. privat' Geo"etr' 3030Geo"etr'fg
2.
5. Triang1'8an#rra3 t6a
7. int S 1<
9. int t0ta1S 7fS1g
:. P0int56 &00r(* n'? P0int56t0ta1S
<. int *tripC0!nt* S1+ S1+ S1+ S1
=. 610at r 0.:6
9. 610at ? 0.76
10. int n
11. (0!@1' a
12. 610at ,+ 3
15.
17. OO *'t th' &'ntra1 p0int* 60r 60!r triang1' 6an *trip*
19. &00r(*0fS1g n'? P0int56f0.06+ 0.06+ ?g
1:. &00r(*1fS1g n'? P0int56f0.06+ 0.06+ 0.06g
1<. &00r(*2fS1g n'? P0int56f0.06+ 0.06+ 0.06g
1=. &00r(*5fS1g n'? P0int56f0.06+ 0.06+ P?g
19.
20. 60r fa 0+n 0 n } S a 2.0/ath.P$OfSP1g ng
21. , f610atg fr /ath.&0*fagg
22. 3 f610atg fr /ath.*infagg
25.
27. &00r(*0fS1gSPn n'? P0int56f,+ 3+ ?g
29. &00r(*1fS1gn1 n'? P0int56f,+ 3+ ?g
httpBOOtai1i'!ha3.&0-
2=9
Lp trnh ha trn Java 2D v 3D
2:. &00r(*2fS1gSPn n'? P0int56f,+ 3+ P?g
2<. &00r(*5fS1gn1 n'? P0int56f,+ 3+ P?g
2=.
29.
50. t6a n'? Triang1'8an#rra3 ft0ta1S+
51. Triang1'8an#rra3.CMM.D$S#T%2+
52. *tripC0!nt*g
55.
57. t6a.*'tC00r(inat'*f0+ &00r(*g
59.
5:. r't!rn t6a
5<. OO 'n( 06 -'th0( 3030Geo"etr' in &1a** |030
C0(' 8rag-'nt 2P< 3030Geo"etr'fg /'th0( Cr'at'* Triang1'8an#rra3
M@N'&t
Knh 30P30 tr^ng -i &h 1D iT- ;hyi !. Knh 2P1: &h ra -ut Qi
tRng tng t` nhng -D! R& tha3 i y -\i nh. Phng tha&
R& 3030Geo"etr'fgtha3 i. Ddng 25 !a 2:+ 5: ti 59+ vD (dng 7:
&h Unh -D! &h0 -\i nh.
1. privat' Geo"etr' 3030Geo"etr'fg
2.
5. Triang1'8an#rra3 t6a
7. int S 1<
9. int t0ta1S 7fS1g
:. P0int56 &00r(* n'? P0int56t0ta1S
<. C010r56 &010r* n'? C010r56t0ta1S
=. C010r56 r'( n'? C010r56f1.06+ 0.06+ 0.06g
httpBOOtai1i'!ha3.&0-
290
Lp trnh ha trn Java 2D v 3D
9. C010r56 3'110? n'? C010r56f0.<6+ 0.96+ 0.06g
10. int *tripC0!nt* S1+ S1+ S1+ S1
11. 610at r 0.:6
12. 610at ? 0.76
15. int n
17. (0!@1' a
19. 610at ,+ 3
1:.
1<. OO *'t th' &'ntra1 p0int* 60r 60!r triang1' 6an *trip*
1=. &00r(*0fS1g n'? P0int56f0.06+ 0.06+ ?g
19. &00r(*1fS1g n'? P0int56f0.06+ 0.06+ 0.06g
20. &00r(*2fS1g n'? P0int56f0.06+ 0.06+ 0.06g
21. &00r(*5fS1g n'? P0int56f0.06+ 0.06+ P?g
22.
25. &010r*0fS1g r'(
27. &010r*1fS1g 3'110?
29. &010r*2fS1g 3'110?
2:. &010r*5fS1g r'(
2<.
2=. 60rfa 0+n 0 n } S a 2.0/ath.P$OfSP1g ng
29. , f610atg fr /ath.&0*fagg
50. 3 f610atg fr /ath.*infagg
51. &00r(*0fS1gn1 n'? P0int56f,+ 3+ ?g
52. &00r(*1fS1gSPn n'? P0int56f,+ 3+ ?g
55. &00r(*2fS1gn1 n'? P0int56f,+ 3+ P?g
57. &00r(*5fS1gSPn n'? P0int56f,+ 3+ P?g
59.
5:. &010r*0fS1gSPn r'(
5<. &010r*1fS1gn1 3'110?
httpBOOtai1i'!ha3.&0-
291
Lp trnh ha trn Java 2D v 3D
5=. &010r*2fS1gSPn 3'110?
59. &010r*5fS1gn1 r'(
70.
71. t6a n'? Triang1'8an#rra3 ft0ta1S+
72. Triang1'8an#rra3.CMM.D$S#T%2-Triang1'8an#rra3.CMLM.5+
75. *tripC0!nt*g
77.
79. t6a.*'tC00r(inat'*f0+ &00r(*g
7:. t6a.*'tC010r*f0+&010r*g
7<.
7=. r't!rn t6a
79. OO 'n( 06 -'th0( 3030Geo"etr' in &1a** |030
C0(' 8rag-'nt 2P= /0(i6i'( 3030Geo"etr'fg /'th0( ?ith #(('(
C010r*
httpBOOtai1i'!ha3.&0-
292
Lp trnh ha trn Java 2D v 3D
%.2.- Su,casses of .ndexedGeo"etr'!rra'
CC& phn tr& -j tW &C& 1p &0n &wa Geo"etr'!rra'+ &h0 th]3 &h
1p Geo"etr'2trip#rra3 &x thI- !3"n hen *G (bng 1ei &C& nh. Xv (b
T Unh nghha -ut hnh 1p phng -\i nh tr0ng = nh &wa nx phWi
R& *G (bng @yi 5 hnh v!jng. Tr0ng trzng hRp ,]! nh]t &hng ta phWi
Unh nghha 27 nh -& (_ &h = nh 1D w.
[Qi tRng .ndexedGeo"etr'!rra' &!ng &]p -ut &]p @& ;hC& *a0
&h0 &x thT trCnh viE& *G (bng thta. Xi nhZng -Wng nD3 &ng &haa te0
u+ -D! *^&+ @" -t thzng vD te0 u @" -t.
T!3 nhiIn Qi tRng .ndexedGeo"etr'!rra' &ng &n thI- &C&
-Wng phb gi 1D -Wng &h *Q &haa &C& &h -b& Jn -Wng (Z 1iE!. /Wng
&h -b& nD3 &x nhi"! tha- &hiJ! Jn &C& nh tng t` tr0ng &_ng -ut
-Wng (Z 1iE!+ tt x &h0 phcp *G (bng 1ei hiE! !W r rDng. Chng ta &x
thT ,'n vv (b (i s3.
CC& 1p &0n &wa .ndexedGeo"etr'!rra' *0ng *0ng vi &C& 1p &0n
&wa 1p Geo"etr'!rra'. Cs3 thta ;J R& vY (i hnh 2P1=
httpBOOtai1i'!ha3.&0-
295
Lp trnh ha trn Java 2D v 3D
KD- te0 &h0 .ndexedGeo"etr'!rra'+
.ndexedGeo"etr'Strip!rra' &_ng &C& 1p &0n &wa &hng (i s3.
.ndexedGeo"etr'!rra' an( 2!@&1a**'* C0n*tr!&t0r*
Te0 -ut Qi tRng r\ng vi *Q nh vD Unh (eng nh &h0 tr& vD *Q &C&
&h -b& tr0ng -Wng nD3.
.ndexedGeo"etr'!rra'fint v'rt',C0!nt+ int v'rt',80r-at+ int
in(',C0!ntg
$n(','(P0int#rra3fint v'rt',C0!nt+ int v'rt',80r-at+ int in(',C0!ntg
$n(','(Lin'#rra3fint v'rt',C0!nt+ int v'rt',80r-at+ int in(',C0!ntg
$n(','(Triang1'#rra3fint v'rt',C0!nt+ int v'rt',80r-at+ int in(',C0!ntg
$n(','(F!a(#rra3fint v'rt',C0!nt+ int v'rt',80r-at+ int in(',C0!ntg
.ndexedGeo"etr'Strip!rra' an( 2!@&1a**'* C0n*tr!&t0r*
Te0 -ut Qi tRng r\ng vi *Q nh vD Unh (eng nh &h0 tr& vD *Q &C&
&h -b& tr0ng -Wng nD3 vD -ut -Wng &C& tng *Q &C& nh -\i -Wnh.
.ndexedGeo"etr'Strip!rra'fint v&+ int v6+ int i&+ int
*tripX'rt',C0!nt*g
$n(','(Lin'2trip#rra3fint v&+ int v6+ int i&+ int *tripX'rt',C0!nt*g
httpBOOtai1i'!ha3.&0-
297
Lp trnh ha trn Java 2D v 3D
$n(','(Triang1'2trip#rra3fint v&+ int v6+ int i&+ int *tripX'rt',C0!nt*g
$n(','(Triang1'8an#rra3fint v&+ int v6+ int i&+ int *tripX'rt',C0!nt*g
CC& phng tha& &wa &hng &h0 i (s3B
.ndexedGeo"etr'!rra' /'th0(* fpartia1 1i*tg
v0i( *'tC00r(inat'$n(',fint in(',+ int &00r(inat'$n(',g
Te0 &C& &h -b& ta u tng ang vi &C& nh tei vU trv &h -b& &h0 Qi
tRng
v0i( *'tC00r(inat'$n(i&'*fint in(',+ int &00r(inat'$n(i&'*g
Te0 &C& &h -b& &C& ta u tng ang vi &C& nh tei vU trv &h -b& &h0
Qi tRng
v0i( *'tC010r$n(',fint in(',+ int &010r$n(',g
Lp &h -b& -D! tng ang vi nh tei vU trv &h -b& &h0 vi Qi
tRng.
v0i( *'tC010r$n(i&'*fint in(',+ int &010r$n(i&'*g
Lp &C& &h -b& -D! tng ang vi &C& nh tei vU trv &h -b& &h0 vi
Qi tRng.
v0i( *'tS0r-a1$n(',fint in(',+ int n0r-a1$n(',g
Lp &h -b& @nh thzng tng ang vi nh tei &h -b& Unh tr& &h0
Qi tRng.
v0i( *'tS0r-a1$n(i&'*fint in(',+ int n0r-a1$n(i&'*g
Lp &C& &h -b& @nh thzng tng ang vi &C& nh tei &h -b& Unh
tr& &h0 Qi tRng.
v0i( *'tT',t!r'C00r(inat'$n(',fint t',C00r(2't+ int in(',+ }n'? in 1.2~
int t',C00r($n(',g
Lp &h -b& t0e u tng ang vi nh tei &h -b& Unh tr& &h0 Qi
tRng.
httpBOOtai1i'!ha3.&0-
299
Lp trnh ha trn Java 2D v 3D
v0i( *'tT',t!r'C00r(inat'$n(i&'*fint t',C00r(2't+ int in(',+
int t',C00r($n(i&'*g
Lp &C& &h -b& t0e u tng ang vi &C& nh tei &h -b& Unh tr& &h0
Qi tRng.
%.2.2 !xis.0ava is an )xa"pe of .ndexedGeo"etr'!rra'
Xv (b #,i* v" .ndexedGeo"etr'!rra' ta &x Unh nghha 1= nh vD
50 &h -b& &h0 19 zng. Sh v3 &x 9 zng &h0 -\i trb&.
2.> !ppearance and 0ttri+9tes
[Qi tRng Shape*& &x thT tha- &hiJ! Jn &W Qi tRng Geo"etr' vD
#pp'ran&'. Sh thW0 nxi y phva trIn tr0ng phn 2.9+ Qi tRng
Geo"etr' &h ra thjng tin &wa -Qi nh vi -ut Qt tRng !an *Ct.
Thjng tin -\i nh nD3 &x thT &h Unh ra -D! &wa Qi tRng. DZ 1iE!
tr0ng Qi tRng Geo"etr' thzng ;hjng w T -j tW @" ng0Di &wa -ut
@Qi tRng. Tr0ng trzng hRp x r]t &n thiJt Qi tRng #pp'ran&'.
/ut Qi tRng !ppearance ;hjng &haa (Z 1iE! -j tW Qi tRng !an *Ct
-D nx @iJt ni nD0 &x (Z 1iE! x+ (0 x &C&h 1D- &wa nx 1D tha- &hiJ!
Jn -ut vDi Qi tRng ;hC& nh 1p &0n &wa bodeCo"ponent .
httpBOOtai1i'!ha3.&0-
29:
Lp trnh ha trn Java 2D v 3D
/ut Qi tRng !ppearance &x thT tha- &hiJ! Jn th!u& tvnh -ut vDi Qi
tRng 1p ;hC& nhB
-ointttri4utes
6inettri4utes
-ol&gonttri4utes
Coloringttri4utes
"ransparenc&ttri4utes
2en'eringttri4utes
%aterial
"exturettri4utes
"exture
"exCoor'0eneration
2C! th!u& tvnh R& " &p Jn tr0ng tDi 1iE! nD3 &dn 1ei (Dnh &h0
&hng : vD &hng <.
/ut Qi tRng !ppearance vi &C& th!u& tvnh &wa Qi tRng ;hC& -D
nx tha- &hiJ! Jn gi 1D -ut gxi gia0 (iEn. [T tha- &hiJ! Jn nx (`a
trIn phng tha& vi -ut &Ci tIn &hvnh ,C&. Xv (b nh tha- &hiJ! Jn Qi
tRng C010ring#ttri@!t'* nx *G (bng phng tha&
!ppearance.set)oloring$ttri3utesfg.
TrIn thU ;h!ng &Wnh
httpBOOtai1i'!ha3.&0-
29<
Lp trnh ha trn Java 2D v 3D
%.3.( !ppearance bodeCo"ponent
!ppearance C0n*tr!&t0r
KD- te0 nD3 te0 Qi tRng !ppearance vi -i thDnh phn &hiJ! nhn
giC trU n!11. CC& giC trU -& Unh &x thT 0Cn R&B iT- vD 0en thng
R& vY vi ;v&h th& vD u (Di 1 pi,'1 vD ;hjng &x &x ;hG rVng &a+
-D! -& Unh 1D -D! tr^ng+ ;hW nVng ,!3In !a vj hiE! hxa.
!ppearancefg
%.3.% Sharin$ bodeCo"ponent F,0ects
XiE& tha- &hiJ! Jn -ut vDi Qi tRng 1D hRp 1E vD &ng &n thiJt v
thJ nIn &hia * &_ng &C& Qi tRng bodeCo"ponent. Xv (b tr0ng hnh 2P
21 2 Qi tRng Shape*& &hia * &_ng thDnh phn Lin'#ttri@!t'*.
XiE& &hia *Y nD3 gip &h0 viE& (`ng hnh nhanh hn+ hiE! !W &Dng
&a0.
httpBOOtai1i'!ha3.&0-
29=
Lp trnh ha trn Java 2D v 3D
T!3 nhiIn &n &h H rng -ut n0(' ;hjng R& &x nhi"! hn -ut &ha tt
x bodeCo"ponent &x thT &hia * ha3 tha- &hiJ! Jn @yi nhi"! Qi
tRng ;hC&.
%.3.* !ttri,ute Casses
Point!ttri,utes
[Qi tRng Point!ttri,utes !Wn 1v viE& -\i iT- & @Wn R& (`ng
hnh nh thJ nD0. /& Unh -ut nh R& (`ng nh -ut iT-+ @en &x
thT (_ng set!oint"idefg T 1D- &h0 iT- x t0 ra t!3 nhiIn -& Unh -ut
iT- t0 *Y trjng nh -ut hnh v!jng+ trt phi @en (_ng
set!oint$ntialiasingZna3lefg. L& x iT- v!jng R& 1D- trdn i.
Point!ttri,utes Constructors
Point!ttri,utes<=
Te0 -ut Qi tRng thDnh phn vD -j tW ;v&h th& 1 pi,'1 ;hjng (_ng
;hG rVng &a
Point!ttri,utes<foat pointSi4e@ ,ooean state=
Te0 -ut Qi tRng thDnh phn vD -j tW ;v&h th& 1 pi,'1 (_ng ;hG rVng
&a
Point!ttri,utes /ethods
void setPointSi4e<foat pointSi4e=
/j tW ;v&h th& pi,'1 &wa &C& iT-
void setPoint!ntiaiasin$)na,e<,ooean state=
ThiJt 1p h0& @ thiJt 1p &hQng rVng &a. Thzng 1D- nJ! p0int2i' ~
1 pi,'1.
httpBOOtai1i'!ha3.&0-
299
Lp trnh ha trn Java 2D v 3D
Line!ttri,utes
[Qi tRng nD3 tha3 i &C&h (`ng &C& zng & @Wn th'0 5 &C&h. /&
Unh zng R& vY 1D nct 1i"n+ vi u rung 1pi,1' ;hjng &hQng rVng &Ga.
>en &x thT tha3 i i"! nD3 @ng &C&h *G (bng &C& phng tha&
setLine!atternfg+ setLinehidthfg+ vD setLine$ntialiasingZna3lefg.
/qu fn$ thrn$ do n$fi dYn$ tO Hnh n$h9a
/ut -! thzng (R& Unh nghha @ng -ut -t ne -! vD -ut thDnh
phn !3 -j.
/ut giC trU 1: @it Unh nghha -ut -t ne -!. /\i @it tr0ng 1: @it giC
trU Unh nghha ;hi nD0 1 pi,'1 tr0ng -! R& @t ha3 t^t f1O0g. 2a! ;hi &W
1: -! "! R& *G (bng+ th -! R& 1p 1ei. >it 0 tng ang vi pi,'1
! tiIn tr0ng -!.
Xv (b -ut -t ne &wa 0,0066 f0@0000000011111111g Unh nghha = pi,'1
-y *a! x 1D = pi,'1 xng.
Sh rng+@it phxng ei @c nh]t R& *G (bng ! tiIn ;hi vY+ nIn
-! @it R& & tt phWi *ang trCi. /t ne -! giC trU 0,0101 Unh nghha
-ut -! 1p &wa -ut pi,'1 -y vD <pi,'1 t^t. /! nD3 R& 1p 1ei nhi"!
1n t_3 th'0 3I! &!+ -! ;hyi ung 1ei tr& -\i zng -i &wa -ut
-Wnh.
CC& -! &x thT -y rung Jn 270 pi,'1 *G (bng nhsn tQ !3 -j. Xv (b
nh !3 -j &wa 5 , vi -ut -t ne -! 0,0016 tng ng vi *Wn
*inh ra -! vi 19 pi,'1 -y th'0 @yi 55 pi,'1 xng. ih0Wng &C&h ng 1D
1+19+giC trU @In ng0Di ;h0Wng nD3 1D ;hjng &h]p nhn R&.
Line!ttri,utes Constructors
Line!ttri,utes<=
Te0 -ut Qi tRng thDnh phn -j tW u rung 1 pi,'1+ -ut zng thng
1i"n nct ;hjng ;hG rVng &a.
Line!ttri,utes<foat pointSi4e@ int inePattern@ ,ooean state=
httpBOOtai1i'!ha3.&0-
500
Lp trnh ha trn Java 2D v 3D
Te0 -ut Qi tRng thDnh phn -j tW u rung 1 pi,'1 &h0 -ut zng
thng+ -! (_ng T vY+ &x ;hG rVng &a.
Line!ttri,utes /ethods
void setLineAidth<foat ineAidth=
/j tW u rung pi,'1 &h0 zng thng
void setLinePattern<int inePattern=
1in'Patt'rn 1D -ut tr0ng *Q &C& hng *a!B
P#TT%.S2ML$D fth' ('6a!1tg+
P#TT%.SD#2K+ P#TT%.SDMT+ P#TT%.SD#2KDMT+ 0r
P#TT%.S42%.D%8$S%D.
/j tW 1D- *a0 -ut pi,'1 &wa -ut zng R& i"n vD0.
void setLine!ntiaiasin$)na,e<,ooean state=
> ha3 &x &hQng rVng &a vi zng thng
void setPattern/ask<int "ask= sne1 in (.%t
Lp -ut -t ne -! vi -ut giC trU & @iEt
void setPatternScae+actor<int scae+actor= sne1 in (.%t
2't* th' 1in' patt'rn *&a1' 6a&t0r t0 th' *p'&i6i'( va1!'.
Line !ttri,utes Line Patterns
P!TT)#buSFL.& *01i( 1in'* fn0 patt'rng. Thi* i* th' ('6a!1t.
P!TT)#bu&!S7 (a*h'( 1in'* i('a113+ a r'p'ating patt'rn 06 = pi,'1*
0n an( = pi,'1* 066.
P!TT)#bu&FT (0tt'( 1in'* i('a113+ a r'p'ating patt'rn 06 1 pi,'1 0n
an( < pi,'1* 066.
httpBOOtai1i'!ha3.&0-
501
Lp trnh ha trn Java 2D v 3D
P!TT)#bu&!S7u&FT (a*h'(P(0tt'( 1in'* i('a113+ a r'p'ating
patt'rn 06 < pi,'1* 0n+ 7 pi,'1*
066+ 1 pi,'1 0n+ an( 7 pi,'1* 066.
P!TT)#bu_S)#u&)+.b)& 1in'* ?ith a !*'rP('6in'( 1in' patt'rn.
2'' 4*'rP('6in'( Lin' Patt'rn*+a@0v'.
Po'$on!ttri,utes
Po'$on!ttri,utes &hi phQi viE& (`ng hnh &wa &C& thDnh phn &
@Wn a giC& th'0 5 &C&hB a giC& @U phsn tC&h nh thJ nD0+ nJ! nx R&
&hn 1& vD ;hi nD0 th u *s! @_ R& &h]p nhn. /& Unh &C& a giC&
"! 1D a giC& 1i t!3 nhiIn ;hi a giC& @U tC&h th a giC& R& vY 1ei
thDnh &C& ;h!ng fzngg h0& &h &C& iT- tei &C& nh. Phng tha&
set)ull.a&efg (_ng T 10ei @ &C& a giC& R& (`ng. SJ! phng
tha& nD3 thiJt 1p h0& C4LL8.MST h0& C4LL>#Ci th -ut nGa
*Q a giC& ;hjng R& (`ng.
T_3 th'0 *` hiE! !W &wa hE thQng (`ng hnh -D &C& nh R& (`ng
&W 1D &C& (s3 ;h!ng vD &C& a giC& 1i 1!jn R& phsn tC&h vi giC trU u
*s! &hvnh ,C&. iJt !W 1D &C& a giC& vD &C& (s3 ;h!ng &x thT R& (`ng
y u *s! ;hC& nha!+ gs3 ra hiEn tRng zng ;hs!. KiEn tng stitchin$
nD3 1D (0 u *s! ;hC& nha! nIn &C& (s3 ;h!ng ,!]t hiEn 1& n 1& hiEn
trIn a giC&. Xi 2 th!u& tvnh P013g0nM66*'t vD P013g0nM66*'t8a&t0r v"
giC trU u *s! &h0 phcp a giC& 1i &x thT hng ;hG! ta3 v" phva ;h!ng
hnh Wnh. set2a&-.a&e4or+al.lipfgR& *G (bng T (`ng -ut a giC& 1i
*Cng vi &W 2 -t &wa a giC& "! -z i.
Po'$on!ttri,utes Constructors
Po'$on!ttri,utes<=
httpBOOtai1i'!ha3.&0-
502
Lp trnh ha trn Java 2D v 3D
Te0 Qi tRng thDnh phn vi giC trU -& Unh &wa a giC& 1i ;hjng &x
&^t @" -t ;hjng &x ra a giC&.
Po'$on!ttri,utes<int po'$on/ode@ int cu+ace@ foat
po'$onFffset=
Te0 Qi tRng thDnh phn vi giC trU &h0 tr& &wa giC& 1i
Po'$on!ttri,utes<int po'$on/ode@ int cu+ace@ foat
po'$onFffset@
,ooean ,ack+acebor"a+ip=
Te0 Qi tRng thDnh phn giQng nh &C& hD- te0 phva tr& nhng &ng
&h0 phcp &h ra -t phva tr& vD phva *a! &wa a giC& nh thJ nD0
Po'$on!ttri,utes<int po'$on/ode@ int cu+ace@ foat
po'$onFffset@ ,ooean ,ack+acebor"a+ip@ foat
po'$onFffset+actor= sne1 in (.%t
Te0 Qi tRng Po'$on!ttri,utes vi giC trU &h0 tr&.
Po'$on!ttri,utes /ethods
void setCu+ace<int cu+ace=
&!118a&' 1D C4LL8.MST+ C4LL>#Ci+ 0r C4LLSMS%. C!11
f;hjng (`ngg tr& -t vD -t *a! &wa &C& a giC& h0& ;hjng tC&h a
giC& nD0.
void setPo'$on/ode<int po'$on/ode=
p013g0n/0(' 1DB PML|)MSPM$ST+ PML|)MSL$S%+ 0r
PML|)MS8$LL. D`ng p013g0n* trIn p0int*+ 1in'*+ 0r 6i11'( p013g0n*
f-& Unhg.
void setPo'$onFffset<foat po'$onFffset=
p013g0nM66*'t 1D *&r''nP*pa&' 066*'t thI- vD0 T hiE! &hnh giC trU u *s!
&wa p013g0n pri-itiv'*.
httpBOOtai1i'!ha3.&0-
505
Lp trnh ha trn Java 2D v 3D
void setPo'$onFffset+actor<foat po'$onFffset+actor= sne1 in (.%t
Lp p013g0n 066*'t 6a&t0r vi giC trU &h0 tr&.
void setBack+acebor"a+ip<,ooean ,ack+acebor"a+ip=
tr0ng x @a&;8a&'S0r-a181ip ,C& Unh ;hi nD0 nh @nh thzng h0&
-t *a! &wa a giC& &n ;h!]t *Cng. ihi &z nD3 R& 1p giC trU tr!' -t
*a! @ 1`a &hn -t *a!.
Coorin$!ttri,utes
Th!u& tvnh C010ring#ttri@!t'* i"! ;hiTn &h!3En tj -D!. Phng
tha& set)olorfg 1p -ut -D! @In tr0ng tr0ng x t_3 trzng hRp -D T
-D! x vD0. ThI- va0 x set"hade*odelfg ,C& Unh ;hi nD0 &x ;hi &n
thI- ngang -ut -D! vD0.
Coorin$!ttri,utes Constructors
Coorin$!ttri,utes<=
Te0 Qi tRng thDnh phn *G *bng -D! tr^ng &h0 -D! @In tr0ng vD
2K#D%)M4.#4D 1D -j hnh Cnh @xng.
Coorin$!ttri,utes<Coor*f coor@ int shade/ode=
Coorin$!ttri,utes<foat red@ foat $reen@ foat ,ue@ int shade/ode=
*ha('/0('1 1D -ut tr0ng 2K#D%)M4.#4D+ 2K#D%8L#T+
8#2T%2T+ 0r S$C%2T.
ftr0ng h! hJt trzng hRp+ 8#2T%2T 1D 2K#D%8L#T+ vD S$C%2T 1D
2K#D%)M4.#4D.g
Coorin$!ttri,utes /ethods
void setCoor<Coor*f coor=
void setCoor<foat red@ foat $reen@ foat ,ue=
&W 2 phng tha& "! Unh nghha -D! @In tr0ng
void setShade/ode<int shade/ode=
httpBOOtai1i'!ha3.&0-
507
Lp trnh ha trn Java 2D v 3D
*ha('/0('1 1D -ut tr0ng &C& hngB 2K#D%)M4.#4D+
2K#D%8L#T+ 8#2T%2T+
0r S$C%2T.
Transparenc'!ttri,utes
Th!u& tvnh nD3 !Wn 1v u tr0ng *!Qt &wa @]t &a hnh & @Wn nD0.
*'tTran*par'n&3fg Unh nghha giC trU tr0ng *!Qt f@ng 1 1D tr0ng *!Qt h0Dn
t0Dn+ @ng 0.0 1D ;hjng tr0ng *!Qtg
Transparenc'!ttri,utes Constructors
Transparenc'!ttri,utes<=
Te0 Qi tRng thDnh phn vi u tr0ng *!Qt 1p y &hJ u SMS%.
Transparenc'!ttri,utes<int t/ode@ foat tCa=
Tr0ng x t/0(' 1D -ut tr0ng nhZng >L%SD%D+ 2C.%%SDMM.+
8#2T%2T+ S$C%2T+ h0& SMS%+ vD tXa1 Unh nghha tvnh -z &wa Qi
tRng f0.0 ;hjng tr0ng *!Qt vD 1.0+ tr0ng *!Qt h0Dn t0Dng.
Transparenc'!ttri,utes<int t/ode@ foat tCa@ int srcBend+unction@
int dstBend+unction= sne1 in (.%t
Te0 -ut Qi tRng Tran*par'n&3#ttri@!t'* vi giC trU Unh tr&
Transparenc'!ttri,utes /ethods
void setTransparenc'<foat tCa=
tXa1 Unh nghha tvnh -z &wa Qi tRng f0.0 ;hjng tr0ng *!Qt vD 1.0+ tr0ng
*!Qt h0Dn t0Dng.
void setTransparenc'/ode<int t/ode=
httpBOOtai1i'!ha3.&0-
509
Lp trnh ha trn Java 2D v 3D
t/0(' f0n' 06 >L%SD%D+ 2C.%%SDMM.+ 8#2T%2T+ S$C%2T+ 0r
SMS%g &h ra nJ!
&x h0et ung 1D- tr0ng *!Qt
void set&stBend+unction<int ,end+unction= sne1 in (.%t
Lp Ua &h &ha& nVng pha trun R& *G (bng T trun u tr0ng *!Qt vD
&hQng rVng &a.
void setSrcBend+unction<int ,end+unction= sne1 in (.%t
Lp tDi ng!3'n hD- trung *G (bng T trun u tr0ng *!Qt vD &hQng rVng
&a.
#enderin$!ttri,utes
#enderin$!ttri,utes i"! ;hiTn 2 h0et ung (`ng hnh trIn ttng
pi,'1B ;iT- Unh u *s! E-+ vD ;iT- tra a1pha.
K0et ung !ct fGeo"etr'g ,C& Unh ,'- viE& (`ng hnh pi,'1 Wnh
hng Jn -Dn Wnh thJ nD0. /& Unh 1D @ &hn Geo"etr' thzng R&
*G (bng tr0ng h! hJt &C& trzng hRp
[u *s! E- 1D tp hRp &C& giC trU u *s! &wa nhZng pi,'1 R& (`ng. Sx
R& (_ng " ,C& Unh pi,'1 R& nhn th]3 ha3 @U ;h!]t T &hng &x thT
R& (`ng. [u *s! E- *G (bng ;hC& ;hi (`ng Qi -z vD tr0ng *!Qt. iJt
!W 1D Qi tRng tr0ng *!Qt ;hjng &p nhp giC trU u *s! I- ;hjng @nh
thzng. Cx thT vj hiE! hxa h0& (_ng tvnh nVng nD3 Qi vi -ut Qi
tRng thDnh phn #enderin$!ttri,utes. XiE& vj hiE! hxa W- @W0 Qi
tRng 1!jn 1!jn nhn th]3+ t!3 nhiIn -& Unh 1D T nx 'na@1'.
#enderin$!ttri,utes Constructors
#enderin$!ttri,utes<=
Te0 -ut Qi tRng thDnh phn Unh nghha viE& (`ng trIn pi,'1 vi viE&
;v&h h0et ;iT- tra u *s! E- vD vj hiE! hxa tvnh nVng ;iT- tra a1pha.
httpBOOtai1i'!ha3.&0-
50:
Lp trnh ha trn Java 2D v 3D
#enderin$!ttri,utes<,ooean depthBuffer)na,e@ ,ooean
depthBufferArite)na,e@ foat aphaTestCaue@ int
aphaTest+unction=
Tr0ng x ('pth>!66'r%na@1' @t t^t *0 *Cnh u *s! E- f;iT- tra u *s!g+
('pth>!66'rLrit'%na@1' @t vD t^t T ghi vD0 ('pth @!66'r+
a1phaT'*tXa1!' R& *G (bng T ;iT- tra. [Qi vi &C& ng!n a1pha i vD0
+ an( a1phaT'*t8!n&ti0n 1D -ut tr0ng nhZng #LL#|2+ S%X%.+
%F4#L+ SMT%F4#L+ L%22+ L%22M.%F4#L+ ).%#T%.+ h0&
).%#T%.M.%F4#L+ &h r 10ei a1pha t'*t nD0 R& ;v&h h0et. Te0
-ut Qi tRng thDnh phn Unh nghha viE& (`ng trIn pi,'1 &h0 *0 *anh u
*s! E- vD ;iT- tra a1pha.
#enderin$!ttri,utes<,ooean depthBuffer)na,e@ ,ooean
depthBufferArite)na,e@ foat aphaTestCaue@ int
aphaTest+unction@
,ooean visi,e@ ,ooean i$noreCertexCoors@
,ooean Geo"etr'Fp)na,e@ int Geo"etr'Fp= sne1 in (.%t
Te0 -ut Qi tRng #enderin$!ttri,utes vi giC trU &h0 tr&.
#enderin$!ttri,utes /ethods
void set&epthBuffer)na,e<,ooean state=
t!rn* 0n an( 066 th' ('pth @!66'r t'*ting.
void set&epthBufferArite)na,e<,ooean state=
t!rn* 0n an( 066 ?riting t0 th' ('pth @!66'r.
void set!phaTestCaue<foat vaue=
*p'&i6i'* th' va1!' t0 @' !*'( 60r t'*ting again*t in&0-ing *0!r&' a1pha
va1!'*.
void set!phaTest+unction<int function=
httpBOOtai1i'!ha3.&0-
50<
Lp trnh ha trn Java 2D v 3D
?h'r' 6!n&ti0n i* 0n' 06 #LL#|2+ S%X%.+ %F4#L+ SMT%F4#L+
L%22+ L%22M.%F4#L+
).%#T%.+ 0r ).%#T%.M.%F4#L+ ?hi&h ('n0t'* ?hat t3p' 06
a1pha t'*t i* a&tiv'. $6 6!n&ti0n i*
#LL#|2 fth' ('6a!1tg+ th'n th' a1pha t'*t i* '66'&tiv'13 (i*a@1'(.
void set&epthBuffer)na,e<,ooean state= sne1 in (.%t
%na@1'* 0r (i*a@1'* ('pth @!66'r -0(' 60r thi* #enderin$!ttri,utes
&0-p0n'nt 0@N'&t.
void set&epthBufferArite)na,e<,ooean state= sne1 in (.%t
%na@1'* 0r (i*a@1'* ?riting th' ('pth @!66'r 60r thi* 0@N'&t.
void set.$noreCertexCoors<,ooean i$noreCertexCoors= sne1 in
(.%t
2't* a 61ag that in(i&at'* ?h'th'r v'rt', &010r* ar' ign0r'( 60r thi*
#enderin$!ttri,utes 0@N'&t.
void setGeo"etr'Fp<int Geo"etr'Fp= sne1 in (.%t
2't* th' Geo"etr' 0p'rati0n 6!n&ti0n 60r thi* #enderin$!ttri,utes
&0-p0n'nt 0@N'&t.
void setGeo"etr'Fp)na,e<,ooean Geo"etr'Fp)na,e= sne1 in
(.%t
2't* th' Geo"etr'Mp 'na@1' 61ag 60r thi* #enderin$!ttri,utes
&0-p0n'nt 0@N'&t.
void setCisi,e<,ooean visi,e= sne1 in (.%t
2't* th' vi*i@i1it3 61ag 60r thi* #enderin$!ttri,utes &0-p0n'nt 0@N'&t.
!ppearance !ttri,ute &efauts
KD- te0 !ppearance ;hyi te0 Qi tRng !ppearance vi &C& th!u&
tvnh tha- &hiJ! Jn &C& giC trU n!11. >Wng 2P1 1D (anh *C&h &C& giC trU -&
Unh &h0 nhZng th!u& tvnh tha- &hiJ! Jn giC trU n!11.
!ttri,utes Cass Para"eter &efaut Caue
httpBOOtai1i'!ha3.&0-
50=
Lp trnh ha trn Java 2D v 3D
C010ring#ttri@!t'* &010r
*ha(' -0('1
?hit' f1+ 1+ 1g
2K#D%)M4.#4D
Lin'#ttri@!t'* 1in' ?i(th
1in' patt'rn
1in' antia1ia*ing 'na@1'
1.0
P#TT%.S2ML$D
6a1*'
Point!ttri,utes p0int *i'
p0int antia1ia*ing 'na@1'
1.0
6a1*'
Po'$on!ttri,utes &!11 6a&'
@a&;8a&'S0r-a181ip
p013g0n -0('
p013g0nM66*'t
p013g0nM66*'t8a&t0r
C4LL>#Ci
6a1*'
PML|)MS8$LL
0.0
0.0
#enderin$!ttri,utes ('pth>!66'r%na@1'
('pth>!66'rLrit'%na@1'
a1phaT'*t8!n&ti0n
a1phaT'*tXa1!'
vi*i@1'
ign0r'X'rt',C010r*
Geo"etr'Mp%na@1'
Geo"etr'Mp
tr!'
tr!'
#LL#|2
0.0
tr!'
6a1*'
6a1*'
.MPCMP|
T',t!r'#ttri@!t'* t',t!r'/0('
t',t!r'>1'n(C010r
tran*60r-
p'r*p'&tiv'C0rr'&ti0n/0(
'
.%PL#C%
@1a&; f0+ 0+ 0+ 0g
i('ntit3
S$C%2T
n!11
httpBOOtai1i'!ha3.&0-
509
Lp trnh ha trn Java 2D v 3D
t',t!r'C010rTa@1'
Tran*par'n&3#ttri@!t'* tran*par'n&3/0('
tran*par'n&3Xa1!'
*r&>1'n(8!n&ti0n
(*t>1'n(8!n&ti0n
SMS%
0.0
2.C>L%SD#LPK#
>L%SDMS%/$S42#LPK#
%.3.- )xa"peh Back +ace Cuin$
[a giC& &x 2 -t. Xi nhi"! Qi tRng !an *Ct ;hjng &h -ut -t
&wa a giC& &n R& (`ng. [T giW- &jng viE& tvnh t0Cn &n thiJt phWi
(`ng @" -t &wa a (iEn+ hE thQng (`ng hnh &x thT &hn 1& nhZng -t
;hjng &n thiJt. >" -t tr& &wa -ut Qi tRng &x thT 1D -t &h0 &C&
nh R& Unh nghha th'0 tha t` ngR& &hi"! ;i- ng h.
T?i*t2trip#pp.Nava te0 -ut Qi tRng (Wi ,0^n vD !a3 nx !anh trb&
3.
ihi (Wi ,0^n !a3 &C& phn &wa nx ,'- nh @iJn -]t t!3 nhiIn
nhZng -! @iJn -]t &x thT (k (Dng th]3 y hnh 2P22. Th`& tJ &hng
trnh Unh nghha 2 Qi tRng !an *Ct vi &_ng -ut hnh. /ut Qi tRng
R& (`ng (i (eng ;h!ng (s3 &dn Qi tRng &dn 1ei (`ng vi @" -t
1i"n. F!a x ;hi !a3 &hng ta &x thT !an *Ct R& nh v3.
httpBOOtai1i'!ha3.&0-
510
Lp trnh ha trn Java 2D v 3D
Lv (0 &x -]t &C& a giC& 1D &hJ u &hn 1& ;hjng &h ra+ v thJ nx T
-& Unh 1D C4LL>#Ci. CC& ta- giC& &wa @" -t @iJn -]t ;hi phn
1ng &wa nx fphn *a!g Qi -t vi -Dn Wnh. Tvnh nVng nD3 &h0 phcp hE
thQng (`ng hnh trCnh ;hjng phWi (`ng phn @" -t ta- giC& vQn ;hjng
&n thiJt.
T !3 nhiIn tr0ng -ut *Q trzng hRp viE& &hn 1& 1ei gs3 v]n "+ nh
tr0ng vv (b T?i*t2trip#pp. X]n " &x -ut &C&h giWi !3Jt n giWn x 1D
t^t @ &hJ u &hn 1&. Sh 0en - tr0ng hnh 2P10B
public class Twist0trip/pp extends /pp*et Q
// //////////////////////////////////////////
/////
//
// create Twist .isua* ob\ect
//
public class Twist extends 0hapef) Q
httpBOOtai1i'!ha3.&0-
511
Lp trnh ha trn Java 2D v 3D
// //////////////////////////////////////
////
//
// create twist subgraph
//
public Twist(& Q
this.set%eometr,(create%eometr,(&&'
this.set/ppearance(create/ppearance(&&'
2 // end of twist constructor
%eometr, create%eometr,(& Q
Triang*e0trip/rra, twist0trip'
Co*orff b*ue = new Co*orff(+.+f,
+.+f, O.+f&'
// create triang*e strip for twist
int # = Y+'
int stripCountsKL = Q # 2'
twist0trip = new Triang*e0trip/rra,(
#,
Triang*e0trip/rra,.!OOR"INATES U
Triang*e0trip/rra,.!OLOR_#,
stripCounts&'
double a'
httpBOOtai1i'!ha3.&0-
512
Lp trnh ha trn Java 2D v 3D
int .'
for (. = +, a = +.+' . Z #' . k= (,
a = . ] (.+ ] Math.PI / (# X (&& Q
twist0trip.setCoordinate(., new
ointfd(+.e ] Math.$in(a& k +.(
] Math.co$(a&, +.f ]
Math.$in(a&, +.e ] Math.co$(a&
k +.( ] Math.co$(a&&&'
twist0trip.setCoordinate(. k O,
new ointfd(+.e ] Math.$in(a&
X +.( ] Math.co$(a&,
X+.f ] Math.$in(a&, +.e
] Math.co$(a& X +.( ]
Math.co$(a&&&'
twist0trip.setCo*or(., b*ue&'
twist0trip.setCo*or(. k O,
b*ue&'
2
return twist0trip'
2
// create /ppearance for Twist 0trip
//
// this method creates the defau*t
/ppearance for the
// twist strip. The commented *ine of
code containting
httpBOOtai1i'!ha3.&0-
515
Lp trnh ha trn Java 2D v 3D
// the setCu**dace wi** fix the prob*em
of ha*f of the
// Twisted 0trip disappearing.
/ppearance create/ppearance(& Q
/ppearance twist/ppear = new
/ppearance(&'
o*,gon/ttributes po*,/ttrib = new
o*,gon/ttributes(&'
//
po*,/ttrib.setCu**dace(o*,gon/ttributes.CxNN"#-#
!&'
twist/ppear.seto*,gon/ttributes(po*,/ttrib&'
return twist/ppear'
2
2 // end of c*ass Twist
// //////////////////////////////////////////
/////
//
// create scene graph branch group
//
public Branch%roup create0cene%raph(& Q
httpBOOtai1i'!ha3.&0-
517
Lp trnh ha trn Java 2D v 3D
Branch%roup content$oot = new
Branch%roup(&'
// Create the transform group node and
initia*ize it to the
// identit,. /dd it to the root of the
subgraph.
Transform%roup ob\0pin = new
Transform%roup(&'
ob\0pin.setCapabi*it,(Transform%roup.ALLOW_TRANSF
ORM_WRITE&'
content$oot.addChi*d(ob\0pin&'
0hapef) twist = new Twist(&'
ob\0pin.addChi*d(twist&'
// )up*icate the twist strip geometr, and
set the
// appearance of the new 0hapef) ob\ect
to *ine mode
// without cu**ing.
// /dd the -NY%-#"d{NN!) and
-NY%-#"N{#! strips
// in the scene graph at the same point.
// This wi** show the triang*es of the
origina* Mobius strip that
// are c*ipped. The o*,gon-ffset is set
to pre.ent stitching.
httpBOOtai1i'!ha3.&0-
519
Lp trnh ha trn Java 2D v 3D
o*,gon/ttributes po*,/ttrib = new
o*,gon/ttributes(&'
po*,/ttrib.setCu**dace(o*,gon/ttributes.!%LL_NON
E&'
po*,/ttrib.seto*,gonMode(o*,gon/ttributes.POL&'
ON_LINE&'
po*,/ttrib.seto*,gon-ffset(+.++Of&'
/ppearance po*,/ppear = new /ppearance(&'
po*,/ppear.seto*,gon/ttributes(po*,/ttrib&'
ob\0pin.addChi*d(new
0hapef)(twist.get%eometr,(&, po*,/ppear&&'
/*pha rotation/*pha = new /*pha(XO,
Ou+++&'
$otation{nterpo*ator rotator = new
$otation{nterpo*ator(rotation/*pha,
ob\0pin&'
// a bounding sphere specifies a region a
beha.ior is acti.e
// create a sphere centered at the origin
with radius of O
Bounding0phere bounds = new
Bounding0phere(&'
httpBOOtai1i'!ha3.&0-
51:
Lp trnh ha trn Java 2D v 3D
rotator.set0chedu*ingBounds(bounds&'
ob\0pin.addChi*d(rotator&'
// maWe bacWground white
BacWground bacWground = new
BacWground(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(bounds&'
content$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on
this scene graph.
content$oot.compi*e(&'
return content$oot'
2 // end of Create0cene%raph method of
Twist0trip/pp
// Create a simp*e scene and attach it to the
.irtua* uni.erse
public Twist0trip/pp(& Q
setNa,out(new BorderNa,out(&&'
Can.asf) can.asf) = new Can.asf)(null&'
add(^Center^, can.asf)&'
Branch%roup scene = create0cene%raph(&'
// 0imp*exni.erse is a Con.enience
xti*it, c*ass
httpBOOtai1i'!ha3.&0-
51<
Lp trnh ha trn Java 2D v 3D
0imp*exni.erse simp*ex = new
0imp*exni.erse(can.asf)&'
// This wi** mo.e the ziew*atform bacW a
bit so the
// ob\ects in the scene can be .iewed.
simp*ex.getziewing*atform(&.set#omina*ziewingTra
nsform(&'
simp*ex.addBranch%raph(scene&'
2 // end of Twist0trip/pp constructor
// The fo**owing method a**ows this to be run
as an app*ication
public static void main(0tringKL args& Q
0,stem.out.print*n(^Twist0trip/pp X va.a
f) /{ .ersion O.O^&'
0,stem.out.print(^0ee }^%etting 0tarted
with the va.a f) /{}^^&'
0,stem.out.print*n(^ (section (.u&^&'
0,stem.out.print*n(^This program
demonstrates bacW face cu**ing.^&'
0,stem.out.print(^{n this program two
.isua* ob\ects rotate, ^&'
httpBOOtai1i'!ha3.&0-
51=
Lp trnh ha trn Java 2D v 3D
0,stem.out.print*n(^one wireframe and one
so*id surface.^&'
0,stem.out.print(^The wire frame is
.isib*e on*, when components^&'
0,stem.out.print*n(^ of the surface are
cu**ed.^&'
drame frame = new Maindrame(new
Twist0trip/pp(&, (5u, (5u&'
2 // end of main method of Twist0trip/pp
2 // end of c*ass Twist0trip/pp
Tr0ng hnh 2P25 viE& vj hiE! hxa &hn 1& @" -t r rDng i"n 3
v_ng @U v. >s3 giz th t]t &W &C& a giC& "! R& (`ng (_ hng !a3
&wa nx 1D g &hVng nZa.
httpBOOtai1i'!ha3.&0-
519
Lp trnh ha trn Java 2D v 3D
Phn -t phva tr& &wa -ut a giC& 1D -t (_ng T &C& nh ,!]t
hiEn th'0 &hi"! !a3 ngR& ;i- ng h. [i"! nD3 thzng 1iIn !an Jn
1!t ta3 phWi. L!t nD3 (_ng T ,C& Unh phn -t tr& &wa -ut (Wi
hnh h& f&hng hen (Wi ta- giC& h0& (Wi hnh v!jng tha3 thJ &h0 -\i
thDnh phn tr0ng (Wi. Knh 2P27 &h ra -ut vv (b *G (bng 1!t ta3 phWig
2.L '%9nds and @c%pe
Bound Unh nghha -ut ;hjng gian+ -ut v_ng &h0 -\i nt. Bounds
R& Unh nghha &C& Qi tRng nh >0!n(ing2ph'r'+ Boundin$Box+
Boundin$Po'tope. [T tiJp tb& vi vv (b Cnh *Cng + -\i ng!n *Cng Unh
nghha -ut v_ng Wnh hyng gi 1D v_ng @iIn gii !ct . SJ! @]t ; thDnh
phn nD0 &wa -ut Qi tRng !an *Ct gia0 vi 1!ng *Cng th Qi tRng *Y
@U Wnh hyng @yi 1!ng *Cng
Phn v" Bounds R& t y phn 1.9 -j tW -\i Qi tRng hDnh vi &x
-ut v_ng riIng. /ut hDnh vi &h R& ;v&h h0et ;hi @iIn gii &wa nx gia0
vi phn nhn.
2&0p' &h ra -ut nhx- &C& Qi tRng thU ;h!ng &Wnh @ng vU trv &wa
&hng tr0ng thU ;h!ng &Wnh. [& @iEt -ut 2&0p' 1D -ut tp &C& Qi
tRng )r0!p f&htng hen >ran&h)r0!pg. /ut n0(' &x thT &h ra &C& Qi
httpBOOtai1i'!ha3.&0-
520
Lp trnh ha trn Java 2D v 3D
tRng thU ;h!ng &Wnh ;hC& nha! ;hi &hng Wnh hyng @yi -ut t-
!an *Ct.
Tr0ng ;hi Bounds vD scope &!ng &]p &C& tvnh nVng ;hC& nha! nhng
&hng 1ai h0et ung th'0 nhZng &C&h ;hC& nha!. /ut v_ng @iIn gii u&
1p vi vU trv &wa -ut Qi tRng tr0ng thU ;h!ng &Wnh. Tr0ng ;hi x
-ut phe- vi u& 1p vi Qi tRng !an *Ct tr0ng -ji trzng W0.Chng
R& *G (bng tr0ng nhi"! ang (bng+ thI- vD0 x Cnh *Cng vD &C& hDnh vi
R& *G (bng+ nh *ng -_+ s- thanh *Y R& nxi phn *a! &wa &hng
nD3+ Qi vi &C& nt #1t'rnativ'#pp'aran&'.
%.?.( Bounds bode Co"ponents
/ut Qi tRng @iIn gii Bound R& tha- &hiJ! Jn @yi &C& Qi
tRng &n Unh nghha @iIn gii @iIn gii &h0 phcp ngzi 1p trnh a (eng
hxa &C& hDnh ung vD @" -t h0& s- thanh tr0ng -ut v!ng ]t W0.
Bound &ng &h0 phcp hE thjng (`ng hnh &wa Java 5D h0et ung hiE!
!W hn.
CC& v_ng @iIn gii R& Unh nghha @Vng -ut *Q 1p. Bound 1D 1p
trt! tRng 1D 1p & *y &h0 &C& 1p @iIn gii. [Qi tRng Bound Unh
nghha &C& v_ng 1i ;vn+ R& *G (bng tr0ng r]t nhi"! tng tC& vD &hn
1&+ 5 1p -y rung &wa nx 1D Boundin$Box+ Boundin$Po'tope+ vD
Boundin$Sphere
ihi 1`a &hn -ut Qi tRng Bound ;hjng phb th!u& vD0 &hi tiJt &wa
ang (bng+ nh rng nhZng h0et ung nh 1 ;hC& nha! tr0ng -ut @iIn
gii *Y R& tvnh t0Cn tr0ng v_ng gia0 nha!. Boundin$Sphere 1D (k nh]t
tr0ng ;hi x Boundin$Po'tope 1D ;hx nh]t. SJ! @en &x r]t nhi"! Qi
tRng Bound ang *G (bng+ nhZng h0et ung nh &ng &x thT thI- vD0
vD gs3 ra ;hC& @iEt r rDng Jn t0Dn @u hiE! nVng &wa ang (bng.
C!Qi &_ng phWi nh rng vi &C& v_ng @iIn gii nh th hDnh ung &Dng
vt+ vD nIn 1D- nh v3 ;hi te0 &C& v_ng @iIn gii.
httpBOOtai1i'!ha3.&0-
521
Lp trnh ha trn Java 2D v 3D
Bounds /ethod Su""ar' <partia ist=
Bounds 1D 1p trt! tRng+ (0 x &C& phng tha& 1iEt ;I (i s3 1D t]t
&W &C& phng tha& trt! tRng vD &b thT &wa Boundin$Box+
Boundin$Po'tope+ vD >0!n(ing2ph'r'
Bounds cosest.ntersection<Boundsvw ,oundsF,0ects=
T- Qi tRng tr0ng @iIn gii gn nh]t -D gia0 vi v_ng @iIn gii nD3.
void co",ine<Bounds ,oundsF,0ect=
iJt nQi Qi tRng @U @a0 nD3 vi Qi tRng @a0. Ta &x 2 phng tha& *a!.
,ooean exuas<0ava.an$.F,0ect Bounds=
Ch ra ;hi nD0 Qi tRng @a0 nD3 tng ng vi Qi tRng @a0 ;hC&.
,ooean intersect<Bounds ,oundsF,0ect=
iiT- tra *` gia0 nha! giZa &C& Qi tRng @a0.
,ooean is)"pt'<=
T'*t* ?h'th'r th' Bounds i* '-pt3.
iiT- tra ;hi nD0 &C& @iIn gii @a0 @U r\ng.
void set<Bounds ,oundsF,0ect=
Lp giC trU &h0 Qi tRng @a0.
void transfor"<Transfor"*& trans=
>iJn i Qi tRng R& @a0 (`a trIn -a trn a ra.
Boundin$Sphere
Boundin$Sphere Constructor Su""ar' <partia ist=
Boundin$Sphere<=
Te0 vD Unh giC trU &h0 -ut >0!n(ing2ph'r' vi @Cn ;vnh @ng 1 tei 0 0 0
Boundin$Sphere<Point*d center@ dou,e radius=
Te0 vD Unh giC trU &h0 -ut >0!n(ing2ph'r' vi @Cn ;vnh vD ts- &h0
tr&
httpBOOtai1i'!ha3.&0-
522
Lp trnh ha trn Java 2D v 3D
Boundin$Sphere<Bounds ,oundsF,0ect=
Te0 vD Unh giC trU &h0 -ut >0!n(ing2ph'r' tt Qi tRng &h0 tr&.
Boundin$Sphere<Boundsvw ,oundsF,0ects=
Te0 vD Unh giC trU &h0 -ut >0!n(ing2ph'r' tt -ut -Wng &C& Qi tRng
@a0
Boundin$Sphere /ethod Su""ar' <partia ist=
void setCenter<Point*d center=
Lp vU trv &wa v_ng @a0 &! tt -ut iT-
void set#adius<dou,e r=
Lp @Cn ;vnh &wa hnh &! @a0.
Boundin$Box
Boundin$Box Constructor Su""ar'
Lp nD3 Unh nghha -ut hnh hup @a0 thng trb& R& *G (!ng &h0 v_ng
@a0.
Boundin$Box<=
ThiJt 1p vD ;hyi te0 -ut hnh hup @a0 ;v&h th& 2 ts- y gQ&.
Boundin$Box<Point*d o1er@ Point*d upper=
ThiJt 1p vD ;hyi te0 -ut hnh hup @a0 @iJt tr& iT- th]p iT- &a0 trIn
,+3+ .
Boundin$Box<Bounds ,oundsF,0ect=
ThiJt 1p -ut hnh hup @a0 tt -ut hnh *n &x.
Boundin$Box<Boundsvw Bounds=
Lp -ut hnh hup @a0 vi -ut -Wng &C& Qi tRng @a0.
httpBOOtai1i'!ha3.&0-
525
Lp trnh ha trn Java 2D v 3D
Boundin$Box /ethod Su""ar' <partia ist=
void setLo1er<dou,e x"in@ dou,e '"in@ dou,e 4"in=
2't* th' 10?'r &0rn'r 06 thi* @0!n(ing Box.
Lp gx& (i &wa hnh hup @a0.
void setLo1er<Point*d p(=
Lp gx& (i &wa hnh hup @a0.
void set_pper<dou,e x"ax@ dou,e '"ax@ dou,e 4"ax=
Lp gx& trIn &wa hnh hup @a0.
void set_pper<Point*d p(=
Lp gx& trIn &wa hnh hup @a0.
Boundin$Po'tope
/ut Qi tRng Boundin$Po'tope Unh nghha -ut v_ng a (iEn *G
(bng phcp gia0 giZa 7 h0& hn -ut nGa ;hjng gian. /ut nGa ;hjng gian
1D -ut v_ng ;hjng gian @a0 !anh -ut -t !a -ut -t phng. iJt !W
1D Ung nghha Boundin$Po'tope (`a vD0 (anh *C&h &C& -t phng -D
te0 nIn -ut v_ng xng.
Boundin$Po'tope Constructor Su""ar'
Boundin$Po'tope<=
Te0 -ut Boundin$Po'tope Unh nghha nx (`a trIn tp : -t phng
giQng nh hnh 1p phng
P1 } ,+ 3+ } 1.
Boundin$Po'tope<Cector-dvw panes=
Te0 -ut Boundin$Po'tope *G (bng &C& -t &h0 tr&.
Boundin$Po'tope<Bounds ,oundsF,0ect=
Te0 -ut Boundin$Po'tope ng0ei tiJp -ut -t @a0 &h0 tr&.
Boundin$Po'tope<Boundsvw ,oundsF,0ects=
httpBOOtai1i'!ha3.&0-
527
Lp trnh ha trn Java 2D v 3D
Te0 -ut Boundin$Po'tope vs3 !anh -ut -Wng &C& @a0.
Boundin$Po'tope /ethod Su""ar' <partia ist=
int $etbu"Panes<=
TrW v" *Q -t phng &wa Qi tRng Boundin$Po'tope.
void $etPanes<Cector-dvw panes=
TrW v" gii hen &wa &C& -t phng &h0 @a0 a (iEn nD3.
void setPanes<Cector-dvw panes=
Lp &C& -t phng &h0 @a0 nD3.
%.?.% Boundin$Leafa bode
CC& @iEn gii @nh thzng *G (bng -ut Qi tRng @a0 T &h ra -ut
v_ng R& @a0 !anh. iJt !W tr0ng thU ;h!ng &Wnh 1D Qi tRng
Bound (i &h!3Tn vi Qi tRng tha- &hiJ! Jn nx. [i"! nD3 1D tQ &h0
nhi"! ang (bng t!3 nhiIn &x -ut vDi trzng hRp 1ei &n v_ng @a0 (i
&h!3Tn u& 1p vi Qi tRng *G (bng v_ng @a0
Xv (b nh nJ! -ut thJ gii@a0 g- ng!n *Cng &Q Unh &hiJ! *Cng
vD0 Qi tRng ang (i &h!3Tn th v_ng @iIn gii &wa Cnh *Cng phWi @a0
g- &W Qi tRng (i &h!3Tn. /ut &C&h T n^- @^t i"! nD3 1D 1D- &h0
v_ng @a0 rung w T &haa t]t &W nhZng ni -D Qi tRng (i &h!3Tn Jn.
[s3 ;hjng phWi 1D &s! trW 1zi tQt nh]t &h0 -i trzng hRp. /ut &C&h giWi
!3Jt tQt hn 1D *G (bng Boundin$Leafa. [t trIn thU ;h!ng &Wnh vi
Qi tRng !an *Ct Qi tRng Boundin$Leafa (i &h!3Tn vi Qi tRng
!an *Ct vD u& 1p vi ng!n *Cng. Knh 2P29 &h ra -ut thU ;h!ng
&Wnh vi -ut ng!n *Cng *G (bng Boundin$Leafa.
httpBOOtai1i'!ha3.&0-
529
Lp trnh ha trn Java 2D v 3D
ihi &C& ang (bng &h0 Boundin$Leafa @a0 g- !ppicationBounds
&wa Qi tRng Back$round+ Scheduin$Bounds &wa Behaviors+ vD
.nfuencin$Bounds &wa Li$hts+ ;hjng gs3 &W- giC& 1p 1ei thjng tin trIn
&W v_ng.
/ut tr0ng nhZng ang (bng ;hC ha3 &wa Qi tRng Boundin$Leafa 1D
t -ut Boundin$Leafa trIn vi'?P1at60r-. Boundin$Leafa nD3 &x thT
*G (bng 1iIn tb& trIn -ut v_ng @a0 &h0 &C& hDnh vi h0& 1!jn 1!jn &h]p
nhn &C& ang (bng @a0 nh n"n h0& *ng -_.Xv (b tr0ng 0en - 2P11
*G (bng ng!3In t^& x.
Ddng 2+5+7 te0 Qi tRng Boundin$Leafa+ vD Patfor"Geo"etr'+
ng thzi 1D- &h0 Qi tRng Boundin$Leafa try thDnh &0n &wa
Patfor"Geo"etr'. [Qi tRng Patfor"Geo"etr' R& thI- vD0
nhCnh hnh tha& &wa thU ;h!ng &Wnh y (dng :.
httpBOOtai1i'!ha3.&0-
52:
Lp trnh ha trn Java 2D v 3D
Boundin$Leafa Cass
CC& phi tha- *Q &wa hD- te0 &h0 Boundin$Leafa te0 -ut n vU
hnh &! @a0.
Boundin$Leafa Constructor Su""ar'
Th' Boundin$Leafa n0(' ('6in'* a @0!n(ing r'gi0n 0@N'&t that &an @'
r'6'r'n&'( @3 0th'r n0('* t0 ('6in' a r'gi0n 06 in61!'n&'+ an a&tivati0n
r'gi0n+ 0r a *&h'(!1ing r'gi0n.
St Boundin$Leafa (_ng T Unh nghha -ut Qi tRng v_ng @a0 &x thT
R& tha- &hiJ! Jn @ng &C& nt ;hC& nah! T Unh nghha -ut v_ng Wnh
hyng+ -ut v_ng ;v&h h0et h0& -ut v_ng (anh -b&.
Boundin$Leafa<=
Te0 -ut nt Boundin$Leafa vi -ut Qi tng n vU hnh &!
Boundin$Leafa<Bounds re$ion=
Te0 -ut nt Boundin$Leafa vi v_ng Unh tr&.
Boundin$Leafa /ethod Su""ar'
Bounds $et#e$ion<=
Sht v_ng Boundin$Leafa.
void set#e$ion<Bounds re$ion=
2't* thi* Boundin$Leafa n0('* @0!n(ing r'gi0n.
Lp v_ng @a0 &wa nt Boundin$Leafa.
%.?.* Scope
Sh gii thiE! y phva trIn+ Unh nghha -ut *&0p' ft- !an *Ctg 1D
-ut &C&h T gii hen ang (`ng ha3 Wnh hyng &wa -ut nt. St Unh
nghha -ut phe- vi !an *Ct &x thT Wnh hyng ti Qi tRng &wa &wa thU
&0n &x gQ& tei Qi tRng )r0!p. ihi ;hjng &x -ut phe- vi !an *Ct &h0
-ut nt ta gi nt x &x phe- vi !an *Ct t0Dn &!. [i"! x &x nghha 1D
httpBOOtai1i'!ha3.&0-
52<
Lp trnh ha trn Java 2D v 3D
nt x &x thT !an *Ct h0Dn t0Dn tr0ng -ji trzng W0 vD &h @U gii hen
@yi -ji trzng W0.
/ut vDi nt &h0 phcp &h ra &W v_ng @iIn gii vD phe- vi !an *Ct
nhng viE& &h Unh -ut phe- vi !an *Ct ;hjng thT tha3 thJ &h0 -ut
v_ng @iIn gii. [Qi vi -ut nt &x -ut hiE! ang trIn -ut Qi tRng Qi
tRng &n phWi &x &W @iIn gii 1n phe- vi !an *Ct. /ut nt ;hjng &x
phe- vU *Y ;hjng Wnh hyng R& &C& Qi tRng ;hC&.
/ut phe- vi !an *Ct (_ng T gii hen ang (bng &wa -ut nt ;hi *G
(bng -nh v_ng @a0 *Y r]t ;hx ;hVn h0& ;hjng thT 1D-. XiE& gi 1ei -ut
v_ng @a0 T ;hi -ut tha g x ang (`ng trIn thJ gii W0. Cx thT hiT! rng
;hi *G (bng -ut v_ng @a0 T phsn @iEt giZa &C& Qi tRng -D n- gn
nha! 1D r]t ;hx ;hVn. Th`& tJ+ &ng &x nhZng trzng hRp *G (bng R& .
SJ! 2 Qi tRng !an *Ct &he- h0& &hng 1In nha! vD -ut Qi tRng &x
thT @a0 g- v_ng @a0 h0& 1D Qi tRng ;ia. KiEn tRng nD3 ;hjng
thzng ,W3 ra nh vv (b (i s3.
/ut ;h!ng &Wnh &haa -ut ngn n vD -ut vDi Qi tRng !an *Ct
trIn @Dn. Sgn n &x -ut @xng+ v thJ ;hjng phWi t]t &W &C& Qi tRng *Y
R& &hiJ! *Cng @yi &hiJ& n nD3. SJ! &h *G (bng v_ng @a0 *Y r]t ;hx
T &h ra ang (bng Cnh *Cng ng ^n ;hi n t^t vD @t giZa &C& Qi
tRng gn nha!.
[Unh nghha phe- vi gii hen &h0 ng!n *Cng (k (Dng hn i"! ;hiTn Cnh
*Cng tr0ng ;h!ng &Wnh. [ thU ;h!ng &Wnh tr0ng hnh 2P2: 1D -ut giWi
phCp. [ thU nD3 &hia ra &C& Qi tRng R& &hiJ! *Cng vD ;hjng R&
&hiJ! *Cng thDnh 2 nhCnh &wa thU ;h!ng &Wnh. Ch Unh &C& nhx- R&
&hiJ! *Cng @a0 g- &W Qi tRng R& ri *Cn. Thzng th ;hjng &n
thiJt phWi t &ha& -ut thU ;h!ng &Wnh ,!ng !anh v_ng !an *Ct.
httpBOOtai1i'!ha3.&0-
52=
Lp trnh ha trn Java 2D v 3D
2.M Znh hc nTn" ca%
Java 5D #P$ phiIn @Wn 1.2 a ra 2 -y rung 1n Qi vi &C& 1p *G
(bng &C& hnh h&. Tha nh]t &h0 nhi"! hnh h& try thDnh &C& nt thDnh
phn &wa -ut nt Shape*&. Tvnh nVng nD3 &h0 phcp (`ng hnh hiE! !W
hn.
/ut tvnh nVng ;hC& 1D &h0 phcp (Z 1iE! hnh h& &x thT tha- &hiJ!
@ng Qi tRng hnh h& tha3 v phWi *a0 &hcp. XiE& *a0 &hcp (Z 1iE! &h
th`& hiEn tr0ng &C& phiIn @Wn tr& &wa 1.2 . XiE& *a0 &hcp (Z 1iE! 1D-
-]t thzi gian vD &jng *a&+ *G (bng viE& tha- &hiJ! tr`& tiJp tVng hiE!
!W nhi"! &hng trnh.
%.^.( /utipe Geo"etries in a Sin$e Shape*&
Chng 1 gii thiE! v" 1p Shape*& phn 2.2.1 gii thiE! Shape*&
vi Unh nghha &wa Qi tRng !an *Ct vD &h ra &C&h *G (bng & @Wn &wa
Qi tRng Shape*&. PhiIn @Wn 1.2 thI- r]t nhi"! phng tha& ti 1p
httpBOOtai1i'!ha3.&0-
529
Lp trnh ha trn Java 2D v 3D
Shape*& &h0 phcp Qi tRng Shape*& &x thT tha- &hiJ! Jn nhi"! Qi
tRng thDnh phn hnh h&. Tvnh nVng -i nD3 giW- thiT! *Q 1Rng Qi
tRng tr0ng thU ;h!ng &Wnh.
Tr0ng #,i*#pp.Nava gii thiE! tr0ng phn 2.9.1 *G (bng 5 Qi tRng
Lin'#rrat3 T vY &C& zng ei (iEn &h0 5 trb& ta u tr0ng ;hjng gian+
ng0Di ra tr0ng &hng trnh &x 5 Qi tRng Shape*& tng ng vi 5
Qi tRng hnh h&. T!3 nhiIn tr0ng vv (b #,i*#pp2.Nava &x *G (bng 1
Qi tRng Shape*&+ nx tha- &hiJ! Jn nhi"! Qi tRng thDnh phn hnh
h& ;hC&.r'- hnh 2P2<
Sh tr0ng 0en - 2P12 &x thT th]3 ta &h te0 -ut Qi tRng
Shape*& nhng &x thT tha- &hiJ! Jn 5 Qi tRng thDnh phn hnh h&.
Shape*& Geo"etr' )xuivaence Casses
St 1D Shape*& &haa -ut (anh *C&h 1 h0& nhi"! Qi tRng thDnh phn
hnh h& vD -ut Qi tRng thDnh phn gia0 (iEn. Danh *C&h Qi tRng
hnh h& &x thT tng ng vi &C& 1p vD &x &_ng ;iT! vi &C& 1p hnh
h& & @Wn. 2` &sn @ng thT hiEn i s3B
P0int Geo"etr'!rra'B $n(','(P0int#rra3
Lin' Geo"etr'!rra'B $n(','(Lin'#rra3+ Lin'2trip#rra3
P013g0n Geo"etr'!rra'B $n(','(Triang1'#rra3+ Triang1'2trip#rra3+
Triang1'8an#rra3+
F!a(#rra3
httpBOOtai1i'!ha3.&0-
550
Lp trnh ha trn Java 2D v 3D
Co"pressedGeo"etr'
Geo"etr'
Text*&
Xi *` hen &hJ &wa (anh *C&h Qi tRng Shape*& ti -ut 1p hnh h&
tng ng &h0 th]3 *` &Wi tiJn nD3 &x v ;hjng &x g 1D &Wi tiJn. /ut
1n nZa 5 Qi tRng 1in'#rra3 Unh nghha hnh &h0 h0& #,i*#pp &x thT
tha3 thJ @ng -ut Qi tRng vD -ut Qi tRng Shape*&.
Shape*& /ethod Su""ar' <partia ist@ see Section %.%.(=
void addGeo"etr'<Geo"etr' Geo"etr'= sne1 in (.%t
)^n Qi tRng hnh h& ti (anh *C&h &wa nt Shape*& g- &C& thDnh
phn hnh h&
0ava.uti.)nu"eration $et!Geo"etries<= sne1 in (.%t
TrW v" 1iEt ;I (anh *C&h &C& thDnh phn hnh h&.
Geo"etr' $etGeo"etr'<int index= sne1 in (.%t
L]3 &C& thDnh phn hnh h& tei vU trv in(', tr0ng (anh *C&h.
void insertGeo"etr'<Geo"etr' Geo"etr'@ int index= sne1 in (.%t
Chn thI- -ut thDnh phn hnh h& vD0 (anh *C&h tei vU &hv &h -b& &h0
tr&.
int nu"Geo"etries<= sne1 in (.%t
TrW v" *Q thDnh phn hnh h& tr0ng (anh *C&h.
void re"oveGeo"etr'<int index= sne1 in (.%t
L0ei @ thDnh phn hnh h& tei vU trv &h -b& &h0 tr& tr0ng (anh *C&h.
void set0eo#etr&<Geo"etr' Geo"etr'@ int index= sne1 in (.%t
Tha3 thJ thDnh phn hnh h& tei vU trv &h -b& &h0 tr& tr0ng (anh *C&h
vi -ut thDnh phn ;hC&.
httpBOOtai1i'!ha3.&0-
551
Lp trnh ha trn Java 2D v 3D
%.^.% Geo"etr'!rra'
Tr0ng viE& ,s3 (`ng hnh &C& @& 1D te0 -ut Qi tRng hnh h&+ ri
Vng ;v giC trU &h0 nx T Unh nghha (Z 1iE! hnh h& fte0 u+ -D! ...g .
Xi phiIn @Wn 1.2 &h0 phcp 1zi gi >|.%8%.%SC% tha3 thJ &h0 viE&
*a0 &hcp (Z 1iE! hnh h&. XiE& nD3 ;hi y phiIn @Wn & 1D Qi tRng *a0
&hcp Geo"etr'!rra' R& ;hyi te0 &x -ut -Wng privat' 1! giZ t0Dn @u
(Z 1iE! nD3 @In tr0ng Qi tRng Geo"etr'!rra'. 2a! x ;hi (Z 1iE! hnh
h& R& Vng ;v vi Geo"etr'!rra' nx R& *a0 &hcp vD0 -Wng nD3.
ihi Qi tRng Geo"etr'!rra' >|.%8%.%SC% R& te0 ngzi (_ng
te0 -ut -Wng hnh h& vD !Wn 1v -Wng nD3 vi (Z 1iE! hnh h&. XD v
thJ ;hjng &x -Wng @In tr0ng Qi tRng hnh h&.
X3 ;hi nD0 &n *G (bng >|.%8%.%SC%+ &x 2 1v (0 *G (bng nx 1DB
1. SJ! (Z 1iE! hnh h& 1D ung
2. SJ! (Z 1iE! hnh h& &n *G (bng nhi"! @u nh
Lv (0 1n nh]t T &hn phng phCp nD3 1D (Z 1iE! &x thT tha3 i
th- &hv Qi tRng ang *Qng h0& R& (U&h. CC&h tha3 i hnh &hvnh
1D tha3 Qi (Z 1iE! &wa nx+ &C&h ;hC& 1D phsn &hia -Wng *G (bng @yi Qi
tRng hnh h&.
ShZng gRi H vD &Wnh @C0 ;hi *G (bng >|.%8%.%SC%
SJ! *G (bng >|.%8%.%SC%+ *G (bng phng tha& setf(ef.loat 1D tQt
hn &W. Xv (b+ *G (bng set)oord(ef.loatfgtha3 v set)oord(ef3ffg*G
(bng -Wng *Q th`& &h0 phcp tr!3 &p tr`& tiJp hn 1D *G (bng -ut -Wng
&C& Qi tRng. /ut -Wng &C& Qi tRng tr0ng Java 5D 1!jn 1!jn 1! trZ
&C& tha- &hiJ! hn 1D giC trU th`& v &h &C& -Wng &x ;iT! (Z 1iE! nh
th`& -i 1! (Z 1iE!.
Sh rng ;hi *G (bng >|.%8%.%SC% phng tha& *G (bng ;hC& vi
;hi ;hjng *G (bng nx. Sgzi 1p trnh phWi &x trC&h nhiE- W- @W0 &h0
;iT! (Z 1iE! ng ^n*.
httpBOOtai1i'!ha3.&0-
552
Lp trnh ha trn Java 2D v 3D
Cm dS Geo"etr'!rra' Bnu#)+)#)bC)
2G (bng >|.%8%.%SC% Geo"etr' vi Geo"etr'!rra' &h0 Qi
tRng hnh h& thnh ;hjng ;hx hn *a0 &hcp Geo"etr'. Tr0ng 0en -a
2P15 R& 1]3 tt &hng trnh T?i*t>3.'6#pp.Nava+ *G (bng tha- &hiJ!
Jn (Z 1iE! hnh h& tha3 v &C&h &+ tr0ng trzng hRp nD3 te0 u vD -D!
R& ngzi (_ng te0 thDnh 2 -Wng &00r( vD &010r.
XiE& (_ng R& th`& hiEn th'0 &C& @& *a!L
ihai @C0 -Wng T giZ &C& (Z 1iE! hnh h&
Te0 Qi tRng Geo"etr'!rra' -0ng -!Qn @ng t_3 &hn Unh
(eng nh >|.%8%.%SC%. Tr0ng trzng hRp nD3 Qi tRng
Geo"etr'!rra' 1D -ut -Wng Triang1'2trip#rra3.
[i"n 3 giC trU &h0 -Wng Triang1'2trip#rra3
Tha- &hiJ! Jn (Z1iE! ngzi (_ng vi Qi tRng Geo"etr'!rra'.
Tha t` &wa &C& @& &x thT tha3 i ;hi -Wng *G (bng R& ;hai @C0
tr& ;hi &hng R& tha- &hiJ! h0& i"n giC trU vD Qi tRng
Geo"etr'!rra' R& te0 tr& ;hi -Wng R& tha- &hiJ!.
// //////////////////////////////////////////
/////
//
// create scene graph branch group
//
public Branch%roup create0cene%raph(& Q
Branch%roup content$oot = new
Branch%roup(&'
httpBOOtai1i'!ha3.&0-
555
Lp trnh ha trn Java 2D v 3D
// Create the transform group node and
initia*ize it to the
// identit,. /dd it to the root of the
subgraph.
Transform%roup ob\0pin = new
Transform%roup(&'
ob\0pin.setCapabi*it,(Transform%roup.ALLOW_TRANSF
ORM_WRITE&'
content$oot.addChi*d(ob\0pin&'
0hapef) twist = new Twist(&'
ob\0pin.addChi*d(twist&'
// )up*icate the twist strip geometr, and
set the
// appearance of the new 0hapef) ob\ect
to *ine mode
// without cu**ing.
// /dd the -NY%-#"d{NN!) and
-NY%-#"N{#! strips
// in the scene graph at the same point.
// This wi** show the triang*es of the
origina* Mobius strip that
// are c*ipped. The o*,gon-ffset is set
to pre.ent stitching.
o*,gon/ttributes po*,/ttrib = new
o*,gon/ttributes(&'
httpBOOtai1i'!ha3.&0-
557
Lp trnh ha trn Java 2D v 3D
po*,/ttrib.setCu**dace(o*,gon/ttributes.!%LL_NON
E&'
po*,/ttrib.seto*,gonMode(o*,gon/ttributes.POL&'
ON_LINE&'
po*,/ttrib.seto*,gon-ffset(+.++Of&'
/ppearance po*,/ppear = new /ppearance(&'
po*,/ppear.seto*,gon/ttributes(po*,/ttrib&'
ob\0pin.addChi*d(new
0hapef)(twist.get%eometr,(&, po*,/ppear&&'
/*pha rotation/*pha = new /*pha(XO,
Ou+++&'
$otation{nterpo*ator rotator = new
$otation{nterpo*ator(rotation/*pha,
ob\0pin&'
// a bounding sphere specifies a region a
beha.ior is acti.e
// create a sphere centered at the origin
with radius of O
Bounding0phere bounds = new
Bounding0phere(&'
rotator.set0chedu*ingBounds(bounds&'
ob\0pin.addChi*d(rotator&'
httpBOOtai1i'!ha3.&0-
559
Lp trnh ha trn Java 2D v 3D
// maWe bacWground white
BacWground bacWground = new
BacWground(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(bounds&'
content$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on
this scene graph.
content$oot.compi*e(&'
return content$oot'
2 // end of Create0cene%raph method of
Twist0trip/pp
Geo"etr'!rra'
Lp Geo"etr'!rra' 1D 1p & *y &wa nhi"! 1p hnh h& ;hC&. X thJ
nx Unh nghha r]t nhi"! phng tha& &h0 viE& !Wn 1v (Z 1iE!.[T *G (bng
tha- &hiJ! hnh h&+1p @it >|.%8%.%SC% tr0ng trzng Unh (eng
nh tr0ng hD- te0 &wa Qi tRng Geo"etr'!rra'.
Geo"etr'!rra' /ethods for #eferencin$ Geo"etr' &ata <partia
ist=
Thi* &011'&ti0n 06 -'th0(* *'t th' r'6'r'n&'* t0 Geo"etr' (ata in !*'r
arra3*. $n 'a&h &a*'+ th' -'th0( ?i11 thr0? an ',&'pti0n i6 th' (ata -0('
60r thi* Geo"etr' arra3 0@N'&t i* n0t >|.%8%.%SC%. $n *0-' &a*'*
th' (ata -0(' -!*t a1*0 @' $ST%.L%#X%D+ in 0th'r &a*'* th' (ata
-0(' -!*t n0t @' $ST%.L%#X%D.
[s3 1D &C& phng tha& (_ng T tha- &hiJ! Jn (Z 1iE! hnh h& trIn
-Wng *G (bng. Tr0ng -\i trzng hRp phng tha& *Y a ra ng0ei 1E nJ!
httpBOOtai1i'!ha3.&0-
55:
Lp trnh ha trn Java 2D v 3D
&hJ u (Z 1iE! ;hjng &hn 1D >|.%8%.%SC%+ tr0ng -ut *Q trzng hRp
&hJ u (Z 1iE! &x thT 1D $ST%.L%#X%D+ tr0ng -ut *Q trzng hRp ;hjng
R& phcp 1D $ST%.L%#X%D.
void setCoor#efp<Coorpvw coors= sne1 in (.%t
2't* th' &010r arra3 r'6'r'n&' t0 th' *p'&i6i'( C010r fC010r5@+ C010r56+
C010r7@+ 0r C010r76g arra3.
void setCoor#efB'te<,'tevw coors= sne1 in (.%t
2't* th' @3t' &010r arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setCoor#ef+oat<foatvw coors= sne1 in (.%t
2't* th' 610at &010r arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setCoord#efp<Pointpvw coords= sne1 in (.%t
2't* th' &00r(inat' arra3 r'6'r'n&' t0 th' *p'&i6i'( Pointp fP0int5(+
P0int56g arra3.
void setCoord#ef&ou,e<dou,evw coords= sne1 in (.%t
2't* th' (0!@1' &00r(inat' arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setCoord#ef+oat<foatvw coords= sne1 in (.%t
2't* th' 610at &00r(inat' arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void set.ntereavedCertices<foatvw vertex&ata= sne1 in (.%t
2't* th' int'r1'av'( v'rti&'* arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setbor"a#ef*f<Cector*fvw nor"as= sne1 in (.%t
2't* th' X'&t0r56 n0r-a1 arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setbor"a#ef+oat<foatvw nor"as= sne1 in (.%t
2't* th' 610at n0r-a1 arra3 r'6'r'n&' t0 th' *p'&i6i'( arra3.
void setTexCoord#efp<int texCoordSet@ TexCoordpvw texCoords=
sne1 in (.%t
2't* th' t',t!r' &00r(inat' arra3 r'6'r'n&' 60r th' *p'&i6i'( t',t!r'
&00r(inat' *'t t0 th' *p'&i6i'(
T',C00r( fT',C00r(26+ T',C00r(56g arra3.
httpBOOtai1i'!ha3.&0-
55<
Lp trnh ha trn Java 2D v 3D
void setTexCoord#ef+oat<int texCoordSet@ foatvw texCoords= sne1
in (.%t
2't* th' 610at t',t!r' &00r(inat' arra3 r'6'r'n&' 60r th' *p'&i6i'( t',t!r'
&00r(inat' *'t t0 th' *p'&i6i'( arra3.
/ut &C&h n giWn T tha3 i hnh h& *G (bng >|.%8%.%SC% 1D
tha3 Qi *Q giC trU *G (bng tr0ng -ut -Wng. Di s3 1D &C& phng tha&
T tha3 Qi giC trU (Z 1iE! hnh h&. T]t nhiIn nx &h &x tC& (bng nJ! &hJ
u >|.%8%.%SC%. CC& phng tha& nD3 &h R& &h0 phcp h0et
ung trIn &C& Qi tRng ang *Qng h0& ang (U&h ;hi ;hW nVng
#LLML.%8D#T#L.$T% R& 1p.
Geo"etr'!rra' /ethods for Settin$ .nitia Location of #eferenced
Geo"etr' &ata <partia ist=
void set.nitiaCoor.ndex<int initiaCoor.ndex= sne1 in (.%t
2't* th' initia1 &010r in(', 60r thi* Geo"etr'!rra' 0@N'&t. Thi* -'th0(
i* 'a*i13 &0n6!*'( ?ith th'
*'t$nitia1X'tr',$n(', -'th0( ?hi&h i* !*'( ?h'n th' Geo"etr' i* n0t
>|.%8%.%SC%.
void set.nitiaCoord.ndex<int initiaCoord.ndex= sne1 in (.%t
2't* th' initia1 &00r(inat' in(', 60r thi* Geo"etr'!rra' 0@N'&t.
void set.nitiabor"a.ndex<int initiabor"a.ndex= sne1 in (.%t
2't* th' initia1 n0r-a1 in(', 60r thi* Geo"etr'!rra' 0@N'&t.
void set.nitiaTexCoord.ndex<int texCoordSet@ sne1 in (.%t
int initiaTexCoord.ndex=
2't* th' initia1 t',t!r' &00r(inat' in(', 60r th' *p'&i6i'( t',t!r'
&00r(inat' *'t 60r thi* Geo"etr'!rra' 0@N'&t.
httpBOOtai1i'!ha3.&0-
55=
Lp trnh ha trn Java 2D v 3D
Geo"etr'!rra' Capa,iites
Bnu#)+)#)bC) sne1 in (.%t
2p'&i6i'* th' p0*iti0n+ &010r+ n0r-a1+ an( t',t!r' &00r(inat' (ata 60r thi*
0@N'&t ar' a&&'**'( @3 r'6'r'n&'
.bT)#L)!C)& sne1 in (.%t
2p'&i6i'* that th' p0*iti0n+ &010r+ n0r-a1+ an( t',t!r' &00r(inat' (ata 60r
thi* Geo"etr'!rra' ar'
a&&'**'( via a *ing1' int'r1'av'(+ 610atingPp0int arra3 r'6'r'n&'. Thi* i*
0n13 !*'( in @3Pr'6'r'n&'
Geo"etr' -0('.
!LLFAuCF_bTu#)!& y A#.T) sne1 in (.%t
a110? ?rit' a&&'** t0 th' &0!nt 0r initia1 in(', in60r-ati0n 60r thi* 0@N'&t
!LLFAu#)+u&!T!u#)!& sne1 in (.%t
a110? r'a( a&&'** t0 th' Geo"etr' (ata r'6'r'n&' in60r-ati0n 0n13 !*'(
in @3Pr'6'r'n&' Geo"etr' -0('
!LLFAu#)+u&!T!uA#.T) sne1 in (.%t
a110? ?rit' a&&'** t0 th' Geo"etr' (ata r'6'r'n&' in60r-ati0n 60r thi*
0@N'&t. $t a1*0 'na@1'* ?riting th' r'6'r'n&'( (ata it*'16+ via th'
Geo"etr'4p(at'r int'r6a&'. Thi* i* 0n13 !*'( in @3Pr'6'r'n&' Geo"etr'
-0('.
DZ 1iE! hnh h& tr0ng @]t &a -Wng nD0 R& tha- &hiJ! Jn @yi -ut
Qi tRng Geo"etr'!rra' *Qng h0& ang R& (U&h &x thT tha3 i
thjng !a phng tha& !p(at'Data &wa nx. CC& ang (bng "! phWi !an
ts- trCnh T vi phe- 1!t nD3.
httpBOOtai1i'!ha3.&0-
559
Lp trnh ha trn Java 2D v 3D
update&ata "ethod of Geo"etr'!rra'
pu,ic void update&ata<Geo"etr'_pdater updater= sne1 in (.%t
Cp nht -Wng (Z 1iE! R& tr!3 &p thjng !a tha- &hiJ!. Phng tha&
gi !p(at'Data &wa Qi tRng Geo"etr'4p(at'r T ng @u &p nht vi
(Z 1iE! nh R& tha- &hiJ! @yi Qi tRng Geo"etr'!rra'.
%.^.- !ternate!ppearance sne1 in (.%t
Sh th]3 tr0ng phn 2.:.1 Qi tRng Shape*& &x thT &x -ut tha-
&hiJ! Jn nt thDnh phDnh !ppearance. )xi gia0 (iEn nD3 Unh nghha &C&
th!u& tvnh !an *Ct &wa Qi tRng Shape*&. r'- hnh 2P20 vD 2P5<.
Phn 2.:.2 -j tW 1D- thJ nD0 &x thT &hia * -ut gxi gia0 (iEn giZa &C& Qi
tRng Shape*&.
/ut !ternate!ppearance &h0 phcp ngzi phCt triTn ang (bng &x
thT phCt triTn &C& phng tha& tha3 thJ &h0 viE& &hia * -ut gxi gia0 (iEn
giZa &C& Qi tRng Shape*&. Sx 1D -ut &C&h tha3 thJ &h0 viE& &hia * gxi
gia0 (iEn a ra &C&h (k (Dng hn T te- thzi tha3 i gia0 (iEn. Cx 5
&C&h. Tha nh]t Qi tRng phWi n- trIn trIn v_ng @a0 &wa
!ternate!ppearance. Tha 2 phWi &x -ut gii hen !an *Ct trIn ang
(bng &wa nx. Tha 5 &h nhZng Qi tRng !an *Ct &h0 phcp gia0 (iEn &wa
nx R& ghi " a ra &h0 !ternate!ppearance
Sz dSn$ !ternative!ppearance bode
[T *G (bng !ternate!ppearance ! tiEn phWi te0 gxi gia0 (iEn T
*G (bng phcp tha3 thJ vD tha- &hiJ! Jn gxi gia0 (iEn @ng Qi tRng
#1t'rnativ'#pp'aran&'. 2a! *0 1p v_ng Wnh hyng thjng !a Qi tRng
Bounds h0& Boundin$Leafa. Te0 -ut phe- vi !an *Ct &h0
!ternate!ppearance th'0 H -nh. [tng !In thI-
!ternate!ppearance vD0 thU ;h!ng &Wnh+ 1p &z
app'aran&'Mv'rri('%na@1' trIn Qi tRng Shape*&.
httpBOOtai1i'!ha3.&0-
570
Lp trnh ha trn Java 2D v 3D
Shape*& set!ppearanceFverride)na,e<= /ethod
void set!ppearanceFverride)na,e<,ooean fa$= sne1 in (.%t
Lp &z &h ra ;hi nD0 -ut gia0 (iEn &wa -ut nt R& ghi @ng -ut nt
#1t'rnativ'#pp'aran&'. Phng tha& nD3 &x thT gi ;hi Qi tRng ang
*Qng h0& (U&h t_3 th'0 ;hW nVng nx R& 1p thJ nD0.
Shape*& Capa,iities <partia ist@ see Section %.%.(=
!LLFAu!PP)!#!bC)uFC)##.&)u#)!& y A#.T) sne1 in
(.%t
&h0 phcp tr!3 &p &Oghi ti &z app'aran&'Mv'rri('%na@1'
!ternative!ppearance Cass sne1 in (.%t
CC& phn (i 1D (anh *C&h hD- ta0 &h0 1p !ternate!ppearance
!ternate!ppearance Constructor Su""ar'
!ternate!ppearance<= sne1 in (.%t
ihyi te0 -ut nt !ternate!ppearance vi &C& tha- *Q -& UnhB
!ppearance+ *&0p'+
in61!'n&ing>0!n(*+ vD in61!'n&ing>0!n(ingL'a6 n!11
!ternate!ppearance<!ppearance !ppearance= sne1 in (.%t
Te0 -ut nt !ternate!ppearance vi gia0 (iEn &h0 tr&.
!ternate!ppearance /ethod Su""ar' <partia ist=
void addScope<Group scope= sne1 in (.%t
)^n -ut nt )r0!p &h0 tr& ti (anh *C&h nt !ternate!ppearance
&wa phe- vi !an *Ct.
httpBOOtai1i'!ha3.&0-
571
Lp trnh ha trn Java 2D v 3D
0ava.uti.)nu"eration $et!Scopes<= sne1 in (.%t
TrW v" @Wng 1iEt ;I (anh *C&h nt !ternate!ppearance &wa phe- vi
!an *Ct.
void insertScope<Group scope@ int index= sne1 in (.%t
Chn vD0 -ut nt )r0!p &h0 tr& vD0 (anh *C&h tei &h *Q &h0 tr&.
int nu"Scopes<= sne1 in (.%t
TrW v" *Q nt tr0ng (anh *C&h.
void re"oveScope<int index= sne1 in (.%t
L0ei @ nt tei vU trv &h0 tr& tr0ng (anh *C&h.
void set!ppearance<!ppearance !ppearance= sne1 in (.%t
Lp gia0 (iEn &h0 nt !ternate!ppearance
void set.nfuencin$Boundin$Leaf<Boundin$Leafa re$ion= sne1 in
(.%t
2't* th' !ternate!ppearance* in61!'n&ing r'gi0n t0 th' *p'&i6i'(
@0!n(ing 1'a6.
Lp v_ng Wnh hyng &wa !ternate!ppearance ti 1C @a0 &h0 tr&.
void set.nfuencin$Bounds<Bounds re$ion= sne1 in (.%t
Lp v_ng Wnh hyng &wa !ternate!ppearance ti v_ng @a0 &h0 tr&.
void setScope<Group scope@ int index= sne1 in (.%t
Tha3 thJ vU trv &wa nt tei vU trv &h -b& tr0ng (anh *C&h vi -ut nt
)r0!p &h0 tr&.
ShZng ;hW nVng &wa 1p !ternate!ppearance
!ternative!ppearance Capa,iities
!LLFAu!PP)!#!bC)u#)!& y A#.T) a110? r'a( f?rit'g a&&'**
t0 it* !ppearance in60r-ati0n
!LLFAu.b+L_)bC.bGuBF_b&Su#)!& y A#.T) a110? r'a(
f?rit'g a&&'** t0 it* in61!'n&ing Bounds an( @0!n(ing 1'a6 in60r-ati0n
httpBOOtai1i'!ha3.&0-
572
Lp trnh ha trn Java 2D v 3D
!LLFAuSCFP)u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
*&0p' in60r-ati0n at r!nti-'
2.a *&ippin" e *Pt 5n
Chw " &wa C1ipping ;hjng th`& *` 1D viE& te0 hnh nhng -ut tr0ng
nhZng nhsn tQ Wnh hyng Jn hnh Wnh tr0ng nh thJ nD0. Xv (b ;hi -jt
hnh -y rung Jn v_ng @iIn nIn nx @U &^t i v thJ -ut *Q hnh ;hjng
,'- R&. C^t ,cn 1D -ut &hw " pha& tep+ phn nD3 a ra &C& v]n " &
@Wn nh]t tr0ng viE& &^t hnh .
%.i.( Cie1 &efines a +rustu"
Tr0ng &hng 1 gii thiE! v" hE ta u W0 vD -j tW vU trv &wa -^t 1iIn
!an Jn nx. Tr0ng -ut *Q trzng hRp @en *Y @^t gp h0Dn &Wnh -D -ut
Qi tRng !an *Ct ;hjng R& (`ng hnh. Lv (0 th &x r]t nhi"!+ ng0Di
Qi tRng &x thT n- ng0Di v_ng frustu" <hUnh cSt=. X_ng nD3 1D ni
Qi tRng !an *Ct vD &C& phn &wa Qi tRng !an *Ct ;hC& R& hiTn thU.
Knh 2P29 *Y a ra &h0 @en Unh nghha r hn v" v_ng 6r!*t!-.
Ch H rng -t phng &^t phva tr&f6r0nt &1ipping p1an'g n- ng
*a! -Dn Wnhfi-ag' p1at'g. [i"! nD3 1D ;hjng hRp 1E nhng nx &ng
;hjng R& ;h!3Jn ;hv&h.
httpBOOtai1i'!ha3.&0-
575
Lp trnh ha trn Java 2D v 3D
Phn &hxp &bt nD3 R& Unh nghha thjng vU trv -^t nhn vD 2 -t
phng &^t tr& vD *a!. )iC trU -t Unh tng Qi hRp 1v t!3 nhiIn ngzi
1p trnh &x thT tha3 i ;h0Wng &C&h nD3.
SIn T
f@a&; &1ip (i*tan&'g O f6r0nt &1ip (i*tan&'g } 5000.
T!3 nhiIn th`& thJ t 1E nD3 thzng 1D tt 100 Jn 1000 1D hRp 1v nh]t.
Cie1 /ethods for !d0ustin$ the +rustu" <partia ist=
[Qi tng Xi'? tr0ng phn thU hnh tha& &wa thU ;h!ng &Wnh Java
5D Unh nghha r]t nhi"! tha- *Q v" hnh Wnh. Di s3 1D -ut tr0ng *Q
x.
void setBackCip&istance<dou,e distance=
Lp ;h0Wng &C&h -t &^t *a! vi -j hnh !an *Ct+ ;h0Wng &C&h nD3 phWi
1n hn vi ;h0Wng &C&h &wa -t tr&.
void set+rontCip&istance<dou,e distance=
Lp ;h0Wng &C&h -t &^t tr& vi -j hnh !an *Ct+ ;h0Wng &C&h nD3
phWi 1n hn 0.0 vD nh hn ;h0Wng &C&h *a!.
void set+iedFfCie1<dou,e fiedFfCie1=
Lp trzng ngang -j hnh !an *Ct (eng ra(ian*.
httpBOOtai1i'!ha3.&0-
577
Lp trnh ha trn Java 2D v 3D
%.i.% Cip bode
Sh nxi y phva trIn ;h0Wng &C&h &wa hnh &hxp &bt &x thT tha3 i.
St &^t 1D -ut Qi tRng th`& hiEn i"! nD3. /\i C1ip Unh nghha -ut
v_ng ang (bng &h ra -ut Qi tRng v_ng @a0 h0& 1C @a0. ihi v_ng @a0
nD3 gia0 vi ;h! v`& !an *Ct .;h0Wng &C&h -t *a! &wa Qi tRng C1ip
R& *G (bng T (`ng. -t tr& Unh nghha @yi Qi tRng Xi'? ;hjng
Wnh hyng.
XiE& *G (bng C1ip 1D- tVng tQ& u ,G 1v & @iEt tr0ng nhZng ;h!ng
&Wnh pha& tep.
Di s3 1D (anh *C&h &C& hD- te0 vD phng tha&B
Cip Constructor Su""ar'
Cip<=
Te0 -ut C1ip S0(' vi tha- *Q -& Unh B @a&;Di*tan&' 100+
!ppicationBounds vD app1i&ati0n>0!n(ingL'a6 n!11
Cip<dou,e ,ack&istance=
Te0 -ut C1ip n0(' vi tha- *Q ,ack&istance
Cip /ethod Su""ar'
void set!ppicationBoundin$Leaf<Boundin$Leafa re$ion=
Lp v_ng ang (bng &^t ti Qi tRng @a0 1C.
void set!ppicationBounds<Bounds re$ion=
Lp v_ng ang (bng &^t ti Qi tRng @a0.
void setBack&istance<dou,e ,ack&istance=
Lp ;h0Wng &C&h *a! vi giC trU &h0 tr&.
httpBOOtai1i'!ha3.&0-
579
Lp trnh ha trn Java 2D v 3D
Cip +ied Su""ar'
!LLFAu!PPL.C!T.FbuBF_b&Su#)!& y A#.T) a110? r'a(
f?rit'g a&&'** t0 it* app1i&ati0n Bounds an( @0!n(ing 1'a6 at r!nti-'.
!LLFAuB!C8u&.ST!bC)u#)!& y A#.T) a110? r'a( f?rit'g
a&&'** t0 it* @a&; (i*tan&' at r!nti-'.
St /0('1C1ip &x thT &^t Qi tRng !an *Ct ra th'0 nhi"! &C&h. /ut
Qi tRng /0('1C1ip Unh nghha -ut tp : -t &^t vi hng t_3 H tr0ng
hE ta u & @Wn. /t &^t Unh nghha -ut nGa ;hjng gian &h0 nhZng nh
R& 1`a &hn T (`ng. ihi giZa &C& nGa -t &^t &x gia0 nha! &hng
Unh nghha -ut v_ng -D &C& iT- tr0ng x ;hjng R& (`ng+ (_ &hng y
tr0ng hnh &hxp &bt nhn th]3. nh hyng nD3 &wa nt /0('1C1ip R&
i"! ;hiTn thjng !a &C& v_ng R& -j tW tr& (`a trIn Wnh hyng vD
t- !an *Ct.
%.i.- /odeCip )xa"pe
CC& @& *G (bng /0('1C1ip
ThiJt 1p v_ng Wnh hyng &h0 Qi tRng /0('1C1ip
Chn h0& @ &hn &C& -t &^t t_3 th'0 H -nh
Lp hng vD vU trv &h0 -t phng T *G (bng.
ThI- Qi tRng /0('1C1ip vD0 thU ;h!ng &Wnh
/& (_ ;hjng th`& hiEn tr0ng vv (b nD3 nhng /0('1C1ip &x thT Unh
nghha -ut phe- vi !an *Ct.
httpBOOtai1i'!ha3.&0-
57:
Lp trnh ha trn Java 2D v 3D
Sh rng 1!jn 1!jn &x : -t phng tr0ng Qi tRng /0('1C1ip. iJt
!W 1D -Wng X'rt0r7( R& *G (bng tr0ng hD- te0 phWi &x ;i&h th& :.
/odeCip Constructor Su""ar'
/odeCip<= sne1 in (.%t
Te0 -ut nt /0('1C1ip vi tha- *Q -& Unh.
/odeCip<Cector-dvw panes= sne1 in (.%t
Te0 -ut nt /0('1C1ip vi -t &h0 tr&.
/odeCip<Cector-dvw panes@ ,ooeanvw ena,es= sne1 in (.%t
Te0 -ut nt /0('1C1ip vi -t &h0 tr& vD &x thiJt 1p &C& &z.
/odeCip /ethod Su""ar' <partia ist=
void addScope<Group scope= sne1 in (.%t
#pp'n(* th' *p'&i6i'( )r0!p n0(' t0 thi* /0('1C1ip n0('* 1i*t 06 *&0p'*.
void insertScope<Group scope@ int index= sne1 in (.%t
$n*'rt* th' *p'&i6i'( )r0!p n0(' int0 thi* /0('1C1ip n0('* 1i*t 06 *&0p'*
at th' *p'&i6i'( in(',.
int nu"Scopes<= sne1 in (.%t
.'t!rn* th' n!-@'r 06 n0('* in thi* /0('1C1ip n0('* 1i*t 06 *&0p'*.
void re"oveScope<int index= sne1 in (.%t
httpBOOtai1i'!ha3.&0-
57<
Lp trnh ha trn Java 2D v 3D
.'-0v'* th' n0(' at th' *p'&i6i'( in(', 6r0- thi* /0('1C1ip n0('* 1i*t
06 *&0p'*.
void set)na,e<int panebu"@ ,ooean ena,e= sne1 in (.%t
2't* th' *p'&i6i'( 'na@1' 61ag 06 thi* /0('1C1ip n0('.
void set)na,es<,ooeanvw ena,es= sne1 in (.%t
2't* th' p'rPp1an' 'na@1' 61ag* 06 thi* /0('1C1ip n0(' t0 th' *p'&i6i'(
va1!'*.
void set.nfuencin$Boundin$Leaf<Boundin$Leafa re$ion= sne1 in
(.%t
2't th' /0('1C1ip n0('* in61!'n&ing r'gi0n t0 th' *p'&i6i'( @0!n(ing
1'a6.
void set.nfuencin$Bounds<Bounds re$ion= sne1 in (.%t
2't th' /0('1C1ip n0('* in61!'n&ing r'gi0n t0 th' *p'&i6i'( Bounds.
void setPane<int panebu"@ Cector-d pane= sne1 in (.%t
2't* th' *p'&i6i'( &1ipping p1an' 06 thi* /0('1C1ip n0('.
void setPanes<Cector-dvw panes= sne1 in (.%t
2't* th' &1ipping p1an'* 06 thi* /0('1C1ip n0(' t0 th' *p'&i6i'( p1an'*.
void setScope<Group scope@ int index= sne1 in (.%t
.'p1a&'* th' n0(' at th' *p'&i6i'( in(', in thi* /0('1C1ip n0('* 1i*t 06
*&0p'* ?ith th' *p'&i6i'( )r0!p
n0('.
/odeCip +ied Su""ar'
!LLFAu)b!BL)u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
'na@1' 61ag* at r!nti-'
!LLFAu.b+L_)bC.bGuBF_b&Su#)!& y A#.T) a110? r'a(
f?rit'g a&&'** t0 it* in61!'n&ing Bounds an( @0!n(ing 1'a6 at r!nti-'
httpBOOtai1i'!ha3.&0-
57=
Lp trnh ha trn Java 2D v 3D
!LLFAuPL!b)u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
p1an'* at r!nti-'
!LLFAuSCFP)u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
*&0p' in60r-ati0n at
r!nti-'
httpBOOtai1i'!ha3.&0-
579
Lp trnh ha trn Java 2D v 3D
C*ABCG "
TTU CVI DWCG
<.1 BVi d9n" chXnh
Tr0ng &C& &hng tr& &hng ta t- hiT! &C&h te0 ra nhZng Qi
tRng tr`& !an @ng &C& phng phCp n giWn. >ng &C& phng
phCp nD3 &jng viE& 1p trnh tr nIn @!Qn t. Tr0ng &hng nD3 &hng
ta *Y ,'- ,ct -ut ph0ng phCp ;hC& T te0 ra &C& Qi tRng tr`& !an.
Tr0ng -b& 5.2 *Y gii thiE! 1p Geo"etr'.nfo+ 1p tiEn v&h nD3 &!ng
&]p ;hW nVng t` ung hxa tr0ng viE& te0 ra &C& Qi tRng tr`& !an.
Lp Geo"etr'.nfo &ng vi &C& 1p Trian$uator+ Stripifier+ vD
bor"aGeneration &h0 ph'p ta te0 ra &C Qi tRng tr`& !an nh 1D
&C& a giC& hnh h&. CC& 1p nD3 &h!3Tn i a giC& thDnh ta- giC&+
vD tinh &hnh &C& a giC& nD3.
/b& 5.5 gii thiE! 1p L0a('r. Lp nD3 &x ;hW nVng te0 ra &C& (Qi
tRng tr`& !an Java5D tt &C& tEp R& te0 @yi &C& phn -"- 5D. Cb
thT 1p L0a('r &x thT & &C& 6i1' X./L+ Light?av'+ #!t0Ca( vD &C&
Unh (eng 6i1' 5D ;hC&/ut & iT- !an trng 1D ta &x thT viJt &C&
1p L0a('r riIng T phb& vb &h0 nh! &! *G (bng.
httpBOOtai1i'!ha3.&0-
590
Lp trnh ha trn Java 2D v 3D
CC& -b& tiJp th'0 &hng ta *Y ,'- ,ct &C& ; th!t ;hyi te0 nui (!ng.
*.(.( Geo"etr'.nfo
Thjng thzng T vY -ut hnh -ut Qi tRng hnh h& @]t ;+ &hng ta
phWi t` 1D- h0Dn t0Dn vD viE& &0(' *Y r]t v]t vW vD nhD- &hCn. 2G
(bng 1p Geo"etr'.nfo &jng viE& *Y try n'n (k (Dng vD th!n tiIn
hn. ihi @^t ! vY -ut Qi tRng hnh h&+ &hng ta *Y ,C& Unh -ut
a giC& @]t ; ph_ hRp vi (Qi tRng x. [a giC& nD3 &x thT 1D a giC&
1-+ ;hjng phng [Qi tRng Geo"etr'.nfo vD &C& 1p ;hC& *Y
&h!3Tn &C& a giC& nD3 thDnh &C& ta- giC& nh hn+ tt x Java5D &x
thT r'n('r ftj&hCtg .
[T nsng &a0 hiE! nVng &wa hE thQng &hng ta &x thT *G (bng Qi tRng
Stripifier T &hai &C& ta- giC& thDnh &C& ta- giC& rzi nha!. SJ! &hng
ta -!Qn te0 @xng &h0 Qi tRng hnh h&+ ta *G (bng S0r-a1)'n'rat0r
T tvnh t0Cn &C& v'&t0r @" -t &wa Qi tRng hnh h&.
<.2.1 $Vt vX dY Rn "iFn vC Ge%!etr,1n-%
Tr0ng phn nD3 &hng ta *Y ,'- ,ct &C& ;hyi te0 vD *G (bng Qi
tRng Geo"etr'.nfo. [T ;hyi te0 -ut Qi tRng Geo"etr'.nfo+
&hg ta &n &h r 10ei g'0-'tr3 &n (_ngB PML|)MS#..#|+
F4#D#..#|+ T.$#S)L%#..#|+
httpBOOtai1i'!ha3.&0-
591
Lp trnh ha trn Java 2D v 3D
T.$#S)L%8#S#..#| vD T.#$S)L%2T.$P#..#|. ihi
;hyi ta &hng ta phWi &h ra &00r(inat' vD *trip &0!nt*.
Chng ta ,ct 0en &0(' (i s3.
Geo"etr'.nfo gi n'?
Geo"etr'.nfofGeo"etr'.nfo.PML|)MS#..#|g
gi.*'tC00r(inat'*f&00r(inat'Datag
gi.*'t2tripC0!nt*f*tripC0!nt*g
Trian$uator tr n'? Trian$uatorfg
tr.triang!1at'fgig
S0r-a1)'n'rat0r ng n'? S0r-a1)'n'rat0rfg
ng.g'n'rat'S0r-a1*fgig
Stripifier *t n'? Stripifierfg
*t.*tripi63fgig
2hap'5D part n'? 2hap'5Dfg
part.*'t#pp'aran&'fapp'aran&'g
part.*'t)'0-'tr3fgi.g't)'0-'tr3#rra3fgg
- ihyi te0 Qi tRng Geo"etr'.nfo vD thiJt 1p &C& thjng *Q &sn
thiJt f&00r(inat'+ *trip&0!nt*g.
- 2a! ;hi te0 ra Qi tRng Geo"etr'.nfo+ &hng ta &x thT *G
(bng &C& 1p tiEn v&h ;hC& nh S0r-a1)'n'rat0r+ Trian$uator
@ng &C&h tr!3"n tha- *Q 1D Qi tRng Geo"etr'.nfo.
-
*.%.% Sz dSn$ Geo"etr'.nfo
/ut *Q &h H ;hi *G (bng Qi tRng Geo"etr'.nfo. SJ! *G (bng
&W S0r-a1)'n'rat0r vD Stripifier th ta phWi *G (bng S0r-a1)'n'rat0r
tr&. S0r-a1g'n'rat0r vD Stripifier "! &h *` (bng vi &C& ta- giC& &h
httpBOOtai1i'!ha3.&0-
592
Lp trnh ha trn Java 2D v 3D
-b&. ihi *G (bng nhZng 1p tiEn v&h nD3+ &hng ta ;hjng &n !an ts-
Jn ;iT! &wa Geo"etr'.nfofPML|)MS#..#|+ F4#D#..#|+
2T.$P#..#| g+ ;hi x &C& (Z 1iE! nD3 R& &h!3Tn i thDnh &C&
ta- giC& &h -b&. 2a! ;hi th`& hiEn &C& ta- giC& &h -b& nD3 R& g^n
1i"n 1ei vi nha!. T!3 nhiIn &C& thDnh phn ;hC& &wa (Qi tRng
Geo"etr'.nfo *Y @U tha3 i.
*.%.* /et s{ Np th`n$ dSn$ c i[n xuan dn Geo"etr'.nfo
Tr0ng phn nD3 &hng ta *Y ,'- ,ct ; hn -ut *Q 1p thjng (bng
n- tr0ng gxi
&0-.*!n.N5(.!ti1.g'0-'tr3.
httpBOOtai1i'!ha3.&0-
595
Lp trnh ha trn Java 2D v 3D
Lp Geo"etr'.nfo &x -ut hD- te0 (!3 nh]t+ ;hi ;hyi te0 -ut Qi
tRng &n &h r ;iT! &wa Qi tRng )'-'tr3 vD hE trb& ta u tng
ang.
KD- te0 Geo"etr'.nfo
)xiB &0-.*!n.N5(.!ti1*.g'0-'tr3
Lp &haB Nava..1ang.M@N'&t
2G (bngB Chng ta -!Qn &h!3Tn &C& Qi tRng hnh h& &h0 Qi tRng
Geo"etr'.nfo T &x thT (_ng &C& 1p tiEn v&h ;hC&. ihi &hng ta &h!3Tn
Qi tRng hnh h& &n thT hiEn &h0 Qi tRng Geo"etr'.nfo+ &C& 1p
tiEn v&h *Y *G (bng &C& (Z 1iE! tr0ng Qi tRng Geo"etr'.nfo T th`&
hiEn &C& 3I! &]! &wa &hng ta.
Geo"etr'.nfo<int pri"itive=
)iC trU &wa pri-itiv'B
PML|)MS#..#| B [a giC&+ &C& a giC& 2 &hi"!+5 &hi"!fa
(iEng
F4#D#..#| B Ta (iEn
T.$#S)L%#..#| B Ta- giC&
T.$#S)L%8#S#..#| B /Wng 2tripC0!nt* &h0 @iJt *Q nh
tng vi -\i ta- giC& rzi
httpBOOtai1i'!ha3.&0-
597
Lp trnh ha trn Java 2D v 3D
T.$#S)L%2T.$P#..#| B /Wng 2tripC0!nt* &h0 @iJt *Q nh tng
vi -\i ta- giC& rzi
Lp Geo"etr'.nfo &ha nhi"! phng tha&+ tr0ng x &x &C& phng
tha& th'v't 1p ha3 1s3 thjng tin v" hE trb& t0e u+ -! *^&+ &h -b&+
&C& (Z 1iE! @" -t.
CC& ph0ng tha& &wa 1p Geo"etr'.nfo
void reco"pute.ndices<=
Th`& hiEn 1ei viE& *^0 ,J0 T W- @W0 &C& thjng tin ;Jt nQi 1D &hvnh ,C&.
)i hD- nD3 ;hi &C& thjng tin v" hE trb& ta (u ;hjng &hvnh ,C&
void reverse<=
[W0 ngR& tha t` &wa t]t &W &C& (anh *C&h
void setCoor.ndices<intvw coor.ndices=
void setCoors<Coor*fvw coors=
[t -Wng -! *^&
void setCoors<Coor-fvw coors=
[t -Wng -! *^&.
void setContourCounts<intvw contourCounts=
[t (anh *C&h -! vi"n
void setCoordinate.ndices<intvw coordinate.ndices=
ThiJt 1p -Wng t 1E &wa hE trb& ta u.
void setCoordinates<Point*fvw coordinates=
ThiJt 1p -Wng &wa hE trb& ta u.
void setCoordinates<Point*dvw coordinates=
ThiJt 1p -Wng &wa hE trb& ta u.
void setbor"a.ndices<intvw nor"a.ndices=
httpBOOtai1i'!ha3.&0-
599
Lp trnh ha trn Java 2D v 3D
ThiJt 1p -Wng &C& &h (n.
void setbor"as<Cector*fvw nor"as=
void setbor"as<foatvw nor"as=
void setStripCounts<intvw stripCounts=
void setTextureCoordinate.ndices<intvw texCoord.ndices=
void setTextureCoordinates<Point%fvw texCoords=
CC&h *G (bng &C& 1p tiEn v&h ;hC& &ng nh *G (bng vi 1p
Geo"etr'.nfo. 2a! s3 &hg ta *Y 1n 1Rt ,'- ,ct hD- te0vD phng
tha& &wa &C& 1p Trian$uator+ Stripifier vD S0r-a1)'n'rat0r. [s3
&ng &hvnh 1D tha t` ;hi &hng ta 1D- viE& vi PML|)MS#..#|.
Tr0ng x 1p Trian$uator &h 1D- viE& vi Qi tRng hnh h& ;iT!
PML|)MS#..#|.
httpBOOtai1i'!ha3.&0-
59:
Lp trnh ha trn Java 2D v 3D
KD- te0 1p Trian$uator nh- te0 ra Qi tRng ta- giC&.
Trian$uator Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.g'0-'tr3
Lp &haB Nava.1ang.M@N'&t
Trian$uator<=
KD- te0 1p Trian$uator
Trian$uator /ethod Su""ar'
void trian$uate<Geo"etr'.nfo $i=
Phn tha& &h!3Tn i -ut Qi tRng Geo"etr'.nfo t_' ;iT! ng!3In
th! 1D PML|)MS#..#| *ang ;iT! ng!3In th! ;iT!
T.$#S)L%#..|.
KD- te0 1p Stripifier nh- te0 ra -ut Qi tRng *tripi6i&ati0n
Stripifier Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.g'0-'tr3
Lp &haB Nava.1ang.M@N'&t
Lp 2trip6i'r &x tiEn v&h i ;iT! ( 1iE! ng!3In th! &wa -ut Qi tRng
Geo"etr'.nfo *ang ;iT! Triang1' 2trip*. [T &h0 ;Jt !W tQt S0r-a1
)'n'rati0n phWi R& th`& hiEntr& ;hi !C trnh tC&h nh Qi tRng
hnh h&.
Stripifier<=
KD- te0
Pf;n$ thRc cga Np Stripifier
void stripif'<Geo"etr'.nfo $i=
httpBOOtai1i'!ha3.&0-
59<
Lp trnh ha trn Java 2D v 3D
Ch!3Tn Geo"etr'.nfo &x &haa Qi tRng Geo"etr'.nfo vD0 -Wng
Triang1' 2trip*.
Lp S0r-a1)'n'rat0r &x hai hD- te0. KD- te0 tha nh]t te0 ra Qi
tRng S0r-a1)'n'rat0r vi gx& g]p &x giC trU -& Unh. KD- te0 tha
hai &h0 phcp thiJt 1p giC trU &h0 &r'a*' ang1'.
bor"aGenerator Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.g'0-'tr3
Lp &haB Nava.1ang.M@N'&t
bor"aGenerator<=
ihyi te0 -ut S0r-a1)'n'rat0r vi gx& gp -& Unh f0.<:<97 ra(ian*+
0r 77g.
bor"aGenerator<dou,e radians=
ihyi te0 -ut S0r-a1)'n'rat0r vi gx& gp &x giC trU 1D tha- *Q ! vD0.
CMc Phf;n$ thRc bor"aGenerator
void $eneratebor"as<Geo"etr'.nfo $eo"=
dou,e $etCrease!n$e<=
L]3 giC trU gx& gp
void setCrease!n$e<dou,e radians=
ThiJt 1p gx& gp
CC& phng tha& &wa 1p S0r-a1)'n'rat0r B -ut phng tha& thiJt
1p+ -ut phng tha& 1]3 giC trU &r'a*' ang1'
L%aders
/ut 1p L'a('r & &C& 6i1' 5D vD te0 ra &C&- Qi tRng &wa Java5D
vi nui (!ng &W! 6i1' R& a vD0. 2a! x Qi tRng 5D nD3 &x thT
httpBOOtai1i'!ha3.&0-
59=
Lp trnh ha trn Java 2D v 3D
R& *G (bng nh &C& Qi t!?ng ;hC& &wa Java5D. )xi
&0-.*!n.N5(.1'a('r* &!ng &]p &C& phng tha& 10a( &C& 6i1' 5D tt &C&
&h!?0ng trnh ang (bng ;hC& vD0 tr0ng &h!?0ng trnh Java5D.
TrIn th`& tJ ngD3 &Cng &x nhi"! &C& Unh (eng 6i1' 5D tt &C& ang (bng
;hC& nha!+ &jng viE& T 10a( &C& 6i1' nD3 ;hjng phWi 1D &jng viE& &wa
Java5D ha3 &wa gxi 10a('r*+ -a &h &x phn gia0 (iEn (_ng &h0 ;
th!t 10a(ing R& a vD0.
/et vm dS ;n $iJn sz dSn$ eader.
[T 10a( vD0 nui (!ng -ut 6i1'+ &hng ta ;hjng nh]t thiJt phWi *G (bng
-ut 1p tiEn v&h T 10a( 6i1' x. Ta *G (bng 1p 10a('r vi &C& @&
nh *a!B
T- -ut 10a('r
$-p0rt 1p 10a('r ang vi (Unh (eng 6i' tng ang
$-p0rt nhZng 1p &n thiJt
[Unh nghha -ut @iJn ;h!ng &Wnh
Te0 -ut Qi tRng 10a('r
L0a( nui (!ng &wa 6i1' tr0ng ;hQi &at&h+ vD gCn ;Jt !W & R&
&h0 @iJn ;h!ng &Wnh
Chn Qi t!?ng ;h!ng &Wnh vD0 tr0ng -i"n ;h!ng &Wnh
Ta &x thT ,'- ,ct -ut ang (bng -! &wa 1p M@N'&t8i1' tr0ng
N(;1.2O('-0ONava5(OM@NL0a(.
Cass F,0ect+ie
)xiB &0-.*!n.N5(.10a('r*
Th`& thiB L0a('r
httpBOOtai1i'!ha3.&0-
599
Lp trnh ha trn Java 2D v 3D
Lp M@N'&t8i1' th`& thi gia0 (iEn L0a('r vi 6i1' &x Unh (eng
Lav'8r0nt.0@N+ -ut Unh (eng &h!n &wa 6i1' 5D !?& te0 ra @ng phn
-I- Lav'8r0nt #(van&'( Xv!a1i'r.
Chng ta ,'- ,ct -ut vv (b R& th`& hiEn th'0 &C& @& nxi y
trIn.
Chng ta &x thT th]3 &C& @R& 1+2..: tr0ng vv (b trIn ! R& hiEn
th'0 trnh t` &C& @& ta phsn tv&h.
*2c &%ader ph7 +i6n
Tr0ng Java5D &hng ta &x thT t- ths3 r]t nhi"! 1p L0a('r. Ta &x
@Wng (anh *a&h &b thT (i s3.
8i1' /j tW
5D2 5DP2t!(i0
CM> Ca1igari tr!'2pa&'
D%/ Digita1 %1'vati0n /ap
Dr8
#!t0C#D Dra?ing $nt'r&hang'
8i1'
$M> $-agin'
LL2 Light?av' 2&'n' 80r-at
S88 L0r1(T001iit S88 80r-at
M>J Lav'6r0nt
PD> Pr0t'in Data >an;
PL#| PL#|
2LD 201i( L0r1(
X.T 2!p'r*&ap' X.T
XTi Xi*!a1 T001;it
httpBOOtai1i'!ha3.&0-
5:0
Lp trnh ha trn Java 2D v 3D
L.L
Xirt!a1 .'a1it3 /0('1ing
1ang!ag'
*.*.* Giao diPn cga $i Loader v Np c; s|
[T 10a( R& &C& 6i1' 5D tr0ng -ut ang (bng Java+ &h!?0ng trnh
&wa &hng ta phWi *G (bng Jn Qi tRng 10a('r vD Qi tRng *&'n'.
[Qi tRng 10a('r &+ phsn tv&h+ vD te0 ra phn thT hiEn &wa Java 5D
&h0 nui (!ng 6i1' 5D x. [Qi tRng *&'n' 1! 1ei *&'n' graph R&
te0 ra tt 10a('r. Chng ta &x thT 10a( R& nhi"! *&'n' tt nhi"! 6i1'
5D+ @ng &C& *G (bng &_ng -ut Qi tRng 10a('r te0 ra nhi"! Qi
tRng *&'n'. Tr0ng -ut &hng trnh Java5D &hng ta &x thT 10a(
R& nhi"! 6i1' Unh (eng ;hC& nha! @ng &C& *G (bng &C& 10a('r
thv&h hRp.
2a! s3 &hng ta *Y ,'- ,ct &b thT &C& int'r6a&' &x tr0ng gxi
&0-.*!n.N5(.10a('r*. /ut 1p 10a('r th`& thi 10a('r int'r6a&' vD *G
(bng -ut 1p thv&h hRp T th`& thi *&'n' int'r6a&'.
co".sun.0*d.oaders .nterface Su""ar'
Loader Th' L0a('r int'r6a&' i* !*'( t0 *p'&i63 th' 10&ati0n an( '1'-'nt*
06 a 6i1' 60r-at t0 10a(.
Scene Th' 2&'n' int'r6a&' i* a *'t 06 -'th0(* !*'( t0 ',tra&t Java 5D
*&'n' graph in60r-ati0n 6r0- a 6i1'
10a('r !ti1it3.
Tr0ng x gxi &0-.*!n.N5(.10a('r* &dn &!ng &]p &C& 1p & *y T th`&
thi nhZng int'r6a&' nD3.
httpBOOtai1i'!ha3.&0-
5:1
Lp trnh ha trn Java 2D v 3D
co".sun.0*d.oaders Cass Su""ar'
LoaderBase Lp nD3 th`& thi gia0 (iEn L0a( vD thI- vD0 &C& hD- te0.
Lp !R& thiJt ;J T &hng ta &x thT tht ;J nJ! -!Qn ,s3 (`ng &C&
10a('r.
SceneBase Lp 2&'n'>a*' th`& thi gia0 (iEn 2&'n' vD viE& thta ;J 1p
2&'n'>a*' gip &h0 &hng ta (k (Dng *G (bng R& &C& phng tha&
,s3 (`ng
CC& phng tha& R& Unh nghha tr0ng int'r6a&'+ &dn phn th`& thi
n- tr0ng &C& 1p 10a('r -D ngzi 1p trnh *G (bng.
.nterface Loader /ethod Su""ar'
)xiB &0-.*!n.N5(.10a('r*
)ia0 (iEn L0a('r R& *G (bng T &h r ra vU trv vD &C& thDnh phn &wa
-ut Unh (eng 6i1' &n 10a(. Phn gia0 (iEn nD3 &!ng &]p &h0 1p L0a('r
&C& Unh (eng 6i1' ;hC& nha!. )ia0 (iEn 2&'n' *Y R& th`& thi T &!ng
&]p &h0 ngzi (_ng nhZng gia0 (iEn ph_ hRp T 1]p (Z 1iE! tt &C& 6i1'.
Scene oad<0ava.io.#eader reader=
Phng tha& 1]3 ra thDnh phn .'a('r vD trW v" -ut Qi tRng *&'n'&x
&haa ;h!ng &Wnh.
Scene oad<0ava.an$.Strin$ fieba"e=
Phng tha& 1]3 ra nui (!ng &wa -ut 6i1' tt tIn 6i1'+ vD trW v" -ut Qi
tRng *&'n' &x &haa ;h!ng &Wnh
Scene oad<0ava.net._#L ur=
Phng tha& 1]3 ra nui (!ng &wa -ut 6i1' tt 4.L+ vD trW v" -ut Qi tRng
*&'n' &x &haa ;h!ng &Wnh
void setBasePath<0ava.an$.Strin$ pathba"e=
Phng tha& nD3 thiiJt 1p zng (n & *y &h0 &C& 6i1' R& (_ng tr0ng
phng tha& 10a(f2tringg
httpBOOtai1i'!ha3.&0-
5:2
Lp trnh ha trn Java 2D v 3D
void setBase_r<0ava.net._#L ur=
Phng tha& nD3 thiiJt 1p zng (n & *y &h0 &C& 6i1' R& (_ng tr0ng
phng tha& 10a(f4.Lg
void set+a$s<int fa$s=
Phng tha& thiJt 1p &z 10a(
LF!&u!LL Ch0 phcp 10a( t0Dn @u &C& Qi tRng vD0 ;h!ng &Wnh.
LF!&uB!C8G#F_b&ubF&)S Cz &h0 phcp 10a( &C& Qi tRng
@a&;grr0!n( vD0 ;h!ng &Wnh.
LF!&uB)7!C.F#ubF&)S Cz &h0 phcp 10a( &C& hDnh vi vD0 tr0ng
;h!ng &Wnh.
LF!&u+FGubF&)S Cz &h0 phcp 10a( *ng -_ vD0 tr0ng ;h!ng
&Wnh.
LF!&uL.G7TubF&)S Cz &h0 phcp 10a( Qi tRng Cnh *Cng vD0
tr0ng ;h!ng &Wnh.
LF!&uSF_b&ubF&)S Cz &h0 phcp 10a( Qi tRng s- thanh vD0
tr0ng ;h!ng &Wnh..
LF!&uC.)AuG#F_PS Cz &h0 phcp 10a( Qi tRng vi'? f&a-'rag
vD0 tr0ng ;h!ng &Wnh...
Lp 10a('r & *y &!ng &]p phn th`& thi vi -\i phng tha& 10a(
fg- 5 phng tha&g R& Unh nghha tr0ng &C& 10a('r int'r6a&'.
Lp L0a('r th`& hiEn phn th`& thi 2 hD- te0.
LoaderBase Constructor Su""ar'
)xiB &0-.*!n.N5(.10a('r*
Th`& thiB L0a('r
Lp L0a('r th`& thi gia0 (iEn 10a('r.
LoaderBase<=
ihyi te0 Qi tRng L0a('r vi &C giCi trU -& Unh
httpBOOtai1i'!ha3.&0-
5:5
Lp trnh ha trn Java 2D v 3D
LoaderBase<int fa$s=
ihyi te0 Qi tRng L0a('r vi &C& &z &h Unh
ihi &hng ta viJt -ut 1p 10a('r -i+ &hng ta &x thT thta ;J 1ei 1p
10a('r & *y tr0ng gxi &0-.*!n.N5(.10a('r* vD *G (bng 1p 2&'n'>a*'
tr0ng &_ng gxi nD3.
Tr0ng !C trnh viJt -ut 10a('r -i &hng ta &n ,'- ,ct viE& thta
;J 1p 2&'n'>a*' h0& th`& thi int'r6a&' 2&'n' -ut &C&h trb& tiJp.
Lp 2&an'>a*' &x &ha& nVng 1! tr vD nhn (Z 1iE! R& te0 ra @yi
1p L0a('r tr0ng !C trnh & 6i1'. CC& phng tha& th`& hiEn viE&
1! trZ fR& &!ng &]p @yi nhZng ngzi viJt ra L0a('rg &x tIn (eng
a(( . CC& phng tha& th! nhn (Z 1iE! fR& ngzi *G (bng 1p
10a('r gi rag &x tIn (eng g't.
ihi thta ;J 1p 10a('r & *y+ &jng viE& &h 3J! &wa &hng ta 1D viJt
&C& phng tha& T nhn ra 60r-at &wa 6i1'. /\i phng tha& nD3
te0 ra &C& thDnh phn *&'n' graph tng ang vD 1! &C& (Z 1iE! nD3
tr0ng Qi tRng *&'n'.
SceneBase Constructor Su""ar'
)xiB &0-.*!n.N5(.10a('r*
Th`& thi gia0 (iEn 2&'n'
Lp 2&'n'>a*' th`& thi gia0 (iEn 2&'n'.
SceneBase<=
ihyi te0 -ut Qi tRng 2&'n'>a**'
SceneBase /ethod Su""ar' <partia isth oader users} "ethods=
Back$roundvw $etBack$roundbodes<=
Behaviorvw $etBehaviorbodes<=
0ava.an$.Strin$ $et&escription<=
httpBOOtai1i'!ha3.&0-
5:7
Lp trnh ha trn Java 2D v 3D
+o$vw $et+o$bodes<=
foatvw $et7ori4onta+FCs<=
Li$htvw $etLi$htbodes<=
0ava.uti.7ashta,e $etba"edF,0ects<=
BranchGroup $etSceneGroup<=
Soundvw $etSoundbodes<=
Transfor"Groupvw $etCie1Groups<=
F!a nhZng iT- trIn ta &x thT ,s3 (`ng R& 10a('r &h0 nh! &! &W!
-nh. Phn tiJp th'0 ta *Y i vD0 &hi tiJt viE& viJt -ut 10a('r.
Wi6t !Vt &%ader
Cjng viE& viJt -ut 10a('r 1D -ut &jng viE& pha& tep vD ;hjng phWi
ngzi 1p trnh Java 5D nD0 &ng phWi viJt. T!3 nhiIn viE& nghiIn &a!
&C&h viJt+ 1D- viE& &W! -ut L0a('r *Y gip &hng ta hiT! r hn ;hi
nD0 th *G (bng 10a('r+ hiT! &C&h *G (bng Geo"etr'.nfo+ hiT! R&
viE& th`& thi &wa M@N'&tL0a('r.
C`n$ viPc cga "et oader
Sg0Di nhiE- vb &hvnh 1D & nui (!ng -ut 6i1' h0e+ te0 ra -ut Qi
t!Rng *&'n' graph thT hiEn &h0 nui (!ng &wa 6i1' R& 10a(+ 1p 10a('r
&dn &x &C& &ha& nVng ;hC&.
Tvnh t0Cn @" -t thjng thzng &wa &C& a giC&.
ThT hiEn Qi tRng ha tei ng!3In gQ&
Chnh t 1E &wa Qi tRng hnh h& -ut &C&h thv&h hRp+ tng ang
1P1 trIn -\i trb&
LD- -Un Qi tRng hnh h&
httpBOOtai1i'!ha3.&0-
5:9
Lp trnh ha trn Java 2D v 3D
ThT hiEn Qi tRng hnh h& -ut &C&h hiE! !W @ng viE& phsn
nh thDnh nhi"! phn+ h0& *G (bng LMD.
T!3 nhiIn ;hjng phWi @]t &a 10a('r nD0 &ng phWi th`& hiEn 3 w
&C& &ha& nVng trIn. ShiE- vb &hw 3J! &wa nx 1D te0 ra Qi tng
hnh h& tng ang vi nui (!ng 6i1' R& 10a( vD0.
7" tlo Np Loader
Tr0ng phn nD3 &hng ta *Y ,'- ,ct viE& ta0 ra -ut Qi t!?ng
10a('r tt hD- te0 &wa 1p 10a('r ,aa3 (`ng. Shn &h!ng viE&
,s3 (`ng -ut 1p 10a('r i hi nhZng ;iJn tha& 1iIn !an Jn
Unh (eng &wa 6i1' &n 10a( vD phn 1!ng *tr'a- tr0ng Java.
Cx nhi"! &C&h tiJp &aen tr0ng viE& ,s3 (`ng -ut 10a('r. T!3 nhiIn
T &x thT tn (bng R& *` h\ trR &wa Java5D+ &hng ta &x thT (_ng
&C& 1p 2&'n'>a*' vD L0a('r>a*' f trnh @D3 y &C& &hng
tr&g. /ut 10a('r R& ,s3 (`ng trIn &C& 1p nD3 &x ;hW nVng
&hn R& phn (Z 1iE! &wa 6i1' R& *G (bng tr0ng ang (bng. [x
1D &C&h tiJp &n &h!n &h0 viE& ,s3 (`ng -ut 10a('r.
/ut ;hva &enh ;hx ;hVn nZa 1D ;hi ,s3 (`ng -ut 10a('r &hng ta
phWi !an ts- Jn 60r-at &wa 6i1'+ &x 10ei 6i1' n giWn+ &x 10ei 6i1'
pha& tep+ &x nhZng 6i1' &dn &x *` 1iIn !an Jn &C& 6i1' &]! hnh
;hC& nh 6i1' !3 Ung *&'n' graph ('*&ripti0n.
2G (bng ;hCi niE- La3'r+ viE& ,s3 (`ng 1p 10a('r try nIn (k (Dng
hn. 2Q 1Rng &C& 1a3'r 1ei phb th!u& nhi"! vD0 60r-at &wa 6i1' &n
10a(. 2a! s3 &hng ta ,'- ,ct tp &C& 1a3'r n giWn.
La3'rO1'v'
1
Cha& nVng
T0;'ni'r Ch!3Tn &C& ;H t` thDnh &C&
httpBOOtai1i'!ha3.&0-
5::
Lp trnh ha trn Java 2D v 3D
t0;'n
[Qi tRng Ch!3Tn &C& t0;'n hnh Wnh
&wa 6i1' thDnh &C& Qi tRng
h0e fg'0-'tr3+ 1ight*+
t',t!r'* g
2&'n' Ch!3Tn (anh *C&h &C& Qi
t`0ng *&'n' graph vD0 t0ng
;h!ng &Wnh h0e
8i1' LiIn !an Jn &C& 6i1' ha3
&C& 4.L &n -y
T0;'ni'r
[s3 1D tng th]p nh]t &wa 10a('r tr0ng viE& ,G 1H &C& 6i1' h0e.
Tn nD3 &x nhiE- vb &hia nh nui (!ng &W! 6i1' thDnh phn nh
hn+ gi 1D &C& t0;'n. L]3 vv (b -ut t0;'n &x thT 1D -ut *Q+ -ut
tt+ ha3 -ut ;H t` n.
[Qi tRng
Tng 0@N'&t &x nhiE- vb te0 ra &C& Qi tRng ha tt &C&
t0;'n R& te0 ra th'0 nui (!ng &wa 6i1'. /ut vDi Qi tRng &x
thT 1D Qi tRng nh+ a giC&+ Cnh *Cng+ ;Jt &]! ha3 @]t &a Qi
tRng ;h!ng &Wnh nD0 tr0ng Java5D. ShZng 0@N'&t nD3 1D &C&
thDnh phDn &wa -ut ;h!ng &Wnh
2&'n'
LD tp hRp &C& Qi tRng hnh h&.Thjng thzng tng *&'n'
tr0ng Java5D n giWn. Trt tr!zng hRp ng0ei 1E ;hi nx 1p
10a('r &x nhiE- vb 10a( -ut tEp ei (iEn &h0 -ut ;h!ng &Wnh
ha. Xv (b nh 6i1' th'0 Unh (eng Mp'n $nv'nt0r vD MM)L
Li*t.
8i1'
httpBOOtai1i'!ha3.&0-
5:<
Lp trnh ha trn Java 2D v 3D
8i1' &x &haa nui (!ng &n R& 10a(.
Cidt "et +ie Loader ;n $iJn
Tr0ng phn nD3 &hng ta *Y ,'- ,ct &b thT hn viE& ,s3 (`ng -ut
10a('r n giWn. XiE& (! tiIn 1D &hng ta &n ,C& Unh Unh (eng
6i1' -D 10a('r &wa &hng ta *Y 10a(. Thjng thzng &hng ta *Y &hn
1` -ut h &C& 6i1' &0 Unh (eng tng ng+ vv (b nh h MM)L
fM@N'&t Mri'nt'( )raphi&* Li@rar3g
[Unh (eng F4#D
>& ! tiIn T viJt -ut L0a('r 1D @iJt R& Unh (eng &wa 6i1'.
Tr0ng phn nD3 &hng ta *Y ,'- ,ct !a v" &]! tr& 6i1' F4#D+
&C& &hi tiJt &b thT *Y trnh @D3 y phn 7. Tr0ng phn 7 &hng ta *Y
,'- ,ct nhZng v]n " B
[a *Q &C& 6i1' MM)L "! &x Unh (eng #2C$$ t` (0P &x &C&
;h0Wng tr^ng+ trjng+ ta@+ (dng -i giZa &C& phn tG f*Q+ ;H
t`g. CC& phn &0--'nt R& @^t ! *a! (]! .
[Unh (eng F4#D th!u& 10ei Unh (eng MM)L. [Unh (eng F4#D
-j tW -ut tp hRp &C& @u !a(. /ut 6i1' (eng F4#D 1D -ut tp
hRp 7n nh+ tr0ng x n 1D *Q &C& @u !a(.
Xv (b (!i s3 &h0 th]3 n0i (!ng -ut 6i1' F4#D. 8i1' nD3 &haa
thjng tin v" -ut hnh v!jng trIn hE ;hjng gian 5 &hi"!+ vi thDnh
phn &wa hnh v!jng @ng 0+ hnh v!jng nD3 n- trIn -t phng
M,3.
httpBOOtai1i'!ha3.&0-
5:=
Lp trnh ha trn Java 2D v 3D
C]! tr& &wa -ut i1' F4#D nxi &h!ng 1D pha!& tep hn nhi"! *0
vi vv (b trIn+ t!3 nhiIn -b& v&h &wa &hng ta 1D t- hiT! &C&h
viJt -ut 10a('r n giWn nIn ta (`a trIn 6i1' F4#D n giWn. C]!
tr& &h!ng &wa 6i1' F4#D R& -j tW ; hn tr0ng phn 7.
Tr0ng @Wng (i s! a ra (anh *C&h &C& 1p vD -Qi !an hE giZa
&hng T ta &x thT ,s3 (`ng -ut 1p 10a('r.
TngOLp Th`& thi
t0;'ni'r F!a(8i1'Par*'r
M@N'&t 2i-p1'F!a(M@N'&t &haa
F!a(8i1'Par*'r
*&'n' 2i-p1'F!a(2&'n' thta ;J
1p 2i-p1'F!a(M@N'&t
6i1' 2i-p1'F!a(8i1'L0a('r
thta ;J 1p
2i-p1'F!a(2&'n' th`& thi
1p L0a('r
app1i&ati0n 2i-p1'F!a(L0a( &haa 1p
2i-p1'F!a(8i1'L0a('r
Tr0ng &C& phn tiJp th'0 &hng ta *Y ,'- ,ct ; hn C&& 1p nD3+
thDnh phn vD h0et ung &wa nx tng -ut ang (bn 10a('r.
Tn$ Tokeni4er<F!Wn 1H &C& phn tG=
>& ! tiIn T ,s3 (`ng -ut 10a('r 1D ,s3 (`ng t0;'ni'r. [i"!
nD3 R& th`& hiEn @ng &C&h &hng ta thta ;J 1p tiEn v&h
2tr'a-T0;'ni'r. Lp nD3 & vD0 1!ng &C& ;H t` vD &h!3Tn i
nx thDnh tp &C& phn tG. Tr0ng vv (b nD3+ &hng ta ,s3 (`ng 1p
F!a(8i1'Par*'r tht ;J 1p 2tr'a-T0;'ni'r.
CC& phng tha& tr0ng 1p F!a(8i1'Par*'r
httpBOOtai1i'!ha3.&0-
5:9
Lp trnh ha trn Java 2D v 3D
Phng tha& ShiE- vbOh0et ung
X0i( *'t!pfg Ch ra &C& tha- *Q &h0 t0;'ni'r+
hD- nD3 R& gi tr0ng hD- te0
@001'an g'tT0;'nfg Phng tha& 1]3 ra t0;'n tiJp th'0+
phng tha& *G (bng hD-
n',tT0;'nfg&wa 1p
2tr'a-T0;'ni'r
X0i( printT0;'nfg $n giC trU &wa &C& t0;'n ra
23*t'-.0!t+ (_ng trng !C trnh g
1\i
F!a(8i1'Par*'rf.'a('
r rg
KD- te0 gi phng tha& *'t!p vD
1iIn ;Jt &C& t0;'n vi Qi tRng
r'a('r.
ShZng *` tha3 i -y rung &hw 3J! n- tr0ng phng tha& *'t!p.
ShZng *` tha3 i nD3 @a0 g-B
[Unh nghha nhZng ;H t` & @iEt+ (]! ,!Qng (dng+ (]!
&0--'nt.
&1a** F!a(8i1'Par*'r ',t'n(* 2tr'a-T0;'ni'r
OO *'t!p
OO 2't* !p 2tr'a-T0;'ni'r 60r r'a(ing MM)L 6i1' 60r-at*.
v0i( *'t!pfg

r'*'t23nta,fg
OO %ML &har* ar' in*igni6i&ant in F4#D 6i1'
'01$*2igni6i&antf6a1*'g
?0r(Char*f#+g
OO hav' 2tr'a-T0;'ni'r par*' n!-@'r* f-a;'* (0!@1'Ppr'&i*i0ng
httpBOOtai1i'!ha3.&0-
5<0
Lp trnh ha trn Java 2D v 3D
par*'S!-@'r*fg
OO C0--'nt* @'gin ?ith t0 'n( 06 1in'
&0--'ntCharfg
OO Lhit'*pa&' &hara&t'r* ('1in'at' ?0r(* an( n!-@'r*
OO @1an;*+ ta@*+ an( n'?1in'* ar' ?hit'*pa&' in MM)L
?hit'*pa&'Char*ft+ rg OO ht+ 16+ 66+ vt+ &r
?hit'*pa&'Char*f + g OO *pa&'
OO %n( 06 *'t!p
O g'tT0;'n
)'t* th' n',t t0;'n 6r0- th' *tr'a-. P!t* 0n' 06 th' 60!r
&0n*tant* fTTLM.D+ TTS4/>%.+ TT%ML+ 0r TT%M8g an( th'
t0;'n
va1!' int0 tt3p' t0;'n 0@N'&t.
Th' va1!' 06 thi* -'th0( i* in th' &at&hing 06 ',&'pti0n* in thi*
&'ntra1 10&ati0n.
O
@001'an g'tT0;'nfg

int t
@001'an (0n' 6a1*'
tr3
t n',tT0;'nfg

&at&h f$M%,&'pti0n 'g


23*t'-.'rr.print1nf
$M 'rr0r 0n 1in' 1in'n0fg B '.g't/'**ag'fgg
r't!rn 6a1*'

r't!rn tr!'
httpBOOtai1i'!ha3.&0-
5<1
Lp trnh ha trn Java 2D v 3D
OO %n( 06 g'tT0;'n
OO F!a(8i1'Par*'r &0n*tr!&t0r
F!a(8i1'Par*'rf.'a('r rg

*!p'rfrg
*'t!pfg
OO 'n( 06 F!a(8i1'Par*'r
OO %n( 06 6i1' F!a(8i1'Par*'r.Nava
Ta &x thT th]3 nhZng tha3 i tr0ng &C& phng tha& g'tT0';nfg+
printT0;'nfg .. 1D ;hjng Cng ;T. Sh v3 ta h0Dn thDnh viE&
viJt 1p F!a(8i1'L0a('r+ tiJp th'0 &h!ng *ta &h!3Tn 1In tng trIn+
tng 0@N'&t.
ThOc hiPn tn$ F,0ect
ShiE- vb &wa tng M@N'&t 1D &h!3Tn nhZng t0;'n R& &!ng &]p
@yi tng t0;'ni'r *ang &C& Qi tRng hnh h&.Tng vv (b &wa
&hng ta th i"! nD3 1D n giWn @zi v &hng ta &h &x -ut Qi
tRng hnh h& (!3 nh]t 1D ta (iEn. T!3 nhiIn &hng ta gp phWi
-ut ;hx ;hVn tr0ng viE& ,C& Unh *Q 1Rng Qi tRng hnh h&
R& &!ng &]p.
CC& phng tha& tr0ng 1p 2i-p1'F!a(M@N'&t
Phng tha& ShiE- vb
>001'an
r'a(X'rt',fF!a(8i1'Par*'r *tg
[& nh+ -\i nh @a0 g-
ta u ,+3+ ha3 &C& thjng
tin ;hC& v" -! *^&+ @"
-t
>001'an
r'a(F!a(fF!a(8i1'Par*'r *tg
[& &C& t (iEn @ng &C&h
& &C& nh tt 6i1' F4#D
httpBOOtai1i'!ha3.&0-
5<2
Lp trnh ha trn Java 2D v 3D
X0i(
r'a(F!a(8i1'fF!a(8i1'Par*'r*tg
[& 6i1' F4#D ,C& nhn
&C& th tr0ng 6i1'+ ,C& Unh
tp &C& nh vD & ra &C ta
(iEnfta giC&g
ShiE- vb &wa tng nD3 1D & ra &C& Qi tRng hnh h& tt tp hRp
&C& t0;'n. Tr0ng trzng hRp nD3 &C& Qi tRng hnh h& 1D &C&
nh. Tp &C& nh nD3 R& 1! trZ tr0ng -ut Qi tRng #rra3Li*t.
2G (bng #rra3Li*t &hx phcp viE& tha3 i ;v&h th& &W! -Wng te0
thzi gian th`& hiEn. Tei tng 2&'n'+ Qi tRng ;iT! #rra3Li*t R&
&h!3Tn i *ang -ut #rra3 vD *a! x 1D *ang Qi tRng hnh h&.
Chng ta ,'- ,ct phn &0(' &hw 3J! tr0ng tng M@N'&t. T0Dn @u
phn &0(' 3 w n- tr0ng ',a-p1'.Nar.
i-p0rt F!a(8i1'Par*'r
OO -an3 0th'r i-p0rt* 0-itt'( in t!t0ria1 t',t
p!@1i& &1a** 2i-p1'F!a(M@N'&t

pr0t'&t'( int 61ag*


pr0t'&t'( int 6i1'T3p' 0 OO ?hat pr0p'rti'* v'rti&'* hav'
OO &0n*tant* 60r in(i&ating 6i1' t3p'
pr0t'&t'( *tati& 6ina1 int CMM.D$S#T%
)'0-'tr3#rra3.CMM.D$S#T%2
OO 1i*t* 06 p0int* ar' r'a( 6r0- th' .!a( 6i1' int0 thi* OOarra3. . .
pr0t'&t'( #rra3Li*t &00r(Li*t OO K01(* P0int56
O
r'a(X'rt', r'a(* 0n' v'rt',* &00r(inat' (ata
O
@001'an r'a(X'rt',fF!a(8i1'Par*'r *tg

httpBOOtai1i'!ha3.&0-
5<5
Lp trnh ha trn Java 2D v 3D
P0int56 p n'? P0int56fg
*t.g'tT0;'nfg
i6f*t.tt3p' *t.TT%M8g
r't!rn 6a1*' OO r'a&h'( 'n( 06 6i1'
p., f610atg*t.nva1
*t.g'tT0;'nfg
p.3 f610atg*t.nva1
*t.g'tT0;'nfg
p. f610atg*t.nva1
OO #(( thi* v'rt', t0 th' arra3
&00r(Li*t.a((fpg
r't!rn tr!'
OO %n( 06 r'a(X'rt',
O
r'a(F!a( r'a(* 60!r v'rti&'* 06 th' &0rr'&t t3p' f?hi&h in thi*
v'r*i0n i* a1?a3* N!*t &00r(inat' (atag.
O
@001'an r'a(F!a(fF!a(8i1'Par*'r *tg

int v
@001'an r'*!1t 6a1*'
60rfv0 v } 7 vg
r'*!1t r'a(X'rt',f*tg
r't!rn r'*!1t
OO %n( 06 r'a(F!a(
O
r'a(8i1'

.'a( th' -0('1 (ata 6r0- th' 6i1'.


httpBOOtai1i'!ha3.&0-
5<7
Lp trnh ha trn Java 2D v 3D
O
v0i( r'a(F!a(8i1'fF!a(8i1'Par*'r *tg

OO v'ri63 6i1' t3p'


*t.g'tT0;'nfg
i6f*t.*va1.'!a1*fF4#Dg -- *t.*va1.'!a1*fPML|gg
6i1'T3p' CMM.D$S#T%
'1*'
thr0? n'? Par*ing%rr0r%,&'pti0nf@a( 6i1' t3p'B *t.*va1g
OO r'a( v'rti&'*
?hi1' fr'a(F!a(f*tg
OO %n( 06 r'a(8i1'
OO %n( 06 &1a** 2i-p1'F!a(M@N'&t
OO %n( 06 6i1' 2i-p1'F!a(M@N'&t.Nava
SJ! tr0ng &hng ta &x &C& thjng tin i ;- vi -\i nh nh -!
*V&+ &hZ .. &C& thjng tin nD3 &ng R& 1!?! tr0ng -ut #rra3Li*t.
ShZng thjng tin thI- vD0 nD3 &ng `0& &h!3Tn *ang -Wng thv&h
hRp tr0ng tng *&'n'.
[s3 1D tng th`& hiEn &hw 3J! &jng viE& &wa -ut 10a('r. TiJp cn
1D tng 2&'n'+ tng ;h!ng &Wnh
ThOc hiPn tn$ Scene
Tng *&'n' th`& thi @yi 1p 2i-p1'F!a(2&'n'.
CC& phng th& 1p 2i-p1'F!a(2&'n'
Phng tha& ShiE- vb
2&'n'>a*' -a;'2&'n'fg Shn (Z 1iE! tt -ut #rra3Li*t (0
tng (i a 1In+ te0 ra &C& Qi
tRng hnh h& tng ang vD a
httpBOOtai1i'!ha3.&0-
5<9
Lp trnh ha trn Java 2D v 3D
vD0 ;h!ng &Wnh ha
P0int56
0@N'&tT0P0int56#rra3f#rra3Li*t
ing
Ch!3Tn i -ut #rra3Li*t thDnh
-ut -Wng P0int56+ (_ng phng
tha& -a;'2&'n'fgT te0 ra &C& Qi
tRng hnh h&
2&'n' 10a(f.'a('r r'a('rg 1.ihyi te0 a -ut Qi tRng
F!a(8i1'Par*'r
2.)i F!a(8i1'L0a(f*&'n'g
5.)i -a;'2&'n'fg
&1a** 2i-p1'F!a(2&'n' ',t'n(* 2i-p1'F!a(M@N'&t
2.
5. OO &00r(Li*t i* &0nv'rt'( t0 an arra3* 60r &r'ating g'0-'tr3
7. OO
9. privat' P0int56 &00r(#rra3 n!11
:.
<. privat' P0int56 0@N'&tT0P0int56#rra3f#rra3Li*t inLi*tg
=.
9. P0int56 0!tLi*t n'? P0int56inLi*t.*i'fg
10.
11. 60r fint i 0 i } inLi*t.*i'fg ig
12. 0!tLi*ti fP0int56ginLi*t.g'tfig
15.
17. r't!rn 0!tLi*t
19. OO %n( 06 0@N'&tT0P0int56#rra3
1:.
httpBOOtai1i'!ha3.&0-
5<:
Lp trnh ha trn Java 2D v 3D
1<.
1=. privat' 2&'n'>a*' -a;'2&'n'fg
19.
20. OO Cr'at' 2&'n' t0 pa** @a&;
21. 2&'n'>a*' *&'n' n'? 2&'n'>a*'fg
22. >ran&h)r0!p gr0!p n'? >ran&h)r0!pfg
25. *&'n'.*'t2&'n')r0!pfgr0!pg
27.
29. OO th' -0('1 ?i11 @' 0n' 2hap'5D
2:. 2hap'5D *hap' n'? 2hap'5Dfg
2<.
2=. &00r(#rra3 0@N'&tT0P0int56#rra3f&00r(Li*tg
29.
50. F!a(#rra3 a n'? F!a(#rra3f&00r(#rra3.1'ngth+ 6i1'T3p'g
51. a.*'tC00r(inat'*f0+ &00r(#rra3g
52.
55. OO P!t g'0-'tr3 int0 2hap'5(
57. *hap'.*'t)'0-'tr3fag
59.
5:. gr0!p.a((Chi1(f*hap'g
5<. *&'n'.a((Sa-'(M@N'&tfn0 na-'+ *hap'g
5=.
59. r't!rn *&'n'
70. OO 'n( 06 -a;'2&'n'
71.
72. p!@1i& 2&'n' 10a(f.'a('r r'a('rg thr0?* 8i1'S0t80!n(%,&'pti0n+
75. $n&0rr'&t80r-at%,&'pti0n+
77. Par*ing%rr0r%,&'pti0n
79.
httpBOOtai1i'!ha3.&0-
5<<
Lp trnh ha trn Java 2D v 3D
7:. OO F!a(8i1'Par*'r (0'* 1',i&a1 ana13*i*
7<. F!a(8i1'Par*'r *t n'? F!a(8i1'Par*'rfr'a('rg
7=.
79. &00r(Li*t n'? #rra3Li*tfg
90.
91. r'a(F!a(8i1'f*tg
92.
95. r't!rn -a;'2&'n'fg
97. OO %n( 06 10a(f.'a('rg
99. OO %n( 06 &1a** 2i-p1'F!a(2&'n'
9:. OO %n( 06 6i1' 2i-p1'F!a(2&'n'.Nava
ThOc hiPn tn$ +ie
Tng nD3 &x nhiE- vb th`& hiEn viE& gia0 tiJp vi 8i1'. [a *Q phn
&0(' &wa tng nD3 &ng tn t` nh y tng M@N'&t. Lp
2i-p1'F!a(8i1'L0a('r thta ;J 1p 2i-p1'F!an(2&'n' vD th`& thi
gia0 (iEn L0a('r.
~' dOn$ "et Loader hon chnh
Tr0ng th`& tJ &x r]t nhi"! thjng tin &hi tiJt tr0ng 6i1' F4#D -D
10a('r n giWn -D &hng ta vta ,s3 (`ng ;hjng Cp ang (R&. Xv
(b nh nhZng ;H hiE! ;h0a h& tr0ng -ut 6i1' F4#D+ &C& thjng
tin v" -! *V& Lp 2tr'a-T0;'ni'r &hng ta ,s3 (`ng &ha
Cp ang nh! &! x.
/ut 6i1' F4#D &*0 thT &haa nhZng thjng tin v" @" -t+ -! *^& ..
&wa -\i nh+ -\i Qi tRng. [T nhn R& &C& thjng tin nD3
&hng ta &n tha3 i tng M@N'&t vD tng *&'n'.
httpBOOtai1i'!ha3.&0-
5<=
Lp trnh ha trn Java 2D v 3D
/ut 6i1' F4#D &x thT @a0 g- nui (!ng &wa -ut 6i1' ;hC&. [i"!
nD3 1D- tVng *` pha& tep &wa 10a('r vD xi hi viE& tha3 i &0('
tei t]t &W &C& tng.
/ut 10a('r pha& tp hn &x thT nhn ra vD 10a( R& -ut h &C&
Unh (eng 6i1'+ vv (b nh LightLav' 10a('r.
Tet2D
Cx hai &C&h T th`& hiEn viE& th'- &hZ vD0 tr0ng ;h!ng hnh
Java5D. CC&h tha nh]t 1D *G (bng 1p T',t2D+ &C&h tha hai 1D *G
(bng T',t5D. 2` ;hC& nha! y &h\+ 1p T',t2D th`& hiEn &C& (dng
&hZ tr0ng ;hjng gian 2 &hi"! &dn T',t5D th`& hiEn tr0ng ;hjng
gian 5 &hi"!.
[Qi tRng T',t2D 1D &C& a giC& v!jng tr0ng x &C& &hZ R& &0i
nh 1D phn @" -t. [Qi t!?ng T',t5D 1D nhZng Qi tRng hnh
h& tr0ng ;hjng gian 5 &hi"!.
LD -ut 1p &0n &wa 1p 2hpa'5D+ thT hiEn &wa 1p T',t2D &x thT 1D
&0n &wa Qi tRng gr0!p. [T thI- vD0 (dng &hZ 2D tr0ng Java5D
&hng ta &n te0 ra xi tRng T',t2D *a! x thI- nx vD0 ;hjng
gian h0e.
[Qi tRng T',t2D R& th`& hiEn *G (bng -ut a giC& vD -ut
t',t!r'.
httpBOOtai1i'!ha3.&0-
5<9
Lp trnh ha trn Java 2D v 3D
*.2.( Cm dS Text%& ;n $iJn
Tr0ng vv (b (i s3 &hng ta ,'- ,ct viE& te0 ra -ut (Qi tRng
T',t2D n giWn. >a0 g-g @& te0 ra Qi tRng T',t2D vD @&
tiJp ht'0 1D thI- Qi tRng nD3 vD0 ;hjng gian ha.
i-p0rt Nava.app1't.#pp1't
i-p0rt Nava.a?t.>0r('rLa30!t
i-p0rt Nava.a?t.8ra-'
i-p0rt Nava.a?t.'v'nt.
i-p0rt Nava.a?t.80nt
i-p0rt &0-.*!n.N5(.!ti1*.app1't./ain8ra-'
i-p0rt &0-.*!n.N5(.!ti1*.g'0-'tr3.T',t2D
i-p0rt &0-.*!n.N5(.!ti1*.!niv'r*'.
i-p0rt Nava,.-'(ia.N5(.
i-p0rt Nava,.v'&-ath.
OO T',t2D#pp r'n('r* a *ing1' T',t2D 0@N'&t.
p!@1i& &1a** T',t2D#pp ',t'n(* #pp1't
p!@1i& >ran&h)r0!p &r'at'2&'n')raphfg
OO Cr'at' th' r00t 06 th' @ran&h graph
>ran&h)r0!p 0@N.00t n'? >ran&h)r0!pfg
OO Cr'at' a T',t2D 1'a6 n0('+ a(( it t0 th' *&'n' graph.
T',t2D t',t2D n'? T',t2Df2D t',t i* a t',t!r'( p013g0n+
n'? C010r56f0.96+ 1.06+ 1.06g+
K'1v'ti&a+ 1=+ 80nt.$T#L$Cgg
0@N.00t.a((Chi1(ft',t2Dg
*.2.% LNp Text%&
Lp T',t2D 1D 1p tiEn v&h tht ;J tt 1p 2hap'5D.
httpBOOtai1i'!ha3.&0-
5=0
Lp trnh ha trn Java 2D v 3D
KD- te0 1p T',t2D.
Text%& Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.g'0-'tr3
Lp T',t2D te0 ra -ut ;h!ng &hZ nht R& Cnh ,e Jn phDn nui (!ng
t',t+ hin thU nui (!ng t',t R& gGi @yi ng!zi (_ng. iv&h th& &wa
;h!ng &hZ nhet R& ,C& Unh phb th!u& vD0 60nt R& *G (bngftha- *Q
&wa hD- te0g. iIt !W &wa Qi tRng 2hap'5D tr0ng *!Qt ng0ei trt hnh
&hZ nht &haa nui (!ng t',t R& t tei vU trv f0+0+0g ;c0 (Di th'0 &hi"!
(ng trb& ,+ tr`& 3
Text%&<0ava.an$.Strin$ text@ Coor*f coor@ 0ava.an$.Strin$
fontba"e@
int fontSi4e@ int fontSt'e=
Tr0ng hD- te0 T',t2D ta &x thT tha3 i t 1E ;v&h tha0& &wa Qi
t!?ng (dng &hZ hiEn ra *0 vi ;v&h th& iT- &Q Unh.
Text%& /ethod Su""ar'
void set#ectan$eScae+actor<foat ne1Scae+actor=
httpBOOtai1i'!ha3.&0-
5=1
Lp trnh ha trn Java 2D v 3D
[t giC trU t 1E R& *G (bng tr0ng viE& &h!3Tn i &hi"! rungO&hi"! (Di
&wa hnh Wnh *ang &hiT! rungO&hi"! &a0 tng ang tr0ng ;hjng gian
ha @^t ! @ng thta *Q 1O29:
void setStrin$<0ava.an$.Strin$ text= sne1 in (.%t
ThiJt 1p giC trU (_ng &hZ hiEn thU &h0 Qi tRng T',t2D
Tet<D
Tr0ng phn nD3 &hng ta t- hiT! v]n " 1D- viE& vi 1p T',t5D.
ihyi te0 -ut Qi tRng T',t5D @a0 g- nhi"! &jng viE& hn tr0ng
Qi T',t2D. tr& hJt Qi tRng T',t5D R& te0 ra @ng &C&h *G
(bng Qi tRng hnh h&. >& ! tiIn &hng ta phWi te0 ra Qi
tRng 80nt5D @a0 g- &C& th!u& tvnh @" -t+ ;v&h tha0& vD ;v&h
& &wa 60nt. Lp T',t5D 1D 1p &0n &wa 1p )'0-'tr3+ nIn Qi
t!?ng t',t5D 1D -ut Qi tRng S0('C0-p0n'nt R& tha- &hiJ!
@yi -ut ha3 nhi"! Qi t!?ng 2hap'5D.
CC& @& te0 ra Qi tRng T',t5D
Te0 -i Qi tRng 80nt5D tt #LT80nt
Te0 -i Qi tRng T',t5D *G (bng Qi tRng 80nt5D+ ta &x
thT &h Unh (iT- tha- &hiJ! t! &hn
Tha- &hiJ! xi tRng 2hap'5D+ vD thI- D0 ;hjng gian
h0e
/et vm dS Text*&
CC& @& te0 ra vD *G (bng Qi t!?ng T',t5D R& -inh h0e
tr0ng vv (b *a!. Tr0ng x Qi t!?ng 80nt5D te0 ra vi th!u& tvnh
;iT! @" -t 1D K'1v'ti&a+ 60nt &hZ 1D 10. 2a! x &hng ta te0 ra
Qi tRng T',t5D tha- &hiJ! Jn -ut iT- tr0ng ;hjng gian
ha.
httpBOOtai1i'!ha3.&0-
5=2
Lp trnh ha trn Java 2D v 3D
i-p0rt Nava.app1't.#pp1't
i-p0rt Nava.a?t.>0r('rLa30!t
i-p0rt Nava.a?t.8ra-'
i-p0rt Nava.a?t.'v'nt.
i-p0rt Nava.a?t.80nt
i-p0rt &0-.*!n.N5(.!ti1*.app1't./ain8ra-'
i-p0rt &0-.*!n.N5(.!ti1*.!niv'r*'.
i-p0rt Nava,.-'(ia.N5(.
i-p0rt Nava,.v'&-ath.
OO T',t5D#pp r'n('r* a *ing1' T',t5D 0@N'&t.
p!@1i& &1a** T',t5D#pp ',t'n(* #pp1't
p!@1i& >ran&h)r0!p &r'at'2&'n')raphfg
OO Cr'at' th' r00t 06 th' @ran&h graph
>ran&h)r0!p 0@N.00t n'? >ran&h)r0!pfg
80nt5D 60nt5( n'? 80nt5Dfn'? 80ntfK'1v'ti&a+ 80nt.PL#$S+ 10g+
n'? 80nt%,tr!*i0nfgg
T',t5D t',t)'0- n'? T',t5Df60nt5(+ n'? 2tringf5DT',tg+
n'? P0int56fP2.06+ 0.06+ 0.06gg
2hap'5D t',t2hap' n'? 2hap'5Dft',t)'0-g
0@N.00t.a((Chi1(ft',t2hap'g
Chng ta ,'- hnh (i s3.
httpBOOtai1i'!ha3.&0-
5=5
Lp trnh ha trn Java 2D v 3D
[T te0 ra &hi"! *s! fthT hiEn @ng v_ng -! ghig &hng ta *G (bng
&C& Qi tRng /at'ria1 vD Qi t!?ng Dir'&ti0nLight.
Ta &x thT &hiJ! *Cng Qi tRng T',t5D th'0 nhi"! hng ;hC&
nha!. [T &x thT &hiJ! nhiI!g hng ;hC& nha! &hng ta *G (bng
1p /at'ria1.
/\i Qi tRng T',t5D &x -ut iT- tha- &hiJ!. [iT- tha- &hiJ!
1D *` ;Jt hRp &wa path vD a1ign-'nt &wa Qi tRng T',t5D.
Tr0ng @Wng (i s3 &h0 ta -inh ha v" *` ;Jt hRp nD3.
bhEn$ Np i[n xuan Q tlo ra {i tfLn$ Text*&
Tr0ng phn nD3 &hng ta ,'- ,ct nhZng 1p &x 1iIn !an T te0 ra
Qi tRng T',t5D.
httpBOOtai1i'!ha3.&0-
5=7
Lp trnh ha trn Java 2D v 3D
Lp T',t5D @a0 g- nhi"! hD- te0. Ch0 phcp ta te0 ra Qi t!?n
T',t5D -ut &C&h 1inh h0et.
Text*& Constructor Su""ar'
# T',t5D 0@N'&t i* a t',t *tring that ha* @''n &0nv'rt'( t0 5D g'0-'tr3.
Th' 80nt5D 0@N'&t ('t'r-in'* th'
app'aran&' 06 th' T',t5D S0('C0-p0n'nt 0@N'&t. %a&h T',t5D 0@N'&t
ha* a p0*iti0n P a r'6'r'n&' p0int p1a&ing th'
T',t5D 0@N'&t. Th' 5D t',t &an @' p1a&'( ar0!n( thi* p0*iti0n !*ing
(i66'r'nt a1ign-'nt* an( path*.
/ut Qi tRng T',t5D 1D -ut ,s! ;H t` R& &h!3Tn i *ang hnh h&
5D. [Qi tRng 80nt5D ,C& Unh @" ng0Di &wa Qi tRng T',t5D
S0('C0-p0n'nt
Text*&<=
Te0 ra Qi tRng T',t5D. CC& giC trU -& UnhB
appr0priat'+ ar'B
60nt 5D n!11
*tring n!11
p0*iti0n f0+0+0g
a1ign-'nt #L$)S8$.2T
path P#TK.$)KT
&hara&t'r *pa&ing 0.0
httpBOOtai1i'!ha3.&0-
5=9
Lp trnh ha trn Java 2D v 3D
Text*&<+ont*& font*&=
Te0 ra Qi tRng T',t5D vi Qi tRng 80nt5D ,C& Unh
Text*&<+ont*& font*&@ Strin$ strin$=
Te0 ra Qi tRng T',t5D vi Qi tRng 80nt5D ,C& Unh vD nui (!ng
&wa ,s! ;H t` &n hiTn thU
Text*&<+ont*& font*&@ Strin$ strin$@ Point*f position=
Te0 ra Qi tRng T',t5D vi &C tha- *Q Qi tRng 80nt5D+ ,s! ;H t`+ ta
u &wa iT- tha- &hiJ!. /& Unh iT- tha- &hiJ! n- v" phva @In
(0ia &_ng @In trCi &wa &hZ &n hiTn thU
Text*&<+ont*& font*&@ Strin$ strin$@ Point*f position@
int ai$n"ent@ int path=
!L.GbuC)bT)# CVn 1" giZa.
!L.Gbu+.#ST a1ign-'ntB ;H t` ! tiIn &wa (dng &hZ R& t tUa
iT- tha- &hiJ!.
!L.GbuL!ST a1ign-'ntB ;H t` &!Qi &_ng &wa (dng &hZ R& t tei
iT- tha- &hiJ!..
r'- thI- vv (b y @Wng trIn.

ShZng phng tha& &wa 1p T',t5D+ g- nhZng phng tha& T
thiJt 1p &C& th!u& tvnh &wa Qi tRng T',t5D f*'trrrg+ nhZng
phng tha& 1]3 giC trU &C& t!u& tvnh &wa Qi tRng
T',t5Dfg'trrrg.
Text*& /ethod Su""ar'
void set!i$n"ent<int ai$n"ent=
[t &anh 1" &h0 Qi tRng T',t5D S0('C0-p0n'nt
void setCharacterSpacin$<foat characterSpacin$=
httpBOOtai1i'!ha3.&0-
5=:
Lp trnh ha trn Java 2D v 3D
[t ;H t` (]! &C&h ;hi te0 ra Qi tRng T',t5D
void set+ont*&<+ont*& font*d=
ThiJt 10 Qi tRng 80nt5D R& *G (bng @yi Qi tRng T',t5D
S0('C0-p0n'nt
void setPath<int path=
[t zng (n &wa n0('
void setPosition<Point*f position=
[t iT- tha- &hiJ! &wa n0('
void setStrin$<0ava.an$.Strin$ strin$=
C0pi'* th' &hara&t'r *tring 6r0- th' *!pp1i'( para-'t'r int0 th' T',t5D
n0('.
C0p3 ,s! ;H t` tt tha- *x ! vD0 &h0 Qi tRng T',t5D n0('.
CC& &hJ u &wa Qi tRng T',t5D.
Text*& Capa,iities Su""ar'
!LLFAu!L.Gb/)bTu#)!& y A#.T) Ch0 phcp & ghi giC trU ,s!
;H t`.
!LLFAuBF_b&.bGuBF~u#)!&
!LLFAuC7!#!CT)#uSP!C.bGu#)!& y A#.T) Ch0 phcp &
ghi &C& ;H t` (]! &C&h.
!LLFAu+FbT*&u#)!& y A#.T) &h0 phcp & ghi thjng tin &C&
thDnh phn 80nt5D
!LLFAuP!T7u#)!& y A#.T) Ch0 phcp & ghi giC trU ,s! zng
(n.
!LLFAuPFS.T.Fbu#)!& y A#.T) Ch0 phcp & ghi giC trU vU trv
&wa ,s!
httpBOOtai1i'!ha3.&0-
5=<
Lp trnh ha trn Java 2D v 3D
!LLFAuST#.bGu#)!& y A#.T) Ch0 phcp (& ghi Qi tRng ,s!
;H t`..
/\i Qi tRng T',t5D R& te0 ra tt -ut Qi tRng 80nt5D. /ut
Qi tRng 80nt5D &x thT R& (_ng T te0 ra nhi"! Qi tRng
T',t5D ;hC& nha!. /ut Qi tRng 80nt5D 1! &C& thjng tin v" @"
(3 hnh h& &wa Qi tRng T',t5D. [Qi t!?0nNg 80nt5D R& th!
hi t` ung fgar@ag' &011'&t'(g -D ;hjng Wnh hyng Jn Qi tRng
T',t5D *G (bng &hng.
+ont*& Constructor Su""ar'
Lp &haB Nava.1ang.M@N'&t
/ut Qi tRng 80nt5D @a0 g- Java 2D 80nt vD &hi"! *s!.
+ont*&<0ava.a1t.+ont font@ +ont)xtrusion extrudePath=
+ont*&<0ava.a1t.+ont font@ dou,e tesseationToerance@
+ont)xtrusion extrudePath= sne1 in (.%t
!LLFAuP!T7u#)!& y A#.T) Ch0 phcp & ghi giC trU zng (n.
!LLFAuPFS.T.Fbu#)!& y A#.T) Ch0 phcp & ghi giC trU vU trv.
!LLFAuST#.bGu#)!& y A#.T) Ch0 phcp & ghi Qi tRng ,a!
;H t`.
Lp 80nt5D ;hjng &x nhZng phng tha& *'t &b thT+ viE& thiJt
1p &C& th!u& tvnh &wa Qi tRng 80nt5D R& th`& hiEn tr0ng hD-
te0. Di s3 1D &C& phng tha& g't.
+ont*& /ethod Su""ar'
void $etBoundin$Box<int $'phCode@ Boundin$Box ,ounds=
0ava.a1t.+ont $et+ont<=
.'t!rn* th' Java 2D 80nt !*'( t0 &r'at' thi* 80nt5D 0@N'&t.
TrW v" Qi tRng Java2D 80nt R& *G (bng T te0 ra Qi tRng 80nt5D
httpBOOtai1i'!ha3.&0-
5==
Lp trnh ha trn Java 2D v 3D
void $et+ont)xtrusion<+ont)xtrusion extrudePath=
C0pi'* th' 80nt%,tr!*i0n 0@N'&t !*'( t0 &r'at' thi* 80nt5D 0@N'&t int0 th'
*p'&i6i'( para-'t'r.
ThiJt 1p giC trU Qi tRng 80nt%,tr!*i0n *G (bng T te0 ra Qi tRng
80nt5D @ng giC trU &W! tha- *Q ! vD0. dou,e
$etTesseationToerance<= sne1 in (.%t
Lp 80nt R& *G (bng tr0ng viE& te ra Qi tRng 80nt5D. Ta -j tW
-ut hD- te0 1p 80nt+ &C& hD- te0 &dn 1ei &x thT ,'- thI- tr0ng
Nava(0&.
+ont Constructor Su""ar' <partia ist=
)xiB Nava.a?t
pu,ic +ont<Strin$ na"e@ int st'e@ int si4e=
KD- te0 -i -ut Qi tRng 80nt vi tha- *Q tIn 80nt+ ;iT!+ ;v&h &
na"e P th' t3p'6a&' na-'. Cx thT 1D t'n 10gi& h0& t'n t3p'6a&'. /ut tIn
10gi& &n phWi 1D -u tr0ng &C& gva trUB
Dia10g+ Dia10g$np!t+ /0n0*pa&'(+ 2'ri6+ 2an*2'ri6+ 0r 23-@01.
st'e P
Tha- *Q ;iT! &x thT a16 -u tr0ng &C& ;iT!B >MLD+ $T#L$C
si4e P C 80nt.
KD- te0 1p 80nt%,tr!*i0n
+ont)xtrusion Constructor Su""ar'
Lp &haB Nava.1ang.M@N'&t
Th' 80nt%,tr!*i0n 0@N'&t i* !*'( t0 ('*&ri@' th' ',tr!*i0n path 60r a
80nt5D 0@N'&t. Th' ',tr!*i0n path i* !*'( in
&0nN!n&ti0n ?ith a 80nt2D 0@N'&t. Th' ',tr!*i0n path ('6in'* th' '(g'
&0nt0!r 06 5D t',t. Thi* &0nt0!r i*
httpBOOtai1i'!ha3.&0-
5=9
Lp trnh ha trn Java 2D v 3D
p'rp'n(i&!1ar t0 th' 6a&' 06 th' t',t. Th' ',tr!*i0n ha* it* 0rigin at th'
'(g' 06 th' g13ph ?ith 1.0 @'ing th' h'ight 06
th' ta11'*t g13ph. C0nt0!r -!*t @' -0n0t0ni& in ,. 4*'r i* r'*p0n*i@1' 60r
(ata *anit3 an( -!*t -a;' *!r' that
',tr!*i0n2hap' (0'* n0t &a!*' int'r*'&ti0n 06 a(Na&'nt g13ph* 0r ?ithin
*ing1' g13ph. Th' 0!tp!t i* !n('6in'( 60r
',tr!*i0n* that &a!*' int'r*'&ti0n*.
+ont)xtrusion<=
KD- te0 vi giC trU -& Unh
+ont)xtrusion<0ava.a1t.Shape extrusionShape=
KD- te0 Qi tRng 80nt%,tr!*i0n vi Qi *Q *hap' tr!3"n vD0 vD
t01'ran&' 0.01
+ont)xtrusion<0ava.a1t.Shape extrusionShape@ sne1 in (.%t
dou,e tesseationToerance=

httpBOOtai1i'!ha3.&0-
590
Lp trnh ha trn Java 2D v 3D
CC& phng tha& 1p 80nt%,tr!*i0n
+ont)xtrusion /ethod Su""ar'
0ava.a1t.Shape $et)xtrusionShape<=
)'t* th' 80nt%,tr!*i0n* *hap' para-'t'r.
void set)xtrusionShape<0ava.a1t.Shape extrusionShape=
2't* th' 80nt%,tr!*i0n* *hap' para-'t'r.
dou,e $etTesseationToerance<= sne1 in (.%t
.'t!rn th' t'**'11ati0n t01'ran&' ?ith ?hi&h thi* 80nt%,tr!*i0n 0@N'&t ?a*
&r'at'(.
BCn (hfn" "ian ha
/ut &C&h -& Unh+ -! n"n &wa ;hjng gian ha 1D -! 'n *-.
T!3 nhiIn Java5D &!ng &]p &h0 &hng ta ;hW nVng tha3 i n"n &wa
;hjng gian ha+ ta &x thT 1`a &hn -! *^&+ Wnh+ &C& Qi tRng hnh
h& ha3 ;Jt hRp &C& thDnh phn nD3 1ei T te0 thDnh n"n &wa ;hjng
gian ha.
CC& @& te0 ra nn &wa ;hjng gian haB
ihyi te0 -ut Qi tRng @a&;gr0!n( -i &h Unh -! *^& h0&
-ut hnh Wnh nD0 x.
ThI- vD0 -ut Qi tRng hnh h& ft_3 &hng
C!ng &]p -ut #pp1i&ati0n >0!n(ar3 h0& -ut >0!n(ingL'a6
ThI- Qi tRng @a&;gr0!n( vD0 ;hjng gian ha
/et vm dS ,ack$round
Sh ta trnh @D3 y phn tr&. /ut (xi t!Rng @a&;gr0!n( &x thT 1D
-ut -! &b thT+ -ut hnh Wnh ha3 th- &hv -jt Qi tRng hnh h&.
httpBOOtai1i'!ha3.&0-
591
Lp trnh ha trn Java 2D v 3D
tng vv (b ! tiIn &hng ta *Y ,'- ,ct Qi tRng @a&;gr0n( 1D -!
tr^ng+ vv (b tha hai ta thI- -ut Qi tRng hinh h& vD0 @a&;gr0!n(.
Xv (b @a&;gr0!n( 1D -! n"n
>a&;gr0!n( @a&;g n'? >a&;gr0!n(f1.06+ 1.06+ 1.06g
OO
@a&;g.*'t#pp1i&ati0n>0!n(*f>0!n(ing2ph'r'fgg
&0nt'nt.00t.a((Chi1(f@a&;gg
Xv (b @a&;gr0!n( 1D Qi tRng hnh h&
>a&;gr0!n( @a&;g n'? >a&;gr0!n(fg OO@1a&; @a&;gr0!n(
@a&;g.*'t)'0-'tr3f&r'at'>a&;)raphfgg OO a(( >ran&h)r0!p
06 @a&;gr0!n(
@a&;g.*'t#pp1i&ati0n>0!n(*fn'? >0!n(ing2ph'r'fn'?
P0int5(fg+ 100.0gg
0@N.00t.a((Chi1(f@a&;gg
Phng tha& &r'at'>a&;)raphfg @a0 g- viE& te0 ra Qi tRng hnh
h& 1D- n"n. Phng tha& nD3 trW v" Qi tRng >ran&h)r0!p. Ta &x
thT ,'- -ut vv (b h0Dn &hinh >a&;gr0!n(#pp.Nava tr0ng th -b&
',a-p1'*O'a*3C0nt'nt.
LNp Back$round
Tr0ng phn nD3 &hng ta ,'- ,ct &b thT thDnh phn vD hat (ung &wa
1p @a&;gr0!n(
Lp @a&;gr0!n( thta ;J 1p L'a6+ -ut thT hiEn &wa 1p @a&;gr0!n( 1D
thDnh phn &0n th!u& Qi tRng )r0!p
httpBOOtai1i'!ha3.&0-
592
Lp trnh ha trn Java 2D v 3D
>a&;gr0!n( &x nhi"! hD- te0. Tha- *Q tr0ng hD- ta &h0 @iIt -!
*^& h0& hnh Wnh &h0 @a&;gr0!n(.
KD- te0 &wa 1p >a&;gr0!n(
Back$round Constructor Su""ar'
Th' >a&;gr0!n( 1'a6 n0(' ('6in'* 'ith'r a *01i( @a&;gr0!n( &010r 0r a
@a&;gr0!n( i-ag' that i* !*'( t0 6i11 th'
?in(0? at th' @'ginning 06 'a&h n'? 6ra-'. $t 0pti0na113 a110?*
@a&;gr0!n( g'0-'tr3 t0 @' r'6'r'n&'(.
>a&;gr0!n( g'0-'tr3 -!*t @' pr'Pt'**'11at'( 0nt0 a !nit *ph'r' an( i*
(ra?n at in6init3. $t a1*0 *p'&i6i'* an
app1i&ati0n r'gi0n in ?hi&h thi* @a&;gr0!n( i* a&tiv'.
Back$round<=
C0n*tr!&t* a >a&;gr0!n( n0(' ?ith a ('6a!1t &010r f@1a&;g.
Back$round<Coor*f coor=
C0n*tr!&t* a >a&;gr0!n( n0(' ?ith th' *p'&i6i'( &010r.
Back$round<foat r@ foat $@ foat ,=
C0n*tr!&t* a >a&;gr0!n( n0(' ?ith th' *p'&i6i'( &010r.
Back$round<."a$eCo"ponent%& i"a$e=
C0n*tr!&t* a >a&;gr0!n( n0(' ?ith th' *p'&i6i'( i-ag'.
CC& phng tha& tr0ng 1p @a&;gr0!n(
httpBOOtai1i'!ha3.&0-
595
Lp trnh ha trn Java 2D v 3D
Back$round /ethod Su""ar'
void set!ppicationBoundin$Leaf<Boundin$Leaf re$ion=
2't th' >a&;gr0!n(* app1i&ati0n r'gi0n t0 th' *p'&i6i'( @0!n(ing 1'a6.
void set!ppicationBounds<Bounds re$ion=
2't th' >a&;gr0!n(* app1i&ati0n r'gi0n t0 th' *p'&i6i'( @0!n(*.
void setCoor<Coor*f coor=
2't* th' @a&;gr0!n( &010r t0 th' *p'&i6i'( &010r.
void setCoor<foat r@ foat $@ foat ,=
2't* th' @a&;gr0!n( &010r t0 th' *p'&i6i'( &010r.
void setGeo"etr'<BranchGroup ,ranch=
2't* th' @a&;gr0!n( g'0-'tr3 t0 th' *p'&i6i'( >ran&h)r0!p n0('.
void set."a$e<."a$eCo"ponent%& i"a$e=
2't* th' @a&;gr0!n( i-ag' t0 th' *p'&i6i'( i-ag'.
CC& tha- *Q &C! hnh ;hC& &wa Qi tRng >a&;gr0!n(
Back$round Capa,iities Su""ar'
!LLFAu!PPL.C!T.FbuBF_b&Su#)!& y A#.T) a110? r'a(
f?rit'g a&&'** t0 it* app1i&ati0n @0!n(*
!LLFAuCFLF#u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
&010r
!LLFAuG)F/)T#nu#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0
it* @a&;gr0!n( g'0-'tr3
!LLFAu./!G)u#)!& y A#.T) a110? r'a( f?rit'g a&&'** t0 it*
i-ag'
*.^ &E iPu n$fi dYn$h
CC& Qi tRng 2&'n')raphM@N'&t &x thT tha- &hiJ! Jn @]t &a Qi
tRng nD0 nh 1D &C& (Z 1iE! ngzi (_ng. Danh *C&h 1p &0n &wa 1p
httpBOOtai1i'!ha3.&0-
597
Lp trnh ha trn Java 2D v 3D
2&'n')raphM@N'&t gd- &xB #pp'aran&'+ >a&;gr0!n(+ >'havi0!r+
>ran&h)r0!p+ )'0-'tr3+ Light*+ 2hap'5D vD Tran*60r-)r0!p.
L]3 vv (b+ -ut ang (bng &x thT &x nhi"! Qi tRng &x ;hW nVng tng
tC&+ (i &h!3Tn. /\i Qi tRng &x thT &x thT &haa nhZng (Z 1iE! (eng
t',t tr0ng Qi tRng (Z 1iE! ngzi (_ng.
CC& phng tha& 1p 2&'n')raphM@N'&t
SceneGraphF,0ect /ethods <Partia List o _ser &ata /ethods=
2&'n')raphM@N'&t i* a &0--0n *!p'r&1a** 60r a11 *&'n' graph &0-p0n'nt
0@N'&t*. Thi* in&1!('* S0('+ )'0-'tr3+
#pp'aran&'+ 't&.
0ava.an$.F,0ect $et_ser&ata<=
.'tri'v'* th' !*'rData 6i'1( 6r0- thi* *&'n' graph 0@N'&t.
void set_ser&ata<0ava.an$.F,0ect user&ata=
2't* th' !*'rData 6i'1( a**0&iat'( ?ith thi* *&'n' graph 0@N'&t.
httpBOOtai1i'!ha3.&0-
599
Lp trnh ha trn Java 2D v 3D
C*ABCG )
TABCG TXC
Tr0ng &hng ta *Y t- hiT! v" &C& v]n " *a!B
T- hiT! 1p Behaviour+ 1p & *y &h0 viE& th`& hiEn tng tC& vD
,s3 (`ng h0et hnh
rs3 (`ng -ut 1p Behaviour
PhQi hRp &C& Qi tRng Behaviour vD0 tr0ng thJ gii W0 T th`&
hiEn t0ng tC&
2G (bng 1p tiEn v&h ,G 1H @Dn phv-
2G (bng 1p tiJn v&h ,G 1H &h!ut
2G 1p 1p tiE& v&h pi&;ing
Tr0ng &C& &hng tr& &hng ta a ,'- ,ct viE& 1p trnh Java5D -t
&C&h h0Dn t0Dn thnh. T!3 nhiIn i"! th vU &W! Java5D &dn n- y vU'& 1p
trnh tng tC& vD h0et hnh.
Tng tC& 1D ;hi &C& hnh Wnh tha3 i phWn ang 1ei hDnh ung &W! ngzi
(_ng. K0et hnh 1D nhZng tha3 i &wa hnh Wnh -D ;hjng &n *` tng
tC& tr`& tiJp &wa &0n ngzi. Tr0ng Java5D+ &W tng tC& vD h0et hnh "!
*G (bng 1p Behaviour. Chng ta *Y ,'- ,ct 1p nD3 &hi tict hn tr0ng
&C& -b& &hwa &h!?0ng nD3.
httpBOOtai1i'!ha3.&0-
59:
Lp trnh ha trn Java 2D v 3D
..1 Z3nh viA *R sg c[a t\Rn" t2c v3 h%`t hnh
CW t0ng tC& vD he0t hnh "! *G (bng Qi tRng Behaviour. Lp
Behaviour 1D -ut 1p & *y trt! tRng+ &!ng &]p &C& ; th!t T tha3 i
thU ;h!ng &Wnh. Lp Behaviour vD &C& 1p (n ,!]t+ 1iIn ;Jt vi phn
- &wa ngzi phCt triTn &!ng &]p nh- 1D- tha3 i hnh Wnh+ s- thanh
tr0ng ;hjng gian W0. [Qi tRng Behaviour tr0ng -ut thU ;h!ng &Wnh
&x nhiE- vb ths3 i thU ;h!ng &Wnh+ ha3 phWn ang 1ei &C& ;v&h thv&h.
/ut ;v&h thv&h+ ha3 tC& ung &x thT 1D viE& ]n -ut phv-+ (i &h!3Tn &h!ut+
*` va &he- giZa &C& Qi tRng ShZng tC& ung nD3 &x th thI- vD0
&C& Qi tRng tr0ng thU ;h!ng &Wnh ha3 10ei @ &C Qi tRng tr0ng
thU ;h!ng &Wnh+ tha3 i th!u& tvnh &wa Qi tRng+ *^p 1ei 1ei &C& Qi
tRng
-.(.( n$ dSn$ cga hnh vi
Tr0ng @Wng (i s3 &hng ta *Y 1iEt ;I nhZng ;hW nVng &x thT &wa
1p Behaviour+ 1iEt ;I nhng tC& nhsn tt &ut @In trCi ,!Qng pha (i+ vD
nhZng tha3 i n- trIn (dng !. Chng ta &h 1iEt ;' nhZng ;hW nVng
n giWn &W! Behaviour &ha ;hjng 1iEt ;I 3 w t]t &W &C& ;hW nVng &x
thT &wa Behaviour. /ut vDi *` ;Jt hRp giZ &C& tC& nhsn vD &C& tha3 i
&h &x H nghha tr0ng nhZng trzng hRp & @iE+ &hng ta gi 1D ang (bng
&b thT.
TC& nhsn Transfor"Group )'0-'tr3 2&'n')raph Xi' ?
Sgzi
(_ng
Tng tC& ng (bng &b
thT
ng (bng
&b thT
Di
&h!3Tn
2` va
&he-
[Qi tRng tr`&
!an tha3 i
[Qi tRng
tr`& !an
[Qi tRng
,!]t hiEn
ThT
hiEn
httpBOOtai1i'!ha3.&0-
59<
Lp trnh ha trn Java 2D v 3D
hng ha3 vU trv tha3 i @"
n0Di tr0ng
&C& va &he-
tr0ng &C& va
&he-
nhZng
tha3 i
tr0ng va
&he-
Thzi
gian
K0et hnh K0et hnh K0et hnh K0et
hnh
ih!ng
nhn
>Wng Tn &C& &hi
tiJt
fLMDg
ng (bng
&b thT
ng
(bng &b
thT
>W-g trIn &hng ta &h 1iEt ;I nhZng tr!zn hRp n giWn nhZng ;hW
nVng &wa 1p Behaviour. Pi&;ing R& th`& thi *G (bng &C& hDnh vi
nhng ;hjng R& 1iE ;I y trIn.
Shng *` vt ng0Di t` nhiIn+ nh -ut &Ci &s3+ @a0 g- -ut *Q 1Rng
r]t 1n &C& Qi tRng hnh h& R& thT hiEn -ut &C&h &hvnh ,C& nh 1a+
&Dnh ./ut phng phCp ;hC& R& *G (bng 1D *G (bng ;Jt &]! a giC&
tha3 &h0 &C& Qi tRng hnh h&.
i th!t trIn ft',t!r' p013g0ng thng R& gi 1D @i11@0ar(
appr0a&h. [i"! nD3 1D hRp 1H vD ng ^n ;hi -ut hDnh vi R& *G (bng
t` ung Unh hng t',t!r'( p013g0n tr`& gia0 vi ;h!ng nhn+ tr0ng x
&h &x @ -t &W! ;Jt &]! a (iEn R& nhn th]3. KDnh vi Unh hnggi
1D @i11@0ar( @'havi0r.
Kng tiJp &n @i11@0ar( th`& *` hiE! !W ;hi Qi tRng R& @iT!
(ikn @yi t',t!r' &x ;h0Wng &C&h ,a v v3 &C& phn u& 1p ;hC& &wa Qi
tRng tr`& !an R& @iT! (ikn @yi t',t!r' *Y ;hx ;hVn. L]3 vv (b @iT!
(ikn -ut &Ci &s3+ nJ! ;h!ng nhn 1D r]t ,a ;hjng w ;hW nVng nhn -ut
&C&h r rDng vD ni @t &Dnh &s3+ ;hi x *Y 1D r]t vj 1H vD phv phe- ;hi
tQn @u nh vD &jng viE& ,G 1H T @iT (iIn tng &hiJ& 1C. i th!t nD3
httpBOOtai1i'!ha3.&0-
59=
Lp trnh ha trn Java 2D v 3D
R& ;h!3Jn ;hv&h *G (bng tr0ng &C& ang (bng 3I! &! thT hiEn &C& Qi
tRng tr`& !an y ;h0Wng &C&h ,a.
KDnh vi LMD f1'v'1 06 ('tai1g & x nh Zng ang (bng 1iIn !an. Xi
LMD+ &C& Qi tRng tr`& !an R& @iT! (ikn @yi r]t nhi"! Qi tRng tr`&
!an ;hC& nh hn+ &hi tiJt hn. ihi ;h!ng nhn fvi'?'rg &Dng gn &C&
&hi tiJt R& thT hin &Dng r vD ;hi ;h!ng nhn y ,a+ &C& Qi tRng tr`&
!an R& @iT! (ikn vt &hi tiJt hn. Behaviour LMD t` ung &h!3Tn i
&C& &hJ u trnh (ikn (`a vD0 ;h0Wng &C&h giZa Qi tRng vi vi'?'r.
CW @i11@0ar( vD LMD "! tng ang vi &C& 1p (n ,!]t tt 1p
Behaviour
-.(.% Tjn$ xuan Np Behaviour
Tr0ng @Wng 7P1+ &h r *` &h!3In -jn h0C &wa Behaviour tr0ng
Java5D #P$ vD &C& gxi tiEn v&h. Tr0ng phn nD3 &hng ta *Y 1sn 1Rt ,'-
,ct ttng 1p tr0ng @Wng 7P1.
..2 *R +Fn vC h3nh vi
Sh " &p tr0ng &C& phn tr&+ 1p Behaviour R& *w (bng
nhi"! tr0ng &C& ang (bng Java5D th'0 nhi"! &C&h ;hC& nha!.XiE& t-
hiT! h0et ng vD 1p trnh vi 1p Behaviour 1D i"! r]t !an trng.
Tr0ng -b& nD3 &hng ta *Y t- hiT! 1p Behaviour+ a ra &C&h tha& T
te0 ra -ut 1p Behaviour &wa riIng -nh vD -ut vv *G (bng 1p
Behaviour.
httpBOOtai1i'!ha3.&0-
599
Lp trnh ha trn Java 2D v 3D
2 &C& 1p &0n &wa 1p Behaviour
-.%.( Cidt "et Np Behaviour
Tr0ng phn nD3 &hng ta *Y t- hiT! &C&h viJt -ut 1p
Behaviour./'&hani&* &wa Behaviour*
/ut 1p Behaviour th`& thi !C trnh ;hyi te0 vD phng tha&
pr0&'**2ti-!1!* &wa 1p & *y trt! tRng Behaviour. Sg0Di ra -ut 1p
Behaviour t` ,s3 (`ng &ng &x vt nh]t -ut Dh- te0 vD &x &C& phng
tha& ;hC& &wa riIng nx.
CC& Behaviour thjng !a &C& Qi tRng h0e+ *Y hDnh ung tr0ng
-ut thU ;h!ng &Wnh nh- tC& ung Jn hDnh vi. [Qi tRng Behaviour
&n -ut tha- &hiJ! Jn Qi tRng &x *` tha3 i+ T nx &x ;hW nVng te0
ra nhZng hDnh vi tha3 i.
Tr0ng hD- te0+ &x thT thiJt 1p tha- &hiJ! Jn Qi tRng tr0ng *`
tha3 i. SJ! ;hjng+ tng -ut phng tha& ;hC& &W! 1p Behaviour t`
,s3 (`ng phWi &haa nhZng thjng tin nD3+ !C trnh tha- &hiJ! phWi R&
th`& hiEn tei thzi iT- thU ;h!ng &Wnh R& te0 ra.
httpBOOtai1i'!ha3.&0-
700
Lp trnh ha trn Java 2D v 3D
F!C trnh ;hyi te0 R& gi Jn ;hi thU ;h!ng &Wnh &haa 1p
Behaviour R& te0 ra.
Phng tha& ;hyi te0 &x trC&h nhiI- &Di t nhZng trigg'r @an ! T
@^t &C& *` ;iEn &wa Behaviour vD &Ci t nhZng i"! ;iEn @an ! &h0
&C& (Z 1iE! thnh &wa Qi tRng Behaviour.
CC& triggg'r th`& &h]t 1D &C& Qi tRng AakeupCondition f&C& iE!
;iJn tha& (3g+ ha3 1D *` ;Jt hRp &wa &C& AakeupCondition . Phng
tha& pr0&'**2ti-!1!* R& gi ;hi &C& trigg'r R& ;v&h h0et. Phng
tha& pr0&'**2ti-!1!* &x tra&h nhiE- @^t vD ,G 1H &C& *` ;iEn ,W3 ra.
Shi"! *` ;iEn &x thT &x thT R& - h0C tr0ng -ut Qi tRng
AakeupCondition fnhi"! 10ei ;v&h h0et &wa @Dn phv- &x thT R& -
h0C tr0ng La;'!pMn#LT%v'ntg+ nx @a0 g- &W viE& giWi - &C& *`
;iEn.
Phng tha& pr0&'**2ti-!1!* phWn ,e 1ei &C& tC& nhsn+ thzng 1D *`
tha3 i &wa &C& Qi tRng+ tr0ng nhZng i"! ;iEn thv&h hRp+ thiJt 1p 1ei
&C& trigg'r.
TiJp th'0 &hng ta ,'- ,ct &C& @& T viJt -ut 1p Behaviour &h0
riIng -nh.
XiJt hD- te0+ &haa tha- &hiJ! Jn Qi tRng tr0ng *` tha3 i
XiJt hD- ;hyi t=o pu3li& void initialidation[\0&h Unh &C& tiI!
&h!n ;v&h h0et @an ! ftrigg'rg
XiJt hD- pu3li& void pro&ess"ti+ulus[\0 giWi - i"! ;iEn ,W3 ra
hDnh ung &wa trigg'r+ r'*'t 1ei trigg'r nJ! &n thiJt.
CC& @& trIn 1D &C& tha& &hng ta te0 ra &C& 1p Behaviour n gan+
nhZng Behaviour pha& tep di hi phWi 1p trnh ,G 1H nhi"! @& hn.
Chng ta ,'- ,ct vv (b (i s3+ R& th`& hiEn th'0 &C& @&
nI! y trIn
Cm dS x' dOn$ Np Behaviour h Si"peBehaviour
httpBOOtai1i'!ha3.&0-
701
Lp trnh ha trn Java 2D v 3D
Tr0ng vv (b (i s3 &hng ta ,s3 (`ng -ut 1p Behaviour th`& hiEn
-ut hDnh vi n giWn+ 1D- !a3 -ut *Q tha (i *` i"! ;hiTn @antg @Dn
phv-. [T ,s3 (`ng -ut 1p Behaviour nh v3+ &hng ta &n -ut tha-
&hiJ! Jn -ut Transfor"Group fQi tRng &haa+ &hU! *` tha3 ig vD
-ut @iJn gx& nghiIng. Di *` ;v&h h0et &wa @Dn phv-+ g0& nghiIng *Y
tha3 i vD gx& nghiIng &wa Transfor"Group R& thiJt 1p @ng vi
giC trU -i &wa gx& nghiIng nD3. ihi x viE& !a3 Qi tRng
Transfor"Group ;hjng &dn 1D v]n " ;hx ;hVn nZa.
[T te0 ra 1p Behaviour nD3+ &hng ta &h &n 1p trnh th'0 &C&
@!?x& nI! y trIn. KD- te0 *Y &haa tha- &hiJ! Jn Qi tRng
Transfor"Group &wa *` tha3 i. Phng tha& initia1iati0n thiJt 1p &C
thjng *Q trigg'r @an ! th'0 *` ;iEn La;'Mn#LT%v'nt *` ;iEn+ vD
thiJt 1p gx& nghiIng @ng 0. Sh " &p y phn trIn+ tC& nhsn &wa -ut
Behaviour R& &0i nh -ut Qi tRng AakeupCondition . Tr0ng phn
7.5 &hng* ta *Y ,'- ,ct 1p AakeupCondition . Phng tha&
pr0&'**2ti-!1!* *Y giWi - phv- @]- &x thT ,C& Unh R& phv- ha3
t hRp phv- nD0 R& ]n. Phng tha& pr0&'**2ti-!1!* th!?dng ,!3In
tVng @iJn gx& nghiIng 1In+ tt x ta &x thT i"! &hnh *` tha3 i &W! Qi
tRng Transfor"Group -ut &C&h thv&h hRp. Cjng viE& &!Qi &_ng &wa
phng tha& pr0&'**2ti-!1!* 1D thiJt 1p 1ei &C& trigg'r.
Tr0ng vv (b nD3+ trigg'r 1!jn 1!jn R& thiJt 1p 1ei (i tC& ung &wa
phv- @]-. Behaviour &x thT tha3 i &C& trigg'r &wa -nh the- &hv tr0ng
*!Qt thzi gian h0et ng &W! Behaviour T tha3 i &C& hDnh vi.
Tr0ng vv (b (i s3 gxi Nava.a?t.'v'nt (_ng T ,G 1H tng tC& vi
@Dn phv-. )xi Nava.!ti1.'n!-'rati0n &n thiJt T giWi - Qi tRng
La;'!p0nC0n(iti0n
httpBOOtai1i'!ha3.&0-
702
Lp trnh ha trn Java 2D v 3D
// 0imp*eBeha.ior/pp renders a sing*e, rotated
cube.
public class 0imp*eBeha.ior/pp extends /pp*et Q
public class 0imp*eBeha.ior extends Beha.ior
Q
private Transform%roup targetT%'
private Transformf) rotation = new
Transformf)(&'
private double ang*e = +.+'
// create 0imp*eBeha.ior X set T% ob\ect
of change
SimpleBehavior(Transform%roup targetT%& Q
this.targetT% = targetT%'
2
// initia*ize the Beha.ior
// set initia* waWeup condition
// ca**ed when beha.ior becomes *i.e
public void initialize(& Q
// set initia* waWeup condition
this.waWeup-n(new
VaWeup-n/VT!.ent(te,!.ent.t!Y"$!00!)&&'
2
// ca**ed b, va.a f) when appropriate
stimu*us occurs
httpBOOtai1i'!ha3.&0-
705
Lp trnh ha trn Java 2D v 3D
public void processStimulus(!numeration
criteria& Q
// do what is necessar, in response
to stimu*us
ang*e k= +.O'
rotation.rotY(ang*e&'
targetT%.setTransform(rotation&'
this.waWeup-n(new
VaWeup-n/VT!.ent(te,!.ent.t!Y"$!00!)&&'
2
2
2// end of c*ass 0imp*eBeha.ior
Lp 2i-p1'Behaviour#pp &h th`& hin nhZng &ha& nVng &hvnh &n
thiJt &wa -ut Behaviour n giWn. Ch!ng* ta &x thT phCt triTn thI- &C&
&ha& nVng ph0ng ph hn+ vv (b ta &x thT ,'t gx& !a3 &wa trb& !a3 &x
thT R& tha3 i @yi &C& phng tha& &wa 1p.
/ut iT- T phCt triTn nsng &]p 1D ;h^& phb& hin tRng trDn &wa gx&
nghiIng.
ShZng *ai 1- tr0ng viE& viJt -ut 1p Behaviour
F!In viE& thiJt 1p vD r'*'t 1ei Behaviour trigg'r
ihjng trW v" tt phng tha& &wa 1p Behaviour
/ut i"! hiTn nhiIn 1D nJ! ;hjng thiJt 1ep trigg'r th hDnh vi *Y ;hjng thT
th`& hiEn R&. Sg0Di ra trigg'r &ng &Dn phWi R& r'*'t tr& ;hi hDnh
ung tiJp th'0 1p 1ei.
ihi &W hai phng tha& initi1iati0n vD pr0&'**2ti-!1!* R& gi @yi
hE thQng Java5D+ &C& hD- nD3 phWi trW v" T &h0 phcp viE& tj trCt R&
tiJp tb&. L]3 vv (b+ ;hi hDnh vi !a3 trdn R& gi+ gx& !a3 vD Qi tRng
Transfor"Group &n R& &p nht -ut &C&h Unh ;.
httpBOOtai1i'!ha3.&0-
707
Lp trnh ha trn Java 2D v 3D
-.%.% Sz dSn$ "et Np Behaviour
Tr0ng phn nD3 &hng ta *Y t- hiT! viE& thI- vD0 hDnh vi &W! Qi
tRng tr0ng &hng trnh.
>& (! tiIn T thI- vD0 hDnh vi @a0 g- viE& &h^& &h^n thU
;h!ng &Wnh &x *` (` tr &h0 hDnh vi. Xv (b+ T *G (bng R& 1p
2i-p1'Behaviour#pp tr0ng phn trIn + tr0ng thU ;h!ng &Wnh phWi &x
&haa Qi tRng Transfor"Group R& &h!n @U T !a3. .]t nhi"!
Behaviour &h &n -ut Qi tRng Transfor"Group+ tr0ng ;hi x thU
;h!ng &Wnh di hi -ut Behaviour 1D ang (bng vD Behaviour phb th!u&.
ThiJt 1p *` h\ trR &W! -ut Behaviour+ -ut thT hiEn &wa 1p
Behaviour phWi R& thI- vD0 thU ;h!ng &Wnh.Tr0ng th`& tJ -ut Qi
tRng Behaviour ;hjng phWi 1D -ut phn &wa thU ;h!ng &Wnh vD *Y try
thDnh rC& vD R& (n (p @yi gar@ag' &011'&ti0n.
>& &!Qi &_ng T thI- vD0 -ut Behaviour 1D &!ng &]p -ut ;h!ng
1U&h &h0 Behaviour. [T nsng &]p 1D- viE& hiE! !W hn+ Java5D *G (bng
;h!ng 1U&h T th`& hiEn ','&!ti0n &!11ing.>hv &h tr y n In a&tiv' ;hi
;h!ng 1U&h &wa nx gia0 vi *` h0et ung &wa Xi'?P1at60r-. Ch &x nhZng
Behaviour a&tiv' -i &x ;Wh nVng nhen R& &C& tC& nhsn ;v&h thv&h.
Tr0ng trzng hRp x+ &C& tC& nhsn &x thT @U -ut *Q Behaviour @
!a.Sgzi 1p trnh &n !Wn 1H *` &hn 1& tr0ng *!Qt !C trnh &hn 1`a
1U&h &wa &C& Behaviour.
CC& @& *G (bng -ut Behaviour
1.Ch!n @U thU ;h!ng &Wnh
2.Th'- Behaviour vD0 thU ;h!ng &Wnh+ tha- &hiJ! (Jn Qi
tRng &n &h!3Tn ung+ tha3 i
5.rC& Unh -ut ;h!ng 1U&h f2&h'(!1ing>0!n(ingL'a6g
7.[& vD ghi &C& ;hW nVng &h0 Qi tRng v&h
httpBOOtai1i'!ha3.&0-
709
Lp trnh ha trn Java 2D v 3D
Xv (b (i s3 -j tW &C& @& *G (bng -ut Behaviour nh trnh
@D3 y trIn
public Branch%roup createSceneGraph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transform%roup ob\$otate = new
Transform%roup(&'
ob\$otate.setCapabi*it,(Transform%roup./NN-V"T$/#
0d-$M"V${T!&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(new Co*orCube(+.s&&'
0imp*eBeha.ior m,$otationBeha.ior = new
0imp*eBeha.ior(ob\$otate&'
m,$otationBeha.ior.set0chedu*ingBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(m,$otationBeha.ior&'
// Net va.a f) perform optimizations on
this scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2
httpBOOtai1i'!ha3.&0-
70:
Lp trnh ha trn Java 2D v 3D
Knh trIn -j tW -Qi !an hE giZa Qi tRng Behaviour vD Qi tRng
&hU! *` tha3 i. Qi tRng Transfor"Group. Xv (b &wa &hng ta nh-
th`& hiEn !a3 -ut C010rC!@'+ nhng 1p Behaviour ;hjng &h gi0i
hen nh v3 + ta &x th !a3 @]t ; Qi tRng nD0 1D &0n &wa Qi tRng
Transfor"Group. Xv (b trIn &h &x H (Unh 1D iT- ;hyi ! &h0 !C tnh6
1D- viE& vxi Behaviour+ &ha ;hjng &x H Unh th`& hiEn nhZng ;hW nVng
&x thT &wa Behaviour.
4h?ng sai l>+ trong vi@& sX ding 7i t89ng Kehaviour
Tr0ng @a @& *G (bng 1p Behaviour + hai @& th!?dng gs3 nhD-
1n *ai *xtB
ihjng &h Unh ;h!ng 1U&h
ihjng thI- Qi tRng Behaviour vD0 tr0ng thU ;h!ng &Wnh
/ut i"! &h H 1D &hng ta nIn &h H hen &hJ viE& te0 1U&h &h0 -\i Qi
tRng Behaviour &Dng vt &Dng tQt T W- @W0 &h0 hiE! nVng &wa t0Dn hE
thQng.
[t Qi tRng Behaviour vD0 thU ;h!ng &Wnh
Behaviour &x thT R& thI- vD0 @]t &a a! tr0ng thU ;h!ng &Wnh.
TiI! &hv 1`a &hn vU trv thI- Qi tRng Behaviour vD0 thU ;h!ng &Wnh
phb th!u& vD0 &C& 3J! tQB hiE! !W &wa vU'& t 1U&h+ @W0 tr &0('.
Tr0ng thU ;h!ng &Wnh te0 @yi 2i-p1'>'havi0!r#pp+ Qi tRng
2i-p1'>'havi0!r vD Qi tRng C010rC!@' ;h0ng n- tr0ng &_ng -ut hE
ta u Ua phng.
httpBOOtai1i'!ha3.&0-
70<
Lp trnh ha trn Java 2D v 3D
[Qi tRng Transfor"Group &hv &x tC& (bng !a3 Qi tRng
C010rC!@' v v3 ;h!ng 1U&h &wa (i -3.0tati0n>'havi0!r 1!jn vnh ;-
Qi tRng C010rC!@' &h0 phcp viE& tng tC& vi Qi tRng C010rC!@'
;hi nx vi*i@1'. D_ *a0+ n"! Qi tRng Transfor"Group R& (_ng T
@iI& (U&h Qi tRng C010rC!@'+ ;hi (x Qi tRng C010rC!@' &x thT @U
(U&h &h!3Tn ra ng0Di &wa ;h!ng nhn. ihi Qi tRng @0!n( n- tr0ng
thU ;h!ng &Wnh &_ng vi Qi tRng Behaviour+ ngzi (_ng &x thT &x ;hW
nVng tiJp tb& @iIn (U&h Qi tRng x.
/ikn 1D *` ;v&h h0et !W vi'? vn gia0 vi ;!ng 1U&h &wa Qi tRng
Behaviour+ 1& x Qi tRng Behaviour vn &dn a&tiv'.
Chng ta &x thT tng tC& vi Qi tRng tr`& !an ;hjng n- tr0ng
vi'?.X]n " 1D nJ! nh 1& 0 vi'? tha3 i vD ;hjng &dn gia0 vi
;h!ng ;J h0e&h &wa &wa Qi tRng Behaviour + ;hi x Qi tRng
Behaviour 1D ;hjng a&tiv'. Sh v3 ;hi x Qi tRng &hng ta -!Qn
tng tC& &x thT vn ant- trng vi'? nhng ;hjng a&tiv'. Cx hai giWi
phCp &h0 v]n " nD3. /ut 1D &hng ta tha3 i thU ;h!ng &Wnh T vn
giZ R& ;h!ng 1U&h &wa Qi tRng Behaviour vi Qi tRng tr`& !an.
[i"! nD3 &x th th`& hiEn R& trn vn th'0 hnh (i s3. Phng
phCp tha hai 1D *G (bng Qi tRng >0!n(ingL'a6 &h0 ;h!ng 1U&h. Chng
ta *Y ,'- ,ct 1p >0!n(ingL'a6 nD3 tr0ng phn 5.<
httpBOOtai1i'!ha3.&0-
70=
Lp trnh ha trn Java 2D v 3D
UhVng chN )hi xW& '?ng lSp Kehaviour
[i"! &n &h H ;hi viJt -ut Behaviour 1D hiE! nVng &wa hE thQng.
/ut Behaviour ;hjng tQt *Y 1D- giW- hi! nVng &wa !C trnh tj
trCt.&ha& nVng. /ut i"! &n &h H ;hi viJt -t Behaviour 1DB -'-0r3
@!rnvD nhZng trigg'r i"! ;iEn ;hjng &n thiJt.
/'-0r3 @!rn 1D th!t ngZ (_ng T &h viE& te0 ra nhZng Qi tRng
;hjng &n thiJt tng Java. XiE& *G (bng @u nh !C -a& +*Y Wnh h!?dng
Jn !C trnh gar@ag' &011'&ti0n vD !C trnh j trCt *Y @U (ng 1ei. CC&
phng tha& &wa 1p Behaviour th!?dng gs3 ra v]n " -'--0r3 @!rn.
Xv (b nh 0en - tng 7P1+ phng tha& pr0&'**2ti-!1!* *G (bng t0Cn
tG n'? tr0ng ! C tr nh g i ?a;'!pMn. i "! n D3 ;hi Jn &h0 - ut Qi
tRng -i R& te0 ra -\i ;hi phng tha& nD3 R& gi+ Qi tRng nD3
try thDnh rC& -\i 1n Behaviour R& ;v&h h0et.
T!3 nhiIn viE& ,C& Unh vD trCnh ,W3 ra -'--0r3 @!rn thzng ;hC
(k (Dng.
Xv (b tr0ng 0en &0(' 7P5+ tha3 @ng viE& ;hyi te0 -ut Qi tRng -i+
&hng ta *Y *G (bng 1ei Qi tRng &. Tr0ng phn nD3 &hng ta ,'- ,ct
;Wh nVng T thiJt 1p &C& i"! ;iEn trigg'r nh- ;v&h h0e& &C& Behaviour
tr0ng -\i ;h!ng &wa !C trnh tj trCt. SJ! nh ;hjng &x tC& nhsn g ;v&h
h0et Behaviour+ *Y 1D ;hjng &n thiJt nJ! &hng ta gi Jn phng tha&
pr0&'**2ti-!1!*.
-.%.* CMc h" !P. tron$ Np Behaviour
Tr0ng phn nD3 &hng ta *Y t- hiT! &hi tiJt v" &C& hD- #P$ &wa 1p
Behaviour.
LD -ut 1p & *y trt! tRng+ 1p Behaviour &Dn R& thta ;J tr& ;hi
;hyi te0 -ut Qi tRng Behaviour.
httpBOOtai1i'!ha3.&0-
709
Lp trnh ha trn Java 2D v 3D
Tr0ng gxi tiEn v&h &wa Java5D &x *n r]t nhi"! &C& 1p Behaviour. [x
1D &C& 1p &0n &wa L'a6+ thT hiEn &wa -ut 1p thta ;J 1p Behaviour 1D
&0n &wa -ut nhx- tr0ng thU ;h!ng &Wnh.
CC& phng tha& pr0&'**2ti-!1!* vD initia1iati0n &!ng &]p -ut ga0
(iEn T &hng Java5D &x thT hRp tC& &C& Behaviour* tr0ng ;hjng gian
W0. CC& phng tha& ;hC& &wa 1p Behaviour & trnh @D3 tr0ng @Wng
(i s3. Phng tha& ?a;'Mn R& (_ng tr0ng hai phng tha&
initia1iati0n vD pr0&'**2ti-!1!* T thiJt 1p trigg'r &h0 Behaviour.Tha-
*Q ! vD0 &wa phng tha& nD3 1D Qi tRng AakeupCondition . Lp
AakeupCondition vD &C& 1p 1iIn !an *Y R& trnh @D3 tr0ng phn
7.5.
Phng tha& p0*t$( &h0 phcp -ut Behaviour &x thT gia0 tiJp vi &C&
phng tha& ;hC&. /u tr0ng nhZng i"! ;iEn ?a;'!p 1D
La;'!pMn>'havi0rP0*t. [Qi tRng Behaviour &x thT *G (bng phng
tha& p0*t$( T te0 ra *` &ung tC& vi i"! ;iEn La;'!pMn>'havi0rP0*t
thv&h hRp. Chng ta ,'- ,'- ,ct 1p a;'!pMn>'havi0rP0*t &hi tiJt hn
tr0ng -b& 7P1:.
httpBOOtai1i'!ha3.&0-
710
Lp trnh ha trn Java 2D v 3D
Phng tha& *'t%na@1' &h!ng &]p -ut &C&h tha& T vj hiE! h0C -ut
Behaviour th- &hv nga3 &W ;hi @0!n(* 1D- &h0 nx a&tiv'. )iC trU -&
Unh 1D tr!' fQi tRng Behaviour R& 'na@1'g
/ut Qi tRng Behaviour &h a&tiv' ;hi ;h!ng t 1U&h &wa nx gia0
vi !C tnh hat ung &wa vi'?.Tng -ut ;hjng gian W0+ &hng ta &x th
&x nhi"! vi'?+ -ut Behaviour &x thT R& a&tiv' @yi nhi"! vi'?.
Phng tha& g'tXi'? r]t hiE! !W vi Behaviour (`a trIn thjng tin
&wa -\i Xi'? f>i11>0ar(+ LMD..g vD Qi vi nhZng Behaviour nxi &h!ng
&h!ng. Phng tha& nD3 trW v" tha- &hiJ! ti Qi tRng Xi'? &hvnh hiEn
ang R& ;Jt hRp vi Behaviour x. Chng ta ;hjng &x phng tha&
*'tXi'?.
[Qi tRng Xi'? &hvnh R& Unh nghha 1D Qi tRng Xi'? ! tiIn
& g^n ;- vi Xi'?P1at60r-+ nJ! &hng ta &x nhi"! Xi'? a&tiv'.
X v3 -ut hDnh vi >i11@0ar( pah hng ti vi'? &hvnh+ tr0ng trzng
hRp &x nhi"! vi'? tr0ng &_ng -ut thU ;h!ng &Wnh.
CMc h" !P. cga Cie1Patfor"
CC& Behaviour &h a&tiv' f&x ;hW nVng ;v&h h0et R&g &h ;hi ;h!ng
1U&h &wa nx gia0 vi !C trnh h0et ung &wa Xi'?P1at60r- .
Behavior /ethod Su""ar'
>'havi0r i* an a@*tra&t &1a** that &0ntain* th' 6ra-'?0r; 60r a11
@'havi0ra1 &0-p0n'nt* in Java 5D.
Cie1 $etCie1<=
.'t!rn* th' pri-ar3 vi'? a**0&iat'( ?ith thi* @'havi0r.
void initiai4e<=
$nitia1i' thi* @'havi0r.
void post.d<int post.d=
P0*t th' *p'&i6i'( $(.
void processSti"uus<0ava.uti.)nu"eration criteria=
httpBOOtai1i'!ha3.&0-
711
Lp trnh ha trn Java 2D v 3D
Pr0&'** a *ti-!1!* -'ant 60r thi* @'havi0r.
void set)na,e<,ooean state=
%na@1'* 0r (i*a@1'* thi* >'havi0r.
void setScheduin$Boundin$Leaf<Boundin$Leaf re$ion=
2't th' >'havi0r* *&h'(!1ing r'gi0n t0 th' *p'&i6i'( @0!n(ing 1'a6.
void setScheduin$Bounds<Bounds re$ion=
2't th' >'havi0r* *&h'(!1ing r'gi0n t0 th' *p'&i6i'( @0!n(*.
void 1akeupFn<AakeupCondition criteria=
Cie1Patfor" /ethod Su""ar' <partia ist=
Th'*' -'th0(* 06 th' Xi'?P1at60r- &1a** g't an( *'t th' a&tivati0n
v01!-' f*ph'r'g ra(i!*. D'6a!1t a&tivati0n ra(i!*
:2.
foat $et!ctivation#adius<=
)'t th' Xi'?P1at60r-* a&tivati0n ra(i!*.
void set!ctivation#adius<foat activation#adius=
2't th' Xi'?P1at60r-* a&tivati0n ra(i!* ?hi&h ('6in'* an a&tivati0n
v01!-' ar0!n( th' vi'? p1at60r-.
..< hiC9 (i4n (Xch h%`tA *2ch (Xch h%`t c2c h3nh vi
ShZng a&tiv' Behaviour R& ;v&h h0et @yi *` ;iEn &wa -ut ha3
nhi"! tC& nhsn ;v&h h0et. tC& nhsn ;v&h h0et. TC& nhsn ?a;'!p &h0 -ut
Behaviour R& ,C& Unh *G (bng 1p &0n &wa 1p AakeupCondition .
Lp & *y trt! tRng+ 1D & *y &wa t]t &W &C& 1p ?a;'!p tr0ng
Java5D. Cx 9 1p thta ;J 1p AakeupCondition + -ut tr0ng *Q (x 1D 1p
& *y trt! tRng AakeupCriterion+ &C& 1p &dn 1ei ;Jt hRp nhi"4 i"!
;iEn ?a;'!p tr0ng -ut i"! ;iEn ?a;'!p (!3 nh]t.
httpBOOtai1i'!ha3.&0-
712
Lp trnh ha trn Java 2D v 3D
/ut i"! ;iEn ?a;'!p &wa -ut Qi tRng Behaviour R& ,C& Unh
nh 1D *` ;Jt hRp &wa &C& i"! ;hiEn ;hC& *G (bng 1p ;Jt hRp ?a;'!p
thv&h hRp. Phn tiJp th'0 &hng ta -j tW 1p AakeupCondition vD &C&
1p &0n &wa nx.
-.*.( Gi\u kiPn kmch holt
Lp AakeupCondition &!ng &]p hai phng tha&.Phng tha& !
tiIn+ a11%1'-'nt*+ trW v" (anh *C&h 1iEt ;I &C& tC& nhsn ?a;'!p &wa Qi
tRng AakeupCondition . Phng tha& &dn 1ei+ trigg'r'(%1'-'nt*+ 1i Et
; I nh Zng t C& nh sn ?a;'!p &x thT ;v&h h0et Behaviour. Phng tha&
nD3 &x thT r]t hZ! hiE! tr0ng phng tha& pr0&'**2ti-!1!*.
AakeupCondition /'th0( 2!--ar3
Th' AakeupCondition a@*tra&t &1a** i* th' @a*' 60r a11 ?a;'!p &1a**'*.
$t pr0vi('* th' 60110?ing t?0 -'th0(*.
%n!-'rati0n a11%1'-'nt*fg
httpBOOtai1i'!ha3.&0-
715
Lp trnh ha trn Java 2D v 3D
.'t!rn* an 'n!-'rati0n 06 a11 AakeupCriterion 0@N'&t* in thi*
C0n(iti0n.
%n!-'rati0n trigg'r'(%1'-'nt*fg
.'t!rn* an 'n!-'rati0n 06 a11 trigg'r'( AakeupCriterion 0@N'&t* in thi*
C0n(iti0n.
-.*.% AakeupCriterion
AakeupCriterion 1D phng tha& trt! tRng &h0 phcp 17 !3 Unh
1p tC& nhsn ?a;'!p. AakeupCondition &h &!ng &]p -ut phng tha&
(!3 nh]tB ha*Trigg'r'(. Chng ta ;hjng &n thiJt phWi *G (bng phng
tha& nD3+ v phng tha& trigg'r'(%1'-'nt* &wa 1p AakeupCondition
th`& hiEn i"! nD3 hu &hng ta.
AakeupCriterion /'th0( 2!--ar3
@001'an ha*Trigg'r'(fg
.'t!rn* tr!' i6 thi* &rit'ri0n trigg'r'( th' ?a;'!p.
-.*.* 6u' Hnh Np AakeupCriterion
Tr0ng @Wng 7P2 a ra !3 Unh 17 1p AakeupCriterion. ShZng
1p nD3 R& *` (bng T ,C& Unh nhZng i"! ;iEn ?a;!p &h0 Qi tRng
Behaviour. ThT hiEn &wa nhZng 1p nD3 R& *G (bng -ut &C&h u& 1p
ha3 tr0ng viE& *G (bng ;Jt hRp &C& i"! ;iEn ?a;'!p tr0ng &C& 1p
nxi tr0ng -b& tr&.
Chng ta *Y ,'- ,ct &hi tiJt &C& 1p nD3 tr0ng nga3 *a! s3. C
nhZng 1p &h g- nhZng hD- #P$ n giWn+ 1p La;'!pMn#&tivati0n
&h &x -ut hD- te0 (!3 nh]t. Tha- *Q ;h!ng 1U&h &wa &C& i"! ;iEn
?a;'!p R& &h Unh tr0ng Qi tRng Behaviour tng ang.
httpBOOtai1i'!ha3.&0-
717
Lp trnh ha trn Java 2D v 3D
bhEn$ ch xun$ xuanh AakeupCriterion
/ut *Q 1p AakeupCriterion R& ;v&h h0et nga3 tr0ng 6ir*t
('t'&ti0n &wa -ut *` ;iEn. ["! nD3 &x nghha 1D tC& nhsn *Y &h -ut 1n
;v&h h0et @yi *` ;iEn. Xv (b Qi tRng La;'!pMn#&tivati0n *Y ;v&h h0et
*` gia0 nha! giZa !C trnh vn ung &wa Xi'?P1at60r- vD v_ng ;!ng
1U&h &wa Qi tRng Behaviour. ihi *` gia0 nha! nD3 vn &dn+
AakeupCondition *Y ;hjng ;v&h h0et thI- -ut nD0 nZa. [$"! tng t`
&ng ng vi -ut (3 &C& 6ra-' *a! x &h0 Jn ;hi Java5D nhn @iJt
R& *` tha3 i !C trnh gia0 nha!+ th AakeupCondition -i &x thT
;v&h h0et 1n tiJp th'0.
Ta &x nhZng 1p AakeupCriterion th'0 ttn &p f%ntr3O%,it ha3
#&tivati0nO D'a&tivati0ng. ShZng nhsn tQ nD3 &h ;v&h h0et -ut &C&h ,'n
;Y giZa t!ntg &p %ntr3 h0& #&tivati0n.
AakeupFn!ctivation
SJ! ;h!ng 1U&h gia0 vi !C trnh a&tiv' &wa Xi'?P1at60r- tr0ng -ut
thzi gian w ng^n th r]t &x thT 1D nx ;hjng R& nhn ra. ihi x &W
#&ivati0n vD D'a&tivati0n "! ;h0ng R& ;v&h h0et. tr0ng nhZng trzng
hRp nh v3+ Behaviour *Y ;hjng try nIn a&tiv'.
AakeupFn!ctivation Constructor Su""ar'
',t'n(*B AakeupCriterion
C1a** *p'&i63ing a ?a;'!p 0n 6ir*t ('t'&ti0n 06 a Xi'?P1at60r-*
a&tivati0n v01!-' int'r*'&ti0n ?ith thi* 0@N'&t*
*&h'(!1ing r'gi0n. La;'!pMn#&tivati0n i* pair'( ?ith
La;'!pMnD'a&tivati0n ?hi&h app'ar* 0n pag' 7P21.
AakeupFn!ctivation<=
C0n*tr!&t* a n'? La;'!pMn#&tivati0n &rit'ri0n.
AakeupFn!AT)vent
httpBOOtai1i'!ha3.&0-
719
Lp trnh ha trn Java 2D v 3D
Shi"! 1p AakeupCriterion th`& hiEn ;v&h h0et tr0ng nhZng hD-
te0 vD &C& phng tha& -ut &C&h phb th!u&.
Xv (b La;'!pMn#LT%v'nt &x 2 hD- te0 vD -ut phng tha&. KD-
te0 &h0 phcp ,C& Unh &C& *` ;iEn #LT nh]t Unh @ng &C&h *G (bng &C&
hn &wa 1p #LT. Phng tha& &dn 1ei trW v" -Wng &C& *` ;iEn #LT 1iIn
tb& nha! R& ;v&h h0et @yi trigg'rO
AakeupFn!AT)vent Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut Behaviour R& ;v&h h0et @yi -ut *` ;iIn #LT
AakeupFn!AT)vent<int !AT.d=
ihyi te0 -ut Qi tRng La;'!pMn#LT%v'nt -i+ tr0ng x #LT$( 1D
-ut tr0ng &C& hng *Q
i'3%v'nt.i%|T|P%D+
i'3%v'nt.i%|P.%22%D+ i'3%v'nt.i%|.%L%#2%D+
/0!*'%v'nt./M42%CL$Ci%D+
/0!*'%v'nt./M42%P.%22%D+ /0!*'%v'nt./M42%.%L%#2%D+
/0!*'%v'nt./M42%/MX%D+
/0!*'%v'nt./M42%D.#))%D+ 0r 0n' 06 -an3 0th'r 'v'nt va1!'*.
AakeupFn!AT)vent<on$ event/ask=
ihyi te0 -ut Qi tRng La;'!pMn#LT%v'nt *G (bng M.'(
%X%ST/#2i+vD #LT %X%ST/#2i vi &C& giC trUB
B i%|%X%ST/#2i+ /M42%%X%ST/#2i+
/M42%/MT$MS%X%ST/#2i+ h0& &C& giC trU ;hC&.
AakeupFn!AT)vent /ethod Su""ar'
!AT)ventvw $et!AT)vent<=
httpBOOtai1i'!ha3.&0-
71:
Lp trnh ha trn Java 2D v 3D
TrW vT -ut -Wng &C& *` ;iIn #LT 1iIn tiJp+ nhZng *` ;iEn ;v&h h0et 1p
La;'!pMn#LT%v'nt .
AakeupFnBehaviorPost
Lp La;'!pMn>'havi0rP0*t &_ng vi phng tha& th' p0*t$D &wa
1p >'havi0r &!ng &]p -ut ; th!t !a x -ut hDnh vi &x thT R& th`&
hiEn./ut Qi tRng >'havi0r &x thT p0*t a ra -ut giC tri $D f;iT! *Q
ng!3Ing. CC& Behaviour ;hC& &x thT ,C& Unh R& i"! ;iEn ;v&h h0et
&wa nx+ *G (bng $D &wa -ut Behaviour ,C& Unh. [i"! nD3 &h0 phcp
&hng ta &x thT te0 ra -ut Behaviour -y &Ga ra vD0+ vD -ut Behaviour
;hC& xng &Ga. Xi &C&h tha& nh v3 nga3 &W nhZng Behaviour pha&
tep &hng ta &x thT ,s3 (`ng -ut &C&h tng t` nh vs3+ ;Jt hRp
Behaviour vi p0*t $D.
AakeupFnBehaviorPost Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut Behaviour R& ;v&h h0et ;hi -ut Qi tRng
Behaviour ;hC& a ra -ut *` ;iEn
AakeupFnBehaviorPost<Behavior ,ehavior@ int post.d=
ihyi te0 -ut Qi tRng La;'!pMn>'havi0rP0*t
D0 AakeupCondition &x thT &haa nhi"! Qi tRng
AakeupCriterion+ @a0 g- nhi"! hn 1 La;'!pMn>'havi0rP0*t+
phng tha& T ,C& Unh r &C& trigg'ring p0*t &aDn thiJt &h0 *` ;iEn
trigg'r.
httpBOOtai1i'!ha3.&0-
71<
Lp trnh ha trn Java 2D v 3D
AakeupFnBehaviorPost /ethod Su""ar'
Behavior $etBehavior<=
TrW v" Behaviour ,C& Unh R& thiJt 1p tr0ng hD- te0 &wa Qi tRng
int $etPost.d<=
Shn p0*t$( ,C& Unh &wa AakeupCriterion
Behavior $etTri$$erin$Behavior<=
TrW v" @'havi0r R& ;v&h h0et @ng tC& nhsn.
int $etTri$$erin$Post.d<=
TrW v" thjng tin p0*t$( ;v&h h0et Behaviour
[0en &0(' (i s3 &wa -ut &h!?0ng trnh n giWn *G (bng
Behaviour p0*ting T hRp tC& &C& Behaviour. Xv (b -y vD xng &Ga ra
vD0. ng (bng @a0 g- -ut 1pB Mp'nBehaviour+ vD an &0(' te0 ra
hai Qi tRng Behaviour. [Qi tRng tha hai 1D thT hiEn &wa
C10*'Behaviour+ h0Dn t0Dn giQnh hEt Mp'nBehaviour. Tr0ng 1p
C10*'Behaviour+ i"! ;iEn trC0 i tr0ng phng tha& initia1iati0n fvD
Behaviour ngR& 1ei R& th`& hiEng
public class -penBeha.ior extends Beha.ior Q
private Transform%roup targetT%'
private VaWeupCriterion
pairostCondition'
private VaWeupCriterion waWeup#extdrame'
private VaWeupCriterion
/VT!.entCondition'
httpBOOtai1i'!ha3.&0-
71=
Lp trnh ha trn Java 2D v 3D
private Transformf) tf) = new
Transformf)(&'
private Matrixfd rotMat = new Matrixfd(&'
private double door/ng*e'
OpenBehavior(Transform%roup targetT%& Q
this.targetT% = targetT%'
/VT!.entCondition = new
VaWeup-n/VT!.ent(te,!.ent.t!Y"$!00!)&'
waWeup#extdrame = new
VaWeup-n!*apseddrames(+&'
2
public void
setBehaviorObjectPartner(Beha.ior beha.ior-b\ect&
Q
pairostCondition = new
VaWeup-nBeha.iorost(beha.ior-b\ect, O&'
2
public void initialize(& Q
this.waWeup-n(/VT!.entCondition&'
door/ng*e = +.+'
2
httpBOOtai1i'!ha3.&0-
719
Lp trnh ha trn Java 2D v 3D
public void processStimulus(!numeration
criteria& Q
if
(criteria.next!*ement(&.ebua*s(pairostCondition&
& Q
0,stem.out.print*n(^read, to
open door^&'
this.waWeup-n(/VT!.entCondition&'
door/ng*e = +.+f'
2 else Q // cou*d be te,ress or
nextdrame, in either casen open
if (door/ng*e Z O.u& Q
door/ng*e k= +.O'
if (door/ng*e q O.u&
door/ng*e = O.u'
// get rotation and sca*e
portion of transform
targetT%.getTransform(tf)&'
tf).get$otation0ca*e(rotMat&'
// set ,Xaxis rotation to
door/ng*e
// (c*obber an, pre.ious ,X
rotation, x and z sca*e&
rotMat.m++ =
Math.co$(door/ng*e&'
rotMat.m(( = rotMat.m++'
httpBOOtai1i'!ha3.&0-
720
Lp trnh ha trn Java 2D v 3D
rotMat.m+( =
Math.$in(door/ng*e&'
rotMat.m(+ = XrotMat.m+('
tf).set$otation(rotMat&'
targetT%.setTransform(tf)&'
this.waWeup-n(waWeup#extdrame&'
2 else Q // finished opening
door, signa* other beha.ior
0,stem.out.print*n(^door is
open^&'
this.waWeup-n(pairostCondition&'
post{d(O&'
2
2
2
2 // end of c*ass -penBeha.ior
C0(' 7P7B 2G (bng 1p Mp'nBehaviour vD C10*'Behaviour
[Qi tRng &wa hai 1p nD3 *Y tha3 phiIn nha! phWn hi vi tC& nhsn
phv- @]-.[Qi tRng 0p'n @'havi0r *Y trW 1zi 1ei ;v&h h0et phv- @]- !
tiIn ng thzi nx Cnh (]! &h0 Qi tRng &10*' Behaviour @iJt vD thiJt
1p i"! ;iEn trigg'r &wa nx T &x thT `0& Qi tRng &10*' Behaviour
nhsn @iIt.[Qi tRng 0p'n @'havi0r -y &Ga T trW 1zi 1ei tC& nhsn phv-
@]-.[Qi tRng &10*' @'havi0r thiJt 1p trigg'r &wa nx nh 1D -ut phv-
@]- T trW 1zi 1ei tvn hiE! tt Qi tRng 0p'n Behaviour
httpBOOtai1i'!ha3.&0-
721
Lp trnh ha trn Java 2D v 3D
Phv- @]- tiJp th'0 ;v&h h0et Qi tRng &10*'. [Qi tRng &10*' 1& 0
*Y th`& hiEn &ha& nVng tng t` Qi tRng 0p'n B gGi Jn -ut tvn hiE! vD
thiJt 1p 1ei i"! ;iEn ;v&h h0et &wa &hvnh nx.
[Qi tRng &10*' xng &Ga T trW 1zi *` ;iEn @]- phv-. TiJp x phv-
@]- tiJp th'0 &ng R& th`& hiEn tng t`. La;'!pMnC011i*i0n%ntr3
Java5D &x ;hW nVng t` ung nhn ra *` va &he- giZa &C& Qi tRng tr0ng
;hjng gian W0. Java5D &!ng &]p 5 1p AakeupCondition T ,G 1H *` va
&he- &wa &C& Qi tRngB
La;'!pMnC011i*i0n%ntr3+
La;'!pMnC011i*i0n/0v'-'nt+
La;'!pMnC011i*i0n%,it.
/ut La;'!pMnC011i*i0n%ntr3 *Y `0& ;v&h h0et ;hi -ut Qi tRng
1n ! va &he-. 2a! x La;'!pMnC011i*i0n/0v'-'nt *Y R& ;v&h
h0et tr0ng ;hi hai Qi tRng tr0ng va &he-
C!Qi &_ng -ut Qi tRng La;'!pMnC011i*i0n%,it *Y ;v&h h0et ;hi va
&he- ;Jt th& Java5D &h &x th !Wn 1H R& -ut va &he- &wa -ut Qi
tRng tei -ut thzi iT-. ShZng va &he- (ikn ra tr0ng ;h0Wng thzi gian
r]t ng^n &ng ;hjng R& nhn @iIt. /ut &C&h hRp 1H+ C011i*i0n%ntr3 vD
C011i*i0n%,it "! ;hjng `0& ;v&h h0et. F!C trnh nhen @iJt va &he-
C011i*i0n ('t'&ti0ntr0ng th`& tJ (ikn ra r]t pha& tep.D_ *a0 tr0n tDi 1iE!
nD3 &hng ta ;hjng i *s! vD0 &011i*i0n ('t'&ti0n+ &x thT tha- ;ah thI-
tr0ng Java5D #P$ *p'&i6i&ati0n.
7" tlo AakeupFnCoision)ntr'
Thta ;JB AakeupCriterion
Lp ,C& Unh va &he- ! tiIn &wa -ut Qi tRng ,C& Unh vi -ut Qi
tRng ;hC& tr0ng thU ;h!ng &Wnh.
AakeupFnCoision)ntr'<Bounds ar"in$Bounds=
httpBOOtai1i'!ha3.&0-
722
Lp trnh ha trn Java 2D v 3D
Te0 -ut Qi tRng La;'!pMnC011i*i0n%ntr3 -i.
AakeupFnCoision)ntr'<bode ar"in$bode=
Te0 -ut Qi tRng La;'!pMnC011i*i0n%ntr3 -i.
AakeupFnCoision)ntr'<bode ar"in$bode@ int speed7int=
Te0 -ut Qi tRng La;'!pMnC011i*i0n%ntr3 -i tr0ng x *p''(Kint
nhn -ut tr0ng &C& giC trUB 42%>M4SD2vD 42%)%M/%T.|
AakeupFnCoision)ntr'<SceneGraphPath ar"in$Path=
Te0 -ut Qi tRng La;'!pMnC011i*i0n%ntr3 -i vi giC trU *p''( hint 1D
42%>M4SD2 AakeupFnCoision)ntr'<SceneGraphPath
ar"in$Path@ int speed7int=
Te0 -ut Qi tRng La;'!pMnC011i*i0n%ntr3 -i vi giC trU *p''( hint 1D
42%>M4SD2 h0& 42%)%M/%T.|.
AakeupFnCoision)xit
AakeupFnCoision)xit Constructor Su""ar'
Thta ;J AakeupCriterion
Lp ,C& Unh ;hi -ut Qi tRng ,C& Unh ;Jt th& va &he- vi &C& Qi
tRng ;hC& tr0ng thU ;h!ng &Wnh
AakeupFnCoision)xit<Bounds ar"in$Bounds=
KD- te0 vi tha- *Q >0!n(
AakeupFnCoision)xit<bode ar"in$bode=
KD- te0 vi tha- *Q ar-ingS0('
AakeupFnCoision)xit<bode ar"in$bode@ int speed7int=
KD- te0 vi tha- *Q ar-ingS0('+*p''(Kin'
AakeupFnCoision)xit<SceneGraphPath ar"in$Path=
KD- te0 vi tha- *Qar-ingPath
httpBOOtai1i'!ha3.&0-
725
Lp trnh ha trn Java 2D v 3D
AakeupFnCoision)xit<SceneGraphPath ar"in$Path@ int
speed7int=
KD- te0 vi tha- *Q ar-ingPath+ *p''(Kint
AakeupFnCoision)xit /ethod Su""ar'
Bounds $et!r"in$Bounds<=
TrW v" Qi tRng >0!n( R& *G (bng tr0ng viE& ,C& Ung va &he-
SceneGraphPath $et!r"in$Path<=
TrW v" zng (n (_ng tr0ng va &he- ,C& Unh
Bounds $etTri$$erin$Bounds<=
TrW v" Qi tRng >0!n(* gs3 ra va &he-
SceneGraphPath $etTri$$erin$Path<=
TrW v" zng (n -j tW Qi tRng gs3 ra va &he-
AakeupFnCoision/ove"ent
AakeupFnCoision/ove"ent Constructor Su""ar'
Tht ;JB AakeupCriterion
Lp ,C& Unh ;hi Qi tRng ,C& Unh (i &h!3Tn tr0ng va &he- vi -ut Qi
tRng ;hC& tr0ng ;hjng gian W0
AakeupFnCoision/ove"ent<Bounds ar"in$Bounds=
KD- te0 La;'!pMnC011i*i0n/0v'-'nt
AakeupFnCoision/ove"ent<bode ar"in$bode=
KD- te0 La;'!pMnC011i*i0n/0v'-'nt
AakeupFnCoision/ove"ent<bode ar"in$bode@ int speed7int=
KD- te0 La;'!pMnC011i*i0n/0v'-'nt tr0ng x *p''(Kint nhn giC trUB
httpBOOtai1i'!ha3.&0-
727
Lp trnh ha trn Java 2D v 3D
42%>M4SD2 h0& 42%)%M/%T.|
AakeupFnCoision/ove"ent<SceneGraphPath ar"in$Path=
KD- te0 La;'!pMnC011i*i0n/0v'-'nt.
AakeupFnCoision/ove"ent<SceneGraphPath ar"in$Path@ int
speed7int=
KD- te0 La;'!pMnC011i*i0n/0v'-'nt+ tr0ng x *p''(Kint nhn -ut
tr0ng hai giC trUB 42%>M4SD2 h0& 42%)%M/%T.|
AakeupFnCoision/ove"ent /ethod Su""ar'
Bounds $et!r"in$Bounds<=
TrW v" Qi tRng @0!n(* `R& *G (bng tr0ng &011i*i0n &0n(iti0n.
SceneGraphPath $et!r"in$Path<=
TrW v" ng (n `0& *w (bng tr0ng &011i*i0n &0n(iti0n.
Bounds $etTri$$erin$Bounds<=
TrW v" Qi tRng >0!n(* gs3 ra va &he-
SceneGraphPath $etTri$$erin$Path<=
TrW v" zng (n gs3 ra va &he-.
AakeupFn&eactivation
AakeupFn&eactivation Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh va &he- ! tiIn ;hi !C trnh h0et ung &w Xi'?P1at60r-
;hjng &dn gia0 vi ;h!ng 1U&h &wa Qi tRng
AakeupFn&eactivation<=
KD- te0 Qi tRng La;'!pMnD'a&tivati0n
httpBOOtai1i'!ha3.&0-
729
Lp trnh ha trn Java 2D v 3D
AakeupFn)apsed+ra"es
[Qi tRng La;'!pMn%1ap*'(8ra-'* R& *G (bng T ;v&h h0et -ut
Qi tRng a&tiv' *a! -ut *Q 1Rng 6ra-' nh]t inh trji !a.
AakeupFn)apsed+ra"es Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut ;v&h h0et *a! -ut Q 1Rng 6ra-' nh]t Unh
AakeupFn)apsed+ra"es<int fra"eCount=
KD- te0 La;'!pMn%1ap*'(8ra-'*.
6ra-'C0!nt P 2Q 1!?ng &C& 6ra-'* -D Java 5D vY ra tr& ;hi ;v&h h0et
-ut Qi tRng Behaviour giC trU n &h0 @iJt *a0 n 6ra-' Behaviour *Y
!R& ;v&h h0et. giC trU 0 &h0 @iJt Behaviour *Y `0& ;v&h h0et nga3 *a!
6ra-' hiEn thzi.
AakeupFn)apsed+ra"es<int fra"eCount@ ,ooean passive= sne1 in
(.%t
KD- te0 La;'!pMn%1ap*'(8ra-'* vi tha- *Q 6ra-'C0!nt vD tha- *Q
pa**iv'
pa**iv' P &z &h (n &h0 @iJt ;hi nD0 Behaviour try nIn @U ung+ -ut
Behaviour &hw ung *Y 1D- &h0 hE thQng phWi &he3 -ut &C&h 1iI& tb& ;hi
-ut Behaviour @U ung nx &h0 phcp &C& *` ;iEn ;hC& gs3 ra 6ra-' !R&
&he3.
AakeupFn)apsed+ra"es /ethod Su""ar'
int $et)apsed+ra"eCount<=
TrW v" *Q 1ng &C& 6ra-'C0!nt
,ooean isPassive<= sne1 in (.%t
TrW v" treng thCi &wa &z @U ung.
httpBOOtai1i'!ha3.&0-
72:
Lp trnh ha trn Java 2D v 3D
AakeupFn)apsedTi"e
Java 5D ;hjng thT @W0 W- thzi gian &hvnh ,C& &wa trigg'r &h0 -ut tiI!
&h!n La;'!pMn%1ap*'(Ti-'.
AakeupFn)apsedTi"e Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut ?a;'!p *a! -ut ;h0ang thzi gian f-*g trji !a.
AakeupFn)apsedTi"e<on$ "iiseconds=
KD- te0 Qi tRng La;'!pMn%1ap*'(Ti-'
AakeupFn)apsedTi"e /ethod Su""ar'
on$ $et)apsed+ra"eTi"e<=
TrW v" thzi gian trji !a &wa AakeupCriterion
AakeupFnSensor)ntr'
Tr0ng Java 5D+ @]t ; thiJt @U inp!t nD0 fng0ei trt &h!ut vD @Dn phv-g
"! 1D -ut *'n*0r /\i *'n*0r &x -ut h0t*p0t R& ,C& Unh tr0ng hE
thQnh &wa *'n*0r. 2` gia0 nha! giZa h0t*pt &W! -jt *'n*0r vi -ut r'gi0n
&x thT R& nhn @iJt @yi 1p La;'!pMn2'n*0r%ntr3 vD
La;'!pMn2'n*0r%,it.
AakeupFnSensor)ntr' Constructor Su""ar'
Tht ;JB AakeupCriterion
Lp ,C& Unh -ut ?a;'!p tr0ng giai an ! tiIn nhn @iJt *` gia0 nha!
gia -ut *'n*0r nD0 x vi -ut @0!n(ar3 ,C& Unh
AakeupFnSensor)ntr'<Bounds re$ion=
httpBOOtai1i'!ha3.&0-
72<
Lp trnh ha trn Java 2D v 3D
KD- te0 Qi tRng La;'!pMn%ntr3.
AakeupFnSensor)ntr' /ethod Su""ar'
Bounds $etBounds<=
TrW v" @0!n( &wa Qi tRng ,C& Unh.
Sensor $etTri$$erin$Sensor<= sne1 in (.%t
TrW v" Qi tRng *'n*0r gs3 ra ?a;'!p.
AakeupFnSensor)xit
AakeupFnSensor)xit Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut ?a;'!p tr0ng giai 0en nhn @iJt ! tiIn ;hi ;hjng
&dn *` gia0 nha! giZa -ut Qi tRng *'n*0r tr& x vi -ut @0!n(ar3
,C& Unh.
AakeupFnSensor)xit<Bounds re$ion=
KD- te0 Qi tRng La;'!pMn%,it .
AakeupFnSensor)xit /ethod Su""ar'
Bounds $etBounds<=
TrW v" @0!n( &wa Qi tRng ,C& Unh.
Sensor $etTri$$erin$Sensor<= sne1 in (.%t
TrW v" Qi tRng 2'n*0r gs3 ra ?a;'!p.
AakeupFnTransfor"Chan$e
httpBOOtai1i'!ha3.&0-
72=
Lp trnh ha trn Java 2D v 3D
La;'!pMnTran*60r-Chang' r]t hiE! !W tr0ng viE& nhn @iJt tha3
i vU trv ha3 hng &wa &C& Qi tRng tr`& !an tr0ng thU ;h!ng &Wnh.
Lp nD3 *G (bng phng tha& p0*t$( T te0 ra &C& Behaviour hRp tC&.
[i"! nD3 & @iEt hiE! !W ;hi &hng ta -!Qn hRp tC& vi -ut Behaviour
R& ,s3 (`ng tr& x.
AakeupFnTransfor"Chan$e Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut ?a;'!p ;hi -ut Qi tRng tran*60r- tr0ng -ut nhx-
Transfor"Group ,C& Unh tha3 i.
AakeupFnTransfor"Chan$e<Transfor"Group node=
KD- te0 Qi tRng La;'!pMnTran*60r-Chang'.
AakeupFnTransfor"Chan$e /ethod Su""ar'
Transfor"Group $etTransfor"Group<=
TrW v" n0(' Transfor"Group *G (bng tr0ng AakeupCriterion
AakeupFnCie1Patfor")ntr'
F!C trnh nhn @iJt *` gia0 nha! &wa Xi'?P1at60r- vi -ut r'gi0n ,C&
Unh &x thT R& th`& hiEn @yi 1p La;'!pMnXi'?P1at60-%ntr3 vD 1p
La;'!pMnXi'?P1at60r-%,it.
AakeupFnCie1Patfor")ntr' Constructor Su""ar'
Thta ;JB AakeupCriterion
Lp ,C& Unh -ut ?a;'!p tr0ng 1n ! tiIn gia0 nha! &wa Xi'?P1at60r-
vi -ut @0!n(ar3 ,C& Unh.
AakeupFnCie1Patfor")ntr'<Bounds re$ion=
KD- te0 Qi tRng La;'!pMn%ntr3.
httpBOOtai1i'!ha3.&0-
729
Lp trnh ha trn Java 2D v 3D
AakeupFnCie1Patfor")ntr' /ethod Su""ar'
Bounds $etBounds<=
TrW v" @0!n( &wa Qi tRng ,C& Unh
AakeupFnCie1Patfor")xit
AakeupFnCie1Patfor")xit Constructor Su""ar'
Thta ;J B AakeupCriterion
Lp ,C& Unh -ut ?a;'!p tr0ng 1n ! tiIn ;hi Xi'?P1at60r- ;hjng &dn
gia0 nha! vi Qi tRng @0!n(ar3 ,C& Unh
AakeupFnCie1Patfor")xit<Bounds re$ion=
KD- te0 Qi tRng La;'!pMn%,it
AakeupFnCie1Patfor")xit /ethod Su""ar'
Bounds $etBounds<=
TrW v" @0!n( &wa Qi tRng ,C& Unh
-.*.- Thnh phn cga AakeupCondition
Shi"! Qi tRng AakeupCriterion &x thT R& ;Jt hRp g^n vi -ut
AakeupCondition *G (bng 7 1p R& gii thiE! tr0ng phn *a!. Kai
1p ! tiIn R& g^n 1i"n vD0 -ut AakeupCondition tt -ut tp
AakeupCriterion -t &C&h vt 1H.Lp tha @a vD 1p th t &h0 phcp ;Jt
httpBOOtai1i'!ha3.&0-
750
Lp trnh ha trn Java 2D v 3D
hRp &C& thT hiEn &wa hai 1p ! tiIn thDnh -ut Qi tRng
AakeupCondition pha& tep.
Aakeup!nd Constructor Su""ar'
',t'n(*B AakeupCondition
C1a** *p'&i63ing an3 n!-@'r 06 ?a;'!p &rit'ri0n 10gi&a113 #SD'(
t0g'th'r.
Aakeup!nd<AakeupCriterionvw conditions=
C0n*tr!&t* a n'? La;'!p#n( &0n(iti0n.
AakeupFr Constructor Su""ar'
',t'n(*B AakeupCondition
C1a** *p'&i63ing an3 n!-@'r 06 ?a;'!p &rit'ri0n 10gi&a113 M.'(
t0g'th'r.
Aakeup!nd<AakeupCriterionvw conditions=
C0n*tr!&t* a n'? La;'!pMr &0n(iti0n.
Aakeup!ndFfFrs Constructor Su""ar'
',t'n(*B AakeupCondition
C1a** *p'&i63ing an3 n!-@'r 06 La;'!pMr &0n(iti0n 10gi&a113 #SD'(
t0g'th'r.
Aakeup!ndFfFrs<AakeupFrvw conditions=
C0n*tr!&t* a n'? La;'!p#n(M6Mr* &0n(iti0n..
AakeupFrFf!nds Constructor Su""ar'
httpBOOtai1i'!ha3.&0-
751
Lp trnh ha trn Java 2D v 3D
',t'n(*B AakeupCondition
C1a** *p'&i63ing an3 n!-@'r 06 La;'!p#n( &0n(iti0n 10gi&a113 M.'(
t0g'th'r.
AakeupFrsFf!nds<Aakeup!ndvw conditions=
C0n*tr!&t* a n'? La;'!pMrM6#n(* &0n(iti0n.
... Lp 'ehavi%9r ti4n Xch ^ &G +3n phX!
Chng ta ,'- ,ct vi'?'r vi vU trv vD gx& ;hjng i. Tha3 i
vi'?'r 1D -ut ;hW nVng !an trng tr0ng r]t nhi"! ang (bng 5D. Java5D
&!ng &]p ;hW nVng tha3 i vU trv+ hng &wa vi'?'r. Tr0ng hnh (i s3
&hng ta &x thT th]3 n"n tran*60r-. SJ! nh tran*60r- tha3 i+ Wnh
h!?ng ti (U&h &h!3Tn h0& Unh hng 1ei h0& &wa vi'?'r. Tt !an
iT- nD3 &hng ta &x thT th]3 thiJt ;J & @Wn &wa tng tC& @Dn phv-B ta
&x -ut Qi tRng Behaviour tha3 i n"n vi'? T Cp 1ei tC& ung &wa
phv- @]-.
[s3 &hvnh &C&h -D 1D 1p tiEn v&h Java5D 1D- viE&. tr0ng phn &dn 1ei
&hng ta ,'- ,ct viE& *G (bng 1p tng tC& vi @Dn phv-.
httpBOOtai1i'!ha3.&0-
752
Lp trnh ha trn Java 2D v 3D
CMch dHch chu'Qn tron$ Si"pe_niverse
Lp 2i-p1'4niv'r*' vD &C& 1p 1iIn !an &!ng &]p -ut *` ;Jt hRp T
nhn R& Qi tRng Cie1Patfor"Transfor" 0@N'&t. Tt x &hng ta
&x thT (i &h!3Tn 2i-p1'4niv'r*'. [&@iEt an &0( (i s3 nhn R&
Cie1Patfor"Transfor" tt -ut Qi tRng 2i-p1'4niv'r*'
Transfor"Group vpt
*!.g'tXi'?ingP1at60r-fg.get`ie!latfor+,ransfor+ fg
-.-.( /et vm dS ;n $iJn
Xv (b i'3Savigat0r#pp *a! s3 n- tr0ng th -b&
',a-p1'*O$nt'ra&ti0n
Tr0ng &hng trnh nD3 &hng ta &x thT th]3 R& &C& @& th`& hiEn @a0
g- &W viE& *G (bng 1p 8e'bavi$atorBehavior giQng nh viE& *G (bng
&C& 1p Behaviour ;hC&.
1. Te0 ra Qi tRng 8e'bavi$atorBehaviour +thiJt 1p tran*60r-
gr0!p
2. ThI- Qi tRng 8e'bavi$atorBehavior vD0 thU ;h!ng &Wnh
5. C!ng &]p -ut gi hen fh0& >0!n(ingL'a6g &h0 Qi tRng
8e'bavi$atorBehavior
public Branch%roup
create0cene%raph(0imp*exni.erse su& Q
// Create the root of the branch graph
Transform%roup .pTrans = null'
Branch%roup ob\$oot = new Branch%roup(&'
ob\$oot.addChi*d(createNand(&&'
// create other scene graph content
httpBOOtai1i'!ha3.&0-
755
Lp trnh ha trn Java 2D v 3D
.pTrans =
su.getziewing*atform(&.getziew*atformTransform
(&'
trans*ate.set( +.+f, +.ff, +.+f&' // f
meter e*e.ation
Tf).setTrans*ation(trans*ate&' // set as
trans*ation
.pTrans.setTransform(Tf)&' // used for
initia* position
te,#a.igatorBeha.ior We,#a.Beh = new
te,#a.igatorBeha.ior(.pTrans&'
We,#a.Beh.set0chedu*ingBounds(new
Bounding0phere(new ointfd(&,O+++.+&&'
ob\$oot.addChi*d(We,#a.Beh&'
// Net va.a f) perform optimizations on
this scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2
Th'0 &jng tha& &C& @& trnh @D3 y trIn+ tr0ng phng tha&
&reate"&ene%raph di hi viE& tr!3 &p vD0 nhx- Xi'?P1at60r-
tran*60r-.F!C trnh th`& thi nD3 tr!3"n Qi tRng Si"pe_niverse vD0
phng tha& &reate"&ene%raph 1D- &h0 nx try nIn a&tiv' T &x thT tr!3
&p vD0 &C& nhDnh vi'? ;hC& &wa Si"pe_niverse+ nh
Patfor"Geo"etr'+ Cie1er!vatar+ h0& thI- -ut Qi tRng
Boundin$Leaf vD0 nhCnh vi'?.
Ddng 15P19 ;hyi te0 vU trv @an ! &wa vi'?'r. Tr0ng trzng hRp
nD3 + Qi tRng vi'?'r R& &h!3Tn ti vU trv 0.5 -'t'r* n- trIn vU trv
httpBOOtai1i'!ha3.&0-
757
Lp trnh ha trn Java 2D v 3D
@an ! &wa thJ gii W0. [3 &h 1D vU trv @an ! vD &hng ta &x th tha3
i vU trv vD gx& &wa vi'?'r *a! nD3.
// The fo**owing a**ows this to be run as an
app*ication
// as we** as an app*et
public KeyNaviator!pp(& Q
setNa,out(new BorderNa,out(&&'
Can.asf) can.asf) = new Can.asf)(null&'
add(^Center^, can.asf)&'
// 0imp*exni.erse is a Con.enience
xti*it, c*ass
0imp*exni.erse simp*ex = new
0imp*exni.erse(can.asf)&'
Branch%roup scene =
create0cene%raph(simp*ex&'
simp*ex.addBranch%raph(scene&'
2 // end of te,#a.igator/pp (constructor&
CMch x' dOn$ Rn$ dSn$ chun$ cga "et Behavior
Sh @]t ; Qi tRng Behaviour ;hC&+ 8e'bavi$atorBehaviour
&h a&tiv' ;hi ;h!ng 1U&h &wa nx gia0 nha! vi giai 0en a&tiv' &wa -ut
Xi'?P1at60r-.
-.-.% LNp 8e'bavi$atorBehaviour v 8e'bavi$ator
httpBOOtai1i'!ha3.&0-
759
Lp trnh ha trn Java 2D v 3D
Lp tiE& v&h tng tC& @Dn phv- th`& thi hai 1p. Tr0ng thzi gian &he3
&hng trnh &x hai Qi tRng. [Qi tRng ! tiIn 1D Qi tRng
i'3Savigat0r>'havi0r+ Qi tRng tha hai 1D 8e'bavi$ator. Lp tha hai
;hjng &n thiJt phWi trnh @D3 tr0ng tDi 1i! nD3. [Qi tRng
8e'bavi$atorBehavior th`& hiEn h! hJt t]t &W &C& hD- &ha& nVng
tr!3"n thQng &wa -t 1p Behaviour+ ng0Di viE& nx gi Jn Qi tRng
8e'bavi$ator T th`& hiEn phng tha& p'r60r- th'
pr0&'**2ti-!1!*.Lp 8e'bavi$ator nhn *` ;iEn #LT%v'nt vD &h!3Tn
&C& *` ;iEn thDnh ttng &C& phv- @]- riIng @iEt.>Wng (i s3 7P5 &h ra
tC& (bng &wa ttng phv- @]- riIng @iEt. Lp 8e'bavi$ator th`& thi *`
vn ung nhanh &hxng.
8e'bavi$atorBehavior Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.;'3@0ar(
Thta ;J B >'havi0r
Lp 1D -ut @'havi0r n giWn that gi Jn 8e'bavi$ator T tha3 i @"
ng0Di vi'? p1at60r-
8e'bavi$atorBehavior<Transfor"Group tar$etTG=
KD- te0 -ut n0(' ;'3 navigat0r @'havi0r -i &x tC& (bng trIn nhx-
tran*60r- ,C& Unh
8e'bavi$atorBehavior /ethod Su""ar'
void initiai4e<=
KD- phng tha& ;hyi te0 &wa 1p >'havi0r T thiJt 1p thjng *Q
?a;'!pvoid processSt"uus<0ava.uti.)nu"eration criteria=
KD- phng tha& pr0&'**2ti-!1!* &wa 1p >'havi0r T !Wn 1H *`
;iEn
httpBOOtai1i'!ha3.&0-
75:
Lp trnh ha trn Java 2D v 3D
..= Lp ti4n Xch t\Rn" t2c vi ch9Vt
)xi tiEn v&h Behaviour f&0-.*!n.N5(.!ti1*.@'havi0r*.-0!*'g &haa
nhZng 1p Behaviour tng x !Wn 1H viE& tng tC& vi &h!ut. >a0 g-
&C& 1p T &h!3Tn (U&h+ phxng t0Onh vD i"! ;hiTn !a3 &C& Qi tRng
tr`& !an th'0 *` (i &h!3Tn &wa &h!ut.
>Wng 7P7 tng hRp 1ei 5 Behaviour ,C& Unh &wa tr0ng viE& tng tC&
vi &h!ut th'. Tr0ng gxi &dn &x &haa 1p & *y trt! tRng
/0!*'>'havi0r &1a** vD gia0 (iEn /ouseCa,ack . Lp & *y trt!
tRng vD gia0 (iEn R& *G (bng T te0 ra &C& Behaviour ,C& Unh &wa
&0n &h!ut.
-.2.( Sz dSn$ Np /ouseBehaviour
2G (bng 1p -0!*' Behaviour &ng tng t` nh ;i *G (bng C&&
1a0p Behaviour ;hC&.
CC& @& ;hi *G (bng 1p -0!*' Behaviour
1.C!ng &]p ;hW nVng & vD ghi &h0 Qi tRng v&h tran*60r- gr0!p
2. ihyi t0e -ut Qi tRng /0!*'>'havi0r
5. ThiJt 1p Qi tRng v&h Jn tran*60r- gr0!p
7. C!ng &]p -ut gia0i hen f0r >0!n(ingL'a6g &h0 Qi tRng
/0!*'>'havi0r
9. ThI- Qi tRng /0!*'>'havi0r vD0 thU ;h!ng &Wnh
+i$ure -o( #ecipe for _sin$ /ouse Behavior Casses
T!3 nhiIn &C& @& trIn 1D ;j @^t @!u& phWi th`& hiEn 3 w. >& 2
vD @& 5 &x thT &!ng th`& hiEn tr0ng -ut hD- te0. vv (b (i s3 gii
httpBOOtai1i'!ha3.&0-
75<
Lp trnh ha trn Java 2D v 3D
thiE! phng tha& &r'at'2&'n')raph tt vv (b /0!*'.0tat'#pp. [ thU
;h!ng &Wnh &haa Qi tRng C010rC!@'. Sgzi (_ng &x thT !a3 Qi
tRng C010rC!@' *G (bng &h!ut vD &W Qi tRng /0!*'.0tat' tr0ng
thU ;h!ng &Wnh
// Mouse$otate/pp renders a sing*e,
interacti.e*, rotatab*e cube.
public class Mouse$otate/pp extends /pp*et Q
public Branch%roup createSceneGraph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transform%roup ob\$otate = new
Transform%roup(&'
ob\$otate.setCapabi*it,(Transform%roup./NN-V"T$/#
0d-$M"V${T!&'
ob\$otate.setCapabi*it,(Transform%roup./NN-V"T$/#
0d-$M"$!/)&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(new Co*orCube(+.s&&'
ob\$oot.addChi*d(new /xis(&&'
httpBOOtai1i'!ha3.&0-
75=
Lp trnh ha trn Java 2D v 3D
Mouse$otate m,Mouse$otate = new
Mouse$otate(&'
m,Mouse$otate.setTransform%roup(ob\$otate&'
m,Mouse$otate.set0chedu*ingBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(m,Mouse$otate&'
// Net va.a f) perform optimizations on
this scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
Mouse$otate/pp
// Create a simp*e scene and attach it to the
.irtua* uni.erse
public "ouse#otate!pp(& Q
setNa,out(new BorderNa,out(&&'
Can.asf) can.asf) = new Can.asf)(null&'
add(^Center^, can.asf)&'
Branch%roup scene = create0cene%raph(&'
// 0imp*exni.erse is a Con.enience
xti*it, c*ass
httpBOOtai1i'!ha3.&0-
759
Lp trnh ha trn Java 2D v 3D
0imp*exni.erse simp*ex = new
0imp*exni.erse(can.asf)&'
// This wi** mo.e the ziew*atform bacW a
bit so the
// ob\ects in the scene can be .iewed.
simp*ex.getziewing*atform(&.set#omina*ziewingTra
nsform(&'
simp*ex.addBranch%raph(scene&'
2 // end of Mouse$otate/pp (constructor&
// The fo**owing a**ows this to be run as an
app*ication
// as we** as an app*et
public static void main(0tringKL args& Q
0,stem.out
.print(^Mouse$otate/pp.\a.a }nX
a demonstration of using the Mouse$otate ^&'
0,stem.out
.print*n(^uti*it, beha.ior c*ass
to pro.ide interaction in a va.a f) scene.^&'
0,stem.out
.print*n(^1o*d the mouse button
whi*e mo.ing the mouse to maWe the cube
rotate.^&'
httpBOOtai1i'!ha3.&0-
770
Lp trnh ha trn Java 2D v 3D
0,stem.out
.print*n(^This is a simp*e
examp*e progam from The va.a f) /{ Tutoria*.^&'
0,stem.out.print*n(^The va.a f) Tutoria*
is a.ai*ab*e on the web atn^&'
0,stem.out
.print*n(^httpn//\a.a.sun.com/pr
oducts/\a.aXmedia/f)/co**atera*^&'
drame frame = new Maindrame(new
Mouse$otate/pp(&, (5u, (5u&'
2 // end of main (method of Mouse$otate/pp&
2 // end of c*ass Mouse$otate/pp
Code +ra$"ent -o? _sin$ the /ouse#otate _tiit' Cass
Chng trnh &h0 ;Jt waB
httpBOOtai1i'!ha3.&0-
771
Lp trnh ha trn Java 2D v 3D
/ut &C&h tng t` &hng ta &x thT 1D- viE& vi hai 1p -0!*'
Behaviour &dn 1ei. Tr0ng th`& tc&W @a 1p nD3 "! &x thT (_ng &h!ng
tr0ng -ut ang (bng tC& ung &_n vD0 -ut Qi tRng tr`& !an Chng ta
&ng &h &n -ut Qi tRng Transfor"Group &h!ng &x &W 5 Qi tRng
-0!*' @'havi0r*. Tr0ng vv (b tiJp th'0 &hng ta ,'- ,ct &C& tha& hai
-0!*' Behaviour &_ng hDnh ung tr0ng -ut thJ gii W0. Xv (b
/0!*'.0tat'2#pp te0 ra -ut thU ;h!ng &Wnh vi hai Qi tRng
C010rC!@' n- gn nha!./\i Qi tRng C010rC!@'* g^n 1i"n vi -ut Qi
tRng /0!*'.0tat'.
ihi &W hai Qi tRng -0!*' @'havi0r &_ng a&tiv'+ 1& 0 ngzi (_ng
&1i&; vD (i &h!3Tn &h!ut+ &W hai Qi tRng C010rC!@'* &_ng !a3.
SJ! &hng ta ;hjng -!Qn &W hai Qi tRng &_ng !a3+ ta &x hai giWi
phCp
Tha3 i vU trv vi'?'r ha3 tha3 i ;h!ng 1U&h &wa Behaviour *a0
&h0 &h &x -ut Behaviour !?& a&tiv'
2G (bng ; th!t pi&;ing &C&h 13 Behaviour. iH th!t pi&;ing
R& ,'- ,ct tr0ng phn 7.:
Tr0ng phn 7.: &hng *Y *G (bng &C& 1p thv&h hRp T &x thT ;Jt hRp
&C& -0!*' Behaviour vi pi&;ing &h0 phcp ngzi (_ng tng tC& vi
ttng Qi tRng tr`& !an tei -ut thzi iT-.
-.2.% /ouse Behaviour +oundation
CC& phng tha& -0!*' Behaviour ,C& Unh f/0!*'.0tat'+
/0!*'Tran*1at'+ vD /0!*'00-g 1D -y rung &wa 1p & * trt tRng
/0!*'>'havi0r vD th`& thi gia0 (iEn /0!*'Ca11@a&; .
LNp c; s| trcu tfLn$ /ouse Behavior
httpBOOtai1i'!ha3.&0-
772
Lp trnh ha trn Java 2D v 3D
Lp & *y trt! tRng R& gii thiE! *a! s3 ;hi &hng ta -!Qn thta
;J nx I viJt &C& 1p -0!*' Behaviour &wa ri'ng -nh.
/ouseBehavior /ethod Su""ar'
Lp & *y &h0 t]t &W &C& tha0 tC& &h!ut -0!*'
void initiai4e<=
ihyi te0 @'havi0r.
void process/ouse)vent<0ava.a1t.event./ouse)vent evt=
;iT- *0at &C& *` ;iEn &h!ut.
void processSti"uus<0ava.uti.)nu"eration criteria=
T]t &W &C& tha0 tC& &h!ut phWi th`& thi phng tha& nD3 &wa 1p
Behaviour void setTransfor"Group<Transfor"Group
Transfor"Group=
ThiJt 1p Transfor"Group v&h &h0 Behaviour
void 1akeup<=
)i Jn phng tha& ?a;'!p.
/ouseCa,ack .nterface
/ut 1p th`& thi gia0 (iEn nD3 &!ng &]p phng tha&
tran*60r-Chang'(+ phng tha& nD3 *Y R& gi ;hi Qi tRng i&h
tran*60r- tha3 i th'0 -ut &C&h tha& ,C& Unh. &W 5 1p -0!*'
Behaviour "! phWi th`& thi gia0 (iEn nD3. Chng ta &ng &x thT viJt
phng tha& tran*60r-Chang'( &wa -ut tr0ng *Q &C& 1p ;ia T ,C& Unh
phng tha& R& gi ;hi Qi tRng tran*60r- tha3 i
CMc phf;n$ thRc .nterface /ouseBehaviorCa,ack
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.-0!*'
void transfor"Chan$ed<int t'pe@ Transfor"*& transfor"=
httpBOOtai1i'!ha3.&0-
775
Lp trnh ha trn Java 2D v 3D
Lp th`& thi gia0 (iEn nD3 `& (Vng ;H vi -ut tr0ng *Q &C&
/0!*'>'havi0r* *Y R& gi -\i ;hi Behaviour &p nht tran*60r-.
)iC trU &wa t3p'B /0!*'Ca11@a&;..MT#T%+
/0!*'Ca11@a&;.T.#S2L#T%+ h0& /0!*'Ca11@a&;.MM/.
-.2.* CMc Np /ouseBehaviour
/ouse #otate
/ut thU ;h!ng &Wnh &x &ha -ut Qi tRng /0!*'.0tat' &h0 phcp
ng!zi (_ng !a3 Qi tRng tr!N !an. Chng ta *Y ,'- &hi tiJt tr0ng &C&
vv (b /0!*'.0tat'#pp+
/0!*'.0tat'2#pp+ vD /0!*'>'havi0r#pp.
7" tlo /ouse#otate Constructor
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.-0!*'
Thta ;J B /0!*'>'havi0r
/0!*'.0tat' 1D -ut Behaviour &h0 phcp ngzi (_ng i"! ;hin viE&
!a3 Qi tRng thjng !a &h!ut. [T *G (bng 1p nD3+ tr& hJt te0 ra -ut
tran*60r- gr0!p -D hDnh ung !a3 nD3 tC& ung vD0. ngzi (_ng &x th
!a3 @]t &a Qi tRng &0n nD0 &wa nhx- Transfor"Group.
/ouse#otate<=
KD- te0 -ut -0!*' r0tat' @'havi0r -& Unh.
/ouse#otate<Transfor"Group Transfor"Group=
KD- te0 -ut -0!*' r0tat' @'havi0r g^n vi Transfor"Group
/ouse#otate<int fa$s=
ihyi te0 -ut -0!*' @'havi0r vi &z+ giCi trU &wa &zB
/0!*'>'havi0r.$SX%.T$SP4T Ch0 phcp W0 ngR& ! vD0.
httpBOOtai1i'!ha3.&0-
777
Lp trnh ha trn Java 2D v 3D
/0!*'>'havi0r./#S4#LL#i%4P Ch0 phcp gi Behaviour -ut
&C&h &hw ung
Tjn$ hLp phf;n$ thRc /ouse#otate
void set+actor<dou,e factor=
void set+actor<dou,e x+actor@ dou,e '+actor=
void setupCa,ack</ouseBehaviorCa,ack ca,ack=
Phng tha& tran*60r-Chang'( tr0ng 1p &a11@a&; *Y `0& gi t` ung
-\i ;hi tran*60r- R& &p nht
void transfor"Chan$ed<Transfor"*& transfor"=
Chng ta &x th &hjng hD-+ ;hi x hD- -i *Y R& gi -\i ;hi
Behaviour &p nht tran*60r-
/ouseTransate
Ch0 phcp ngzi (_ng (i &h!3Tn Qi tRng tr`& !an tr0ng -ut -t
phng *0ng *0ng vi -t phng ,C& Unh tr0ng ;hjng gian W0. r'- vv (b
/0!*'>'havi0r#pp.
/ouseTransate Constructor Su""ar'
)xi B &0-.*!n.N5(.!ti1*.@'havi0r*.-0!*'
Thta ;J B /0!*'>'havi0r
/0!*'Tran*1at' 1D -ut Qi tRng Behaviour &h0 phcp ngzi (_ng i"!
;hiTn *` &h!3Tn ung th'0 frO|g &wa -ut Qi tRng @n &C& *` (bng
&h!ut phWi
/ouseTransate<=
ihyi te0 -ut Behaviour (U&h &h!3Tn -& Unh
/ouseTransate<Transfor"Group Transfor"Group=
ihyi te0 -ut Behaviour (U&h &h!3Tn vi tha- *Q Transfor"Group
httpBOOtai1i'!ha3.&0-
779
Lp trnh ha trn Java 2D v 3D
/ouseTransate<int fa$s=
ihyi te0 -ut Behaviour (U&h &h!3Tn vi tha- *Q &z. Cz nhn -ut tr0ng
&C& giC trUB
/0!*'>'havi0r.$SX%.T$SP4T Ch0 phcp W0 ngR& ! vD0.
/0!*'>'havi0r./#S4#LL#i%4P Ch0 phcp gi Behaviour -ut
&C&h &hw ung
/ouseTransate /ethod Su""ar'
void set+actor<dou,e factor=
void set+actor<dou,e x+actor@ dou,e '+actor=
void setupCa,ack</ouseBehaviorCa,ack ca,ack=
Phng tha& tran*60r-Chang'( tr0ng 1p &a11@a&; *Y `0& gi t` ung
-\i ;hi tran*60r- R& &p nht
void transfor"Chan$ed<Transfor"*& transfor"=
Chng ta &x th &hjng hD-+ ;hi x hD- -i *Y R& gi -\i ;hi
Behaviour &p nht tran*60r-
/ouseoo"
Ch0 phcp ngzi (_ng (i &h!3Tn Qi tRng tr`& !an tr0ng -ut -t
phng tr`& gia0 vi .r'- th'- vv (b /0!*'>'havi0r#pp.
7" tlo /ouseoo"
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.-0!*'
Thta ;J B /0!*'>'havi0r
/0!*'00- 1D -ut Qi tRng @'havi0r &h0 phcp ngzi (_ng tha3 i vU
trv &wa Qi tRng tr!N& !an th'0 trb& @n nt giZ &wa &h!ut.
/ouseoo"<=
Te0 ra Qi tRng -0!*' 00- @'havi0r -& Unh.
httpBOOtai1i'!ha3.&0-
77:
Lp trnh ha trn Java 2D v 3D
/ouseoo"<Transfor"Group Transfor"Group=
Te0 ra Qi tRng -0!*' 00- @'havi0r vi tha- *Q tran*60r- gr0!p.
/ouseoo"<int fa$s=
ihyi te0 -ut 00- Behaviour vi tha- *Q &z. Cz nhn -ut tr0ng &C& giC
trUB
/0!*'>'havi0r.$SX%.T$SP4T Ch0 phcp W0 ngR& ! vD0.
/0!*'>'havi0r./#S4#LL#i%4P Ch0 phcp gi Behaviour -ut
&C&h &hw ung
/ouseoo" /ethod Su""ar'
void set+actor<dou,e factor=
void setupCa,ack</ouseBehaviorCa,ack ca,ack=
void transfor"Chan$ed<Transfor"*& transfor"=
Chng ta &x th &hjng hD-+ ;hi x hD- -i *Y R& gi -\i ;hi
Behaviour &p nht tran*60r-
-.2.- /ouse bavi$ation
Tr0ng *Q &C& hD- te0 &wa @a 1p -0!*' Behaviour "! &x tha- *Q
61ag.ihi &z &x giC trU /0!*'>'havi0r.$SX%.T$SP4T2 Qi tRng
-0!*' Behaviour W0 ngR& 1ei tha t` &wa inp!t. Shz v3 ta &C& 1p
-0!*' Behaviour &x thT (_ng T i"! ;hiTn &h!3Tn hng.r'- vv (b
/0!*'Savigat0r#pp.
[0en &0(' tr0ng 7P= trnh @D3 phng tha& &r'at'2&'n')raph. [Qi tRng
Transfor"Group v&h &wa -\i Qi tRng th' -0!*' @'havi0r 0@N'&t* 1D
Xi'?P1at60r- tran*60r-. [Qi tRng 2i-p1'4niv'r*' 1D tha- *Q tr!3"n
httpBOOtai1i'!ha3.&0-
77<
Lp trnh ha trn Java 2D v 3D
&h0 phng tha& &r'at'2&'n')raph v v3 Qi tRng Xi'?P1at60r- &x thT
R& tr!3 &p.
public Branch%roup
createSceneGraph(0imp*exni.erse su& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transform%roup .pTrans = null'
Bounding0phere mouseBounds = null'
.pTrans =
su.getziewing*atform(&.getziew*atformTransform(
&'
ob\$oot.addChi*d(new Co*orCube(+.s&&'
ob\$oot.addChi*d(new /xis(&&'
mouseBounds = new Bounding0phere(new
ointfd(&, O+++.+&'
Mouse$otate m,Mouse$otate = new
Mouse$otate(MouseBeha.ior.{#z!$T"{#xT&'
m,Mouse$otate.setTransform%roup(.pTrans&'
m,Mouse$otate.set0chedu*ingBounds(mouseBo
unds&'
ob\$oot.addChi*d(m,Mouse$otate&'
httpBOOtai1i'!ha3.&0-
77=
Lp trnh ha trn Java 2D v 3D
MouseTrans*ate m,MouseTrans*ate = new
MouseTrans*ate(MouseBeha.ior.{#z!$T"{#xT&'
m,MouseTrans*ate.setTransform%roup(.pTran
s&'
m,MouseTrans*ate.set0chedu*ingBounds(mous
eBounds&'
ob\$oot.addChi*d(m,MouseTrans*ate&'
Mouse|oom m,Mouse|oom = new
Mouse|oom(MouseBeha.ior.{#z!$T"{#xT&'
m,Mouse|oom.setTransform%roup(.pTrans&'
m,Mouse|oom.set0chedu*ingBounds(mouseBoun
ds&'
ob\$oot.addChi*d(m,Mouse|oom&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
Mouse#a.igator/pp
8dt xuJ cho ta h
httpBOOtai1i'!ha3.&0-
779
Lp trnh ha trn Java 2D v 3D
..> Pic(in" c+dect
Tr0ng vv (b /0!*'.0tat'2#pp+ &W hai Qi tRng C010rC!@' "! !a3
;hi gp tC& ung &wa g!zi (_ng. Tr0ng vv (b x &W hai Qi tRng "! &ha
&x thT !a3 -ut &C&h & 1p.i th!t pi&;ing &h0 phcp &hng ta tng
tC& vi ttng Qi tRng tr`& !an tr0ng thU ;h!ng &Wnh .
Pi&;ing R& th`& thi @yi -ut Behaviour+ (i *` ;v&h h0et &wa *` ;iEn
&1i&; &h!ut. [T pi&;ing -ut Qi tRng+ ngzi (_ng (i &h!3Tn &h!ut vD0
Qi tRng tr`& !an vD &1i&; &h!ut. [Qi tRng @'havi0r R& ;v&h h0et
@yi *` ;iEn &1i&; &h!ut vD th`& hiEn pi&;ing. /ut ray 1D -ut tia `0&
&hiJ! tt vU trv &0n tr &h!ut *0ng *0ng vi pr0N'&t'(.
2` gia0 nha! &wa ray vi Qi tRng tr0ng ;hjng gian W0 R& tvnh t0Cn .
[Qi tRng tr`& !an gia0 &^t vi -t phng ;h!ng hnh gn nh]t R&
&1`a &hn T gia0 &^t.
httpBOOtai1i'!ha3.&0-
790
Lp trnh ha trn Java 2D v 3D
/et pick ra' tron$ kh`n$ $ian Jo
/ut &C&h tng thT+ !C trnh gia0 &^t ;hjng th`& hiEn tr`& tiJp trIn
Qi tRng R& 1`a &hn+ -D 1D- viE& vi Qi tRng &h!3Tn hng thU
;h!ng &Wnh Jn Qi tRng. L]3 vv (b T pi&;ing -ut Qi tRng
C010rC!@' 0@N'&t T i"! ;hiTn !a3 + Qi tRng C010rC!@' ;hjng @U
tr`& tiJp i"! ;hiTn -D tha3 vD0 x 1D Qi tRng Transfor"Group n-
trIn Qi tRng C010rC!@' tr0ng &_ng path Jn Qi tRng C010rC!@'. Sxi
-ut &C&h ;hC& nJ! &jng viE& pi&;ing ;`a &hn Qi tRng tr`& !an nh-
tha3 i -! *^& &wa Qi tRng+;hi x Qi tRng tr`& !an phWi R& tC&
ung -ut &C&h tr`& tiJp.
XiE& ,C& Unh &hvnh ,C& Qi tRng R& ,G 1H ;hjng phWi 1D -ut &jng
viE& n giWn. SJ! &hng ta &n !a3 -ut Qi tRng hn 1p phng :
-t + -\i -t 1D -ut Qi tRng 2hap'5D & 1p R& *ap ,Jp @yi : Qi
tRng Transfor"Group + ;hi x Qi tRng hnh 1p phng *Y &n phWi
gia0 &^t tr`& tiJp &ha ;hjng phWi 1D Qi tRng Transfor"Group
XiE& !a3 Qi tRng hnh 1p phng @ng viE& tng tC& Jn Qi
tRng Transfor"Group+ 1D &0n &wa Qi tRng >ran&h)r0!p tr0ng thU
;h!ng &Wnh .
httpBOOtai1i'!ha3.&0-
791
Lp trnh ha trn Java 2D v 3D
XiE& tvnh t0Cn !C trnh gia0 &^t 1D r]t tQn ;c-. X v3+ pi&;ing di
hi ;hW nVng tvnh t0Cn &a0 vD 1D- tVng u pha& tep &wa thU ;h!ng
&Wnh. tr0ng Java5D &!ng &]p &h0 &hng ta nhZng &C&h ;hC& nha! T gii
hen *Q 1Rng tvnh t0Cn phWi th`& hin tr0ng pi&;ing. /ut &C&h !an trng
1D *G (bng ;h nVng vD th!u& tvnh &C& n0(' &wa thU ;h!ng &Wnh.
/ut n0(' tr0ng thU ;h!ng &Wnh &x phng tha& *'tPi&;a@1'fgt 1D
6a1*' ;hi x Qi tRng n0(' nD3 vD t]t &W &C& Qi tRng &0n &wa nx "!
;hjng thT pi&;ing >yi v3+ nhZng n0(' ;hjng R& ,'- ,ct Jn ;hi tvnh
t0Cn gia0 &^t.
/ut & iT- ;hC& &wa 1p S0(' 1D ;hW nVng
%S#>L%P$Ci.%PM.T$S). ihW nVng nD3 &h Cp (bng vi -ut nhx-
n0('.
bode /ethod <partia ist=
Thta ;J B 2&'n')raphM@N'&t
Lp &0nB )r0!p+ L'a6
Lp S0(' 1D -ut 1p & *y trt! tRng &h0 t]t &W &C& )r0!p vD L'a6
S0('*.Sx &!ng &]p -ut ;h!ng thjng (bng tr0ng viE& ,s3 (`ng -ut
httpBOOtai1i'!ha3.&0-
792
Lp trnh ha trn Java 2D v 3D
Java5D thU ;h!ng &Wnh.+ nh *p'&i6i&a113 @0!n(ing v01!-'*+ pi&;ing
vD ;hW nVng nhn @iJt &011i*i0n
void setBounds<Bounds ,ounds=
ThiJt 1p -ut Qi tRng hnh h& @a0 !anh -ut n0('.
void setBounds!utoCo"pute<,ooean autoCo"pute=
>t t^t &hJ u t` ung tvnh t0Cn t` ung Qi tRng hnh h& @a0 !anh -u
setPicka,e<,ooean picka,e=
[t &hJ u pi&;+ nJ! 1D tr!' Qi tRng S0(' nD3 &x th pi&;+ ng`0& 1ei Qi
tRng S0(' vD &C& &0n &wa nx "! ;hjng thT pi&; R&
bode Capa,iities Su""ar' <partia ist=
)b!BL)uP.C8u#)PF#T.bG
Ch Unh S0(' &x thT R& thjng @C0 tr0ng 2&'n')raphPath nJ! nh !C
trh pi&; R& th`& hiEn. ihW nVng nD3 &h &x th !?& Unh r &h0 &C&
)r0!p n0('+ nx ;hjng Cp (bng &h0 &C& n0(' 1C.)iC trU -& Unh 1D 6a1*'.
!LLFAuBF_b&Su#)!& y A#.T)
Ch Unh S0(' R& &Oghi tr!3 &p &C& thjng tin vD0 ;h!ng &wa nx.
!LLFAuP.C8!BL)u#)!& y A#.T)
/ut &C&h ;hC& T ngzi 1p trnh &x thT giW- thiT! viE& tvnh t0Cn
tr0ng trnh pi&;ing 1D *G (bng thG nghiE- gia0 &^t &wa ;h!ng @a0
!anh tha3 v viE& *G (bng gia0 &^t &wa &C& Qi tRng hnh h&. .]t nh'!
1p &x &C& hD- te0 vD phng tha& nhn tha- *Q ! vD0
42%>M4SD2 h0& 42%)%M/%T.|. F!3Jt Unh *G (bng ;h!ng
@a0p !anh r rDng '- 1ei hiE! !W hn nhi"! ftr0ng viE& tvnh t0Cng
Qi vi h! hJt v v3 hiE! nVng &wa &hng trnh tVng r rEt. T!3 nhiIn
httpBOOtai1i'!ha3.&0-
795
Lp trnh ha trn Java 2D v 3D
phng Cn nD3 th`& tJ ;hjng phWi 1& nD0 &ng t ra hiE! !W vD th`&
hiEn !R&.
/ut ; th!t tha 5 T giW- nhZng tvnh t0Cn pha& tep tr0ng !C trnh
pi&;ing 1a gii hen phe- vi pi&;ing vi nhZng phn &x 1iIn !an tr0ng
thU ;h!ng &Wnh.
-.3.( _sin$ Pickin$ _tiit' Casses
Cx hai &C&h tiJp &n tr0ng !C tnh *G (bng pi&;ing &wa Nava5DB *G
(bng Qi tRng &wa 1p pi&;ing+ h0& te0 ra 1p pi&;ing -i vD *G (bng
thT hiEn &wa nx . )xi pi&;ing @a0 g- &C& 1p T pi&;Or0tat'+
pi&;Otran*1at'+ vD pi&;O00- . /\i 1p pi&;ing *G (bng -ut phv- &h!ut
;hC& nha! T th`& hiEn !C trnh i"! ;hiTn Qi tRng vi 3 w ;hW
nVng &wa &C& 1p pi&;ing tr0ng &_ng -ut ang (bng.
Tr0ng phn nD3 &hng ta gii thiE! &C& 1p tiEn v&h
Pi&;.0tat'>'havi0r+ Pi&;Tran*1at'>'havi0r+ vD Pi&;00->'havi0r.
Tr0ng phn tiJp th'0 7.:.2 &hng ta gii thiE! &C& 1p ha3 *G (bng tr0ng
viE& te0 ra &C& 1p pi&;ing -i.
D0 -\i Qi tRng pi&;ing @'havi0r 0@N'&t &x ;hW nVng th`& hiEn vi
@]t ; Qi tRng thU ;h!ng &Wnh+ v v3 &h &n -ut Qi tRng pi&;ing
@'havi0r &!ng &]p ;hW nVng pi&;ing [0en &0(' (i s3 -j tW &jng
viE& &n thiJt *G (bng &C& 1p pi&;ing @'havi0r tr0ng -ut &hng trnh
Java 5D
Pi&;.0tat'>'havi0r @'havi0r n'? Pi&;.0tat'>'havi0rfr00t+
&anva*+ @0!n(*g
r00t.a((Chi1(f@'havi0rg
httpBOOtai1i'!ha3.&0-
797
Lp trnh ha trn Java 2D v 3D
[Qi tRng @'havi0r *Y !Wn 1v @]t &a *; ;iEn pi&;ing nD0 (ikn ra
tr0ng thU ;h!ng &Wnh fn- (i r00tg vD ,G 1v &C& tha0 tC& ;c0 thW
&h!ut.
CC& @a0& *G (bng 1p pi&;ing
1. ihyi te0 thU ;h!ng &Wnh
2. ihyi te0 Qi tRng pi&;ing @'havi0r vi r00t+ &anva*+ vD @0!n(*
,C& Unh.
5. ThI- Qi tRng @'havi0r vD0 thU ;h!ng &Wnh.
7. >t &ha& nVng thv&h hRp &h0 Qi tRng thU ;h!ng &Wnh
bhEn$ sai st h'$p phJi khi sz dSn$ {i tfLn$ Pickin$
2G (bng 1p pi&;ing @'havi0r &x thT (n Jn &C& *ai 1- ha3 gp phWi
nh ;hi 1p trnh vi 1p @'havi0r. X]n " thzng gp 1DB !In ;hjng @a0
g- &C& Qi tRng @'havi0r tr0ng thU ;h!ng &Wnh+ vD ;hjng thiJt 1p
;h!ng thv&h hRp &h0 Qi tRng @'havi0r
Chf;n$ trUnh vm dS /ousePick!pp.
[0en &0(' (i s3 trnh @3 phng tha& &r'at'2&'n')raph &wa 1p
/0!*'Pi&;#pp. Chng trnh *G (bng Qi tRng Pi&;.0tat' 0@N'&t T
&!ng &]p !C trnh t!ng tC&. [0en &0(' (i s3 t!sn thw &C& @&
trnh @D3 y trIn.
public Branch%roup createSceneGraph(Can.asf)
can.as& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transform%roup ob\$otate = null'
httpBOOtai1i'!ha3.&0-
799
Lp trnh ha trn Java 2D v 3D
icW$otateBeha.ior picW$otate = null'
Transformf) transform = new
Transformf)(&'
Bounding0phere beha.eBounds = new
Bounding0phere(&'
// create Co*orCube and
icW$otateBeha.ior ob\ects
transform.setTrans*ation(new zectorff(X
+.uf, +.+f, X+.uf&&'
ob\$otate = new
Transform%roup(transform&'
ob\$otate.setCapabi*it,(Transform%roup./N
N-V"T$/#0d-$M"V${T!&'
ob\$otate.setCapabi*it,(Transform%roup./N
N-V"T$/#0d-$M"$!/)&'
ob\$otate.setCapabi*it,(Transform%roup.!#
/BN!"{Ct"$!-$T{#%&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(new Co*orCube(+.s&&'
picW$otate = new
icW$otateBeha.ior(ob\$oot, can.as,
beha.eBounds&'
ob\$oot.addChi*d(picW$otate&'
// add a second Co*orCube ob\ect to the
scene graph
httpBOOtai1i'!ha3.&0-
79:
Lp trnh ha trn Java 2D v 3D
transform.setTrans*ation(new
zectorff( +.uf, +.+f, X+.uf&&'
ob\$otate = new
Transform%roup(transform&'
ob\$otate.setCapabi*it,(Transform%roup./N
N-V"T$/#0d-$M"V${T!&'
ob\$otate.setCapabi*it,(Transform%roup./N
N-V"T$/#0d-$M"$!/)&'
ob\$otate.setCapabi*it,(Transform%roup.!#
/BN!"{Ct"$!-$T{#%&'
ob\$oot.addChi*d(ob\$otate&'
ob\$otate.addChi*d(new Co*orCube(+.s&&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
MouseicW/pp
httpBOOtai1i'!ha3.&0-
79<
Lp trnh ha trn Java 2D v 3D
[0en &0(' trIn &ng t!ng t` vi vv (b /0!*'.0tat'2#pp+ t!3 nhiIn
vn ;hC& nh!a tr0ng -ut *Q trzng hRp. [i"! ;hC& @iEt &hw 3J! 1D ang
(bng trIn &h *G (bng -ut Qi tRng @'havi0r tr0ng ;hi ang (bng
/0!*'.0tat'2#pp *G (bng h2 Qi tRng @'havi0r &h0 -\i Qi tRng
tr`& !an.
Sg0Di ra &ha& nVng &wa &C& @'havi0r &ng r]t ;hC& nha!. ng (bng &wa
&hng ta &hj phcp ngzi (_ng pi&; -ut Qi tRng T tng tC&+ tr0ng ;hi
ang (bng /0!*'.0tat'2#pp 1D- !a3 &W hai Qi tRng.
-.3.% CMc h" !P. c; ,Jn tron$ cMc Np Pickin$
X" & @Wn &x 5 1'v'1* pi&;ing &1a**'* R& &!ng &]p tr0ng Java 5D.
CC& hD- Java 5D #P$ & @Wn &!ng &]p &C& hD- &ha& nVng y tng (i
&_ng. )xi tiEn v&h pi&;ing &!ng &]p nhng 1p pi&;ing @'havi0r &h!ng+
ph_ hRp vD (k (Dng tha3 i. )xi tiE& v&h pi&;ing &ng &!ng &]p &C& 1p
@'havi0r &x thT *G (bng tr`& tiJp tr0ng &h!?0ng trnh Java5D.
ShZng 1p nhsn & @Wn @a0 g- 1p Pi&;2hap' vD 1p
2&'n')raphPath+ vD &C& phng tha& &wa >ran&h)r0!p vD L0&a1'.ShZng
httpBOOtai1i'!ha3.&0-
79=
Lp trnh ha trn Java 2D v 3D
1p nD3 &!ng &]p nhZng ; th!t T ,C& Unh hng hnh `0& *G (bng
tr0ng viE& tng tC& vi &C& Qi tRng trt! tRng. tr0ng phn nD3 &hng
ta gia0i thiE! &C& hD- #P$ &wa &C& 1p B Pi&;2hap' an( 2&'n')raphPath.
ShZng 1p tiE& v&h pi&;ing ,C& Unh *w (bng &C& 1p &h!ng T th`&
thi -ut pi&;ing @'havi0r ,C& Unh.
PickShape casses
Lp & *y trt! tRng &h &!ng &]p -ut &C&h trt! tRng 9 1p &0nB
Pi&;>0!n(*+ Pi&;.a3+ Pi&;2'g-'nt+ Pi&;P0int+ vD Pi&;C0n'.
Thjng thzng + Qi tRng hnh h&+ 1D v&h &wa pi&;ing+ *Y ,C& Unh
*G (bng Qi tRng pi&; *hap'* nD0.[Qi vi &C& hnh &x (eng a giC& @]t
&a pi&; *hap' nD0 &ng tha -n R& nhiE- vb nD3. T!3 nhiIn &x *`
;hC& nha! v" hiI! nVng *G (!ng giZa &C& 1p nD3.
2 phW hE Pi&;2hap'
PickShape
Lp &0nB Pi&;>0!n(*+ Pi&;.a3+ Pi&;2'g-'nt+ Pi&;P0int+ an( Pi&;C0n'
PickBounds
[Qi tRng Pi&;>0!n(* thT hiEn -t ;h!ng &h0 pi&; t'*ting.
httpBOOtai1i'!ha3.&0-
799
Lp trnh ha trn Java 2D v 3D
PickBounds Constructor Su""ar'
Thta ;JB Pi&;2hap'
/ut ;h!ng T &!ng &]p &h0 phng tha& >ran&h)r0!p L0&a1' pi&;.
PickBounds<=
KD- te0 Pi&;@0!n(*
PickBounds<Bounds ,oundsF,0ect=
KD- te0 vi tha- *Q @0!n(.
PickBounds /ethod Su""ar'
Bounds $et<=
TrW v" Qi tRng @0!n( tt Qi tRng Pi&;>0!n(*.
void set<Bounds ,oundsF,0ect=
ThiJt 1p @0!n(*M@N'&t tr0ng Qi tRng Pi&;>0!n(*.
PickPoint
[Qi tRng Pi&;P0int thT hin &h0 iT- pi&;ing. LD 1p &0n &wa 1p
Pi&;2hap'+ Qi tRng Pi&;P0int &x thT R& *G (bng vi >ran&h)r0!p
an( L0&a1' pi&; t'*ting
PickPoint Constructor Su""ar'
Thta ;J B Pi&;2hap'
/ut iT- &!ng &sp &h0 phng tha& pi&; &wa >ran&h)r0!p vD L0&a1'
PickPoint<=
KD- ta Qi tRng Pi&;P0int tei f0+ 0+ 0g.
PickPoint<Point*d ocation=
KD- ta Pi&;P0int vi tha- *Q 10&ati0n.
httpBOOtai1i'!ha3.&0-
7:0
Lp trnh ha trn Java 2D v 3D
PickPoint /ethod Su""ar'
void set<Point*d ocation=
ThiJt 1p giC trU vU trv &wa Pi&;P0int.
Pick#a'
[Qi tRng Pi&;.a3 thT hiEn -ut ra3 tr0ng pi&;ing.
Pick#a' Constructor Su""ar'
Thta ;J B Pi&;2hap'
[Qi tRng Pi&;.a3 1D -ut gxi gn &C& ra3 T tr!3"n vD0 &h0 phng tha&
pi&;ing tr0ng 1p >ran&h)r0!p vD L0&a1'
Pick#a'<=
KD- te0 vi giC trU -& Unh f0+ 0+ 0g.
Pick#a'<Point*d ori$in@ Cector*d direction=
KD- te0 vi tha- *Q hng.
Pick#a' /ethod Su""ar'
void set<Point*d ori$in@ Cector*d direction=
ThiJt 1p -ut tia Jn -ut iT- tt vU trv vi tha- *Q ta vD hng.
PickSe$"ent
[Qi tRng Pi&;2'g-'nt @iT! (ikn -ut 0en thng f('6in'( @3 t?0
p0int*g T pi&;ing.
Lp &0n 1p Pi&;2hap'+ Qi tRng Pi&;2'g-'nt R& *G (bng vi
phng tha& pi&; t'*ting &wa >ran&h)r0!p vD L0&a1'
httpBOOtai1i'!ha3.&0-
7:1
Lp trnh ha trn Java 2D v 3D
PickSe$"ent Constructor Su""ar'
Thta ;J B Pi&;2hap'
PickSe$"ent<=
KD- te0 Pi&;2'g-'nt.
PickSe$"ent<Point*d start@ Point*d end=
KD- te0 Pi&;2'g-'nt tha- *Q iT- ! iT- &!Qi.
PickSe$"ent /ethod Su""ar'
void set<Point*d start@ Point*d end=
ThiJt 1ep -ut Pi&;2'g-'nt tha- *Q iT- ! i- &!Qi.
PickCone
Pi&;C0n' 1p -i tr0ng #P$ phiIn @Wn 1.2. Lp Pi&;C0n' 1D 1p &
*y trt! tRng vi t]t &W &C& ;h!ng hnh nxn. ih!ng hnh nxn *G (bng
hiE! !W ;hi pi&;ing giZa &C& Qi tRng hnh h&.
) hai 1p &0nB Pi&;C0n'.a3 vD Pi&;C0n'2'g-'nt. [iT- ;hC& @iEt
giZa &hng 1D u (Di. Pi&;C0n'.a3 1D -ut hnh nxn vi u (Di i* a &0n'
06 vj tn 1'ngth tr0ng ;hi Pi&;C0n'2'g-'nt &x u (Di gii hen.
[Qi tRng Pi&;C0n'.a3 `0& ,C& Unh yi -ut iT- @an ! vD
hng. [Qi tRng Pi&;C0n'2'g-'nt R& Unh nghha hai iT- ,C& Unh
&W u (Di vD h!?0*ng &wa hnh nxn.
PickCone /ethod Su""ar'
void $et&irection<Cector*d direction= sne1 in (.%t
httpBOOtai1i'!ha3.&0-
7:2
Lp trnh ha trn Java 2D v 3D
TrW v" hng &wa Qi tRng Pi&;C0n'
void $etFri$in<Point*d ori$in= sne1 in (.%t
dou,e $etSpread!n$e<= sne1 in (.%t
TrW v" gx& rung &wa Qi tRng Pi&;C0n'.PickCone#a' sne1 in (.%t
PickCone#a' Constructor Su""ar'
Thta ;J Pi&;C0n'
PickCone#a'<= sne1 in (.%t
KD- te0 Pi&;C0n'.a3.
PickCone#a'<Point*d ori$in@ Cector*d direction@ sne1 in (.%t
dou,e spread!n$e=
KD- te0 Pi&;C0n'.a3.
Pi&;C0n'.a3 /'th0( 2!--ar3
v0i( *'tfP0int5( 0rigin+ X'&t0r5( (ir'&ti0n+ (0!@1' *pr'a(#ng1'g
Phng tha& thiJt 1p &C& tha- *Q &wa Qi tRng Pi&;C0n'
PickConeSe$"ent sne1 in (.%t
PickConeSe$"ent Constructor Su""ar'
Thta ;J B Pi&;C0n'
PickConeSe$"ent<= sne1 in (.%t
PickConeSe$"ent<Point*d ori$in@ Point*d end@ dou,e spread!n$e=
sne1 in (.%t
PickConeSe$"ent /ethod Su""ar'
void $et)nd<Point*d end= sne1 in (.%t
httpBOOtai1i'!ha3.&0-
7:5
Lp trnh ha trn Java 2D v 3D
TrW v" iT- &!Qi &wa Qi tRng Pi&;C0n'2'g-'nt. [iT- ! !?0N&
nhn tt phng tha& &wa 1p &ha.
void set<Point*d ori$in@ Point*d end@ dou,e spread!n$e= sne1 in
(.%t
PickC'inder sne1 in (.%t
Lp Pi&;C31in('r vD 1p &0n &wa nx &ng t0ng t` nh 1p Pi&;C0n'
vD &C& 1p &0n &wa Pi&;C0n'. Lp Pi&;C0n' 1D 1p & *y trt! tRng &wa
hai 1pB Pi&;C31in('r.a3 vD Pi&;C31in('r2'g-'nt.
PickC'inder /ethod Su""ar'
void $et&irection<Cector*d direction= sne1 in (.%t
TrW v" hng &wa Qi tRng Pi&;C31in('r.
void $etFri$in<Point*d ori$in= sne1 in (.%t
TrW v" iT- ;hyi ! &wa Qi tRng &31in('r.
dou,e $et#adius<= sne1 in (.%t
TrW v" g0& @an ! &wa Qi tRng &31in('r
PickC'inder#a' sne1 in (.%t
PickC'inder#a' Constructor Su""ar'
Thta ;J B Pi&;C31in('r
PickC'inder#a'<= sne1 in (.%t
httpBOOtai1i'!ha3.&0-
7:7
Lp trnh ha trn Java 2D v 3D
KD- te0 Pi&;C31in('r.a3. 2G (bng phng tha& *'tfP0int5(+ X'&t0r5(
(0!@1'g thiJt 1p &C& giC trU &wa ht!u& tvnh
PickC'inder#a'<Point*d ori$in@ Cector*d direction@ sne1 in (.%t
dou,e radius=
KD- te0 vi tha- *Q iT- @an ! vD ha0ng.
PickC'inder#a' /ethod Su""ar'
void set<Point*d ori$in@ Cector*d direction@ dou,e radius= sne1 in
(.%t
Phng tha& thiJt 1p giC trU &h0 &C& th!u& tvnh &wa Qi tRng
Pi&;C31in('r.a3.
PickC'inderSe$"ent sne1 in (.%t
PickC'inderSe$"ent Constructor Su""ar'
Thta ;J B Pi&;C31in('r
PickC'inderSe$"ent<= sne1 in (.%t
KD- te0 Pi&;C31in('r2'g-'nt.
PickC'inderSe$"ent<Point*d ori$in@ Point*d end@ dou,e radius=
sne1 in (.%t
PickC'inder#a' /ethod Su""ar'
void $et)nd<Point*d end= sne1 in (.%t
TrW v" iT- &!Qi Qi tRng Pi&;C31in('r2'g-'nt.
void set<Point*d ori$in@ Point*d end@ dou,e radius= sne1 in (.%t
SceneGraphPath
httpBOOtai1i'!ha3.&0-
7:9
Lp trnh ha trn Java 2D v 3D
Lp 2&'n')raphPath R& *G (bng tr0ng h! hJt &C& ang (bng
pi&;ing.[i"! nD3 1D (0 !C trnh pi&;ing th!?0ng6 ,!3In @a0 g- !C
trnh t- t0ng i tr0ng thU ;h!ng &Wnh &x &haa Qi tRng &n tng
tC&. /ut Qi tRng 2&'n')raphPath thT hiEn -ut zng i tr0ng thU
;h!ng &Wnh.
SceneGraphPath /ethod Su""ar' <partia ist=
,ooean exuas<0ava.an$.F,0ect o(=
TrW v" tr!' nJ! Qi tRng 01 &x ;iI! 2&'n')raphPath vD &C& (Z 1iE!
thDnh phn &wa Qi tRng 01 tng ang @ng vi &C& thDnh phn (Z 1iE!
&wa Qi tRng 2&'n')raphPath vD nc! giC trU &wa tran*60r-* &ng @ng
nha!
Transfor"*& $etTransfor"<=
TrW v" @Wn &0p3 &wa tran*60r- g^n 1i"n vi Qi tRng 2&'n')raphPath
trW v" n!11 nJ! ;hjng &x tran*60r-.
int hashCode<=
,ooean isSa"ePath<SceneGraphPath testPath=
rC& Unh hai Qi tRng ei (iEn &h0 &_ng -ut zng i ha3 ;hjng.
int nodeCount<=
TrW v" *Q n0(' &wa t0ng i.
void set<SceneGraphPath ne1Path=
void setLocae<Locae ne1Locae=
ThiJt 1p zng i 1D zng i tt Qi tRng L0&a1' Jn -ut Qi tRng
L0&a1'.,C& Unh
void setbode<int index@ bode ne1bode=
void setbodes<bodevw nodes=
void setF,0ect<bode o,0ect=
httpBOOtai1i'!ha3.&0-
7::
Lp trnh ha trn Java 2D v 3D
void setTransfor"<Transfor"*& trans=
0ava.an$.Strin$ toStrin$<=
CMc phf;n$ thRc pickin$ cga BranchGroup v Loca Pickin$
[s3 1D tng th]p nh]t tr0ng viE& tvnh t0Cn pi&;ing R& &!ng &]p
tr0ng Java 5D #P$.
BranchGroup and Locae pickin$ "ethods for use 1ith PickShape
SceneGraphPathvw pick!<PickShape pickShape=
TrW v" -Wng tha- &hiJ! &C& n0(' n- (!i >ran&h)r0!p+&x thT pi&; vD
&x gia0 &^t vi Qi tRng Pi&;2hap'.
SceneGraphPathvw pick!Sorted<PickShape pickShape=
TrW v" -ut -Wng &C& &x tha t` tha- &hiJ! Jn &C& thDnh phn &x thT pi&;
`0& vD &x gia0 &^t vi Qi tRng pi&;2hap'. Phn tG 0 tha- &hiJ! Jn
thDnh phn n- gn Qi tRng Pi&;2hap' nh]t
SceneGraphPath pickCosest<PickShape pickShape=
SceneGraphPath pick!n'<PickShape pickShape=
-.3.* CMc Np pickin$
ShZng 1p pi&;ing nxi &h!ng R& (_ng hiE! !W tr0ng viE& te0 ra
&C& pi&;ing @'havi0r . CC& 1p B Pi&;/0!*'>'havi0r+ Pi&;M@N'&t+vD
Pi&;Ca11@a&;.
Pick/ouseBehavior Cass
Lp & *y &!ng &]p &C& phng tha& pi&;ing @'havi0r.Lp nD3 &dn
r]t hiE! !W tr0ng viE& ,s3 (`!ng &C& pi&;ing &1a** *a! nD3 @ng viE&
thta ;J nx.
Pick/ouseBehavior /ethod Su""ar'
httpBOOtai1i'!ha3.&0-
7:<
Lp trnh ha trn Java 2D v 3D
)xi B &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B >'havi0r
void initiai4e<=
Phng tha& nD3 &n R& viJt T &!ng &]p &C& treng thCi @an ! vD
&C& i! ;iEn trigg'r @an !.
void processSti"uus<0ava.uti.)nu"eration criteria=
void updateScene<int xpos@ int 'pos=
PickF,0ect Cass
Lp Pi&;M@N'&t &!ng &]p &C& phng tha& ,C& Unh Qi tRng nD0
`0& &hn @yi hDnh ung pi&; &wa ngzi (_ng.
PickF,0ect Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B Nava.1ang.M@N'&t
PickF,0ect<Canvas*& c@ BranchGroup root=
KD- te0 Pi&;M@N'&t.
PickF,0ect /ethod Su""ar' <partia ist=
Lp Pi&;M@N'&t &x nhi"! phng tha& tvnh t0Cn *` gia0 &^t &wa -ut
Qi tRng pi&;.a3 vi Qi tRng thU ;h!ng &Wnh..
PickShape $eneratePick#a'<int xpos@ int 'pos=
ihyi te0 -ut Qi tRng Pi&;.a3 @^t ! tt vU trv &wa vi'?'r vD tr ti
iT- ,C& Unhth'0 h!?0n*g ,C& Unh.
PickF,0ect /ethod Su""ar' <partia ist o continued=
httpBOOtai1i'!ha3.&0-
7:=
Lp trnh ha trn Java 2D v 3D
SceneGraphPathvw pick!<int xpos@ int 'pos=
TrW v" -ut -Wng tha- &hiJ! t]t &W &C& thDnh phn n- (i
>ran&h)r0!p &x gia0 &^t vi -ut ra3 @^t ! tt vU trv vi'?'r vD tr ti
;h!ng hnh th'0 hng vD '- ti ,C& Unh
SceneGraphPathvw pick!Sorted<int xpos@ int 'pos=
Tng t` phng tha& trIn nhng -Wng trW v R& *^p ,Jp th'0 tha t`.
SceneGraphPath pick!n'<int xpos@ int 'pos=
TrW v" tha- &hiJ! Jn -ut Qi tRng n- (i >ran&h)r0!p &x gia0 &^t
vi -ut ra3 @^t ! tt vU trv vi'?'r vD tr ti ;h!ng hnh th'0 hng vD
'- ti ,C& Unh
SceneGraphPath pickCosest<int xpos@ int 'pos=
bode pickbode<SceneGraphPath s$Path@ int nodeut'pes=
TrW v" -ut Qi tRng S0(' &x ;iT! ,C& Unh vD &x &ha Qi tRng
2&'n')raphPath ,C& Unh giC trU &wa ;iT! n0('B
Pi&;M@N'&t.>.#SCK).M4P+
Pi&;M@N'&t.).M4P+ Pi&;M@N'&t.L$Si+ Pi&;M@N'&t./M.PK+
Pi&;M@N'&t.P.$/$T$X%+
Pi&;M@N'&t.2K#P%5D+ Pi&;M@N'&t.2L$TCK+
Pi&;M@N'&t.T.#S28M./).M4P.
bode pickbode<SceneGraphPath s$Path@ int nodeut'pes@ int
occurrence=
Pickin$Ca,ack .nterface
)ia0 (iEn Pi&;ingCa11@a&; &!ng &]p -ut ;hng 1D- viE& T thta ;J
-ut 1p pi&;ing &x tr&.
.nterface Pickin$Ca,ack /ethod Su""ar'
httpBOOtai1i'!ha3.&0-
7:9
Lp trnh ha trn Java 2D v 3D
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
void transfor"Chan$ed<int t'pe@ Transfor"Group t$=
LNp .ntersect
Lp &!ng &]p &C& phng tha& T ;iT- tra viE& ia0 &^t &wa -ut Qi
tRng Pi&;2hap' f&0r' &1a**g vi -ut Qi tRng g'0-'tr3 pri-itiv'*.
.ntersect Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B Nava.1ang.M@N'&t
.ntersect<=
KD- te0 $nt'r*'&t.
.ntersect /ethod Su""ar' <partia ist=
,ooean point!ndLine<PickPoint point@ Point*dvw coordinates@ int
index=
TrW v" tr!' nJ! nh Qi tRng Pi&;P0int vD Qi tRng Lin' gia0 nha!.
Li'n !R& ,C& Unh @yi tha- *Q ! vD0.
,ooean point!ndPoint<PickPoint point@ Point*d pnt=
Tra v" tr!' nc! Qi tRng Pi&;P0int vD Qi tRng P0int5( gia0 &^t nha!.
,ooean ra'!ndLine<Pick#a' ra'@ Point*dvw coordinates@ int index@
dou,evw dist=
,ooean ra'!ndPoint<Pick#a' ra'@ Point*d pnt@ dou,evw dist=
,ooean ra'!nd6uad<Pick#a' ra'@ Point*dvw coordinates@ int index@
dou,evw dist=
,ooean ra'!ndTrian$e<Pick#a' ra'@ Point*dvw coordinates@ int
index@
httpBOOtai1i'!ha3.&0-
7<0
Lp trnh ha trn Java 2D v 3D
dou,evw dist=
,ooean se$"ent!ndLine<PickSe$"ent se$"ent@ Point*dvw
coordinates@ int index@
dou,evw dist=
.ntersect /ethod Su""ar' <partia ist o continued=
,ooean se$"ent!ndPoint<PickSe$"ent se$"ent@ Point*d pnt@
dou,evw dist=
,ooean se$"ent!nd6uad<PickSe$"ent se$"ent@ Point*dvw
coordinates@ int index@
dou,evw dist=
,ooean se$"ent!ndTrian$e<PickSe$"ent se$"ent@ Point*dvw
coordinates@
int index@ dou,evw dist=
-.3.- CMc Np Pickin$ Behavior
)xi &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing &!ng &]p &C& 1p
Pick#otateBehavior
Lp Pi&;.0tat'>'havi0r &h0 phcp ngzi (_ng t0ng tC& pi&; vD
r0tat' Qi tRng tr`& !an.
Pick#otateBehavior Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B Pi&;/0!*'>'havi0r
Th`& thi*B Pi&;ingCa11@a&;
Pick#otateBehavior<BranchGroup root@ Canvas*& canvas@ Bounds
,ounds=
httpBOOtai1i'!ha3.&0-
7<1
Lp trnh ha trn Java 2D v 3D
Pick#otateBehavior<BranchGroup root@ Canvas*& canvas@ Bounds
,ounds@
int pick/ode=
)iCptrU Pi&;/0(' B Pi&;M@N'&t.42%>M4SD2 ha3
Pi&;M@N'&t.42%)%M/%T.|. S0t'B $6 pi&;/0(' i* *'t
t0 Pi&;M@N'&t.42%)%M/%T.|+ a11 g'0-'tr3 0@N'&t* in th' *&'n'
graph int'n('( t0 @' avai1a@1' 60r pi&;ing
-!*t hav' th'ir #LLML$ST%.2%CT @it *'t.
Pick#otateBehavior /ethod Su""ar'
void setPick/ode<int pick/ode=
ThiJt 1p giC trU pi&;/0('B nhen -ut tr0ng &C& giC trU
Pi&;M@N'&t.42%>M4SD2 ha3
Pi&;M@N'&t.42%)%M/%T.|.
void setupCa,ack<Pickin$Ca,ack ca,ack=
void transfor"Chan$ed<int t'pe@ Transfor"*& transfor"=
void updateScene<int xpos@ int 'pos=
PickTransateBehavior
Lp Pi&;Tran*1at'>'havi0r &h0 phcp ngzi (!ng tng tC& pi&; vD
tran*1at' Qi tRng tr`& !an. /ut thT hiEn &wa 1p
Pi&;Tran*1at'>'havi0r &x thT !R& *G (bng ;Jt hRp vi &C& Qi tRng
t&wa &C& 1p pi&;ing ;hC&.
PickTransateBehavior Constructor Su""ar'
)xi B &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B Pi&;/0!*'>'havi0r
httpBOOtai1i'!ha3.&0-
7<2
Lp trnh ha trn Java 2D v 3D
Th`& thiB Pi&;ingCa11@a&;
PickTransateBehavior<BranchGroup root@ Canvas*& canvas@
Bounds ,ounds=
ihyi te0 hDnh vi pi&;Otran*1at' &hz *` ;iEn tt &h!ut tr0ng thU ;h!ng
&Wnh
PickTransateBehavior<BranchGroup root@ Canvas*& canvas@
Bounds ,ounds@
int pick/ode=
PickTransateBehavior /ethod Su""ar'
void setPick/ode<int pick/ode=
ThiJt 1ep giC trU thDnh phn pi&;/0('
void setupCa,ack<Pickin$Ca,ack ca,ack=
[Vng ;v 1p &a11@a&; R& gi -\i ;hi Qi tRng R& ;v&h hat.
void transfor"Chan$ed<int t'pe@ Transfor"*& transfor"=
void updateScene<int xpos@ int 'pos=
Pickoo"Behavior
Lp Pi&;00->'havi0r &h0 phcp ngzi (!ng tng tC& pi&; vD 00-
Qi tRng tr`& !an. /ut thT hiEn &wa 1p Pi&;00->'havi0r &x thT !R&
*G (bng ;Jt hRp vi &C& Qi tRng t&wa &C& 1p pi&;ing ;hC&.
Pickoo"Behavior Constructor Su""ar'
)xiB &0-.*!n.N5(.!ti1*.@'havi0r*.pi&;ing
Thta ;J B Pi&;/0!*'>'havi0r
Th`& thiB Pi&;ingCa11@a&;
httpBOOtai1i'!ha3.&0-
7<5
Lp trnh ha trn Java 2D v 3D
Pickoo"Behavior<BranchGroup root@ Canvas*& canvas@ Bounds
,ounds=
ihyi te0 hDnh vi pi&;O00- &hz *` ;iEn tt &h!ut tr0ng thU ;h!ng &Wnh
Pickoo"Behavior<BranchGroup root@ Canvas*& canvas@ Bounds
,ounds@
int pick/ode=
Pickoo"Behavior /ethod Su""ar'
void setPick/ode<int pick/ode=
ThiJt 1ep giC trU thDnh phn pi&;/0(' .
void setupCa,ack<Pickin$Ca,ack ca,ack=
[Vng ;v 1p &a11@a&; R& gi -\i ;hi Qi tRng R& ;v&h hat.
void transfor"Chan$ed<int t'pe@ Transfor"*& transfor"=
Phng tha& Ca11@a&; tt 1p /0!*'00-.
void updateScene<int xpos@ int 'pos=
Cp nht ;h!ng &Wnh .
C*ABCG 3
*.4t *'nh
httpBOOtai1i'!ha3.&0-
7<7
Lp trnh ha trn Java 2D v 3D
Tr0ng &hng nD3+ &hng tji *Y trnh @D3 &C& v]n " & @Wn *a!B
2G (bng &C& 1p !pha vD .nterpoator T thI- &C& h0et Wnh
n giWn
2G (bng &C& 1p LF& vD Bi,oard T giW- ;hQi 1Rng tvnh
t0Cn ;hi te0 &C& h0et Wnh
2G (bng Qi tRng /orph vi &C& Qi tRng hDnh vi t_3 &hnh
T te0 h0et Wnh tt &C& ;h!ng hnh &hvnh
Te0 Qi tRng hnh h& ung T te0 >'havi0r hiE! &hnh (Z 1iE!
>|.%8%.%SC%.
Tr0ng thJ gii W0+ &x r]t nhi"! Qi tRng tr`& !an tha3 i u& 1p vi
hDnh ung &wa &0n ngzi. Xv nh -ut &hiJ& ng h W0 &hng hen+ nx &x
thT h0et ung -D ;hjng &n tng tC& &wa ngzi (_ng. ChiJ& ng h
&hvnh 1D -ut vv (b v" h0et Wnh. X3 h0et Wnh 1D nhZng tha3 i ,W3 ra
tr0ng v trb W0 -D ;hjng &x tng tC& tr`& tiJp &wa &0n ngzi. SgR& 1ei+
nhZng tha3 i ,W3 ra tr0ng v trb W0 -D 1D ;Jt !W tr`& tiJp &wa hDnh
ung ngzi (_ng th R& gi 1D tng tC& f&hng ta ,ct tr0ng &hng
7g.
httpBOOtai1i'!ha3.&0-
7<9
Lp trnh ha trn Java 2D v 3D
0ni!ati%n ? Z%`t hnhA
Tng t` nh phn tng tC&+ h0et Wnh tr0ng Java 5D &ng R& &Di
t nhz *G (bng Qi tRng >'havi0r fhDnh vig. >]t &a h0et Wnh nD0 &ng
&x thT te0 ra R& vi &C& Qi tRng hDnh vi. T!3 nhiIn+ Java 5D #P$
&!ng &]p -ut tp &C& 1p &h0 phcp te0 h0et Wnh -D ;hjng phWi te0 -ut
1p -i. CC& 1p nD3 "! ;J thta 1p >'havi0r.
Java 5D &!ng &]p -ut tp &C& 1p h0et Wnh &x vai trd nh nhZng @u
nui *!3 f.nterpoator g. [Qi tRng .nterpoator &_ng vi -ut Qi tRng
!pha i"! ;hiTn -ut vDi thjng *Q &wa Qi tRng thU ;h!ng &Wnh T
te0 ra h0et Wnh (`a thzi gian. [Qi tRng !pha &!ng &]p & &hJ Unh thzi
gian. Chi tiJt v" hai 1p Qi tRng nD3 *Y R& @Dn Jn tr0ng -b& 9.2.
/ut tp &C& 1p h0et Wnh ;hC& tr0ng Java 5D te0 h0et Wnh &h0 &C& Qi
tRng tr`& !an nhz Cp ang *` tha3 i v" ;h!ng nhn. Tp &C& 1p nD3
f@a0 g-B 1p Mri'nt'(2hap'5D+ &C& 1p hDnh vi Bi,oard vD L'v'1 M6
D'tai1 fLF& gg ;hjng R& i"! ;hiTn @yi &C& ;h0Wng thzi gian -D @yi
vU trv vD hng &wa ;h!ng nhn. Kai 1p hDnh vi *Y R& ,ct ;h hn tr0ng
&C& -b& 9.5 vD 9.9
/ut vDi 1p h0et Wnh ;hjng ;J thta tt 1p >'havi0r nhB
Mri'nt'(2hap'5D vD /orph . /b& 9.7 *Y trnh @D3 v" Mri'nt'(2hap'5D+
1p h0et Wnh R& a vD0 Java 5D #P$ tt phiIn @Wn v1.2 nh -ut *`
tha3 thJ &h0 hDnh vi Bi,oard tr0ng &C& phiIn @Wn tr& x. /b& 9.:
trnh @D3 v" /orph + 1p h0et Wnh R& *G (bng &W tr0ng &C& ang (bng
h0et Wnh vD nui *!3.
httpBOOtai1i'!ha3.&0-
7<:
Lp trnh ha trn Java 2D v 3D
Knh 9P1. 2 phsn &]p &C& 1p h0et Wnh ;J thta >'havi0r
hii t\]n" 1nterp%&at%r v3 0&pha vi h%`t Fnh dUa thji "ian
[Qi tRng !pha *inh ra -ut giC trU n- tr0ng ;h0Wng tt 0 Jn 1 t_3
th!u& vD0 thzi gian vD &C& tha- *Q &wa Qi tRng !pha. Th`& thT nui *!3
f.nterpoator g 1D &C& Qi tRng hDnh vi t_3 &hnh *G (bng -ut Qi tRng
!pha T *inh h0et Wnh &h0 &C& Qi tRng tr`& !an. Sui *!3 @a0 g- *`
tha3 i vU trv+ hng+ u 1n+ -D! *^& h0& u tr0ng *!Qt &wa Qi tRng.
CC& hDnh vi nui *!3 &x thT R& &Di t @ng &C&h te0 ra -ut 1p hDnh vi
t_3 &hnh+ t!3 nhiIn+ *G (bng 1p nui *!3 &h0 phcp te0 h0et Wnh (k (Dng
hn nhi"!. Tr0ng phn 9.2.5+ &hng ta *Y ,ct -ut vv (b *G (bng 1p nui
*!3 .0tati0n$nt'rp01at0r.
0&pha
[Qi tRng !pha *inh ra -ut giC trU+ R& gi 1D giC trU !pha+ n-
tr0ng ;h0Wng tt 0.0 vD 1.0+ ;T &W hai ! -t. )iC trU !pha tha3 i th'0
thzi gian nh Unh *n @yi &C& tha- *Q &wa Qi tRng !pha. Xi &C&
@u giC trU tha- *Q nh]t Unh+ tei thzi iT- &b thT+ Qi tRng !pha &h
*inh ra -ut giC trU !pha (!3 nh]t. >iT! (ikn @ng thU giC trU !pha *0
vi thzi gian+ &hng ta *Y R& -ut (eng *xng -D Qi tRng !pha *inh
ra.
[ thU (eng *xng &wa Qi tRng !pha &x @Qn 0enB !pha tVng+
!pha @ng 1+ !pha giW- vD !pha @ng 0. >Qn 0en nD3 te0 thDnh -ut
httpBOOtai1i'!ha3.&0-
7<<
Lp trnh ha trn Java 2D v 3D
&h! ; &wa (eng *xng !pha vD tng ang vi @Qn tha- *Q &wa Qi tRng
!pha. Thzi gian &wa -ut &h! ; R& ,C& Unh @ng -ut *Q ng!3In+ n
vU tvnh 1D -i1i gis3. Knh 9P2 @iT! (ikn @Qn 0en &wa (eng *xng !pha.
XiE& Unh thzi gian &wa &C& Qi tRng !pha &x 1iIn hE vi thzi iT-
;hyi ung &hng. Thzi iT- ;hyi ung &wa t]t &W &C& Qi tRng !pha
"! R& 1]3 tt thzi iT- ;hyi ung hE thQng. X thJ t!3 &C& Qi tRng
!pha R& te0 ra y &C& thzi iT- ;hC& nha!+ nhng &hng "! &x &h!ng
-ut thzi iT- ;hyi ung. iJt !W 1D+ t]t &W &C& Qi tRng nui *!3 -& (_
(`a trIn &C& Qi tRng !pha ;hC& nha! nhng "! R& ng @u hxa.
Deng *xng &wa &C& Qi tRng !pha &x thT @^t ! y nhZng thzi iT-
;hC& nha!. Ch! ; (eng *xng ! tiIn &wa -ut Qi tRng !pha &x thT @U
trk (0 viE& *G (bng -ut tr0ng hai h0& &W hai tha- *QB Trigg'rTi-' fthzi
iT- ;v&h h0etg vD Pha*'D'1a3D!rati0n fthzi gian trkg. Trigg'rTi-' ,C&
Unh ;h0Wng thzi gian tt 1& Qi tRng !pha ;hyi ung &h0 Jn ;hi @^t
! h0et ung. 2a! ;h0Wng thzi gian ,C& Unh @yi tha- *Q
Pha*'D'1a3D!rati0n tvnh tt thzi iT- ;v&h h0et Trigg'rTi-'+ &h! ; &wa
(eng *xng ! tiIn @^t !. CC& tha- *Q nD3 R& thT hiEn tr0ng hnh 9P
2.
Deng *xng &wa Qi tRng !pha &x thT !a3 vdng -ut &h! ;+ tiJp tb&
!a3 vdng vi *Q 1n ,C& Unh h0& *Y !a3 vdng ;hjng (tng. 2Q &h! ;
&wa *xng ,C& Unh @yi tha- *Q 100pC0!nt. 100pC0!nt (ng !i Unh *Q
&h! ;+ 100pC0!nt @ng 1 ,C& Unh vdng 1p ;hjng (tng. SJ! (eng *xng
!pha !a3 vdng hn 1 &h! ;+ t]t &W &C& giai 0en trIn "! R& 1p 1ei+
ng0ei trt giai 0en trk.
httpBOOtai1i'!ha3.&0-
7<=
Lp trnh ha trn Java 2D v 3D
Knh 9P2. CC& giai 0en &wa (eng *xng !pha
Deng *xng !pha &x thT ;hjng *G (bng t]t &W @Qn giai 0en trIn -D
&x thT R& te0 thDnh tt -ut+ hai+ @a h0& @Qn giai 0en. Knh 9P5 @iT!
(ikn -ut *Q (eng *xng te0 @yi -ut+ hai h0& @a giai 0en.
[Qi tRng !pha &x hai ;iT! &h Unh &C& tp &0n giai 0en R& *G
(bng. iiT! $SC.%#2$S)%S#>L% &h Unh *G (bng &C& giai 0en
!pha tVng vD giai 0en !pha @ng 1. iiT! D%C.%#2$S)%S#>L%
&h Unh *G (bng giai 0en !pha giW- vD !pha @ng 0. iiT! tha @a 1D
;Jt hRp &wa &W hai ;iT! trIn+ &h Unh *G (bng &W @Qn giai 0en.
Knh 9P5. /ut vDi (eng *xng & *y R& te0 vi Qi tRng !pha
httpBOOtai1i'!ha3.&0-
7<9
Lp trnh ha trn Java 2D v 3D
CC& & tW v" ;iT! &wa Qi tRng !pha *Y vj hiE! &C& thiJt 1p tha-
*Q ;h0Wng thzi gian. Xv (b+ ;hi ;iT! 1D $SC.%#2$S)$S#>L%+ th &C&
tha- *Q D'&r'a*ing#1phaD!rati0n+ D'&r'a*ing#1pha.a-pD!rati0n vD
#1pha#t'r0D!rati0n *Y @U @ !a. /& (_ @]t ; -ut (eng *xng nD0
&ng &x thT ,s3 (`ng R& @ng &C&h &h0 ;h0Wng thzi gian tn tei &wa
&C& giai 0en ;hjng &n thiJt @ng 0+ t!3 nhiIn+ viE& & tW &hvnh ,C& ;iT!
*Y 1D- tVng hiE! !W &wa Qi tRng !pha.
2G (bng &C& Qi tRng .nterpoator vD !phaB
CC&h tha& *G (bng &C& Qi tRng .nterpoator vD !pha r]t giQng
vi &C&h tha& *G (bng Qi tRng hDnh vi. [iT- ;hC& @iEt 1n nh]t *0 vi
&C&h *G (bng Qi tRng hDnh vi &hvnh 1D viE& gup &_ng vi Qi tRng
!pha.
Cjng tha& *G (bng &C& Qi tRng .nterpoator vD !pha &x thT tx-
t^t nh *a!B
(. te0 Qi tRng v&h vi &C& ;hW nVng thv&h hRp
%. te0 Qi tRng !pha
*. te0 Qi tRng .nterpoator tha- &hiJ! Jn Jn Qi tRng
!pha vD Qi tRng v&h
-. thI- &C& gii hen &h0 Qi tRng .nterpoator
2. thI- Qi tRng .nterpoator vD0 thU ;h!ng &Wnh
Knh 9P7. Cjng tha& *G (bng &C& Qi tRng .nterpoator vD !pha
T te0 h0et Wnh
Xv (b *G (bng 1p !pha vD .0tati0n$nt'rp01at0rB
C10&;#pp.Nava 1D -ut vv (b *G (bng 1p .0tati0n$nt'rp01at0r. ih!ng
&Wnh 1D -t -ut &hiJ& ng h. ChiJ& ng h nD3 R& i"! ;hiTn !a3
httpBOOtai1i'!ha3.&0-
7=0
Lp trnh ha trn Java 2D v 3D
-\i pht -ut 1n @yi hai Qi tRng .0tati0n$nt'rp01at0r vD !pha.
Chng trnh 3 w ,in ,'- phn phb 1b&+ y s3 &hng tji &h trv&h rt
-ut phn T tp tr!ng vD0 v]n " &hvnh.
Tr0ng &hng trnh nD3+ Qi tRng v&h 1D -ut Qi tRng
Tran*60r-)r0!p. |I! &! Qi tRng nD3 phWi R& thiJt 1p ;hW nVng
#LLMLT.#S28M./L.$T%. CC& Qi tRng .nterpoator ;hC&
nha! *Y h0et ung trIn &C& Qi tRng v&h ;hC& nha!. Xv (b+ v&h &wa Qi
tRng C010r$nt'rp01at0r 1D -ut Qi tRng /at'ria1. [Qi tRng
.nterpoator thiJt 1p giC trU &wa Qi tRng v&h (`a vD0 &C& giC trU &wa
Qi tRng !pha vD &C& giC trU (0 &hvnh nx 1! giZ.
[Qi tRng .nterpoator Unh nghha iT- ;Jt th& &wa h0et Wnh.
Tr0ng trzng hRp &wa .0tati0n$nt'rp01at0r+ Qi tRng nD3 ,C& Unh gx&
!a3 @^t ! vD ;Jt th&. [Qi tRng !pha i"! ;hiTn h0et Wnh tng ang
vi thzi gian vD &C&h -D .nterpoator (U&h &h!3Tn tt iT- nD3 Jn -ut
iT- ;hC& @ng & tW &C& giai 0en &wa (eng *xng !pha.
ng (bng nD3 *G (bng thiJt 1p -& Unh &h0 Qi tRng
.0tati0n$nt'rp01at0r vi gx& @^t ! 1D 0 vD gx& ;Jt th& 1D 2 f-ut vdng
!a3 h0Dn &hnhg. Trb& !a3 -& Unh 1D trb& 3. [Qi tRng !pha R&
thiJt 1p y &hJ u !a3 ;hjng (tng f100pC0!nt P1g vi !ng thzi gian
1D 1 pht f:0.000 -i1i gis3g. Kai Qi tRng nD3 ;Jt hRp vi nha! *Y 1D-
&h0 Qi tRng tr`& !an fQi tRng v&hg !a3 -ut vdng h0Dn &hnh tr0ng
1 pht. Ch! trnh nD3 R& tiJp (ikn vD 1p 1ei nga3 1p ta&. iJt !W 1D
&hiJ& ng h (zng nh !a3 ;hjng ngtng &ha ;hjng phWi 1D !a3 -ut
vdng ri @^t ! 1ei -ut vdng ;hC&.
[0en - *a! Unh nghha phng tha& &r'at'2&'n')raph tr0ng &hng
trnh C10&;#pp.Nava. [0en - nD3 R& Cnh (]! &C& @& tng ang
vi &jng tha& a ra tr0ng hnh 9P7.
public Branch%roup createSceneGraph(& Q
httpBOOtai1i'!ha3.&0-
7=1
Lp trnh ha trn Java 2D v 3D
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
// create target Transform%roup with
Capabi*ities
Transform%roup ob\0pin = new
Transform%roup(&'
ob\0pin.setCapabi*it,(Transform%roup./NN-
V"T$/#0d-$M"V${T!&'
// create /*pha that continuous*, rotates
with a period of O minute
/*pha a*pha = new /*pha (XO, u++++&'
// create rotation about ,Xaxis
$otation{nterpo*ator rot{nt = new
$otation{nterpo*ator (a*pha, ob\0pin&'
rot{nt.set0chedu*ingBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(ob\0pin&'
ob\0pin.addChi*d(new C*ocW(&&'
ob\$oot.addChi*d(rot{nt&'
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
httpBOOtai1i'!ha3.&0-
7=2
Lp trnh ha trn Java 2D v 3D
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
C*ocW/pp
Knh 9P9 1D -ut &Wnh R& te0 ra @ng &hng trnh C10&;#pp tei 7B50.
/t ng h trjng @U nghiIng i 1D (0 &W -t ]3 !a3 th'0 trb& thng
ang.
L" tr;n dln$ sn$ !pha
Sg0Di ;h0Wng thzi gian &wa 7 giai 0en nh trnh @D3+ ngzi 1p
trnh &dn &x thT ,C& Unh &C& *zn th0Wi &h0 giai 0en !pha tVng vD
!pha giW-. Tr0ng 0en th0Wi nD3+ giC trU !pha tha3 i (n (n. Tr0ng
trzng hRp 1p trnh &h0 vt thT &h!3Tn ung+ th &C&h nD3 &h0 phcp vt
thT &h!3Tn ung &h- (n h0& nhanh (n trjng giQng tht hn.
X giC trU &wa 0en (Q& th0Wi tC& ung Jn &W phn @^t ! vD ;Jt th&
&wa giai 0en+ nIn 0en nD3 1n nh]t &h @ng -ut nGa &wa &W giai 0en.
httpBOOtai1i'!ha3.&0-
7=5
Lp trnh ha trn Java 2D v 3D
Knh 9P9. /ut &Wnh *inh @yi &hng trnh C10&;#pp tei 7B50
Knh 9P: @iT! (ikn -ut (eng *xng !pha R& thiJt 1p &W
Knh 9P:. LD- trn (eng *xng !pha
#1pha#pp.Nava f,'- phb 1b&g 1D -ut &hng trnh vv (b v" tC& ung
&wa viE& thiJt 1p $n&r'a*ing#1pha.a-pD!rati0n trIn -ut (eng *xng
!pha. 2` ;hC& @iEt v" giC trU *Y R& Cnh giC tr`& !an !a viE& !an
*Ct &h!3Tn ung &wa 5 &hiJ& j tj. CW 5 &hiJ& nD3 ,!]t phCt tei &_ng -ut
ta u , vD (i &h!3Tn *0ng *0ng vi nha!. ChiJ& ,' trIn &_ng ;hjng &x
0en giC trU !pha th0Wi+ &hiJ& (i &_ng &x 0en th0Wi vi giC trU 1n
nh]t f@ng -ut nGa &wa giai 0en !pha tVng h0& giW-g+ &dn &hiJ& y
httpBOOtai1i'!ha3.&0-
7=7
Lp trnh ha trn Java 2D v 3D
giZa &x 0en th0Wi vi giC trU @ng -ut nGa giC trU 1n nh]t fta& 1D @ng
giai 0en !pha tVng h0& giW-g. /\i ,' &n 2 gis3 T &h!3Tn ung !a
;h!ng nhn.
Ti-' 0.7* Ti-' 0.=*
Ti-' 1.2* Ti-' 1.:*
Knh 9P<. TC& (bng &wa $n&r'a*ing#1pha.a-pD!rati0n trIn -ut (eng
*xng !pha
Knh 9P< @iT! (ikn 7 &Wnh *inh ra tt &hng trnh #1pha#pp. F!an
*Ct &hng trnh+ &hng ta &x thT nhn th]3 rngB @an ! &hiJ& ,' trIn
&_ng f;hjng &x 0en th0Wig &h!3Tn ung nhanh hn vD giZ ng!3In tQ&
httpBOOtai1i'!ha3.&0-
7=9
Lp trnh ha trn Java 2D v 3D
u+ hai &hiJ& phva (i &h!3Tn ung &h- hn nhng nhanh (n. [Jn
thzi iT- 1 gis3 *a! ;hi ;hyi ung+ &W 5 &hiJ& "! i R& !ng zng
giQng nha!. Tr0ng -ut nGa !ng zng &dn 1ei+ vU trv &wa 5 &hiJ& ,' @U
W0 ngR& vi &hiJ& (i &_ng &he3 nhanh nh]t nhng &h- (n. C!Qi
&_ng+ ;hi hJt 2 gis3+ 5 &hiJ& ,' 1ei @^t ;Up nha!.
0&pha 0P1A
Lp !pha &x vai trd &h!3Tn i -ut giC trU thzi gian v" -ut giC trU
!pha fgiC trU n- tr0ng ;h0Wng tt 0 Jn 1+ ;T &W hai ! -tg. X v3+
&x thT nxi Qi tRng !pha 1D -ut hD- &wa thzi gian+ trW v" -ut giC trU
n- tr0ng 0en 0+ 1. ng (bng thjng thzng &wa !pha 1D &!ng &]p giC
trU !pha &h0 &C& hDnh vi .nterpoator .
CC& phng tha& #P$ &wa 1p !pha &x thT t_3 @iJn -ut &C&h (k
(Dng T *G (bng tr0ng &C& ang (bng @ng &C&h tC& ung vD0 &C& tha- *Q
&wa &hng. 7 phng tha& ;hyi te0 &hw 3J! *a! ,!]t hiEn tr0ng h! hJt
&C& ang (bng !phaB
!pha<=
ihyi te0 Qi tRng !pha vi -0(' $SC.%#2$S)%S#>L%+
100pC0!nt P1+ in&r'a*ing#1phaD!rati0n 1000+ t]t &W &C& tha- *Q ;hC&
0+ ng0ei trt thzi gian ;hyi ungB 2tartTi-'. 2tartTi-' R& thiJt 1p
@ng thzi gian ;hyi ung &wa &hng trnh.
!phafint 100pC0!nt+ 10ng in&r'a*ing#1phaD!rati0ng
ihyi te0 Qi tRng !pha vi hai tha- *Q 100pC0!nt vD
in&r'a*ing#1phaD!rati0n 1D t_3 @iJn &wa ngzi (_ng+ thiJt 1p &hJ u
$SC.%#2$S)%S#>L% vD gCn giC trU 0 &h0 t]t &W &C& tha- *Q &dn 1ei
fng0ei trt 2tartTi-'g.
lpha[int loop)ount0 long trigger,i+e0
long phaseDelayDuration0 long in&reasing$lphaDuration0
long in&reasing$lpha(a+pDuration0
httpBOOtai1i'!ha3.&0-
7=:
Lp trnh ha trn Java 2D v 3D
long alpha$t'neDuration\
ihyi te0 Qi tRng !pha y &hJ u $SC.%#2$S)%S#>L%
lpha[int loop)ount0 int +ode0 long trigger,i+e0
long phaseDelayDuration0 long in&reasing$lphaDuration0 long
in&reasing$lpha(a+pDuration0
long alpha$t'neDuration0 long de&reasing$lphaDuration0 long
alpha$tberoDuration\
ihyi te0 Qi tRng !pha th'0 &C& tha- *Q Unh nghha &wa ngzi (_ng.
Lp !pha &!ng &]p r]t nhi"! &C& phng tha& hZ! v&h+ &h0 phcp
ngzi (_ng t! @iJn &C& & tvnh &wa Qi tRng !pha. Chng tji 1iEt ;I y
s3 -ut vDi phng tha& ph (bng nh]t. Ch H rng -\i phng tha& *'t
fphng tha& thiJt 1pg "! &x -ut phng tha& g't f;hjng tha- *Qg trW
v" -ut giC trU &_ng ;iT! vi ;iT! &wa tha- *Q &x -t tr0ng phng tha&
*'t tng ang.
3oolean finished[\
iiT- tra ,'- Qi tRng !pha hiEn thzi ;Jt th& -i h0et ung
&wa nx ha3 &ha.
void set$lpha$t'neDuration[long alpha$t'neDuration\
ThiJt 1p th!u& tvnh a1pha#tMn'D!rati0n &wa Qi tRng !pha hiEn
thzi Jn giC trU ,C& Unh.
void set$lpha$tberoDuration[long alpha$tberoDuration\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh a1pha#t'r0D!rati0n &wa Qi
tRng !pha hiEn thzi.
void setDe&reasing$lphaDuration[long de&reasing$lphaDuration\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh ('&r'a*ing#1phaD!rati0n &wa
Qi tRng !pha hiEn thzi.
void setDe&reasing$lpha(a+pDuration[long
de&reasing$lpha(a+pDuration\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh
httpBOOtai1i'!ha3.&0-
7=<
Lp trnh ha trn Java 2D v 3D
('&r'a*ing#1pha.a-pD!rati0n &wa Qi !pha tRng hiEn thzi.
void seten&reasing$lphaDuration[long in&reasing$lphaDuration\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh in&r'a*ing#1phaD!rati0n &wa
Qi tRng !pha hiEn thzi.
void seten&reasing$lpha(a+pDuration[long
de&reasing$lpha(a+pDuration\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh
in&r'a*ing#1pha.a-pD!rati0n &wa Qi tRng !pha hiEn thzi.
void setLoop)ount[int loop)ount\
ThiJt 1p giC trU ,C& Unh &h0 th!u& tvnh 100pC0!nt &wa Qi tRng
!pha hiEn thzi.
void set*ode[int +ode\
ThiJt 1p &hJ u ,C& Unh @yi Qi *Q -0(' &h0 Qi tRng !pha hiEn
thzi. -0(' &x thT 1D $SC.%#2$S)%S#>L% h0&
D%C.%#2$S)%S#>L%+ ha3 1D h0& &wa hai giC trU.
$SC.%#2$S)%S#>L% P &h Unh *G (bng giai 0en 5 vD 7
D%C.%#2$S)%S#>L% P &h Unh *G (bng giai 0en 1 vD 2
void set!haseDelayDuration[long phaseDelayDuration\
ThiJt 1p giC trU pha*'D'1a3D!rati0n &wa Qi tRng !pha hiEn thzi
@ng giC trU &h0 tr0ng Qi *Q.
void set"tart,i+e[long start,i+e\
ThiJt 1p giC trU *tartTi-' &wa Qi tRng !pha hiEn thzi @ng giC trU
&h0 tr0ng Qi *Q. *tartTi-' !3 Unh -Q& &h0 -i tvnh t0Cn thzi gian
tng Qi. )iC trU -& Unh &wa *tartTi-' 1D thzi iT- ;hyi ung hE
thQng.
void set,rigger,i+e[long trigger,i+e\
ThiJt 1p giC trU trigg'rTi-' &wa Qi tRng !pha hiEn thzi @ng giC
trU &h0 tr0ng Qi *Q.
httpBOOtai1i'!ha3.&0-
7==
Lp trnh ha trn Java 2D v 3D
float value[\
TrW v" -ut giC trU n- tr0ng 0en 0+ 1 (`a trIn thzi gian hiEn thzi vD
Qi *Q ti-'Pt0P!pha R& thiJt 1p &h0 Qi tRng !pha ang ,ct.
float value[long at,i+e\
TrW v" -ut giC trU n- tr0ng 0en 0+ 1 (`a trIn giC trU atTi-' vD Qi
*Q ti-'Pt0P!pha R& thiJt 1p &h0 Qi tRng !pha ang ,ct.
*2c &p h3nh vi 1nterp%&at%r A
.nterpoator 1D -ut 1p trt! tRng+ ;J thta 1p hDnh vi >'havi0r T
&!ng &]p &C& phng tha& &h!ng &h0 &C& 1p &0n nui *!3. Cx ;h0Wng hn
10 1p &0n .nterpoator & @Wn. Knh 9P= @iT! (ikn -Qi !an hE &wa &C&
1p .nterpoator & *y fj *Cng -D!g tr0ng Java 5D &_ng &C& gxi tiEn v&h
fj *- -D!g.
Knh 9P=. >iT! phsn &]p 1p Qi tRng .nterpoator & *y tr0ng Java
5D vD &C& tiEn v&h
/\i Qi tRng nui *!3 .nterpoator 1D -ut Qi tRng hDnh vi
>'havi0r t_3 @iJn &x & &hJ ;v&h h0et T Cnh tha& -\i ;h!ng Wnh.
Tr0ng phng tha& pr0&'**2ti-!1!*+ Qi tRng .nterpoator ;iT- tra
giC trU &wa Qi tRng !pha 1iIn hRp vi nx+ hiE! &hnh Qi tRng v&h
(`a trIn &C& giC trU nD3 ri ,C& 1p 1ei & &hJ ;v&h h0et T Cnh tha&
;h!ng Wnh tiJp th'0 ftrt phi Qi tRng !pha ;Jt th& h0et ungg. /ut
httpBOOtai1i'!ha3.&0-
7=9
Lp trnh ha trn Java 2D v 3D
vDi phng tha& nD3 R& &!ng &]p @yi 1p trt! tRng .nterpoator + &dn
h! hJt &C& hDnh vi &dn 1ei R& &Di t tr0ng -\i 1p .nterpoator n
1.
/\i Qi tRng .nterpoator &haa 2 giC trU R& *G (bng nh &C&
iT- gii hen &h0 &C& hDnh ung R& nui *!3. Xv (b+ Qi tRng nui *!3
.0tati0n$nt'rp01at0r 1! trZ hai gx& 1D gii hen !a3 (0 nx i"! ;hiTn.
Xi -\i ;h!ng Wnh+ Qi tRng .nterpoator ;iT- tra giC trU !pha &wa
Qi tRng !pha 1iIn hRp vi nx ri te0 ra &C& hiE! &hnh !a3 thv&h hRp
&h0 Qi tRng v&h Tran*60r-)r0!p &wa nx. SJ! giC trU !pha 1D 0 th
-ut tr0ng hai giC trU *Y R& *G (bng nJ! giC trU !pha 1D 1+ th giC trU ;ia
*Y R& *G (bng. SJ! giC trU !pha n- tr0ng ;h0Wng tt 0 Jn 1+ Qi
tRng .nterpoator *Y nui *!3 t!3Jn tvnh giZa hai giC trU+ (`a trIn giC trU
!pha ri *G (bng ;Jt !W T i"! &hnh Qi tRng v&h.
/j tW &h!ng &h!ng v" &C& Qi tRng .nterpoator nh v3 ;hjng
ng 1^- vi &C& 1p 2?it&hXa1!'$nt'rp01at0r vD Path$nt'rp01at0r. [Qi
tRng 2?it&hXa1!'$nt'rp01at0r 1`a &hn -ut nt &0n tr0ng nhx- &C& nt
v&h 2?it&h+ nIn tr0ng 1p nD3+ ;hjng h" &x !C trnh nui *!3.
T!3 rng &C& 1p .nterpoator r]t giQng nha!+ &hng &ng -ang -ut
vDi &hi tiJt ;hC& nha! (k nhn ra. >Wng *a! *0 *Cnh &C& & iT- ;hC&
nha! &wa < 1p .nterpoator & @Wn. Tr0ng &C& phn *a!+ &hng ta 1n
1Rt *Y i *s! hn v" < 1p nD3.
1p .nterpoator &ha& nVng ;iT! Qi tRng v&h Trang
C010r$nt'rp01at0r tha3 i -D!
;h!3J&h tCn &wa
-ut Qi tRng
/at'ria1 9P12
Path$nt'rp01at0r 1p trt! tRng Tran*60r-)r0!p 9P20
P0*iti0n$nt'rp01at0r tha3 i vU trv
&wa Qi tRng
Tran*60r-)r0!p 9P17
.0tati0n$nt'rp01at0r tha3 i &h!3Tn Tran*60r-)r0!p 9P19
httpBOOtai1i'!ha3.&0-
790
Lp trnh ha trn Java 2D v 3D
ung !a3
fhngg &wa Qi
tRng
2&a1'$nt'rp01at0r tha3 i ;v&h &
&wa Qi tRng
Tran*60r-)r0!p 9P1:
2?it&hXa1!'$nt'rp01at0r 1`a &hn -ut
tha3 i f*?it&hg
tr0ng -ut @u &C&
Qi tRng
2?it&h 9P1<
Tran*par'n&3$nt'rp01at0r tha3 i -a& u
tr0ng *!Qt &wa
Qi tRng
Tran*par'n&3#ttri@!t'* 9P19
>Wng 9P1. Tx- t^t &C& 1p .nterpoator & @Wn
)hj k; !athenterpolator l +5t lCp tr<u t89ng0 nn -hOng &N 7i
t89ng T&h1 ,uy nhin0 3Dt &Q lCp no th<a -W lCp ny Vu &N 7i t89ng
T&h thu5& -iFu ,ransfor+ation1
lF hiFu th+ hi@u Qng &6a &J& 3nterpolator ny0 hmy xe+ vT di
enterpolator$pp1/ava [&hi tiWt L ph>n phi li&\1 ,rong &h8Mng trnh ny0
+ni 7i t89ng 3nterpolator 89& iVu -hiFn 3Li +5t 7i t89ng lpha
Mn1 )J& thay Yi vV vS trT0 ouay0 5 lCn0 +u sp&0 5 trong su7t0 v 7i
t89ng trR& ouan 89& t=o ra 3Li &J& 7i t89ng !ositionenterpolator0
(otationenterpolator0 "&aleenterpolator0 )olorenterpolator0
,ransparen&yenterpolator0 v "it&h`alueenterpolator t8Mng Qng1
httpBOOtai1i'!ha3.&0-
791
Lp trnh ha trn Java 2D v 3D

Knh 9P9. $nt'rp01at0r#pp.Nava
/ &wa &hng trnh $nt'rp01at0r.Nava
pac$ae /nimation'
import \a.a.app*et./pp*et'
import \a.a.awt.BorderNa,out'
import \a.a.awt.drame'
import com.sun.\fd.uti*s.app*et.Maindrame'
import com.sun.\fd.uti*s.uni.erse.]'
import com.sun.\fd.uti*s.geometr,.Co*orCube'
import \a.ax.media.\fd.]'
httpBOOtai1i'!ha3.&0-
792
Lp trnh ha trn Java 2D v 3D
import \a.ax..ecmath.]'
// {nterpo*ator/pp renders an
public class {nterpo*ator/pp extends /pp*et Q
0hapef) create%ar(float x0ca*e, float ,0ca*e,
boolean create#orma*s,
boolean assignCo*oring& Q
0hapef) car = new 0hapef)(&'
~uad/rra, car%eom = null'
if (create#orma*s&
car%eom = new ~uad/rra,(Ou,
%eometr,/rra,.C--$){#/T!0
U
%eometr,/rra,.#-$M/N0&'
else
car%eom = new ~uad/rra,(Ou,
%eometr,/rra,.C--$){#/T!0&'
car%eom.setCoordinate( +, new
ointff(x0ca*e]X+.(5f, ,0ca*e]+.((f, +.+f&&'
car%eom.setCoordinate( O, new
ointff(x0ca*e] +.(+f, ,0ca*e]+.((f, +.+f&&'
car%eom.setCoordinate( (, new
ointff(x0ca*e] +.O+f, ,0ca*e]+.f5f, +.+f&&'
httpBOOtai1i'!ha3.&0-
795
Lp trnh ha trn Java 2D v 3D
car%eom.setCoordinate( f, new
ointff(x0ca*e]X+.(+f, ,0ca*e]+.f5f, +.+f&&'
car%eom.setCoordinate( s, new
ointff(x0ca*e]X+.5+f, ,0ca*e]+.O+f, +.+f&&'
car%eom.setCoordinate( 5, new
ointff(x0ca*e] +.5+f, ,0ca*e]+.O+f, +.+f&&'
car%eom.setCoordinate( u, new
ointff(x0ca*e] +.s5f, ,0ca*e]+.(+f, +.+f&&'
car%eom.setCoordinate( e, new
ointff(x0ca*e]X+.sYf, ,0ca*e]+.(+f, +.+f&&'
car%eom.setCoordinate( Y, new
ointff(x0ca*e]X+.(uf, ,0ca*e]+.++f, +.+f&&'
car%eom.setCoordinate( r, new
ointff(x0ca*e]X+.OYf, ,0ca*e]+.++f, +.+f&&'
car%eom.setCoordinate(O+, new
ointff(x0ca*e]X+.Ouf, ,0ca*e]+.O(f, +.+f&&'
car%eom.setCoordinate(OO, new
ointff(x0ca*e]X+.(Yf, ,0ca*e]+.O(f, +.+f&&'
car%eom.setCoordinate(O(, new
ointff(x0ca*e] +.(5f, ,0ca*e]+.++f, +.+f&&'
car%eom.setCoordinate(Of, new
ointff(x0ca*e] +.fff, ,0ca*e]+.++f, +.+f&&'
car%eom.setCoordinate(Os, new
ointff(x0ca*e] +.f5f, ,0ca*e]+.O(f, +.+f&&'
car%eom.setCoordinate(O5, new
ointff(x0ca*e] +.(ff, ,0ca*e]+.O(f, +.+f&&'
if (create#orma*s&Q
int i'
httpBOOtai1i'!ha3.&0-
797
Lp trnh ha trn Java 2D v 3D
zectorff norma* = new zectorff(+.uf,
+.uf, +.Yf&'
for(i = +' i Z Y' ikk&
car%eom.set#orma*(i, norma*&'
norma*.set(new zectorff(+.5f, +.5f,
+.5f&&'
for(i = Y' i ZOu' ikk&
car%eom.set#orma*(i, norma*&'
2
if (assignCo*oring&Q
Co*oring/ttributes co*or/ttrib =
new Co*oring/ttributes(+.+f,
+.+f, O.+f, Co*oring/ttributes.#{C!0T&'
/ppearance car/ppear = new
/ppearance(&'
car/ppear.setCo*oring/ttributes(co*or
/ttrib&'
car.set/ppearance(car/ppear&'
2
car.set%eometr,(car%eom&'
return car'
2
public Branch%roup createSceneGraph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transformf) tfd = new Transformf)(&'
httpBOOtai1i'!ha3.&0-
799
Lp trnh ha trn Java 2D v 3D
Bounding0phere bounds = new
Bounding0phere(&'
// create target Transform%roup with
Capabi*ities
Transform%roup ob\Mo.e = new
Transform%roup(&'
ob\Mo.e.setCapabi*it,(Transform%roup./NN-
V"T$/#0d-$M"V${T!&'
// create target Transform%roup with
Capabi*ities
Transform%roup ob\$otate = new
Transform%roup(&'
ob\$otate.setCapabi*it,(Transform%roup./N
N-V"T$/#0d-$M"V${T!&'
// create target Transform%roup with
Capabi*ities
Transform%roup ob\0ca*e = new
Transform%roup(&'
ob\0ca*e.setCapabi*it,(Transform%roup./NN
-V"T$/#0d-$M"V${T!&'
// create target Materia* with
Capabi*ities
Materia* ob\Co*or = new Materia*(&'
ob\Co*or.setCapabi*it,(Materia*./NN-V"C-M
-#!#T"V${T!&'
httpBOOtai1i'!ha3.&0-
79:
Lp trnh ha trn Java 2D v 3D
// create target Transparenc, with
Capabi*ities
Transparenc,/ttributes ob\Transp = new
Transparenc,/ttributes(&'
ob\Transp.setCapabi*it,(Transparenc,/ttri
butes./NN-V"z/Nx!"V${T!&'
ob\Transp.setTransparenc,Mode(Transparenc
,/ttributes.BN!#)!)&'
// create target 0witch with Capabi*ities
0witch ob\0witch = new 0witch(&'
ob\0witch.setCapabi*it,(0witch./NN-V"0V{T
C1"V${T!&'
// create /*pha
/*pha a*pha = new /*pha (XO,
/*pha.{#C$!/0{#%
"!#/BN! k /*pha.)!C$!/0{#%"!#/BN!,
+, +, (+++, +,
O+++, (+++, +, O+++&'
// create position interpo*ator
osition{nterpo*ator pos{nt = new
osition{nterpo*ator (a*pha, ob\Mo.e&'
pos{nt.set0chedu*ingBounds(bounds&'
pos{nt.set0tartosition(XO.+f&'
// create rotation interpo*ator
httpBOOtai1i'!ha3.&0-
79<
Lp trnh ha trn Java 2D v 3D
$otation{nterpo*ator rot{nt = new
$otation{nterpo*ator (a*pha, ob\$otate&'
rot{nt.set0chedu*ingBounds(bounds&'
// create sca*e interpo*ator
0ca*e{nterpo*ator sca{nt = new
0ca*e{nterpo*ator (a*pha, ob\0ca*e&'
sca{nt.set0chedu*ingBounds(bounds&'
// create co*or interpo*ator
Co*or{nterpo*ator co*{nt = new
Co*or{nterpo*ator (a*pha, ob\Co*or&'
co*{nt.set0tartCo*or(new Co*orff(O.+f,
+.+f, +.+f&&'
co*{nt.set!ndCo*or(new Co*orff(+.+f,
+.+f, O.+f&&'
co*{nt.set0chedu*ingBounds(bounds&'
// create transparenc, interpo*ator
Transparenc,{nterpo*ator tra{nt = new
Transparenc,{nterpo*ator (a*pha, ob\Transp&'
tra{nt.set0chedu*ingBounds(bounds&'
// create switch .a*ue interpo*ator
0witchza*ue{nterpo*ator swi{nt = new
0witchza*ue{nterpo*ator (a*pha, ob\0witch&'
swi{nt.set0chedu*ingBounds(bounds&'
httpBOOtai1i'!ha3.&0-
79=
Lp trnh ha trn Java 2D v 3D
tfd.setTrans*ation(new zectorff(+.+f,
+.Yf, +.+f&&'
Transform%roup ob\Mo.eos = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\Mo.eos&'
ob\Mo.eos.addChi*d(ob\Mo.e&'
ob\Mo.e.addChi*d(createCar(+.sf, +.sf,
false, true&&'
ob\$oot.addChi*d(pos{nt&'
tfd.setTrans*ation(new zectorff(+.+f,
+.5f, +.+f&&'
Transform%roup ob\$otos = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\$otos&'
ob\$otos.addChi*d(ob\$otate&'
ob\$otate.addChi*d(createCar(+.sf, +.sf,
false, true&&'
ob\$oot.addChi*d(rot{nt&'
tfd.setTrans*ation(new zectorff(+.+f,
+.(f, +.+f&&'
Transform%roup ob\0ca*eos = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\0ca*eos&'
ob\0ca*eos.addChi*d(ob\0ca*e&'
ob\0ca*e.addChi*d(createCar(+.sf, +.sf,
false, true&&'
ob\$oot.addChi*d(sca{nt&'
httpBOOtai1i'!ha3.&0-
799
Lp trnh ha trn Java 2D v 3D
tfd.setTrans*ation(new zectorff(+.+f,
X+.(f, +.+f&&'
Transform%roup ob\Co*oros = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\Co*oros&'
0hapef) co*orCar = createCar(+.sf, +.sf,
true, false&'
/ppearance materia*/ppear = new
/ppearance(&'
materia*/ppear.setMateria*(ob\Co*or&'
co*orCar.set/ppearance(materia*/ppear&'
ob\Co*oros.addChi*d(co*orCar&'
ob\$oot.addChi*d(co*{nt&'
tfd.setTrans*ation(new zectorff(+.+f,
X+.5f, +.+f&&'
Transform%roup ob\Transpos = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\Transpos&'
0hapef) transpCar = createCar(+.sf, +.sf,
false, true&'
/ppearance transp/ppear =
transpCar.get/ppearance(&'
transp/ppear.setTransparenc,/ttributes(ob
\Transp&'
ob\Transpos.addChi*d(transpCar&'
ob\$oot.addChi*d(tra{nt&'
httpBOOtai1i'!ha3.&0-
900
Lp trnh ha trn Java 2D v 3D
tfd.setTrans*ation(new zectorff(+.+f,
X+.Yf, +.+f&&'
Transform%roup ob\0witchos = new
Transform%roup(tfd&'
ob\$oot.addChi*d(ob\0witchos&'
ob\0witch.addChi*d(createCar(+.sf, +.sf,
false, true&&''
ob\0witch.addChi*d(new Co*orCube(+.Of&&'
ob\0witchos.addChi*d(ob\0witch&'
ob\$oot.addChi*d(swi{nt&'
swi{nt.setNastChi*d{ndex((&'// since
switch made after interpo*ator
)irectiona*Night *ight)O = new
)irectiona*Night(&'
// *ight)O.set)irection(new zectorff(X+.ef,X
+.ef,+.+f&&'
*ight)O.set{nf*uencingBounds(bounds&'
ob\$oot.addChi*d(*ight)O&'
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
httpBOOtai1i'!ha3.&0-
901
Lp trnh ha trn Java 2D v 3D
return ob\$oot'
2 // end of Create0cene%raph method of
{nterpo*ator/pp
// Create a simp*e scene and attach it to the
.irtua* uni.erse
public &nterpolator!pp(& Q
setNa,out(new BorderNa,out(&&'
Can.asf) can.asf) = new Can.asf)(null&'
add(^Center^, can.asf)&'
Branch%roup scene = create0cene%raph(&'
// 0imp*exni.erse is a Con.enience
xti*it, c*ass
0imp*exni.erse simp*ex = new
0imp*exni.erse(can.asf)&'
// This wi** mo.e the ziew*atform bacW a bit
so the
// ob\ects in the scene can be .iewed.
simp*ex.getziewing*atform(&.set#omina*zi
ewingTransform(&'
simp*ex.addBranch%raph(scene&'
2 // end of {nterpo*ator/pp (constructor&
httpBOOtai1i'!ha3.&0-
902
Lp trnh ha trn Java 2D v 3D
// The fo**owing a**ows this to be run as an
app*ication
// as we** as an app*et
public static void main(0tringKL args& Q
0,stem.out.print(^{nterpo*ator/pp.\a.a
}nX a demonstration of using {nterpo*ator ^&'
0,stem.out.print*n(^ob\ects to pro.ide
animation in a va.a f) scene.^&'
0,stem.out.print*n(^This is a simp*e
examp*e progam from The va.a f) /{ Tutoria*.^&'
0,stem.out.print*n(^The va.a f) Tutoria*
is a.ai*ab*e on the web atn^&'
0,stem.out.print*n(^httpn//\a.a.sun.com/p
roducts/\a.aXmedia/f)/co**atera*^&'
drame frame = new Maindrame(new
{nterpo*ator/pp(&, (5u, (5u&'
2 // end of main (method of {nterpo*ator/pp&
2 // end of c*ass {nterpo*ator/pp
bhEn$ nh" qn thfn$ $p khi :p trUnh vNi .nterpoator
CC& Qi tRng .nterpoator 1D (n *!]t &x !an hE r]t gn gi vi
&C& Qi tRng hDnh vi. X v3+ viE& *G (bng &C& Qi tRng .nterpoator
&ng *Y phWi Qi -t vi &C& 1\i thzng gp nh ;hi *G (bng &C& Qi
tRng hDnh vi. ThI- vD0 x+ &ng &x &C& @3 1\i ;hC&+ &h!ng &h0 &C&
.nterpoator vD &C& @3 1\i riIng &h0 -\i .nterpoator .
/ut nh- 1n thzng gp gs3 ra @yi viE& ;hjng nhn th]3 rng &C&
Qi tRng .nterpoator tha3 i thzng ,!3In giC trU &C& Qi tRng v&h
httpBOOtai1i'!ha3.&0-
905
Lp trnh ha trn Java 2D v 3D
&wa &hng. Sgzi 1p trnh &x thT nghh rng Qi tRng v&h
Tran*60r-)r0!p &wa Qi tRng .0tati0n$nt'rp01at0r &x thT R& *G (bng
T tUnh tiJn Qi tRng x ng0Di h0et ung !a3 -D Qi tRng
.0tati0n$nt'rp01at0r &!ng &]p. [i"! nD3 1D h0Dn t0Dn *ai. Tp &C& @iJn
i &wa Qi tRng v&h Tran*60r-)r0!p R& ghi 1ei -\i 1n tei ;h!ng
Wnh -D Qi tRng !pha h0et ung. [i"! nD3 &ng &x nghha rngB hai Qi
tRng .nterpoator ;hjng thT &x &_ng -ut Qi tRng v&h.
/ut 1\i ;hC& &ng ha3 ,W3 ra ;hi ngzi 1p trnh !In ;hjng thiJt 1p
&C& ;hW nVng thv&h hRp &h0 Qi tRng v&h. iJt !W 1D gs3 ra 1\i r!nti-'
'rr0r.
*%re 1nterp%&at%r 0P1A
.nterpoator 1D -ut 1p trt! tRng+ nx &h R& *G (bng ;hi &n te0
-ut 1p &0n -i. Lp .nterpoator &h &!ng &]p (!3 nh]t -ut hD- &h0
ngzi *G (bng &C& 1p &0n &wa nxB
void set$lpha[lpha lpha\
ThiJt 1p Qi tRng !pha &h0 Qi tRng .nterpoator hiEn hDnh .
Coor.nterpoator
[Qi tRng C010r$nt'rp01at0r &x Qi tRng v&h th!u& ;iT! /at'ria1.
.nterpoator nD3 &h0 phcp tha3 i thDnh phn -D! ;h!3J&h tCn &wa vt
1iE! v&h. ihW nVng nD3 vta 1D iT- -enh 1ei &ng 1D iT- hen &hJ &wa
C010r$nt'rp01at0r. [iT- -enh thT hiEn y ;hW nVng &h0 phcp nhi"! hn
-ut Qi tRng tr`& !an (_ng &h!ng -ut Qi tRng vt 1iE! /at'ria1. X
v3+ -ut Qi tRng C010r$nt'rp01at0r &_ng vi -ut Qi tRng v&h
/at'ria1 &x thT tC& ung ti nhi"! Qi tRng tr`& !an ;hC& nha!. Ken
&hJ y &h\ &C& Qi tRng tr`& !an vi &h]t 1iE! /at'ria1 S0('C0-p0n'nt
&h &x thT nhn th]3 ;hi R& &hiJ! *Cng.
2` nh- 1n thzng ,W3 ra y s3 &hvnh 1D (0 *` pha& tep tr0ng viE&
te0 u @xng &h0 hnh Wnh. XiE& *G (bng Cnh *Cng tr0ng ha 1D ;hC r^&
httpBOOtai1i'!ha3.&0-
907
Lp trnh ha trn Java 2D v 3D
rQi+ v v3 nx R& trnh @D3 &hi tiJt tr0ng -ut &hng riIng+ &hng :.
/D! *^& &wa th`& thT tr`& !an 1D *` ;Jt hRp &wa 5 thDnh phnB phWn ,e+
;h!3J&h tCn vD -D! ,!ng !anh. C010r$nt'rp01at0r &h tha3 i -ut tr0ng
5 thDnh phn+ x &hvnh 1D thDnh phn ;h!3J&h tCn.
/ut 1\i ;hC& &ng ha3 ,W3 ra ;hi g^n Qi tRng v&h /at'ria1 &h0 Qi
tRng 2hap'5D. Knh 9P10 @iT! (ikn -ut phn @iT! thU ;h!ng &Wnh
&wa Qi tRng C010r$nt'rp01at0r vi Qi tRng v&h /at'ria1
S0('C0-p0n'nt.
Knh 9P10. /ut phn @iT! thU ;h!ng &Wnh &wa Qi tRng
C010r$nt'rp01at0r vi Qi tRng v&h /at'ria1 S0('C0-p0n'nt
Lp C010r$nt'rp01at0r &x (eng &wa phng tha& g't ;hC& vi &C&
.nterpoator ;hC&. Phng tha& g't &wa C010r$nt'rp01at0r ;hjng phWi 1D
phng tha& ;hjng tha- *Q.
C010r$nt'rp01at0r 1D -ut hDnh vi hiE! &hnh -D! ;h!3J&h tCn &wa Qi
tRng -at'ria1 v&h @ng &C&h nui *!3 t!3Jn tvnh giZa -ut &p -D! &h0
tr&+ *G (bng giC trU *inh ra @yi Qi tRng !pha ,C& Unh.
6Sp Color3nterpolator cX cc phYZng th[c )h\i t]o sau^
)olorenterpolator[lpha lpha0 *aterial target\
ihyi te0 Qi tRng .nterpoator -D! thzng vi Qi tRng v&h &h0
tr&. )iC trU -D! nui *!3 n- tr0ng ;h0Wng tt -D! 'n ti -D! tr^ng.
httpBOOtai1i'!ha3.&0-
909
Lp trnh ha trn Java 2D v 3D
)olorenterpolator[lpha lpha0 *aterial target0
)olor3f start)olor0 )olor3f end)olor\
ihyi te0 Qi tRng .nterpoator -D! vi Qi tRng v&h+ -D! @^t
!+ -D! ;Jt th& &h0 tr&.
CC& phng tha& thzng (_ng ;hC&B
void setZnd)olor[)olor3f &olor\
ThiJt 1p th!u& tvnh 'n(C010r &h0 Qi tRng .nterpoator hiEn thzi.
Phng tha& g't tng angB void getZnd)olor[)olor3f &olor\
void set"tart)olor[)olor3f &olor\
ThiJt 1p th!u& tvnh *tartC010r &h0 Qi tRng .nterpoator hiEn thzi.
Phng tha& g't tng ang; void get"tart)olor[)olor3f &olor\
void set,arget[*aterial target\
ThiJt 1p Qi tRng thDnh phn &h]t 1iE! f-at'ria1g v&h &h0
.nterpoator hiEn thzi
Phng tha& g't tng angB *aterial get,arget[\
Position.nterpoator
[Qi tRng P0*iti0n$nt'rp01at0r tha3 i vU trv &wa Qi tRng tr`& !an
th'0 -ut trb& ta u. Kai iT- (tng *G (bng &h0 phcp nui *!3 R& &h0
(i (eng hai giC trU th`& (]! phW3 ung &_ng trb& ta u tUnh tiJn. Trb&
tUnh tiJn -& Unh 1D trb& ,.
Cc phYZng th[c )h\i t]o^
!ositionenterpolator[lpha lpha0 ,ransfor+%roup target\
ihyi te0 Qi tRng nui *!3 vU trv .nterpoator thzng vi Qi tRng
v&h &h0 tr&+ trb& tUnh tiJn -& Unh 1D ,+ vU trv @^t ! *tartP0*iti0n 1D
0.06+ vU trv ;Jt th& 'n(P0*iti0n 1D 1.06.
!ositionenterpolator[lpha lpha0 ,ransfor+%roup target0
httpBOOtai1i'!ha3.&0-
90:
Lp trnh ha trn Java 2D v 3D
,ransfor+3D axis'f,ranslation0
float start!osion0 float end!osition\
ihyi te0 Qi tRng .nterpoator vU trv @iJn i thDnh phn tUnh tiJn
&wa Qi tRng Tran*60r-)r0!p v&h th'0 -ut trb& tUnh tiJn nh]t Unh.
CMc phf;n$ thRc khMch
void set$xis'f,ranslation[,ransfor+3D axis'f,ranslation\
ThiJt 1p trb& tUnh tiJn &h0 Qi tRng .nterpoator hiEn thzi.
void setZnd!osition[float position\
ThiJt 1p vU trv ;Jt th& 'n(P0*iti0n &h0 Qi tRng .nterpoator hiEn
thzi.
void set"tart!osition[float position\
ThiJt 1p vU trv @^t ! *tartP0*iti0n &h0 Qi tRng .nterpoator hiEn
thzi.
#otation.nterpoator
[Qi tRng .0tati0n$nt'rp01at0r @iJn i hng !a3 &wa Qi tRng
tr`& !an ,!ng !anh -ut trb&. Kai iT- *G (bng tr0ng phcp nui *!3
R& &h0 (i (eng hai giC trU gx& (]! phW3 ung vD trb& !a3. )iC trU nui
*!3 *Y R& *G (bng T *inh &h!3Tn ung !a3 !anh trb& !a3. Trb&
!a3 -& Unh 1D trb& 3 (ng.
Cc phYZng th[c )h\i t]o^
(otationenterpolator[lpha lpha0 ,ransfor+%roup target\
ihyi te0 Qi tRng nui *!3 !a3 .nterpoator thzng vi Qi tRng
v&h &h0 tr&+ *G (bng trb& !a3 -& Unh f|g+ gx& nh nh]t 1D 0.06+
gx& 1n nh]t 1D 2pi ra(ian.
(otationenterpolator[lpha lpha0 ,ransfor+%roup target0
,ransfor+3D axis'f(otation0
float +ini+u+$ngle0 float +axi+u+$ngle\
ihyi te0 Qi tRng .nterpoator @iJn i thDnh phn !a3 &wa -ut
Qi tRng tran*60r- v&h.
httpBOOtai1i'!ha3.&0-
90<
Lp trnh ha trn Java 2D v 3D
CC& phng tha& ;hC&B
void set$xis'f(otation[,ransfor+3D axis'f(otation\
ThiJt 1p trb& !a3 &h0 Qi tRng .nterpoator hiEn thzi.
void set*axi+u+$ngle[float angle\
ThiJt 1p giC trU gx& 1n nh]t -a,i-!-#ng1' th'0 ra(ian &h0 Qi
tRng .nterpoator hiEn thzi.
void set*ini+u+$ngle[float angle\
ThiJt 1p giC trU gx& nh nh]t -ini-!-#ng1' th'0 ra(ian &h0 Qi
tRng .nterpoator hiEn thzi.
void set,arget[,ransfor+%roup target\
ThiJt 1p nt Tran*60r-)r0!p v&h &h0 Qi tRng .nterpoator hiEn
thzi.
Scae.nterpoator
Lp 2&a1'$nt'rp01at0r Unh nghha -ut hDnh vi @iJn i thDnh phn t
1E ;v&h th& fgiZ ng!3In &C& tvnh &h]t ;hC&g &wa Qi tRng
Tran*60r-)r0!p v&h @ng &C&h nui *!3 t!3Jn tvnh giZa -ut &p giC trU t
1E &h0 tr& f*G (bng giC trU &wa Qi tRng !pha ,C& Unhg. )iC trU t 1E
nui *!3 R& *G (bng T *inh ra @iJn i t 1E tr0ng hE ta u Ua phng
&wa Qi tRng .nterpoator hiEn thzi.
Cc phYZng th[c )h\i t]o^
"&aleenterpolator[lpha lpha0 ,ransfor+%roup target\
ihyi te0 Qi tRng nui *!3 t 1E @iJn i nt Tran*60r-)r0!p v&h
giZa hai giC trU !pha ,C& Unh+ *G (bng Qi tRng !pha vD -ut -a trn
ng nh]t &h0 tr&+ vi t 1E phxng @c nh]t -ini-!- *&a1' 0.16 vD t 1E
phxng 1n nh]t -a,i-!- *&a1' 1.06.
"&aleenterpolator[lpha lpha0 ,ransfor+%roup target0
,ransfor+3D axis'f"&ale0
float +ini+u+"&ale0 float +axi+u+"&ale\
httpBOOtai1i'!ha3.&0-
90=
Lp trnh ha trn Java 2D v 3D
ihyi te0 Qi tRng *&a1'$nt'rp01at0r @iJn i thDnh phn t 1E nt
Tran*60r-)r0!p v&h giZa hai giC trU t 1E f-ini-!-2&a1' vD
/a,i-!-2&a1'g.
Cc phYZng th[c )hc^
void set$xis'f"&ale[,ransfor+3D axis'f"&ale\
ThiJt 1p @iJn i #,i*M62&a1' &h0 Qi tRng nui *!3 .nterpoator
hiEn thzi.
void set*axi+u+"&ale[float s&ale\
ThiJt 1p t 1E phxng 1n nh]t -a,i-!-2&a1' &h0 Qi tRng
.nterpoator hiEn thzi.
void set*ini+u+"&ale[float s&ale\
ThiJt 1p t 1E phxng nh nh]t -ini-!-2&a1' &h0 Qi tRng
.nterpoator hiEn thzi.
void set,arget[,ransfor+%roup target\
ThiJt 1p Qi tRng Tran*60r-)r0!p &h0 Qi tRng .nterpoator
hiEn thzi.
S1itchCaue.nterpoator
[Qi tRng 2?it&hXa1!'$nt'rp01at0r ;hjng nui *!3 giZa &C& giC trU nh
&C& Qi tRng .nterpoator ;hC&. Sx &h 1`a &hn -ut tr0ng &C& &0n &wa
Qi tRng 2?it&h. )iC trU ngng T &h!3Tn ti -ut &0n ;hC& R& ,C&
Unh @ng &C&h &hia 0en 0.0+ 1.0 &h0 *Q &0n -D Qi tRng 2?it&h &x.
Ch H rng+ Qi tRng .nterpoator ;hjng t` ung &p nht ;hi *Q
&0n &wa Qi tRng 2?it&h tha3 i. CC& giC trU &h!3Tn i f*?it&hing
va1!'g R& ,C& Unh nga3 ;hi te0 Qi tRng 2?it&hXa1!'$nt'rp01at0r.
SIn nJ! @an ! Qi tRng 2?it&h ;hjng &x &0n+ h0& ;hi *Q &0n &wa nx
tha3 i *a! ;hi Qi tRng .nterpoator R& te0 th *Q &C& &0n tr0ng
Qi tRng .nterpoator phWi R& &p nht. [iT- th!n 1Ri ;hi *G (bng
Qi tRng nD3 1D ngzi 1p trnh &x thT ,C& Unh -ut tp &0n &C& &h -b&
httpBOOtai1i'!ha3.&0-
909
Lp trnh ha trn Java 2D v 3D
T Qi tRng .nterpoator *G (bng. Tp &0n nD3 @U gii hen @yi tp &C&
&h -b& t!n t`.
Cc phYZng th[c )h\i t]o^
"it&h`alueenterpolator[lpha lpha0 "it&h target\
ihyi te0 Qi tRng hDnh vi 2?it&hXa1!'$nt'rp01at0r @iJn i &h -b&
&0n &wa nt 2?it&h v&h tr0ng ;h0Wng tt 0 Jn nP1+ tr0ng x+ n 1D *Q &0n
&wa nt 2?it&h v&h.
"it&h`alueenterpolator[lpha lpha0 "it&h target0
int first)hildendex0 int last)hildendex\
ihyi te0 Qi tRng hDnh vi 2?it&hXa1!'$nt'rp01at0r @iJn i &h -b&
&0n &wa nt 2?it&h v&h giZa hai giC trU 6ir*tChi1($n(', vD 1a*tChi1($n(',
&h0 tr&.
CC& phng tha& ;hC&B
void set.irst)hildendex[int firstendex\
ThiJt 1p &h -b& &0n ! tiIn 6ir*tChi1($n(', &wa Qi tRng
.nterpoator hiEn thzi.
void setLast)hildendex[int lastendex\
ThiJt 1p &h -b& &0n &!Qi 1a*tChi1($n(', &wa Qi tRng .nterpoator
hiEn thzi.
void set,arget["it&h target\
ThiJt 1p Qi tRng 2?it&h v&h &h0 Qi tRng .nterpoator hiEn
thzi.
Tr0ng &C& tha- *Q &wa phng tha& ;hyi te0 2?it&hXa1!'$nt'rp01at0r
&x Qi tRng 2?it&h. X3 2?it&h 1D g
S/itch
Lp 2?it&h ;J thta tt 1p )r0!p vD 1D &ha &wa 0 ha3 nhi"! nhCnh &0n
thU ;h!ng &Wnh. [Qi tRng 2?it&h 1`a &hn -ut tr0ng &C& &0n &wa nx
T @iT! (ikn. Sx Unh nghha -ut giC trU 1`a &hn f*?it&h va1!'g &x thT
httpBOOtai1i'!ha3.&0-
910
Lp trnh ha trn Java 2D v 3D
&hn 1 h0& &hn 0 ha3 nhi"! &0n &wa nx vD nhz *G (bng -ut -t ne T
,C& Unh ,'- &0n nD0 R& @iT! (ikn. [Qi tRng 2?it&h &x thT *G (bng
u& 1p ;hjng &n Qi tRng .nterpoator ha3 LF& .
CC& phng tha& ;hyi te0B
"it&h[\
ihyi te0 -ut nt 2?it&h vi &C& tha- *Q -& Unh.
"it&h[int hi&h)hild\
ihyi te0 vD gCn giC trU @an ! &h0 -ut nt 2?it&h *G (bng &h -b&
1`a &hn &0n thv&h hRp.
CK$LD#LL P &h thU t]t &W &C& &0n R& @iT! (ikn
CK$LD/#2i P *G (bng -t ne &hi1(/a*; f;iT! >it2'tg T 1`a
&hn &0n thv&h hRp
CK$LDSMS% P ;hjng &x &0n nD0 R& @iT! (ikn
"it&h[int hi&h)hild0 /ava1util12it"et &hild*as-\
ihyi te0 vD gCn giC trU ! &h0 -ut nt 2?it&h *G (bng &h -b& 1`a
&hn vD -t ne &h0 tr&.
Cc phYZng th[c )hc^
void set)hild*as-[/ava1util12it"et &hild*as-\
ThiJt 1p -t ne 1`a &hn &0n.
void sethhi&h)hild[int &hild\
ThiJt 1p &h -b& 1`a &hn &0n ,C& Unh &0n nD0 R& @iT! (ikn.
ihW nVng &x thT thiJt 1p &h0 2?it&hB
#LLML2L$TCK.%#D - L.$T%
Ch Unh rng nt 2?it&h nD3 &h0 phcp & 1`a &hn nt &0n+ &C& giC
trU -t ne vD &C& &0n hiEn thzi &wa nx.
Transparenc'.nterpoator
Lp Tran*par'n&3$nt'rp01at0r Unh nghha Qi tRng hDnh vi @iJn i
-a& u tr0ng *!Qt &wa Qi tRng v&h th!u& 1p Tran*par'n&3#ttri@!t'*
httpBOOtai1i'!ha3.&0-
911
Lp trnh ha trn Java 2D v 3D
@ng &C&h nui *!3 t!3Jn tvnh giZa -ut &p giC trU u tr0ng *!Qt &h0 tr&
f*G (bng giC trU *inh @yi Qi tRng !pha &h0 tr&g. Shi"! hn -ut Qi
tRng tr`& !an &x thT &hia * -ut Qi tRng Tran*par'n&3#ttri@!t'*+ v
v3 -ut Qi tRng Tran*par'n&3#ttri@!t'* &x ;hW nVng tC& ung &_ng 1&
Jn nhi"! Qi tRng tr`& !an ;hC& nha!. Ch H rng &C& &hJ u tr0ng
*!Qt ;hC& nha! &x thT Wnh hyng Jn &h]t 1Rng @iT! (ikn vD *` hiEn (iEn
&wa &C& Qi tRng tr`& !an.
Cc phYZng th[c )h\i t]o^
,ransparen&yenterpolator[lpha lpha0
,ransparen&y$ttri3utes target\
ihyi te0 Qi tRng nui *!3 u tr0ng *!Qt vi Qi tRng v&h &h0
tr&+ u tr0ng *!Qt tQi thiT! 1D 0.06 vD tQi a 1D 1.06.
,ransparen&yenterpolator[lpha lpha0
,ransparen&y$ttri3utes target0
float +ini+u+,ransparen&y0
float +axi+u+,ransparen&y\
ihyi te0 Qi tRng nui *!3 u tr0ng *!Qt @iJn i u tr0ng *!Qt &h]t
1iE! &wa Qi tRng v&h giZa hai giC trU -ini-!-Tran*par'n&3 vD
-a,i-!-Tran*par'n&3.
Cc phYZng th[c )hc^
void set*axi+u+,ransparen&y[float transparen&y\
ThiJt 1p giC trU -a,i-!-Tran*par'n&3 &h0 Qi tRng .nterpoator
hiEn thzi.
void set*ini+u+,ransparen&y[float transparen&y\
ThiJt 1p giC trU -ini-!-Tran*par'n&3 &h0 Qi tRng .nterpoator
hiEn thzi.
void set,arget[,ransparen&y$ttri3utes target\
ThiJt 1p Qi tRng v&h Tran*par'n&3#ttri@!t'* &h0 Qi tRng
.nterpoator hiEn thzi.
httpBOOtai1i'!ha3.&0-
912
Lp trnh ha trn Java 2D v 3D
CC& 1p Qi tRng nui *!3 zngB
Path .nterpoator fnui *!3 zngg ;hC& vi &C& 1p nui *!3 ;hC& y
&h\+ nx &x thT &haa hai ha3 nhi"! hn hai giC trU T nui *!3. Path
.nterpoator &!ng &]p &C& ;hW nVng nui *!3 vU trv fP0*iti0n
$nt'rp01ati0ng+ nui *!3 !a3 f.0tati0n $nt'rp01ati0ng vta nui *!3 vU trv+
vta nui *!3 !a3 h0& vta nui *!3 vU trv+ nui *!3 !a3 vD nui *!3 t 1E
f2&a1' $nt'rp01ati0ng. [v&h &wa Qi tRng nui *!3 1D -ut Qi tRng
Tran*60r-)r0!p+ Qi tRng nD3 tha3 i vU trv+ hng+ vD t 1E thv&h hRp
&h0 &C& Qi tRng &0n &wa nx.
/ut Qi tRng Path .nterpoator &haa -ut tp &C& giC trU+ ha3 &C&
iT- -t+ R& *G (bng th'0 ttng &p T nui *!3. )iC trU !pha &x vai
trd ,C& Unh giC trU hai iT- nD0 *Y R& *G (bng. )iC trU &C& iT- nD3
n- tr0ng ;h0Wng tt 0.0 ti 1.0+ @a0 g- &W hai ! -t+ tng ang vi
;h0Wng giC trU &wa Qi tRng !pha. [iT- -t ! tiIn phWi &x giC trU 1D
0.0+ &dn iT- -t &!Qi &_ng phWi &x giC trU 1D 1.0. CC& -t &dn 1ei R&
1! trZ th'0 trt t` giC trU tVng (n tr0ng Qi tRng nui *!3 zng.
CC& giC trU &wa -ut iT- -t 1D tng ang vi &C& giC trU tha- *Q @iJn
fvv (b nh vU trv ha3 gx& !a3g R& *G (bng tr0ng phcp nui *!3.Xi -\i
iT- -t th &x -ut giC trU tha- *Q ,C& Unh 1D- ei (iEn. [iT- -t &x
giC trU 1n nh]t @ng h0& nh hn giC trU !pha vD giC trU &wa iT- -t
tiJp th'0 *Y R& *G (bng. CC& iT- -t R& ,C& Unh th'0 -ut trt t`+
th'0 x+ ;hi giC trU !pha tha3 i+ &C& iT- -t *Y R& *G (bng th'0
ttng &p ;" nha!.
Phva @In trCi &wa hnh 9P11 @iT! (ikn &C& giC trU iT- -t &h0 -ut Qi
tRng Path $nt'rp01at0r nui *!3 vU trv. Xi -b& v&h -inh ha+ &hng tji
&h ,ct vU trv tr0ng ;hjng gian 2 &hi"!. Phn giZa &wa hnh Cnh ,e vU trv
&wa Qi tRng tr`& !an vi &C& giC trU #1pha tt 0.0 ti 1.0. Phva @In phWi
1D &C& giC trU iT- -t R& *G (bng tng ang vi &C& giC trU #1pha ;hC&
httpBOOtai1i'!ha3.&0-
915
Lp trnh ha trn Java 2D v 3D
nha! &wa vv (b nD3. iJt hRp &C& giC trU iT- -t vD tha- *Q #1pha *Y ,C&
Unh h0et Wnh.
Knh 9P11. F!an hE giZa giC trU &C& iT- -t vD giC trU #1pha &h0 vU
trv tr0ng ;hjng gian 2 &hi"!
Xv (b *G (bng Path$nt'rp01at0r
2G (bng Qi tRng nui *!3 zng t!sn th'0 &jng tha& *G (bng &C& Qi
tRng nui *!3 ;hC&. 2` ;hC& @iEt 1D y *Q 1Rng @iJn R& *G (bng T ;hyi
te0 Qi tRng nui *!3 zng. Cjng tha& *G (bng &x thT tx- t^t tr0ng hnh
*a!B
1. te0 Qi tRng v&h vi ;hW nVng thv&h hRp
2. te0 Qi tRng !pha
5. te0 &C& -Wng iT- -t vD &C& giC trU ;hC&
7. te0 Qi tRng nui *!3 zng tha- &hiJ! Jn Qi tRng !pha+ Qi
tRng v&h+ vD -Wng &wa &C& giC trU thiJt 1p
9. thI- (anh gii &h0 Qi tRng nui *!3
:. thI- Qi tRng nui *!3 zng vD0 thU ;h!ng &Wnh
Knh 9P12. Cjng tha& *G (bng Qi tRng nui *!3 zng
Chng trnh .0tP0*Path#pp.Nava *G (bng Qi tRng
.0tP0*Path$nt'rp01at0r T te0 h0et Wnh &h0 -ut ;hQi hup C010rC!@' !a
-ut tp &C& giC trU vU trv vD !a3. [Qi tRng .0tP0*Path$nt'rp01at0r &haa
tp &C& giC trU !a3 f-Wng F!at76g+ vU trv f-Wng P0int56g+ vD &C& giC trU
iT- -t f-Wng giC trU th`&g. Chi tiJt &wa vv (b nD3 ,in ,'- thI- phn
phb 1b&.
httpBOOtai1i'!ha3.&0-
917
Lp trnh ha trn Java 2D v 3D
public Branch%roup createSceneGraph(& Q
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
/*pha a*pha = new /*pha(XO, O++++&'
Transform%roup target = new
Transform%roup(&'
Transformf) axis-f$otos = new
Transformf)(&'
floatKL Wnots = Q+.+f, +.Of, +.(f, +.ff,
+.sf, +.uf, +.Yf, +.rf, O.+f2'
~uatsfKL buats = new ~uatsfKrL'
ointffKL positions = new ointffKrL'
target.setCapabi*it,(Transform%roup./NN-V
"T$/#0d-$M"V${T!&'
/xis/ng*esf axis = new
/xis/ng*esf(O.+f,+.+f,+.+f,+.+f&'
axis-f$otos.set(axis&'
buatsK+L = new ~uatsf(+.+f, O.+f, O.+f,
+.+f&'
buatsKOL = new ~uatsf(O.+f, +.+f, +.+f,
+.+f&'
buatsK(L = new ~uatsf(+.+f, O.+f, +.+f,
+.+f&'
httpBOOtai1i'!ha3.&0-
919
Lp trnh ha trn Java 2D v 3D
buatsKfL = new ~uatsf(+.+f, O.+f, O.+f,
+.+f&'
buatsKsL = new ~uatsf(+.+f, +.+f, O.+f,
+.+f&'
buatsK5L = new ~uatsf(+.+f, O.+f, O.+f,
+.+f&'
buatsKuL = new ~uatsf(O.+f, O.+f, +.+f,
+.+f&'
buatsKeL = new ~uatsf(O.+f, +.+f, +.+f,
+.+f&'
buatsKYL = buatsK+L'
positionsK+L= new ointff( +.+f, +.+f,
XO.+f&'
positionsKOL= new ointff( O.+f, XO.+f,
X(.+f&'
positionsK(L= new ointff( XO.+f, O.+f,
Xf.+f&'
positionsKfL= new ointff( (.+f, +.+f,
Xs.+f&'
positionsKsL= new ointff( X(.+f, XO.+f,
X5.+f&'
positionsK5L= new ointff( f.+f, O.+f,
Xu.+f&'
positionsKuL= new ointff( Xf.+f, +.+f,
Xe.+f&'
positionsKeL= new ointff( (.+f, XO.+f,
Xs.+f&'
positionsKYL= positionsK+L'
httpBOOtai1i'!ha3.&0-
91:
Lp trnh ha trn Java 2D v 3D
$otosath{nterpo*ator rotosath = new
$otosath{nterpo*ator(
a*pha, target, axis-f$otos,
Wnots, buats, positions&'
rotosath.set0chedu*ingBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(target&'
ob\$oot.addChi*d(rotosath&'
target.addChi*d(new Co*orCube(+.s&&'
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
oint/rra, point"geom = new oint/rra,(r,
%eometr,/rra,.C--$){#/T!0&'
point"geom.setCoordinates(+, positions&'
/ppearance points"appear = new
/ppearance(&'
Co*oring/ttributes points"co*oring = new
Co*oring/ttributes(&'
points"co*oring.setCo*or(O.+f, +.+f,
+.+f&'
httpBOOtai1i'!ha3.&0-
91<
Lp trnh ha trn Java 2D v 3D
points"appear.setCo*oring/ttributes(point
s"co*oring&'
oint/ttributes points"points = new
oint/ttributes(s.+f, true&'
points"appear.setoint/ttributes(points"p
oints&'
0hapef) points = new 0hapef)(point"geom,
points"appear&'
ob\$oot.addChi*d(points&'
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
$otosath/pp
[0en - trIn R& trv&h ;hjng t0Dn vn tt phng tha&
&r'at'2&'n')raph tr0ng &hng trnh .0tP0*Path#pp.Nava T @en & &x
hnh (!ng * !a v" &C&h *G (bng -ut Qi tRng nui *!3 zngB
.0tP0*Path$nt'rp01at0r. CC& @& th`& hiEn R& Cnh *Q tt 1P: tng
ang vi &C& @& tr0ng &jng tha&.
Knh 9P15 1D -ut &Wnh tr0ng &hng trnh .0tP0*Path#pp+ vi &C&
iT- -D! @iT! (ikn vU trv &wa 9 iT- -t. [iT- ! tiIn R& (_ng 2
1n+ nIn tr0ng hnh+ &hng ta &h th]3 &x = iT-.
httpBOOtai1i'!ha3.&0-
91=
Lp trnh ha trn Java 2D v 3D
Knh 9P15. /ut &Wnh tr0ng &hng trnh .0tP0*Path#pp
ihi &hng trnh .0tP0*Path#pp R& th`& hiEn+ ;hQi hup
C010rC!@' (i &h!3Tn tt vU trv iT- -t nD3 Jn vU trv &wa iT- -t ;hC&+
ng thzi t` !a3 T Jn R& &C& iT- -t ;hC& nha!. )iQng nh t]t &W
&C& Qi tRng nui *!3 ;hC&+ h0et Wnh ;Jt !W phb th!u& vD0 *` ;Jt hRp
giZa &C& giC trU Qi tRng nui *!3 vi &C& tha- *Q !pha R& *G (bng.
Sh nxi @In trIn+ 1p Path$nt'rp01at0r &x r]t nhi"! &C& 1p &0n
;hC& nha!. Sg0Di &C& 1p &0n tr0ng het nhsn &wa Java 5D+ &dn &x -ut &p
&C& 1p 1iIn !an tr0ng gxi tiEn v&h. Lp TC>Path2p1in'$nt'rp01at0r 1D
-ut 1p tng t` vi 1p Path$nt'rp01at0r. Lp nD3 &x -ut 1p &0n n-
tr0ng gxi tiEn v&h ftha- ;hW0 hnh 9P= T hnh (!ng R& !an hE giZa
&C& 1p nui *!3g.
Tr0ng &hng trnh .0tP0*Path#pp+ h0et Wnh ,!]t hiEn ;hjng t`
nhiIn &hw 3J! 1D (0 *` ;Jt hRp vU trv &C& iT- -t R& &hn. ihi ;hQi
hup C010rC!@' (i &h!3Tn Jn -\i vU trv iT- -t ,C& Unh+ th nga3 1p
ta& &h!3Tn ung &wa nx tha3 i T Jn R& iT- -t tiJp th'0. Di
&h!3Tn nh v3 ;hjng t` nhiIn (0 tr0ng thJ gii th`&+ &h!3Tn ung &wa
t]t &W &C& vt "! &x tvnh nh]t Unh.
httpBOOtai1i'!ha3.&0-
919
Lp trnh ha trn Java 2D v 3D
TC>Path2p1in'$nt'rp01at0r 1D -ut tiEn v&h &!ng &]p &C& hDnh vi vD
&ha& nVng tng t` 1p Path$nt'rp01at0r+ nhng 1D- trn zng i &wa
Qi tRng thDnh -ut zng &0ng (`a trIn vU trv &C& iT- -t. [zng
&0ng nD3 @^t &h& &h!3Tn ung &wa Qi tRng tr0ng thJ gii th`&. Tr0ng
&h!3Tn ung nD3+ Qi tRng tr`& !an &x thT ;hjng i !a t0Dn @u h0&
;hjng h" i !a @]t &a iT- -t nD0. Chng trnh vv (b+
2p1in'#ni-.Nava+ @en & &x thT t- tr0ng ha &hng trnh ;- th'0.
Path.nterpoator
Path$nt'rp01at0r 1D -ut 1p trt! tRng &!ng &]p gia0 (iEn vD &ha&
nVng & @Wn &h0 &C& 1p &0n &wa nx. CC& Qi tRng Path$nt'rp01at0r 1!
trZ &C& giC trU iT- -t vD tvnh t0Cn &h -b& &wa &C& giC trU nD3 T *G
(bng (`a trIn giC trU !pha vD thzi gian hiEn thzi
f&!rr'nt$nt'rp01ati0nXa1!'g. Tha- *Q &!rr'nt$nt'rp01ati0nXa1!' R& tvnh
t0Cn @ng &C&h nui *!3 t!3Jn tvnh tr0ng &h!\i &C& iT- -t R& Unh
nghha tr& f*G (bng giC trU *inh @yi Qi tRng !pha ,C& Unhg. [iT-
-t ! tiIn phWi &x giC trU 1D 0.0 vD iT- -t &!Qi &_ng phWi &x giC trU 1D
1.0. [iT- -t tr!ng gian vi &h -b& ; phWi &x giC trU 1n hn giC trU &wa
@]t &a iT- -t nD0 &x &h -b& nh hn ;.
%_t sL phYZng th[c cung c;p 4\i lSp -ath3nterpolator^
int get$rrayLengths[\
TrW v" u (Di &wa -Wng &C& iT- -t
void setqnot[int index0 float -not\
ThiJt 1p iT- -t tei &h -b& ,C& Unh @yi in(', &h0 Qi tRng
.nterpoator hiEn thzi.
void setqnots[float rs -nots\
ThiJt 1p ftha3 thJg t]t &W &C& iT- -t &h0 Qi tRng .nterpoator
hiEn thzi.
httpBOOtai1i'!ha3.&0-
920
Lp trnh ha trn Java 2D v 3D
#otPosPath.nterpoator
.0tP0*Path$nt'rp01at0r 1D -ut 1p Qi tRng hDnh vi+ @iJn i thDnh
phn !a3 vD tUnh tiJn &wa Qi tRng v&h th!u& 1p Tran*60r-)r0!p
@ng &C&h nui *!3 t!3Jn tvnh giZa &h!\i &C& &p iT- -tOvU trv vD iT-
-tOhng+ *G (bng giC trU *inh @yi Qi tRng !pha ,C& Unh. XU trv vD
hng nui *!3 R& *G (bng T *inh -ut (U&h &h!3Tn tr0ng hE ta u Ua
phng &wa Qi tRng .nterpoator nD3. rct v" -t gia0 (iEn 1p trnh
ang (bng th phng tha& ;hyi te0 1D !an trng nh]t Qi vi 1p Qi
tRng nD3. Tr0ng phng tha& ;hyi te0+ t]t &W &C& giC trU vD Qi tRng 1iIn
!an "! phWi R& ,C& Unh. Ch H rng -\i -Wng tha- *Q phWi &x &_ng
u (Di tr0ng Qi tRng ;hyi te0 hiEn tei vD &C& Qi tRng Path$nt'rp01at0r
;hC& tr0ng &hng trnh.
(ot!os!athenterpolator[lpha lpha0 ,ransfor+%roup target0
,ransfor+3D axis'f(ot!os0 floatrs -nots0 tuatufrs ouats0
!oint3frs positions\
ihyi te0 Qi tRng .nterpoator -i @iJn i &h!3Tn ung !a3 vD
tUnh tiJn &wa Qi tRng v&h Tran*60r-)r0!p.
%_t sL phYZng th[c cung c;p 4\i lSp 2ot-os-ath3nterpolator^
void get!ositions[!oint3frs positions\
2a0 &hcp &C& giC trU vU trv &wa Qi tRng .nterpoator hiEn thzi vD0
-Wng p0*iti0n*. /Wng p0*iti0n* phWi w 1n T &haa (Z 1iE!.
void gettuats[tuatufrs ouats\
2a0 &hcp giC trU &C& !ant'ni0n &wa Qi tRng .nterpoator hiEn thzi
vD0 -Wng !at*. /Wng !at* phWi w 1n T &haa (Z 1iE!.
void set$xis'f(ot!os[,ransfor+3D axis'f(ot!os\
ThiJt 1p trb& &wa giCt trU .0tP0* &h0 Qi tRng .nterpoator hiEn
thzi.
void set!osition[int index0 !oint3f position\
httpBOOtai1i'!ha3.&0-
921
Lp trnh ha trn Java 2D v 3D
ThiJt 1p vU trv tei &h -b& ,C& Unh &h0 Qi tRng .nterpoator hiEn
thzi.
void settuat[int index0 tuatuf ouat\
ThiJt 1p !ant'ni0n tei &h -b& ,C& Unh &h0 Qi tRng .nterpoator
hiEn thzi.
void set,arget[,ransfor+%roup target\
ThiJt 1p Qi tRng v&h Tran*60r-)r0!p &h0 Qi tRng .nterpoator
hiEn thzi.
>Rp Yi==1.ard :
Th!t ngZ Bi,oard R& *G (bng tr0ng ha -C3 tvnh T C-
&h &jng nghE !a3 t` ung -ut Qi tRng tr`& !an 2 &hi"! *a0 &h0 nx
1!jn Qi -t vi ngzi !an *Ct. 2` phCt *inh 1p hDnh vi Bi,oard ,!]t
phCt tt H tyng *G (bng &C& @" -t n giWn tha3 thJ &h0 &h0 &C& hnh
;hQi pha& tep. KDnh vi Bi,oard thjng thzng R& (_ng &h0 -b& v&h
nD3+ ng0Di ra+ nx &dn R& (_ng &h0 &C& -b& v&h ;hC&+ vv (b nh 1D-
&h0 (dng vVn @Wn &x thT R& nhn th]3 tt -i gx& u tr0ng -ji trzng
W0. Tr0ng Java 5D+ &jng nghE Bi,oard R& &Di t @yi -ut 1p &0n
&wa 1p hDnh vi >'havi0r+ v v3+ ngzi ta vn ha3 (_ng th!t ngZ hDnh
vi Bi,oard T &h &jng nghE nD3.
/ut vv (b ;inh iTn *G (bng hDnh vi @'havi0r 1D ang (bng @iT! (ikn
&s3 &Qi (i (eng hnh 2 &hi"!. T]t nhiIn+ nJ! &Ci &s3 &h giZ -ut hng
&Q Unh th ;hi gx& nhn tha3 i+ ngzi !an *Ct *Y phCt hiEn ra hnh (eng
2 &hi"! &wa &s3. Shng nJ! &Ci &s3 x t` Unh hng 1ei *a0 &h0 1!jn Qi
-t vi ngzi !an *Ct th nx (zng nh &x (eng 5 &hi"!. KiE! !W &wa
hiE! ang nD3 &Dng &a0 nJ! &Ci &s3 x n- y hnh n"n &wa ;h!ng &Wnh
h0& 1D n- y phva ng ,a *0 vi vU trv !an *Ct.
Bi,oard 1D- viE& R& vi hnh Wnh &s3 &Qi @yi &s3 &Qi &x (eng
gn giQng nha! ;hi nhn tt ng tr&+ ng *a! ha3 tt @]t &a gx& nhn
httpBOOtai1i'!ha3.&0-
922
Lp trnh ha trn Java 2D v 3D
nD0. Bi,oard 1D- &h0 Qi tRng tr`& !an ,!]t hiEn h0Dn t0Dn giQng
nha! tt @]t &a gx& nhn nD0+ nIn nx r]t thv&h hRp *G (bng &_ng vi Wnh 2
&hi"! T te0 Qi tRng 5 &hi"! &x (eng hnh h& Qi ,ang !a trb& 3 nh
&C& tda nhD hnh trb+ thCp n&+ ha3 @]t ; Qi tRng hnh trb nD0. [Qi
tRng Bi,oard &dn &x thT *G (bng &h0 &C& Qi tRng 5 &hi"! ;hjng &x
(eng Qi ,ang ;hi &hng R& !an *Ct tt -ut ;h0Wng &C&h w 1n T &h'
(]! (eng 2 &hi"!.
Knh 9P17 @iT! (ikn -ut phn &wa thU ;h!ng &Wnh R& ,s3 (`ng
T *G (bng nt Bi,oard . Thjng thzng hai nt Tran*60r-)r0!p R&
*G (bng. St Tran*60r-)r0!p phva trIn R& (_ng T Unh vU trv Qi
tRng tr`& !an vD &x thT 1D thnh. St Tran*60r-)r0!p phva (i R&
(_ng T Unh hng Qi tRng vD R& tha0 tC& @yi Qi tRng Bi,oard .
Chi tiJt viE& 1p trnh *Y R& trnh @D3 tr0ng phn (i s3.
@^ dYn" ii t\]n" 'i&&+%ard
XiE& *G (bng Qi tRng Bi,oard tng t` viE& *G (bng Qi tRng
.nterpoator + ng0ei trt rng ;hjng &n (_ng Qi tRng !pha T i"!
;hiTn h0et Wnh. K0et Wnh &wa Qi tRng Bi,oard R& i"! ;hiTn @yi vU
trv tng Qi &wa ngzi !an *Ct tr0ng thJ gii W0. Knh 9P19 @iT! (ikn
&C& @& *G (bng Bi,oard .
Knh 9P17. >iT! thU ;h!ng &Wnh *G (bng Qi tRng Bi,oard
httpBOOtai1i'!ha3.&0-
925
Lp trnh ha trn Java 2D v 3D
1. te0 Qi tRng v&h vi ;hW nVng #LLMLT.#S28M./L.$T%
2. te0 Qi tRng Bi,oard tha- &hiJ! Jn Qi tRng v&h
Tran*60r-)r0!p
5. thI- (anh gii 1D- viE& &h0 Qi tRng Bi,oard
7. 1^p ghcp thU
Knh 9P19. Cjng tha& *G (bng Qi tRng Bi,oard te0 h0et Wnh
Cc l`i thYang gbp )hi s 'cng Kill4oar'
/& (_ viE& *G (bng Qi tRng Bi,oard ;hjng h" pha& tep+ nhng
&ng &x hai 1\i 1p trnh thzng gp *a!. L\i tha nh]t ,W3 ra (0 Qi tRng
v&h Tran*60r-)r0!p thiJt 1p 1ei h0Dn t0Dn giC trU &wa nx -\i ;hi R&
&p nht. D0 x+ Qi tRng Tran*60r-)r0!p nD3 ;hjng thT *G (bng T
Unh vU Qi tRng tr`& !an. SJ! (_ng Qi tRng v&h T Unh vU+ hiE! ang
Bi,oard vn h0et ung+ t!3 nhiIn+ tr0ng 1n &p nht !a3 ! tiIn+
thjng tin vU trv &wa Qi tRng v&h *Y @U -]t vD Qi tRng tr`& !an *Y
R& hiTn thU tei vU trv @an !.
SJ! Qi tRng v&h ;hjng R& thiJt 1p th!u& tvnh
#LLMLT.#S28M./L.$T% ;hi &hng trnh R& th`& thi *Y phCt
*inh 1\i r!nti-'. SJ! (anh gii 1D- viE& ;hjng R& thiJt 1p ha3 thiJt
1p ;hjng &hvnh ,C& th Qi tRng Bi,oard *Y ;hjng i"! ;hiTn R&
Qi tRng tr`& !an. Danh gii 1D- viE& thjng thzng R& ,C& Unh @yi
Qi tRng >0!n(ing2ph'r' vi phe- vi 1D- viE& w 1n T @a0 g- Qi
tRng tr`& !an.
Cx -ut gii hen ;hi *G (bng 1p Bi,oard B tr0ng &C& ang (bng vi
nhi"! hn -ut !an *Ct+ -\i Qi tRng Bi,oard &h i"! ;hiTn h0et Wnh
&hvnh ,C& &h0 &h -ut !an *Ct. Xi -ut vDi ang (bng th ;hW nVng &!ng
&]p &wa Bi,oard 1D W- @W0+ &dn vi &C& ang (bng ;hC&+ & iT- nD3
1D -ut gii hen 1n. Java5D #P$ phiIn @Wn 1.2 gii thiE! 1p
Mri'nt'(2hap'5D T vRt !a gii hen nD3. [Qi tRng Mri'nt'(2hap'5D
&!ng &]p &C& &ha& nVng giQng vi &ha& nVng &wa Qi tRng Bi,oard
httpBOOtai1i'!ha3.&0-
927
Lp trnh ha trn Java 2D v 3D
nhng &x thI- ;hW nVng ,G 1H nhi"! !an *Ct &_ng -ut 1&. Bi,oard
!a3 !anh -ut trb& h0& -ut iT-. Tr0ng trzng hRp *G (bng ;hC&+ Qi
tRng Bi,oard i"! ;hiTn -ut Qi tRng Tran*60r-)r0!p *a0 &h0 trb&
(ng &wa Qi tRng Tran*60r-)r0!p vD &C& &0n &wa nx 1!jn Qi (iEn
vi ngzi !an *Ct. D0 Bi,oard hng trb& &wa Qi tRng v&h v"
phva ngzi !an *Ct nIn nx ;hjng thT (_ng T !a3 vt thT !anh trb& .
X 1H (0 nD3+ nJ! -ut trb& !a3 &wa Qi tRng R& ,C& Unh 1D f0+ 0+ g
th n giWn Bi,oard ;hjng 1D- g &W.
*h\Rn" trnh vX dY s^ dYn" 'i&&+%ard
Chng trnh vv (b >i11@0ar(#pp te0 -ut thJ gii W0 vi &s3 &Qi *G
(bng ;h th!t Bi,oard . /& (_ &s3 &Qi tr0ng &hng trnh nD3 R& te0
@yi &C& hnh thj fhnh ta- giC& phngg nhng &hng ;hjng h" hiTn thU
nh &C& Qi tRng 2 &hi"!.
Kai Qi tRng Tran*60r-)r0!p R& *G (bng &h0 -\i &s3 tr0ng vv (b
nD3. /ut Qi tRng Tran*60r-)r0!p+ T)T+ n giWn &h (U&h &C& &s3
thDnh ta u vU trv tr0ng ang (bng. )iC trU &wa T)T ;hjng @U tha3 i
tr0ng thzi gian th`& thi &wa ang (bng. [Qi tRng Tran*60r-)r0!p tha
hai+ T).+ i"! ;hiTn h0et ung !a3 &wa &s3. T). 1D Qi tRng v&h &wa
Bi,oard .
public Branch%roup
createSceneGraph(0imp*exni.erse su& Q
// Create the root of the branch graph
Transform%roup .pTrans = null'
Branch%roup ob\$oot = new Branch%roup(&'
zectorff trans*ate = new zectorff(&'
httpBOOtai1i'!ha3.&0-
929
Lp trnh ha trn Java 2D v 3D
Transformf) Tf) = new Transformf)(&'
Transform%roup T%T = null'
Transform%roup T%$ = null'
Bi**board bi**board = null'
Bounding0phere b0phere = new
Bounding0phere(&'
ob\$oot.addChi*d(createNand(&&'
0hared%roup share = new 0hared%roup(&'
share.addChi*d(createTree(&&'
floatKLKL position = Q Q +.+f, +.+f,
Xf.+f 2, Q u.+f, +.+f, +.+f 2,
Q u.+f, +.+f, u.+f 2, Q f.+f,
+.+f, XO+.+f 2,
Q Of.+f, +.+f, Xf+.+f 2, Q
XOf.+f, +.+f, f+.+f 2,
Q XOf.+f, +.+f, (f.+f 2,
Q Of.+f, +.+f, f.+f 2 2'
for (int i = +' i Z position.*ength' ikk&
Q
trans*ate.set(positionKiL&'
Tf).setTrans*ation(trans*ate&'
T%T = new Transform%roup(Tf)&'
T%$ = new Transform%roup(&'
httpBOOtai1i'!ha3.&0-
92:
Lp trnh ha trn Java 2D v 3D
T%$.setCapabi*it,(Transform%roup./NN-V"T$/#0d-$M"
V${T!&'
bi**board = new Bi**board(T%$&'
bi**board.set0chedu*ingBounds(b0phere&'
//
bi**board.set/*ignmentMode(Bi**board.$-T/T!"/B-xT
"-{#T&'
ob\$oot.addChi*d(T%T&'
ob\$oot.addChi*d(bi**board&'
T%T.addChi*d(T%$&'
T%$.addChi*d(new NinW(share&&'
2
.pTrans =
su.getziewing*atform(&.getziew*atformTransform(
&'
trans*ate.set(+.+f, +.ff, +.+f&'
Tf).setTrans*ation(trans*ate&'
.pTrans.setTransform(Tf)&'
te,#a.igatorBeha.ior We,#a.Beh = new
te,#a.igatorBeha.ior(.pTrans&'
We,#a.Beh
.set0chedu*ingBounds(new
Bounding0phere(new ointfd(&, O+++.+&&'
ob\$oot.addChi*d(We,#a.Beh&'
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(+.ff, +.ff, O.+f&'
httpBOOtai1i'!ha3.&0-
92<
Lp trnh ha trn Java 2D v 3D
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on
this scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
Bi**board/pp[0en - trIn R& trv&h tt phng tha&
&r'at'2'n&')raph &wa &hng trnh >i11@0ar(#pp.Nava vi &C& ;v hiE!
Cnh (]! tng ang vi &C& @& th`& hiEn R& 1iEt ;I tr0ng hnh 9P19.
Knh 9P1:. >iT! thU *G (bng Qi tRng Bi,oard tr0ng
>i11@0ar(#pp.Nava
Knh 9P1< hiTn thU -ut &Wnh *inh @yi &hng trnh vv (b >i11@0ar(#pp.
httpBOOtai1i'!ha3.&0-
92=
Lp trnh ha trn Java 2D v 3D
Knh 9P1<. /ut Wnh &wa >i11@0ar(#pp vi t]t &W &s3 2 &hi"! "!
hng v" phva ngzi !an *Ct >i11@0ar(#pp.Nava &!ng &]p
i'3Savigat0r>'havi0r &h0 phcp ngzi (_ng (i &h!3Tn ,!ng !anh vD
!an *Ct &C& &s3 tt &C& vU trv vD hng nhn ;hC& nha!. rin ,'- 1ei phn
7.7.2 &wa &hng 7 T @iJt thI- &hi tiJt v" 1p Qi tRng nD3.
Gia% di4n &p trnh kn" dYn" c[a 'i&&+%ard :'i&&+%ard
0P1;
Tr0ng vv (b >i11@0ar(#pp phva trIn+ Qi tRng Bi,oard h0et ung
vi &hJ u -& Unh 1D !a3 Qi tRng tr`& !an ,!ng !anh trb& 3. SIn+
nJ! &C& &s3 tr0ng vv (b nD3 R& !an *Ct tt phva trIn ha3 tt phva (i+
(eng 2 &hi"! &wa nx *Y @U 1u.
/ut &hJ u tha3 thJ 1D !a3 Qi tRng tr`& !an !anh -ut iT-.
Tr0ng &hJ u nD3+ hnh Wnh 2 &hi"! R& i"! ;hiTn !a3 !anh 1 iT-+
(0 x+ Qi tRng tr`& !an 1!jn R& !an *Ct tr`& (iEn tt @]t &a vU trv
!an *Ct nD0. /ut ang (bng (k th]3 1D @iT! (ikn -t trVng ha3 &C& vt thT
hnh &! y ;h0Wng &C&h ,a (i (eng -ut hnh trdn.
httpBOOtai1i'!ha3.&0-
929
Lp trnh ha trn Java 2D v 3D
Cc phYZng th[c )h\i t]o cda Kill4oar'
Kill4oar' [\
ihyi te0 -ut Bi,oard vi tha- *Q -& UnhB -0('
.MT#T%#>M4T#r$2+ a,i* f0+ 1+ 0g.
Kill4oar' [,ransfor+%roup tg\
ihyi te0 -ut Qi tRng Bi,oard vi &C& tha- *Q -& Unh h0et
ung trIn Qi tRng Tran*60r-)r0!p ,C& Unh.
Kill4oar' [,ransfor+%roup tg0 int +ode0 `e&tor3f axis\
ihyi te0 Qi tRng Bi,oard vi trb& !a3 vD &hJ u h0et ung ,C&
Unh i"! ;hiTn Qi tRng Tran*60r-)r0!p ,C& Unh.
Kill4oar' [,ransfor+%roup tg0 int +ode0 !oint3f point\
ihyi te0 Qi tRng Bi,oard vi ts- !a3 vD &hJ u ,C& Unh+ h0et
ung trIn Qi tRng v&h Tran*60r-)r0!p ,C& Unh.
%_t vHi phYZng th[c )hc cung c;p 4\i lSp Kill4oar' ^
void set$lign+ent$xis[`e&tor3f axis\
ThiJt 1p trb& &anh &hnh.
void set$lign+ent$xis[float x0 float y0 float d\
ThiJt 1p trb& &anh &hnh.
void set$lign+ent*ode[int +ode\
ThiJt 1p &hJ u &anh &hnh+ tr0ng x -0(' &x thT 1D
.MT#T%#>M4T#r$2 P Ch Unh !a3 ,!ng !anh -ut
trb& ,C& Unh
.MT#T%#>M4TPM$ST P Ch Unh !a3 ,!ng !anh -ut iT-
,C& Unh vD &h Unh rng trb& | &wa Qi tRng &0n phWi ph_ hRp vi trb&
| &wa Qi tRng R& !an *Ct
void set(otation!oint[!oint3f point\
ThiJt 1p ts- !a3
void set(otation!oint[float x0 float y0 float d\
ThiJt 1p ts- !a3
httpBOOtai1i'!ha3.&0-
950
Lp trnh ha trn Java 2D v 3D
void set,arget[,ransfor+%roup tg\
ThiJt 1p Qi tRng v&h Tran*60r-)r0!p &h0 Qi tRng Bi,oard
hiEn thzi.
criented@hape<D
[Qi tRng Mri'nt'(2hap'5D R& *G (bng T th`& hiEn &C& &ha&
nVng giQng nh Qi tRng Bi,oard tr0ng -b& tr&. [iT- ;hC& @iEt
&hw 3J! giZa hai 1p Qi tRng nh R& nh^& Jn y phn trIn 1D y &h\
Mri'nt'(2hap'5D &x ;hW nVng 1D- viE& vi nhi"! hn -ut !an *Ct &dn
Bi,oard th ;hjng+ &ng nh ;hW nVng &hia * *G (bng &h &x y
Mri'nt'(2hap'5D.
[Qi tRng Mri'nt'(2hap'5D &ng 3I! &! *G (bng vt - hn.
Mri'nt'(2hap'5D ;hjng hiE! &hnh Qi tRng v&h Tran*60r-)r0!p+ -D
T -y ;hW nVng nD3 &h0 - &hng trnh th`& hiEn. Mri'nt'(2hap'5D
;hjng phWi 1D -ut Qi tRng hDnh vi (0 x+ ngzi 1p trnh &ng ;hjng
&n !an ts- Jn gii hen h0et ung.
Xi *0 *Cnh trIn th (k th]3 Mri'nt'(2hap'5D 1D *` 1`a &hn hiTn
nhiIn &h0 &C& ang (bng (_ng hiE! ang Bi,oard . Sg!3In nhsn (!3 nh]t
T ;hjng 10ei @ 1p Bi,oard ;hi Java5D #P$ &hvnh 1D ;hW nVng
tng thv&h ngR& vi &C& ang (bng ang tn tei.
[Qi tRng Mri'nt'(2hap'5D !a3 ,!ng !anh -ut trb& h0& -ut ts-.
Tr0ng &W hai trzng hRp+ Qi tRng Mri'nt'(2hap'5D t` Unh hng @Wn
thsn nx *a0 &h0 trb& &wa &C& &0n &wa nx 1!jn Qi (iEn vi ngzi !an
*Ct. D0 Mri'nt'(2hap'5D hng trb& &wa &C& vt thT v" phva ngzi
!an *Ct+ nIn ;hjng &x H nghha g nJ! !a3 vt thT !anh trb& . X 1v (0
nD3 nIn trb& !a3 ;hjng R& *0ng *0ng vi trb& + &x nghha 1D+ trb& !a3
;hjng R& Unh nghha 1D f0+ 0+ g vi @]t &a giC trU nD0 &wa . SJ! -ut
trb& *0ng *0ng vi R& &h Unh+ Mri'nt'(2hap'5D n giWn *Y ;hjng
httpBOOtai1i'!ha3.&0-
951
Lp trnh ha trn Java 2D v 3D
1D- g &W. L& x &0i nh 1D Qi tRng Tran*60r-)r0!p R& thiJt 1p -a
trn ng nh]t.
ihjng &x gii hen &h0 giC trU R& *G (bng T 1D- ts- !a3. SJ! &hJ
u @iT! (ikn R& thiJt 1p 1D .MT#T%#>M4TPM$ST th vt thT *Y
!a3 ,!ng !anh -ut iT- ,C& Unh.
Gia% di4n &p trnh kn" dYn" c[a criented@hape<D
)ia0 (iEn 1p trnh ang (bng &wa Mri'nt'(2hap'5D 1D tng t` vi
gia0 (iEn 1p trnh &wa 1p Bi,oard + ng0Di ra+ &ng &x vDi iT- ;hC&
@iEt. 2` ;hC& @iEt phCt *inh &hw 3J! (0 *` ;hC& nha! v" &]! tr& phsn &]p
1p Qi tRng. Mri'nt'(2hap'5D ;J thta tt 1p 2hap'5D+ tr0ng ;hi x+
Bi,oard 1ei ;J thta tt >'havi0r.
Danh *C&h &C& phng tha& ;hyi te0 &wa Mri'nt'(2hap'5D ;hjng
nhi"! nh &wa 1p 2hap'. Xv (b nh ;hjng &x phng tha& ;hyi te0 vi
&h -ut tha- *Q )'0-'tr3. Tr0ng trzng hRp nD3+ &C& phng tha& ;hyi
te0 ;hjng ;J thta 1p & *y. /ut ang (bng &x thT *G (bng phng tha&
;hyi te0 ;hjng tha- *Q vD -ut vDi phng tha& ;hC& T te0 ra Qi tRng
Mri'nt'(2hap'5D &n thiJt.
CC& phng tha& ;hyi te0B
'riented"hape3D[\
ihyi te0 Qi tRng Mri'nt'(2hap'5D vi &C& tha- *Q -& Unh
'riented"hape3D[%eo+etry geo+etry0 $ppearan&e appearan&e0
int -0('+ P0int56 p0intg
ihyi te0 Qi tRng Mri'nt'(2hap'5D vi thDnh phn hnh h&+ thDnh
phn ,!]t hiEn+ &hJ u vD ts- !a3 ,C& Unh.
'riented"hape3D[%eo+etry geo+etry0 $ppearan&e appearan&e0
int -0('+ X'&t0r56 a,i*g
ihyi te0 Qi tRng Mri'nt'(2hap'5D vi thDnh phn hnh h&+ thDnh
phn ,!]t hiEn+ &hJ u vD trb& !a3 ,C& Unh.
httpBOOtai1i'!ha3.&0-
952
Lp trnh ha trn Java 2D v 3D
/ut *Q phng tha& ;hC& &!ng &]p @yi Mri'nt'(2hap'5DB
void set$lign+ent$xis[float x0 float y0 float d\
void set$lign+ent$xis[`e&tor3f axis\
void set$lign+ent*ode[int +ode\
void set(otation!oint[float x0 float y0 float d\
void set(otation!oint[!oint3f point\
CC& phng tha& nD3 &x &C& tha- *Q vD &ha& nVng giQng vi &C& phng
tha& &_ng tIn &wa Bi,oard . r'- &hi tiJt y phn )ia0 (iEn 1p trnh
ang (bng &wa Bi,oard .
CC& ;hW nVng &x thT thiJt 1p &h0 Mri'nt'(2hap'5DB
#LLML#r$2.%#D - L.$T%
Ch0 phcp & fghig thjng tin trb& &anh &hnh.
#LLML/MD%.%#D - L.$T%
Ch0 phcp & fghig thjng tin &hJ u &anh &hnh.
#LLMLPM$ST.%#D - L.$T%
Ch0 phcp & fghig thjng tin ts- !a3.
WX dY s^ dYn" criented@hape<D
XiE& *G (bng Mri'nt'(2hap'5D r]t (k (Dng+ @]t &a &h\ nD0 *G (bng
Qi tRng 2hap'5D "! &x thT tha3 thJ n giWn @ng Qi tRng
Mri'nt'(2hap'5D.
rct &hng trnh vv (b Mri'nt'(2hap'5D#pp.Nava. ng (bng nD3 te0
-ut ph0ng &Wnh W0 vi &C& &s3 Bi,oard 2 &hi"!. /\i &s3 1D -ut &0n
&wa -ut Qi tRng Mri'nt'(2hap'5D+ Qi tRng nD3 te0 hiE! ang
Bi,oard &h0 &s3.
1. p!@1i& >ran&h)r0!p &r'at'2&'n')raphf2i-p1'4niv'r*' *!g
2. OO Cr'at' th' r00t 06 th' @ran&h graph
5. >ran&h)r0!p 0@N.00t n'? >ran&h)r0!pfg
httpBOOtai1i'!ha3.&0-
955
Lp trnh ha trn Java 2D v 3D
7.
9. X'&t0r56 tran*1at' n'? X'&t0r56fg
:. Tran*60r-5D T5D n'? Tran*60r-5Dfg
<. Tran*60r-)r0!p p0*iti0nT) n!11
=. Mri'nt'(2hap'5D 0ri'nt'(2hap'5D n!11
9.
10. )'0-'tr3 tr'')'0- &r'at'Tr''fg
11.
12. OO*p'&i63 th' p0*iti0n 06 th' tr''*
15. 610at p0*iti0n 0.06+ 0.06+ P2.06+
17. P15.06+ 0.06+ 25.06+
19. 1.06+ 0.06+ P5.96
1:.
1<. OO 60r th' p0*iti0n* in th' arra3 &r'at' a M25D
1=. 60r fint i 0 i } p0*iti0n.1'ngth ig
19. tran*1at'.*'tfp0*iti0nig
20. T5D.*'tTran*1ati0nftran*1at'g
21. p0*iti0nT) n'? Tran*60r-)r0!pfT5Dg
22.
25. 0ri'nt'(2hap'5D n'? Mri'nt'(2hap'5Dfg
27. 0ri'nt'(2hap'5D.a(()'0-'tr3ftr'')'0-g
29.
2:. 0@N.00t.a((Chi1(fp0*iti0nT)g
2<. p0*iti0nT).a((Chi1(f0ri'nt'(2hap'5Dg
2=.
[0en - trIn R& trv&h tt phng tha& &r'at'2&'n')raph &wa
&hng trnh Mri'nt'(2hap'5D#pp.Nava. Cx thT nhn th]3 tvnh (k (_ng
&wa Mri'nt'(2hap'5D *0 vi Bi,oard .
httpBOOtai1i'!ha3.&0-
957
Lp trnh ha trn Java 2D v 3D
Z%`t Fnh !kc chi ti6t :Leve& c- Detai& 0ni!ati%ns;
/a& &hi tiJt fL'v'1 M6 D'tai1 LF& g 1D -ut th!t ngZ &h ;h th!t
@iJn i 1Rng &hi tiJt tr0ng -ut Qi tRng tr`& !an (`a trIn -ut vDi giC
trU &wa thJ gii W0. ng (bng thzng gp &wa ;h th!t nD3 1D tha3 i -a&
&hi tiJt &wa Qi tRng (`a trIn ;h0Wng &C&h Qi vi ngzi !an *Ct. ihi
;h0Wng &C&h ti Qi tRng tr`& !an &Dng tVng th &Dng vt &hi tiJt &wa Qi
tRng x R& hiTn thU. D0 v3+ viE& giW- u pha& tep &wa Qi tRng &x
thT ;hjng Wnh hyng Jn ;Jt !W hiTn thU. XiE& giW- @t 1Rng &hi tiJt
&wa Qi tRng ;hi &hng y ;h0Wng &C&h ,a *0 vi ngzi !an *Ct *Y 1D-
giW- ;hQi 1Rng tvnh t0Cn T tj trCt. SJ! ;h th!t nD3 R& Cp (bng tQt *Y
&x thT tiJt ;iE- R& Cng ;T *Q 1Rng &jng tha& tvnh t0Cn -D vn ;hjng
1D- -]t i nui (!ng &wa vt thT.
Lp Di*tan&'LMD &!ng &]p Qi tRng hDnh vi LF& (`a trIn ;h0Wng
&C&h &wa vt thT Qi vi ngzi !an *Ct. /ut ang (bng ;hC& &wa LF& &x
thT 1D tha3 i 1Rng &hi tiJt (`a trIn tQ& u tj trCt fha3 tQ& u hiTn thU+
R& tvnh @ng *Q ;h!ng hnh O gis3g T giZ t 1E ;h!ng hnh 1D th]p nh]t
tQ& u &wa vt thT+ ha3 -a& u &hi tiJt &x thT R& i"! ;hiTn vi &C&
thiJt 1p &wa ngzi (_ng.
/\i Qi tRng LF& &x -ut h0& nhi"! hn &C& Qi tRng 2?it&h
xng vai trd Qi tRng v&h. [Qi tRng 2?it&h 1D -ut nhx- & @iEt @a0
g- ;hjng+ -ut h0& nhi"! hn &C& &0n &wa &hng tr0ng thU ;h!ng
&Wnh R& (_ng T hiTn thU. Tr0ng trzng hRp *G (bng Di*tan&'LMD+
viE& 1`a &hn &0n &wa Qi tRng v&h 2?it&h R& i"! ;hiTn @yi ;h0Wng
&C&h &wa Qi tRng Di*tan&'LMD Qi vi ngzi !an *Ct+ (`a trIn -ut tp
&C& ngng ;h0Wng &C&h.
Sgng ;h0Wng &C&h R& ,C& Unh tr0ng -ut -Wng @^t ! vi
;h0Wng &C&h ,a nh]t+ ;hi x+ &0n ! tiIn &wa Qi tRng v&h *Y R& *G
(bng. C0n ! tiIn &wa Qi tRng v&h thjng thzng 1D Qi tRng tr`&
!an &hi tiJt nh]t. ihi ;h0Wng &C&h &wa Qi tRng Di*tan&'LMD Qi vi
httpBOOtai1i'!ha3.&0-
959
Lp trnh ha trn Java 2D v 3D
ngzi !an *Ct 1n hn ngng tha nh]t+ &0n tha hai &wa Qi tRng *?it&h
*Y R& *G (bng. CC& ngng ;h0Wng &C&h *a! phWi 1n hn ngng
;h0Wng &C&h tr& vD ,C& Unh ;h0Wng &C&h -D &0n tiJp th'0 &wa Qi
tRng v&h R& *G (bng. D0 x+ *Q 1Rng &0n &wa Qi tRng v&h 1D
nhi"! hn *Q ngng ;h0Wng &C&h.
SJ! &x nhi"! hn -ut Qi tRng 2?it&h R& thI- vD0 vi t &C&h 1D
v&h &wa Qi tRng LF& + &C& Qi tRng v&h 2?it&h *Y R& *G (bng
*0ng *0ng. Cx nghha 1D &C& &0n &wa &C& Qi tRng v&h 2?it&h &x &_ng &h
-b& *Y R& 1`a &hn ng thzi. Th'0 &C&h 1D- nD3+ Qi tRng tr`& !an
pha& tep &x thT R& @iT! (ikn @yi nhi"! Qi tRng hnh h& 1D &0n &wa
&C& Qi tRng 2?it&h ;hC& nha!.
@^ dYn" ii t\]n" DistanceLcD
XiE& *G (bng Qi tRng Di*tan&'LMD tng t` viE& *G (bng Qi
tRng nui *!3 .nterpoator + ng0ei trt viE& ;hjng &x Qi tRng !pha
nD0 &n *G (bng T i"! ;hiTn h0et Wnh. K0et Wnh &wa Qi tRng LF&
R& i"! ;hiTn @yi ;h0Wng &C&h tng Qi &wa nx Qi vi ngzi !an *Ct
tr0ng thJ gii W0+ th'0 &C&h nD3+ viE& *G (bng Qi tRng Di*tan&'LMD
giQng vi viE& *G (bng Qi tRng Bi,oard . 2G (bng Qi tRng
Di*tan&'LMD &ng &n phWi thiJt 1p &C& ngng ;h0Wng &C&h. Knh 9P1=
@iT! (ikn &C& @& T *G (bng Di*tan&'LMD.
1. te0 &C& Qi tRng 2?it&h v&h vi ;hW nVng
#LLML2L$TCKL.$T%
2. te0 (anh *C&h -Wng &C& ngng ;h0Wng &C&h &h0 Qi tRng
Di*tan&'LMD
5. te0 Qi tRng Di*tan&'LMD *G (bng -Wng &C& ngng ;h0Wng
&C&h
7. thiJt 1p Qi tRng 2?it&h v&h &h0 Qi tRng Di*tan&'LMD
httpBOOtai1i'!ha3.&0-
95:
Lp trnh ha trn Java 2D v 3D
9. thiJt 1p gii hen h0et ung &h0 Qi tRng Di*tan&'LMD
:. 1^p ghcp thU ;h!ng &Wnh+ @a0 g- &W viE& thI- &C& &0n &h0
&C& Qi tRng 2?it&h
Knh 9P1=. Cjng tha& *G (bng Di*tan&'LMD T te0 h0et Wnh
CMc Ki thfn$ $p khi sz dSn$ LF&
/& (_ viE& *G (bng Qi tRng LF& ;hjng phWi 1D pha& tep+ nhng
&ng &x hai 1\i 1p trnh thzng gp *a!. L\i thzng ,W3 ra nh]t 1D ;hjng
gup Qi tRng 2?it&h v&h vD0 thU ;h!ng &Wnh. ThiJt 1p Qi tRng
2?it&h 1D v&h &wa Qi tRng Di*tan&'LMD ;hjng t` ung gup nx vD0
thU ;h!ng &Wnh.
SJ! ;hW nVng #LLML2L$TCKL.$T% ;hjng R& thiJt 1p &h0
Qi tRng 2?it&h v&h th ;hi &hng trnh R& th`& thi *Y phCt *inh 1\i
r!nti-'. Cdn nZa+ nJ! gii hen h0et ung ;hjng R& thiJt 1p+ h0& thiJt
1p ;hjng &hvnh ,C& th LF& ;hjng i"! ;hiTn R& Qi tRng tr`&
!an. )ii hen h0et ung thjng thzng R& !3 Unh @yi -ut Qi tRng
>0!n(ing2ph'r' vi @Cn ;vnh w 1n T i"! ;hiTn R& Qi tRng tr`&
!an. Tng t` nh &C& Qi tRng hDnh vi ;hC&+ nJ! ;hjng gup LF&
vD0 thU ;h!ng &Wnh th &hng trnh &ng *Y ;hjng @C0 1\i.
Cx -ut gii hen -D 1p LF& ;hjng vRt !a R& &hvnh 1D *Q 1Rng
!an *Ct -D &hng trnh &x thT 1D- viE& R&. SJ! &hng trnh &x
nhi"! hn -ut !an *Ct+ LF& &h &x thT i"! ;hiTn h0et Wnh &hvnh ,C&
&h0 &h -ut tr0ng *Q &C& !an *Ct x.
WX dY s^ dYn" DistanceLcD
[0en - *a! R& trv&h tt phng tha& &r'at'2&'n')raph tr0ng
&hng trnh Di*tan&'LMD#pp. Chi tiJt v" &hng trnh nD3+ ,in ,'-
httpBOOtai1i'!ha3.&0-
95<
Lp trnh ha trn Java 2D v 3D
thI- phn phb 1b& vD ha &hng trnh ;- th'0. [0en - nD3 R&
Cnh *Q tng ang vi &C& @& tr0ng &jng tha& *G (bng y hnh 9P1=.
public Branch%roup createSceneGraph(& Q
Branch%roup ob\$oot = new Branch%roup(&'
Bounding0phere bounds = new
Bounding0phere(&'
// create target Transform%roup with
Capabi*ities
Transform%roup ob\Mo.e = new
Transform%roup(&'
ob\Mo.e.setCapabi*it,(Transform%roup./NN-
V"T$/#0d-$M"V${T!&'
// create /*pha
/*pha a*pha = new /*pha (XO,
/*pha.{#C$!/0{#%"!#/BN!
k /*pha.)!C$!/0{#%"!#/BN!,
+, +, 5+++, O+++, O+++,
5+++, O+++, O+++&'
// specif, the axis of trans*ation
/xis/ng*esf axis-fTra = new
/xis/ng*esf(+.+f,O.+f,+.+f,(float&Math.{/X(.+f&'
Transformf) axisTf) = new Transformf)(&'
axisTf).set(axis-fTra&'
// create position interpo*ator
httpBOOtai1i'!ha3.&0-
95=
Lp trnh ha trn Java 2D v 3D
osition{nterpo*ator pos{nt
= new osition{nterpo*ator (a*pha,
ob\Mo.e, axisTf), +.+f, Xf5.+f&'
pos{nt.set0chedu*ingBounds(bounds&'
// create )istanceN-) target ob\ect
0witch target0witch = new 0witch(&'
target0witch.setCapabi*it,(0witch./NN-V"0
V{TC1"V${T!&'
// add .isua* ob\ects of .arious *e.e*s
of detai* to the target switch
/ppearance sphere/ppear/ = new
/ppearance(&'
Co*oring/ttributes sphereC/a = new
Co*oring/ttributes(&'
sphereC/a.setCo*or(+.Of, +.Yf, +.Of&'
sphere/ppear/.setCo*oring/ttributes(spher
eC/a&'
/ppearance sphere/ppearB = new
/ppearance(&'
Co*oring/ttributes sphereC/b = new
Co*oring/ttributes(&'
sphereC/b.setCo*or(+.Yf, +.Of, +.Of&'
sphere/ppearB.setCo*oring/ttributes(spher
eC/b&'
httpBOOtai1i'!ha3.&0-
959
Lp trnh ha trn Java 2D v 3D
target0witch.addChi*d(new 0phere(.s+f, +,
(5, sphere/ppear/&&'
target0witch.addChi*d(new 0phere(.s+f, +,
O5, sphere/ppearB&&'
target0witch.addChi*d(new 0phere(.s+f, +,
O+, sphere/ppear/&&'
target0witch.addChi*d(new 0phere(.s+f, +,
s, sphere/ppearB&&'
// create )istanceN-) ob\ect
floatKL distances = Q 5.+f, O+.+f,
(+.+f2'
)istanceN-) dN-) = new
)istanceN-)(distances, new ointff(&&'
dN-).add0witch(target0witch&'
dN-).set0chedu*ingBounds(bounds&'
if((target0witch.numChi*dren(&XO& P=
dN-).num)istances(&&Q
0,stem.out.print*n(^)istanceN-)
not initia*ized proper*,^&'
0,stem.out.print*n(target0witch.n
umChi*dren(&&'
0,stem.out.print*n(dN-).num)istan
ces(&&'
2
// assemb*e scene graph
httpBOOtai1i'!ha3.&0-
970
Lp trnh ha trn Java 2D v 3D
ob\$oot.addChi*d(ob\Mo.e&' // target
T% of position interp to mo.e .o
ob\$oot.addChi*d(pos{nt&' // add
position interpo*ator
ob\Mo.e.addChi*d(dN-)&' // maWe
the bounds mo.e with .isua* ob\ect
ob\Mo.e.addChi*d(target0witch&'// must
add target switch to scene graph too
// show a *e.e* f ob\ect up c*ose for
comparison
Transformf) tfd = new Transformf)(&'
tfd.set(new zectorff(+.uf, +.+f, +.+f&&'
Transform%roup tga = new
Transform%roup(tfd&'
ob\$oot.addChi*d(tga&'
tga.addChi*d(new 0phere(.s+f, +, s,
sphere/ppearB&&'
// show a *e.e* + ob\ect at a distance
for comparison
tfd.set(new zectorff(X5.+f, +.+f,
Xf5.+f&&'
Transform%roup tgb = new
Transform%roup(tfd&'
ob\$oot.addChi*d(tgb&'
tgb.addChi*d(new 0phere(.s+f, +, (5,
sphere/ppear/&&'
httpBOOtai1i'!ha3.&0-
971
Lp trnh ha trn Java 2D v 3D
// a white bacWground is better for
printing images in tutoria*
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(O.+f, O.+f, O.+f&'
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
)istanceN-)/pp
Knh 9P19 @iT! (ikn @iT! thU ;h!ng &Wnh R& te0 ra tr0ng vv (b
trIn. Ch H rng+ Qi tRng 2?it&h v&h vta 1D &0n &wa Qi tRng
Tran*60r-)r0!p vta R& tha- &hiJ! Jn @yi Qi tRng Di*tan&'LMD.
CW hai !an hE nD3 "! &n R& ,C& 1p.
httpBOOtai1i'!ha3.&0-
972
Lp trnh ha trn Java 2D v 3D
Knh 9P19. /ut phn @iT! thU ;h!ng &Wnh &h0 &hng trnh
Di*tan&'LMD#pp
Knh 9P20 1D hai &Wnh R& *inh tt &hng trnh Di*tan&'LMD#pp.
/\i Wnh nD3 &x 2 ;hQi &! thnh vD -ut ;hQi &! (U&h &h!3Tn ftr0ng hnh
@In phWi+ ;hQi &! @In trCi nh]t @U &h' ;h!]tg. ihQi &! (U&h &h!3Tn
R& @iT! (ikn @ng -ut Qi tRng Di*tan&'LMD vi 7 ;hQi &! &x u
pha& tep hnh h& ;hC& nha!. ihQi &! nh -D! ,anh 1D ;hQi &! &hi tiJt
nh]t R& *G (bng @yi Qi tRng Di*tan&'LMD y ;h0Wng &C&h &`& ei.
ihQi &! 1n -D! 1D ;hQi &! ;c- &hi tiJt nh]t &wa Qi tRng
Di*tan&'LMD vD y ;h0Wng &C&h &`& tiT!. Kai ;hQi &! nD3 R& hiTn thU
T 1D- -Q& *0 *Cnh.
Tr0ng &hng trnh nD3+ Qi tRng Di*tan&'LMD R& @iT! (ikn @yi &C&
;hQi &! &x -D! *^& ;hC& nha! T -inh ha !C trnh &h!3Tn i.
/ut Qi tRng nui *!3 vU trv P0*iti0n$nt'rp01at0r R& *G (bng T
(U&h &h!3Tn Qi tRng Di*tan&'LMD th'0 hng v!jng gx& vi -Dn
hnh. ihi Qi tRng Di*tan&'LMD (U&h &h!3Tn ra ,a ngzi !an *Ct+ nx
*Y &h!3Tn Qi tRng tr`& !an T hiTn thU. SJ! ;hjng *G (bng &C& ;hQi
httpBOOtai1i'!ha3.&0-
975
Lp trnh ha trn Java 2D v 3D
&! &x -D! *^& ;hC& nha! *Y r]t ;hx ;hVn T nhn @iJt ;hi nD0 th Qi
tRng tr`& !an R& &h!3Tn.
Knh 9P20. Kai &Wnh R& *inh ra tt Di*tan&'LMD#pp.
)ia0 (iEn 1p trnh ang (bng Di*tan&'LMD #P$
Di*tan&'LMD Unh nghha -ut nt Qi tRng hDnh vi LF& (`a
;h0Wng &C&h+ h0et ung trIn -ut nt nhx- 2?it&h T 1`a &hn -ut tr0ng
*Q &C& &0n &wa nt 2?it&h x (`a vD0 ;h0Wng &C&h &wa nt Qi tRng
LF& *0 vi ngzi !an *Ct. /ut -Wng n giC trU ;h0Wng &C&h n iE!
tVng+ R& ,C& Unh *a0 &h0 thDnh phn ! tiIn (i*tan&'*0 tng ang
vi -a& &hi tiJt &a0 nh]t vD thDnh phn &!Qi &_ng (i*tan&'*nP1 tng
ang vi -a& &hi tiJt th]p nh]t. D`a vD0 ;h0Wng &C&h th`& tt ngzi !an
*Ct Jn nt Di*tan&'LMD+ n giC trU ;h0Wng &C&h 0+ nP1 1`a &hn n1
-a& &hi tiJt 0+ n. SJ! gi ;h0Wng &C&h tt ngzi !an *Ct Jn nt LF&
th phng trnh T ,C& Unh -a& &hi tiJt f&0n &wa nt 2?it&hg R& 1`a
&hn 1DB
0 nJ! ( } (i*tan&'*0
1. i nJ! (i*tan&'*iP1 } ( } (i*tan&'*i
2. n nJ! ( ~ (i*tan&'*nP1
httpBOOtai1i'!ha3.&0-
977
Lp trnh ha trn Java 2D v 3D
Ch H rng &W vU trv vD -Wng &C& giC trU ;h0Wng &C&h "! R& ,C&
Unh tr0ng hE ta u Ua phng &wa nt hiEn thzi.
CMc phf;n$ thRc kh|i tloh
Distan&eL'D[\
ihyi te0 vD ;hyi gCn &h0 nt Di*tan&'LMD giC trU -& Unh.
Distan&eL'D[floatrs distan&es\
ihyi te0 vD gCn giC trU @an ! &h0 nt Di*tan&'LMD vi -Wng &C&
giC trU ;h0Wng &C&h ,C& Unh vD vU trv -& Unh f0+ 0+ 0g.
Distan&eL'D[floatrs distan&es0 !oint3f position\
ihyi te0 vD ;hyi gCn &h0 nt Di*tan&'LMD vi -Wng &C& giC trU
;h0Wng &C&h vD vU trv ,C& Unh.
%_t sL phYZng th[c cung c;p 4\i Distance61D^
int nu+Distan&es[\
TrW v" *Q 1Rng &C& ngng ;h0Wng &C&h.
void setDistan&e[int hi&hDistan&e0 dou3le distan&e\
ThiJt 1p ngng ;h0Wng &C&h LF& ,C& Unh.
void set!osition[!oint3f position\
ThiJt 1p vU trv &wa nt LF& .
$%rph
CC& 1p nui *!3 tha3 i &C& th!u& tvnh tr`& !an ;hC& nha! tr0ng thJ
gii W0. T!3 nhiIn+ ;hjng &x 1p nui *!3 nD0 &!ng &]p &C& ;hW nVng tha3
i hnh (eng hnh h& &wa &C& Qi tRng tr`& !an. ihW nVng nD3 (0 1p
/orph &!ng &]p. [Qi tRng /orph te0 hnh (eng &h0 -ut Qi tRng
tr`& !an thjng !a viE& nui *!3 tt -ut tp &C& Qi tRng
)'0-'tr3#rra3. Th'0 & iT- nD3+ 1p /orph giQng vi &C& 1p nui
*!3. T!3 nhiIn+ /orph ;hjng phWi 1D 1p nui *!3+ th- &hv+ nx &dn
;hjng ;J thta 1p hDnh vi >'havi0r. Lp /orph -y rung tt 1p S0('.
httpBOOtai1i'!ha3.&0-
979
Lp trnh ha trn Java 2D v 3D
Tr0ng &hng 7+ &hng ta 1D- !'n vi phng tha&
pr0&'**2ti-!1!* &wa Qi tRng >'havi0r T th`& hiEn &C& tha3 i Qi vi
thU ;h!ng &Wnh th`& ha3 Qi vi &C& Qi tRng tr0ng thU ;h!ng &Wnh
th`&. D0 ;hjng &x 1p hDnh vi &h!3In @iEt *G (bng vi Qi tRng /orph
+ &C& ang (bng /orph phWi t` ,s3 (`ng 1p hDnh vi riIng. Lp /orph
R& &0i nh -ut 1p h0et Wnh ha3 1p tng tC& phb th!u& vD0 *` -j
phng hDnh vi tng tC& vi Qi tRng /orph .
[Qi tRng /orph &x thT R& *G (bng T @iJn ;i- t` thCp thDnh
hnh ;hQi hup+ -0 thDnh &hx+ h0& @iJn i @]t ; hnh (eng hnh h&
nD0 thDnh -ut (eng hnh h& ;hC&. Ken &hJ (!3 nh]t 1D &C& Qi tRng
hnh h& *G (bng &h0 viE& nui *!3 phWi &_ng th!u& -ut 1p vD 1D 1p &0n
&wa 1p )'0-'tr3#rra3+ vi &_ng *Q 1Rng &C& nh. Ken &hJ v" *Q 1Rng
nh ;hjng phWi 1D hen &hJ 1n &wa /orph + tr0ng ha &hng trnh ;-
th'0+ @en & &x thT th]3 &hng trnh P3ra-i(2C!@'.Nava+ @iJn -ut ;-
t` thCp thDnh hnh hup.
[Qi tRng /orph &ng &x thT R& *G (bng T te0 h0et Wnh &h0 &C&
Qi tRng tr`& !an fvv (bB 1D- &h0 -ut ngzi i 1ei R&+ ha3 1D- &h0
@Dn ta3 &x thT &- n^- R& vt (bngg. Chng trnh vv (b te0 h0et
Wnh &h0 @Dn ta3+ /0rphing.Nava &ng &x thT t- th]3 tr0ng ha &hng
trnh ;- th'0. Chng trnh vv (b tha 5+ 1D- &h0 -ut (eng hnh !' i
1ei R& *Y R& trnh @D3 &hi tiJt tr0ng phn *a!.
@^ dYn" ii t\]n" $%rph
[T hiT! R& &C&h *G (bng Qi tRng /orph + tr& hJt+ &n phWi
@iJt &C& tha& Qi tRng /orph 1D- viE&. /orph ;hjng !C pha& tep.
[Qi tRng /orph 1! trZ -ut -Wng &C& Qi tRng )'0-'tr3#rra3 vi
-\i Qi tRng Unh nghha & tW hnh h& h0Dn &hnh &h0 -ut Qi tRng
tr`& !an. CC& Qi tRng )'0-'tr3#rra3 &x thT R& &0i nh 1D &C&
httpBOOtai1i'!ha3.&0-
97:
Lp trnh ha trn Java 2D v 3D
;h!ng Wnh &hvnh tr0ng h0et Wnh+ ha3 &hvnh ,C& hn+ 1D &C& hng *Q tr0ng
phng trnh tvnh t0Cn T te0 ra -ut Qi tRng )'0-'tr3#rra3 -i.
Sg0Di -Wng &C& Qi tRng )'0-'tr3#rra3+ -ut Qi tRng /orph
&dn &x -ut -Wng &C& trng *Q+ s3 &hvnh 1D &C& @iJn *Q tr0ng phng
trnh. 2G (bng &C& Qi tRng )'0-'tr3#rra3 &_ng vi &C& trng *Q+ Qi
tRng /orph ;hyi te0 -ut Qi tRng -Wng hnh h& *G (bng giC trU
trng *Q tr!ng @nh &wa ta u+ -D! *^&+ &!ng &]p @yi Qi tRng
)'0-'tr3#rra3. Tha3 i &C& trng *Q *Y 1D- tha3 i hnh (eng hnh
h&.
1. te0 -ut -Wng &C& Qi tRng )'0-'tr3#rra3
2. te0 -ut Qi tRng /orph vi ;hW nVng
#LLMLL%$)KT2L.$T%
5. 1^p ghcp thU ;h!ng &Wnh+ @a0 g- &W viE& thI- &C& &0n &h0 Qi
tRng v&h 2?it&h
Knh 9P21. Cjng tha& *G (bng Qi tRng /orph
Sh trnh @D3+ *G (bng Qi tRng /orph ;hjng ;hx+ t!3 nhiIn+
&C& @& nD3 ng &h0 &W h0et Wnh vD tng tC&. K0et Wnh vD tng tC&
R& &!ng &]p thjng !a -ut Qi tRng hDnh vi. D0 x+ *G (bng Qi
tRng /orph thzng &x nghha 1D viJt -ut 1p hDnh vi. CC&h viJt 1p
hDnh vi R& trnh @D3 tr0ng phn 7.2.1+ nIn y s3 ;hjng nxi &hi tiJt.
T]t nhiIn+ /orph h0Dn t0Dn &x thT *G (bng -D ;hjng &n Qi tRng
hDnh vi+ nhng nx *Y ;hjng thT te0 ra R& h0et Wnh.
Xv (b *G (bng /orph
Chng trnh /orph nD3 *G (bng -ut Qi tRng hDnh vi t_3 &hnh
T *inh h0et Wnh. >& ! tiIn tr0ng !C trnh phCt triTn *Y 1D ,s3 (`ng
1p hDnh vi nD3.
httpBOOtai1i'!ha3.&0-
97<
Lp trnh ha trn Java 2D v 3D
Tr0ng Qi tRng hDnh vi R& *G (bng T te0 h0et Wnh &h0 Qi tRng
/orph + phng tha& pr0&'**2ti-1!* tha3 i trng *Q &wa Qi tRng
/orph . Tr0ng vv (b nD3 pr0&'**2ti-!1!* thiJt 1p &C& giC trU trng *Q
(`a vD0 giC trU !pha &wa -ut Qi tRng !pha. K0et ung nD3 ,W3 ra tei
-\i ;h!ng Wnh R& tj trCt ;hi i"! ;iEn ;v&h h0et R& tha -n.
[0en - *a! 1D 0en - ,s3 (`ng Qi tRng hDnh vi t_3 @iJn tr0ng
&hng trnh /0rph#pp.
public class MorphBeha.ior extends Beha.iorQ
private Morph targetMorph'
private /*pha a*pha'
// the fo**owing two members are here for
effcienc, (no memor, burn&
private doubleKL weights = Q+, +, +, +2'
private VaWeupCondition trigger = new
VaWeup-n!*apseddrames(+&'
// create MorphBeha.ior
"orphBehavior(Morph targetMorph, /*pha
a*pha&Q
this.targetMorph = targetMorph'
this.a*pha = a*pha'
2
public void initialize(&Q
// set initia* waWeup condition
this.waWeup-n(trigger&'
2
httpBOOtai1i'!ha3.&0-
97=
Lp trnh ha trn Java 2D v 3D
public void processStimulus(!numeration
criteria&Q
// donwt need to decode e.ent since
there is on*, one trigger
// do what is necessar,
weightsK+L = +'
weightsKOL = +'
weightsK(L = +'
weightsKfL = +'
float a*phaza*ue = sf ] a*pha..a*ue(&
X +.++++Of'
int a*pha{ndex = (int& a*phaza*ue'
weightsKa*pha{ndexL = (double&
a*phaza*ue X (double&a*pha{ndex'
if(a*pha{ndex Z f&
weightsKa*pha{ndex k OL = O.+ X
weightsKa*pha{ndexL'
else
weightsK+L = O.+ X
weightsKa*pha{ndexL'
targetMorph.setVeights(weights&'
// set next waWeup condition
this.waWeup-n(trigger&'
2
2 // end of c*ass MorphBeha.ior
httpBOOtai1i'!ha3.&0-
979
Lp trnh ha trn Java 2D v 3D
Lp /0rph>'havi0r te0 ;h!ng h0et Wnh &hvnh @ng &C&h *G (bng &C&
Qi tRng )'0-'tr3#rra3 hai 1n tei -ut thzi iT- th'0 -ut !C trnh &x
tvnh t!n h0Dn. Lp nD3 thv&h hRp &h0 t]t &W &C& h0et Wnh *G (bng 7
;h!ng Wnh &hvnh vD &x thT tha3 i (k (Dng T ;hp vi *Q 1Rng ;h!ng
Wnh &hvnh ;hC& nha!.
Xi 1p hDnh vi t_3 &hnh vta viJt+ -i viE& &dn 1ei &h 1D te0 ;h!ng
Wnh &hvnh *G (bng &h0 h0et Wnh. Knh 9P22 @iT! (ikn &C& hnh vY ta3
R& *G (bng 1D- ;h!ng Wnh &hvnh &h0 &hng trnh vv (b. /!Qn ,s3
(`ng &C& ;h!ng Wnh p hn+ &x thT *G (bng &C& gxi 5D.
CC& hnh &x -D! 'n trjng giQng nh 1D hai ;h!ng hnh &hvnh+ -\i
&Ci R& 1p 1ei -ut 1n+ nhng th`& tJ+ &hng 1D @Qn ;h!ng hnh &hvnh
riIng @iEt. 2` ;hC& nha! 1D y tha t` &C& nh R& ,C& Unh.
[0en - *a! R& trv&h tt phng tha& &r'at'2&'n')raph &wa
&hng trnh /0rph#pp.Nava vi &C& *Q Cnh (]! &C& @& R& &h ra
tr0ng hnh 9P21. Tr0ng phng tha& nD3+ -ut Qi tRng /0rph>'havi0r+
-ut Qi tRng !pha vD -ut Qi tRng /orph R& te0 ra+ ri R& gup
vD0 thU ;h!ng &Wnh. CC& Qi tRng ;h!ng Wnh &hvnh )'0-'tr3#rra3
R& te0 ra @yi -ut *Q phng tha& ;hC&. T0Dn @u &hng trnh &x thT
t- th]3 tr0ng ha &hng trnh ;- th'0.
Knh 9P22. CC& hnh ;h!ng Wnh &hvnh &wa /0rph#pp vi zng ! e0
&wa -ut nh fzng -zg
public Branch%roup createSceneGraph(& Q
httpBOOtai1i'!ha3.&0-
990
Lp trnh ha trn Java 2D v 3D
// Create the root of the branch graph
Branch%roup ob\$oot = new Branch%roup(&'
Transformf) tfd = new Transformf)(&'
tfd.set(new zectorff(+f, X+.5f, +f&&'
Transform%roup trans*ate = new
Transform%roup(tfd&'
// create %eometr,/rra,KL (arra, of
%eometr,/rra, ob\ects&
%eometr,/rra,KL geom/rra, = new
%eometr,/rra,KsL'
geom/rra,K+L = create%eom/rra,+(&'
geom/rra,KOL = create%eom/rra,O(&'
geom/rra,K(L = create%eom/rra,((&'
geom/rra,KfL = create%eom/rra,f(&'
// create morph ob\ect
Morph morph-b\ = new Morph(geom/rra,&'
morph-b\.setCapabi*it,(Morph./NN-V"V!{%1T
0"V${T!&'
// create a*pha ob\ect
/*pha a*pha = new /*pha(XO, O, +, +,
(+++, O++, +, +, +, +&'
// create morph dri.ing beha.ior
MorphBeha.ior morphBeha. = new
MorphBeha.ior(morph-b\, a*pha&'
httpBOOtai1i'!ha3.&0-
991
Lp trnh ha trn Java 2D v 3D
morphBeha..set0chedu*ingBounds(new
Bounding0phere(&&'
//assemb*e scene graph
ob\$oot.addChi*d(trans*ate&'
trans*ate.addChi*d(morph-b\&'
ob\$oot.addChi*d(morphBeha.&'
BacWground bacWground = new BacWground(&'
bacWground.setCo*or(Of, Of, Of&'
bacWground.set/pp*icationBounds(new
Bounding0phere(&&'
ob\$oot.addChi*d(bacWground&'
// Net va.a f) perform optimizations on this
scene graph.
ob\$oot.compi*e(&'
return ob\$oot'
2 // end of Create0cene%raph method of
Morph/pp
/ut &h H th vU rt ra tt vv (b trIn 1D nhi"! h0et Wnh ;hC& nha! &x
thT R& te0 ra+ *G (bng &hvnh &C& ;h!ng hnh &hvnh R& ,s3 (`ng y
trIn+ vi &C& 1p hDnh vi ;hC& nha!. Knh 9P25 @iT! (ikn -ut &Wnh *inh ra
@yi /0rph5D#pp. Tr0ng &hng trnh nD3+ 5 1p hDnh vi ;hC& nha! te0
h0et Wnh (`a trIn -ut *Q h0& t]t &W Qi tRng )'0-'tr3#rra3 &wa
/0rph#pp. Chng R& gi 1n 1Rt ftt trCi !a phWig 1D $n P1a&'+
Tang0+ vD >r0;'n.
httpBOOtai1i'!ha3.&0-
992
Lp trnh ha trn Java 2D v 3D
Knh 9P25. /ut &Wnh tr0ng &hng trnh /0rph5#pp
Gia% di4n &p trnh kn" dYn" $%rph 0P1
CC& phng tha& ;hyi te0B
%orph [%eo+etry$rrayrs geo+etry$rrays\
ihyi te0 vD ;hyi gCn giC trU &h0 Qi tRng /orph vi -ut -Wng Qi
tRng )'0-'tr3#rra3 ,C& Unh vD -ut Qi tRng n!11 th!u& ;iT!
#pp'aran&'.
%orph [%eo+etry$rrayrs geo+etry$rrays0 $ppearan&e appearan&e\
ihyi te0 vD ;hyi gCn giC trU &h0 Qi tRng /orph vi -ut -Wng Qi
tRng )'0-'tr3#rra3 vD -ut Qi tRng #pp'aran&' ,C& Unh.
%_t sL phYZng th[c )hc cung c;p 4\i %orph ^
void set$ppearan&e[$ppearan&e appearan&e\
ThiJt 1p thDnh phn hiTn thU @" ng0Di &h0 nt /orph .
void set%eo+etry$rrays[%eo+etry$rrayrs geo+etry$rrays\
ThiJt 1p thDnh phn g'0-'tr3#rra3* &h0 nt /orph .
void set$ppearan&e'verrideZna3le[3oolean flag\
ThiJt 1p &z T &x nt 1C #1t'rnat'#pp'aran&' 1D- @" ng0Di hiTn thU
&h0 nt /orph .
httpBOOtai1i'!ha3.&0-
995
Lp trnh ha trn Java 2D v 3D
void setheights[dou3lers eights\
ThiJt 1p v'&t0r trng *Q /orph &h0 nt /orph hiEn thzi.
Cc )hJ neng cX th9 thift lgp cho %orph ^
#LLML#PP%#.#SC%.%#D - L.$T%
rC& Unh rng nt hiEn thzi &h0 phcp & fghig thjng tin
app'aran&' &wa nx.
#LLML)%M/%T.|#..#|.%#D - L.$T%
rC& Unh rng nt hiEn thzi &h0 phcp & fghig thjng tin (eng hnh
h& &wa nx.
#LLMLL%$)KT2.%#D - L.$T%
rC& Unh rng nt hiEn thzi &h0 phcp & fghig v'&t0r trng *Q
/orph &wa nx.
Gia. diZn Ge.Ketr<Wpdater
Tr0ng &C& phn trIn+ h0et Wnh R& te0 ra &hw 3J! @ng &C&h (i
&h!3Tn &C& ;hQi hnh hnh h&+ &ha ;hjng tha3 i ha3 te0 ra hnh -i.
Sg0ei trt /orph te0 ra hnh nui *!3 tt &C& hnh &h0 tr&. Java 5D #P$
gii thiE! gia0 (iEn )'0-'tr34p(at'r+ gia0 (iEn nD3 &_ng vi
>|.%8%.%SC% g'0-'tr3 f&hng 2g &h0 phcp tha3 i hnh (eng
hnh h& tr0ng thzi gian th`& thi &hng trnh.
Xi gia0 (iEn )'0-'tr34p(at'r+ ngzi 1p trnh ang (bng &x thT te0
ra @]t &a 10ei h0et Wnh nD0 phb th!u& vD0 viE& tha3 i thjng tin v" (eng
hnh h&+ ;T &W &C& h0et Wnh *G (bng ;h th!t Bi,oard + 1'v'1 06 ('tai1
vD /orph . )ia0 (iEn )'0-'tr34p(at'r &x tvnh -"- (0 &a0+ &h0 phcp
ngzi 1p trnh te0 R& nhi"! hiE! ang hn *0 vi &C& ;h th!t trIn.
CC& ang (bng &x thT *G (bng )'0-'tr34p(at'r @a0 g- &C& ;h th!t
h0et Wnh &h!n nh ;iJn te0 &C& hE ung+ &C& hE phsn tG *inh @xng -z t`
ung ha3 &C& hiE! ang & @iEt nh &hp D0 )'0-'tr34p(at'r &h0
httpBOOtai1i'!ha3.&0-
997
Lp trnh ha trn Java 2D v 3D
phcp tr!3 &p Jn (Z 1iE! ttng nh &wa Qi tRng hnh h& nIn ;hW nVng
te0 h0et Wnh 1D ;hjng &x gii hen.
/& (_ &x thT hiE! &hnh (Z 1iE! Qi tRng hnh h& >|.%8%.%SC%
-D ;hjng &n *G (bng Qi tRng )'0-'tr34p(at'r+ nhng &C&h 1D- nD3
&h0 ;Jt !W h0& 1D ;hjng thT (` 0Cn R& h0& 1D ;hjng n Unh.
@^ dYn" Ge%!etr,Kpdater
[T *G (bng R& Qi tRng )'0-'tr34p(at'r &h0 &C& ang (bng hnh
h& ung+ tr& hJt &n te0 Qi tRng hnh h& >|.%8%.%SC% vi &C&
;hW nVng thv&h hRp+ te0 -ut 1p )'0-'tr34p(at'r vD 1]3 ra -ut Qi
tRng th!u& 1p x+ ri te0 -ut 1p hDnh vi t_3 @iJn vD &ng 1]3 ra -ut
Qi tRng th!u& 1p x. Cjng viE& nD3 ;hjng !C pha& tep nh nhn nhn
@an !.
Cjng viE& te0 Qi tRng hnh h& >|.%8%.%SC% ;hjng 1D- g
nhi"! hn ng0Di viE& te0 ra -ut Qi tRng hnh h& ;hC&. [Qi tRng
)'0-'tr34p(at'r &x nhiE- vb hiE! &hnh Qi tRng hnh h& ;hi R&
gi. [Qi tRng hDnh vi 1p 1U&h gi Qi tRng )'0-'tr34p(at'r tr0ng ang
(bng.
Chng ta ,'- ,ct !a hai phng tha& !an trng &wa gia0 (iEn
)'0-'tr34p(at'r. Kai phng tha& nD3 &x &_ng tIn 1D !p(at'Datafg.
Phng tha& !p(at'Datafg tha nh]t phWi R& &Di t &hi tiJt tr0ng 1p
Unh nghha )'0-'tr34p(at'r tr0ng ang (bng. Phng tha& !p(at'Datafg
tha hai 1D phng tha& &wa )'0-'tr3#rra3+ phng tha& nD3 *Y gi
phng tha& R& &Di t tr0ng 1p )'0-'tr34p(at'r.
void updateData[%eo+etry geo+etry\
Cp nht (Z 1iE! hnh h& &x thT tr!3 &p @yi tha- &hiJ!.
void updateData[%eo+etry_pdater updater\
httpBOOtai1i'!ha3.&0-
999
Lp trnh ha trn Java 2D v 3D
Phng tha& nD3 gi phng tha& !p(at'Data &wa Qi tRng
)'0-'tr34p(at'r ,C& Unh T ng @u hxa &p nht (Z 1iE! Qi tRng
hnh h& R& tha- &hiJ! @yi Qi tRng )'0-'tr3#rra3 hiEn thzi.
*h\Rn" trnh vX dY h4 thin" phTn t^ 3i ph9n n\c s^
dYn" Ge%!etr,Kpdater
CC& hE thQng phsn tG thjng thzng R& *G (bng T -j hnh n&+
;hxi+ phC0 h0a vD &C& hiEn tRng giQng (eng 1ng ;hC&. Tr0ng -ut hE
thQng phsn tG+ &x hai tha- *Q thiJt ;J & @WnB &C& phsn tG *Y &x (eng nh
thJ nD0+ vU trv vD hng &wa nx *Y R& &p nht ra *a0. CC& phsn tG thjng
thzng R& @iT! (ikn (i (eng iT- h0& zng+ t!3 nhiIn+ &C& (eng
hnh h& ;hC& &ng &x thT R& *G (bng. XiE& &p nht &h!3Tn ung &x
thT -j phng R& hDnh vi t` nhiIn &wa &C& Qi tRng f&b thT hn 1D -j
phng &C& Unh 1!t vt 1Hg ha3 &C& &h!3Tn ung -0ng -!Qn ;hC&. Thjng
thzng+ -ut vDi phn &wa - &hng trnh *Y &x thDnh phn ng! nhiIn
T trCnh &h0 &C& phsn tG h0et ung h0Dn t0Dn giQng nha!.
Tr0ng &hng trnh vv (b+ &C& het n& R& @iT! (ikn (i (eng &C&
0en thng nh vi &h!3Tn ung t!sn th'0 &C& !3 1!t vt 1H f&b thT 1D
&hng R& gia tQ& @yi trng trzngg. /\i 0en thng R& ,C& Unh @yi
2 iT-.
Knh 9P27 1D -ut &h!\i &C& Wnh th! R& tt &hng trnh vv (b
Parti&1'#pp. nh phva @In trCi 1D Di n& tr& ;hi &C& phsn tG n&
R& ;hyi te0. nh y giZa 1D ;hi &ut n& R& ;hyi te0 tr0ng Di
ph!n. Tr0ng Wnh nD3+ &x t]t &W ;h0Wng 500 phn tG h0et ung. Knh ng0Di
&_ng @In phWi 1D Wnh Di ph!n ;hi h0et ung -ut ;h0Wng thzi gian.
Tr0ng hnh nD3 &x ;h0Wng 900 phn tG n& h0et ung.
httpBOOtai1i'!ha3.&0-
99:
Lp trnh ha trn Java 2D v 3D
Knh 9P27. Ch!\i hnh Wnh th! tt &hng trnh Parti&1'#pp
Tr0ng &hng trnh Parti&1'#pp.Nava+ &W Di ph!n R& !a3 !anh
trb& T thT hiEn tvnh 5 &hi"! t` nhiIn &wa h0et Wnh. Lp hDnh vi t! @iJn
>'havi0r vD 1p )'0-'tr34p(at'r 1D &C& 1p tr0ng &wa 1p 80!ntain. Cx
thT (_ng -ut vDi &C&h ;hC& T thiJt ;J h0et Wnh nh trIn. T!3 nhiIn+ *G
(bng &C& 1p nD3 nh 1D 1p tr0ng *Y @iJn 80!ntain try thDnh -ut Qi
tRng h0e h0et Wnh h0Dn &hnh. Kn nZa+ (0 &W hai 1p >'havi0r vD
)'0-'tr3 "! &h R& *G (bng &h0 riIng ang (bng nD3+ nIn &hng &x 1v
(0 g T &h0 phcp &hng R& *G (bng @yi &C& 1p ;hC& @In ng0Di
80!ntain.
CC& 0en - *a! tng ang Unh nghha &C& Qi tRng hnh h&+ hDnh
vi vD g'0-'tr34p(at'r &h0 ang (bng Parti&1'#pp. >a 0en - nD3 1D
thDnh phn &hvnh te0 nIn h0et Wnh tr0ng Parti&1'#pp.
[0en - ! tiIn a ra Unh nghha &h0 1p 80!ntain. Cb thT+ nx Unh
nghha -ut vDi trzng vD te0 ra Qi tRng hnh h& R& (_ng T @iT! (ikn
n&.
>a trzng fha3 5 th!u& tvnhg R& Unh nghha gn th . Trzng
?at'rLin'* vD @a*'%1'vati0n R& *G (bng tr0ng -ut vDi phng tha&
;hC& nha! nIn &hng R& ;hai @C0 1D &C& th!u& tvnh &wa 1p 80!ntain.
?at'rLin'* 1D -ut tha- &hiJ! Jn Qi tRng hnh h& Lin'#rra3+ Qi
tRng hnh h& &wa phn tG n&. @a*'%1'vati0n 1D giC trU t0e u 3 &wa
httpBOOtai1i'!ha3.&0-
99<
Lp trnh ha trn Java 2D v 3D
&hsn Di ph!n. Trzng th!u& tvnh tha 5 giZ -ut tha- &hiJ! Jn Qi tRng
Lat'r4p(at'r R& te0 ra tei s3 vi -b& v&h 1D ;hjng 1D- trDn @u nh.
Phng tha& tha nh]t &wa 1p 80!ntain 1D &r'at'Lat'r)'0-'tr3fg.
Phng tha& nD3 &x Unh nghha -ut @iJn ng!3In S + S 1D *Q 1Rng &C&
phn tG n& f*Q &C& 0en thng &wa Lin'#rra3g R& (_ng T @iT! (ikn
n&. )iC trU 1700 R& gCn &h0 S tr0ng 0en - ;hjng &x g & @iEt
ng0ei trt viE& nx 1D- &h0 h0et Wnh trjng &x v hRp 1H hn. )n nh @]t
&a giC trU nD0 &ng &x thT gCn &h0 S. CDng nhi"! phn tG R& *G (bng T
te0 h0et Wnh th thzi gian T ,s3 (`ng -ut ;h!ng hnh hiTn thU &Dng 1n.
Tr0ng phng tha& &r'at'Lat'r)'0-'tr3fg+ Qi tRng Lin'#rra3
R& te0 ra trIn (dng - gCn nhn . 2Q 1Rng &C& nh 1D S2+ @yi -\i
phn tG f-\i 0en thngg &n -ut nh @^t ! vD -ut nh ;Jt th&. Ch
H rng Unh (eng nh @a0 g- &W >|.%8%.%SC%.
CC& phn tG n& R& te0 h0et Wnh @ng &C&h tha3 i giC trU t0e u
nh &h0 &C& 0en thng tng ang. XiE& nD3 &h &x thT th`& hiEn R&
nJ! ;hW nVng thv&h hRp R& thiJt 1p. Ddng - (Cn nhn ! tiIn thiJt
1p ;hW nVng &h0 phcp ghi (Z 1iE! nh. ihW nVng nD3 &n phWi R& thiJt
1p &h0 @]t &a ang (bng nD0 *G (bng )'0-'tr34p(at'r. Tr0ng h! hJt
&C& ang (bng *G (bng )'0-'tr34p(at'r+ ;hW nVng & &ng &n phWi
R& thiJt 1p. ng (bng nD3 di hi nh v3. Ddng - (Cn nhn tha 2
&x nhiE- vb thiJt 1p ;hW nVng & (Z 1iE! giC trU nh.
Phb th!u& ang (bng vD &C&h Qi tRng )'0-'tr34p(at'r R& thiJt
;J+ thjng tin (eng hnh h& nh]t Unh ng0Di (Z 1iE! nh &x thT &n T
thiJt 1p Qi tRng )'0-'tr3. Xv (b+ nJ! Qi tRng )'0-'tr34p(at'r
;hjng @iJt R& *Q nh R& *G (bng th giC trU nD3 phWi R& & tt
Qi tRng )'0-'tr3 R& tr!3"n &h0 nx. T]t nhiIn+ thjng tin nD3 &h
&x thT & R& nJ! ;hW nVng thv&h hRp R& thiJt 1p. Ddng - tiJp *a!
hai (dng - gCn nhn &hU! trC&h nhiE- thiJt 1p ;hW nVng & *Q 1Rng
nh.
httpBOOtai1i'!ha3.&0-
99=
Lp trnh ha trn Java 2D v 3D
CC& (dng - &dn 1ei tr0ng 0en - *a! ;hyi te0 t0e u &h0 S nh. /\i
nh R& ;hyi te0 t0e u f0+ @a*'%1'vati0n+ 0g+ (0 x @an !+ ;hjng &x
phn tG nD0 R& nhn th]3.
public class dountain extends Branch%roup Q
protected Nine/rra, waterNines = null'
protected float base!*e.ation = X+.s5f'
protected %eometr,xpdater geometr,xpdater =
new Vaterxpdater(&'
%eometr, create'aterGeometry(& Q
int # = Os++' // number of wdropsw
waterNines = new Nine/rra,(# ] (,
Nine/rra,.C--$){#/T!0
U Nine/rra,.BY"$!d!$!#C!&'
waterNines.setCapabi*it,(%eometr,/rra,./NN-V"$!d"
)/T/"V${T!&'
waterNines.setCapabi*it,(%eometr,/rra,./NN-V"$!d"
)/T/"$!/)&'
httpBOOtai1i'!ha3.&0-
999
Lp trnh ha trn Java 2D v 3D
waterNines.setCapabi*it,(%eometr,/rra,./NN-V"C-x#
T"$!/)&'
floatKL coordinates = new floatK# ] f ]
(L'
int p'
for (p = +' p Z #' p k= (& Q // for each
partic*e
coordinatesKp ] f k +L = +.+f'
coordinatesKp ] f k OL =
base!*e.ation'
coordinatesKp ] f k (L = +.+f'
coordinatesKp ] f k fL = +.+f'
coordinatesKp ] f k sL =
base!*e.ation'
coordinatesKp ] f k 5L = +.+f'
2
waterNines.setCoord$efd*oat(coordinates&'
// the fo**owing statements wou*d be
redundant
// waterNines.set{nitia*Coord{ndex(+&'
// waterNines.setza*idzertexCount(#](&'
return waterNines'
2
httpBOOtai1i'!ha3.&0-
9:0
Lp trnh ha trn Java 2D v 3D
abstract class xpdateVaterBeha.ior extends
Beha.ior Q
VaWeup-n!*apseddrames w = null'
public (pdate'aterBehavior(& Q
w = new VaWeup-n!*apseddrames(+&'
2
public void initialize(& Q
waWeup-n(w&'
2
public void processStimulus(!numeration
critiria& Q
waterNines.update)ata(geometr,xpdater&'
waWeup-n(w&'
2 // end process0timu*us
2 // end c*ass xpdateVaterBeha.ior
public class Vaterxpdater implements
%eometr,xpdater Q
$andom random'
public 'ater(pdater(& Q
random = new $andom(&'
httpBOOtai1i'!ha3.&0-
9:1
Lp trnh ha trn Java 2D v 3D
2
public void update)ata(%eometr, geometr,&
Q
%eometr,/rra, geometr,/rra, =
(%eometr,/rra,& geometr,'
floatKL coords =
geometr,/rra,.getCoord$efd*oat(&'
int # =
geometr,/rra,.getza*idzertexCount(&'
int i'
for (i = +' i Z #' i k= (& Q // for
each partic*e
if (coordsKi ] f k OL q
base!*e.ation& Q // update acti.e
// partic*es
coordsKi ] f k +L k=
coordsKi ] f k +L X coordsKi ] f k fL' // xO
coordsKi ] f k OL k=
coordsKi ] f k OL X coordsKi ] f k sL
X +.+Of' // ,O
coordsKi ] f k (L k=
coordsKi ] f k (L X coordsKi ] f k 5L' // zO
coordsKi ] f k fL =
(coordsKi ] f k +L k coordsKi ] f k fL& / (' //
x(
httpBOOtai1i'!ha3.&0-
9:2
Lp trnh ha trn Java 2D v 3D
coordsKi ] f k sL =
(coordsKi ] f k OL k coordsKi ] f k sL k +.+Of& /
('// ,(
coordsKi ] f k 5L =
(coordsKi ] f k (L k coordsKi ] f k 5L& / (' //
z(
if (coordsKi ] f k OL Z
base!*e.ation& Q // if partic*e
// be*ow base
coordsKi ] f k +L =
+.+f' // xO
coordsKi ] f k OL =
base!*e.ation' // ,O
coordsKi ] f k (L =
+.+f' // zO
coordsKi ] f k fL =
+.+f' // x(
coordsKi ] f k sL =
base!*e.ation' // ,(
coordsKi ] f k 5L =
+.+f' // z(
2
2 else Q // an inacti.e partic*e
if (random.nextd*oat(& q
+.Y& Q // random*, start a drop
coordsKi ] f k +L =
+.+ff ] (random.nextd*oat(& X +.5f&' // xO
httpBOOtai1i'!ha3.&0-
9:5
Lp trnh ha trn Java 2D v 3D
coordsKi ] f k OL =
+.Osf ] random.nextd*oat(&
k
base!*e.ation' // ,O
coordsKi ] f k (L =
+.+ff ] (random.nextd*oat(& X +.5f&' // zO
2 // end if
2 // end ifXe*se
2 // end for *oop
2
2
2
[0en - *a! Unh nghha 1p 4p(at'Lat'r>'havi0r+ -ut 1p -y rung
tt 1p >'havi0r. [s3 1D 0en - (k nh]t tr0ng ang (bng
)'0-'tr34p(at'r. Lp >'havi0r i"! ;hiTn h0et Wnh @ng &C&h gi
phng tha& !p(at')'0-'tr3 &wa Qi tRng hnh h& R& te0 h0et Wnh
;hi phng tha& pr0&'**2ti-!1!* &wa nx R& gi.
[Unh nghha 1p 4p(at'Lat'r>'havi0r @a0 g- trzng ? -ut tha-
&hiJ! Jn Qi tRng La;'!pMn%1a*'(8ra-'* P R& *G (bng T ;v&h
h0et Qi tRng hDnh vi. [Qi tRng La;'!pMn%1a*'(8ra-'* R& te0
tr0ng phng tha& ;hyi te0 &wa 4p(at'Lat'r>'havi0r @^t ! tt (dng
- R& (Cn nhn . Phng tha& initia1i'fg &wa 1p
4p(at'Lat'r>'havi0r+ @^t ! tt (dng - + thiJt 1p i"! ;iEn Cnh
tha& @an ! &h0 Qi tRng hDnh vi.
Phng tha& pr0&'**2ti-!1!*fg+ @^t ! tt (dng - gCn nhn + Unh
nghha &C& hDnh ung &wa Qi tRng hDnh vi Cp ang 1ei &C& *` ;iEn Cnh
tha& nx. Tr0ng trzng hRp nD3+ phng tha& !p(at'Datafg R& gi vD
tr!3"n tha- *Q g'0-'tr34p(at'r &h0 ?at'rLin'*.
httpBOOtai1i'!ha3.&0-
9:7
Lp trnh ha trn Java 2D v 3D
abstract class xpdateVaterBeha.ior extends
Beha.ior Q
VaWeup-n!*apseddrames w = null'
public (pdate'aterBehavior(& Q
w = new VaWeup-n!*apseddrames(+&'
2
public void initialize(& Q
waWeup-n(w&'
2
public void processStimulus(!numeration
critiria& Q
waterNines.update)ata(geometr,xpdater&'
waWeup-n(w&'
2 // end process0timu*us
2 // end c*ass xpdateVaterBeha.ior
[0en - *a! Unh nghha 1p )'0-'tr34p(at'r. )'0-'tr34p(at'r
(U&h &h!3Tn &C& phn tG n& @ng &C&h tha3 i (Z 1iE! ta u &wa
&hng.
Lp )'0-'tr34p(at'r tr0ng ang (bng nD3 &x -ut hD- ;hyi te0 vD
-ut phng tha&. Tr0ng hD- ;hyi te0+ nhn + -ut Qi tRng .an(0-
R& te0 ra T *G (bng tr0ng phng tha& thzng (!3 nh]t &wa 1p+
phng tha& !p(at'Datafg.
httpBOOtai1i'!ha3.&0-
9:9
Lp trnh ha trn Java 2D v 3D
Phng tha& !p(at'Datafg+ nhn + te0 h0et Wnh &h0 &C& phn tG
n&. Thjng thzng+ ;hjng phWi t]t &W &C& phn tG "! h0et ung tei
&_ng -ut thzi iT-. Phn tG nD0 ;hjng h0et ung *Y &x ta u 3 tr_ng vi
ta u 3 &wa &hsn Di ph!n f@a*'%1'vati0ng. SJ! -ut phn tG &x ta u 3
@ng vi @a*'%1'vati0n+ nx R& &0i 1D ;hjng h0et ung vD v thJ+ phn tG
nD3 ;hjng (i &h!3Tn. >an !+ t]t &W &C& phn tG n& "! ;hjng h0et
ung.
rct hE phn tG nD3 -ut thzi gian ng^n *a! ;hi ;hyi ung+ ;hi nD3+
&x -ut vDi phn tG h0et ung+ *Q &dn 1ei th &ha. /\i 1n !p(at'Datafg
R& gi+ tiJn trnh h0et Wnh *Y th! thp thjng tin 1iIn !an v" Qi tRng
hnh h& T &p nht. TrIn (dng - + tha- *Q )'0-'tr3 R& cp ;iT!
thDnh )'0-'tr3#rra3. TrIn (dng - + -ut tha- &hiJ! Jn (Z 1iE! ta
u nh R& 1]3 ra. Ddng th! thp *Q 1Rng nh.
Ch H rng+ ang (bng nD3 &x thT &he3 hiE! !W hn @ng &C&h tvnh
t0Cn &C& thjng tin nD3 -ut 1n ri 1! trZ nx tr0ng &C& trzng &wa Qi
tRng. T!3 nhiIn+ hiE! !W et R& &ng &h hen &hJ vD 1D- &h0 0en
- ;hjng *G (bng 1ei R&. Lp )'0-'tr3 nD3 &x thT R& *G (bng &h0
Di ph!n vi &C& ;v&h th& ;hC& nha!.
ihi &x nhZng @& &h!n @U thv&h hRp+ phng tha& !p(at'Datafg ,ct
-\i phn tG tei -ut thzi iT- nD0 x tr0ng vdng 1p . Xi -\i phn tG
h0et ung f,C& Unh @ng &C&h *0 *Cnh ta u 3 &wa nx vi
@a*'%1'vati0ng+ &hng trnh *Y tvnh t0Cn &h!3Tn ung &0ng (eng para@01
&wa nx. Ta u nh ! tiIn &wa -ut phn tG R& gCn &C& giC trU thv&h
hRp T -j hnh &h!3Tn ung+ *a! x+ ta u & &wa nh tha nh]t *Y R&
gCn &h0 nh tha hai.
Cs! 1Enh i6 trIn (dng ;iT- tra ,'- phn tG vRt !a
@a*'%1'vati0n ha3 &ha. SJ! i"! ;iEn nD3 tha -n+ phn tG x *Y
ngtng h0et ung @yi &hng trnh &p nht giC trU ta u &W hai nh &wa
nx v" giC trU @an !+ giC trU ,C& Unh phn tG ;hjng h0et ung.
httpBOOtai1i'!ha3.&0-
9::
Lp trnh ha trn Java 2D v 3D
/ut phn &C& phn tG ;hjng h0et ung+ phn '1*' &wa i"! ;iEn trIn (dng
+ R& ng! nhiIn ;hyi te0 @yi i"! ;iEn trIn (dng . Tr0ng vv (b nD3+
-ut 1Rng tr!ng @nh ;h0Wng 20 &C& phn tG ;hjng h0et ung *Y R&
;hyi te0.
public class Vaterxpdater implements
%eometr,xpdater Q
$andom random'
public 'ater(pdater(& Q
random = new $andom(&'
2
public void update)ata(%eometr, geometr,&
Q
%eometr,/rra, geometr,/rra, =
(%eometr,/rra,& geometr,'
floatKL coords =
geometr,/rra,.getCoord$efd*oat(&'
int # =
geometr,/rra,.getza*idzertexCount(&'
int i'
for (i = +' i Z #' i k= (& Q // for
each partic*e
if (coordsKi ] f k OL q
base!*e.ation& Q // update acti.e
httpBOOtai1i'!ha3.&0-
9:<
Lp trnh ha trn Java 2D v 3D
// partic*es
coordsKi ] f k +L k=
coordsKi ] f k +L X coordsKi ] f k fL' // xO
coordsKi ] f k OL k=
coordsKi ] f k OL X coordsKi ] f k sL
X +.+Of' // ,O
coordsKi ] f k (L k=
coordsKi ] f k (L X coordsKi ] f k 5L' // zO
coordsKi ] f k fL =
(coordsKi ] f k +L k coordsKi ] f k fL& / (' //
x(
coordsKi ] f k sL =
(coordsKi ] f k OL k coordsKi ] f k sL k +.+Of& /
('// ,(
coordsKi ] f k 5L =
(coordsKi ] f k (L k coordsKi ] f k 5L& / (' //
z(
if (coordsKi ] f k OL Z
base!*e.ation& Q // if partic*e
// be*ow base
coordsKi ] f k +L =
+.+f' // xO
coordsKi ] f k OL =
base!*e.ation' // ,O
coordsKi ] f k (L =
+.+f' // zO
httpBOOtai1i'!ha3.&0-
9:=
Lp trnh ha trn Java 2D v 3D
coordsKi ] f k fL =
+.+f' // x(
coordsKi ] f k sL =
base!*e.ation' // ,(
coordsKi ] f k 5L =
+.+f' // z(
2
2 else Q // an inacti.e partic*e
if (random.nextd*oat(& q
+.Y& Q // random*, start a drop
coordsKi ] f k +L =
+.+ff ] (random.nextd*oat(& X +.5f&' // xO
coordsKi ] f k OL =
+.Osf ] random.nextd*oat(&
k
base!*e.ation' // ,O
coordsKi ] f k (L =
+.+ff ] (random.nextd*oat(& X +.5f&' // zO
2 // end if
2 // end ifXe*se
2 // end for *oop
2
2
Cut n& tr0ng h0et Wnh trjng *Y p hn nJ! &C& 0en thng @iT!
(ikn -\i phn tG 10ei @ R& rVng &a. XiE& nD3 &x thT th`& hiEn R&
@ng &C&h thI- Qi tRng Lin'#ttri@!t'* vi
*'tLin'#ntia1ia*'(%na@1'ftr!'g vD0 thDnh phn #pp'aran&' &wa phn tG
n&. T!3 nhiIn+ 1! H rng+ viE& 1D- nD3 &x thT phWi trW giC @yi tQ& u
,G 1H h0et Wnh.
httpBOOtai1i'!ha3.&0-
9:9
Lp trnh ha trn Java 2D v 3D
httpBOOtai1i'!ha3.&0-
9<0
Lp trnh ha trn Java 2D v 3D
Ti iPu tha" khJo
Tr0ng !C trnh 1D- &!Qn t!t0ria1 v" 1p trnh ha tr0ng Java 2D
5D &hng '- &x tha- ;hW0 &C& tDi 1iE! *a!B
1. 21i(' @Di giWng ih th!t ha vD hiEn th`& Wo &wa Th2.L[ TVn
7Yn$.
2. Th' Java T!t0ria1+ 2n( X01!-'. #vai1a@1' 0n1in' atB
httpBOONava.*!n.&0-O(0&*O@00;*Ot!t0ria1O2(Oin(',.ht-1
5. Th' 2D T',t T!t0ria1. #vai1a@1' 0n1in' 6r0- th' Java D'v'10p'r
C0nn'&ti0nB
httpBOO('v'10p'r.Nava.*!n.&0-O('v'10p'rO0n1in'TrainingO)raphi&*O2
DT',tO
5. Th' Java 2D 2a-p1' Pr0gra-*. #vai1a@1' 0n1in' atB
httpBOONava.*!n.&0-Opr0(!&t*ONavaP-'(iaO2DO*a-p1'*Oin(',.ht-1
7. Th' Java 2D D'-0. #vai1a@1' 6r0- th' Java 2D ?'@*it'B
httpBOONava.*!n.&0-Opr0(!&t*ONavaP-'(iaO2DOin(',.ht-1
9. Th' Java 5D (0&!-'nt atB
httpBOONava.*!n.&0-O('v'10p'rO0n1in'TrainingONava5(O
httpBOOtai1i'!ha3.&0-
9<1

You might also like