
import java.awt.*;

public class pointOnCircle extends pointOnShape
{
     protected double angle;
     protected circle c;

     public pointOnCircle(double X, double Y, shape S)
     {
	  super(X, Y, S);

	  if (!(S instanceof circle))
	       throw(new IllegalArgumentException(
		    "shape passed to pointOnLine must be a line"));

	  c = (circle)s;
	  setAngle();
     }

     public boolean exists()
     {
	  x = c.center.x + c.radius() * Math.cos(angle);
	  y = c.center.y + c.radius() * Math.sin(angle);

	  return(super.exists());
     }

     private void setAngle()
     {
	  double vx = x - c.center.x;
	  double vy = y - c.center.y;

	  angle = Math.atan2(vy, vx);
     }

     public void SetPoint(double X, double Y)
     {
	  point p = s.coordOnShape(X, Y);
	  
	  x = p.x; y = p.y;

	  setAngle();
     }

     public void setX(double X) 
     { 
	  point p = s.coordOnShape(X, y); 
	  x = p.x; y = p.y;
	  setAngle();
     }

     public void setY(double Y)
     { 
	  point p = s.coordOnShape(x, Y); 
	  x = p.x; y = p.y;
	  setAngle();
     }

     public void draw(GeometryWindow G)
     {
	  if (!hidden)
	  {
	       x = c.center.x + c.radius() * Math.cos(angle);
	       y = c.center.y + c.radius() * Math.sin(angle);
	       G.setColor(color);
	       G.drawPoint(x, y);
	  }
     }
     
     public boolean translate(double dx, double dy)
     {
	  translated = true;

	  point p = s.coordOnShape(x + dx, y + dy);
	  x = p.x;
	  y = p.y;
	  setAngle();
	  return(true);
     }

     public boolean mouseDown(double X, double Y)
     {
	  if (hidden)
	       return(false);

	  if (gMath.distance(x, y, X, Y) < clickRange)
	  {
	       dragging = true;
	       
	       point p = s.coordOnShape(X, Y);
	       x = p.x; y = p.y;
	       setAngle();
	       return(true);
	  }
	  return(false);
     }

     public boolean mouseDrag(double X, double Y)
     {
	  if (dragging == true)
	  {
	       point p = s.coordOnShape(X, Y);
	       x = p.x; y = p.y;
	       setAngle();
	       return(true);
	  }
	  return(false);
     }

     public boolean mouseUp(double X, double Y)
     {
	  dragging = false;
	  return(false);
     }
};







