示例#1
0
        public List <Vector2> Generate(MyRectangle generationArea, float generationCount,
                                       float exclusionRadius, int maxTries, int maxPerGridCount, IIntensitySamplingProvider intensityProvider)
        {
            var random = new UnsafeRandomProvider(); //todo!
            var offsetGenerationArea = new MyRectangle(0, 0, generationArea.Width, generationArea.Height);

            float cellSize = exclusionRadius;

            var width  = generationArea.Width;
            var height = generationArea.Height;

            var grid = new CountingGenerationGrid(
                cellSize,
                new IntVector2(Mathf.CeilToInt(width / cellSize), Mathf.CeilToInt(height / cellSize))
                );

            var processList    = new GenerationRandomQueue <Vector2>();
            var acceptedPoints = new List <Vector2>(1000);

            var firstPoint = new Vector2(random.Next(0, width), random.Next(0, height));

            processList.Add(firstPoint);
            acceptedPoints.Add(firstPoint);
            grid.Increment(firstPoint);


            int tryCount = 0;

            while (!processList.Empty)
            {
                var point = processList.RandomPop();
                for (int i = 0; i < generationCount; i++)
                {
                    Vector2 newPoint = GenerateRandomPointAround(point, exclusionRadius, random);

                    if (offsetGenerationArea.Contains(newPoint))
                    {
                        var maxPointsInGrid =
                            intensityProvider.Sample(
                                RectangleUtils.CalculateSubelementUv(offsetGenerationArea, newPoint)) *
                            maxPerGridCount;
                        if (grid.Retrive(newPoint) < maxPointsInGrid)
                        {
                            processList.Add(newPoint);
                            acceptedPoints.Add(newPoint);
                            grid.Increment(newPoint);
                        }
                    }
                    tryCount++;
                }
                if (tryCount > maxTries)
                {
                    break;
                }
            }
            return(acceptedPoints.Select(c => c + generationArea.DownLeftPoint).ToList());
        }
示例#2
0
        public List <Vector2> Generate(MyRectangle generationArea, int generationCount, float maxTries,
                                       float exclusionRadius, bool collisionsAreChecked, IIntensitySamplingProvider intensitySamplingProvider)
        {
            var random = new UnsafeRandomProvider(); //todo!
            var offsetGenerationArea = new MyRectangle(0, 0, generationArea.Width, generationArea.Height);

            float cellSize = exclusionRadius / Mathf.Sqrt(2);

            var width  = generationArea.Width;
            var height = generationArea.Height;

            var grid = new SingleElementGenerationGrid(
                cellSize,
                Mathf.CeilToInt(width / cellSize), Mathf.CeilToInt(height / cellSize),
                exclusionRadius
                );

            var acceptedPoints = new List <Vector2>(generationCount);

            int generatedPointsCount = 0;
            int triesCount           = 0;

            while (generatedPointsCount < generationCount && triesCount < maxTries)
            {
                var randomPoint = new Vector2(random.Next(0, width), random.Next(0, height));

                var randomPointValue = random.NextValue;
                var intensity        =
                    intensitySamplingProvider.Sample(
                        RectangleUtils.CalculateSubelementUv(offsetGenerationArea, randomPoint));
                if (intensity >= randomPointValue)
                {
                    if (!collisionsAreChecked || !grid.Collides(randomPoint))
                    {
                        if (collisionsAreChecked)
                        {
                            grid.Set(randomPoint);
                        }

                        acceptedPoints.Add(randomPoint);
                        generatedPointsCount++;
                    }
                }

                triesCount++;
            }
            return(acceptedPoints.Select(c => c + generationArea.DownLeftPoint).ToList());
        }
示例#3
0
        public List <Vector2> Generate(MyRectangle generationArea, float generationCount,
                                       float exclusionRadius)
        {
            var random = new UnsafeRandomProvider(); //todo!
            var offsetGenerationArea = new MyRectangle(0, 0, generationArea.Width, generationArea.Height);

            float cellSize = exclusionRadius / Mathf.Sqrt(2);

            var width  = generationArea.Width;
            var height = generationArea.Height;

            var grid = new SingleElementGenerationGrid(
                cellSize,
                Mathf.CeilToInt(width / cellSize), Mathf.CeilToInt(height / cellSize),
                exclusionRadius
                );

            var processList    = new GenerationRandomQueue <Vector2>();
            var acceptedPoints = new List <Vector2>(1000);

            var firstPoint = new Vector2(random.Next(0, width), random.Next(0, height));

            processList.Add(firstPoint);
            acceptedPoints.Add(firstPoint);

            grid.Set(firstPoint);

            while (!processList.Empty)
            {
                var point = processList.RandomPop();
                for (int i = 0; i < generationCount; i++)
                {
                    Vector2 newPoint = GenerateRandomPointAround(point, exclusionRadius, random);
                    if (offsetGenerationArea.Contains(newPoint) && !grid.Collides(newPoint))
                    {
                        processList.Add(newPoint);
                        acceptedPoints.Add(newPoint);
                        grid.Set(newPoint);
                    }
                }
            }
            return(acceptedPoints.Select(c => c + generationArea.DownLeftPoint).ToList());
        }
