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 }); }
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); }
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()); }