import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.List;
import java.awt.image.BufferedImage;
import java.awt.geom.*;
import javax.swing.*;

public class LumatronPanel extends JPanel implements Runnable
{
 //Dimension d;
 int maxRadius;
 int x,y,x1,y1;
 Lumatron l;
 Color renk;
 int treadtime;
 private Thread t1;
 boolean s1,flag;
 int radius;
 int renkCode;
 int graphCode;
 int startAngle=0;
 int arcAngle=90;

 public LumatronPanel()
 {
 setLumatronPanel(0,1);
 if(t1==null) { start(); }
}

 public LumatronPanel(int renkkodu,int sekilkodu)
 {
 setLumatronPanel(renkkodu,sekilkodu);
 if(t1==null) { start(); }
 }

 public void setLumatronPanel(int renkkodu,int sekilkodu)
 {
 //d= getSize(  );
 //x=d.width;
 //y=d.height;
 x=getWidth()/2; //başlangıç noktası x ekseni
 y=getHeight()/2; //başlangıç noktası y ekseni
 maxRadius=y*2;
 s1=true;
 renkCode=renkkodu;
 graphCode=sekilkodu;
 l=new Lumatron(renkCode);
 renk=l.getColor();
 treadtime=l.flash;
 radius=10;
 }

 public void start()
 {
 t1=new Thread(this);
 t1.start();
 }

 public void stop()
 {
 t1=null;
 }

 public void run()
 {
 while(true)
 {
 x=getWidth()/2;
 y=getHeight()/2;
 maxRadius=getHeight();
 if(flag)
    radius+=10;
 else
    radius-=10;
 startAngle+=2%360;
 repaint();
 if(radius>maxRadius ) flag=false;
 else if(radius<0) flag=true;
 try{ Thread.sleep(l.flash);}
 catch(InterruptedException e){e.printStackTrace();}
 }
 }//end of run

 public void paintComponent(Graphics g1)
 {
  super.paintComponent(g1);
  Graphics2D g=(Graphics2D)g1;
  g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  setBackground(Color.black);
  g.setColor(renk);
  if(graphCode==1)
  {
   Ellipse2D e1=new Ellipse2D.Double(x-radius/2,y-radius/2,radius,radius);
   g.fill(e1);
  }
  else if(graphCode==2)
  {
   arcAngle=160;
    Arc2D arc1=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle,arcAngle,Arc2D.PIE);
    Arc2D arc2=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+180,arcAngle,Arc2D.PIE);
    g.fill(arc1);
    g.fill(arc2);
  }
  else if(graphCode==3)
  {
   arcAngle=80;
   Arc2D arc1=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle,arcAngle,Arc2D.PIE);
   Arc2D arc2=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+90,arcAngle,Arc2D.PIE);
   Arc2D arc3=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+180,arcAngle,Arc2D.PIE);
   Arc2D arc4=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+270,arcAngle,Arc2D.PIE);
   g.fill(arc1);
   g.fill(arc2);
   g.fill(arc3);
   g.fill(arc4);
  }
  else if(graphCode==4)
  {
   arcAngle=40;
   g.setColor(renk);
   Arc2D arc1=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle,arcAngle,Arc2D.PIE);
   Arc2D arc2=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+45,arcAngle,Arc2D.PIE);
   Arc2D arc3=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+90,arcAngle,Arc2D.PIE);
   Arc2D arc4=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+135,arcAngle,Arc2D.PIE);
   Arc2D arc5=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+180,arcAngle,Arc2D.PIE);
   Arc2D arc6=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+225,arcAngle,Arc2D.PIE);
   Arc2D arc7=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+270,arcAngle,Arc2D.PIE);
   Arc2D arc8=new Arc2D.Double(x-radius/2,y-radius/2,radius,radius,startAngle+315,arcAngle,Arc2D.PIE);
   g.fill(arc1);
   g.fill(arc2);
   g.fill(arc3);
   g.fill(arc4);
   g.fill(arc5);
   g.fill(arc6);
   g.fill(arc7);
   g.fill(arc8);
  }
  else if(graphCode==5)
  {  fillYildiz(g,x,y,3,radius/2,startAngle);}
  else if(graphCode==6)
  { fillYildiz(g,x,y,4,radius/2,startAngle);}
  else if(graphCode==7)
  {
   fillYildiz(g,x,y,5,radius/2,startAngle);
  }
  else if(graphCode==8)
  {
   fillYildiz(g,x,y,6,radius/2,startAngle);
  }
  else if(graphCode==9)
  {
   fillYildiz(g,x,y,8,radius/2,startAngle);
  }
  else if(graphCode==10)
  {
   fillYildiz(g,x,y,20,radius/2,startAngle);
  }
    else if(graphCode==11)
  {
   fillEskenarcokgen(g,x,y,3,radius/2,startAngle);
  }
  else if(graphCode==12)
  {
   fillEskenarcokgen(g,x,y,4,radius/2,startAngle);
  }
  else if(graphCode==13)
  {
   fillEskenarcokgen(g,x,y,5,radius/2,startAngle);
  }
  else if(graphCode==14)
  {
   fillEskenarcokgen(g,x,y,6,radius/2,startAngle);
  }
  else if(graphCode==15)
  {
   fillEskenarcokgen(g,x,y,8,radius/2,startAngle);
  }
  else if(graphCode==16)
  {
   fillEskenarcokgen(g,x,y,10,radius/2,startAngle);
  }
 }//end of paint
 private void delay(int millis)
 {
 try{Thread.sleep(millis);}catch(Exception ignored){}
 }

