Пример #1
0
    /// <returns>(Overall areas, Unique areas)</returns>
    private (int total, int unique) getUniqueAreas(MyVector2 areaSizing, int spriteIndex, ConcurrentDictionary <string, MyArea> areas, IAreaEnumerator areaEnumerator, ProgressReport progressReport)
    {
        var areasTotal  = 0;
        var areasUnique = 0;

        areaEnumerator.EnumerateThroughSprite(areaSizing, spriteIndex, (sprite, index, x, y) =>
        {
            if (!_mapOfEmptiness.Contains(areaSizing, index, x, y))
            {
                var area = MyArea.CreateFromSprite(sprite, spriteIndex, x, y, areaSizing);
                var hash = area.UniqueString;
                if (areas.TryAdd(hash, area))
                {
                    areasUnique++;
                }
                area = areas[hash];

                area.Correlations.TryAdd(area.Correlations.Count, new MyAreaCoordinates(index, x, y, areaSizing.X, areaSizing.Y));

                areasTotal++;
            }
        });
        progressReport.OperationsDone++;
        return(areasTotal, areasUnique);
    }
Пример #2
0
 internal async Task Initialize(IEnumerable <MyVector2> areaSizings, MyColor[][][] sprites, IAreaEnumerator enumerator)
 {
     var sizingsList = areaSizings.ToList();
     await Task.Run(() =>
     {
         Parallel.For(0, sizingsList.Count, i =>
         {
             var sizing        = sizingsList[i];
             var newSizingDict = new ConcurrentDictionary <int, List <int> >();
             _mapOfEmptiness.AddOrUpdate(sizing, newSizingDict, (_, __) => newSizingDict);
             Parallel.For(0, sprites.Length, j =>
             {
                 var newSpriteDict = new List <int>();
                 newSizingDict.AddOrUpdate(j, newSpriteDict, (_, __) => newSpriteDict);
                 enumerator.EnumerateThroughSprite(sizing, j, (sprite, spriteIndex, x, y) =>
                 {
                     var area = MyArea.CreateFromSprite(sprite, spriteIndex, x, y, sizing);
                     if (area.OpaquePixelsCount == 0)
                     {
                         newSpriteDict.Add(x + y *_yMultiplier);
                     }
                 });
             });
         });
     });
 }