/*******************************************************************************
 * Třída ČernáDíra slouží k ukázce definice třídy, 
 * jejíž instance má zůstat jedináčkem.
 *
 * @author     Rudolf Pecinovský
 * @version    2.01, duben 2004
 */
public class ČernáDíra
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Průměr kruhu tvořícího černou díru. */
    private static final int PRŮMĚR  = 10;
    private static final int POLOMĚR = PRŮMĚR / 2;

    /** Definuje jedináčka jako konstnatní atribut třídy a hned mu také
     *  přiřazuje počáteční hodnotu. */        
    private static final ČernáDíra jedináček = new ČernáDíra( PRŮMĚR );
    
    
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Odkaz na kruh, který na plátně představuje danou díru. */
    private final Elipsa díra;
    
    
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

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

    /***************************************************************************
     * Metoda vracející odkaz na jedináčka.
     */
    public static ČernáDíra getInstance()
    {
        return jedináček;
    }


    /***************************************************************************
     * Implicitní konstruktor třídy ČernáDíra
     */
    private ČernáDíra( int průměr )
    {
        Plátno plátno = Plátno.getPlátno();
        int x  = plátno.getŠířka() / 2 - POLOMĚR;
        int y  = plátno.getVýška() / 2 - POLOMĚR;
        díra = new Elipsa( x, y, PRŮMĚR, PRŮMĚR, Barva.ČERNÁ );
    }


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

    /***************************************************************************
     * Převede instanci na řetězec. Používá se především při ladění.
     *
     * @return Řetězcová reprezentace dané instance.
     */
    public String toString()
    {
        return "ČernáDíra";
    }



//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Přesune zadanou instanci nad sebe a vcucne ji, tj. zmenší ji postupně
     * až na nulovou velikost. Přesun i spolknutí provede vždy ve třech krocích.
     *
     * @param elipsa  Polykaná elipsa.
     */
    public void spolkni( Elipsa elipsa )
    {
        int xe = elipsa.getX();
        int ye = elipsa.getY();
        int se = elipsa.getŠířka();
        int ve = elipsa.getVýška();
        int xd = díra.getX() + POLOMĚR;
        int yd = díra.getY() + POLOMĚR;
        
        int dx = (xd - (xe + se/2)) / 3; 
        int dy = (yd - (ye + ve/2)) / 3; 
        
        elipsa.setPozice( xe = xe + dx, ye = ye + dy );
        P.čekej( 500 );
        elipsa.setPozice( xe = xe + dx, ye = ye + dy );
        P.čekej( 500 );
        elipsa.setPozice( xe = xe + dx, ye = ye + dy );
        P.čekej( 500 );
        
        dx = se / 6;
        dy = ve / 6;
        elipsa.setPozice( xe += dx, ye += dy );
        elipsa.setRozměr( se -= 2*dx,  ve -= 2*dy );
        P.čekej( 500 );
        elipsa.setPozice( xe += dx, ye += dy );
        elipsa.setRozměr( se -= 2*dx,  ve -= 2*dy );
        P.čekej( 500 );
        elipsa.setPozice( xe += dx, ye += dy );
        elipsa.setRozměr( se -= 2*dx,  ve -= 2*dy );
        díra.nakresli();
        P.čekej( 500 );

        elipsa.smaž();
        díra.nakresli();
    }



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


