package příklady;

import rup.česky.tvary.Barva;
import rup.česky.tvary.Kreslítko;
import rup.česky.tvary.Oblast;
import rup.česky.tvary.Pozice;

import rup.česky.tvary.Čára;
import rup.česky.tvary.Kruh;


/*******************************************************************************
 * Třída pro prací s kruhem na virtuálním plátně.
 * Kruh je definován jako potomek elipsy,
 * přičemž při nastavování rozměrů nastaví menší ze zadaných velikostí.
 *
 * @author Rudolf Pecinovský
 * @version 0.00.000,  0.0.2003
 */
public class Terč extends Kruh
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final Barva B1 = Barva.ŽLUTÁ;
    private static final Barva B2 = Barva.MODRÁ;
    private static final Barva B3 = Barva.ČERVENÁ;



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private final Kruh mezi;
    private final Kruh střed;
    private final Čára vodor;
    private final Čára svislá;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří novou instanci s implicitními rozměry, umístěním a barvou.
     * Instance bude umístěna v levém horním rohu plátna
     * a bude mít výšku a šířku 2 pole.
     */
    public Terč()
    {
        this( AP.getKrok()/2, AP.getKrok()/2, AP.getKrok() );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry
     * a implicitní barvou.
     *
     * @param x       x-ová souřadnice počátku, x>=0, x=0 má levý okraj plátna
     * @param y       y-ová souřadnice počátku, y>=0, y=0 má horní okraj plátna
     * @param průměr  Průměr vytvářené instance,  průměr > 0
     */
    public Terč(int x, int y, int průměr)
    {
        this( x, y, průměr, B1, B2, B3 );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou a rozměry
     * a implicitní barvou.
     *
     * @param počátek   Pozice počátku instance
     * @param rozměr    Rozměr instance
     */
    public Terč(Pozice počátek, int průměr)
    {
        this( počátek.x, počátek.y, průměr );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanou polohou, rozměry a barvou.
     *
     * @param počátek   Pozice počátku instance
     * @param rozměr    Rozměr instance
     * @param barva1    Barva vnějšího kruhu
     * @param barva2    Barva středního kruhu, mezikruhu
     * @param barva3    Barva centrálního kruhu
     */
    public Terč(Pozice počátek, int průměr, Barva barva1, Barva barva2, Barva barva3)
    {
        this( počátek.x, počátek.y, průměr, barva1, barva2, barva3 );
    }


    /***************************************************************************
     * Vytvoří novou instanci vyplňující zadanou oblast
     * a mající implicitní barvu.
     *
     * @param oblast   Oblast definující pozici a rozměr instance
     */
    public Terč(Oblast oblast)
    {
        this( oblast.x, oblast.y, Math.min(oblast.šířka, oblast.výška) );
    }


    /***************************************************************************
     * Vytvoří novou instanci vyplňující zadanou oblast
     * a mající zadanou barvu.
     *
     * @param barva1   Barva vnějšího kruhu
     * @param barva2   Barva středního kruhu, mezikruhu
     * @param barva3   Barva centrálního kruhu
     */
    public Terč(Oblast oblast, Barva barva1, Barva barva2, Barva barva3)
    {
        this( oblast.x, oblast.y, Math.min(oblast.šířka, oblast.výška),
              barva1, barva2, barva3 );
    }


    /***************************************************************************
     * Vytvoří novou instanci se zadanými rozměry, polohou a barvou.
     *
     * @param x       x-ová souřadnice počátku, x>=0, x=0 má levý okraj plátna
     * @param y       y-ová souřadnice počátku, y>=0, y=0 má horní okraj plátna
     * @param průměr  Průměr vytvářené instance,  průměr > 0
     * @param barva1  Barva vnějšího kruhu
     * @param barva2  Barva středního kruhu, mezikruhu
     * @param barva3  Barva centrálního kruhu
     */
    public Terč(int x, int y, int průměr, Barva barva1, Barva barva2, Barva barva3)
    {
        super( x-průměr/2, y-průměr/2, průměr, barva1 );
        mezi  = new Kruh( 0, 0, 0, barva2 );
        střed = new Kruh( 0, 0, 0, barva3 );
        vodor = new Čára( 0, 0, 0, 0 );
        svislá= new Čára( 0, 0, 0, 0 );

        setRozměr( průměr );
    }



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    public int getX()
    {
        return super.getX() + getŠířka()/2;
    }


    public int getY()
    {
        return super.getY() + getVýška()/2;
    }


    public void setPozice( int x, int y )
    {
        int r = getŠířka() / 2;
        int s = r / 3;
        AP.nekresli();
            super .setPozice( x-r,   y-r   );
            mezi  .setPozice( x-2*s, y-2*s );
            střed .setPozice( x-s,   y-s   );
            vodor .setPozice( x-r,   y     );
            svislá.setPozice( x,     y-r   );
        AP.vraťKresli();
    }


    public void setRozměr( int šířka, int výška )
    {
        int průměr = Math.min( šířka, výška );
        int p2 = průměr / 2;
        int p3 = průměr / 3;
        int x  = getY();
        int y  = getY();

        AP.nekresli();
            //Nejprve nastavíme všechny rozměry
            super.setRozměr( průměr, průměr );
            mezi .setRozměr(  2*p3  );
            střed.setRozměr(   p3   );
            //A pak všechny hromadně přesuneme
            setPozice( x, y );

            //Osový kříž nestačí přesunout, protože se mohl změnit jeho rozměr
            vodor .spoj( x-p2, y,    x+p2, y    );
            svislá.spoj( x,    y-p2, x,    y+p2 );
        AP.vraťKresli();
    }



//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================

    public void nakresli( Kreslítko kr )
    {
        super .nakresli( kr );
        mezi  .nakresli( kr );
        střed .nakresli( kr );
        vodor .nakresli( kr );
        svislá.nakresli( kr );
    }



//== OSTATNÍ METODY INSTANCÍ ===================================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

