import java.awt.*;

import java.applet.*;



public class ConnectApplet extends Applet 

       implements Runnable {	

   Point current;

   Point[] p=new Point[3];

   Thread animation;

   int w,h;

   Image pictureImage;

   Graphics picture;



   public void init() {

      w=size().width; h=size().height;

      pictureImage=createImage(w,h);

      picture=pictureImage.getGraphics();	

      p[0]=new Point(w/2,100);

      p[1]=new Point(w/2+70,170);

      p[2]=new Point(w/2-70,170);

      current=p[0];

   }	

   public void start() {

      animation=new Thread(this);

      animation.start();

   }	

   public void stop() { animation=null; }	

   public void run() {

      while (animation==Thread.currentThread()) {

         updatePicture();

         repaint();

         try {Thread.sleep(20);} catch (Exception e) {}

      }

   }

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

   public synchronized void paint(Graphics g) {

      g.drawImage(pictureImage,0,0,null);

   }

   // key: code in gray makes the program run.

   //      code in black draws the picture.



   public boolean mouseDown(Event e, int x, int y) {

      int shortest=Integer.MAX_VALUE;

      for (int i=0; i<p.length; i++) {

         int d2=(p[i].x-x)*(p[i].x-x)+

                (p[i].y-y)*(p[i].y-y);

          if (d2<=shortest) {

             current=p[i];

             shortest=d2;

          }

      }

      return mouseDrag(e,x,y);

   }

   public boolean mouseDrag(Event e, int x, int y) {

      current.x=x; current.y=y; return true;

   }



   synchronized void updatePicture() {

      for (int i=0; i<5000; i++) {

         int x=(int)(w*Math.random());

         int y=(int)(h*Math.random());

         long a1=f(p[0],p[1],x,y), 

              a2=f(p[1],p[2],x,y), 

              a3=f(p[2],p[0],x,y);

         picture.setColor(

            (int)(a1*a2*a3)>0 ? a1*a2>0 && a2*a3>0 ? 

            Color.white : Color.gray : Color.black);

         picture.drawLine(x,y,x,y);

      }

   }	

   long f(Point p1, Point p2, int x, int y) {

      return ((p1.x-x)*(p2.y-y)-(p1.y-y)*(p2.x-x))/13;

   }

}