/*

Kolekcia JAVA appletov na vyucbu pocitacovej grafiky

Subor : raster.java  

Autor : Juraj Stugel
        Slovakia

Email : jstugel@netgraphics.sk      


 PARAMETER 1 - bod 2/7/2000
 PARAMETER 2 - Prírastkový algoritmus 2/7/2000
 PARAMETER 5 - smernica
 PARAMETER 6 - bresenhamov alg pre usecku 2/7/2000
 PARAMETER 7 - scannovanie
 PARAMETER 8 - kruznica
 PARAMETER 9 - elipsa
 PARAMETER 10 - 4 a 8 susednost
 PARAMETER 11 - vyplnanie oblasti farbou zadaneho vnut. bodu
 PARAMETER 12 - alias
 PARAMETER 13 - scanline
 PARAMETER 19 - smernica m
 PARAMETER 20 - rastrovy rozklad kruznice 19/7/2000 update 19/6/2002
 PARAMETER 21 - line
*/

import java.util.*;
import java.awt.*;
import java.awt.Color;
import java.applet.*;
import java.text.*;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.awt.event.*;
import java.awt.Graphics;
//import java.awt.Font;
//import java.applet.Applet;

public class raster extends Applet implements Runnable
//,MouseMotionListener 
{
    Thread timer;                // casovac

    int parameter = 0;
    int cas=100,prekr=0;
    int okraj=5;
    int v1=180,v2; // pre parameter 20 (velkost kruz)
    int typ;   
    boolean aktivkod=false; // zobrazovenie rgb v 5 a 19
    boolean help=false; // zobrazovenie helpu
    Choice vyber;
    int[] velkost = {1,2,3,4,5,6,7};
    int pixelsize,bx1,by1,bx2,by2; // pre bresenham usecku
    int mx1=100,my1=100; // pre mnohouholnik
    String windowClass;
    int[] pole = new int[42] ;
    int pres,hodnota,tr=0;
    int k,mx,my,k1=20,k2=0;
    int ktory=5;
    int mazat=0; // pre mazanie bodov (1)
    int raster=12;
    int otoc=0,vynuluj=0;
    Font font1;          
    int farbak=0,polx,poly;
    int vel=15; //pre 22
    Color farba1,farba2;
    int fr=200,fg=200,fb=200;
    boolean testok=false;
    Color[] farba = new Color[10];
    Color farba10 = new Color(170,210,230);
    Color farba11 = new Color(210,210,210);
    Color farba12 = new Color(227,229,231);
    Color farba13 = new Color(100,207,253);//slabo modra
    Color farba14 = new Color(100,107,253);// farba pre BOD

    int[][] polebod  = new int[31][31];
    int[][] bod = new int[30][3];


	int[][] bod1 = new int[100][2]; // max 100  bodov
	int start=0;
    int akcia=0;

    int nPoints=30;
    int[] xP = new int[nPoints];
    int[] yP = new int[nPoints];

    String help_for_applet;
    Image offscreen;
    Dimension offscreensize;
    Graphics go;  // graphics offscreen

//Ambient light intensity (0 to 1)
double IaKa = 0.2;

//Vector H is the unit normal to the hypothetical surface oriented
//halfway between the light direction vector (L) and the viewing vector (V).
double Hx = 0.326058, Hy = 0.325058, Hz = 0.888074;

//Intensity of light source.
int Ilight = 140;
//Light source distance factor.
double K = 70;
//Light source position.
double dx = 110, dy = 110, dz = 110;
//Light source normal.
double Lx = 0.57735, Ly = 0.57735, Lz = 0.57735;

      int SpecIndex, i, j, Xpos, Ypos;
  double Kd, Ks;
  
double LdotN;
double dist; 
double NnH;
    Image img1,img2,textura;
    int w = 250,h = 250;
      int[] pix1 = new int[w * h];
      int index=1;
                        
public void CalculateLNandNnH( double x,  double y, double z, double SpecIndex,
                        double xn, double yn, double zn)
{
  double NH;

  LdotN = xn*Lx + yn*Ly + zn*Lz;

  if (LdotN <= 0)
    LdotN = 0;
  else {
    dist = Math.sqrt((dx - x)*(dx - x) + (dy - y)*(dy - y) + (dz - z)*(dz - z));
    NH = Hx*xn + Hy*yn + Hz*zn;
    NnH = Math.exp(SpecIndex*Math.log(NH));
  }
}



public void ShadeSphere(double Kd, double Ks,
                 double  SpecIndex, int  Xcentre, int  Ycentre, int  radius)
{
    for (int y = 0; y < h; y++) 
        { int red = (y * 255) / (h - 1);
          for (int x = 0; x < w; x++) 
           { int blue = (x * 255) / (w - 1);
             pix1[index] = (255 << 24) | (red << 16) | red ;
        //     pix2[index++] = (255 << 24) | (blue << 16) | 255 << 8| red;
           }
    }
        
  double  Ir, Igb; // Ir = intensity of Red, Igb = intensity of green/blue.
  double  x, y, z; // Coordinates of point on sphere surface.
  int vys;
  double rsquare, xsquare, ysquare, zsquare, denom, xn, yn, zn, LdotN, NnH,
        dist, distfactor, ambientterm, diffuseterm, specularterm; 
  LdotN=0;NnH=0;dist=1;
  rsquare = radius * radius;

  for (y = -radius; y<radius; y++) {
    ysquare = y * y;  
    for (x = -radius; x<radius; x++) {
      xsquare = x * x;
      if ( (xsquare + ysquare) <= rsquare) {
        z = Math.sqrt(rsquare - xsquare - ysquare);
        zsquare = z * z;
        denom = Math.sqrt(xsquare + ysquare + zsquare);
        // xn, yn, and zn are unit normals from the sphere surface.
        xn = x / denom;
        yn = y / denom;
        zn = z / denom;
        CalculateLNandNnH(x, y, z, SpecIndex, xn, yn, zn); 
        ambientterm = IaKa;
        if (LdotN <= 0) {
          //Point is not illuminated by light source. 
          //Use only ambient component.
          Ir =(255 * ambientterm);
          Igb = 0;
        }
        else {
          distfactor = Ilight / (dist + K);
          diffuseterm = distfactor * Kd * LdotN;
          specularterm = distfactor * Ks * NnH;
          Ir = (255 * (ambientterm + diffuseterm + specularterm));
          Igb = (255 * specularterm);
        }
        /*
         for (int y = 0; y < h; y++) 
        { int red = (y * 255) / (h - 1);
          for (int x = 0; x < w; x++) 
           { int blue = (x * 255) / (w - 1);
             pix1[index] = (255 << 24) | (red << 16) | blue ;
          //   pix2[index++] = (255 << 24) | (blue << 16) | 255 << 8| red;
           }
        }
        */vys= (int)Ir;
         pix1[(Xcentre + (int)x)*250+(Ycentre + (int)y)] = (vys << 24) | ((int)(Igb) << 16) | 255 ;
       
              
        //plotpixel(Xcentre + x, Ycentre + y, Ir);
      }
    }
  }
img1 = createImage(new MemoryImageSource(w, h, pix1, 0, w));
}



 public void vymaz1()
  {
    for (int i=0;i<30;i++)
     {
       for (int j=0;j<20;j++){ polebod[i][j]=0;}
     }
    for (int i=0;i<30;i++) 
     { polebod[0][i]=100; polebod[i][0]=100; 
       polebod[29][i]=100; polebod[i][19]=100; 
     }
    for (int i=0;i<20;i++) {polebod[i][10]=100;}
  }

 public void init() 
  {
    int x,y;
    setBackground(Color.white);

    // addMouseMotionListener(this); //pridanie testov pohybu mysi

    String windowWidthString = getParameter("CISLO");
    if (windowWidthString != null) 
     {
       try { parameter = Integer.parseInt(windowWidthString);}
       catch (NumberFormatException e) 
        {  //Use default width.
        }
     }
     
    help_for_applet = getParameter("HELP");
    if (help_for_applet != null) 
     {
       
     }
    start=0; //efekt pre bod1
    
    for (int i=1; i<41;i++) { pole[i]=40;}
    farba[0] = new Color(170,150,150);
    farba[1] = new Color(120,10,250);
    farba[2] = new Color(10,250,10);
    farba[3] = new Color(10,10,250);
    farba[4] = new Color(210,250,10);
    farba[5] = new Color(100,100,250);

    if (parameter==1) 
     {
       // setLayout(new FlowLayout(FlowLayout.CENTER,20,5));
       add(new Button("Zmazať")); 
     }

    if (parameter==2) 
     {
       int raster=5; // velkost rastra 1 - 20
     }

    if ((parameter==6) ||(parameter==29))
     {
       raster=30; // velkost rastra 20 - 100
     }

    if (parameter==11) 
     {
       add(new Button("Zmazať")); 
       vymaz1(); 
       cas=300;
       hodnota=0;
     }

    // body mnohouholnika
    if (parameter==13) 
     {
       cas=100;
       bod[0][0]=80;bod[0][1]=40;
       bod[1][0]=60;bod[1][1]=140;
       bod[2][0]=150;bod[2][1]=160;
       bod[3][0]=230;bod[3][1]=120;
       bod[4][0]=240;bod[4][1]=50;
       bod[5][0]=170;bod[5][1]=80;
       bod[6][0]=120;bod[6][1]=90;
       bod[7][0]=80;bod[7][1]=40;
     }

    if (parameter==9) 
     {
       bod[0][0]=250;bod[0][1]=190;
       bod[1][0]=250;bod[1][1]=120;
       bod[2][0]=350;bod[2][1]=190;
     }
    if (parameter==28) 
     {
       bod[0][0]=90;bod[0][1]=190;
       bod[1][0]=210;bod[1][1]=120;
       bod[2][0]=2950;bod[2][1]=2990;
     }

 if (parameter==15)  // vyber objekt
     {
      vyber = new Choice();
      vyber.addItem("8");
      vyber.addItem("12");
      vyber.addItem("16");
      vyber.addItem("24");
      vyber.addItem("32");
      vyber.addItem("64");
      vyber.addItem("360");
      vyber.addItemListener(new ItemListener() 
       {
         public void itemStateChanged(ItemEvent e) 
          {
      	   /*  vyber leskolst bodu rastra */
             typ=velkost[vyber.getSelectedIndex()];
          }
         }
       );
      this.add(vyber);
     }

    if (parameter==22) 
     {
       // tretia hodnota urcuje ktory to je bod
       bod[0][0]=2*vel;bod[0][1]=9*vel;bod[0][2]=0;
       bod[1][0]=2*vel;bod[1][1]=3*vel;bod[1][2]=1;
       bod[2][0]=7*vel;bod[2][1]=1*vel;bod[2][2]=2;
       bod[3][0]=13*vel;bod[3][1]=4*vel;bod[3][2]=3;
       bod[4][0]=12*vel;bod[4][1]=10*vel;bod[4][2]=4;
       bod[5][0]=8*vel;bod[5][1]=7*vel;bod[5][2]=5;
       bod[6][0]=6*vel;bod[6][1]=7*vel;bod[6][2]=6;
       bod[7][0]=5*vel;bod[7][1]=5*vel;bod[7][2]=7;
       bod[8][0]=bod[0][0];bod[8][1]=bod[0][1];bod[8][2]=bod[0][2];
     }
  }

// bublinkuj
public void utried(int kt1,int kt2)
 { int ip1,ip2,ip3;
   ip1=bod[kt1][2];
   if (bod[kt1][1]>bod[kt2][1])
     { 
       bod[kt1][2]=bod[kt2][2];
       bod[kt2][2]=ip1;
     }
 }


// nakresli sachovnicu 
 public void sach(Graphics g,int i1, int i2 , int ix1,int iy1 ,int ix2,int iy2 )
  {
    double pom1=ix2-ix1;
    double pom2=iy2-iy1;
    double p1,p3;
    p3=i1;
    p1= pom1/p3;
    double p2,p4;
    p4=i2;
    p2= pom2/p4;
 
    for (int i=0;i<i1+1;i++) 
     { p3=i;
       go.drawLine(ix1,iy1+(int)(p3*p2),ix2,iy1+(int)(p3*p2));
     }
    for (int i=0;i<i2+1;i++) 
     { p3=i;
       go.drawLine(ix1+(int)(p3*p1),iy1,ix1+(int)(p3*p1),iy2);
     } 
  }

 // sipka z bodu xp1,yp1 do xp2,yp2, velkostou trojuholnika size
 public void sipka (Graphics g,int xp1,int yp1,int xp2,int yp2,int size) 
  { 
    double p1,p2,p3,p4,p5,p6,dx,dy,p7,p8,p11,p12;
    double[][] bod1 = new double[30][3];
    boolean polindex=false; //ak je v 2 a 4 qvart tak true

    p1=xp1;
    p2=xp2;
    p3=p2-p1;
    dx=p3;
    p1=yp1;
    p2=yp2;p4=p2-p1;
    dy=p4;
    p5=Math.sqrt((p3*p3)+(p4*p4)); // dlzka prepony trojuh.
    p6=Math.asin(p4/p5);
    if (p3<0){ polindex=true;}

    bod1[0][0]=p5;bod1[0][1]=0;
    bod1[1][0]=p5-size;bod1[1][1]=size;
    bod1[2][0]=p5-size;bod1[2][1]=0-size;

    // rotacia okolo 0,0
    for (int i=0;i<3;i++)
     {
       p11=(bod1[i][0]*Math.cos(p6))-(bod1[i][1]*Math.sin(p6));
       p12=(bod1[i][0]*Math.sin(p6))+(bod1[i][1]*Math.cos(p6));
       bod1[i][0]=p11;bod1[i][1]=p12;
       if (polindex) { bod1[i][0]=(-1)*bod1[i][0]; }
       xP[i]=(int)(xp1+bod1[i][0]);
       yP[i]=yp1+(int)(bod1[i][1]);
     } 
    g.fillPolygon(xP,yP,3);
    g.drawLine(xp1,yp1,xp2,yp2);
  }

 public void sursystem (Graphics g) 
  {
    Dimension d = getSize();
    go.drawLine(30,30,30,d.height-30);
    go.drawLine(30,d.height-30,d.width-30,d.height-30);
    go.drawString("Y",35,45);
    xP[0]=26;yP[0]=34;
    xP[1]=30;yP[1]=26;
    xP[2]=34;yP[2]=34;
    go.fillPolygon(xP,yP,3);
    xP[0]=d.width-34;yP[0]=d.height-34;
    xP[1]=d.width-26;yP[1]=d.height-30;
    xP[2]=d.width-34;yP[2]=d.height-26;
    go.fillPolygon(xP,yP,3);
    go.drawString("X",d.width-50,d.height-15);
    go.drawString("0",20,d.height-15);
  }

// ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK
// ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK
// ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK ZACIATOK

 public void paint(Graphics g) 
  {
    Dimension d = getSize();
    polx=(int)(d.width/2);
    poly=(int)(d.height/2);

    if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) 
     {
       offscreen = createImage(d.width, d.height);
       offscreensize = d;
       go = offscreen.getGraphics();
       go.setFont(getFont());
     }
   
    if (parameter !=1)
     { 
       go.setColor(Color.white);//getBackground()
       go.fillRect(0, 0, d.width, d.height);
     }
    go.setColor(Color.black);


// PARAMETER 1 - BOD
 if (parameter==1) 
  { 
    if (mazat>0) { go.setColor(getBackground());
                   go.drawLine(6,mazat,d.width-6,mazat);mazat++;
                   go.drawLine(6,mazat,d.width-6,mazat);mazat++;
                   if (mazat>d.height){mazat=0;}
                  }
   if (akcia>0){ 
    for (int ip=0;ip<start;ip++)
    
    go.drawOval(bod1[ip][0],bod1[ip][1]+akcia,2,2);
    akcia++;
    if (akcia>(2*poly)){akcia=0; }
    }

/*
    if (prekr==2)
     { 
       go.setColor(getBackground());
       go.fillRect(0, 0, d.width, d.height);
       go.drawLine();
//       prekr=0;vynuluj=0;mx=0;my=0;
     }
*/

    //if (mx==0) { mx=100;my=100;} // pre zaciatok

    // nakresli okraj
    go.setColor(Color.black);

  //  go.setColor(farba14);
    go.drawLine(okraj,okraj,d.width-okraj,okraj);
    go.drawLine(okraj,okraj,okraj,d.height-okraj);
    go.drawLine(d.width-okraj,okraj,d.width-okraj,d.height-okraj);
    go.drawLine(okraj,d.height-okraj,d.width-okraj,d.height-okraj);

    go.setColor(Color.white);
    go.fillRect(d.width-36-okraj,d.height-45-okraj,35,44); // vypln okno pre x,y
    go.setColor(Color.black);
   
    // nakresli okraj okna 2
//    go.setColor(farba14);
    go.setColor(Color.black);

    go.drawLine(d.width-36-okraj,d.height-okraj,d.width-36-okraj,d.height-45-okraj);
    go.drawLine(d.width-36-okraj,d.height-45-okraj,d.width-okraj,d.height-45-okraj);
    go.setColor(Color.black);

    // ak je bod z okna tak ho nakresli
    if ((mx>okraj)&&(mx<d.width-okraj)&&(my>okraj)&&(my<d.height-okraj)&&( (my<d.height-45-okraj)||(mx<d.width-36-okraj)) )
     {
       go.drawString("x:"+mx,d.width-30-okraj,d.height-25-okraj);
       go.drawString("y:"+my,d.width-30-okraj,d.height-5-okraj);
       go.fillOval(mx,my,3,3);
      vynuluj++;
     }
     else
     { 
      //go.drawString(" Bod je mimo okna ",30,30);
      //go.drawString(" Zadaj bod v okne ! ",30,50);
     }

    g.drawImage(offscreen, 0, 0, null);
  }    


// PARAMETER 2 - Prírastkový algoritmus
 if (parameter==2) 
  { 
    go.drawString("Prírastkový algoritmus ",20,22);
    go.drawString("veľkosť rastra "+raster,220,22);

    go.setColor(Color.black);
    
    int lavox=15; int lavoy=30;    // lavy okraj;
    int pravox=d.width-15; int pravoy=d.height-30;    // pravy okraj;

    int pk1=(int)((pravox-lavox)/raster)+1; // pocet policok v smere x
    int pk2=(int)((pravoy-lavoy)/raster)+1; //                       y   

    // nakresli sachovnicu
    for ( int i=0;i<(pk1);i++)
     { go.drawLine(lavox+(i*raster),lavoy,lavox+(i*raster),lavoy+(pk2*raster) ); // I zvislo
     }
    for ( int i=0;i<(pk2+1);i++)
     { go.drawLine(lavox,lavoy+(i*raster),lavox+((pk1-1)*raster),lavoy+(i*raster)); // - vodorov.
     }

    // DDA  pre body p1,p2 a mx,my
    int p1=lavox,p2=lavoy;
    double dx,dy,m,y;
    int pos;

    //if (((mx-2)>lavox)&&(mx<(pravox))&&(my>lavoy)&&(my<pravoy+(raster)))
    if (((mx-2)>lavox)&&(mx<(lavox+((pk1-1)*raster)))&&(my>lavoy)&&(my<(lavoy+(pk2*raster))))
     {
      dx=mx-p1; dy=my-p2;  m= dy/dx;
      y=0.25; pos=0;
      if (m<1) 
       {
        for (int x=p1;x<mx;x=x+raster) 
         {
           //go.fillOval(x+pos,pos+p2+(int)((((int)(y*raster))/raster)*raster),raster,raster);       
           go.fillRect(x+pos,pos+p2+(int)((((int)(y*raster))/raster)*raster),raster,raster);       
           y=y+m;
         }
       }
      else 
       {
        y=0; 
        for (int x=p2;x<my;x=x+raster) 
         {
          // go.fillOval(pos+p1+(int)((((int)(y*raster))/raster)*raster),pos+x,raster,raster);       
           go.fillRect(pos+p1+(int)((((int)(y*raster))/raster)*raster),pos+x,raster,raster);       
           y=y+(1/m);
         } 
       }
     }

    g.drawImage(offscreen, 0, 0, null);
 }                 


// PARAMETER 3 -     
 if (parameter==3) 
  { 
    go.drawLine(30,d.height-40,mx,my);
    go.setColor(Color.white);
    go.fillRect(d.width-60,d.height-60,70,50); // x, y, width, height	
    go.setColor(Color.black);
    go.drawString("k:"+k,d.width-40,d.height-20);

    g.drawImage(offscreen, 0, 0, null);
  }                     


// PARAMETER 4 -     
 if (parameter==4) 
  { 
    int pred;       pred=k1;
    if (k==1006) {k1--;}
    if (k==1007) {k1++;}
    if (k1<16) {k1=16;}
    if (k1>24) {k1=24;}
    if (k2<40)  
     {
       go.setColor(Color.white);
       go.fillRect(pred*15,(k2-1)*10,15,10);
     }
    go.setColor(farba[farbak]);
    go.fillRect(k1*15,k2*10,15,10);

    k2++;
    //test kolizie
    if (pole[k1]==k2)  //tak kolizia
      { pole[k1]--;k2=0;farbak=(int)(Math.random()*6);
      }
      if  (k2>40) { k2=0;}
      k=0;

    g.drawImage(offscreen, 0, 0, null);
  }                     


// PARAMETER 5 - smernica
 if (parameter==5)   
  { 

    Color f10 = new Color(fr,fg,fb);

    go.setColor(f10);
    xP[0]=polx;yP[0]=poly;
    if ((mx>polx)&&(my<poly)&&((mx-polx)<(poly-my))) // pravo hore I
     { 
       xP[1]=polx;yP[1]=okraj;
       xP[2]=polx+poly-okraj;yP[2]=okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx>polx)&&(my<poly)&&((mx-polx)>(poly-my))) // pravo hore II
     { 
       xP[1]=polx+polx-okraj;yP[1]=poly;
       xP[2]=polx+polx-okraj;yP[2]=okraj;
       xP[3]=polx+poly-okraj;yP[3]=okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx>polx)&&(my>poly)&&((mx-polx)<(my-poly))) // pravo dole I
     { 
       xP[1]=polx;yP[1]=d.height-okraj;
       xP[2]=polx+poly-okraj;yP[2]=d.height-okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx>polx)&&(my>poly)&&((mx-polx)>(my-poly))) // pravo dole II
     { 
       xP[1]=polx+polx-okraj;yP[1]=poly;
       xP[2]=polx+polx-okraj;yP[2]=d.height-okraj;
       xP[3]=polx+poly-okraj;yP[3]=d.height-okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx<polx)&&(my<poly)&&((polx-mx)<(poly-my))) // lavo hore I
     { 
       xP[1]=polx;yP[1]=okraj;
       xP[2]=polx-(poly-okraj);yP[2]=okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx<polx)&&(my<poly)&&((polx-mx)>(poly-my))) // lavo hore II
     { 
       xP[1]=polx-(polx-okraj);yP[1]=poly;
       xP[2]=polx-(polx-okraj);yP[2]=okraj;
       xP[3]=polx-(poly-okraj);yP[3]=okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx<polx)&&(my>poly)&&((polx-mx)<(my-poly))) // lavo dole I
     { 
       xP[1]=polx;yP[1]=d.height-okraj;
       xP[2]=polx-(poly-okraj);yP[2]=d.height-okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx<polx)&&(my>poly)&&((polx-mx)>(my-poly))) // lavo dole II
     { 
       xP[1]=polx-(polx-okraj);yP[1]=poly;
       xP[2]=polx-(polx-okraj);yP[2]=d.height-okraj;
       xP[3]=polx-(poly-okraj);yP[3]=d.height-okraj;
       go.fillPolygon(xP,yP,4);
     }
    go.setColor(Color.black);

    go.drawLine(polx,okraj,polx,d.height-okraj);
    go.drawLine(okraj,poly,d.width-okraj,poly);

    go.drawLine((polx+poly)-(d.height-okraj),okraj,polx+(d.height-okraj)-poly,d.height-okraj);
    go.drawLine((polx+poly)-(d.height-okraj),d.height-okraj,polx+(d.height-okraj)-poly,okraj);

    if (aktivkod) 
     { go.drawString("r="+fr,10,20);
       go.drawString("g="+fg,10,40);
       go.drawString("b="+fb,10,60); 
     }
    go.drawString("dx=1/m ",polx+16,30);
    go.drawString("dy=1 ",polx+16,52);
    go.drawString("dx=1 , dy=m ",polx+50,poly-15);
    go.drawString("dx=1 , dy=-m ",polx+50,poly+25);
    go.drawString("dx=-1/m ",polx+16,d.height-30);
    go.drawString("dy=-1 ",polx+16,d.height-52);

    // opacne
    go.drawString("dx=1/m ",polx-50,30);
    go.drawString("dy=1 ",polx-50,52);
    go.drawString("dx=1 , dy=m ",polx-110,poly-15);
    go.drawString("dx=1 , dy=-m ",polx-110,poly+25);
    go.drawString("dx=-1/m ",polx-50,d.height-30);
    go.drawString("dy=-1 ",polx-50,d.height-52);

    go.drawString("2",polx+6,poly-20);
    go.drawString("7",polx+4,poly+25);
    go.drawString("8",polx+20,poly+16);
    go.drawString("1",polx+20,poly-4);

    go.drawString("6",polx-16,poly-20);
    go.drawString("3",polx-14,poly+25);
    go.drawString("4",polx-30,poly+16);
    go.drawString("5",polx-30,poly-4);

    go.drawLine(polx,poly,mx,my);
    go.fillOval(mx-3,my-3,6,6);
    go.fillOval(polx-3,poly-3,6,6);
    
    g.drawImage(offscreen, 0, 0, null);
  }    


