úloha 099: Generování obrázku z vodorovných a svislých úseček

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

Screenshot

Náměty

  • fraktály (inspirované L-systémy, ...)
  • jiné pravidelné/nepravidelné geometrické obrazce/vzory (spirály, dráhy pohybu..)
  • čárová "cover verze" vašeho oblíbeného abstraktního stylu
  • 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 jedna čárová kresba, ani hezký obrázek vytvořený ze 2500 ú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. Ani se nesnažte simulovat vybarvené obdélníky pomocí paralelních úseček nebo jedné velmi široké úsečky. Základem kresby mají být úsečky, ne vybarvené plochy.

Základ

Základem poslouží projekt 099lines z repository grcis. 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.
  • MoveTo ( float x, float y, int dir =DIRECTION_KEEP ) - posune aktuální pozici do bodu [x,y] a případně změní i orientaci (směr kresby - viz konstanty DIRECTION_*) pera.
  • MoveRel ( float dx, float dy, int dir =DIRECTION_KEEP ) - posune aktuální pozici o daný vektor [dx,dy] a případně změní i orientaci (směr kresby - viz konstanty DIRECTION_*) pera.
  • HLineTo ( float x ) - nakreslí vodorovnou úsečku z aktuální pozice do bodu [x,*] aktuálně nastaveným perem (barva a tloušťka čáry).
  • HLineRel ( float dx ) - nakreslí vodorovnou úsečku délky dx z aktuální pozice, aktuálně nastaveným perem (barva a tloušťka čáry).
  • VLineTo ( float y ) - nakreslí svislou úsečku z aktuální pozice do bodu [*,y] aktuálně nastaveným perem (barva a tloušťka čáry).
  • VLineRel ( float dy ) - nakreslí svislou úsečku délky dy z aktuální pozice, aktuálně nastaveným perem (barva a tloušťka čáry).
  • Draw ( float d ) - nakreslí v přímém směru čáru dlouhou d, použije aktuálně nastavené pero.
  • Skip ( float d ) - přeskočí v přímém směru vzdálenost d.
  • Right () - otočí pero o 90° doprava.
  • Left () - otočí pero o 90° doleva.
Metoda by si měla poradit s libovolnou rozumnou velikostí obrázku s poměrem stran 4:3 (od 800*600px výše). Výchozí rozměr plátna je 800*520px. 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 poslední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: 26. 11. 2017

Body

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

Projekt

Visual Studio projekt: 099lines.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Lines.cs
Do funkce InitParams() napište své jméno!


Copyright (C) 2011-2017 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)