Programiranje

Uvod v Java 2D

API Java 2D je osnovni API platforme Java 1.2 (glejte Vire za različne informacije o API-ju in njegovih izvedbah). Implementacije API-ja so na voljo kot del Java Foundation Classes (JFC) v trenutnih beta izdajah Sun JDK za Windows NT / 95 in Solaris. Ko bo Java 1.2 dokončana, bi morala biti Java 2D na voljo na več platformah.

Upoštevajte, da čeprav je bila Java 2D razvita nekoliko neodvisno od drugih delov JFC, je kljub temu osrednji del 1.2 AWT. Razlikovali bomo in opozorili na značilnosti, značilne za 2D, za razpravo, vendar ne pozabite, da je ta funkcija enako pomembna za grafiko 1.2 kot stara podpora 1.0 in 1.1 AWT.

Java 2D razširja prejšnje mehanizme AWT za risanje 2D grafike, manipuliranje z besedilom in pisavami, nalaganje in uporabo slik ter definiranje in obravnavanje barv in barvnih prostorov. Te nove mehanizme bomo raziskovali v tej in prihodnjih kolumnah.

Opomba o nomenklaturi in konvencijah

V tem stolpcu bo moja primarna razvojna platforma osebni računalnik z operacijskim sistemom Windows 95 ali Windows NT. Upam, da bom ponudil druge nasvete in trike za platformo, kjer je to mogoče, vendar se bom osredotočil na Windows, saj bom tam preživel večino svojega časa.

Ko pišem ime metode, mora biti vedno v obliki methodname (). Zaključni oklepaji naj bi to ločili kot metodo. Metoda lahko upošteva ali ne parametre. V praksi mora to vedno jasno povedati kontekst.

Navedene bodo navedbe izvornih kod z vključenimi številkami vrstic. Številke vrstic nameravam uporabiti za navzkrižno sklicevanje na besedilo članka in šifrante, kot je primerno. To bi vam moralo tudi olajšati označevanje stolpca, če bi se odločili za tiskanje kopije. Upoštevajte pa, da bodo izvorne datoteke, povezane s stolpcem, običajne datoteke * .java (brez številk vrstic), da jih boste lahko prenašali in razvijali z njimi.

Ker bom v prihodnjih mesecih pisal o številnih API-jih za medije in komunikacije, se želim prepričati, da je celotna vzorčna koda smiselna kot celota, pa tudi v posameznih delih. Poskušal bom dosledno poimenovati svoje primere in jih umestiti v čutne pakete.

Vrh moje hierarhije paketov bo:

com.javaworld.media 

Vsak API ali tema, o kateri pišem, bo imel na tej najvišji ravni vsaj en podpaket. Na primer, vsa koda za ta članek 2D Java bo v:

com.javaworld.media.j2d 

Torej, če želite poklicati prvi primer aplikacije na Javi 2D, bi morali prenesti kodo, jo postaviti v svojo učilno pot in nato uporabiti:

java com.javaworld.media.j2d.Primer01 

(Če je imenski prostor predolg po vaših željah ali iz kakšnega drugega razloga želite uporabiti primer kode, ne da bi morali uporabiti popolnoma kvalificirano ime, preprosto komentirajte vrstico paketa na začetku vsake datoteke z izvorno kodo.)

Ustvaril bom datoteko Java Archive (jar) za primere kode in datotek razreda. Ta arhiv bo na voljo v virih vsakega stolpca, če ga želite prenesti in uporabiti primere v arhivu.

Hranil bom tudi posodobljeno datoteko jar, ki vsebuje vso kodo in razrede iz moje trenutne in prejšnje Programiranje medijev stolpci. Ta obsežna datoteka jar bo na voljo na mojem osebnem spletnem mestu.

Še zadnja točka primerov: Vsak primer sem izbral samostojno aplikacijo ali programček, razen če posebej ne omenim drugače. To bo občasno privedlo do ponovitve kode, vendar menim, da najbolje ohranja celovitost vsakega posameznega primera.

Dovolj o konvencijah. Začnimo s programiranjem z Java 2D!

Graphics2D: boljši razred grafike

Osrednji razred v Java 2D API je java.awt.Graphics2D abstraktni razred, kateri podrazredi java.awt.Graphics razširiti funkcijo upodabljanja 2D. Grafika2D dodaja bolj enotno podporo za manipulacije z različnimi oblikami, tako da je besedilo, črte in vse druge vrste dvodimenzionalnih oblik primerljivo po svojih zmožnostih in uporabnosti.

Začnimo s preprostim primerom, ki prikazuje, kako dobite in uporabite a Grafika2d sklic.

