Ejemplo n.º 1
0
        public void Set(PointWithExclusionRadius pointWithExclusionRadius)
        {
            var point           = pointWithExclusionRadius.Point;
            var exclusionRadius = pointWithExclusionRadius.ExclusionRadius;

            var pos = FindCellPosition(point);

            if (_array[pos.X, pos.Y] == null)
            {
                _array[pos.X, pos.Y] = new List <PointWithExclusionRadius>();
            }
            _array[pos.X, pos.Y].Add(new PointWithExclusionRadius()
            {
                Point           = point,
                ExclusionRadius = exclusionRadius
            });
        }
Ejemplo n.º 2
0
        public bool Collides(PointWithExclusionRadius pointWithExclusionRadius)
        {
            var point           = pointWithExclusionRadius.Point;
            var exclusionRadius = pointWithExclusionRadius.ExclusionRadius;

            var gridPoint = FindCellPosition(point);

            var neighboursPos = FindNeighbourGridPositions(gridPoint);

            foreach (var cellPos in neighboursPos)
            {
                var neighboursInCell = _array[cellPos.X, cellPos.Y];
                if (neighboursInCell != null &&
                    neighboursInCell.Any(c => Vector2.Distance(c.Point, point) < exclusionRadius))
                {
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 3
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());
        }