class ShapeCanvas extends Canvas{
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 1L;
private Point2D[] points;
private static Random generator = new Random();
private static int SIZE = 10;
private int current;
private ShapeMaker shapeMaker;
public ShapeCanvas(){
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
current=-1;
}
public void setSharpMaker(ShapeMaker aShapeMaker){
shapeMaker = aShapeMaker;
int n = shapeMaker.getPointCount();
points = new Point2D[n];
for(int i=0;i<n;i++){
double x = generator.nextDouble()*getWidth();
double y = generator.nextDouble()*getHeight();
points[i] = new Point2D.Double(x,y);
}
repaint();
}
public void paint(Graphics g){
if(points == null) return;
Graphics2D g2 = (Graphics2D)g;
for(int i = 0;i<points.length;i++){
double x = points[i].getX() - SIZE/2;
double y = points[i].getY() - SIZE/2;
g2.fill(new Rectangle2D.Double(x,y,SIZE,SIZE));
}
g2.draw(shapeMaker.makeShape(points));
}
public class MouseHandler extends MouseAdapter{
public void mousePressed(MouseEvent e){
Point p=e.getPoint();
for(int i = 0;i<points.length;i++){
double x = points[i].getX() - SIZE/2;
double y = points[i].getY() - SIZE/2;
Rectangle2D r = new Rectangle2D.Double(x,y,SIZE,SIZE);
if(r.contains(p)){
current = 1;
return;
}
}
}
public void mouseRelease(MouseEvent e){
current = -1;
}
}
public class MouseMotionHandler extends MouseMotionAdapter{
public void mouseDragged(MouseEvent e){
if(current == -1) return;
points[current] = e.getPoint();
repaint();
}
}
}
abstract class ShapeMaker{
private int pointCount;
public ShapeMaker(int apointCount){
pointCount = apointCount;
}
public int getPointCount(){
return pointCount;
}
public abstract Shape makeShape(Point2D[] p);
}
class LineMaker extends ShapeMaker{
public LineMaker(){
super(2);
}
public Shape makeShape(Point2D[] p){
return new Line2D.Double(p[0],p[1]);
}
}
class RectangleMaker extends ShapeMaker{
public RectangleMaker(){
super(2);
}
public Shape makeShape(Point2D[] p){
Rectangle2D s = new Rectangle2D.Double();
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
}
class RoundRectangleMaker extends ShapeMaker{
public RoundRectangleMaker(){
super(2);
}
public Shape makeShape(Point2D[] p){
RoundRectangle2D s = new RoundRectangle2D.Double(0,0,0,0,20,20);
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
}
class EllipseMaker extends ShapeMaker{
public EllipseMaker(){
super(2);
}
public Shape makeShape(Point2D[] p){
Ellipse2D s = new Ellipse2D.Double();
s.setFrameFromDiagonal(p[0],p[1]);
return s;
}
}
/*class ArcMaker extends ShapeMaker{
public ArcMaker(){
super(4);
}
class PolygonMaker extends ShapeMaker{
public PolygonMaker(){
super(6);
}
public Shape makeShape(Point2D[] p){
GeneralPath s = new GeneralPath();
s.moveTo((float)p[0].getX(),(float)p[0].getY());
for(int i=1;i<p.length;i++){
s.lineTo((float)p[i].getX(),(float)p[i].getY());
}
s.closePath();
return s;
}
}
class QuadCurveMaker extends ShapeMaker{
public QuadCurveMaker(){
super(3);
}
public Shape makeShape(Point2D[] p){
return new QuadCurve2D.Double(p[0].getX(),p[0].getY(),p[1].getX(),p[1].getY(),p[2].getX(),p[2].getY());
}
}
class CubicCurveMaker extends ShapeMaker{
public CubicCurveMaker(){
super(4);
}
public Shape makeShape(Point2D[] p){
return new CubicCurve2D.Double(p[0].getX(),p[0].getY(),p[1].getX(),p[1].getY(),p[2].getX(),p[2].getY(),p[3].getX(),p[3].getY());
}
}