/*
Copyright (C) 2001, 2006 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.geom;

/**
 * Represents an enclosing volume.
 *
 * @author Tom Gaskins
 * @version $Id: Extent.java 1416 2007-04-06 23:44:19Z tgaskins $
 */
public interface Extent
{
    Point getCenter();

    double getDiameter();

    double getRadius();

    /**
     * Tests whether or not this <code>Extent</code> intersects <code>frustum</code>. Returns true if any part of these
     * two objects intersect, including the case where either object wholly contains the other, false otherwise.
     *
     * @param frustum the <code>Frustum</code> with which to test for intersection
     * @return true if there is an intersection, false otherwise
     */
    boolean intersects(Frustum frustum);

    /**
     * Obtain the intersections of this extent with <code>line</code>. The returned array may be either null or of zero
     * length if no intersections are discovered. It does not contain null elements. Tangential intersections are marked
     * as such. <code>line</code> is considered to have infinite length in both directions.
     *
     * @param line the <code>Line</code> with which to intersect this <code>Extent</code>
     * @return an array of intersections representing all the points where <code>line</code> enters or leave this
     *         <code>Extent</code>
     */
    gov.nasa.worldwind.geom.Intersection[] intersect(gov.nasa.worldwind.geom.Line line);

    /**
     * Calculate whether or not <code>line</code> intersects this <code>Extent</code>. This method may be faster than
     * checking the size of the arary returned by <code>intersect(Line)</code>. Implementing methods must ensure that
     * this method returns true if and only if <code>intersect(Line)</code> returns a non-null array containing at least
     * one element.
     *
     * @param line the <code>Line</code> with which to test for intersection
     * @return true if an intersection is found, false otherwise
     */
    boolean intersects(gov.nasa.worldwind.geom.Line line);

    /**
     * Calculate whether or not this <code>Extent</code> is intersected by <code>plane</code>.
     *
     * @param plane the <code>Plane</code> with which to test for intersection
     * @return true if <code>plane</code> is found to intersect this <code>Extent</code>
     */
    boolean intersects(gov.nasa.worldwind.geom.Plane plane);
}
