------------------------------------------------------------------------
Toto je README soubor projektu. Zde popiste strucne vas projekt.
Ctenari, ktery nemusi o tomto projektu nic vedet, reknete vse, 
co potrebuje znat, aby mohl vas program pouzivat. 
Nechcete-li byt zavisli na platforme, pod kterou bude soubor otevren,
nemely by komentare obsahovat ceskou diakritiku (hacky a carky). 
Komentare vetsinou obsahuji alespon:
------------------------------------------------------------------------

NAZEV PROJEKTU: Pokrocila grafika
UCEL PROJEKTU: Monosti kresleni objektu
VERZE NEBO DATUM:
AUTORI:

JAK PROJEKT SPUSTIT:

INSTRUKCE PRO UZIVATELE:

---
Třídy pro kreslení geometrických tvarů

Velice užitečnými metodami, které obsahuje třída Graphics2D, jsou metody draw(Shape s) a fill(Shape s). Metoda draw vykresluje objekt Shape a metoda fill objekt Shape pro změnu vyplňuje. Konstruktory některých tříd implementující rozhraní Shape jsou: Rectangle2D.Double(double x, double y, double w, double h), Ellipse2D.Double(double x, double y, double w, double h), Line2D.Double(double x1, double y1, souble x2, double y2), CubicCurve2D.Double(x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2) (Beziérova křivka), QuadCurve2D.Double(x1, y1, ctrlx1, ctrly1, x2, y2) (parabola)... Parametry x, y u konstruktorů elips a obdélníků jsou souřadnice levého horního rohu, parametry w a h udávají šířku a výšku. Parametry ctrlx1, ctrly1, ctrlx2, ctrly2 jsou souřadnice řídících bodů křivek.

Jako ukázku uvádím vykreslení Beziérovy křivky, k čemuž bylo před příchodem javy 2D nutné vytvořit vlastní implementaci s použitím vzorců a metody Polyline.

import java.awt.*; 
import java.awt.geom..*; 
//... 
public void paint (Graphics g) { 
  Graphics2D g2 = (Graphics2D)g; 
  Shape c = new new CubicCurve2D.Double(0,0,0,50,100,50,100,100); 
g2.draw(c); 
} 
//... 
A teď si představte, že chcete vykreslovanou křivku převrátit podle svislé osy a zúžit ji na polovinu. Vzpomínáte si ještě, co bylo tématem minulého dílu? Ano, použijeme transformace pomocí třídy AffineTransform. Převrácení a zároveň zúžení dosáhneme zavoláním metody scale s parametrem sx = -0.5 a sy = 1. Tím ale transformace nekončí, protože křivka, kterou jsme vytvořili, se vlivem transformace dostala mimo viditelnou oblast okna, takže ji musíme posunout zase zpět, ale jakoby na opačnou stranu (znaménko mínus v příkladu), protože nesmíme zapomínat na to, že jsme objektu AffineTransform změnili jeho souřadnou soustavu. Popřípadě bychom mohli křivku transformovat dvakrát a před druhým transformováním volat metodu setToTranslation místo metody translate.

//... 
public void paint (Graphics g) { 
  Graphics2D g2 = (Graphics2D)g; 
  AffineTransform af = new AffineTransform(); 
  af.scale(-0.5,1); 
    af.translate(-100,0); 
Shape c = new CubicCurve2D.Double(0,0,0,50,100,50,100,100); 
  c = af.createTransformedShape(c); 
g2.draw(c); 
} 
//... 
---
Shape
Nejdříve ze všeho se ale musíme blíže seznámit s rozhraním Shape, které je implementováno všemi třídami reprezentujícími geometrické objekty, tedy i třídou GeneralPath, reprezentující cestu. K metodám tohoto rozhraní se již nebudu dále příliš vracet. Jejich účel je ve všech třídách, které ho implementují, stejný. Rozhraní Shape definuje následující metody:

boolean contains(double x, double y) 
  boolean contains(double x, double y, double w, double h) 
  boolean contains(Point2D p) 
  boolean contains(Rectangle2D r) 
  Rectangle getBounds() 
  Rectangle2D getBounds2D() 
PathIterator getPathIterator(AffineTransform at) 
  PathIterator getPathIterator(AffineTransform at, double flatness) 
  boolean intersects(double x, double y, double w, double h) 
  boolean intersects(Rectangle2D r) 
Varianty metody contains zjišťují, zda bod (1. a 3. varianta) nebo obdélník (2. a 4. varianta) leží uvnitř objektu, ze kterého jsou volány.

Metody getBounds a getBounds2D vracejí obdélník uzavírající daný objekt, přičemž metoda getBounds2D pracuje s proměnnými typu double a vrací obdélník Rectangle2D, zatímco metoda getBounds pracuje pouze s proměnnými typu int a vrací obdélník Rectangle.

Dvě varianty metody getPathIterator vracejí instanci třídy implementující rozhraní PathIterator. PathIterator obsahuje metody, kterými "říká", jak má být tvar vykreslován (teď rovná čára, teď parabola atd.). Tímto rozhraním se ještě možná budeme zabývat v některém z dalších článků. Nyní pro nás ale metoda getPathIterator není nijak významná a nebudeme se jí dále zabývat.

Metoda intersects zjišťuje, zda daný objekt protíná obdélník, zadaný buď souřadnicemi levého horního rohu a šířkou a výškou, nebo objektem Rectangle2D. Že se protínají, znamená, že mají alespoň jeden bod společný. Tato metoda ale nemusí být stoprocentně spolehlivá, protože, jak se uvádí v dokumentaci, pokud by byl přesný výpočet příliš náročný, může se provést pouze přibližný.

---