package příklady;

import rup.česky.tvary.Barva;
import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.IHýbací;
import rup.česky.tvary.Kompresor;
import rup.česky.tvary.Pozice;
import rup.česky.tvary.Přesouvač;
import rup.česky.tvary.Elipsa;


/*******************************************************************************
 * Instance třídy ČernáDíra7 simuluje černou díru, která přitáhne označené
 * objekty a vcucne je. Objekty musí být typu IHýbací.
 *
 * @author    Rudolf Pecinovský
 * @version   1.00.000,  05.2003
 */
public class ČernáDíra_8
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final AktivníPlátno AP     = AktivníPlátno.getPlátno();

    private static final ČernáDíra_8 JEDINÁČEK = new ČernáDíra_8();
    private static final int        PRŮMĚR    = 50;
    
    private static final Přesouvač přesouvač = new Přesouvač( 5 );
    private static final Kompresor kompresor = new Kompresor( 3 );
    
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private final Elipsa kruh;
    
    
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

    /***************************************************************************
     * Bezparametrický konstruktor ...
     */
    public static ČernáDíra_8 getInstance()
    {
        return JEDINÁČEK;
    }
    
    

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

    /***************************************************************************
     * Bezparametrický konstruktor ...
     */
    private ČernáDíra_8()
    {
        Pozice p = střed( PRŮMĚR, PRŮMĚR );
        kruh = new Elipsa ( p.x, p.y, PRŮMĚR, PRŮMĚR, Barva.ČERNÁ );
        AP.přidej( kruh );
    }



//== 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 ================================

    /***************************************************************************
     * Vrací textovou reprezentaci dané instance
     * používanou především k ladícím účelům.
     *      
     * @return Název třídy následovnaý podtržítkem a "rodným číslem" instance. 
     */
    public String toString()
    {
        return "ČernáDíra";
    }


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

    /***************************************************************************
     * Přesune zadaný objekt nad černou díru, zmenší jej a nakonec odstraní.
     *      
     * @param oběť    Polykaný objekt.
     */
    public void spolkni( IHýbací ih )
    {
        AP.přidejPod( ih, kruh );
        přesouvač.přesunNa  ( ih, střed( ih.getŠířka(), ih.getVýška() ) );
        kompresor.nafoukniNa( ih, PRŮMĚR/4, PRŮMĚR/4, null );
        AP.odstraň( ih );
    }


    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================


    /***************************************************************************
     * Vrátí souřadnice.
     *      
     * @param oběť    Polykaný objekt.
     */
    private static Pozice střed( int šířka, int výška )
    {
        int kp = AP.getKrok();
        int šp = AP.getŠířka() * AP.getKrok();
        int vp = AP.getVýška() * AP.getKrok();
        return new Pozice( (šp-šířka)/2, (vp-výška)/2 );
    }
    
    
    
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

