úloha 036: Generování zajímavého obrázku z kruhů a kružnic
Úkolem je vygenerovat jakýkoliv technicky a vizuálně zajímavý rastrový obrázek
vytvořený pouze z kruhů a kružnic.
Náměty:
- fraktály (alternativní vizualizace Mandelbrotovy množiny, list kapradiny, ...)
- jiné pravidelné/nepravidelné geometrické obrazce/vzory (spirály z kružnic, rekurzivní jing-jang, ...)
- aproximace bitmapy načtené z disku (simulované ochlazování, evoluční algoritmy, pointilistické filtry, ...)
- kruhový remix vašeho oblíbeného abstraktního obrazu (např. generátor obrazů ve stylu P. Mondriana)
- Cokoliv dalšího co 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 vypadnou 2 kružnice, ani hezký obrázek vytvořený ze 150 kružnic
zadrátovaných ve zdrojovém kódu). Dále prosím nepřevádějte úlohu na "zajímavý rastrový obrázek"
kreslením bodů pomocí kruhů s malým poloměrem.
Základem poslouží projekt 036circles z repository
grcis.
Je připravena jednoduchá kostra aplikace, do které pouze doplníte vlastní implementaci metody
Circles.Draw(), která vygeneruje váš obrázek.
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í kružnic.
- SetAntiAlias ( bool aa ) - nastaví, zda se má používat anti-aliasing.
- FillDisk ( float x, float y, float r ) - vykreslí kruh se středem [x,y], poloměrem r a aktuálně nastavenou barvou.
- DrawCircle ( float x, float y, float r ) - vykreslí kružnici se středem [x,y], poloměrem r a aktuálně nastavenou barvou.
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*600px. Kreslící metody korektně ořezávají kruhy/kružnice přesahující meze.
Při volání metody Circles.Draw() vám bude parametry předán: objekt Canvas c,
přes který musíte realizovat veškerý váš výstup, vstupní rastrový obrázek Bitmap input, pokud
ho uživatel specifikoval a další parametr string param, kterým lze předávat libovolné
další údaje z formuláře aplikace. Parametry input ani param nemusíte ve své
implementaci využívat.
Jako řešení úlohy posílejte mailem modifikovaný zdrojový soubor Circles.cs a případné vstupní soubory
(např. vzorový obrázek, který pointilizujete). Dále připojte výsledný obrázek, který program generuje.
V případě, že výsledek je nedeterministický nebo závisí na vstupním souboru, připojte reprezentativní výběr
výsledných obrázků nebo odkaz na online galerii v případě většího počtu (desítky).
BODY: 6 až 12 + bonus
TERMÍN: do 27. 11. 2011
PROJEKT: 036circles
ZDROJOVÝ SOUBOR: Circles.cs
ŘEŠENÍ POSÍLEJTE Ondřeji Karlíkovi,
do předmětu připište "036circles".
Copyright (C) 2011 J.Pelikán,
last change: $Date: 2014-10-03 15:44:39 +0200 (Fri, 03 Oct 2014) $
Send comments/requests to
pepca.at.cgg.mff.cuni.cz