Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 3. 5. 2024.
Dátum: 12. 12. 2020, pred štyrmi rokmi
Tento kód ukazuje využitie triedy SVGPodpora
na kreslenie jednoduchého SVG obrázka.
Ukážka ZobrazZápalku
kreslí SVG súbor obsahujúci veľmi jednoduchú definíciu:
<svg width="12" height="65" version="1.1" viewBox="0 0 12 65"> <rect x="4" y="13" width="4" height="50" fill="#cc0"/> <ellipse cx="6" cy="8" rx="4" ry="6" fill="#a00"/> </svg>
(Poznámka: Prepis tejto SVG definície do reťazca Javy môžete v prípade potreby nájsť v zdrojovom kóde hry Nim (variant). Je uvedený v komentári pri definícii reťazca svgZápalka
– pri konci, v statickej časti kódu.)
S použitím triedy StatickýSVGKreslič
(ktorej kód je pod triedou SVGKreslič
, ale neodporúčame ju používať v projektoch, v ktorých potrebujeme vykresľovať viac než jeden SVG obrázok) by na zobrazenie (jediného) SVG súboru stačil tento kód (kde this
sa odkazuje na aktuálnu inštanicu robota):
~
if (StatickýSVGKreslič.čítaj("Zápalka.svg")) StatickýSVGKreslič.vykresli(this);
Po spustení triedy ZobrazZápalku
môže používateľ prečítaný SVG súbor otáčať ťahaním pravého tlačidla myši, presúvať ťahaním ľavého tlačidla myši a meniť mierku rolovaním kolieskom myši.
Ukážka kreslenia – objekt je posunutý, zväčšený a pootočený-
~
import knižnica.*; public class ZobrazZápalku extends GRobot { // Vytvorenie inštancie SVGKresliča: private final SVGKreslič svgKreslič = new SVGKreslič(); private ZobrazZápalku() { skry(); // Prečítanie a prvé vykreslenie s použitím vyššie vytvoreného // kresliča: // if (svgKreslič.čítaj("Zápalka.svg")) svgKreslič.vykresli(this); // Prečítanie a prvé vykreslenie s použitím statického kresliča // („jednoduché“ v tom zmysle, že nepotrebujeme žiadnu „extra // inštanciu,“ ale tento spôsob je použiteľný len na jeden obrázok, // pretože používa statickú inštanciu svgPodpora triedy GRobot): // // if (StatickýSVGKreslič.čítaj("Zápalka.svg")) // StatickýSVGKreslič.vykresli(this); // Záložné riešenie: Ak by bol obrázok príliš komplikovaný na // vykresľovanie, exportoval by som ho do PNG formátu a použil by // som klasické kreslenie (obrázky sú ukladané vo vyrovnávacej // pamäti sveta podľa názvu súboru): // // obrázok("Zápalka.png"); } private void prekresli() { Svet.nekresli(); podlaha.vymažGrafiku(); // Kreslenie s použitím vyššie vytvoreného kresliča: svgKreslič.vykresli(this); // Kreslenie s použitím statického kresliča: // StatickýSVGKreslič.vykresli(this); // Bitmapová alternatíva (obrázky sú ukladané vo vyrovnávacej // pamäti sveta podľa názvu súboru): // obrázok("Zápalka.png"); Svet.kresli(); } @Override public void ťahanieMyšou() { if (ÚdajeUdalostí.tlačidloMyši(ĽAVÉ)) { // Jednoduchší spôsob: Skočím priamo na polohu myši. // skočNaMyš(); // Komplikovanejší spôsob: Posuniem sa podľa zmeny polohy myši. Bod rozdiel = Bod.rozdiel(ÚdajeUdalostí.polohaMyši(), ÚdajeUdalostí.poslednáPolohaMyši()); skoč(rozdiel.polohaX(), rozdiel.polohaY()); } else { // Jednoduchší spôsob: Otočím sa priamo na polohu myši. // otočNaMyš(); // Komplikovanejší spôsob: Pootočím sa podľa zmeny polohy myši. double uhol1 = smerNa(ÚdajeUdalostí.poslednáPolohaMyši()); double uhol2 = smerNaMyš(); vľavo(uhol2 - uhol1); } prekresli(); } @Override public void rolovanieKolieskomMyši() { mierka(mierka() + ((double)ÚdajeUdalostí. rolovanieKolieskomMyšiY() / 10.0)); prekresli(); } public static void main(String... args) { Svet.použiKonfiguráciu("ZobrazZápalku.cfg"); new ZobrazZápalku(); } }
~
import java.awt.geom.AffineTransform; import knižnica.Bod; import knižnica.Farba; import knižnica.GRobot; import knižnica.SVGPodpora; public class SVGKreslič { public final SVGPodpora svgInštancia = new SVGPodpora(); public boolean čítaj(String názov) { int prečítané = svgInštancia.čítaj(názov); if (-1 == prečítané) // Čítanie súboru sa nepodarilo. return false; kresbaDoStredu(); return true; } private void kresbaDoStredu() { Bod stred = svgInštancia.stredKresby(); AffineTransform posun = AffineTransform. getTranslateInstance(-stred.polohaX(), stred.polohaY()); int počet = svgInštancia.počet(); for (int i = 0; i < počet; ++i) svgInštancia.pridajTransformácie(i, posun); } public void vykresli(GRobot kreslič) { Farba farba = kreslič.farba(); double hrúbkaČiary = kreslič.hrúbkaČiary(); int počet = svgInštancia.počet(); for (int i = 0; i < počet; ++i) { Farba farbaTvaru = svgInštancia.farbaVýplne(i); if (null != farbaTvaru) { kreslič.farba(farbaTvaru); kreslič.vyplňTvar(svgInštancia.dajVýsledný(i), true); } farbaTvaru = svgInštancia.farbaČiary(i); if (null != farbaTvaru) { double hrúbkaČiaryTvaru = svgInštancia. hrúbkaČiary(i) * mierka(); if (Double.isFinite(hrúbkaČiaryTvaru)) kreslič.hrúbkaČiary(hrúbkaČiaryTvaru); else kreslič.hrúbkaČiary(1); kreslič.farba(farbaTvaru); kreslič.kresliTvar(svgInštancia.dajVýsledný(i), true); } } kreslič.hrúbkaČiary(hrúbkaČiary); kreslič.farba(farba); } }
Na úplnosť uvádzame aj triedu StatickýSVGKreslič
, ale jej používanie neodporúčame:
~
import java.awt.geom.AffineTransform; import knižnica.Bod; import knižnica.Farba; import knižnica.GRobot; import static knižnica.GRobot.svgPodpora; public class StatickýSVGKreslič { public static boolean čítaj(String názov) { int prečítané = svgPodpora.čítaj(názov); if (-1 == prečítané) // Čítanie súboru sa nepodarilo. return false; kresbaDoStredu(); return true; } private static void kresbaDoStredu() { Bod stred = svgPodpora.stredKresby(); AffineTransform posun = AffineTransform. getTranslateInstance(-stred.polohaX(), stred.polohaY()); int počet = svgPodpora.počet(); for (int i = 0; i < počet; ++i) svgPodpora.pridajTransformácie(i, posun); } public static void vykresli(GRobot kreslič) { Farba farba = kreslič.farba(); double hrúbkaČiary = kreslič.hrúbkaČiary(); int počet = svgPodpora.počet(); for (int i = 0; i < počet; ++i) { Farba farbaTvaru = svgPodpora.farbaVýplne(i); if (null != farbaTvaru) { kreslič.farba(farbaTvaru); kreslič.vyplňTvar(svgPodpora.dajVýsledný(i), true); } farbaTvaru = svgPodpora.farbaČiary(i); if (null != farbaTvaru) { double hrúbkaČiaryTvaru = svgPodpora. hrúbkaČiary(i) * mierka(); if (Double.isFinite(hrúbkaČiaryTvaru)) kreslič.hrúbkaČiary(hrúbkaČiaryTvaru); else kreslič.hrúbkaČiary(1); kreslič.farba(farbaTvaru); kreslič.kresliTvar(svgPodpora.dajVýsledný(i), true); } } kreslič.hrúbkaČiary(hrúbkaČiary); kreslič.farba(farba); } }