
import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.ImageObserver;
import java.text.NumberFormat;



public class LisajouApplet extends JApplet implements Runnable{
    /** Creates new form JApplet */

    Image buffer;

    Image       DoubleBufferImage,vlek,logo;
    Graphics    DoubleBufferGraphics;
    boolean bezig;
    Thread myThread;
    ImageObserver iObserver;

    private static final int aantal = 200;
    private static final int speed = 50;
    
    private float offsetSpeed = 0.02f;
    
    float xCycles=1;
    float yCycles=1;
    
    boolean xSin = true;
    boolean ySin = true;
        
    
    public LisajouApplet() {  
        initGUI();
    }

    /** This method is called from within the constructor to initialize the form. */
    private void initGUI() {
        this.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				switch(e.getKeyCode()){
                case KeyEvent.VK_UP:
                    yCycles+=0.02f;
                    //offsetSpeed+=0.005f;
                    break;
                case KeyEvent.VK_DOWN:
                    yCycles-=0.02f;
                    //offsetSpeed-=0.005f;
                    break;
                case KeyEvent.VK_LEFT:
                    xCycles+=0.02f;
                    break;
                case KeyEvent.VK_RIGHT:
                    xCycles-=0.02f;
                    break;
                case KeyEvent.VK_A:
                    offsetSpeed+=0.01f;
                    break;
                case KeyEvent.VK_Q:
                    offsetSpeed-=0.01f;
                    break;
                case KeyEvent.VK_X:
                    xSin= !xSin;
                    break; 
                case KeyEvent.VK_Y:
                    ySin= !ySin;
                    break;                     
                }
            }

        });

    }

    public void init(){
	vlek=this.getImage(getCodeBase(),"blob.png");
        this.prepareImage(vlek,iObserver);

   	logo=this.getImage(getCodeBase(),"miniSoma.png");
        this.prepareImage(logo,iObserver);
    }

    public void start(){
        if (myThread==null){
            bezig=true;
            myThread=new Thread(this);
            myThread.start();
        }
        requestFocus();
    }

    public void stop(){
	//myThread.interrupt();
        bezig = false;
        //myThread=null;
    }


    public void run(){
        //loading
        System.out.println("loading images");
        try{
            //myThread.wait();
            //wachten tot blob image geladen is...
            while (vlek.getHeight(this)==-1){
                Thread.sleep(10);
            }
        }
        catch (Exception e){
               e.printStackTrace();
        }
        
        
        
        
        
        int sleepTime;
        long t1,t2;

   	  //create image used as the double buffer
		DoubleBufferImage=createImage(this.getWidth(),this.getHeight());
		//get a graphics for this image so we can draw to the double buffer
		DoubleBufferGraphics=DoubleBufferImage.getGraphics();


        float fieldWidth=this.getWidth()-vlek.getWidth(this);
        float fieldHeight=this.getHeight()-vlek.getHeight(this);

        float centerX=fieldWidth/2;
        float centerY=fieldHeight/2;
        

        float offset = 0;

        while (bezig){
            t1 = System.currentTimeMillis();
            DoubleBufferGraphics.setColor(Color.black);
    	    DoubleBufferGraphics.fillRect(0,0,this.getWidth(),this.getHeight());
            
            for(int i =0;i<aantal;i++)
            {
                int x;
                int y;
                if (xSin){
                    x=(int)( centerX + (Math.sin(i*Math.PI*2*xCycles/aantal+offset)*(centerX*0.9)));
                }else{
                    x=(int)( centerX + (Math.cos(i*Math.PI*2*xCycles/aantal+offset)*(centerX*0.9)));
                }
                if (ySin){
                    y=(int)( centerY + (Math.sin(i*Math.PI*2*yCycles/aantal+offset)*(centerY*0.9)));
                }else{
                    y=(int)( centerY + (Math.cos(i*Math.PI*2*yCycles/aantal+offset)*(centerY*0.9)));
                }
                DoubleBufferGraphics.drawImage(vlek,x,y,this);
            }
            
            offset+=offsetSpeed;
            

            
            DoubleBufferGraphics.drawImage(logo,this.getWidth()-logo.getWidth(this),this.getHeight()-logo.getHeight(this),this);

            DoubleBufferGraphics.setColor(Color.gray);
            NumberFormat nf = NumberFormat.getInstance();
            nf.setMaximumFractionDigits(2);
            nf.setMinimumFractionDigits(2);
            
            DoubleBufferGraphics.drawString("xCycles: "+nf.format(xCycles),10,12);
            DoubleBufferGraphics.drawString("yCycles: "+nf.format(yCycles),110,12);
            DoubleBufferGraphics.drawString("Speed: "+nf.format(offsetSpeed),210,12);
            DoubleBufferGraphics.drawString("xSin: "+xSin,10,(int)fieldHeight+vlek.getHeight(this)-3);
            DoubleBufferGraphics.drawString("ySin: "+ySin,110,(int)fieldHeight+vlek.getHeight(this)-3);            
            DoubleBufferImage.flush();
            //System.out.println("paint");
        	repaint();
                t2 = System.currentTimeMillis();
				if((t2-t1)<speed){
					sleepTime = speed-(int)(t2-t1);
				}else{
					sleepTime = 1;
				}
				try{
					myThread.sleep(sleepTime);
				}catch(InterruptedException e){
					bezig=false;
				}
		}
    }

   	public void paint(Graphics g){
   		if (DoubleBufferImage!=null)
            g.drawImage(DoubleBufferImage,0,0,this);
    }
}

