private void AddCirularInclusion(Scope scope, Point coordinates)
        {
            var pointsInside = GetPointsInsideCircle(inclusionsProperties.Size, coordinates);

            foreach (var point in pointsInside)
            {
                if (point.X < scope.Width && point.X > 0 && point.Y < scope.Height && point.Y > 0)
                {
                    if (!StructureHelpers.IsIdSpecial(scope.StructureArray[point.X, point.Y].Id) || scope.StructureArray[point.X, point.Y].Id == 0)
                    {
                        scope.StructureArray[point.X, point.Y].Color = Color.Black;
                        scope.StructureArray[point.X, point.Y].Id    = Convert.ToInt32(SpecialIds.Inclusion);
                    }
                }
            }
        }
        private IList <int> GetNRandomGrainIds()
        {
            var        grainsIds    = new List <int>();
            Point      actRandCoord = new Point(0, 0);
            List <int> prevRandIds  = new List <int>();

            for (int i = 0; i < grainBoundariesProperties.NumberOfGrainsToSelectBoundaries; i++)
            {
                prevRandIds.Add(baseScope.StructureArray[actRandCoord.X, actRandCoord.Y].Id);
                do
                {
                    actRandCoord = StructureHelpers.RandomCoordinates(baseScope.Width, baseScope.Height, random);
                }while (prevRandIds.IndexOf(baseScope.StructureArray[actRandCoord.X, actRandCoord.Y].Id) != -1);
                grainsIds.Add(baseScope.StructureArray[actRandCoord.X, actRandCoord.Y].Id);
            }
            return(grainsIds);
        }
        private void AddSquareInclusion(Scope scope, Point coordinates)
        {
            int a     = (int)(inclusionsProperties.Size / Math.Sqrt(2));
            int halfA = (a / 2);

            for (int x = coordinates.X - halfA; (x <= coordinates.X + halfA && x < scope.Width && x > 0); x++)
            {
                for (int y = coordinates.Y - halfA; (y <= coordinates.Y + halfA && y < scope.Height && y > 0); y++)
                {
                    if (!StructureHelpers.IsIdSpecial(scope.StructureArray[x, y].Id) || scope.StructureArray[x, y].Id == 0)
                    {
                        scope.StructureArray[x, y].Color = Color.Black;
                        scope.StructureArray[x, y].Id    = Convert.ToInt32(SpecialIds.Inclusion);
                    }
                }
            }
        }
        public Scope ClearBackground()
        {
            for (int i = 1; i < baseScope.Width - 1; i++)
            {
                for (int j = 1; j < baseScope.Height - 1; j++)
                {
                    if (baseScope.StructureArray[i, j].Id != Convert.ToInt32(SpecialIds.Boundaries))
                    {
                        baseScope.StructureArray[i, j].Id    = Convert.ToInt32(SpecialIds.Empty);
                        baseScope.StructureArray[i, j].Color = Color.White;
                    }
                }
            }

            baseScope.IsFull = true;
            StructureHelpers.UpdateBitmap(baseScope);

            return(baseScope);
        }
        public Scope AddInclusionsAfterGrainGrowth(Scope scope)
        {
            for (int inclusionNumber = 0; inclusionNumber < inclusionsProperties.Amount; inclusionNumber++)
            {
                Point coordinates;
                do
                {
                    coordinates = StructureHelpers.RandomCoordinates(scope.Width, scope.Height, random);
                }while (!IsCoordinateOnGrainBoundaries(scope, coordinates));

                switch (inclusionsProperties.InclusionsType)
                {
                case InclusionsType.Square:
                    AddSquareInclusion(scope, coordinates);
                    break;

                case InclusionsType.Circular:
                    AddCirularInclusion(scope, coordinates);
                    break;
                }
            }

            return(scope);
        }
        public Scope AddInclusionsAtTheBegining(Scope scope)
        {
            for (int inclusionNumber = 0; inclusionNumber < inclusionsProperties.Amount; inclusionNumber++)
            {
                Point coordinates;
                do
                {
                    coordinates = StructureHelpers.RandomCoordinates(scope.Width, scope.Height, random);
                }while (scope.StructureArray[coordinates.X, coordinates.Y].Id != 0);

                switch (inclusionsProperties.InclusionsType)
                {
                case InclusionsType.Square:
                    AddSquareInclusion(scope, coordinates);
                    break;

                case InclusionsType.Circular:
                    AddCirularInclusion(scope, coordinates);
                    break;
                }
            }

            return(scope);
        }
        private bool IsCoordinateOnGrainBoundaries(Scope scope, Point coordinates)
        {
            var centerId      = scope.StructureArray[coordinates.X, coordinates.Y].Id;
            var neighboursIds = new List <int>
            {
                scope.StructureArray[coordinates.X - 1, coordinates.Y].Id,
                scope.StructureArray[coordinates.X + 1, coordinates.Y].Id,
                scope.StructureArray[coordinates.X, coordinates.Y - 1].Id,
                scope.StructureArray[coordinates.X, coordinates.Y + 1].Id,
                scope.StructureArray[coordinates.X - 1, coordinates.Y - 1].Id,
                scope.StructureArray[coordinates.X - 1, coordinates.Y + 1].Id,
                scope.StructureArray[coordinates.X + 1, coordinates.Y - 1].Id,
                scope.StructureArray[coordinates.X + 1, coordinates.Y + 1].Id
            };

            foreach (var neighbourId in neighboursIds)
            {
                if (centerId != neighbourId && !StructureHelpers.IsIdSpecial(neighbourId))
                {
                    return(true);
                }
            }
            return(false);
        }
        private Scope SelectAllGrainsBoundaries()
        {
            var grainBoungarySize = grainBoundariesProperties.GrainBoundarySize;

            for (int i = 2; i < baseScope.Width - 2; i++)
            {
                for (int j = 2; j < baseScope.Height - 2; j++)
                {
                    if (((baseScope.StructureArray[i, j].Id != baseScope.StructureArray[i + 1, j].Id &&
                          !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i + 1, j].Id)) ||
                         (baseScope.StructureArray[i, j].Id != baseScope.StructureArray[i - 1, j].Id &&
                          !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i - 1, j].Id))) &&
                        !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i, j].Id))
                    {
                        if (grainBoungarySize == 1)
                        {
                            baseScope.StructureArray[i, j].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                            baseScope.StructureArray[i, j].Color = boundaryColor;
                        }
                        else
                        {
                            int halfSize = (grainBoungarySize - 1) / 2;
                            if (halfSize == 0)
                            {
                                baseScope.StructureArray[i, j].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                                baseScope.StructureArray[i, j].Color = boundaryColor;
                            }
                            else
                            {
                                for (int w = i - halfSize; w < i + halfSize; w++)
                                {
                                    if (w > 0 && w < baseScope.Width - 1)
                                    {
                                        baseScope.StructureArray[w, j].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                                        baseScope.StructureArray[w, j].Color = boundaryColor;
                                    }
                                }
                            }
                        }
                    }
                    if (((baseScope.StructureArray[i, j].Id != baseScope.StructureArray[i, j + 1].Id &&
                          !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i, j + 1].Id)) ||
                         (baseScope.StructureArray[i, j].Id != baseScope.StructureArray[i, j - 1].Id &&
                          !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i, j - 1].Id))) &&
                        !StructureHelpers.IsIdSpecial(baseScope.StructureArray[i, j].Id))
                    {
                        if (grainBoungarySize == 1)
                        {
                            baseScope.StructureArray[i, j].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                            baseScope.StructureArray[i, j].Color = boundaryColor;
                        }
                        else
                        {
                            int halfSize = (grainBoungarySize - 1) / 2;
                            if (halfSize == 0)
                            {
                                baseScope.StructureArray[i, j].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                                baseScope.StructureArray[i, j].Color = boundaryColor;
                            }
                            else
                            {
                                for (int h = j - halfSize; h < j + halfSize; h++)
                                {
                                    if (h > 0 && h < baseScope.Height - 1)
                                    {
                                        baseScope.StructureArray[i, h].Id    = Convert.ToInt32(SpecialIds.Boundaries);
                                        baseScope.StructureArray[i, h].Color = boundaryColor;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            baseScope.IsFull = true;
            StructureHelpers.UpdateBitmap(baseScope);

            return(baseScope);
        }