úloha 092: Generování zajímavého obrázku jen z úseček

Úkolem je vygenerovat jakýkoliv technicky i vizuálně zajímavý obrázek vytvořený pouze z úseček (lomených čar).

Screenshot

Náměty

  • fraktály (alternativní vizualizace Mandelbrotovy množiny, list kapradiny, ...)
  • jiné pravidelné/nepravidelné geometrické obrazce/vzory (spirály, dráhy pohybu..)
  • čárová "cover verze" vašeho oblíbeného abstraktního stylu (např. generátor obrazů ve stylu P. Mondriana)
  • cokoli dalšího vás napadne, ale výsledek by měl být zajímavý vizuálně i technicky/algoritmicky (tedy ne složitý výpočet ze kterého vypadne jeden čárový graf, ani hezký obrázek vytvořený ze 250 úseček zadrátovaných ve zdrojovém kódu).

Prosím nepřevádějte úlohu na "zajímavý rastrový obrázek" kreslením bodů pomocí maličkých úseček.
Pokud možno nepoužívejte lomené čáry k aproximaci hladkých křivek!

Základ

Základem poslouží projekt 092lines z repository grcis (GIT). Je připravena jednoduchá aplikace, do které pouze doplníte vlastní implementaci metody Lines.Draw() vykreslující obrázek. Je možné zadávat požadované rozlišení výstupního rastrového obrázku a další vhodné parametry přes textové pole formuláře.
Výsledek se automaticky zobrazí na obrazovce a je možné ho uložit na disk ve formátu PNG.

Technicky

Výstup musíte realizovat přes danou třídu Canvas, která má k dispozici následující API:
  • 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<PointF> arr) - nakreslí lomenou čáru, tj. posloupnost navazujících úseček, použije aktuálně nastavené pero.
Metoda by si měla poradit s libovolnou rozumnou velikostí obrázku s poměrem stran 4:3 (od 800 x 600 px výše). Výchozí rozměr plátna je 800 x 520 px. Kreslící metody korektně ořezávají čáry přesahující meze.

Při volání metody Lines.Draw() vám bude parametry předán: objekt Canvas c, přes který musíte realizovat veškerý váš výstup a 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.

Inicializace parametrů: Pro pohodlné ladění i pro odevzdání nějakého pěkného nastavení modifikujte inicializační proceduru 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ů.

Co odevzdat

Jako řešení úlohy posílejte mailem modifikovaný zdrojový soubor Lines.cs. Můžete připojit jeden vydařený výsledný obrázek, který program vygeneruje.

Termín

Odevzdat do: 21. 11. 2021

Body

Základ: 6 bodů + bonus (1 až 6 bodů).

Projekt

Visual Studio projekt: 092lines.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Lines.cs
V parametru funkce InitParams() definujte své celé jméno!


Copyright (C) 2011-2021 J.Pelikán, last change: 2021-10-27 13:53:06 +0200 (Wed, 27 Oct 2021)