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

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

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

Dátum: 15. 3. 2013, pred viacerými rokmi, aktualizované: 30. 7. 2020, pred štyrmi rokmi

Zadanie

Vyriešte kreslenie pyramídy z hviezd s pomocou rekurzie!

 
obrázok

Riešenie

~

import knižnica.*;

public class PyramídaZHviezd extends GRobot
{
	// Konštanty použité vo výpočtoch nižšie…
	private final static int základňa = 7;
	private final static int početCípov = 5;
	private final static int rozmerCípov = 40;
	private final static int rozostupX = 100;
	private final static int rozostupY = 60;

	// Konštruktor
	private PyramídaZHviezd()
	{
		super(750, 500);
		Svet.zbaľ();
		Svet.nekresli();

		// Skrytie robota a zdvihnutie kresliaceho pera.
		skry();
		zdvihniPero();

		// Úvodné umiestnenie robota.
		dozadu((základňa - 1) * (rozostupY / 2));

		// Štart kreslenia pyramídy.
		pyramída(základňa);

		Svet.kresli();
	}

	/**
	 * Metóda na nakreslenie hviezdy.
	 */
	public void lúče()
	{
		for (int i = 0; i < početCípov; ++i)
		{
			položPero();
			dopredu(rozmerCípov);
			zdvihniPero();
			dozadu(rozmerCípov);
			doprava(360.0 / početCípov);
		}
	}

	/**
	 * Rekurzívna metóda kresliaca pyramídu. Stavebnými kameňmi pyramídy sú
	 * hviezdy.
	 */
	public void pyramída(int počet)
	{
		if (počet > 0)
		{
			// Metóda je založená na kreslení riadkov. Po nakreslení jedného
			// riadka zavolá samú seba (t. j. vykoná rekurziu), čo sa bude
			// opakovať až do nakreslenia všetkých riadkov pyramídy.

			// Predpokladáme, že pred kreslením riadka sa robot nachádza
			// „v strede“ (v zvislej osi kreslenia pyramídy). Preto ho najprv
			// posunieme doľava o rozmer polovice šírky riadka.
			posuňVľavo((počet - 1) * (rozostupX / 2));

			// Potom necháme robot nakresliť prislúchajúci počet hviezd.
			for (int i = 0; i < počet; ++i)
			{
				lúče();
				posuňVpravo(rozostupX);
			}

			// Po dokreslení hviezd posunieme robot späť „do stredu“, potom
			// dopredu a pokračujeme kreslením ďalšieho riadka s menším počtom
			// hviezd (rekurzívnym volaním metódy pyramída)…
			posuňVľavo((počet + 1) * (rozostupX / 2));
			dopredu(rozostupY);
			pyramída(počet - 1);
		}
	}

	public static void main(String[] args)
	{
		new PyramídaZHviezd();
	}
}