Fix and optimize FindTilesInCircle

This commit is contained in:
Pavlos Touboulidis
2014-06-21 02:18:55 +03:00
parent 1c511ea6eb
commit daed053a57
7 changed files with 42 additions and 50 deletions

View File

@@ -45,16 +45,13 @@ namespace OpenRA.Mods.RA.Activities
{
var map = self.World.Map;
var maxCells = (maxRange.Range + 1023) / 1024;
var outerCells = map.FindTilesInCircle(targetPosition, maxCells);
var minCells = minRange.Range / 1024;
var innerCells = map.FindTilesInCircle(targetPosition, minCells);
var outerSq = maxRange.Range * maxRange.Range;
var innerSq = minRange.Range * minRange.Range;
var center = target.CenterPosition;
return outerCells.Except(innerCells).Where(c =>
return map.FindTilesInAnnulus(targetPosition, minCells + 1, maxCells).Where(c =>
{
var dxSq = (map.CenterOfCell(c) - center).HorizontalLengthSquared;
return dxSq >= innerSq && dxSq <= outerSq;

View File

@@ -99,18 +99,13 @@ namespace OpenRA.Mods.RA.Activities
if (pos.CanEnterCell(destination) && self.Owner.Shroud.IsExplored(destination))
return destination;
var searched = new List<CPos>();
for (var r = 1; r <= maxCellSearchRange || (maximumDistance != null && r <= maximumDistance); r++)
var max = maximumDistance != null ? maximumDistance.Value : maxCellSearchRange;
foreach (var tile in self.World.Map.FindTilesInCircle(destination, max))
{
foreach (var tile in self.World.Map.FindTilesInCircle(destination, r).Except(searched))
{
if (self.Owner.Shroud.IsExplored(tile)
&& (restrictTo == null || (restrictTo != null && restrictTo.Contains(tile)))
&& pos.CanEnterCell(tile))
return tile;
searched.Add(tile);
}
if (self.Owner.Shroud.IsExplored(tile)
&& (restrictTo == null || (restrictTo != null && restrictTo.Contains(tile)))
&& pos.CanEnterCell(tile))
return tile;
}
return null;