
/**
 * A class implementing the RegularPolygonal interface. This class represents
 * a regular polygon (duh). It implements the getEdgeLength method from
 * RegularPolygonal, the getNumberOfSides method from Polygonal, and the getArea
 * and getPerimeter methods from Measurable.
 *
 * @author Mark Young (A00000000)
 */
public class RegularPolygon implements RegularPolygonal {

    private double sideLength;
    private int numSides;

    /**
     * Create a regular polygon with the given measures.
     *
     * @param reqSides the number of sides
     * @param reqLen the length of each side
     */
    public RegularPolygon(int reqSides, double reqLen) {
        require("# of sides", reqSides > 2, reqSides);
        require("side length", reqLen > 0.0, reqLen);
        numSides = reqSides;
        sideLength = reqLen;
    }

    @Override
    public double getEdgeLength() {
        return sideLength;
    }

    @Override
    public int getNumberOfSides() {
        return numSides;
    }

    @Override
    public double getArea() {
        double perimeter = getPerimeter();
        double apothem = sideLength / Math.tan(Math.PI / numSides) / 2;
        return perimeter * apothem / 2;
    }

    @Override
    public double getPerimeter() {
        return numSides * sideLength;
    }

    @Override
    public String toString() {
        return "Regular Polygon(" + numSides + ", " + sideLength + ")";
    }

    // ---------- private methods ---------- //
    private static void require(String msg, boolean value, Object obj) {
        if (!value) {
            throw new IllegalArgumentException(msg + ": " + obj);
        }
    }

}
