ú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).
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)