Polygon2d.java

package org.djutils.draw.surface;

import org.djutils.draw.DrawRuntimeException;
import org.djutils.draw.line.PolyLine2d;
import org.djutils.draw.point.Point2d;
import org.djutils.exceptions.Throw;

/**
 * Polygon2d.java. Closed PolyLine2d. The actual closing point (which is the same as the starting point) is NOT included in the
 * super PolyLine2d.
 * <p>
 * Copyright (c) 2020-2021 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
 * BSD-style license. See <a href="https://djutils.org/docs/current/djutils/licenses.html">DJUTILS License</a>.
 * </p>
 * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
 * @author <a href="https://www.tudelft.nl/pknoppers">Peter Knoppers</a>
 */
public class Polygon2d extends PolyLine2d
{

    /**
     * Construct a new Polygon2d.
     * @param point1 Point2d; the first point of the new Polygon2d
     * @param point2 Point2d; the second point of the new Polygon2d
     * @param otherPoints Point2d[]; all remaining points of the new Polygon2d (may be null)
     * @throws DrawRuntimeException when point2 is equal to the last point of otherPoints, or any two successive points are
     *             equal
     */
    public Polygon2d(final Point2d point1, final Point2d point2, final Point2d[] otherPoints) throws DrawRuntimeException
    {
        super(checkClosingPoint(point1, otherPoints), point2, otherPoints);
    }

    /**
     * Ensure that the last point of otherPoints is not equal to point1.
     * @param point1 Point2d; the first point of a new Polygon2d
     * @param otherPoints Point2d[]; the remaining points of a new Polygon2d (may be null)
     * @return Point2d; point1; the first point for a new Polygon2d
     * @throws DrawRuntimeException when point1 is equal to the last point of otherPoints
     */
    private static Point2d checkClosingPoint(final Point2d point1, final Point2d[] otherPoints) throws DrawRuntimeException
    {
        Throw.when(otherPoints != null && otherPoints[otherPoints.length - 1].equals(point1), DrawRuntimeException.class,
                "point1 must not be equal to last point of otherPoints");
        return point1;
    }

    /** */
    private static final long serialVersionUID = 1L;

    /**
     * Determine if a point is inside this Polygon.
     * @param point Point2d; the point
     * @return boolean; true if the point is inside this polygon, false if the point is outside this polygon. Results are
     *         ill-defined for points on the edges of this Polygon.
     */
    public final boolean contains(final Point2d point)
    {
        return false; // TODO
    }

    /**
     * Subtract the overlap with another Polygon2d from this Polygon2d and return the result as a new Polygon2d.
     * @param otherPolygon Polygon2d; the other Polygon2d
     * @return Polygon2d; the asymmetrical difference; or null if there otherPolygon completely covers this Polygon2d
     */
    public Polygon2d difference(final Polygon2d otherPolygon)
    {
        return null; // TODO
    }

}