public static void fillYildiz(Graphics2D g,int xi,int yi, int n,int yildizboyu,double aci )
{
   // bu yildiz doldurma
   double teta=2.0*Math.PI/n;
   double R=yildizboyu;
   double r=yildizboyu*0.25;
   polar P1=new polar();
   polar P2=new polar();
   polar P3=new polar();
   int x[]=new int[2*n+2];
   int y[]=new int[2*n+2];
   GeneralPath polygon=new GeneralPath(GeneralPath.WIND_EVEN_ODD,
   x.length);

   for(int i=0;i<=n;i++)
   {
     double teta1=teta*i+Math.PI/2.0+aci*Math.PI/180.0;
     double teta2=teta/2.0+teta1;
     P1.polarGir(R,teta1);
     P2.polarGir(r,teta2);
     x[2*i]=xi+(int)P1.xi();
     y[2*i]=yi-(int)P1.xj();
     x[2*i+1]=xi+(int)P2.xi();
     y[2*i+1]=yi-(int)P2.xj();
     if(i==n)
     {
     x[2*i]=x[0];
     y[2*i]=y[0];
     }
   }

   for(int i=0;i<=2*n;i++)
   {
          if(i==0)
          {
          polygon.moveTo(x[0],y[0]);
          }
          else
          {
           polygon.lineTo(x[i],y[i]);
          }
   }
   g.fill(polygon);

}  //fillYildiz metodu sonu

public static void fillEskenarcokgen(Graphics2D g,int xi,int yi, int n,int eskenarcokgenboyu,double aci )
{
   // açı derece cinsinden verilmişti
   double teta=2.0*Math.PI/n;
   double R=eskenarcokgenboyu;
   polar P1=new polar();
   int x[]=new int[n+1];
   int y[]=new int[n+1];
   GeneralPath polygon=new GeneralPath(GeneralPath.WIND_EVEN_ODD,
   x.length);
   for(int i=0;i<=n;i++)
   {
     double teta1=teta*i+Math.PI/2.0+aci*Math.PI/180.0;;
     P1.polarGir(R,teta1);
     x[i]=xi+(int)P1.xi();
     y[i]=yi-(int)P1.xj();
     if(i==n)
     {
     x[i]=x[0];
     y[i]=y[0];
     }
   }
      for(int i=0;i<=n;i++)
   {
          if(i==0)
          {
          polygon.moveTo(x[0],y[0]);
          }
          else
          {
          polygon.lineTo(x[i],y[i]);
          }
   }
   g.fill(polygon);
}  //filleskenarcokgen metodu sonu
 public String toString()
 {
 String s="Lumatron Işık Terapi Sistemi\n"+
"   \n"+
"Bu Program Hüseyin Nazlı için Dr. M. Turhan Çoban tarafından geliştirilmiştir.\n"+
"   \n"+
"Kaynak\n"+
"   \n"+
"Light years Ahead, The Illustrated Guide to Full Spectrum and Colored Light in Mindbody Healing\n"+
"Celestial Arts kitabevi, Berkeley, California\n"+
"   \n"+
"Programın gelıştirilmesindeki temel teori yukarıdaki kitaptan alınmıştır. Buna göre \n"+
"belli frekans ve renklerdeki ışık beynin belli dalgalarının daha aktif çalışmasına,\n"+
"ve bu frekanslarda olabilecek bozuklukların giderilmesine yardımcı olmaktadır.\n"+
"   \n"+
"Kitapta verilen renk ve frekans bölgeleri aşağıdaki gibi tanımlanmıştır\n(Hz = Hertz = 1/sn = 1/saniye)\n";
 return s;
 }
  public String toString1()
 {
 String s="Bu amaçla İlk defa 1986 da mekanik bir Işık similatörü Dr. John Downing\n";
 s+=" tarafından geliştirilmiştir. Lumaton adını verdikleri bu ışık kaynakları\n";
 s+=" o zamandan beri beyinle ilgili çeşitli aksaklıkların tedavisinde kullanılmaktadır\n";
 s+=" Biz burada bu aygıtı bir bilgisayar programı olarak oluşturduk. Burada bu aygıtın \n";
 s+=" ne şekilde kullanılacağı ile ilgili bir bilgi vermiyoruz. Aygıtın kullanımı tamamen\n";
 s+=" uzmanlar tarafından saptanmalıdır. Yanlış uygulanacak bir tedavi negatif sonuçlara \n";
 s+=" da yol açabilir. Bu yüzden bu araçda ancak uzmanlar tarafından veya uzmanların vereceği \n";
 s+=" tedaviye göre kullanılabilir. Daha fazla bilgi için Lütfen\n";
 s+=" Hüseyin Nazlı\n";
 s+=" Özel Nazlı Deniz Özel Eğitim Merkezleri\n";
 s+=" 1437 sok No 5 Alsancak İzmir\n";
 s+=" tel 0232 4216563\n";
 s+=" 1688 sokak No 13 Karşıyaka İzmir\n";
 s+=" tel 0232 3640888  veya 0232 3698376\n";
 s+=" adresine başvurunuz\n";
 return s;
 }
}
