Programmēšana

Darba sākšana ar Java 2D

Java 2D API ir galvenā Java 1.2 platformas API (dažādas informācijas par API un tās ieviešanu skatiet sadaļā Resursi). API ieviešana ir pieejama kā daļa no Java Foundation Classes (JFC) pašreizējās Sun JDK beta versijās Windows NT / 95 un Solaris. Kad Java 1.2 ir pabeigts, Java 2D vajadzētu kļūt pieejamam vairākām platformām.

Jāņem vērā, ka, lai gan Java 2D ir izstrādāts nedaudz neatkarīgi no citām JFC daļām, tomēr tā ir 1.2 AWT galvenā daļa. Mēs diskutēsim par atšķirību un norādīsim uz 2D raksturīgajām funkcijām, taču jums jāatceras, ka šī funkcionalitāte ir tikpat svarīga 1.2 grafikai kā vecais 1.0 un 1.1 AWT atbalsts.

Java 2D paplašina iepriekšējos AWT mehānismus 2D grafikas zīmēšanai, teksta un fontu manipulēšanai, attēlu ielādēšanai un izmantošanai, kā arī krāsu un krāsu telpu noteikšanai un apstrādei. Mēs izpētīsim šos jaunos mehānismus šajā un turpmākajās slejās.

Piezīme par nomenklatūru un konvencijām

Šajā slejā mana galvenā izstrādes platforma būs dators, kurā darbojas sistēma Windows 95 vai Windows NT. Es ceru sniegt citus platformai raksturīgus padomus un ieteikumus, ja iespējams, bet es koncentrēšos uz Windows, jo tur es pavadīšu lielāko daļu sava laika.

Kad es rakstu metodes nosaukumu, tam vienmēr jābūt formas metodes nosaukums (). Aiz tā iekavas ir domātas, lai to atšķirtu kā metodi. Metode var ņemt parametrus vai ne. Praksē tas vienmēr jāpadara skaidrs kontekstā.

Pirmkodu saraksti tiks norādīti, iekļaujot rindu numurus. Es plānoju izmantot rindu numurus, lai pēc iespējas atsauces uz rakstu tekstu un kodu sarakstiem. Tam vajadzētu arī ievērojami atvieglot kolonnas anotēšanu, ja izvēlētos drukāt kopiju. Lūdzu, ņemiet vērā, ka avota faili, kas saistīti ar kolonnu, būs regulāri * .java faili (bez rindas numuriem), lai jūs varētu tos lejupielādēt un attīstīt.

Tā kā tuvākajos mēnešos es rakstīšu par daudzām multivides un komunikācijas saskarnēm, es vēlos pārliecināties, ka visam koda paraugam ir jēga kopumā, kā arī atsevišķās tā daļās. Es centīšos konsekventi nosaukt savus piemērus un ievietot tos sensu paketēs.

Manas paketes hierarhijas augšdaļa būs:

com.javaworld.media 

Katrā API vai tēmā, par kuru es rakstu, šajā augšējā līmenī būs vismaz viena apakšpakete. Piemēram, viss šī Java 2D raksta kods būs:

com.javaworld.media.j2d 

Tātad, lai izsauktu pirmo lietojumprogrammas piemēru Java 2D, lejupielādējiet kodu, ievietojiet to savā klases ceļā un pēc tam izmantojiet:

java com.javaworld.media.j2d.Piemērs01 

(Ja nosaukumvieta ir pārāk gara jūsu gaumei vai kāda cita iemesla dēļ vēlaties izmantot koda piemēru, neizmantojot pilnībā kvalificētu nosaukumu, vienkārši komentējiet pakotnes rindiņu katra avota koda faila sākumā.)

Es ģenerēšu Java arhīva (burkas) failu katram raksta koda paraugam un klases failiem. Šis arhīvs būs pieejams katras slejas resursos, ja vēlaties to lejupielādēt un izpildīt piemērus no arhīva.

Es glabāju arī atjauninātu burku failu, kurā ir viss pašreizējā un iepriekšējā kods un klases Mediju programmēšana kolonnas. Šis visaptverošais burkas fails būs pieejams manā personīgajā vietnē.

Pēdējais punkts par piemēriem: Es izvēlējos katru piemēru izveidot atsevišķu lietojumprogrammu vai sīklietotni, ja vien īpaši nenorādu citādi. Tas laiku pa laikam izraisīs zināmu koda atkārtošanos, taču es uzskatu, ka tas vislabāk saglabā katra atsevišķā piemēra integritāti.