// PARAMETER 6 - bresenhamov alg pre usecku
 if (parameter==6) 
  {

    // nakresli sachovnicu
    for ( int i=0;(i<(int)(d.width/raster)+1);i++)
     { go.drawLine((i*raster),0,(i*raster),d.width); // I zvislo
       go.drawString("Yi+"+i,(i*raster)-5,d.height-30);
     }
    for ( int i=0;(i<(int)(d.height/raster)+1);i++)
     { go.drawLine(0,d.height-(i*raster),d.width,d.height-(i*raster)); // - vodorov.
       go.drawString("Xi+"+i,30,d.height-(i*raster)+5);
     }

     int polo=(int)(raster/4);

     go.fillOval(raster-polo,(d.height-raster)-polo,2*polo,2*polo);

     go.drawString("A",raster-polo,(d.height-raster)-polo);
     go.drawString("B",2*raster-polo,(d.height-raster*2)-polo);
     go.drawString("C",2*raster-polo,(d.height-raster)-polo);

     go.drawLine(mx,my,raster,(d.height-raster)); // usecka

     // test ci priamka pretina usecku AB a ktory z bodov je blizsie k priesecniku

     int pi1=mx-(raster);
     int pi2=(d.height-raster)-my;
     
     if ((pi1>pi2)&&(pi2>0))  // tak pretina usecku AB
          { 
            if ((pi2*2)>pi1) // bod B je blizsie priesecniku
             { go.fillOval(2*raster-polo,(d.height-raster*2)-polo,2*polo,2*polo);
               go.setColor(Color.cyan);
               go.fillOval(2*raster-polo,(d.height-raster)-polo,2*polo,2*polo);
               go.setColor(Color.black);
              }
             else { 
               go.fillOval(2*raster-polo,(d.height-raster)-polo,2*polo,2*polo);
               go.setColor(Color.cyan);
               go.fillOval(2*raster-polo,(d.height-raster*2)-polo,2*polo,2*polo);
               go.setColor(Color.black);
                  } 
          }
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 7 - scannovanie
 if (parameter==7) 
  {
    int[][] body = new int[10][2];
    double p1,p2;

    // zaciatocne body mnohouholnika 
    body[0][0]=40; body[0][1]=180;
    body[1][0]=140; body[1][1]=140;
    body[2][0]=260; body[2][1]=220;
    body[3][0]=260; body[3][1]=80;
    body[4][0]=200; body[4][1]=40;
    body[5][0]=120; body[5][1]=80;
    body[6][0]=40; body[6][1]=60;

    for (int i=0;i<6;i++) 
     { 
       go.drawLine(body[i][0],body[i][1],body[i+1][0],body[i+1][1]);
     }
    go.drawLine(body[0][0],body[0][1],body[6][0],body[6][1]);
    go.drawLine(10,d.height-10,d.width-10,d.height-10);
    go.drawLine(10,d.height-10,10,10);
    //  go.drawOval (20,20,8,8);

    for (int i=0;i<7;i++) //hladame priesecniky ak ano nakreslit
     {
       if (((my<body[i][1])&&(my>body[i+1][1]))||((my>body[i][1])&&(my<body[i+1][1])))
        {
          go.drawString("Test OK",body[i][0],my);
	  // p1=(body[i][0]-body[i+1][0]);
	  // p2=body[i][1]-my;
	  // p2=p2/ (body[i][1]-body[i+1][1]);
        }  
     }
    g.drawImage(offscreen, 0, 0, null);
  } 


// PARAMETER 8 - kruznica
 if (parameter==8)   
  {
/*    if (pres==1)  // clear
     { go.setColor(Color.white);
       go.fillRect(0,0,d.width,poly*2); // x, y, width, height	
       go.setColor(Color.black);
     }
*/
    // suradnicovy system
    go.drawString("Y",polx-15,25);
    xP[0]=polx-4;yP[0]=14;
    xP[1]=polx;yP[1]=6;
    xP[2]=polx+4;yP[2]=14;
    go.fillPolygon(xP,yP,3);
    xP[0]=d.width-14;yP[0]=poly-4;
    xP[1]=d.width-6;yP[1]=poly;
    xP[2]=d.width-14;yP[2]=poly+4;
    go.fillPolygon(xP,yP,3);
    go.drawString("X",d.width-25,poly+15);

    go.drawLine(polx,10,polx,d.height-10);
    go.drawLine(10,poly,d.width-10,poly);

    if (mx==0) {mx=polx+60;my=poly+60;}
    int ip;
    double p1,p2,p3,p4;
    p1=mx;p2=my;
    p3=Math.sqrt(((p1-polx)*(p1-polx))+((p2-poly)*(p2-poly)));

    go.drawString("S[0,0]",polx+5,poly-5);
    go.drawString("B[0,r]",polx+5+(int)(p3),poly+22);
    go.drawString("B[r,0]",polx+5,poly-(int)(p3)-5);

    go.setColor(Color.blue);
    p4=otoc;
    go.drawLine(polx,poly,polx+(int)(Math.sin(p4/57)*p3),poly-(int)(Math.cos(p4/57)*p3));
    go.setColor(Color.black);

    ip=(int)(p3*2);
    go.drawArc((int)(d.width/2)-(int)(ip/2), (int)(d.height/2)-(int)(ip/2), ip,ip, 0, 360);
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 9 - elipsa
 if (parameter==9)   
  {
    if (pres==1)  // clear
     { go.setColor(Color.white);
       go.fillRect(0,0,d.width,poly*2); // 
       go.setColor(Color.black);
     }

    sursystem(go);  //suradnicova sustava

    if (ktory<4)
     { bod[ktory][0]=mx;  bod[ktory][1]=my; ktory=5;
     }

    int s1,s2,s3,s4,i1;
    i1=bod[1][1];
    if (bod[0][1]<bod[1][1]){bod[1][1]=(bod[0][1]-i1)+bod[0][1];}

    if (bod[2][0]>bod[0][0])
      {   s1=bod[0][0]-(int)((bod[2][0]-bod[0][0]));}
     else  { s1=bod[0][0]+(int)((bod[2][0]-bod[0][0]));}

    s2=bod[1][1];
    s3=Math.abs(2*(bod[2][0]-bod[0][0]));
    s4=2*(bod[0][1]-bod[1][1]);

    go.setColor(farba11);
    go.drawLine(25,bod[0][1],bod[0][0],bod[0][1]);
    go.drawString("Ys",10,bod[0][1]);
    go.drawLine(25,bod[1][1],bod[0][0],bod[1][1]);
    go.drawString("Ys+a",0,bod[1][1]);

    go.drawLine(bod[0][0],d.height-25,bod[0][0],bod[0][1]);
    go.drawString("Xs",bod[0][0],d.height-20);
    go.drawLine(bod[2][0],d.height-25,bod[2][0],bod[0][1]);
    go.drawString("Xs+b",bod[2][0]-10,d.height-20);

    go.setColor(Color.blue);
    go.drawLine(bod[0][0],bod[0][1],bod[0][0],bod[1][1]);
    go.drawString("a",bod[0][0],(int)((bod[0][1]+bod[1][1])/2));
    go.drawLine(bod[2][0],bod[0][1],bod[0][0],bod[0][1]);
    go.drawString("b",(int)((bod[0][0]+bod[2][0])/2),bod[0][1]);
    go.drawString("S[x,y]",bod[0][0]+3,bod[0][1]+20);



    go.setColor(Color.black);
    go.drawArc(s1,s2,s3,s4, 0, 360);

    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 10 - 4 a 8 susednost
 if (parameter==10)  
  {
    int xrozmer=3,yrozmer=3;
    double p1,p2;
    int pos1=10,pos2; // posun sipok v 8 smeroch;
    p1=pos1;p1=(pos1*pos1)/2;pos2=(int)(Math.sqrt(p1));

    sach(go,xrozmer,yrozmer,20,10,polx-20,d.height-30);
    
    sach(go,xrozmer,yrozmer,polx+20,10,d.width-20,d.height-30);

    int xposun=(int)(((polx-40)/xrozmer)/2);
    int yposun=(int)(((d.height-40)/yrozmer)/2);  // pol posunu
    

    int[][] dva = new int[2][2];
    dva[0][0]=20;   dva[0][1]=10;
    dva[1][0]=polx+20;   dva[1][1]=10;
    int number1=-10;
    //if (mx>20)&&(mx<xposun) {
    go.setColor(Color.green);
  //  go.drawString("mx="+mx+" my="+my+" dvaa10="+dva[1][0]+" dva22="+dva[1][1],50,50);
    if (((mx>dva[1][0]) && (mx<(dva[1][0]+xposun*2)))
        &&(my>dva[1][1]+yposun*4)&&(my<(dva[1][1]+yposun*6))) {
            go.fillRect(dva[1][0]+1,dva[1][1]+yposun*4+2,xposun*2,yposun*2);    
            number1=5;
        }
        else    
    if (((mx>dva[1][0]) && (mx<(dva[1][0]+xposun*2)))
        &&(my>dva[1][1])&&(my<(dva[1][1]+yposun*2))) {
            go.fillRect(dva[1][0]+1,dva[1][1]+1,xposun*2,yposun*2-1);    
            number1=3;
        } else
    if (((mx>dva[1][0]) && (mx<(dva[1][0]+xposun*2)))
        &&(my>dva[1][1]+yposun*2)&&(my<(dva[1][1]+yposun*4+1))) {
            go.fillRect(dva[1][0]+1,dva[1][1]+yposun*2+1,xposun*2,yposun*2);    
            number1=4;   
        } else
    if (((mx>dva[1][0]+xposun*4) && (mx<(dva[1][0]+xposun*6)))
        &&(my>dva[1][1])&&(my<(dva[1][1]+yposun*2))) {
            go.fillRect(dva[1][0]+xposun*4+3,dva[1][1]+1,xposun*2+1,yposun*2-1);    
            number1=1;
        }     else   
    
    if (((mx>dva[1][0]+xposun*4) && (mx<(dva[1][0]+xposun*6)))
        &&(my>dva[1][1]+yposun*4)&&(my<(dva[1][1]+yposun*6))) {
            go.fillRect(dva[1][0]+xposun*4+3,dva[1][1]+yposun*4+2,xposun*2+1,yposun*2);    
            number1=7;
        }   else           
for (i=0;i<2;i++) {        
    
    if (((mx>dva[i][0]+xposun*2) && (mx<(dva[i][0]+xposun*4)))
        &&(my>dva[i][1])&&(my<(dva[i][1]+yposun*2))) {
            go.fillRect(dva[i][0]+xposun*2+2,dva[i][1]+1,xposun*2,yposun*2-1);    
            number1=2; 
        }else
    if (((mx>dva[i][0]+xposun*2) && (mx<(dva[i][0]+xposun*4)))
        &&(my>dva[i][1]+yposun*4)&&(my<(dva[i][1]+yposun*6))) {
            go.fillRect(dva[i][0]+xposun*2+2,dva[i][1]+yposun*4+2,xposun*2,yposun*2);    
            number1=6;
        }    else    
    if (((mx>dva[i][0]) && (mx<(dva[i][0]+xposun*2)))
        &&(my>dva[i][1]+yposun*2)&&(my<(dva[i][1]+yposun*4+1))) {
            go.fillRect(dva[i][0]+1,dva[i][1]+yposun*2+1,xposun*2,yposun*2);    
            number1=4;
        }else
        
    if (((mx>dva[i][0]+xposun*4) && (mx<(dva[i][0]+xposun*6)))
        &&(my>dva[i][1]+yposun*2)&&(my<(dva[i][1]+yposun*4))) {
            go.fillRect(dva[i][0]+xposun*4+3,dva[i][1]+yposun*2+1,xposun*2+1,yposun*2);    
            number1=0;
        }        
       }
        //go.fillRect(dva[0][0]+xposun*3,dva[0][1]+yposun*3,xposun*2,yposun*2);    
    //}
 /*   if (((mx>dva[1][0]) && (mx<(dva[1][0]+xposun*2)))
        &&(my>dva[1][1]+yposun*2)&&(my<(dva[1][1]+yposun*4+1))) {
            go.fillRect(dva[1][0]+1,dva[1][1]+yposun*2+1,xposun*2,yposun*2);    
            number1=4;go.drawString("juraj",20,2);    
        }
   */     
        //go.fillRect(dva[1][0]+1,dva[1][1]+yposun*2+1,xposun*2,yposun*2);    
        
    if (number1 >-1)go.drawString(number1+"-sused",50,d.height-15);    
    
    go.setColor(Color.black);
    for (int i=0;i<2;i++)
     {
       go.drawString("P",(dva[i][0]+xposun*3)-3,(dva[i][1]+yposun*3)+5);
       go.drawString("0",(dva[i][0]+xposun*5)-3,(dva[i][1]+yposun*3)+5);
       go.drawString("4",(dva[i][0]+xposun)-3,(dva[i][1]+yposun*3)+5);
       go.drawString("2",(dva[i][0]+xposun*3)-3,(dva[i][1]+yposun)+5);
       go.drawString("1",(dva[i][0]+xposun*5)-3,(dva[i][1]+yposun)+5);
       go.drawString("3",(dva[i][0]+xposun)-3,(dva[i][1]+yposun)+5);
       go.drawString("6",(dva[i][0]+xposun*3)-3,(dva[i][1]+yposun*5)+5);
       go.drawString("7",(dva[i][0]+xposun*5)-3,(dva[i][1]+yposun*5)+5);
       go.drawString("5",(dva[i][0]+xposun)-3,(dva[i][1]+yposun*5)+5);
       sipka(go,pos1+dva[i][0]+xposun*3,dva[i][1]+yposun*3,dva[i][0]+xposun*5-pos1,dva[i][1]+yposun*3,6);// -->
       sipka(go,(dva[i][0]+xposun*3)-pos1,dva[i][1]+yposun*3,dva[i][0]+xposun+pos1,dva[i][1]+yposun*3,6);  // <--
       sipka(go,dva[i][0]+xposun*3,dva[i][1]+yposun*3-pos1,dva[i][0]+xposun*3,dva[i][1]+yposun+pos1,6);  // /\
       sipka(go,dva[i][0]+xposun*3,dva[i][1]+yposun*3+pos1,dva[i][0]+xposun*3,dva[i][1]+yposun*5-pos1,6); // \/
     }
    //sikme sipky
    int i=1;
    sipka(go,dva[i][0]+xposun*3+pos2,dva[i][1]+yposun*3-pos2,(dva[i][0]+xposun*5)-pos2,(dva[i][1]+yposun)+pos2,6); // 1 pravo hore
    sipka(go,dva[i][0]+xposun*3-pos2,dva[i][1]+yposun*3-pos2,(dva[i][0]+xposun)+pos2,(dva[i][1]+yposun)+pos2,6); // 3  lavo hore
    sipka(go,dva[i][0]+xposun*3+pos2,dva[i][1]+yposun*3+pos2,(dva[i][0]+xposun*5)-pos2,(dva[i][1]+yposun*5)-pos2,6); // 7 pravo dole
    sipka(go,dva[i][0]+xposun*3-pos2,dva[i][1]+yposun*3+pos2,(dva[i][0]+xposun)+pos2,(dva[i][1]+yposun*5)-pos2,6); // 5 lavo dole
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 11 - vyplnanie oblasti farbou zadaneho vnut. bodu
 if (parameter==11)  
  { 
    // go.setColor(Color.black);go.fillRect(0,0,13,13);
    if (hodnota==0) 
     {
      for (int i=0;i<30;i++)
       {
	 for (int j=0;j<20;j++)
          {
            if (polebod[i][j]<40)
	     {
               go.setColor(Color.white);
               go.fillRect(i*15,j*15,13,13);}
               go.setColor(Color.black);
               if (polebod[i][j]>40)
                { go.fillRect(i*15,j*15,13,13);
                }
             }
          }
      }
    if ((hodnota==1))
     {
       if (polebod[(int)(mx/15)][(int)(my/15)]>0) 
        { hodnota=0;
        } 
        else 
         {
           polebod[(int)(mx/15)][(int)(my/15)]=1; 
           go.setColor(Color.green);
           go.fillRect(((int)(mx/15))*15,(int)(my/15)*15,13,13);
           go.setColor(Color.black);
           // go.drawString(" Bodx je : "+(int)(mx/15),10,30);
           // go.drawString(" Body je : "+(int)(my/15),10,50);
           testok=true;
        }
     }

    // ak su splnene vsetky podmienky kresli sachovnicu
    if ((hodnota>0)&&(testok))
     { 
       hodnota++; // kolka iteracia
       if (hodnota>60){hodnota=60;}

       // X x Y prezri
       for (int i=0;i<30;i++) 
        {
          for (int j=0;j<30;j++) 
           {

               if (polebod[i][j]==0)
                { go.setColor(Color.white);
                  go.fillRect(i*15,(j)*15,13,13);
                }
               if (polebod[i][j]==100)
                { go.setColor(Color.black);
                  go.fillRect(i*15,(j)*15,13,13);
                }

             if (polebod[i][j]==hodnota-1) 
              {
	        go.setColor(farba10);
                if (i-1>0) 
                 { if (polebod[i-1][j]==0)
                    { polebod[i-1][j]=hodnota;
                      // go.drawString(""+hodnota,i*15,j*15);tr++;
                      go.fillRect((i-1)*15,j*15,13,13);
                    }
                 }
                if (i+1<30) 
                 { if (polebod[i+1][j]==0)
                    { polebod[i+1][j]=hodnota;
                      // go.drawString(""+hodnota,i*15,j*15);tr++;
		      go.fillRect((i+1)*15,j*15,13,13);
                    }
                 }
                if (j-1>0) 
                 { if (polebod[i][j-1]==0)
                    { polebod[i][j-1]=hodnota;
                      // go.drawString(""+hodnota,i*15,j*15);tr++;
                      go.fillRect(i*15,(j-1)*15,13,13);
                    }
                 }
                if (j+1<30) 
                 { if (polebod[i][j+1]==0)
                    { polebod[i][j+1]=hodnota;
                      // go.drawString(""+hodnota,i*15,j*15);tr++;
                      go.fillRect(i*15,(j+1)*15,13,13);
                    }
                 }
             }
 
                 if ((polebod[i][j]>0)&&(polebod[i][j]<hodnota))
                { go.setColor(farba12);
                  go.fillRect(i*15,j*15,13,13);
                }
          }
 	}
      // if (tr==0) {testok=false;}
      if (hodnota==1000) { hodnota=0;}
     }
  g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 12 - alias
 if (parameter==12)  
  {
    for (int i=1;i<30;i++) {go.drawLine(50+i*10,20,200,150);}
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 13 - scanline
 if (parameter==13)  
  { 
    int px;
    double p1,p2,p3,p4,p5,p6;
    go.drawLine(polx+(int)(polx/2),okraj,polx+(int)(polx/2),d.height-okraj);

    // editacia presunu bodu
    if ((ktory>0)&&(mx>0)&&(my>0)&&(mx<polx+(int)(polx/2))) 
     { bod[ktory-1][0]=mx;bod[ktory-1][1]=my;
       bod[7][0]=bod[0][0];bod[7][1]=bod[0][1];
     }

    // vytvorime body polygonu
    for (int i=0;i<7;i++){xP[i]=bod[i][0];yP[i]=bod[i][1];}
    go.setColor(farba12);
    go.fillPolygon(xP,yP,7); // vyplnime polygon
    go.setColor(Color.black);

    // olemujeme polygon 
    for (int i=0;i<7;i++) { go.drawLine(bod[i][0],bod[i][1],bod[i+1][0],bod[i+1][1]);  }

    // urcime priesecniky scan-line usecky s mnohouholnikom
    if (mx>polx+(int)(polx/2))
     { mx1=mx;my1=my;
       for (int i=0;i<7;i++)
        {
          if ((bod[i][1]>my1)&&(bod[i+1][1]<my1)||(bod[i][1]<my1)&&(bod[i+1][1]>my1))
           { 
             // px=(bod[i][0]+bod[i+1][0])/2;
             p1=bod[i][0]-bod[i+1][0];
             p2=bod[i][1]-bod[i+1][1];
             p3=my-bod[i][1];
             p4=p3/p2;
             p5=bod[i][0]+(int)(p4*p1);
             px=(int)(p5);
             go.fillOval(px-3,my1-3,6,6);
           }
         }
      }

    // pomocna vertikalna usecka 
    go.drawLine(okraj,my,d.width-okraj,my);

    g.drawImage(offscreen, 0, 0, null);
  }

// PARAMETER 14 - alias2
 if (parameter==14) 
  {
    int posunx=30,posuny=10;
    for (int i=1;i<6;i++)
     { go.drawLine(30,(i*30),150,(i*30));
       go.drawLine((i*30),30,(i*30),150);
       go.fillOval(posunx+(i*30)-45,posuny+125,25,25);
       go.fillOval(posunx+(i*30)-45,posuny+160-(i*30),25,25);
     } 
    g.drawImage(offscreen, 0, 0, null);
 }


// PARAMETER 15 - transformacia otacanim
 if (parameter==15) 
  {
     if ((mx<1)||(my<1)) { mx=100;my=100;} //pre pripade ze zadany bod kruznice je za oknom

     // stred kruznice dame rovny [polx,poly]
     int stredx=polx,stredy=poly; 
     double p1,p2,p3;  // pomocne premenne
     int r; // urcime polomer r

     // y pytagorovej vety vypocitame polomer r 
     p1=mx-stredx;p1=p1*p1;
     p2=my-stredy;p2=p2*p2;
     p3=Math.sqrt(p1+p2);
     r=(int)(p3);

     double pi=3.141592654;
     int poc_iter=12; // pocet bodov kruznice
     if (typ==1) {poc_iter=8;}
     if (typ==2) {poc_iter=12;}
     if (typ==3) {poc_iter=16;}
     if (typ==4) {poc_iter=24;}
     if (typ==5) {poc_iter=32;}
     if (typ==6) {poc_iter=64;}
     if (typ==7) {poc_iter=360;}

     p1=poc_iter;
     double alfa=(2*pi)/p1; //uhol otocenia

     // uhol otacania alfa je z intervalu 0 po 360 stupnov
     // co v radianoch je od  0 po (2*pi).
     // tento interval delime na poc_iter
     // napr. ak na 10 intervalov tak alfa bude 36 stupna alebo 0.62831853 radianov

     // zac. body
     double x1=mx-polx; 
     double y1=my-poly;

     double x2,y2; 

     for (int i=0;i<poc_iter;i++)
      { 
       x2=x1*Math.cos(alfa) - y1*Math.sin(alfa);
       y2=x1*Math.sin(alfa) + y1*Math.cos(alfa);
       go.drawLine(polx+(int)(x1),poly+(int)(y1),polx+(int)(x2),poly+(int)(y2));
       x1=x2;y1=y2;
      }
     go.fillOval(stredx-2,stredy-2,4,4);
     go.drawString("S=[x1,y1]",stredx+2,stredy-2);
     go.drawString("pocet bodov kruznice",20,20);

    g.drawImage(offscreen, 0, 0, null);
}

// PARAMETER 19 -  smernica m
 if (parameter==19) 
  {
    Color f10 = new Color(fr,fg,fb);
    int pom1,pom2,riad;
    go.setColor(f10);
    if (!help) {
    
    xP[0]=polx;yP[0]=poly;
    if ((mx>polx)&&(my<poly)&&((mx-polx)<(poly-my))) // pravo hore I
     { 
       xP[1]=polx;yP[1]=okraj;
       xP[2]=polx+poly-okraj;yP[2]=okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx>polx)&&(my<poly)&&((mx-polx)>(poly-my))) // pravo hore II
     { 
       xP[1]=polx+polx-okraj;yP[1]=poly;
       xP[2]=polx+polx-okraj;yP[2]=okraj;
       xP[3]=polx+poly-okraj;yP[3]=okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx>polx)&&(my>poly)&&((mx-polx)<(my-poly))) // pravo dole I
     { 
       xP[1]=polx;yP[1]=d.height-okraj;
       xP[2]=polx+poly-okraj;yP[2]=d.height-okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx>polx)&&(my>poly)&&((mx-polx)>(my-poly))) // pravo dole II
     { 
       xP[1]=polx+polx-okraj;yP[1]=poly;
       xP[2]=polx+polx-okraj;yP[2]=d.height-okraj;
       xP[3]=polx+poly-okraj;yP[3]=d.height-okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx<polx)&&(my<poly)&&((polx-mx)<(poly-my))) // lavo hore I
     { 
       xP[1]=polx;yP[1]=okraj;
       xP[2]=polx-(poly-okraj);yP[2]=okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx<polx)&&(my<poly)&&((polx-mx)>(poly-my))) // lavo hore II
     { 
       xP[1]=polx-(polx-okraj);yP[1]=poly;
       xP[2]=polx-(polx-okraj);yP[2]=okraj;
       xP[3]=polx-(poly-okraj);yP[3]=okraj;
       go.fillPolygon(xP,yP,4);
     }
    if ((mx<polx)&&(my>poly)&&((polx-mx)<(my-poly))) // lavo dole I
     { 
       xP[1]=polx;yP[1]=d.height-okraj;
       xP[2]=polx-(poly-okraj);yP[2]=d.height-okraj;
       go.fillPolygon(xP,yP,3);
     }
    if ((mx<polx)&&(my>poly)&&((polx-mx)>(my-poly))) // lavo dole II
     { 
       xP[1]=polx-(polx-okraj);yP[1]=poly;
       xP[2]=polx-(polx-okraj);yP[2]=d.height-okraj;
       xP[3]=polx-(poly-okraj);yP[3]=d.height-okraj;
       go.fillPolygon(xP,yP,4);
     }
    go.setColor(Color.black);

    if (aktivkod) 
     { go.drawString("r="+fr,10,20);
       go.drawString("g="+fg,10,40);
       go.drawString("b="+fb,10,60); 
     }
    
    go.drawLine(polx,okraj,polx,d.height-okraj);
    go.drawLine(okraj,poly,d.width-okraj,poly);
    go.drawLine(polx-(poly-okraj),okraj,polx+(poly-okraj),d.height-okraj);
    go.drawLine(polx+(poly-okraj),okraj,polx-(poly-okraj),d.height-okraj);

    go.drawString(" m > 1 ",polx+10,(int)(poly/2)-20);
    go.drawString(" m < -1 ",polx-50,(int)(poly/2)-20);
    go.drawString(" m < -1 ",polx+10,poly+(int)(poly/2)+20);
    go.drawString(" m > 1 ",polx-50,poly+(int)(poly/2)+20);

    go.drawString(" 0 < m < 1 ",polx+30,poly-10);
    go.drawString(" -1 < m < 0 ",polx-100,poly-10);
    go.drawString(" -1 < m < 0 ",polx+25,poly+20);
    go.drawString(" 0 < m < 1 ",polx-95,poly+20);
    
    go.drawLine(polx,poly,mx,my);
    go.fillOval(mx-3,my-3,6,6);
    go.fillOval(polx-3,poly-3,6,6);
    } else {
    //help_for_applet
    go.drawString("juraj"+help_for_applet,55,55);
    pom2=help_for_applet.indexOf("/");
    String stri;
    riad=30;
    while (pom2>=0) {
        pom1=help_for_applet.indexOf("/",pom2+1);
        stri=help_for_applet.substring(2,21);pom2=pom1;
        go.drawString("cislo je "+stri,100,riad);riad=riad+30;
        //go.drawString("cislo je "+pom2,100,150);//riad+=30;
    }
    }
    
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 20 - rastrovy rozklad kruznice 20 
 if (parameter==20) 
  { 
    double b1=0,b2=0,b3=0,b4=0;
    
    double p1,p2;
    if (mx>0)
     {
       p1=(mx-polx)*(mx-polx);
       p2=(my-poly)*(my-poly);
       v1=(int)(Math.sqrt(p1+p2));
      }
    v2=(int)(v1/2); // polomer kruznice

    if (pres==1)  
     { go.setColor(Color.white);
       go.fillRect(0,0,d.width,poly*2); // x, y, width, height	
       go.setColor(Color.black);
     }
    sipka(go,polx,d.height-10,polx,10,6);
    go.drawString("y",polx+5,30);
    sipka(go,10,poly,d.width-10,poly,6);
    go.drawString("x",d.width-35,poly+15);

    sipka(go,polx-(poly-10),10,polx+(poly-10),d.height-10,6);
    go.drawString("x=-y",polx+(poly-10)-15,d.height-35);
    sipka(go,polx-(poly-10),d.height-10,polx+(poly-10),10,6);
    go.drawString("x=y",polx+(poly-10)-15,10+25);

    go.drawArc(polx-v2,poly-v2,v1,v1,0,360);
    if ((my>poly-1)&&(my<poly+v2+1)) 
     { b2=my-poly;b4=v2;
       b3=Math.acos(b2/b4);
       b3=b3*(-1);
       b1=v2*Math.sin(b3);
     }
    else 
     if ((my<poly)&&(my>poly-v2-1))
      { b2=poly-my;b4=v2;
        b3=Math.acos(b2/b4);
        b1=v2*Math.sin(b3);
      }
     else 
      { b1=v2*Math.cos(0.4);
        b2=v2*Math.sin(0.4);
      } 
    go.fillOval((int)(polx+b1)-3,(int)(poly+b2)-3,6,6);
    go.drawString("[x,y]",(int)(polx+b1+5),(int)(poly+b2-5));

    go.fillOval((int)(polx-b1)-3,(int)(poly+b2)-3,6,6);
    go.drawString("[-x,y]",(int)(polx+5-b1),(int)(poly+b2-5));

    go.fillOval((int)(polx+b1)-3,(int)(poly-b2)-3,6,6);
    go.drawString("[x,-y]",(int)(polx+b1+5),(int)(poly-b2-5));

    go.fillOval((int)(polx-b1)-3,(int)(poly-b2)-3,6,6);
    go.drawString("[-x,-y]",(int)(polx+5-b1),(int)(poly-b2-5));

    go.fillOval((int)(polx+b2)-3,(int)(poly+b1)-3,6,6);
    go.drawString("[y,x]",(int)(polx+b2+5),(int)(poly+b1-5));

    go.fillOval((int)(polx-b2)-3,(int)(poly+b1)-3,6,6);
    go.drawString("[-y,x]",(int)(polx+5-b2),(int)(poly+b1-5));

    go.fillOval((int)(polx+b2)-3,(int)(poly-b1)-3,6,6);
    go.drawString("[y,-x]",(int)(polx+b2+5),(int)(poly-b1-5));

    go.fillOval((int)(polx-b2)-3,(int)(poly-b1)-3,6,6);
    go.drawString("[-y,-x]",(int)(polx+5-b2),(int)(poly-b1-5));
    g.drawImage(offscreen, 0, 0, null);
  }


// PARAMETER 21 - rastrovy rozklad kruznice
 if (parameter==21) 
  { 
    int polomer=15;
    int size=5;
    int d1 = 3 - (2 * polomer);
    int x = 0,i1=polx/size,i2=poly/size;
    int y = polomer;
    boolean rov=true;

// tj. pre jednu osminu
while (rov)
 {
if (x>=y){rov=false;}
if (d1 < 0) 
  {d1 = d1 + (4 * x) + 6;}

 else
   { d1 = d1 + 4 * (x - y) + 10;
     y = y - 1;
    }
//   go.fillOval(polx+x,poly+y,2,2);
//   go.fillOval(polx-x,poly+y,2,2);
//   go.fillOval(polx+x,poly-y,2,2);
//   go.fillOval(polx-x,poly-y,2,2);

   go.fillRect((i1+x)*size,(i2+y)*size,size,size);
   go.fillRect((i1+x)*size,(i2-y)*size,size,size);

   go.fillRect((i1-x)*size,(i2+y)*size,size,size);
   go.fillRect((i1-x)*size,(i2-y)*size,size,size);

   go.fillRect((i1+y)*size,(i2+x)*size,size,size);
   go.fillRect((i1+y)*size,(i2-x)*size,size,size);
   go.fillRect((i1-y)*size,(i2+x)*size,size,size);
   go.fillRect((i1-y)*size,(i2-x)*size,size,size);

    x++;
    g.drawImage(offscreen, 0, 0, null);
  }
 } 


// PARAMETER 22 - tabulka hran
 if (parameter==22) 
  { 
    int vyska=0,min=100,predch=100;;
    
    // pre urcenie hran 
    int[] ph = new int[10];
    for (int i=0;i<10;i++){ph[i]=0;}

    // editacia presunu bodu
    if ((ktory>0)&&(mx>0)&&(my>0)&&(mx<polx+1)) 
     { bod[ktory-1][0]=(int)(mx/vel)*vel;bod[ktory-1][1]=(int)(my/vel)*vel;
       bod[8][0]=bod[0][0];bod[8][1]=bod[0][1];
     }
    
    // najprv najdeme najmensi bod so y suradnicou
    for (int j=0;j<8;j++)
     {
       if (bod[j][1]<min) {min=bod[j][1];}
     }

    // body mnohouholnika   
    Color farba20 = new Color(170,170,170);
    go.setColor(farba20); 

    for (int j=0;j<8;j++)
     { 
       go.fillOval(bod[j][0]-2,bod[j][1]-2,4,4);
       go.drawString(""+j,bod[j][0]+1,bod[j][1]+5);
     }
    go.setColor(Color.black); 

    // suradnice
    sipka(go,15,d.height-35,15,15,6);
    sipka(go,15,d.height-35,polx-15,d.height-35,6);
    go.drawString("x="+(int)((mx/vel)-1),30,d.height-15);
    go.drawString("y="+(int)(14-(my/vel)),100,d.height-15);

    for (int i=0;i<8;i++)
     { go.drawLine(Math.round((bod[i][0])/vel)*vel,Math.round((bod[i][1]/vel))*vel,
                   Math.round((bod[i+1][0])/vel)*vel,Math.round((bod[i+1][1]/vel))*vel);
       go.drawString(""+i,(int)((bod[i][0]+bod[i+1][0])/2),(int)((bod[i][1]+bod[i+1][1])/2));
       //go.drawString("vyska = "+vyska,polx+20,d.height-20);
     } 
     go.drawLine(polx,0,polx,d.height);
     
    // test na prienik
    if (mx>polx) 
     { 
       // skenovacia usecka
       go.drawLine(10,my,polx,my);
      
      int poci1=0;

       for (int i=0;i<8;i++)
        {
          if (((bod[i][1]>my)&&(bod[i+1][1]<my))||((bod[i][1]<my)&&(bod[i+1][1]>my)))
           {  poci1=poci1+30; 
              go.drawString(" "+i,polx+poci1,my);

           }
        }
     }
    if (mx<polx) 
     {
       for (int i1=0;i1<15;i1++)
        { int poci=0;
        for (int i=0;i<8;i++)
         {
           if ((bod[i][1]==(i1*vel))&&(ph[i]==0))
            { poci=poci+30;
              go.drawString(""+i,polx+poci,20+(i1*15));
              ph[i]=1;
               if (i>0)
                {
                   if (ph[i-1]==0)
               { poci=poci+30;
                 go.drawString(""+(i-1),polx+poci,20+(i1*15));
                 ph[i-1]=1;
               }
                 }
            }
         }
        }
     }

    g.drawImage(offscreen, 0, 0, null);

  }

 if (parameter==28)   
  {
/*    if (pres==1)  // clear
     { go.setColor(Color.white);
       go.fillRect(0,0,d.width,poly*2); // x, y, width, height	
       go.setColor(Color.black);
     }
*/

    sursystem(go);  //suradnicova sustava

    if (ktory<4)
     { bod[ktory][0]=mx;  bod[ktory][1]=my; ktory=5;
     }

    int s1,s2,s3,s4,i1;
    i1=bod[1][1];
    if (bod[0][1]<bod[1][1]){bod[1][1]=(bod[0][1]-i1)+bod[0][1];}

    /*if (bod[2][0]>bod[0][0])
      {   s1=bod[0][0]-(int)((bod[2][0]-bod[0][0]));}
     else  { s1=bod[0][0]+(int)((bod[2][0]-bod[0][0]));}
*/
    go.setColor(farba11);
    go.drawLine(25,bod[0][1],bod[0][0],bod[0][1]);
    go.drawString("y1",10,bod[0][1]+5);
    go.drawLine(25,bod[1][1],bod[1][0],bod[1][1]);
    go.drawString("y2",10,bod[1][1]+5);

    go.drawLine(bod[0][0],d.height-25,bod[0][0],bod[0][1]);
    go.drawString("x1",bod[0][0]-5,d.height-15);
    go.drawLine(bod[1][0],d.height-25,bod[1][0],bod[1][1]);
    go.drawString("x2",bod[1][0]-5,d.height-15);

    go.setColor(Color.blue);
    go.drawLine(bod[1][0],bod[1][1],bod[0][0],bod[0][1]);
    go.fillOval(bod[1][0]-2,bod[1][1]-2,4,4);
    go.fillOval(bod[0][0]-2,bod[0][1]-2,4,4);


    g.drawImage(offscreen, 0, 0, null);
  }

// PARAMETER 29 - bresenhamov alg pre usecku
 if (parameter==29) 
  {

    // nakresli sachovnicu
    for ( int i=0;(i<(int)(d.width/raster)+1);i++)
     { go.drawLine((i*raster),0,(i*raster),d.width); // I zvislo
       go.drawString("Yi+"+i,(i*raster)-5,d.height-30);
     }
    for ( int i=0;(i<(int)(d.height/raster)+1);i++)
     { go.drawLine(0,d.height-(i*raster),d.width,d.height-(i*raster)); // - vodorov.
       go.drawString("Xi+"+i,30,d.height-(i*raster)+5);
     }

     int polo=(int)(raster/2);

     go.fillOval(raster-polo,(d.height-raster)-polo,2*polo,2*polo);

     go.drawString("A",raster-polo,(d.height-raster)-polo);
     go.drawString("B",2*raster-polo,(d.height-raster*2)-polo);
     go.drawString("C",2*raster-polo,(d.height-raster)-polo);

     go.drawLine(mx,my,raster,(d.height-raster)); // usecka

     // test ci priamka pretina usecku AB a ktory z bodov je blizsie k priesecniku
     go.drawString("velkost rastra ="+raster,d.width-150,20);
     
     go.drawString(" y = mx +b",(int)((mx+raster)/2),(int)((my+(d.height-raster))/2));
     int pi1=mx-(raster);
     int pi2=(d.height-raster)-my;
     int pomery=(d.height-my)/raster;
     int pomerx=mx/raster;
     
     
     go.drawString("111 "+pomery,150,150);
     if ((pi1>pi2)&&(pi2>0))  // tak pretina usecku AB
          { 
            if ((pi2*2)>pi1) // bod B je blizsie priesecniku
             { go.fillOval(2*raster-polo,(d.height-raster*2)-polo,2*polo,2*polo);
               go.setColor(Color.cyan);
               go.fillOval(2*raster-polo,(d.height-raster)-polo,2*polo,2*polo);
               go.setColor(Color.black);
               go.fillOval(3*raster-polo,(d.height-raster*3)-polo,2*polo,2*polo);
               go.setColor(Color.cyan);
               
              }
             else { 
             	for (int i=1;i<pomerx;i++)
             	 { go.fillOval(i*raster-polo,(d.height-raster*2)-polo,2*polo,2*polo);
                   go.setColor(Color.cyan);
             	 }
             	
             	
               go.fillOval(2*raster-polo,(d.height-raster)-polo,2*polo,2*polo);
               go.setColor(Color.cyan);
               go.fillOval(2*raster-polo,(d.height-raster*2)-polo,2*polo,2*polo);
               go.setColor(Color.black);
                  } 
          }
    g.drawImage(offscreen, 0, 0, null);
  }

// PARAMETER 30 - phong
 if (parameter==30) 
   {

    SpecIndex = 9 *(int)(Math.random()*100);
    Ypos = 50+(int)(Math.random()*100);
    Xpos = 50+(int)(Math.random()*100);
    Kd = 0+(int)(Math.random());
    Ks = 1+(int)(Math.random());
    
//  for (i=0; i<4; i++) {
    int i=0;

   // for(j=0; j<5; j++) {
    //int j=0;
      ShadeSphere(Kd, Ks, SpecIndex, Xpos, Ypos, 50);
    //  Kd += 0.25;
      //Ks -= 0.25;
      //Xpos += 110;
    //};
    //Ypos += 110;
    SpecIndex = SpecIndex * 2;
    go.drawString("refwerw",50,50);
       go.drawImage(img1, 10, 10, this);
       go.drawString("refwerw",150,150);
          g.drawImage(offscreen, 0, 0, null); 
  //};

    }
// KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC
// KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC
// KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC KONIEC
 }

 public void update(Graphics g) 
  {
     synchronized(this) {}
     paint(g);
  }

 public void start() { timer = new Thread(this); timer.start(); }

 public void stop() {  timer = null; }

 public void run() 
  {
    Thread me = Thread.currentThread();
        while (timer == me) {
            try {
                otoc++;
                if (otoc>360) {otoc=0;}
                //if (pres!=2) {pres=0;}
                
                Thread.currentThread().sleep(cas);
            } catch (InterruptedException e) {
            }
           if (parameter==1) 
                { if ((mazat>0)||(akcia>0)) {cas=50;repaint();}
                  else {cas=100;} 
                }
           if (parameter==11) {repaint();}
           if (parameter==8) {repaint();}
        }

  }

 public boolean action(Event evt, Object arg) 
  {
    if (evt.target instanceof Button) 
     {
      if (parameter==1) { prekr=2; mazat=1;   repaint();}
      if (parameter==11) { vymaz1(); hodnota=0; tr=0;}
     }
    return true;
  }

 public boolean keyDown(Event evt, int key)
  {
    k=key;

    if (parameter==2)
     {
       if ((k==49)&&(raster<20)){raster++;}
       if ((k==50)&&(raster>2)){raster--;}
       repaint(); 
     }

    if ((parameter==6)||(parameter==29))
         {
       if ((k==49)&&(raster<100)){raster++;}
       if ((k==50)&&(raster>20)){raster--;}
       repaint(); 
     }

    if ((parameter==5)||(parameter==19))
     {
       if (k==49){fr++;}if (k==50){fr--;}
       if (k==51){fg++;}if (k==52){fg--;}
       if (k==53){fb++;}if (k==54){fb--;}
       if (fr>255){fr=255;}if (fr<1){fr=1;}
       if (fg>255){fg=255;}if (fg<1){fg=1;}
       if (fb>255){fb=255;}if (fb<1){fb=1;}
       aktivkod=true;
       repaint(); 
     }

    if (k==49) {
        if (help) {help=false; }
            else
       { help=true;}
     }
    // 
    return true;
  }  
 
 public boolean mouseDown(Event evt, int x, int y)
  {
    pres=1;
    ktory=0;
    mx=x;my=y;
    
    if (parameter==1) {
        bod1[start][0]=mx;  bod1[start][1]=my;
        start++;
      //  if (evt==2) {akcia=1;}
        switch (evt.clickCount) {
//      case 1:  // single-click
        case 2:  {akcia=1;}
      //case 3:  // triple-click
      //....
    }

    }
    
    if (hodnota==0){hodnota=1;}
    if ((parameter==9) || (parameter==28))
     { // najdenie najblizsieho bodu
       int p1= (int)(Math.sqrt(((bod[0][0]-mx)*(bod[0][0]-mx))+((bod[0][1]-my)*(bod[0][1]-my))));
       double min=p1;ktory=0;
       int p2= (int)(Math.sqrt(((bod[1][0]-mx)*(bod[1][0]-mx))+((bod[1][1]-my)*(bod[1][1]-my))));
       int p3= (int)(Math.sqrt(((bod[2][0]-mx)*(bod[2][0]-mx))+((bod[2][1]-my)*(bod[2][1]-my))));
       if (p2<p1) {min=p2;ktory=1;}
       if (p3<min) {min=p3;ktory=2;}
     }
    if (parameter==13)
     { // najdenie najblizsieho bodu
       int p1= (int)(Math.sqrt(((bod[0][0]-mx)*(bod[0][0]-mx))+((bod[0][1]-my)*(bod[0][1]-my))));
       double min=p1;ktory=1;

       for (int i=1;i<7;i++)
        {
          p1= (int)(Math.sqrt(((bod[i][0]-mx)*(bod[i][0]-mx))+((bod[i][1]-my)*(bod[i][1]-my))));
          if (min>p1) {min=p1;ktory=i+1;}
        }
 
     }
    if (parameter==22)
     { // najdenie najblizsieho bodu
       int p1= (int)(Math.sqrt(((bod[0][0]-mx)*(bod[0][0]-mx))+((bod[0][1]-my)*(bod[0][1]-my))));
       double min=p1;ktory=1;

       for (int i=1;i<8;i++)
        {
          p1= (int)(Math.sqrt(((bod[i][0]-mx)*(bod[i][0]-mx))+((bod[i][1]-my)*(bod[i][1]-my))));
          if (min>p1) {min=p1;ktory=i+1;}
        }
 
     }

    repaint();
    return true;
  }

 public synchronized void mousePressed(MouseEvent e) 
  {
    e.consume();
    mx = e.getX();
    my = e.getY();

    repaint();
  }

 public void mouseDragged(MouseEvent e) 
  {
  }

 public void mouseMoved(MouseEvent e) 
  {
    mx = e.getX();
    my = e.getY();
    e.consume();
    // repaint();
  }

 public String getAppletInfo() 
  {
    return "raster.java by Juraj Stugel 23/3/2000";
  }

}
