001package fr.aumgn.dac2.shape;
002
003import java.util.Iterator;
004
005import fr.aumgn.bukkitutils.geom.Vector;
006import fr.aumgn.bukkitutils.geom.Vector2D;
007import fr.aumgn.dac2.shape.column.Column;
008import fr.aumgn.dac2.shape.iterator.ColumnsIterator;
009
010@ShapeName("cylinder")
011public class CylinderShape implements FlatShape {
012
013    private final Vector2D center;
014    private final Vector2D radius;
015    private final int minY;
016    private final int maxY;
017
018    public CylinderShape(Vector2D center, Vector2D radius, int minY, int maxY) {
019        this.center = center;
020        this.radius = radius.add(0.5);
021        this.minY = minY;
022        this.maxY = maxY;
023    }
024
025    @Override
026    public boolean contains(Vector pt) {
027        return pt.getY() >= minY && pt.getY() <= maxY
028                && pt.to2D().subtract(center).divide(radius).lengthSq() <= 1;
029    }
030
031    @Override
032    public double getMinY() {
033        return minY;
034    }
035
036    @Override
037    public double getMaxY() {
038        return maxY;
039    }
040
041    @Override
042    public Vector2D getMin2D() {
043        return center.subtract(radius.subtract(0.5));
044    }
045
046    @Override
047    public Vector2D getMax2D() {
048        return center.add(radius.subtract(0.5));
049    }
050
051    @Override
052    public boolean contains2D(Vector2D pt) {
053        return pt.subtract(center).divide(radius).lengthSq() <= 1;
054    }
055
056    @Override
057    public Column getColumn(Vector2D pt) {
058        return new Column(this, pt);
059    }
060
061    @Override
062    public Iterator<Column> iterator() {
063        return new ColumnsIterator(this);
064    }
065
066    public Vector2D getCenter() {
067        return center;
068    }
069
070    public Vector2D getRadius() {
071        return radius.subtract(0.5);
072    }
073}