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

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

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

Dátum: 6. 8. 2020, pred štyrmi rokmi, aktualizované: 4. 9. 2021, pred tromi rokmi

Cieľom tohto miniatúrneho projektu je vytvoriť jednoduchú animáciu rýchlo sa pohybujúcich bubliniek, ktoré reagujú na vzájomné zrážky. Ich pohyb bude pripomínať molekulárne „hmýrenie“ známe ako Brownov pohyb.

~

import knižnica.Farba;
import knižnica.GRobot;

import static java.lang.Math.*;
import static knižnica.Svet.*;

public class BrownovaBublinka extends GRobot
{
	// Predvolený konštruktor.
	public BrownovaBublinka()
	{
		// Voláme rozšírený konštruktor s náhodne generovanými hodnotami
		// pre rýchlosť (3 – 6) a veľkosť (4 – 8) bublinky a s hodnotou
		// null pre farbu, čo tiež znamená náhodnú hodnotu (pozri nižšie):
		this(
			náhodnéReálneČíslo(3, 6),
			náhodnéReálneČíslo(4, 8),
			null);
	}

	// Rozšírený konštruktor.
	public BrownovaBublinka(double rýchlosť, double veľkosť, Farba farba)
	{
		// Rýchlosť a veľkosť sú nastavené podľa zadaných hodnôt parametrov:
		rýchlosť(rýchlosť, false); // (druhý parameter false zabraňuje
			// aktivácii bublinky na tomto mieste – ešte sa nesmie pohnúť,
			// lebo by sa zle inicializovala – pozri ďalšie nastavenia nižšie)
		veľkosť(veľkosť);

		// Ak je hodnota farby rovná null, tak sa vygeneruje náhodná farba,
		// inak sa nastaví farba podľa zadanej hodnoty parametra:
		if (null == farba)
			náhodnáFarba();
		else
			farba(farba);

		// Ďalšie nastavenia:
		//   • ohraničenie bublinky (na pohyb len v rámci plátna – pozor,
		//     toto treba urobiť pred zmenou polohy bublinky, lebo by sa
		//     ohraničenie nastavilo nesprávne),
		//   • zdvihnutie pera (aby bublinka nekreslila čiaru pri pohybe),
		//   • nastavenie náhodnej polohy a náhodného smeru bublinky.
			ohranič();
			zdvihniPero();
			náhodnáPoloha();
			náhodnýSmer();

		// Aktivácia bublinky bez spustenia globálneho časovača:
		aktivuj(false);
	}

	// Reakcia na stlačenie tlačidla myši (ľubovoľného).
	@Override public void stlačenieTlačidlaMyši()
	{
		if (myšV())
		{
			// Táto reakcia je v podstate takou malou zábavkou. Keď sa
			// deteguje kliknutie na bublinku, tak nasledujúce dva príkazy
			// spôsobia, že bublinka akoby „odskočila“ od myši (otočí sa
			// smerom k myši a urobí „čelom vzad“ = jej ďalší pohyb bude
			// smerovať od myši).
			otočNaMyš();
			vpravo(180);
			// (Ale trafiť sa na bublinku je značný problém 🙂. Bolo by
			// treba ich zväčšiť a spomaliť čas 😉)
		}
	}

	// Reakcia kreslenia = v podstate určenie vlastného tvaru robota, ktorý
	// je v tomto prípade krúžkom.
	@Override public void kresliTvar()
	{
		krúžok();
	}
}

~

import knižnica.GRobot;
import knižnica.Zoznam;

import static java.lang.Math.*;
import static knižnica.Svet.*;

public class HlavnáTrieda extends GRobot
{
	// Zoznam všetkých bubliniek:
	private final Zoznam<BrownovaBublinka> bublinky =
		new Zoznam<BrownovaBublinka>();

	// Súkromný konštruktor (v podstate „štartuje“ aplikáciu; v kooperácii
	// s hlavnou metódou (main) nižšie):
	private HlavnáTrieda()
	{
		super(500, 400); // (veľkosť plátna)

		// Pridanie 250 bubliniek:
		for (int i = 0; i < 250; ++i)
			bublinky.pridaj(new BrownovaBublinka());

		// Skrytie hlavného robota (aby „neprekážal“):
		skry();

		// Spustenie časovača (a tým rozbehnutie animácie):
		spustiČasovač();
	}

	// Reakcia na časovač.
	@Override public void tik()
	{
		// Prejdeme všetky bublinky od prvej po predposlednú:
		for (int i = 0; i < bublinky.dĺžka() - 1; ++i)
		{
			BrownovaBublinka bb1 = bublinky.daj(i);

			// A porovnáme ich so všetkými od i plus prvej po poslednú:
			for (int j = i + 1; j < bublinky.dĺžka(); ++j)
			{
				BrownovaBublinka bb2 = bublinky.daj(j);

				// Keď zistíme kolíziu, nasimulujeme ich odrazenie:
				if (bb1.koliduje(bb2))
				{
					// (iba zmeníme smer; obidve bublinky sa postupne otočia
					// čelom k sebe a spravia „čelom vzad“)
					bb1.otočNa(bb2);
					bb1.vpravo(180);
					bb2.otočNa(bb1);
					bb2.vpravo(180);
				}
			}
		}
	}

	// Hlavná metóda.
	public static void main(String[] args)
	{
		// (iba zabezpečíme automatické ukladanie konfigurácie okna, vypnutie
		// automatického prekresľovania pred inicializáciou (s pomocou
		// súkromného konštruktora) a jeho opätovné zapnutie po inicializácii)
		použiKonfiguráciu("HlavnáTrieda.cfg");
		nekresli();
		new HlavnáTrieda();
		kresli();
	}
}

Výsledok

obrázok