Agy.java
/*
 * Agy.java
 */

package ladyb;
import java.awt.geom.*;


public class Agy{
    protected KaticaBogar bogar;
    private IdegSejt mozgato,tanito;
    private LampaFeny feny=null;
    
    public Agy(KaticaBogar k) {
        bogar=k;
        mozgato=new MozgatoSejt(this,1.0,0.1,0.8);
        tanito= new TanitoSejt((MozgatoSejt)mozgato,0.5,0.5,0.7);
    }

    public void fenyErzekel(LampaFeny f) {
        feny=f;
        mozgato.ingerelA();
        tanito.ingerelA();
    }
    
    public void hangErzekel() {
        bogar.szemeVillog(true);
        mozgato.ingerelB();
        tanito.ingerelB();
    }
    
    public void mozgat() {
        double k;               //kulonbseg
        double t1,t2,tm;        //latoter teruletek
        double diff=500;        //j-b metszetek teruletei kozti kulonbseg
        double maxJ,maxB;
        double erezJ,erezB;
        Area fA=feny.getArea();

        //ha csak a hang miatt megy
        if (fA==null) {   
            bogar.elore();
            return;
        }                

        Area j=new Area(bogar.jobbSzem.getLatoTer().getArea());
        Area b=new Area(bogar.balSzem.getLatoTer().getArea());
        Area m=new Area(bogar.jobbSzem.getLatoTer().getArea());
        if (j==null || b==null || m==null || fA==null) return;
        
        //az infohoz kell
        maxJ=terulet(j.getBounds2D());   
        maxB=terulet(b.getBounds2D());   
        Area jj=new Area(j),bb=new Area(b);
        jj.intersect(fA);bb.intersect(fA);
        erezJ=terulet(jj.getBounds2D());
        erezB=terulet(bb.getBounds2D());

        m.intersect(bogar.balSzem.getLatoTer().getArea());        
        j.subtract(m);
        b.subtract(m);
        j.intersect(fA);
        b.intersect(fA);
        m.intersect(fA);

        if (!( j.isEmpty()) || !(b.isEmpty()) || !(m.isEmpty())) {
            t1=terulet(j.getBounds2D());
            t2=terulet(b.getBounds2D());
            tm=terulet(m.getBounds2D());
            k=t1-t2;
            //informacio
            bogar.processKaticaEvent(new KaticaEvent(this,maxJ,erezJ,maxB,erezB));
            
            //merre menjen?
            if (Math.abs(k)<Math.min(t1,t2) || Math.abs(k)<diff) { //elhanyagolhato kulonbseg
                bogar.elore();
            }
            else {
                if (k<0.0) {
                    bogar.forog(-Math.PI/256);
                }
                else 
                    if (k>0.0) {
                     bogar.forog(Math.PI/256);
                    }
                    else {
                        bogar.elore();
                    }
            }
            bogar.repaint();
        }
        else {      //masik eset,mikor csak a hang miatt megy
            bogar.elore();
        }
    }
    
    public void felejt(double d) {
        if (mozgato instanceof MozgatoSejt)
            ((MozgatoSejt)mozgato).felejt(d);
    }
    
    private double terulet(Rectangle2D r) {return r.getWidth()*r.getHeight();}
    
}