/* Ellipse2D.java -- represents an ellipse in 2-D space
   Copyright (C) 2000, 2002, 2004 Free Software Foundation

This file is part of GNU Classpath.

GNU Classpath 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, or (at your option)
any later version.

GNU Classpath 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.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.awt.geom;


/**
 * Ellipse2D is the shape of an ellipse.
 * <BR>
 * <img src="doc-files/Ellipse-1.png" width="347" height="221"
 * alt="A drawing of an ellipse" /><BR>
 * The ellipse is defined by it's bounding box (shown in red),
 * and is defined by the implicit curve:<BR>
 * <blockquote>(<i>x</i>/<i>a</i>)<sup>2</sup> +
 * (<i>y</i>/<i>b</i>)<sup>2</sup> = 1<BR><BR></blockquote>
 *
 * @author Tom Tromey (tromey@cygnus.com)
 * @author Eric Blake (ebb9@email.byu.edu)
 *
 * @since 1.2
 */
public abstract class Ellipse2D extends RectangularShape
{
  /**
   * Ellipse2D is defined as abstract.
   * Implementing classes are Ellipse2D.Float and Ellipse2D.Double.
   */
  protected Ellipse2D()
  {
  }

  /**
   * Determines if a point is contained within the ellipse. <P>
   * @param x - x coordinate of the point.
   * @param y - y coordinate of the point.
   * @return true if the point is within the ellipse, false otherwise.
   */
  public boolean contains(double x, double y)
  {
    double rx = getWidth() / 2;
    double ry = getHeight() / 2;
    double tx = (x - (getX() + rx)) / rx;
    double ty = (y - (getY() + ry)) / ry;
    return tx * tx + ty * ty < 1.0;
  }

  /**
   * Determines if a rectangle is completely contained within the
   * ellipse. <P>
   * @param x - x coordinate of the upper-left corner of the rectangle
   * @param y - y coordinate of the upper-left corner of the rectangle
   * @param w - width of the rectangle
   * @param h - height of the rectangle
   * @return true if the rectangle is completely contained, false otherwise.
   */
  public boolean contains(double x, double y, double w, double h)
  {
    double x2 = x + w;
    double y2 = y + h;
    return (contains(x, y) && contains(x, y2) && contains(x2, y)
           && contains(x2, y2));
  }

  /**
   * Returns a PathIterator object corresponding to the ellipse.<P>
   *
   * Note: An ellipse cannot be represented exactly in PathIterator
   * segments, the outline is thefore approximated with cubic
   * Bezier segments.
   * 
   * @param at an optional transform.
   * @return A path iterator.
   */
  public PathIterator getPathIterator(AffineTransform at)
  {
    // An ellipse is just a complete arc.
    return new Arc2D.ArcIterator(this, at);
  }

  /**
   * Determines if a rectangle intersects any part of the ellipse.<P>
   * @param x - x coordinate of the upper-left corner of the rectangle
   * @param y - y coordinate of the upper-left corner of the rectangle
   * @param w - width of the rectangle
   * @param h - height of the rectangle
   * @return true if the rectangle intersects the ellipse, false otherwise.
   */
  public boolean intersects(double x, double y, double w, double h)
  {
    Rectangle2D r = new Rectangle2D.Double(x, y, w, h);
    if (! r.intersects(getX(), getY(), getWidth(), getHeight()))
      return false;

    if (contains(x, y) || contains(x, y + h) || contains(x + w, y)
        || contains(x + w, y + h))
      return true;

    Line2D l1 = new Line2D.Double(getX(), getY() + (getHeight() / 2),
                                  getX() + getWidth(),
                                  getY() + (getHeight() / 2));
    Line2D l2 = new Line2D.Double(getX() + (getWidth() / 2), getY(),
                                  getX() + (getWidth() / 2),
                                  getY() + getHeight());

    if (l1.intersects(r) || l2.intersects(r))
      return true;

    return false;
  }

  /**
   * An {@link Ellipse2D} that stores its coordinates using <code>double</code>
   * primitives.
   */
  public static class Double extends Ellipse2D
  {
    /**
     * The height of the ellipse.
     */
    public double height;

    /**
     * The width of the ellipse.
     */
    public double width;

    /**
     * The upper-left x coordinate of the bounding-box
     */
    public double x;

    /**
     * The upper-left y coordinate of the bounding-box
     */
    public double y;

    /**
     * Creates a new Ellipse2D with an upper-left coordinate of (0,0)
     * and a zero size.
     */
    public Double()
    {
    }

    /**
     * Creates a new Ellipse2D within a given rectangle
     * using double-precision coordinates.<P>
     * @param x - x coordinate of the upper-left of the bounding rectangle
     * @param y - y coordinate of the upper-left of the bounding rectangle
     * @param w - width of the ellipse
     * @param h - height of the ellipse
     */
    public Double(double x, double y, double w, double h)
    {
      this.x = x;
      this.y = y;
      height = h;
      width = w;
    }

