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