Order results from FindTilesInCircle by distance
This commit is contained in:
@@ -58,13 +58,36 @@ namespace OpenRA
|
|||||||
|
|
||||||
public static IEnumerable<CPos> FindTilesInCircle(this World world, CPos a, int r)
|
public static IEnumerable<CPos> FindTilesInCircle(this World world, CPos a, int r)
|
||||||
{
|
{
|
||||||
var min = world.ClampToWorld(a - new CVec(r, r));
|
if (r > TilesByDistance.Length)
|
||||||
var max = world.ClampToWorld(a + new CVec(r, r));
|
throw new InvalidOperationException("FindTilesInCircle supports queries for only <= {0}".F(MaxRange));
|
||||||
for (var j = min.Y; j <= max.Y; j++)
|
|
||||||
for (var i = min.X; i <= max.X; i++)
|
for(var i = 0; i < r; i++)
|
||||||
if (r * r >= (new CPos(i, j) - a).LengthSquared)
|
{
|
||||||
yield return new CPos(i, j);
|
foreach(var offset in TilesByDistance[i])
|
||||||
|
{
|
||||||
|
var t = offset + a;
|
||||||
|
if (world.Map.Bounds.Contains(t.X, t.Y))
|
||||||
|
yield return t;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<CVec>[] InitTilesByDistance(int max)
|
||||||
|
{
|
||||||
|
var ts = new List<CVec>[max+1];
|
||||||
|
for (var i = 0; i < max+1; i++)
|
||||||
|
ts[i] = new List<CVec>();
|
||||||
|
|
||||||
|
for (var j = -max; j <= max; j++)
|
||||||
|
for (var i = -max; i <= max; i++)
|
||||||
|
if (max * max >= i * i + j * j)
|
||||||
|
ts[(int)Math.Ceiling(Math.Sqrt(i*i + j*j))].Add(new CVec(i,j));
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int MaxRange = 50;
|
||||||
|
static List<CVec>[] TilesByDistance = InitTilesByDistance(MaxRange);
|
||||||
|
|
||||||
public static string GetTerrainType(this World world, CPos cell)
|
public static string GetTerrainType(this World world, CPos cell)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user