import java.applet.*;
import java.awt.*;
import ruum.*;
import java.util.Date;
public class k3 extends Applet implements Runnable{
Image pilt;
Graphics piltg;
TextArea ta1=new TextArea(5, 40);
tulemused[] tulemus=new tulemused[100];
tsisu ts=new tsisu();
Thread tr;
Nelinurk[] triip=new Nelinurk[100], post=new Nelinurk[10];
Nelinurk n1=new Nelinurk(new Punkt(-10, -10, 500), new Punkt(10, -10, 500),
                         new Punkt(10, -10, 400), new Punkt(-10, -10, 400));
Nelinurk tee=new Nelinurk(new Punkt(-350, 0, 10000000), new Punkt(350, 0, 10000000),
                          new Punkt(350, 0, -100), new Punkt(-350, 0, -100));
Nelinurk auto2=new Nelinurk(new Punkt(10, 300, 2000), new Punkt(250, 300, 2000),
                            new Punkt(10, 0, 2000));
Punkt silm;
int a1koht, a2koht, triibujn=0, postijn=0, sagedus=10, karv=0, oaeg, parv=100;
int tulemustearv=0, garv=-1;
double a1kiirus=10, a2kiirus=10, muutus=0.1, kiirendus=5;
boolean gaas1=false, gaas2=false, pidur1=false, pidur2=false, moot=false;
long aeg1, aeg2;
public void init(){
setLayout(new BorderLayout());
ts.resize(300, 120);
add("South", ts);
ts.repaint();
 pilt=createImage(400, 400);
 piltg=pilt.getGraphics();
 piltg.translate(200, 100);
// trm.show();
// trm.joonista_ring(20, 20, false);
 for(int i=0; i<100; i++){
  triip[i]=new Nelinurk(new Punkt(-10, 0, i*500), new Punkt(10, 0, i*500),
                        new Punkt(-10, 0, i*500-100));}
triibujn=99;
for(int i=0; i<10; i++)
 post[i]=new Nelinurk(new Punkt(400, 100, 10000*i), new Punkt(420, 100, 10000*i),
                      new Punkt(400, 0, 10000*i));
postijn=9;
muutus=kiirendus/sagedus;
oaeg=800/sagedus;
aeg1=(new Date()).getTime();
requestFocus();
}

public void start(){tr=new Thread(this); tr.start();}
public void run(){
a1koht=0;
for(int kr=5; kr<30; kr+=5)
  ts.piltg.drawString(Integer.toString(kr), kr*12, 100);
  ts.piltg.drawString("m/s", 360, 100);
for(int vm=0; vm<70; vm+=10)
  ts.piltg.drawString(Integer.toString(vm), 1, 100-100*vm/80);
  ts.piltg.drawString("m", 1, 10);
ts.repaint();

 while(true){
 piltg.setColor(new Color(200, 200, 255));
 piltg.fillRect(-200, -100, 400, 100);
 piltg.setColor(new Color(220, 255, 220));
 piltg.fillRect(-200, 0, 400, 300); 
 piltg.setColor(Color.black);
 silm=new Punkt(150, 80, a1koht);
 tee.joonista(piltg,silm);
 for(int j=0; j<10; j++)post[j].joonista(piltg, silm);
// System.out.println(post[1].toString());
 piltg.setColor(Color.white);
  for(int j=0; j<100; j++)
     triip[j].joonista(piltg, silm);
   auto2.joonista(piltg, silm);
a2koht=auto2.punkt[0].z;
if(kontroll_korras())repaint();
try{     tr.sleep(oaeg);} catch(Exception e){}
triipejuurde();
postejuurde();
if(gaas1&a1kiirus<50)a1kiirus+=muutus; if(pidur1&a1kiirus>=0)a1kiirus-=muutus;
if(gaas2&a2kiirus<30)a2kiirus+=muutus; if(pidur2&a2kiirus>=0)a2kiirus-=muutus;
 String kr=Double.toString(a1kiirus*3.6);
 int pikkus=kr.indexOf('.');
 showStatus((pikkus>0)?kr.substring(0, pikkus)+"  km/h":kr+"  km/h");
a1koht=a1koht+(int)(a1kiirus*100/sagedus);
auto2.liida(new Punkt(0, 0, (int)(a2kiirus*100/sagedus)));

karv++;
}
}
public boolean kontroll_korras(){
 if(a1koht>=a2koht){a1kiirus=0;piltg.setColor(Color.red);
 piltg.fillRect(-200, -100, 400, 300); repaint();
 try{tr.sleep(2000);} catch(Exception e){};
 if(moot){tulemus[tulemustearv].pauk=true;
 minema();}
  a1koht-=10; return false;}
if(moot){if(a2kiirus<=0&a1kiirus<=0){
  tulemus[tulemustearv].pauk=false; minema();
  }}
if(karv==parv){
System.out.println("Pidurialgus");
 if(Math.abs(a1kiirus-a2kiirus)<30){ pidur2=true; moot=true;
  tulemus[tulemustearv]=new tulemused();
  tulemus[tulemustearv].vahe=a2koht-a1koht;
  tulemus[tulemustearv].kiirus=a2kiirus;}
 else parv+=(int)(100*Math.random());
 }
 if(karv==garv){gaas2=false; System.out.println("k2="+a2kiirus+" aega"+(karv-parv));}

return true;

}
public void minema(){moot=false; pidur2=false;
parv=karv+50+(int)(150*Math.random());
garv=karv+5+(int)(25/muutus*Math.random()); gaas2=true;
ta1.appendText(Integer.toString(tulemus[tulemustearv].vahe)+" "+
                Double.toString(tulemus[tulemustearv].kiirus)+" "+
                tulemus[tulemustearv].pauk+"\n");
ts.joonista_ring(
(int)Math.round(tulemus[tulemustearv].kiirus*12),
100-tulemus[tulemustearv].vahe/80, tulemus[tulemustearv].pauk);
tulemustearv++;}

public void triipejuurde(){
 int algkoht=triip[triibujn].punkt[0].z;
 while(triip[(triibujn<99)?triibujn+1:0].punkt[0].z<a1koht){
  triibujn=(triibujn<99)?triibujn+1:0;
  triip[triibujn]=new Nelinurk(new Punkt(-10, 0, algkoht+500), new Punkt(10, 0, algkoht+500),
                        new Punkt(-10, 0, algkoht+500-100));
   algkoht+=500;
 }

}

public void postejuurde(){
 int algkoht=post[postijn].punkt[0].z;
 while(post[(postijn<9)?postijn+1:0].punkt[0].z<a1koht+100){
  postijn=(postijn<9)?postijn+1:0;
  post[postijn]=new Nelinurk(new Punkt(400, 100, algkoht+10000), new Punkt(420, 100, algkoht+10000),
                        new Punkt(400, 0, algkoht+10000));
   algkoht+=10000;
 }
}

public void paint(Graphics g){
g.drawImage(pilt, 0, 0, this);
}

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

public boolean keyDown(Event e, int key){
 if('m'==(char)key)gaas1=true;
 if('n'==(char)key)pidur1=true;
 System.out.println(a1kiirus);
 return true;
}
public boolean keyUp(Event e, int key){
 if('m'==(char)key)gaas1=false;
 if('n'==(char)key)pidur1=false;
 if(a1kiirus<0)a1kiirus=0;
 if(a2kiirus<0)a2kiirus=0;
 return true;
}

public boolean lostFocus(Event e, int x, int y){
requestFocus(); return true;}

}

class tulemused{
int vahe;
double kiirus;
boolean pauk;
}
