Class BoundingBox

  • All Implemented Interfaces:
    Cloneable, ConfigurationSerializable

    public class BoundingBox
    extends Object
    implements Cloneable, ConfigurationSerializable
    A mutable axis aligned bounding box (AABB).

    This basically represents a rectangular box (specified by minimum and maximum corners) that can for example be used to describe the position and extents of an object (such as an entity, block, or rectangular region) in 3D space. Its edges and faces are parallel to the axes of the cartesian coordinate system.

    The bounding box may be degenerate (one or more sides having the length 0).

    Because bounding boxes are mutable, storing them long term may be dangerous if they get modified later. If you want to keep around a bounding box, it may be wise to call clone() in order to get a copy.

    • Constructor Summary

      Constructors 
      Constructor Description
      BoundingBox()
      Creates a new (degenerate) bounding box with all corner coordinates at 0.
      BoundingBox​(double x1, double y1, double z1, double x2, double y2, double z2)
      Creates a new bounding box from the given corner coordinates.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      BoundingBox clone()
      Creates a copy of this bounding box.
      boolean contains​(double x, double y, double z)
      Checks if this bounding box contains the specified position.
      boolean contains​(BoundingBox other)
      Checks if this bounding box fully contains the given bounding box.
      boolean contains​(Vector position)
      Checks if this bounding box contains the specified position.
      boolean contains​(Vector min, Vector max)
      Checks if this bounding box fully contains the bounding box that is defined by the given corners.
      BoundingBox copy​(BoundingBox other)
      Copies another bounding box.
      static BoundingBox deserialize​(Map<String,​Object> args)  
      boolean equals​(Object obj)  
      BoundingBox expand​(double expansion)
      Expands this bounding box uniformly by the given value in all directions.
      BoundingBox expand​(double x, double y, double z)
      Expands this bounding box uniformly by the given values in both positive and negative directions.
      BoundingBox expand​(double dirX, double dirY, double dirZ, double expansion)
      Expands this bounding box in the specified direction.
      BoundingBox expand​(double negativeX, double negativeY, double negativeZ, double positiveX, double positiveY, double positiveZ)
      Expands this bounding box by the given values in the corresponding directions.
      BoundingBox expand​(BlockFace blockFace, double expansion)
      Expands this bounding box in the direction specified by the given block face.
      BoundingBox expand​(Vector expansion)
      Expands this bounding box uniformly by the given values in both positive and negative directions.
      BoundingBox expand​(Vector direction, double expansion)
      Expands this bounding box in the specified direction.
      BoundingBox expandDirectional​(double dirX, double dirY, double dirZ)
      Expands this bounding box in the specified direction.
      BoundingBox expandDirectional​(Vector direction)
      Expands this bounding box in the specified direction.
      Vector getCenter()
      Gets the center of the bounding box.
      double getCenterX()
      Gets the x coordinate of the center of the bounding box.
      double getCenterY()
      Gets the y coordinate of the center of the bounding box.
      double getCenterZ()
      Gets the z coordinate of the center of the bounding box.
      double getHeight()
      Gets the height of the bounding box.
      Vector getMax()
      Gets the maximum corner as vector.
      double getMaxX()
      Gets the maximum x value.
      double getMaxY()
      Gets the maximum y value.
      double getMaxZ()
      Gets the maximum z value.
      Vector getMin()
      Gets the minimum corner as vector.
      double getMinX()
      Gets the minimum x value.
      double getMinY()
      Gets the minimum y value.
      double getMinZ()
      Gets the minimum z value.
      double getVolume()
      Gets the volume of the bounding box.
      double getWidthX()
      Gets the width of the bounding box in the x direction.
      double getWidthZ()
      Gets the width of the bounding box in the z direction.
      int hashCode()  
      BoundingBox intersection​(BoundingBox other)
      Resizes this bounding box to represent the intersection of this and the given bounding box.
      static BoundingBox of​(Block block)
      Creates a new 1x1x1 sized bounding box containing the given block.
      static BoundingBox of​(Block corner1, Block corner2)
      Creates a new bounding box using the coordinates of the given blocks as corners.
      static BoundingBox of​(Location center, double x, double y, double z)
      Creates a new bounding box using the given center and extents.
      static BoundingBox of​(Location corner1, Location corner2)
      Creates a new bounding box using the coordinates of the given locations as corners.
      static BoundingBox of​(Vector center, double x, double y, double z)
      Creates a new bounding box using the given center and extents.
      static BoundingBox of​(Vector corner1, Vector corner2)
      Creates a new bounding box using the coordinates of the given vectors as corners.
      boolean overlaps​(BoundingBox other)
      Checks if this bounding box overlaps with the given bounding box.
      boolean overlaps​(Vector min, Vector max)
      Checks if this bounding box overlaps with the bounding box that is defined by the given corners.
      RayTraceResult rayTrace​(Vector start, Vector direction, double maxDistance)
      Calculates the intersection of this bounding box with the specified line segment.
      BoundingBox resize​(double x1, double y1, double z1, double x2, double y2, double z2)
      Resizes this bounding box.
      Map<String,​Object> serialize()
      Creates a Map representation of this class.
      BoundingBox shift​(double shiftX, double shiftY, double shiftZ)
      Shifts this bounding box by the given amounts.
      BoundingBox shift​(Location shift)
      Shifts this bounding box by the given amounts.
      BoundingBox shift​(Vector shift)
      Shifts this bounding box by the given amounts.
      String toString()  
      BoundingBox union​(double posX, double posY, double posZ)
      Expands this bounding box to contain (or border) the specified position.
      BoundingBox union​(Location position)
      Expands this bounding box to contain (or border) the specified position.
      BoundingBox union​(BoundingBox other)
      Expands this bounding box to contain both this and the given bounding box.
      BoundingBox union​(Vector position)
      Expands this bounding box to contain (or border) the specified position.
    • Constructor Detail

      • BoundingBox

        public BoundingBox()
        Creates a new (degenerate) bounding box with all corner coordinates at 0.
      • BoundingBox

        public BoundingBox​(double x1,
                           double y1,
                           double z1,
                           double x2,
                           double y2,
                           double z2)
        Creates a new bounding box from the given corner coordinates.
        Parameters:
        x1 - the first corner's x value
        y1 - the first corner's y value
        z1 - the first corner's z value
        x2 - the second corner's x value
        y2 - the second corner's y value
        z2 - the second corner's z value
    • Method Detail

      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Vector corner1,
                                     @NotNull
                                     Vector corner2)
        Creates a new bounding box using the coordinates of the given vectors as corners.
        Parameters:
        corner1 - the first corner
        corner2 - the second corner
        Returns:
        the bounding box
      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Location corner1,
                                     @NotNull
                                     Location corner2)
        Creates a new bounding box using the coordinates of the given locations as corners.
        Parameters:
        corner1 - the first corner
        corner2 - the second corner
        Returns:
        the bounding box
      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Block corner1,
                                     @NotNull
                                     Block corner2)
        Creates a new bounding box using the coordinates of the given blocks as corners.

        The bounding box will be sized to fully contain both blocks.

        Parameters:
        corner1 - the first corner block
        corner2 - the second corner block
        Returns:
        the bounding box
      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Block block)
        Creates a new 1x1x1 sized bounding box containing the given block.
        Parameters:
        block - the block
        Returns:
        the bounding box
      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Vector center,
                                     double x,
                                     double y,
                                     double z)
        Creates a new bounding box using the given center and extents.
        Parameters:
        center - the center
        x - 1/2 the size of the bounding box along the x axis
        y - 1/2 the size of the bounding box along the y axis
        z - 1/2 the size of the bounding box along the z axis
        Returns:
        the bounding box
      • of

        @NotNull
        public static BoundingBox of​(@NotNull
                                     Location center,
                                     double x,
                                     double y,
                                     double z)
        Creates a new bounding box using the given center and extents.
        Parameters:
        center - the center
        x - 1/2 the size of the bounding box along the x axis
        y - 1/2 the size of the bounding box along the y axis
        z - 1/2 the size of the bounding box along the z axis
        Returns:
        the bounding box
      • resize

        @NotNull
        public BoundingBox resize​(double x1,
                                  double y1,
                                  double z1,
                                  double x2,
                                  double y2,
                                  double z2)
        Resizes this bounding box.
        Parameters:
        x1 - the first corner's x value
        y1 - the first corner's y value
        z1 - the first corner's z value
        x2 - the second corner's x value
        y2 - the second corner's y value
        z2 - the second corner's z value
        Returns:
        this bounding box (resized)
      • getMinX

        public double getMinX()
        Gets the minimum x value.
        Returns:
        the minimum x value
      • getMinY

        public double getMinY()
        Gets the minimum y value.
        Returns:
        the minimum y value
      • getMinZ

        public double getMinZ()
        Gets the minimum z value.
        Returns:
        the minimum z value
      • getMin

        @NotNull
        public Vector getMin()
        Gets the minimum corner as vector.
        Returns:
        the minimum corner as vector
      • getMaxX

        public double getMaxX()
        Gets the maximum x value.
        Returns:
        the maximum x value
      • getMaxY

        public double getMaxY()
        Gets the maximum y value.
        Returns:
        the maximum y value
      • getMaxZ

        public double getMaxZ()
        Gets the maximum z value.
        Returns:
        the maximum z value
      • getMax

        @NotNull
        public Vector getMax()
        Gets the maximum corner as vector.
        Returns:
        the maximum corner vector
      • getWidthX

        public double getWidthX()
        Gets the width of the bounding box in the x direction.
        Returns:
        the width in the x direction
      • getWidthZ

        public double getWidthZ()
        Gets the width of the bounding box in the z direction.
        Returns:
        the width in the z direction
      • getHeight

        public double getHeight()
        Gets the height of the bounding box.
        Returns:
        the height
      • getVolume

        public double getVolume()
        Gets the volume of the bounding box.
        Returns:
        the volume
      • getCenterX

        public double getCenterX()
        Gets the x coordinate of the center of the bounding box.
        Returns:
        the center's x coordinate
      • getCenterY

        public double getCenterY()
        Gets the y coordinate of the center of the bounding box.
        Returns:
        the center's y coordinate
      • getCenterZ

        public double getCenterZ()
        Gets the z coordinate of the center of the bounding box.
        Returns:
        the center's z coordinate
      • getCenter

        @NotNull
        public Vector getCenter()
        Gets the center of the bounding box.
        Returns:
        the center
      • copy

        @NotNull
        public BoundingBox copy​(@NotNull
                                BoundingBox other)
        Copies another bounding box.
        Parameters:
        other - the other bounding box
        Returns:
        this bounding box
      • expand

        @NotNull
        public BoundingBox expand​(double negativeX,
                                  double negativeY,
                                  double negativeZ,
                                  double positiveX,
                                  double positiveY,
                                  double positiveZ)
        Expands this bounding box by the given values in the corresponding directions.

        Negative values will shrink the bounding box in the corresponding direction. Shrinking will be limited to the point where the affected opposite faces would meet if the they shrank at uniform speeds.

        Parameters:
        negativeX - the amount of expansion in the negative x direction
        negativeY - the amount of expansion in the negative y direction
        negativeZ - the amount of expansion in the negative z direction
        positiveX - the amount of expansion in the positive x direction
        positiveY - the amount of expansion in the positive y direction
        positiveZ - the amount of expansion in the positive z direction
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(double x,
                                  double y,
                                  double z)
        Expands this bounding box uniformly by the given values in both positive and negative directions.

        Negative values will shrink the bounding box. Shrinking will be limited to the bounding box's current size.

        Parameters:
        x - the amount of expansion in both positive and negative x direction
        y - the amount of expansion in both positive and negative y direction
        z - the amount of expansion in both positive and negative z direction
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(@NotNull
                                  Vector expansion)
        Expands this bounding box uniformly by the given values in both positive and negative directions.

        Negative values will shrink the bounding box. Shrinking will be limited to the bounding box's current size.

        Parameters:
        expansion - the expansion values
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(double expansion)
        Expands this bounding box uniformly by the given value in all directions.

        A negative value will shrink the bounding box. Shrinking will be limited to the bounding box's current size.

        Parameters:
        expansion - the amount of expansion
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(double dirX,
                                  double dirY,
                                  double dirZ,
                                  double expansion)
        Expands this bounding box in the specified direction.

        The magnitude of the direction will scale the expansion. A negative expansion value will shrink the bounding box in this direction. Shrinking will be limited to the bounding box's current size.

        Parameters:
        dirX - the x direction component
        dirY - the y direction component
        dirZ - the z direction component
        expansion - the amount of expansion
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(@NotNull
                                  Vector direction,
                                  double expansion)
        Expands this bounding box in the specified direction.

        The magnitude of the direction will scale the expansion. A negative expansion value will shrink the bounding box in this direction. Shrinking will be limited to the bounding box's current size.

        Parameters:
        direction - the direction
        expansion - the amount of expansion
        Returns:
        this bounding box (now expanded)
      • expand

        @NotNull
        public BoundingBox expand​(@NotNull
                                  BlockFace blockFace,
                                  double expansion)
        Expands this bounding box in the direction specified by the given block face.

        A negative expansion value will shrink the bounding box in this direction. Shrinking will be limited to the bounding box's current size.

        Parameters:
        blockFace - the block face
        expansion - the amount of expansion
        Returns:
        this bounding box (now expanded)
      • expandDirectional

        @NotNull
        public BoundingBox expandDirectional​(double dirX,
                                             double dirY,
                                             double dirZ)
        Expands this bounding box in the specified direction.

        Negative values will expand the bounding box in the negative direction, positive values will expand it in the positive direction. The magnitudes of the direction components determine the corresponding amounts of expansion.

        Parameters:
        dirX - the x direction component
        dirY - the y direction component
        dirZ - the z direction component
        Returns:
        this bounding box (now expanded)
      • expandDirectional

        @NotNull
        public BoundingBox expandDirectional​(@NotNull
                                             Vector direction)
        Expands this bounding box in the specified direction.

        Negative values will expand the bounding box in the negative direction, positive values will expand it in the positive direction. The magnitude of the direction vector determines the amount of expansion.

        Parameters:
        direction - the direction and magnitude of the expansion
        Returns:
        this bounding box (now expanded)
      • union

        @NotNull
        public BoundingBox union​(double posX,
                                 double posY,
                                 double posZ)
        Expands this bounding box to contain (or border) the specified position.
        Parameters:
        posX - the x position value
        posY - the y position value
        posZ - the z position value
        Returns:
        this bounding box (now expanded)
        See Also:
        contains(double, double, double)
      • union

        @NotNull
        public BoundingBox union​(@NotNull
                                 Vector position)
        Expands this bounding box to contain (or border) the specified position.
        Parameters:
        position - the position
        Returns:
        this bounding box (now expanded)
        See Also:
        contains(double, double, double)
      • union

        @NotNull
        public BoundingBox union​(@NotNull
                                 Location position)
        Expands this bounding box to contain (or border) the specified position.
        Parameters:
        position - the position
        Returns:
        this bounding box (now expanded)
        See Also:
        contains(double, double, double)
      • union

        @NotNull
        public BoundingBox union​(@NotNull
                                 BoundingBox other)
        Expands this bounding box to contain both this and the given bounding box.
        Parameters:
        other - the other bounding box
        Returns:
        this bounding box (now expanded)
      • intersection

        @NotNull
        public BoundingBox intersection​(@NotNull
                                        BoundingBox other)
        Resizes this bounding box to represent the intersection of this and the given bounding box.
        Parameters:
        other - the other bounding box
        Returns:
        this bounding box (now representing the intersection)
        Throws:
        IllegalArgumentException - if the bounding boxes don't overlap
      • shift

        @NotNull
        public BoundingBox shift​(double shiftX,
                                 double shiftY,
                                 double shiftZ)
        Shifts this bounding box by the given amounts.
        Parameters:
        shiftX - the shift in x direction
        shiftY - the shift in y direction
        shiftZ - the shift in z direction
        Returns:
        this bounding box (now shifted)
      • shift

        @NotNull
        public BoundingBox shift​(@NotNull
                                 Vector shift)
        Shifts this bounding box by the given amounts.
        Parameters:
        shift - the shift
        Returns:
        this bounding box (now shifted)
      • shift

        @NotNull
        public BoundingBox shift​(@NotNull
                                 Location shift)
        Shifts this bounding box by the given amounts.
        Parameters:
        shift - the shift
        Returns:
        this bounding box (now shifted)
      • overlaps

        public boolean overlaps​(@NotNull
                                BoundingBox other)
        Checks if this bounding box overlaps with the given bounding box.

        Bounding boxes that are only intersecting at the borders are not considered overlapping.

        Parameters:
        other - the other bounding box
        Returns:
        true if overlapping
      • overlaps

        public boolean overlaps​(@NotNull
                                Vector min,
                                @NotNull
                                Vector max)
        Checks if this bounding box overlaps with the bounding box that is defined by the given corners.

        Bounding boxes that are only intersecting at the borders are not considered overlapping.

        Parameters:
        min - the first corner
        max - the second corner
        Returns:
        true if overlapping
      • contains

        public boolean contains​(double x,
                                double y,
                                double z)
        Checks if this bounding box contains the specified position.

        Positions exactly on the minimum borders of the bounding box are considered to be inside the bounding box, while positions exactly on the maximum borders are considered to be outside. This allows bounding boxes to reside directly next to each other with positions always only residing in exactly one of them.

        Parameters:
        x - the position's x coordinates
        y - the position's y coordinates
        z - the position's z coordinates
        Returns:
        true if the bounding box contains the position
      • contains

        public boolean contains​(@NotNull
                                Vector position)
        Checks if this bounding box contains the specified position.

        Positions exactly on the minimum borders of the bounding box are considered to be inside the bounding box, while positions exactly on the maximum borders are considered to be outside. This allows bounding boxes to reside directly next to each other with positions always only residing in exactly one of them.

        Parameters:
        position - the position
        Returns:
        true if the bounding box contains the position
      • contains

        public boolean contains​(@NotNull
                                BoundingBox other)
        Checks if this bounding box fully contains the given bounding box.
        Parameters:
        other - the other bounding box
        Returns:
        true if the bounding box contains the given bounding box
      • contains

        public boolean contains​(@NotNull
                                Vector min,
                                @NotNull
                                Vector max)
        Checks if this bounding box fully contains the bounding box that is defined by the given corners.
        Parameters:
        min - the first corner
        max - the second corner
        Returns:
        true if the bounding box contains the specified bounding box
      • rayTrace

        @Nullable
        public RayTraceResult rayTrace​(@NotNull
                                       Vector start,
                                       @NotNull
                                       Vector direction,
                                       double maxDistance)
        Calculates the intersection of this bounding box with the specified line segment.

        Intersections at edges and corners yield one of the affected block faces as hit result, but it is not defined which of them.

        Parameters:
        start - the start position
        direction - the ray direction
        maxDistance - the maximum distance
        Returns:
        the ray trace hit result, or null if there is no hit
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class Object
      • clone

        @NotNull
        public BoundingBox clone()
        Creates a copy of this bounding box.
        Overrides:
        clone in class Object
        Returns:
        the cloned bounding box