# Základní 2D vektorová grafika ## Bitmapová a vektorová grafika **Bitmapová (rastrová) grafika** - obrázek je složen z 2D matice pixelů - pixel = picture element = obrazový element - pixel nese informaci o barvě (může se měnit v čase - video) - podporováno většinou zařízení - vysoké nároky na velikost úložiště **Vektorová (objektově orientovaná) grafika** - obrázek je složen z matematicky definovaných objektů - úsečka, kružnice, křivka, ... - objekty popsány různými vlastnostmi - umístění, poloměr, barva - podporováno minimem zařízení - plotter, řezací plotter, CNC stroje, ... - typicky nutná konverze na bitmapovou grafiku - nároky na velikost úložiště závisí na obsahu + lze vykreslit v libovolné velikosti + snadná úprava, s objekty lze pracovat nezávisle ## Programování aplikací s grafickým výstupem Úkolem je zobrazit vektorovou, bitmapovou či smíšenou grafiku na daném zařízení. - **přímé řešení**: - použít funkcionalitu poskytovanou ovladačem zařízení - problémy: - některá zařízení umí zpracovat jen bitmapovou grafiku (vektorovou je potřeba konvertovat) - rozhraní ovladačů pro různé typy zařízení se mohou lišit - různé souřadnicové systémy + **nepřímé řešení** + abstraktní grafický kontext (také device context či canvas) + poskytuje jednotný přístup k libovolnému zařízení + programátor o vytvoření požádá OS + prostřednictvím API OS + prostřednictvím nějaké dostupné knihovny (AWT, Swing, Qt, ...) ### Grafický kontext **Obsahuje** - identifikátor poskytnutý OS - Windows: HDC - vlastní souřadnicový systém (logický systém, user space) - nastavenou tzv. Window - Viewport transformaci - mapování na oblast v souřadném systému zařízení - zahrnuje posun a změnu měřítka - stav - aktuálně zvolené pero (obrysy) a štětec (výplň) - aktuální poloha peta - ořezová oblast - ... - funkce pro zobrazení smířené grafiky Bývá zapouzdřen v grafických knihovnách (jako třída). ### Aplikace - základem okno, obsluhováno operačním systémem - programátor o vytvoření žádá OS - pomocí API OS nebo dostupné knihovny **Okno** - pozice na obrazovce - šířka a výška - název - další atributy (typ, průhlednost) - identifikátor - grafický kontext pro obrazovku **Rámeček** (ohraničení) - non-client area - vykreslován systémem nebo knihovnou **Klientská oblast** - obsahuje komponenty (tlačítka, seznamy, ...) a vizualizace ### Java Java je nezávislá na platformě, systémový přístup tedy není možný a je potřeba využít knihovnu. - Swing (starší) - JavaFX (nástupce Swing, objektově orientovaná) ## Délkové jednotky **Souřadnicový systém** - kartézský systém souřadnic - (0, 0) v levém horním nebo dolním rohu **Pixel** (px) - jediné jednotky akceptovatené výstupními zařízeními - fyzická velikost pixelu závisí na zařízení - jsou zavedeny a používány jiné jednotky (nutný převod) **Fyzické jednotky** - milimetr, centimetr - palec (inch, in) - 1 inch = 25.4 mm - DTP bod (point, pt) - 1 pt = 1/72 palce - device independent pixel (DIP) - 1 DIP = 1/96 palce **Logické jednotky** - násobky (0.01 palce, 0.1 mm, ...) **Relativní jednotky** - procenta (např. celkové fyzické šířky obrazu) - em = velikost vztažená na velikost písmene M současného písma **Problém** - fyzická velikost pixelu závisí na zařízení - **PPI** (pixels per inch) - počet pixelů na palec - obrazové rozlišení - zaměňováno za DPI (150 DPI u scannerů obvykle znamená 150 PPI) - dostupné pro papír (tiskárny, scannery) - není dostupné pro obrazovku - předpokládá se pro ně 96 PPI (72 PPI u Mac OS) - **DPI** (dots per inch) - historicky starý a velmi rozšířený pojem - pochází z tisku (pixel simulován několika puntíky - dots) - tiskové rozlišení - **LPI** (lines per inch) ## Kreslení grafických objektů Grafické objekty složeny z grafických primitiv (úsečka, kružnice, ...). **Přímý přístup**: postupné vykreslování primitiv a vizuální skládání požadovaného výsledku - kresebně orientovaný - jednodušší, ale omezení možnosti - **pixelový přístup** - nejstarší, velmi rychlý, vhodný např. pro LED reklamní panely - práce přímo s pixely, - rychlejší, zubatý vzhled - **logický přístup** - převod na pixely provede grafický systém - práce pomocí kreslících případů - kvalitní vzhled, lze nakreslit skoro cokoliv, náročnější **Nepřímý přístup**: nadefinuje se geometrický objekt složený z primitiv a poté se vykreslí jako celek - objektově orientovaný - složitější, ale s objekty je možno před vykreslením pracovat - vhodné pro interaktivní grafiku, množinové operace, ... - výpočetně náročné **Pero** (pen, stroke) - slouží k vykreslení obrysu - šířka - styl čáry (plná, čárkovaná, tečkovaná, ...) - způsob napojení čáry (miter, bevel, round, none) - způsob zakončení (flat, square, round) **Výplň** (brush, paint, fill) - vykreslení vnitřku objektu - barvy: - jednobarevná výplň - výplň lineárním gradientem (barevný přechod mezi body) - výplň radiálním gradientem - výplň šrafováním - výplň texturou, kresbou **Štětec** (brush) - často zaměňované za výplň/pero - určeno pro efekty ### Grafická primitiva **Čára** (úsečka) - počáteční a koncový bod **Obdélník** - strany rovnoběžné s osami x, y - nejčastěji levý horní roh, šířka a výška - může mít zakulacené rohy **Elipsa** - umístění (střed, levý horní roh) a velikost v osách x, y - je možné vytvořit i kruh či kružnici **Oblouk** (arc) - část elipsy, která je definována: - jako elipsa, počátečním úhlem a koncovým úhlem **Polygon** - uzavřená lomená čára (definováno posloupností vrcholů) **Rovinná křivka** - vektorová funkce $F(x, y), x = f(t), y = g(t)$ taková, že funkce f a g jsou pro proměnnou t spojité - lze ji po částech nahradit matematicky definovanou parametrickou elemetární rovinnou křivkou - typicky kubická funkce, konstanty určeny elementárním typem křivky (Bezier, Coons, NURBS, ...) ### Práce s písmem - vykreslování jednotlivých znaků - řazení znaků do slova - řazení slov do řádků **Rodina písma** - bezpatková (sans seri) nebo patková (serif) - proporciální nebo neproporciofnální (monospace) **Formáty** - **rastrové písmo** - nejstarší - pro každý znak bitmapa - fixní velikost písma - **Type 1** (.pfb, pfm) - Adobe - součástí PostScript pro komunikaci s laserovými tiskárnami - glyfy definovány jako Bezierovy křivky - **TrueType** (.ttf, .tte) - Apple a Microsoft - glyfy definovány jako Bezierovy křivkys - unicode - **OpenType** (.ttf, .otf) - Microsoft a Apple - glyfy definovány jako TrueType nebo Bezierovy křivky - rozšířené typografické možnost (ligatury, ...) **Řez písma** - normální - tučné - kurzíva (italic) - tučné italikou **Víceřádkový text** - dlouhý text zalamován na více řádků - neproporcionální písmo - daný počet znaků na řádce - proporcionální písmo - zalamování na fyzickou šířku **Zarovnání textu** - doleva - nejjednodušší - vhodné pro krátké texty, úzké sloupce, URL, chemické vzorce, ... - doprava - vhodné pro velmi krátké texty - na osu (např. na střed) - vhodné pro velmi krátké texty - do bloku - levé i pravé okraje řádků pod sebou - technicky nejsložitější (změna velikosti mezislovních mezer) - vhodné pro delší texty