/**
 * 
 */
package plugins.kernel.roi.roi3d;

import icy.type.rectangle.Rectangle3D;

import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

import plugins.kernel.roi.roi2d.ROI2DEllipse;

/**
 * Class defining a 3D Ellipse ROI as a stack of individual 2D Ellipse ROI.
 * 
 * @author Stephane
 */
public class ROI3DStackEllipse extends ROI3DStackShape
{
    public ROI3DStackEllipse()
    {
        super(ROI2DEllipse.class);
    }

    public ROI3DStackEllipse(Rectangle3D rect)
    {
        this();

        if (rect.isInfiniteZ())
            throw new IllegalArgumentException("Cannot set infinite Z dimension on the 3D Stack Ellipse ROI.");

        final Rectangle2D rect2d = rect.toRectangle2D();

        beginUpdate();
        try
        {
            for (int z = (int) Math.floor(rect.getMinZ()); z <= (int) rect.getMaxZ(); z++)
                setSlice(z, new ROI2DEllipse(rect2d));
        }
        finally
        {
            endUpdate();
        }
    }

    public ROI3DStackEllipse(Rectangle2D rect, int zMin, int zMax)
    {
        this();

        if (zMax < zMin)
            throw new IllegalArgumentException("ROI3DStackEllipse: cannot create the ROI (zMax < zMin).");

        beginUpdate();
        try
        {
            for (int z = zMin; z <= zMax; z++)
                setSlice(z, new ROI2DEllipse(rect));
        }
        finally
        {
            endUpdate();
        }
    }

    public ROI3DStackEllipse(Ellipse2D ellipse, int zMin, int zMax)
    {
        this(ellipse.getBounds2D(), zMin, zMax);
    }

    @Override
    public String getDefaultName()
    {
        return "Ellipse2D stack";
    }
}