Úloha 123: procedurální generování obrázku

Úkolem je procedurálně generovat nějaký 2D rastrový obrázek. Pro každý pixel bude spuštěna Vaše funkce, která jako výsledek vrátí jeho barvu.

Example

Základ

Budete pracovat v prostředí projektu 117raster z repository grcis (GIT). Je připravena aplikace, jejíž popis je na této stránce

Vaše řešení bude používat modul ModuleFormula, o kterém již byla řeč. Pomocí CS-scriptu můžete pohodlně definovat funkci, která se pak spustí pro každý pixel obrázku (formula.pixelCreate). Pokud budete chtít číst parametry z textového pole Param:, nadefinujete i funkci formula.contextCreate.

Alternativní možnost (pro pohodlnější editování zdrojáku ve Visual Studiu): místo CS-scriptu můžete Vaši implementaci psát rovnou v plnohodnotném jazyce C# podle vzoru modulu ModuleFormulaInternal. Logika věci je zachována, platí tedy popis uvedený níže. Jen se kód implementací neukládá v CS-scriptu, ale přímo v C# zdrojáku, který je součástí Vašeho projektu. Budete mít veškerý komfort editoru Visual Studia, naopak budete muset při každé změně aplikaci 117raster ukončit, přeložit a znova nastartovat (a znova aktivovat příslušný modul).

Příkladem scriptů, který se dají použít pro generování obrázků, jsou Contrast.cs a Swap.cs (oba najdete v adresáři projektu 117raster). První z nich umí vygenerovat barevnou visualizaci funkce sinc(R2), ve druhém je podobná furmulka, avšak s diskrétním výsledkem a nepoužívající gonimetrické funkce.

Ve scriptu Swap.cs se můžete podívat, jak se mohou číst hodnoty z textového pole Param:. Pokud budete chtít nějakou hodnotu (parametr) předat do funkce formula.pixelCreate, vložíte ji do mapy Dictionary<string, object>, ta se vrací z funkce formula.contextCreate. Později ji v ic.context budou mít k dispozici pixelové funkce. Například v Swap.cs se mj. čte parametr "freq" definující frekvenci soustředných kruhů. Pozn: formula.pixelCreate se dá použít pro libovolné předzpracování, výsledky jsou uloženy v mapě Dictionary<string, object> a budou přístupné všem pixelovým funkcím.

Alternativa: Příkladem modulu, který je součástí projektu, je modules/Formula/ModuleFormulaInternal.cs. Najdete tam třídu ModuleFormulaInternal, podle které si napíšete svou vlastní implementaci. Nezapomeňte změnit Vaše iniciály a modul nějak vhodně nazvat, aby se dal snadno najít v list-boxu všech přítomných modulů. Tento váš zdrojový soubor přidejte do projektu 117raster.csproj. Nakonec mi ho odevzdáte jako řešení úlohy číslo 123.

Náměty

Nějaké pravidelné vzory, ornamenty, barevné přechody, fraktály... cokoli zajímavého a ne úplně triviálního. Tato ůloha je jenom "pro zahřátí", klidně udělejte jen jednoduché řešení. Pokud použijete parametrizaci, můžete dostat více bodů.

Svoje řešení prosím naprogramujte do podobného souboru jako je Contrast.cs nebo Swap.cs. Je potřeba definovat funkci formula.pixelCreate a případně formula.contextCreate pro parsing parametru.

Alternativa: pixelové funkce napíšete do Vaší nové třídy napsané podle vzoru modules/Formula/ModuleFormulaInternal.cs. Nastavení lambda-funkcí se nachází v metodě GetFormula().

Co odevzdat

Váš soubor s CS-scriptem, do komentáře připište stručný návod k použití, obzvlášť pokud budete používat parametry (uveďte jejich význam a povolený rozsah hodnot – například do tzv. tooltipu).

Alternativa: zdrojový soubor Vaší nové třídy, která je potomkem ModuleFormula.

Termín

Odevzdat do: 7. 11. 2021

Body

3 až 10 bodů podle zajímavosti a náročnosti, bonus za použití parametrů.

Projekt

Visual Studio projekt: 117raster

Zdrojový soubor

Jeden zdrojový soubor (CS-script), který lze použít jako plugin v modulu ModuleFormula. Nebo zdrojový soubor s implementací Vaší nové třídy, která je potomkem ModuleFormula.


Copyright (C) 2020-2021 J.Pelikán, last change: 2021-10-13 13:57:07 +0200 (Wed, 13 Oct 2021)