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);
        }
    }
示例#2
0
        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]);
        }
示例#3
0
        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;
            }
        }
示例#4
0
    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);
    }