Programovanie

Začíname s programom Java 2D

Java 2D API je základné API platformy Java 1.2 (rôzne informácie o API a jeho implementáciách nájdete v časti Zdroje). Implementácie API sú k dispozícii ako súčasť Java Foundation Classes (JFC) v aktuálnych beta vydaniach Sun JDK pre Windows NT / 95 a Solaris. Po dokončení Java 1.2 by mala byť Java 2D dostupná na viacerých platformách.

Všimnite si, že aj keď bola Java 2D vyvinutá trochu nezávisle od ostatných častí JFC, je stále kľúčovou súčasťou 1,2 AWT. Rozlišujeme a upozorňujeme na 2D-špecifické vlastnosti pre diskusiu, mali by ste však pamätať na to, že táto funkčnosť je rovnako dôležitá pre grafiku 1.2 ako stará podpora 1.0 a 1.1 AWT.

Java 2D rozširuje predchádzajúce mechanizmy AWT na kreslenie 2D grafiky, manipuláciu s textom a písmami, načítanie a používanie obrázkov a definovanie a narábanie s farbami a farebnými priestormi. Budeme skúmať tieto nové mechanizmy v tomto a budúcich stĺpcoch.

Poznámka o nomenklatúre a konvenciách

V tomto stĺpci bude mojou primárnou vývojovou platformou počítač so systémom Windows 95 alebo Windows NT. Dúfam, že poskytnem ďalšie tipy a triky špecifické pre jednotlivé platformy, kde je to možné, ale zameriam sa na Windows, pretože tam budem tráviť väčšinu času.

Keď píšem názov metódy, mal by mať vždy tvar nazov metody (). Koncové zátvorky slúžia na oddelenie tejto metódy. Metóda môže, ale nemusí mať parametre. V praxi by to mal kontext vždy objasniť.

Zoznamy zdrojových kódov budú uvedené s uvedením čísel riadkov. Mám v pláne použiť čísla riadkov na prípadné krížové odkazy na text článku a na zoznamy kódov. Toto by vám tiež malo výrazne uľahčiť anotáciu stĺpca, ak by ste sa rozhodli tlačiť kópiu. Nezabudnite však, že zdrojové súbory prepojené zo stĺpca budú bežné súbory * .java (čísla bez riadkov), aby ste ich mohli sťahovať a vyvíjať.

Pretože v nasledujúcich mesiacoch budem písať o mnohých mediálnych a komunikačných API, chcem sa ubezpečiť, že celý vzorový kód má zmysel ako celok, tak aj v jeho jednotlivých častiach. Pokúsim sa dôsledne pomenovať svoje príklady a umiestniť ich do zmyselných balíkov.

Vrchol mojej hierarchie balíkov bude:

com.javaworld.media 

Každé API alebo téma, o ktorej píšem, bude mať aspoň jeden podbalík pod touto najvyššou úrovňou. Napríklad celý kód pre tento článok v jazyku Java 2D bude v:

com.javaworld.media.j2d 

Ak chcete vyvolať prvú ukážkovú aplikáciu v prostredí Java 2D, stiahli by ste kód, umiestnili ho do svojej cesty triedy a potom použili:

java com.javaworld.media.j2d.Priklad01 

(Ak je priestor názvov príliš dlhý podľa vašich predstáv alebo z iného dôvodu chcete použiť ukážkový kód bez toho, aby ste museli používať úplne kvalifikovaný názov, jednoducho odkomentujte riadok balíka na začiatku každého súboru so zdrojovým kódom.)

Pre každý príkladový kód článku a súbory triedy vygenerujem súbor Java Archive (jar). Tento archív bude k dispozícii v zdrojoch každého stĺpca, ak si ho chcete stiahnuť a spustiť príklady z archívu.

Budem tiež uchovávať aktuálny súbor jar obsahujúci všetok kód a triedy z môjho súčasného a predchádzajúceho Programovanie médií stĺpce. Tento komplexný súbor jar bude k dispozícii na mojej osobnej webovej stránke.

