/*
* File : EditableEllipse2D.java
* Created : 28-feb-2002 09:45
* By : allastar
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.shapers;
import java.awt.geom.*;
import java.awt.*;
/**
*
* @author allastar
* @version 1.0
*/
public class EditableEllipse2D extends EditableRectangle implements Cloneable{
public EditableEllipse2D(Point2D ini, Point2D end){
super(ini,end);
}
public EditableEllipse2D(int x, int y, int width, int height){
super(x,y,width,height);
}
public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) {
g.setColor(EditableShapeConstants.BORDER_COLOR);
drawBorders(g);
if (selected){
paintSelection(g);
}
else if (drawingMode==PolygonDrawPanel.NEW_POINT){
g.setColor(Color.red);
drawBorders(g);
g.setColor(c);
}
else g.setColor(c);
g.drawOval((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight());
}
public boolean contains(double x, double y){
return new Ellipse2D.Double(getX(),getY(),getWidth(),getHeight()).contains(x,y);
}
public boolean contains(double x, double y, double w, double h){
return new Ellipse2D.Double(getX(),getY(),getWidth(),getHeight()).contains(x,y,w,h);
}
public PathIterator getPathIterator(AffineTransform at){
return new Ellipse2D.Double(getX(),getY(),getWidth(),getHeight()).getPathIterator(at);
}
public boolean intersects(double x, double y, double w, double h){
return new Ellipse2D.Double(getX(),getY(),getWidth(),getHeight()).intersects(x,y,w,h);
}
public EditableShape[] divide(double x, double y, boolean b){
return divide(x,y);
}
public EditableShape[] divide(double x, double y) { //The ellipse will be converted to an array of Bezier curves
EditableShape[] shapes=new EditableShape[10];
int currentShape=0;
double currentX=0, currentY=0;
PathIterator pi=getPathIterator(new AffineTransform());
while (!pi.isDone()){
double[] points=new double[6];
int type=pi.currentSegment(points);
switch (type){
case PathIterator.SEG_MOVETO:
currentX=points[0];
currentY=points[1];
break;
case PathIterator.SEG_LINETO:
shapes[currentShape]=new EditableLine2D(currentX,currentY,points[0],points[1]);
currentShape++;
currentX=points[0];
currentY=points[1];
break;
case PathIterator.SEG_CUBICTO:
shapes[currentShape]=new EditableCubicCurve2D(currentX,currentY,points[0],points[1],points[2],points[3],points[4],points[5]);
currentShape++;
currentX=points[4];
currentY=points[5];
break;
case PathIterator.SEG_QUADTO:
shapes[currentShape]=new EditableQuadCurve2D(currentX,currentY,points[0],points[1],points[2],points[3]);
currentShape++;
currentX=points[2];
currentY=points[3];
break;
}
pi.next();
}
return shapes;
}
public Ellipse2D getEllipse(){
return new Ellipse2D.Double(getX(),getY(),getWidth(),getHeight());
}
public Object clone(){
return new EditableEllipse2D(getLocation(),new Point2D.Double(getLocation().getX()+getWidth(),getLocation().getY()+getHeight()));
}
}