    /**
     * Returns the bounding-box of the ellipse.
     * @return The bounding box.
     */
    public Rectangle2D getBounds2D()
    {
      return new Rectangle2D.Double(x, y, width, height);
    }

    /**
     * Returns the height of the ellipse.
     * @return The height of the ellipse.
     */
    public double getHeight()
    {
      return height;
    }

    /**
     * Returns the width of the ellipse.
     * @return The width of the ellipse.
     */
    public double getWidth()
    {
      return width;
    }

    /**
     * Returns x coordinate of the upper-left corner of
     * the ellipse's bounding-box.
     * @return The x coordinate.
     */
    public double getX()
    {
      return x;
    }

    /**
     * Returns y coordinate of the upper-left corner of
     * the ellipse's bounding-box.
     * @return The y coordinate.
     */
    public double getY()
    {
      return y;
    }

    /**
     * Returns <code>true</code> if the ellipse encloses no area, and
     * <code>false</code> otherwise.
     * 
     * @return A boolean.
     */
    public boolean isEmpty()
    {
      return height <= 0 || width <= 0;
    }

    /**
     * Sets the geometry of the ellipse's bounding box.<P>
     *
     * @param x - x coordinate of the upper-left of the bounding rectangle
     * @param y - y coordinate of the upper-left of the bounding rectangle
     * @param w - width of the ellipse
     * @param h - height of the ellipse
     */
    public void setFrame(double x, double y, double w, double h)
    {
      this.x = x;
      this.y = y;
      height = h;
      width = w;
    }
  } // class Double

  /**
   * An {@link Ellipse2D} that stores its coordinates using <code>float</code>
   * primitives.
   */
  public static class Float extends Ellipse2D
  {
    /**
     * The height of the ellipse.
     */
    public float height;

    /**
     * The width of the ellipse.
     */
    public float width;

    /**
     * The upper-left x coordinate of the bounding-box
     */
    public float x;

    /**
     * The upper-left y coordinate of the bounding-box
     */
    public float y;

    /**
     * Creates a new Ellipse2D with an upper-left coordinate of (0,0)
     * and a zero size.
     */
    public Float()
    {
    }

    /**
     * Creates a new Ellipse2D within a given rectangle
     * using floating-point precision.<P>
     * @param x - x coordinate of the upper-left of the bounding rectangle
     * @param y - y coordinate of the upper-left of the bounding rectangle
     * @param w - width of the ellipse
     * @param h - height of the ellipse
     *
     */
    public Float(float x, float y, float w, float h)
    {
      this.x = x;
      this.y = y;
      this.height = h;
      this.width = w;
    }

    /**
     * Returns the bounding-box of the ellipse.
     * @return The bounding box.
     */
    public Rectangle2D getBounds2D()
    {
      return new Rectangle2D.Float(x, y, width, height);
    }

    /**
     * Returns the height of the ellipse.
     * @return The height of the ellipse.
     */
    public double getHeight()
    {
      return height;
    }

    /**
     * Returns the width of the ellipse.
     * @return The width of the ellipse.
     */
    public double getWidth()
    {
      return width;
    }

    /**
     * Returns x coordinate of the upper-left corner of
     * the ellipse's bounding-box.
     * @return The x coordinate.
     */
    public double getX()
    {
      return x;
    }

    /**
     * Returns y coordinate of the upper-left corner of
     * the ellipse's bounding-box.
     * @return The y coordinate.
     */
    public double getY()
    {
      return y;
    }

    /**
     * Returns <code>true</code> if the ellipse encloses no area, and
     * <code>false</code> otherwise.
     * 
     * @return A boolean.
     */
    public boolean isEmpty()
    {
      return height <= 0 || width <= 0;
    }

    /**
     * Sets the geometry of the ellipse's bounding box.<P>
     *
     * @param x - x coordinate of the upper-left of the bounding rectangle
     * @param y - y coordinate of the upper-left of the bounding rectangle
     * @param w - width of the ellipse
     * @param h - height of the ellipse
     */
    public void setFrame(float x, float y, float w, float h)
    {
      this.x = x;
      this.y = y;
      height = h;
      width = w;
    }

    /**
     * Sets the geometry of the ellipse's bounding box.
     *
     * Note: This leads to a loss of precision.<P>
     *
     * @param x - x coordinate of the upper-left of the bounding rectangle
     * @param y - y coordinate of the upper-left of the bounding rectangle
     * @param w - width of the ellipse
     * @param h - height of the ellipse
     */
    public void setFrame(double x, double y, double w, double h)
    {
      this.x = (float) x;
      this.y = (float) y;
      height = (float) h;
      width = (float) w;
    }
  } // class Float
} // class Ellipse2D
