Úloha 093: Animace pomocí úseček

Vymyslete a implementujte animaci kreslenou pouze pomocí úseček a lomených čar. 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 093animation 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, takže 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 vhodnou transformací a 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 čáry, 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 092):

  • 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.
  • SetPenWidth(float width) - nastaví šířku čáry pro kreslení čar.
  • SetAntiAlias(bool aa) - nastaví, zda se má používat anti-aliasing.
  • Line(float x1, float y1, float x2, float y2) - nakreslí úsečku z bodu [x1,y1] do bodu [x2,y2] aktuálně nastaveným perem (barva a tloušťka čáry).
  • Line(double x1, double y1, double x2, double y2) - nakreslí úsečku z bodu [x1,y1] do bodu [x2,y2] aktuálně nastaveným perem (barva a tloušťka čáry).
  • PolyLine(PointF[] arr) - nakreslí lomenou čáru, tj. posloupnost navazujících úseček, použije aktuálně nastavené pero.
  • PolyLine(IEnumerable arr) - nakreslí lomenou čáru, tj. posloupnost navazujících úseček, použije aktuálně nastavené pero.

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. Dále dostanete textový parametr string param, kterým lze předávat další vhodné údaje z formuláře aplikace. Parametr param nemusíte ve své implementaci využívat. Pokud ano, navrhuji využít možností funkcí Util.ParseKeyValueList() a Util.TryParse() (pro většinu běžných datových typů). Viz pilotní implementace.

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 parametrů 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.

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.

Termín

Odevzdat do: 3. 1. 2022

Body

Základ: 5 až 20 bodů podle zajímavosti a obtížnosti
Bonus: za výjimečné řešení

Projekt

Visual Studio projekt: 093animation

Zdrojový soubor

Modifikujte a odevzdejte soubor: Animation.cs
Do funkce InitParams() napište své jméno!
Nezapomeňte poslat odkaz na výsledné video.

Soutěž

Hlasujte na stránce soutěže, do 15. 1. 2022.


Copyright (C) 2010-2022 J.Pelikán, last change: 2022-01-05 18:58:31 +0100 (Wed, 05 Jan 2022)