001 paket com.javaworld.media.j2d; 002 003 import java.awt. *; 004 uvoz java.awt.event. *; 005 006 javni razred Example01 razširja okvir {007 / ** 008 * Instancira primer Example01. 009 ** / 010 javna statična void main (String args []) {011 new Example01 (); 012} 013 014 / ** 015 * Naš konstruktor Example01 nastavi velikost okvira, doda vizualne komponente 016 * in jih nato naredi uporabniku vidne. 017 * Uporablja razred vmesnika za obravnavo uporabnika, ki zapre okvir 018 *. 019 ** / 020 public Example01 () {021 // Naslov našega okvira. 022 super ("Java 2D Primer01"); 023 024 // Nastavite velikost okvirja. 025 setSize (400.300); 026 027 // Vklopiti moramo vidnost našega okvirja 028 // tako, da nastavimo parameter Visible na true. 029 setVisible (true); 030 031 // Zdaj želimo biti prepričani, da pravilno razpolagamo z viri 032 // ta okvir uporablja, ko je okno zaprto. Za to uporabljamo 033 // anonimni vmesnik notranjega razreda. 034 addWindowListener (new WindowAdapter () 035 {public void windowClosing (WindowEvent e) 036 {dispose (); System.exit (0);} 037} 038); 039} 040 041 / ** 042 * Način barvanja zagotavlja pravo čarobnost. Tu smo 043 * oddali objekt Graphics na Graphics2D, da ponazorimo 044 *, da lahko s 045 * Graphics2D uporabljamo iste stare grafične zmožnosti, kot smo jih vajeni z Graphics. 046 ** / 047 public void paint (Graphics g) {048 // Tukaj je opisano, kako smo risali kvadrat s širino 049 // 200, višino 200 in začenši pri x = 50, y = 50. 050 g.setColor (Color.red); 051 g.drawRect (50,50,200,200); 052 053 // Barvo nastavimo na modro in nato z objektom Graphics2D 054 // narišemo pravokotnik, odmaknjen od kvadrata. 055 // Do zdaj nismo naredili ničesar z Graphics2D, česar 056 // ne bi mogli tudi z Graphics. (Pravzaprav uporabljamo 057 // z uporabo Graphics2D metod, podedovanih od Graphics.) 058 Graphics2D g2d = (Graphics2D) g; 059 g2d.setColor (Color.blue); 060 g2d.drawRect (75,75.300.200); 061} 062} 

Ko zaženete Example01, bi morali videti rdeč kvadrat in modri pravokotnik, kot je prikazano na spodnji sliki. Upoštevajte, da je znana težava z zmogljivostjo različice JDK 1.2 Beta 3 za Windows NT / 95 (najnovejša izdaja 1.2 v tem stolpcu). Če je ta primer v vašem sistemu boleče počasen, boste morda morali odpraviti napako, kot je dokumentirano v JavaWorldNasvet Java 55 (glejte spodnje vire za ta nasvet).

Upoštevajte, da tako kot ne naredite primerka neposredno Grafika predmeta, ne ustvarite primerka Grafika2D objekt. Namesto tega izvajalno okolje Java izdela objekt upodabljanja in ga posreduje barva () (vrstica 047 v seznamu kod Primer01) in na platformah Java 1.2 in pozneje ta objekt izvaja Grafika2D abstraktni tečaj.

Zaenkrat z našimi 2D grafičnimi zmogljivostmi nismo naredili ničesar posebnega. Na koncu prejšnjih primerov dodajte nekaj kode barva () in vključite več funkcij, novih za Java 2D (Primer02):

001 / ** 002 * Tu uporabljamo nove funkcije Java 2D API, kot so affine 003 * transformacije in Shape predmeti (v tem primeru generični 004 *, GeneralPath). 005 ** / 006 javna void paint (Graphics g) {007 g.setColor (Color.red); 008 g.drawRect (50,50,200,200); 009 010 Graphics2D g2d = (Graphics2D) g; 011 g2d.setColor (Color.blue); 012 g2d.drawRect (75,75,300,200); 013 014 // Zdaj narišimo še en pravokotnik, tokrat pa 015 // s pomočjo GeneralPath, da ga določimo po odsekih. 016 // Poleg tega bomo ta pravokotnik 017 // prevedli in zasukali glede na prostor naprave (in s tem na 018 // prva dva štirikotnika) z uporabo AffineTransform. 019 // Spremenili bomo tudi njegovo barvo. 020 Pot splošne poti = nova splošna pot (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.transform (at); 030 at.setToTranslation (50.0f, 200.0f); 031 g2d.transform (at); 032 033 g2d.setColor (Color.green); 034 g2d.fill (pot); 035} 

Upoštevajte, da od GeneralPath se nahaja v java.awt.geom paket, moramo biti prepričani, da dodamo tudi uvozno vrstico:

uvoz java.awt.geom. *; 

Rezultat primera 02 je prikazan na naslednji sliki.

Java 2D omogoča določanje poljubnih oblik z uporabo java.awt.Shape vmesnik. Ta vmesnik izvajajo številne privzete oblike, kot so pravokotniki, poligoni, 2D črte itd. Eden najzanimivejših med njimi v smislu prilagodljivosti je java.awt.geom.GeneralPath.

GeneralPathvam omogočajo opis poti s poljubnim številom robov in potencialno izjemno zapleteno obliko. V Primeru 02 smo ustvarili pravokotnik (vrstice 020-025), prav tako pa bi lahko dodali še eno stran ali stranice, da naredimo peterokotnik, sedmerokotnik ali kakšen drug večstranski mnogokotnik. Upoštevajte tudi, da za razliko od standardnih Grafika koda, Java 2D nam omogoča, da določimo koordinate z uporabo števil s plavajočo vejico namesto celih števil. CAD prodajalci po vsem svetu, veselite se! Dejansko Java 2D podpira celo število, dvojno, in plavajoče marsikje aritmetika.

Verjetno ste tudi opazili, da ko smo ustvarili pot, smo podali parameter, GeneralPath.EVEN_ODD, v konstruktor (vrstica 020). Ta parameter predstavlja pravilo navijanja ki upodabljalniku pove, kako določiti notranjost oblike, ki jo določa naša pot. Za več informacij o pravilih navijanja Java 2D glejte dokumentacijo Java 2D javadoc, ki je navedena v virih.

Druga pomembna novost v Primeru 02 se nanaša na uporabo a java.awt.geom.AffineTransforms (vrstice 027-031). Podrobnosti takšnih preobrazb bom prepustil bralcu (glejte Vire za članke, ki podrobneje razpravljajo o tem), vendar zadostuje, če povemo, da AffineTransforms vam omogočajo, da upravljate katero koli grafiko Java 2D, da jo prevedete (premaknete), zasukate, prilagodite, strižete ali izvedete kombinacije teh manipulacij.

Ključ do AffineTransform leži v konceptu Prostor naprave in Uporabniški prostor. Device Space je tisto področje, v katerega se bo grafika upodabljala na zaslonu. To je analogno koordinatam, ki se uporabljajo pri ustvarjanju običajnega sloga AWT Grafika2D grafika. Uporabniški prostor pa je prevedljiv, vrtljiv koordinatni sistem, ki ga lahko upravlja eden ali več AffineTransforms.

Prostor naprav in koordinatni prostor uporabniškega prostora se na začetku prekrivata, z začetkom v zgornjem levem delu površine upodabljanja (tukaj okvir). Pozitivna os x se premika desno od začetka, pozitivna os y pa navzdol.

Po prvi preobrazbi v Primeru 02 (vrstici 028 in 029) je bil koordinatni sistem User Space zasučen za 22,5 stopinj v nasprotni smeri urnega kazalca glede na Device Space. Oba imata še vedno isti izvor. (Upoštevajte, da so rotacije določene v radianih, pri čemer je -PI / 8 radianov enako -22,5 stopinj ali 22,5 stopinj CCW.) Če bi se tukaj ustavili in narisali pravokotnik, bi bil zasukan večinoma izven našega vidnega polja v aplikacijo Okvir.

Nato po končani rotaciji uporabimo drugo preobrazbo (vrstici 030 in 031), ta pa prevod. To premakne koordinatni sistem User Space glede na Device Space, ga premakne za 200,0 (float) in desno za 50,0 (float) enot.

Ko izpolnimo zeleni pravokotnik, se prevede in zasuka glede na prostor naprave.

Bezierjevih in višje urejenih krivulj

Zdaj, ko smo preučili, kako lahko s transformacijami manipuliramo z grafičnimi predmeti, ponovno preučimo, kako gradimo zapletene in zanimive poljubne oblike.

Krivulje se v matematiki in računalniški grafiki uporabljajo za približevanje kompleksnih oblik z uporabo končnega, natančno določenega (in v idealnem primeru majhnega) števila matematičnih točk. Medtem ko standardni AWT v preteklosti ni neposredno podpiral risanja s poljubnimi krivuljami (platforme Java 1.0 ali 1.1), Java 2D doda vgrajeno podporo za krivulje prvega, drugega in tretjega reda. Krivulje lahko narišete z dvema končne točke in nič, ena ali dve kontrolne točke. Java 2D izračuna krivulje prvega in drugega reda z uporabo linearnih in kvadratnih formul ter kubične ali tretje vrstne krivulje z uporabo Bezierjevih krivulj.

(Bezierjeve krivulje so vrsta parametrične polinomske krivulje, ki ima nekaj zelo zaželenih lastnosti, povezanih z izračunavanjem zaprtih krivulj in površin. Uporabljajo se v številnih grafičnih aplikacijah. Za več informacij o uporabi parametričnih polinoma in Bezierjevih krivuljah glejte vire v računalniški grafiki.) GeneralPath metode, ki narišejo vsako od teh krivulj, so:

  • lineTo () za ravne odseke (navedite samo končne točke)
  • quadTo () za kvadratne krivulje (navedite eno kontrolno točko)
  • krivulja () za tretje urejene krivulje (navedite dve kontrolni točki, narisani s kubično Bezierjevo krivuljo)
$config[zx-auto] not found$config[zx-overlay] not found