private void AddFirstPoint(ref Settings settings, ref State state) { bool flag = false; while (!flag) { float num = myRandom.RandomValue(); float num2 = settings.TopLeft.x + settings.Dimensions.x * num; num = myRandom.RandomValue(); float num3 = settings.TopLeft.y + settings.Dimensions.y * num; Vector2 vector = new Vector2(num2, num3); float? rejectionSqDistance = settings.RejectionSqDistance; if (rejectionSqDistance.HasValue) { float?rejectionSqDistance2 = settings.RejectionSqDistance; if (rejectionSqDistance2.HasValue && Vector2.SqrMagnitude(settings.Center - vector) > rejectionSqDistance2.GetValueOrDefault()) { continue; } } flag = true; Vector2 vector2 = Denormalize(vector, settings.TopLeft, (double)settings.CellSize); state.Grid[(int)vector2.x, (int)vector2.y] = vector; state.ActivePoints.Add(vector); state.Points.Add(vector); } }
public static T Choose <T>(List <T> list, SeededRandom rand) where T : IWeighted { T result; if (list.Count == 0) { result = default(T); return(result); } float num = 0f; for (int i = 0; i < list.Count; i++) { float num2 = num; result = list[i]; num = num2 + result.weight; } float num3 = rand.RandomValue() * num; float num4 = 0f; for (int j = 0; j < list.Count; j++) { num4 += list[j].weight; if (num4 > num3) { return(list[j]); } } return(list[list.Count - 1]); }
public void PlaceSites(List <Diagram.Site> sites, int seed) { SeededRandom seededRandom = new SeededRandom(seed); List <Vector2> list = null; List <Vector2> list2 = new List <Vector2>(); for (int i = 0; i < sites.Count; i++) { list2.Add(sites[i].position); } int num = 0; for (int j = 0; j < sites.Count; j++) { if (!site.poly.Contains(sites[j].position)) { if (list == null) { list = PointGenerator.GetRandomPoints(site.poly, 5f, 1f, list2, PointGenerator.SampleBehaviour.PoissonDisk, true, seededRandom, true, true); } if (num >= list.Count - 1) { list2.AddRange(list); list = PointGenerator.GetRandomPoints(site.poly, 0.5f, 0.5f, list2, PointGenerator.SampleBehaviour.PoissonDisk, true, seededRandom, true, true); num = 0; } if (list.Count == 0) { sites[j].position = sites[0].position + Vector2.one * seededRandom.RandomValue(); } else { sites[j].position = list[num++]; } } } HashSet <Vector2> hashSet = new HashSet <Vector2>(); for (int k = 0; k < sites.Count; k++) { if (hashSet.Contains(sites[k].position)) { visited = VisitedType.Error; sites[k].position += new Vector2((float)seededRandom.RandomRange(0, 1), (float)seededRandom.RandomRange(0, 1)); } hashSet.Add(sites[k].position); sites[k].poly = null; } }
public static List <Vector2> GetRandomPoints(Polygon boundingArea, float density, float avoidRadius, List <Vector2> avoidPoints, SampleBehaviour behaviour, bool testInsideBounds, SeededRandom rnd, bool doShuffle = true, bool testAvoidPoints = true) { float num = boundingArea.bounds.width; float num2 = boundingArea.bounds.height; float num3 = num / 2f; float num4 = num2 / 2f; int num5 = (int)Mathf.Floor(num * num2 / density); uint num6 = (uint)Mathf.Sqrt((float)num5); int pointsPerIteration = 10; uint num7 = (uint)((float)num5 * 0.98f); Vector2 min = boundingArea.bounds.min; Vector2 max = boundingArea.bounds.max; List <Vector2> list = new List <Vector2>(); switch (behaviour) { case SampleBehaviour.PoissonDisk: list = new UniformPoissonDiskSampler(rnd).SampleRectangle(min, max, density, pointsPerIteration); break; case SampleBehaviour.UniformSquare: for (float num25 = 0f - num4 + density; num25 < num4 - density; num25 += density) { for (float num26 = 0f - num3 + density; num26 < num3 - density; num26 += density) { list.Add(boundingArea.Centroid() + new Vector2(num26, num25)); } } break; case SampleBehaviour.UniformHex: for (uint num10 = 0u; num10 < num6; num10++) { for (uint num11 = 0u; num11 < num6; num11++) { list.Add(boundingArea.Centroid() + new Vector2(0f - num3 + (0.5f + (float)(double)num10) / (float)(double)num6 * num, 0f - num4 + (0.25f + 0.5f * (float)(double)(num10 % 2u) + (float)(double)num11) / (float)(double)num6 * num2)); } } break; case SampleBehaviour.UniformSpiral: for (uint num19 = 0u; num19 < num7; num19++) { double num20 = (double)num19 / (32.0 * (double)density * 8.0); double num21 = Math.Sqrt(num20 * 512.0 * (double)density); double num22 = Math.Sqrt(num20); double num23 = Math.Sin(num21) * num22; double num24 = Math.Cos(num21) * num22; list.Add(boundingArea.bounds.center + new Vector2((float)num23 * boundingArea.bounds.width, (float)num24 * boundingArea.bounds.height)); } break; case SampleBehaviour.UniformCircle: { float num12 = 6.28318548f * avoidRadius; float num13 = num12 / density; float num14 = rnd.RandomValue(); for (uint num15 = 1u; (float)(double)num15 < num13; num15++) { float num16 = num14 + (float)(double)num15 / num13 * 3.14159274f * 2f; double num17 = Math.Cos((double)num16) * (double)avoidRadius; double num18 = Math.Sin((double)num16) * (double)avoidRadius; list.Add(boundingArea.bounds.center + new Vector2((float)num17, (float)num18)); } break; } default: for (float num8 = 0f - num4 + avoidRadius * 0.3f + rnd.RandomValue() * 2f; num8 < num4 - (avoidRadius * 0.3f + rnd.RandomValue() * 2f); num8 += density + rnd.RandomValue()) { for (float num9 = 0f - num3 + avoidRadius * 0.3f + rnd.RandomValue() * 2f + rnd.RandomValue() * 2f; num9 < num3 - (avoidRadius * 0.3f + rnd.RandomValue() * 2f); num9 += density + rnd.RandomValue()) { list.Add(boundingArea.Centroid() + new Vector2(num9, num8 + rnd.RandomValue() - 0.5f)); } } break; } List <Vector2> list2 = new List <Vector2>(); for (int i = 0; i < list.Count; i++) { if (!testInsideBounds || boundingArea.Contains(list[i])) { bool flag = false; if (testAvoidPoints && avoidPoints != null) { for (int j = 0; j < avoidPoints.Count; j++) { if (Mathf.Abs((avoidPoints[j] - list[i]).magnitude) < avoidRadius) { flag = true; break; } } } if (!flag) { list2.Add(list[i]); } } } if (doShuffle) { list2.ShuffleSeeded(rnd.RandomSource()); } return(list2); }