/* 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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