示例#4
0
        private Vector2 GenerateRandomPointAround(Vector2 point, float exclusionRadius, UnsafeRandomProvider random)
        {
            var radius = exclusionRadius * random.Next(0, 2);
            var angle  = random.Next(0, 2 * Mathf.PI);

            return(new Vector2(
                       point.x + radius * Mathf.Cos(angle),
                       point.y + radius * Mathf.Sin(angle)
                       ));
        }
示例#5
0
        public List <Vector2> Generate(MyRectangle generationArea, float generationCount,
                                       MyRange exclusionRadiusRange,
                                       IIntensitySamplingProvider intensityProvider, int maxTries)

        {
            var random = new UnsafeRandomProvider(); //todo!
            var offsetGenerationArea = new MyRectangle(0, 0, generationArea.Width, generationArea.Height);

            float cellSize = exclusionRadiusRange.Max / Mathf.Sqrt(2);

            var width  = generationArea.Width;
            var height = generationArea.Height;

            var grid = new GenerationMultipointGrid(
                cellSize,
                new IntVector2(Mathf.CeilToInt(width / cellSize), Mathf.CeilToInt(height / cellSize))
                );
            //if (usedCount++ % 2 == 0)
            //{
            //    return new List<Vector2>();
            //}

            var processList    = new GenerationRandomQueue <PointWithExclusionRadius>();
            var acceptedPoints = new List <Vector2>(1000);


            PointWithExclusionRadius firstPoint = null;

            while (firstPoint == null)
            {
                maxTries--;
                if (maxTries < 0)
                {
                    return(acceptedPoints);
                }

                var randX       = random.Next(0, width);
                var randY       = random.Next(0, height);
                var randomPoint = new Vector2(randY, randX);

                var exclusionRadius = CalculateExclusionRadius(randomPoint, offsetGenerationArea, exclusionRadiusRange,
                                                               intensityProvider);
                if (!exclusionRadius.HasValue)
                {
                    continue;
                }
                firstPoint = new PointWithExclusionRadius()
                {
                    ExclusionRadius = exclusionRadius.Value,
                    Point           = randomPoint
                };
            }
            ;
            processList.Add(firstPoint);
            acceptedPoints.Add(firstPoint.Point);

            grid.Set(firstPoint);

            while (!processList.Empty)
            {
                var point = processList.RandomPop();
                for (int i = 0; i < generationCount; i++)
                {
                    Vector2 newPoint = GenerateRandomPointAround(point.Point, point.ExclusionRadius, random);
                    if (offsetGenerationArea.Contains(newPoint))
                    {
                        var calculatedExclusionRadius = CalculateExclusionRadius(newPoint, offsetGenerationArea,
                                                                                 exclusionRadiusRange, intensityProvider);
                        if (!calculatedExclusionRadius.HasValue)
                        {
                            continue;
                        }
                        var newPointWithExclusionRadius = new PointWithExclusionRadius()
                        {
                            Point           = newPoint,
                            ExclusionRadius = calculatedExclusionRadius.Value
                        };

                        if (!grid.Collides(newPointWithExclusionRadius))
                        {
                            processList.Add(newPointWithExclusionRadius);
                            acceptedPoints.Add(newPoint);
                            grid.Set(newPointWithExclusionRadius);
                        }
                    }
                    maxTries--;
                }
                if (maxTries < 0)
                {
                    break;
                }
            }

            return(acceptedPoints.Select(c => c + generationArea.DownLeftPoint).ToList());
        }
        public List <Vector2> Generate(float generationCount, float exclusionRadius, int seed, List <Vector2> previousPoints = null)
        {
            if (previousPoints == null)
            {
                previousPoints = new List <Vector2>();
            }
            var random = new UnsafeRandomProvider(seed); //todo!
            var offsetGenerationArea = new MyRectangle(0, 0, 1, 1);

            float cellSize = exclusionRadius / Mathf.Sqrt(2);

            var width  = 1f;
            var height = 1f;

            var grid = new SingleElementGenerationGrid(
                cellSize,
                Mathf.CeilToInt(width / cellSize), Mathf.CeilToInt(height / cellSize),
                exclusionRadius
                );

            var processList    = new GenerationRandomQueue <Vector2>();
            var acceptedPoints = new List <Vector2>(1000);


            var firstPoints = Enumerable.Range(0, 10).Select(c => new Vector2(random.Next(0, width), random.Next(0, height))).ToList();

            foreach (var point in firstPoints)
            {
                processList.Add(point);
                acceptedPoints.Add(point);
                if (!grid.IsCellFilled(point))
                {
                    grid.Set(point);
                }
            }


            previousPoints.ForEach(c =>
            {
                if (!grid.IsCellFilled(c))
                {
                    grid.Set(c);
                }
            });

            while (!processList.Empty)
            {
                var point = processList.RandomPop();
                for (int i = 0; i < generationCount; i++)
                {
                    Vector2 newPoint = GenerateRandomPointAround(point, exclusionRadius, random);
                    if (offsetGenerationArea.Contains(newPoint) && !grid.Collides(newPoint))
                    {
                        processList.Add(newPoint);
                        acceptedPoints.Add(newPoint);
                        grid.Set(newPoint);
                    }
                }
            }

            return(acceptedPoints);
        }