Posledná poznámka k príkladom: Každý príklad som sa rozhodol vytvoriť, pokiaľ osobitne neuvádzam inak, samostatnú aplikáciu alebo applet. To povedie z času na čas k určitému opakovaniu kódu, ale myslím si, že to najlepšie zachová integritu každého jednotlivého príkladu.

Dosť bolo konvencií. Začnime programovať v prostredí Java 2D!

Graphics2D: Lepšia trieda grafiky

Centrálnou triedou v rámci Java 2D API je java.awt.Graphics2D abstraktná trieda, ktoré podtriedy java.awt.Grafika rozšíriť funkčnosť 2D vykresľovania. Graphics2D pridáva jednotnejšiu podporu pre manipuláciu s rôznymi tvarmi, vďaka čomu sú text, čiary a všetky druhy ďalších dvojrozmerných tvarov porovnateľné svojimi schopnosťami a užitočnosťou.

Začnime jednoduchým príkladom, ktorý ukazuje, ako získate a používate a Graphics2d odkaz.

Balíček 001 com.javaworld.media.j2d; 002 003 import java.awt. *; 004 import java.awt.event. *; 005 006 verejná trieda Example01 rozširuje rámec {007 / ** 008 * Vytvorí inštanciu objektu Example01. 009 ** / 010 public static void main (String args []) {011 nový Example01 (); 012} 013 014 / ** 015 * Náš konštruktor Example01 nastaví veľkosť rámu, pridá vizuálne komponenty 016 * a potom ich zviditeľní pre používateľa. 017 * Používa triedu adaptéra na riešenie toho, ako užívateľ zatvára rám 018 *. 019 ** / 020 public Example01 () {021 // Názov nášho rámca. 022 super („Java 2D Example01“); 023 024 // Nastavte veľkosť rámu. 025 setSize (400 300); 026 027 // Musíme zapnúť viditeľnosť nášho rámu 028 // nastavením parametra Viditeľný na hodnotu true. 029 setVisible (true); 030 031 // Teraz sa chceme uistiť, že správne disponujeme prostriedkami 032 // tento rámec používa, keď je okno zatvorené. Používame na to 033 // anonymný adaptér vnútornej triedy. 034 addWindowListener (nový WindowAdapter () 035 {public void windowClosing (WindowEvent e) 036 {dispose (); System.exit (0);} 037} 038); 039} 040 041 / ** 042 * Metóda maľovania poskytuje skutočné kúzlo. Tu 043 * vrháme objekt Graphics na Graphics2D, aby sme ilustrovali 044 *, že pri 045 * Graphics2D môžeme používať rovnaké staré grafické schopnosti, aké sme zvyknutí používať pri Graphics. 046 ** / 047 public void paint (Grafika g) {048 // Takto je možné nakresliť štvorec so šírkou 049 // 200, výškou 200 a začiatkom x = 50, y = 50. 050 g.setColor (farebný); 051 g.drawRect (50,50,200,200); 052 053 // Nastavíme farbu na modrú a potom pomocou objektu Graphics2D 054 // nakreslíme obdĺžnik, odsadený od štvorca. 055 // Doteraz sme pomocou Graphics2D neurobili nič, čo by sme 056 // nemohli robiť ani pomocou Graphics. (V skutočnosti 057 // používame metódy Graphics2D zdedené z Graphics.) 058 Graphics2D g2d = (Graphics2D) g; 059 g2d.setColor (farebná modrá); 060 g2d.drawRect (75,75,300,200); 061} 062} 

Keď spustíte Example01, mali by ste vidieť červený štvorec a modrý obdĺžnik, ako je to znázornené na obrázku nižšie. Všimnite si, že je známy problém s výkonom vo verzii JDK 1.2 Beta 3 pre Windows NT / 95 (najaktuálnejšie vydanie 1.2 z tohto stĺpca). Ak je tento príklad vo vašom systéme bolestivo pomalý, možno budete musieť chybu vyriešiť tak, ako je to zdokumentované v JavaWorldTip Java 55 (tento tip nájdete v nižšie uvedených zdrojoch).

Všimnite si, že rovnako ako priamo nevytvárate inštanciu a Grafika objekt, nevytvoríte inštanciu a Graphics2D objekt tiež. Modul runtime Java skôr skonštruuje vykresľovací objekt a odovzdá ho farba () (riadok 047 v zozname kódov Example01) a na platformách Java 1.2 a ďalších, tento objekt implementuje Graphics2D abstraktná trieda tiež.

Doteraz sme s našimi 2D grafickými schopnosťami neurobili nič zvláštne. Na koniec nášho predchádzajúceho príkladu pridáme nejaký kód farba () metóda a priniesť do Java 2D niekoľko nových funkcií (Example02):

001 / ** 002 * Tu používame nové funkcie rozhrania Java 2D API, ako sú afinné transformácie 003 * a objekty tvaru (v tomto prípade všeobecná 004 * jedna, GeneralPath). 005 ** / 006 public void paint (Grafika g) {007 g.setColor (Farba červená); 008 g.drawRect (50,50,200,200); 009 010 Graphics2D g2d = (Graphics2D) g; 011 g2d.setColor (farebná modrá); 012 g2d.drawRect (75,75,300,200); 013 014 // Teraz nakreslíme ďalší obdĺžnik, ale tentokrát ho použijeme na určenie cesty po segmente pomocou cesty GeneralPath. 016 // Ďalej ideme preložiť a otočiť tento obdĺžnik 017 // vzhľadom na priestor zariadenia (a teda na 018 // prvé dva štvoruholníky) pomocou nástroja AffineTransform. 019 // Tiež zmeníme jeho farbu. 020 Cesta GeneralPath = nová cesta GeneralPath (GeneralPath.EVEN_ODD); 021 cesta.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 = nový AffineTransform (); 028 at.setToRotation (-Math.PI / 8,0); 029 g2d. Transformácia (zavináč); 030 at.setToTranslation (50,0f, 200,0f); 031 g2d. Transformácia (zavináč); 032 033 g2d.setColor (farebná zelená); 034 g2d.fill (cesta); 035} 

Všimnite si, že od GeneralPath sa nachádza v java.awt.geom balíka, musíme si byť istí, že pridáme aj riadok na import:

import java.awt.geom. *; 

Výstup z príkladu 02 je zobrazený na nasledujúcom obrázku.

Java 2D umožňuje špecifikáciu ľubovoľných tvarov pomocou java.awt.Shape rozhranie. Toto rozhranie implementuje celý rad predvolených tvarov, ako sú obdĺžniky, polygóny, 2D čiary atď. Jedným z najzaujímavejších z hľadiska flexibility je java.awt.geom.GeneralPath.

GeneralPathvám umožní opísať cestu s ľubovoľným počtom hrán a potenciálne mimoriadne zložitým tvarom. V Príklade02 sme vytvorili obdĺžnik (čiary 020-025), ale rovnako ľahko by sme mohli pridať ďalšiu stranu alebo strany, aby sme vytvorili päťuholník, šesťuholník alebo iný mnohostranný polygón. Upozorňujeme tiež, že na rozdiel od štandardu Grafika kód, Java 2D nám umožňuje určiť celé súradnice pomocou čísel s pohyblivou rádovou čiarkou. Predajcovia CAD na svete, radujte sa! V skutočnosti Java 2D podporuje celé číslo, dvojitýa plávajúce aritmetika na mnohých miestach.

Pravdepodobne ste si tiež všimli, že keď sme vytvorili cestu, prešli sme parametrom, GeneralPath.EVEN_ODD, do konštruktora (riadok 020). Tento parameter predstavuje a navíjacie pravidlo ktorý hovorí vykresľovaču, ako určiť vnútro tvaru určeného našou cestou. Viac informácií o pravidlách navíjania Java 2D nájdete v dokumentácii Java 2D javadoc, na ktorú sa odkazuje v sekcii Zdroje.

Ďalšia veľká inovácia v príklade 02 sa točí okolo použitia a java.awt.geom.AffineTransforms (linky 027-031). Špecifiká takýchto transformácií prenechám čitateľovi (pozri Zdroje článkov, ktoré sa o tom podrobnejšie bavia), ale stačí povedať, že AffineTransforms vám umožňujú pracovať s ľubovoľnou grafikou Java 2D na jej preklad (presunutie), rotáciu, zmenšenie mierky, strihanie alebo vykonávanie kombinácií týchto manipulácií.

Kľúč k AffineTransform spočíva v koncepcii Priestor zariadenia a Používateľský priestor. Priestor zariadenia je oblasť, do ktorej sa vykreslí grafika na obrazovke. Je to analogické so súradnicami, ktoré sa používajú pri vytváraní bežného štýlu AWT Grafika- 2D grafika. Užívateľský priestor je však prekladateľný, otočný súradnicový systém, ktorý môže ovládať jeden alebo viac AffineTransforms.

Súradnicové systémy Device Space a User Space sa spočiatku prekrývajú, počiatok je v ľavej hornej časti vykresľovacej plochy (tu Rám). Pozitívna os x sa posúva priamo od počiatku, zatiaľ čo pozitívna os y sa posúva nadol.

Po prvej transformácii v príklade 02 (riadky 028 a 029) sa súradnicový systém užívateľského priestoru otočil o 22,5 stupňa proti smeru hodinových ručičiek vzhľadom na priestor zariadenia. Oba majú stále rovnaký pôvod. (Upozorňujeme, že rotácie sú určené v radiánoch, pričom -PI / 8 radiánov sa rovná -22,5 stupňa alebo 22,5 stupňa CCW.) Ak by sme sa tu zastavili a nakreslili obdĺžnik, otočil by sa väčšinou mimo nášho zorného poľa v žiadosť Rám.

Po dokončení rotácie potom aplikujeme druhú transformáciu (riadky 030 a 031), túto transformáciu. Toto posunie súradnicový systém používateľského priestoru vzhľadom na priestor zariadenia a posunie ho o 200,0 (plávajúce) jednotky a doprava o 50,0 (plávajúcich) jednotiek.

Keď vyplníme zelený obdĺžnik, preloží sa a otočí vzhľadom na priestor zariadenia.

Bézierových a vyššie usporiadaných kriviek

Teraz, keď sme preskúmali, ako možno transformácie použiť na manipuláciu s grafickými objektmi, poďme znovu preskúmať, ako zostavujeme zložité a zaujímavé ľubovoľné tvary.

Krivky sa používajú v celej matematike a počítačovej grafike na aproximáciu zložitých tvarov pomocou konečného, ​​dobre definovaného (a ideálne malého) počtu matematických bodov. Zatiaľ čo štandardný AWT v minulosti priamo nepodporoval kreslenie s ľubovoľnými krivkami (platformy Java 1.0 alebo 1.1), Java 2D pridáva zabudovanú podporu pre krivky prvého, druhého a tretieho rádu. Krivky môžete nakresliť dvoma konečné body a nula, jedna alebo dve kontrolné body. Java 2D počíta krivky prvého a druhého rádu pomocou lineárnych a kvadratických vzorcov a kubických alebo tretieho rádu pomocou Bézierových kriviek.

(Bézierove krivky sú typom parametrickej polynomickej krivky, ktoré majú niektoré veľmi žiaduce vlastnosti súvisiace s výpočtom uzavretých kriviek a plôch. Používajú sa v mnohých grafických aplikáciách. Viac informácií o použití parametrických polynómov a Bézierových kriviek nájdete v zdrojoch. v počítačovej grafike.) GeneralPath metódy, ktoré kreslia každú z týchto kriviek, sú:

  • lineTo () pre priame segmenty (uveďte iba koncové body)
  • quadTo () pre kvadratické krivky (uveďte jeden riadiaci bod)
  • curveTo () pre tretie usporiadané krivky (zadajte dva kontrolné body nakreslené pomocou kubickej Bézierovej krivky)
$config[zx-auto] not found$config[zx-overlay] not found