Úloha 083: Animace pomocí teček

Vymyslete a implementujte animaci kreslenou pouze pomocí teček / kruhů. Animace musí být počítána po jednotlivých snímcích ("off-line rendering"), nakonec vyrobíte video-soubor např. programem ffmpeg.

Screenshot

Základ

Jako základ poslouží projekt 083animation z repository grcis (GIT). Je připravena jednoduchá aplikace, která umí opakovaně pouštět vaši metodu Animation.DrawFrame() a výsledky zapisovat do jednotlivých PNG souborů. Výpočet se provádí v separátních vláknech, a lze jej lze v případě potřeby zastavit tlačítkem Stop.

Náměty

Pohyb nebo změna tvarů v rovině, 3D efekt byste museli sami napodobit kreslením "odzadu-dopředu" (tzv. malířův algoritmus). Fantazii se meze nekladou, pouze musíte snímky animace kompletně nakreslit vaším programem a pomocí omezených prostředků třídy Canvas (jen tečky a vybarvené kruhy, viz níže). To znamená, že mi odevzdáte zdrojový soubor, ze kterého půjde bez použití dalších nástrojů (až na encoding videa nebo doplnění zvukové stopy) animaci vyrobit.

Canvas

Výstup musíte realizovat přes danou třídu Canvas, která má k dispozici následující API (shodné s úlohou 082):

  • int Width – šířka obrazu v pixelech, do kterého máte kreslit (je možné modifikovat a pak zavolat Clear()).
  • int Height – výška obrazu v pixelech, do kterého máte kreslit (je možné modifikovat a pak zavolat Clear()).
  • Clear (Color bg) – inicializuje obrázek, nastaví barvu pozadí bg.
  • SetColor (Color col) – nastaví pro vyplňování a kreslení danou barvu.
  • SetAntiAlias (bool aa) – nastaví, zda se má používat anti-aliasing.
  • FillDisc (float x, float y, float r) – vykreslí kruh se středem [x,y], poloměrem r a aktuálně nastavenou barvou.

Technicky

Metoda Animation.DrawFrame() dostane údaje o čase (viz pilotní implementaci) a referenci na kreslicí objekt Canvas. Metoda má přes něj k dispozici i údaje určující velikost snímku.

Nemůžete předpokládat nic o pořadí vykreslování jednotlivých snímků animace. Jednotlivá vlákna výpočtu mohou kreslit snímky v libovolném pořadí. Na začátku výpočtu animace (anebo před jednotlivým snímkem) se spouští vaše metoda Animation.InitAnimation(), do ní můžete dát případnou inicializaci globálních sdílených dat, apod.
Pokud budete potřebovat provést nějaký souhrnný výpočet (fyzikální/mechanickou simulaci apod.), musíte jej umítit také do InitAnimation(). Výsledky si ve vhodné formě uložte a kreslení jednotlivých snímků animace z nich potom může čerpat.

Inicializace formuláře

Pro pohodlné ladění i pro odevzdání rozumného nastavení animace můžete modifikovat inicializační proceduru Animation.InitParams(). Ta se zavolá vždy na začátku při inicializaci formuláře.
Do prvního parametru out string name napište své celé jméno. Usnadníte tím příp. automatické vyhodnocování výsledků.
Dále můžete nastavit implicitní hodnotu formulářového pole Param: a nápovědu pro toto textové pole (out string tooltip).

Výroba video-souboru

Viz např. tento návod. Binárku ffmpeg pro Windows si můžete stáhnout např. zde. Vytvořené video někde vystavte nebo nahrajte na YouTube a pošlete mi na něj odkaz. Nezapomeňte přiložit i zdrojový soubor Animation.cs.
Pro větší pohodlí jsem do adresáře projektu okopíroval batch encode.bat (musíte si ho upravit, je v něm cesta k binárce ffmpeg).

Termín

Odevzdat do: 3. 1. 2023

Body

Základ: 5 až 20 bodů podle zajímavosti a obtížnosti (může být i do 3D kvóty)
Bonus: za výjimečné řešení

Projekt

Visual Studio projekt: 083animation

Zdrojový soubor

Modifikujte a odevzdejte soubor: Animation.cs
Přes parametr funkce Animation.InitParams() vraťte své celé jméno!
Nezapomeňte poslat odkaz na výsledné video.

Výsledky

Hlasujte na stránce soutěže, do 22. 1. 2023. Stránka s výsledky.


Copyright (C) 2010-2023 J.Pelikán, last change: 2023-01-05 02:53:58 +0100 (Thu, 05 Jan 2023)