import java.awt.*;
import java.util.*;
// class MPoint - the most basic MMoveable
//
//
// Author: Alexander Bogomolny, CTK Software, Inc.
// URL: http://www.cut-the-knot.com
// Date: November 30, 2000
// Copyright: A. Bogomolny
// Permission to use and modify the file is therefore granted
// as long as this comment remains unchanged. Do this at your
// own risk.
//
class MPoint extends Point implements MMoveable
{
// when the cursor selects a moveable
// it must not be exactly at the location
// of the latter but some distance away.
// For a motion to be smooth, however,
// location of the moveable must be changed
// smoothly. m_Defect stores the vector from
// the cursor to the location
Point Defect;
// sometimes it's desirable
// to indicate the location
// by a small circle
boolean Drawable = false;
public void SetDrawable(boolean set) { Drawable = set; }
// MPoint is draggable by default.
// Sometimes it's desirable to switch
// this feature off
boolean Draggable;
public void SetDraggable(boolean set) { Draggable = set; }
// MMoveable is indicated by a circle.
// Sometimes there is a need to hide it.
//
boolean ShowCircle = true;
public void ShowCircle(boolean show) { ShowCircle = show; }
int R = 2; // radius of the circle
public void SetRadius(int r) { R = r; }
Color FColor; // color of the circle
public void SetColor(Color color) { FColor = color; }
int epsilon = 10;
public void SetAccuracy(int a) { epsilon = a; }
// Moving = being dragged
//
boolean Moving;
public void SetMoving(boolean set) { Moving = set; }
public MPoint(int a, int b)
{
super(a, b);
FColor = Color.black;
R = 1;
Defect = new Point(0, 0);
}
public MPoint(Point p)
{
this(p.x, p.y);
}
public boolean IsHit(int a, int b)
{
Defect.x = x - a;
Defect.y = y - b;
return (Defect.x*Defect.x + Defect.y*Defect.y < epsilon);
}
public boolean IsHit(Point p)
{
return IsHit(p.x, p.y);
}
public void UpdateLocation(int a, int b)
{
x = Defect.x + a;
y = Defect.y + b;
}
public void Draw(Graphics g)
{
if (ShowCircle)
{
g.setColor(FColor);
g.drawOval(x - R, y - R, 2*R+1, 2*R+1);
}
}
public void DrawBackground(Graphics g)
{
if (ShowCircle)
{
g.setColor(FColor);
g.fillOval(x - R, y - R, 2*R+1, 2*R+1);
}
}
public void DrawFrame(Graphics g)
{
Draw(g);
}
public boolean Inside(int a, int b)
{
return IsHit(a,b);
}
}