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}