TlačiťTlačiť Slovenčina English Hľadať RSS

© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 19. 4. 2024.

Stránka sa načítava, prosím čakajte…

Dátum: 12. 12. 2020, pred štyrmi rokmi

Tento kód ukazuje využitie triedy SVGPodpora otvárané v novom okne
(obvykle ide o externý odkaz) 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.

obrázok 
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);
	}
}