Class EliasWuLine

java.lang.Object
com.github.yellowstonegames.grid.EliasWuLine
All Implemented Interfaces:
LineDrawer

public class EliasWuLine extends Object implements LineDrawer
Contains methods to draw anti-aliased lines based on floating-point coordinates. This isn't accurately drawing lines, because it has no way of determining if a line should be blocked by an obstacle. This means every isReachable(Coord, Coord, float[][]) method returns false. This is most useful for calculating a "soft" light map along a beam with anti-aliased edges.
Because of the way this line is calculated, endpoints may be swapped and therefore the list may not be in start-to-end order.
Based on work by Hugo Elias which is in turn based on work by Wu.
  • Constructor Summary

    Constructors
    Constructor
    Description
     
    EliasWuLine(int width, int height)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(int startX, int startY, int targetX, int targetY)
    Generates a 2D Bresenham line between two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(int startX, int startY, int targetX, int targetY, int maxLength)
    Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength (measured using Chebyshev distance, where diagonally adjacent cells are considered exactly as distant as orthogonally-adjacent cells).
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(int startX, int startY, int targetX, int targetY, int maxLength, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
    Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength (measured using Chebyshev distance, where diagonally adjacent cells are considered exactly as distant as orthogonally-adjacent cells).
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(int startX, int startY, int targetX, int targetY, int maxLength, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, float brightnessThreshold)
     
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(int startX, int startY, int targetX, int targetY, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
    Generates a 2D Bresenham line between two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(Coord start, Coord end)
    Generates a 2D Bresenham line between two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    drawLine(Coord start, Coord end, float brightnessThreshold)
     
    drawLineArray(int startX, int startY, int targetX, int targetY)
    Generates a 2D Bresenham line between two points.
    drawLineArray(int startX, int startY, int targetX, int targetY, int maxLength)
    Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength.
    Generates a 2D Bresenham line between two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    floatLine(float startx, float starty, float endx, float endy)
    Gets the line between the two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    floatLine(float startx, float starty, float endx, float endy, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, int maxLength)
    Gets the line between the two points.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    floatLine(float startx, float starty, float endx, float endy, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, int maxLength, float brightnessThreshold)
    Gets the line between the two points.
    int
     
    com.github.tommyettinger.ds.ObjectDeque<Coord>
    Gets the last line drawn using the internal buffer this carries, rather than an explicitly-specified buffer.
    com.github.tommyettinger.ds.ObjectDeque<Coord>
     
    int
     
    boolean
    isReachable(int startX, int startY, int targetX, int targetY, float[][] resistanceMap)
    Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way.
    boolean
    isReachable(int startX, int startY, int targetX, int targetY, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
    Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer.
    boolean
    isReachable(int startX, int startY, int targetX, int targetY, int maxLength, float[][] resistanceMap)
    Checks whether the starting point can see the target point, using the maxLength and resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way.
    boolean
    isReachable(int startX, int startY, int targetX, int targetY, int maxLength, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
    Checks whether the starting point can see the target point, using the maxLength and resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer.
    boolean
    isReachable(Coord start, Coord target, float[][] resistanceMap)
    Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way.
    boolean
    isReachable(Coord start, Coord target, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
    Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer.
    float[][]
    lightMap(float startx, float starty, float endx, float endy)
     
    void
    setHeight(int height)
     
    void
    setSize(int width, int height)
     
    void
    setWidth(int width)
     

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • EliasWuLine

      public EliasWuLine()
    • EliasWuLine

      public EliasWuLine(int width, int height)
  • Method Details

    • setSize

      public void setSize(int width, int height)
    • getWidth

      public int getWidth()
    • setWidth

      public void setWidth(int width)
    • getHeight

      public int getHeight()
    • setHeight

      public void setHeight(int height)
    • lightMap

      public float[][] lightMap(float startx, float starty, float endx, float endy)
    • floatLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> floatLine(float startx, float starty, float endx, float endy)
      Gets the line between the two points. Uses the previously set brightness threshold, or 0 if it has not been set.
      Parameters:
      startx -
      starty -
      endx -
      endy -
      Returns:
    • floatLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> floatLine(float startx, float starty, float endx, float endy, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, int maxLength)
      Gets the line between the two points. Uses the previously set brightness threshold, or 0 if it has not been set.
      Parameters:
      startx -
      starty -
      endx -
      endy -
      Returns:
    • floatLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> floatLine(float startx, float starty, float endx, float endy, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, int maxLength, float brightnessThreshold)
      Gets the line between the two points.
      Parameters:
      startx -
      starty -
      endx -
      endy -
      brightnessThreshold - between 0.0 (default) and 1.0; only Coords with higher brightness will be included
      Returns:
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(Coord start, Coord end)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points. Reuses LineDrawer.getLastLine() and returns it as the buffer; later calls to drawLine() without a buffer will probably clear lastLine (which is the same ObjectDeque this returns) as they are run.
      Specified by:
      drawLine in interface LineDrawer
      Parameters:
      start - the starting point
      end - the ending point
      Returns:
      The path between a and b.
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(Coord start, Coord end, float brightnessThreshold)
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(int startX, int startY, int targetX, int targetY)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points. Reuses LineDrawer.getLastLine() and returns it as the buffer; later calls to drawLine() without a buffer will probably clear lastLine (which is the same ObjectDeque this returns) as they are run.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLine in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      Returns:
      a ObjectDeque of Coord points along the line
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(int startX, int startY, int targetX, int targetY, int maxLength)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength (measured using Chebyshev distance, where diagonally adjacent cells are considered exactly as distant as orthogonally-adjacent cells). Reuses LineDrawer.getLastLine() and returns it as the buffer; later calls to drawLine() without a buffer will probably clear lastLine (which is the same ObjectDeque this returns) as they are run.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLine in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      Returns:
      a ObjectDeque of Coord points along the line
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(int startX, int startY, int targetX, int targetY, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points. If you want to save some memory, you can reuse an ObjectDeque of Coord, buffer, which will be cleared and filled with the resulting line of Coord. If buffer is null, this will create a new ObjectDeque of Coord and return that.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLine in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      buffer - an ObjectDeque of Coord that will be reused and cleared if not null; will be modified
      Returns:
      an ObjectDeque of Coord points along the line
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(int startX, int startY, int targetX, int targetY, int maxLength, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength (measured using Chebyshev distance, where diagonally adjacent cells are considered exactly as distant as orthogonally-adjacent cells). If you want to save some memory, you can reuse an ObjectDeque of Coord, buffer, which will be cleared and filled with the resulting line of Coord. If buffer is null, this will create a new ObjectDeque of Coord and return that.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLine in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      maxLength - the largest count of Coord points this can return; will stop early if reached
      buffer - an ObjectDeque of Coord that will be reused and cleared if not null; will be modified
      Returns:
      an ObjectDeque of Coord points along the line
    • drawLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> drawLine(int startX, int startY, int targetX, int targetY, int maxLength, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer, float brightnessThreshold)
    • getLastPath

      public com.github.tommyettinger.ds.ObjectDeque<Coord> getLastPath()
    • getLastLine

      public com.github.tommyettinger.ds.ObjectDeque<Coord> getLastLine()
      Description copied from interface: LineDrawer
      Gets the last line drawn using the internal buffer this carries, rather than an explicitly-specified buffer.
      Specified by:
      getLastLine in interface LineDrawer
      Returns:
      an ObjectDeque of Coord that contains the last line drawn with this LineDrawer's internal buffer
    • isReachable

      public boolean isReachable(Coord start, Coord target, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). buffer may be null (in which case a temporary ObjectDeque is allocated, which can be wasteful), or may be an existing ObjectDeque of Coord (which will be cleared if it has any contents). If the starting point can see the target point, this returns true and buffer will contain all Coord points along the line of sight; otherwise this returns false and buffer will only contain up to and including the point that blocked the line of sight.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      start - the starting point
      target - the target point
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      buffer - an ObjectDeque of Coord that will be reused and cleared if not null; will be modified
      Returns:
      true if the starting point can see the target point; false otherwise
    • isReachable

      public boolean isReachable(int startX, int startY, int targetX, int targetY, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). buffer may be null (in which case a temporary ObjectDeque is allocated, which can be wasteful), or may be an existing ObjectDeque of Coord (which will be cleared if it has any contents). If the starting point can see the target point, this returns true and buffer will contain all Coord points along the line of sight; otherwise this returns false and buffer will only contain up to and including the point that blocked the line of sight.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      startX - the x-coordinate of the starting point
      startY - the y-coordinate of the starting point
      targetX - the x-coordinate of the target point
      targetY - the y-coordinate of the target point
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      buffer - an ObjectDeque of Coord that will be reused and cleared if not null; will be modified
      Returns:
      true if the starting point can see the target point; false otherwise
    • isReachable

      public boolean isReachable(int startX, int startY, int targetX, int targetY, int maxLength, float[][] resistanceMap, com.github.tommyettinger.ds.ObjectDeque<Coord> buffer)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the maxLength and resistanceMap to determine whether the line of sight is obstructed, and filling the list of cells along the line of sight into buffer. The maxLength is measured using Chebyshev distance, where diagonally adjacent cells are considered exactly as distant as orthogonally-adjacent cells. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). buffer may be null (in which case a temporary ObjectDeque is allocated, which can be wasteful), or may be an existing ObjectDeque of Coord (which will be cleared if it has any contents). If the starting point can see the target point, this returns true and buffer will contain all Coord points along the line of sight; otherwise this returns false and buffer will only contain up to and including the point that blocked the line of sight.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      startX - the x-coordinate of the starting point
      startY - the y-coordinate of the starting point
      targetX - the x-coordinate of the target point
      targetY - the y-coordinate of the target point
      maxLength - the maximum permitted length of a line of sight
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      buffer - an ObjectDeque of Coord that will be reused and cleared if not null; will be modified
      Returns:
      true if the starting point can see the target point; false otherwise
    • isReachable

      public boolean isReachable(Coord start, Coord target, float[][] resistanceMap)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). If the starting point can see the target point, this returns true; otherwise this returns false.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      start - the starting point
      target - the target point
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      Returns:
      true if the starting point can see the target point; false otherwise
    • isReachable

      public boolean isReachable(int startX, int startY, int targetX, int targetY, float[][] resistanceMap)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). If the starting point can see the target point, this returns true; otherwise this returns false.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      startX - the x-coordinate of the starting point
      startY - the y-coordinate of the starting point
      targetX - the x-coordinate of the target point
      targetY - the y-coordinate of the target point
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      Returns:
      true if the starting point can see the target point; false otherwise
    • isReachable

      public boolean isReachable(int startX, int startY, int targetX, int targetY, int maxLength, float[][] resistanceMap)
      Description copied from interface: LineDrawer
      Checks whether the starting point can see the target point, using the maxLength and resistanceMap to determine whether the line of sight is obstructed, without storing the line of points along the way. resistanceMap must not be null; it can be initialized in the same way as FOV's resistance maps can with FOV.generateResistances(char[][]) or FOV.generateSimpleResistances(char[][]). If the starting point can see the target point, this returns true; otherwise this returns false.
      Specified by:
      isReachable in interface LineDrawer
      Parameters:
      startX - the x-coordinate of the starting point
      startY - the y-coordinate of the starting point
      targetX - the x-coordinate of the target point
      targetY - the y-coordinate of the target point
      maxLength - the maximum permitted length of a line of sight
      resistanceMap - a resistance map as produced by FOV.generateResistances(char[][]); 0 is visible and 1 is blocked
      Returns:
      true if the starting point can see the target point; false otherwise
    • drawLineArray

      public Coord[] drawLineArray(Coord a, Coord b)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points. This allocates a new array with each call, sized to fit the line exactly. It does not change LineDrawer.getLastLine().
      Specified by:
      drawLineArray in interface LineDrawer
      Parameters:
      a - the starting point
      b - the ending point
      Returns:
      The path between a and b.
    • drawLineArray

      public Coord[] drawLineArray(int startX, int startY, int targetX, int targetY)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points. Returns an array of Coord instead of a ObjectDeque. This allocates a new array with each call, sized to fit the line exactly.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLineArray in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      Returns:
      an array of Coord points along the line
    • drawLineArray

      public Coord[] drawLineArray(int startX, int startY, int targetX, int targetY, int maxLength)
      Description copied from interface: LineDrawer
      Generates a 2D Bresenham line between two points, stopping early if the number of Coords returned reaches maxLength. Returns an array of Coord instead of an ObjectDeque. This allocates a new array with each call, sized to fit the line exactly.
      Uses ordinary Coord values for points, and these can be pooled if they are within what the current pool allows (it starts, by default, pooling Coords with x and y between -3 and 255, inclusive). If the Coords are pool-able, it can significantly reduce the work the garbage collector needs to do, especially on Android.
      Specified by:
      drawLineArray in interface LineDrawer
      Parameters:
      startX - the x coordinate of the starting point
      startY - the y coordinate of the starting point
      targetX - the x coordinate of the target point
      targetY - the y coordinate of the target point
      maxLength - the largest count of Coord points this can return; will stop early if reached
      Returns:
      an array of Coord points along the line