Pietiekami daudz par konvencijām. Sāksim programmēt ar Java 2D!

Graphics2D: labāka grafikas klase

Java 2D API centrālā klase ir java.awt.Grafika2D abstraktā klase, kurā apakšklases java.awt.Grafika lai paplašinātu 2D renderēšanas funkcionalitāti. Grafika2D pievieno vienveidīgāku atbalstu dažādu formu manipulācijām, faktiski padarot tekstu, līnijas un visu citu divdimensiju formas salīdzināmas pēc to iespējām un lietderības.

Sāksim ar vienkāršu piemēru, parādot, kā jūs iegūstat un izmantojat Grafika2d atsauce.

001 pakete com.javaworld.media.j2d; 002 003 importēt java.awt. *; 004 importēt java.awt.event. *; 005 006 publiskā klase Example01 paplašina rāmi {007 / ** 008 * Instantē objekta Example01. 009 ** / 010 public static void main (String args []) {011 new Example01 (); 012} 013 014 / ** 015 * Mūsu konstruktors Example01 iestata rāmja izmēru, pievieno 016 * vizuālos komponentus un pēc tam padara tos redzamus lietotājam. 017 * Tas izmanto adaptera klasi, lai risinātu lietotāja aizvērto rāmi 018 *. 019 ** / 020 public Example01 () {021 // Nosaukiet mūsu ietvara nosaukumu. 022 super ("Java 2D piemērs01"); 023 024 // Iestatiet rāmja izmēru. 025 setSize (400,300); 026 027 // Mums jāieslēdz mūsu rāmja 028 // redzamība, iestatot parametru Visible uz true. 029 setVisible (patiess); 030 031 // Tagad mēs vēlamies būt pārliecināti, vai pareizi iznīcinām resursus 032 //, kurus šis rāmis izmanto, kad logs ir aizvērts. Tam izmantojam 033 // anonīmu iekšējās klases adapteri. 034 addWindowListener (new WindowAdapter () 035 {public void windowClosing (WindowEvent e) 036 {utilize (); System.exit (0);} 037} 038); 039} 040 041 / ** 042 * Krāsas metode nodrošina īstu burvību. Šeit mēs 043 * nododam Graphics objektu Graphics2D, lai ilustrētu 044 *, ka mēs varam izmantot tās pašas vecās grafikas iespējas ar 045 * Graphics2D, kuras esam pieraduši izmantot ar Graphics. 046 ** / 047 public void paint (grafika g) {048 // Lūk, kā mēs kādreiz zīmējām kvadrātu ar platumu 049 // no 200, augstumu 200 un sākot ar x = 50, y = 50. 050 g.setColor (krāsa. Sarkana); 051 g.drawRect (50,50,200,200); 052 053 // Iestatīsim krāsu uz zilu un pēc tam izmantosim objektu Graphics2D 054 //, lai uzzīmētu taisnstūri, kas nobīdīts no kvadrāta. 055 // Līdz šim mēs neko neesam darījuši, izmantojot Graphics2D, ka 056 // mēs nevarētu darīt arī, izmantojot Graphics. (Mēs faktiski esam 057 //, izmantojot Graphics2D metodes, kas mantotas no Graphics.) 058 Graphics2D g2d = (Graphics2D) g; 059 g2d.setColor (Color.blue); 060 g2d.drawRect (75,75,300,200); 061} 062} 

Izpildot01. piemēru, jums vajadzētu redzēt sarkanu kvadrātu un zilu taisnstūri, kā parādīts attēlā zemāk. Ņemiet vērā, ka ir zināma JDK 1.2 Beta 3 Windows NT / 95 versijas veiktspējas problēma (jaunākā 1.2 laidiena versija šajā slejā). Ja šis piemērs ir sāpīgi lēns jūsu sistēmā, jums, iespējams, būs jāizvairās no kļūdas novēršanas, kā tas ir dokumentēts JavaWorldJava padoms 55 (skatiet šī padoma resursus zemāk).

Ņemiet vērā, ka tāpat kā jūs tieši nepaziņojat a Grafika objektu, jums nav instantiate a Grafika2D vai nu objekts. Drīzāk Java izpildlaiks konstruē renderēšanas objektu un nodod to krāsot () (047. rindiņa Code01 kodu sarakstā) un Java 1.2 platformās un ārpus tām šis objekts ievieš Grafika2D arī abstraktā klase.

Līdz šim mēs neesam darījuši neko īpaši īpašu ar mūsu 2D grafikas iespējām. Pievienosim kādu kodu mūsu iepriekšējo piemēru beigās krāsot () metodi un ieviesiet vairākas jaunas funkcijas Java 2D (piemērs02):

001 / ** 002 * Šeit mēs izmantojam jaunas Java 2D API funkcijas, piemēram, affine 003 * transformācijas un Shape objektus (šajā gadījumā vispārīgu 004 * one, GeneralPath). 005 ** / 006 public void paint (grafika g) {007 g.setColor (Color.red); 008 g.drawRect (50,50,200,200); 009 010 Grafika2D g2d = (Grafika2D) g; 011 g2d.setColor (Krāsa.zils); 012 g2d.drawRect (75,75,300,200); 013 014 // Tagad uzzīmēsim vēl vienu taisnstūri, bet šoreiz izmantosim 015 //, lai norādītu segmentu pēc segmenta, izmantojot GeneralPath. 016 // Turklāt mēs pārtulkosim un pagriezīsim šo 017 // taisnstūri attiecībā pret ierīces telpu (un līdz ar to uz 018 // pirmajiem diviem četrstūriem), izmantojot AffineTransform. 019 // Mēs arī mainīsim tā krāsu. 020 GeneralPath path = jauns GeneralPath (GeneralPath.EVEN_ODD); 021 path.moveTo (0.0f, 0.0f); 022 path.lineTo (0,0f, 125,0f); 023 path.lineTo (225.0f, 125.0f); 024 path.lineTo (225.0f, 0.0f); 025 path.closePath (); 026 027 AffineTransform at = new AffineTransform (); 028 at.setToRotation (-Math.PI / 8.0); 029 g2d. Pārveidot (at); 030 at.setToTranslation (50,0f, 200,0f); 031 g2d. Pārveidot (at); 032 033 g2d.setColor (Color.green); 034 g2d.fill (ceļš); 035} 

Ņemiet vērā, ka kopš GeneralPath atrodas java.awt.geom pakete, mums jābūt pārliecinātiem, ka pievienojam arī importēšanas līniju:

importēt java.awt.geom. *; 

Piemērs02 izeja ir parādīta nākamajā attēlā.

Java 2D ļauj precizēt patvaļīgas formas, izmantojot java.awt. Forma interfeiss. Šo saskarni īsteno dažādas noklusējuma formas, piemēram, taisnstūri, daudzstūri, 2D līnijas utt. Viens no interesantākajiem no tiem elastības ziņā ir java.awt.geom.GeneralPath.

GeneralPaths ļauj aprakstīt ceļu ar patvaļīgu malu skaitu un potenciāli ārkārtīgi sarežģītu formu. 02. piemērā mēs esam izveidojuši taisnstūri (020. – 025. Rinda), taču tikpat viegli mēs būtu varējuši pievienot vēl vienu vai vairākas malas, lai izveidotu piecstūri, septiņstūri vai kādu citu daudzpusīgu daudzstūri. Ņemiet vērā arī to, ka atšķirībā no standarta Grafika kods, Java 2D ļauj mums norādīt koordinātas, izmantojot veselu skaitļu vietā peldošā komata skaitļus. Pasaules CAD pārdevēji, priecājieties! Faktiski Java 2D atbalsta vesels skaitlis, dubultā, un peldošs aritmētika daudzās vietās.

Jūs droši vien arī pamanījāt, ka, izveidojot ceļu, mēs izturējām parametru, GeneralPath.EVEN_ODD, konstruktorā (020. līnija). Šis parametrs apzīmē a tinumu likums tas rendererim stāsta, kā noteikt formas ceļu, ko nosaka mūsu ceļš, iekšpusi. Lūdzu, skatiet Java 2D javadoc dokumentāciju, uz kuru ir atsauce resursos, lai uzzinātu vairāk par Java 2D likvidācijas noteikumiem.

Otrs lielākais jaunievedums 02. piemērā ir saistīts ar a izmantošanu java.awt.geom.AffineTransforms (līnijas 027-031). Šādu pārveidojumu specifiku es atstāšu lasītāja ziņā (skat. Rakstus, kas to sīkāk aplūko, pieejamos resursus), taču pietiek ar to, lai pateiktu, ka AffineTransforms ļauj jums darboties ar jebkuru Java 2D grafiku, lai to tulkotu (pārvietotu), pagrieztu, mērogotu, cirptu vai veiktu šo manipulāciju kombinācijas.

Galvenais AffineTransform slēpjas jēdzienā Ierīces telpa un Lietotāja telpa. Ierīces telpa ir apgabals, kurā grafika tiks attēlota ekrānā. Tas ir analogs koordinātām, kas tiek izmantotas, kad tiek izveidots regulārs AWT stils Grafika2D grafikas pamatā. Lietotāja telpa tomēr ir tulkojama, pagriežama koordinātu sistēma, kuru var darbināt viens vai vairāki AffineTransforms.

Ierīces telpa un Lietotāja telpa koordinātu sistēmas sākotnēji pārklājas, un izcelsme renderēšanas virsmas augšējā kreisajā stūrī (šeit - rāmis). Pozitīvā x ass virzās tieši no sākuma, bet pozitīvā y ass virzās uz leju.

Pēc pirmās transformācijas 02. piemērā (028. un 029. rinda) lietotāja telpas koordinātu sistēma ir pagriezta par 22,5 grādiem pretēji pulksteņrādītāja virzienam attiecībā pret ierīces telpu. Abiem joprojām ir viena un tā pati izcelsme. (Ņemiet vērā, ka rotācijas ir norādītas radiānos ar -PI / 8 radiāniem, kas vienādi ar -22,5 grādiem vai 22,5 grādiem pēc CCW.) Ja mēs šeit apstātos un uzzīmētu taisnstūri, tas lielākoties tiktu pagriezts ārpus mūsu redzes pieteikumu Rāmis.

Pēc tam, kad rotācija ir pabeigta, mēs pēc tam izmantojam otru transformāciju (030. un 031. rinda), šo tulkojumu. Tas pārvieto User Space koordinātu sistēmu attiecībā pret Device Space, novirzot to uz leju 200.0 (pludiņa) vienības un pa labi 50.0 (pludiņa) vienības.

Kad mēs aizpildām zaļo taisnstūri, tas tiek tulkots un pagriezts attiecībā pret ierīces telpu.

Bezjē un augstāk sakārtotas līknes

Tagad, kad mēs esam pārbaudījuši, kā transformācijas var izmantot, lai manipulētu ar grafiskajiem objektiem, vēlreiz pārbaudīsim, kā mēs veidojam sarežģītas un interesantas patvaļīgas formas.

Līknes tiek izmantotas visā matemātikā un datorgrafikā, lai tuvinātu sarežģītas formas, izmantojot ierobežotu, precīzi definētu (un ideāli mazu) matemātisko punktu skaitu. Tā kā standarta AWT agrāk tieši neatbalstīja zīmēšanu ar patvaļīgām līknēm (Java 1.0 vai 1.1 platformas), Java 2D pievieno iebūvētu atbalstu pirmās, otrās un trešās kārtas līknēm. Līknes var uzzīmēt ar diviem beigu punkti un nulle, viens vai divi kontroles punkti. Java 2D aprēķina pirmās un otrās kārtas līknes, izmantojot lineārās un kvadrātiskās formulas un kubiskās vai trešās kārtas līknes, izmantojot Bezjē līknes.

(Bezjē līknes ir parametru polinomu līknes veids, kam ir ļoti vēlamas īpašības, kas saistītas ar slēgtu līkņu un virsmu aprēķināšanu. Tos izmanto daudzās grafikas lietojumprogrammās. Lūdzu, skatiet resursus, lai iegūtu vairāk informācijas par parametru polinomu un Bezjē līkņu izmantošanu. datorgrafikā.) GeneralPath metodes, kas zīmē katru no šīm līknēm, ir:

  • lineTo () taisniem segmentiem (norādiet tikai gala punktus)
  • quadTo () kvadrātveida līknēm (norādiet vienu kontrolpunktu)
  • curveTo () trešās kārtas līknēm (norādiet divus kontrolpunktus, kas uzzīmēti, izmantojot kubisko Bezjē līkni)
$config[zx-auto] not found$config[zx-overlay] not found