Class ZoneOfInfluence

java.lang.Object
com.github.yellowstonegames.path.ZoneOfInfluence

public class ZoneOfInfluence extends Object
Calculates the Zone of Influence, also known as Zone of Control, for different points on a map. Uses Region for faster storage and manipulation of zones; it's suggested if you use this class to be somewhat familiar with the methods for manipulating data in that class, though a Region can also be used just like a Collection of Coord values.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected boolean
     
    protected DijkstraMap
     
    protected com.github.yellowstonegames.grid.Region[]
     
    protected com.github.yellowstonegames.grid.Coord[][]
     
    protected com.github.yellowstonegames.grid.Radius
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    ZoneOfInfluence(com.github.yellowstonegames.grid.Coord[][] influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
    Constructs a Zone of Influence map.
    ZoneOfInfluence(com.github.yellowstonegames.grid.Coord[] influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
    Constructs a Zone of Influence map.
    ZoneOfInfluence(Collection<com.github.yellowstonegames.grid.Coord> influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
    Constructs a Zone of Influence map.
  • Method Summary

    Modifier and Type
    Method
    Description
    com.github.yellowstonegames.grid.Region[]
    Finds the zones of influence for each of the influences (inner arrays of Coord) this was constructed with, and returns all zones as a Region array.
    com.github.yellowstonegames.grid.Coord[][]
    Gets the influencing groups; ideally the result should not be changed without setting it back with setInfluences.
    protected com.github.yellowstonegames.grid.Region
    increasing(float[][] dm, com.github.yellowstonegames.grid.Coord[] inf)
     
    com.github.tommyettinger.ds.IntList
    nearestInfluences(com.github.yellowstonegames.grid.Coord point)
    This can be given a Coord to check in the results of the latest calculate() call.
    com.github.tommyettinger.ds.IntList
    nearestInfluences(com.github.yellowstonegames.grid.Region[] zones, com.github.yellowstonegames.grid.Coord point)
    Given the zones resulting from this class' calculate() method and a Coord to check, finds the indices of all influencing groups in zones that have the Coord in their area, and returns all such indices as a newly-allocated IntList.
    void
    setInfluences(com.github.yellowstonegames.grid.Coord[][] influences)
    Changes the influencing groups.

    Methods inherited from class Object

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

    • dijkstra

      protected DijkstraMap dijkstra
    • influences

      protected com.github.yellowstonegames.grid.Coord[][] influences
    • groups

      protected com.github.yellowstonegames.grid.Region[] groups
    • completed

      protected boolean completed
    • radius

      protected com.github.yellowstonegames.grid.Radius radius
  • Constructor Details

    • ZoneOfInfluence

      public ZoneOfInfluence(com.github.yellowstonegames.grid.Coord[][] influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
      Constructs a Zone of Influence map. Takes a (quite possibly jagged) array of arrays of Coord influences, where the elements of the outer array represent different groups of influencing "factions" or groups that exert control over nearby areas, and the Coord elements of the inner array represent individual spots that are part of those groups and share influence with all Coord in the same inner array. Also takes a char[][] for a map, which can be the simplified map with only '#' for walls and '.' for floors, or the final map (with chars like '~' for deep water as well as walls and floors), and a Radius enum that will be used to determine how distance is calculated.
      Call calculate() when you want information out of this.
      Parameters:
      influences - an outer array containing influencing groups, each an array containing Coords that influence
      map - a char[][] that is used as an area map; should be bounded
      radiusStrategy - a Radius enum that corresponds to how distance should be measured
    • ZoneOfInfluence

      public ZoneOfInfluence(com.github.yellowstonegames.grid.Coord[] influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
      Constructs a Zone of Influence map. Takes an arrays of Coord influences, where each Coord is treated as both a one-element group of influencing "factions" or groups that exert control over nearby areas, and the individual spot that makes up one of those groups and spreads influence. Also takes a char[][] for a map, which can be the simplified map with only '#' for walls and '.' for floors, or the final map (with chars like '~' for deep water as well as walls and floors), and a Radius enum that will be used to determine how distance is calculated.
      Call calculate() when you want information out of this.
      Parameters:
      influences - an array containing Coords that each have their own independent influence
      map - a char[][] that is used as an area map; should be bounded
      radiusStrategy - a Radius enum that corresponds to how distance should be measured
      See Also:
      • PoissonDisk provides a good way to generate evenly spaced Coords
    • ZoneOfInfluence

      public ZoneOfInfluence(Collection<com.github.yellowstonegames.grid.Coord> influences, char[][] map, com.github.yellowstonegames.grid.Radius radiusStrategy)
      Constructs a Zone of Influence map. Takes a Collection of Coord influences, where each Coord is treated as both a one-element group of influencing "factions" or groups that exert control over nearby areas, and the individual spot that makes up one of those groups and spreads influence. Also takes a char[][] for a map, which can be the simplified map with only '#' for walls and '.' for floors, or the final map (with chars like '~' for deep water as well as walls and floors), and a Radius enum that will be used to determine how distance is calculated.
      It often makes sense to use a Region as the Collection of Coord.
      Call calculate() when you want information out of this.
      Parameters:
      influences - A Collection of Coord, such as a Region, where each Coord has independent influence
      map - a char[][] that is used as an area map; should be bounded
      radiusStrategy - a Radius enum that corresponds to how distance should be measured
  • Method Details

    • calculate

      public com.github.yellowstonegames.grid.Region[] calculate()
      Finds the zones of influence for each of the influences (inner arrays of Coord) this was constructed with, and returns all zones as a Region array. This has each zone of influence overlap with its neighbors; this is useful to find borders using Region.and(Region), and borders are typically between 1 and 2 cells wide. You can get a different region if you want region A without the overlapping areas it shares with region B by using Region.andNot(Region). Merging two zones A and B can be done with Region.or(Region). You can transform the data into a boolean[][] easily with Region.decode(), where true is contained in the zone and false is not. The methods Region.fringe(), Region.expand(), Region.singleRandom(EnhancedRandom), and Region.separatedBlue(float) are also potentially useful for this sort of data. You should save the Region[] for later use if you want to call nearestInfluences(Region[], Coord).
      The first Region in the returned Region[] will correspond to the area influenced by the first Coord[] in the nested array passed to the constructor (or the first Coord if a non-nested array was passed); the second will correspond to the second, and so on. The length of the Region[] this returns will equal the number of influence groups.
      Returns:
      a Region array, with each item storing a zone's area
    • increasing

      protected com.github.yellowstonegames.grid.Region increasing(float[][] dm, com.github.yellowstonegames.grid.Coord[] inf)
    • nearestInfluences

      public com.github.tommyettinger.ds.IntList nearestInfluences(com.github.yellowstonegames.grid.Region[] zones, com.github.yellowstonegames.grid.Coord point)
      Given the zones resulting from this class' calculate() method and a Coord to check, finds the indices of all influencing groups in zones that have the Coord in their area, and returns all such indices as a newly-allocated IntList.
      Parameters:
      zones - a Region[] returned by calculate()
      point - the Coord to test
      Returns:
      an IntVLA where each element is the index of an influencing group in zones
    • nearestInfluences

      public com.github.tommyettinger.ds.IntList nearestInfluences(com.github.yellowstonegames.grid.Coord point)
      This can be given a Coord to check in the results of the latest calculate() call. Finds the indices of all influencing groups in zones that have the Coord in their area, and returns all such indices as a newly-allocated IntList.
      Parameters:
      point - the Coord to test
      Returns:
      an IntVLA where each element is the index of an influencing group in zones
    • getInfluences

      public com.github.yellowstonegames.grid.Coord[][] getInfluences()
      Gets the influencing groups; ideally the result should not be changed without setting it back with setInfluences.
      Returns:
      influences a jagged array of Coord arrays, where the inner arrays are groups of influences
    • setInfluences

      public void setInfluences(com.github.yellowstonegames.grid.Coord[][] influences)
      Changes the influencing groups. This also invalidates the last calculation for the purposes of nearestInfluences, at least for the overload that takes only a Coord.
      Parameters:
      influences - a jagged array of Coord arrays, where the inner arrays are groups of influences