import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.Math;

public class scan extends Applet implements Runnable,MouseMotionListener{
Thread timer;
Image offscreen;
Dimension offscreensize;
Graphics gg;
int cas=200,p;
double pre=0;
int []x1={70,220,220,70};
int []x2={145,200,90};
int []y1={50,50,150,150};
int []y2={40,170,170};
int []obdz={50,50,70,70};
int []trojz={60,70,70};

Polygon obd=new Polygon(x1,y1,4);
Polygon troj=new Polygon(x2,y2,3);


public void init(){
addMouseMotionListener(this);
setBackground(Color.white);
} 

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

public void run(){
Thread me=Thread.currentThread();
while(timer==me){
 try{
   Thread.currentThread().sleep(cas);
   pre+=0.05;
   }
 catch (InterruptedException e){}
 repaint();
 }
}

public double umocni(int d){return d*d;}

/*troj. vypocitam polygon(trojuholnik)tvoriaci
1.vrchol z troj. y-je vyska obd a x2,x3 su vypocitana pomocou podobnosti trojuhol-
nikov.Pozor troj. je rovnoramenny*/  
public double trojx1(int y){
double pom;
 pom=(umocni(troj.ypoints[0]-y))*((umocni(troj.xpoints[0]-troj.xpoints[2]))+(umocni(troj.ypoints[0]-troj.ypoints[2])))-(umocni(troj.ypoints[0]-troj.ypoints[2])*umocni(troj.ypoints[0]-y));
 if((troj.ypoints[0]-troj.ypoints[2])==0) return troj.xpoints[0]-(Math.sqrt(pom))/0.1;   
 return troj.xpoints[0]-(Math.sqrt(pom)/(troj.ypoints[0]-troj.ypoints[2]));   
}

public double trojx2(int y){
double pom;
 pom=(umocni(troj.ypoints[0]-y))*((umocni(troj.xpoints[0]-troj.xpoints[2]))+(umocni(troj.ypoints[0]-troj.ypoints[2])))-(umocni(troj.ypoints[0]-troj.ypoints[2])*umocni(troj.ypoints[0]-y));
 if((troj.ypoints[0]-troj.ypoints[1])==0) return troj.xpoints[0]+(Math.sqrt(pom))/0.1;   
 return troj.xpoints[0]+(Math.sqrt(pom)/(troj.ypoints[0]-troj.ypoints[1]));   
}

public void rozhodni(){
if(obd.ypoints[0]<obd.ypoints[3]) return;
int pom;
pom=obd.ypoints[0];
obd.ypoints[0]=obd.ypoints[3];
obd.ypoints[1]=obd.ypoints[3];
obd.ypoints[2]=pom;
obd.ypoints[3]=pom;
}

public double koef(double x1,double x2,double y1,double y2){
if((y1-y2)==0) return (x1-x2)/0.1;
return (x1-x2)/(y1-y2);
}

public void riadok(Graphics gg,int y){
int xt1,xt2;
double tz=koef(trojz[2],trojz[0],troj.ypoints[2],troj.ypoints[0])*(y-troj.ypoints[0])+trojz[0];
double oz=koef(obdz[3],obdz[0],obd.ypoints[3],obd.ypoints[0])*(y-obd.ypoints[0])+obdz[0];

 xt1=(int)trojx1(y);
 xt2=(int)trojx2(y);

if(obd.xpoints[0]<xt1){
 gg.setColor(Color.red);
 gg.drawLine(obd.xpoints[0],y,xt1,y);
 if(tz<oz){
  gg.drawLine(xt1,y,obd.xpoints[2],y);

  }else{
  gg.drawLine(xt2,y,obd.xpoints[2],y);
  gg.setColor(Color.blue);
  gg.drawLine(xt1,y,xt2,y);
  }
 }
else{
/*   Pre pripad,ze by 1. nebol obdlznik....  
     gg.setColor(Color.blue);
     gg.drawLine(xt1,y,obd.xpoints[0],y);
     if(tz>oz){
     gg.drawLine(obd.xpoints[0],y,xt2,y);
     gg.setColor(Color.red);
     gg.drawLine(
     }else{
      gg.drawLine(xt2,y,obd.xpoints[2],y);
      gg.setColor(Color.blue);
      gg.drawLine(xt1,y,xt2,y);       */
 
 }
}

public int prepocitaj(Graphics gg){
int skonci,zacni,i;

//tu sa zacina pozor

//rozhodni();
if (troj.ypoints[0]<obd.ypoints[0]) {
             if(troj.ypoints[2]<obd.ypoints[0])return 1;
                  int x[]={troj.xpoints[0],(int)trojx1(obd.ypoints[0]),(int)trojx2(obd.ypoints[0])};
                  int y[]={troj.ypoints[0],obd.ypoints[0],obd.ypoints[0]};
                  gg.setColor(Color.blue);
		  gg.fillPolygon(new Polygon(x,y,3));
//Ak su 2 samostatne objekty
                  zacni=obd.ypoints[0];
		 }
else{
if(troj.ypoints[0]>obd.ypoints[3])return 1;
 int []y={obd.ypoints[0],obd.ypoints[1],troj.ypoints[0],troj.ypoints[0]};
 gg.setColor(Color.red);
 gg.fillPolygon(new Polygon(obd.xpoints,y,4));
 zacni=troj.ypoints[0];
 }
i=zacni;
if(troj.ypoints[2]<obd.ypoints[3])skonci=troj.ypoints[2];else skonci=obd.ypoints[3];
while(i<skonci){
 riadok(gg,i);
 i++;
 } 
if(skonci==troj.ypoints[2]){
 int []y={skonci,skonci,obd.ypoints[3],obd.ypoints[3]};
 gg.setColor(Color.red);
 gg.fillPolygon(new Polygon(obd.xpoints,y,4));
 }
if(skonci==obd.ypoints[3]){
 int []x={(int)trojx1(skonci),(int)trojx2(skonci),troj.xpoints[2],troj.xpoints[1]};
 int []y={skonci,skonci,troj.ypoints[2],troj.ypoints[1]};
 gg.setColor(Color.blue);
 gg.fillPolygon(new Polygon(x,y,4));
 }
return 0;
}

public void bok(Graphics gg){
gg.setColor(Color.blue);
if((trojz[0]+300)<300)gg.drawLine(300,troj.ypoints[0],trojz[2]+300,troj.ypoints[2]);
else gg.drawLine(trojz[0]+300,troj.ypoints[0],trojz[2]+300,troj.ypoints[2]);
gg.setColor(Color.red);
if((obdz[0]+300)<300)gg.drawLine(300,obd.ypoints[0],obdz[3]+300,obd.ypoints[3]);
else gg.drawLine(obdz[0]+300,obd.ypoints[0],obdz[3]+300,obd.ypoints[3]);

gg.setColor(Color.black);
gg.drawOval(getSize().width-12,getSize().height/2-10,10,20);
gg.fillOval(getSize().width-11,getSize().height/2-5,6,8);

gg.drawOval(getSize().width-25,getSize().height/2-10,10,20);
gg.fillOval(getSize().width-24,getSize().height/2-5,6,8);
}

public void paint(Graphics g){
Dimension d=getSize();
if((offscreen==null)||(d.width!=offscreensize.width)||(d.height!=offscreensize.height))
 {
 offscreen=createImage(d.width,d.height);
 offscreensize=d;
 gg=offscreen.getGraphics();
 gg.setFont(getFont());
 }

gg.setColor(getBackground());
gg.fillRect(0,0,getSize().width,getSize().height);
gg.setColor(Color.blue);
gg.drawRect(0,0,getSize().width-1,getSize().height-1);

if(prepocitaj(gg)==1){gg.setColor(Color.red);
                      gg.fillPolygon(obd);
		      gg.setColor(Color.blue);
		      gg.fillPolygon(troj);
                     }
bok(gg);
gg.setColor(Color.black);
gg.drawString("z="+trojz[0],troj.xpoints[0]+10,troj.ypoints[0]+5);
gg.drawString("z="+trojz[2],troj.xpoints[2]-15,troj.ypoints[2]+15);
gg.drawString("z="+obdz[0],obd.xpoints[1]+10,obd.ypoints[1]+5);
gg.drawString("z="+obdz[2],obd.xpoints[2]+10,obd.ypoints[2]+5);

gg.drawString("zboku:",350,20);
gg.drawLine(300,1,300,getSize().height-2);

g.drawImage(offscreen,0,0,null); 
}

public void update(Graphics g){
synchronized(this){}
paint(g);
}

public void stop(){timer=null;}

public void mouseDragged(MouseEvent e){
if(e.paramString().indexOf("mods="+e.BUTTON1_MASK)>0){
 if(e.getY()<p){
// if(trojz[0]==trojz[2]){troj.ypoints[0]+=2;System.exit(1);} 
  trojz[0]+=2;
  if(trojz[0]<trojz[2])troj.ypoints[0]-=2;
  if(trojz[0]>trojz[2])troj.ypoints[0]+=2;
  if(troj.ypoints[0]>troj.ypoints[2]){troj.ypoints[0]=troj.ypoints[2];trojz[0]-=2;} 
 p=e.getY();
 }
 if(e.getY()>p){
  trojz[0]-=2;
  if(trojz[0]<trojz[2])troj.ypoints[0]+=2;
  if(trojz[0]>trojz[2])troj.ypoints[0]-=2;
  if(troj.ypoints[0]>troj.ypoints[2]){troj.ypoints[0]=troj.ypoints[2];trojz[0]+=2;} 
 p=e.getY();
 }
  if(trojz[0]==trojz[2])troj.ypoints[0]=y2[0]; 
 }
if(e.paramString().indexOf("mods="+e.BUTTON3_MASK)>0){
 if(e.getY()<p){
  obdz[0]+=2;
  if(obdz[0]<obdz[3]){obd.ypoints[0]-=2;obd.ypoints[1]-=2;}
  if(obdz[0]>obdz[3]){obd.ypoints[0]+=2;obd.ypoints[1]+=2;}
  if(obd.ypoints[0]>obd.ypoints[3]){obd.ypoints[0]=obd.ypoints[3];obd.ypoints[1]=obd.ypoints[3];obdz[0]-=2;obdz[1]-=2;}
  p=e.getY();
 }
 if(e.getY()>p){
  obdz[0]-=2;
  if(obdz[0]<obdz[3]){obd.ypoints[0]+=2;obd.ypoints[1]+=2;}
  if(obdz[0]>obdz[3]){obd.ypoints[0]-=2;obd.ypoints[1]-=2;}
  if(obd.ypoints[0]>obd.ypoints[3]){obd.ypoints[0]=obd.ypoints[3];obd.ypoints[1]=obd.ypoints[3];obdz[0]+=2;obdz[1]+=2;}
  p=e.getY();
 }
  p=e.getY();
  if(obdz[0]==obdz[3]){obd.ypoints[0]=y1[0];obd.ypoints[1]=y1[1];} 
 }
}

public void mouseMoved(MouseEvent e){ p=e.getY();} 

public String getAppletInfo(){
return "scan.java by Tomas Hudik 25/3/2001";}
}
