Exemple #1
0
            public void ZeroSimplexNotEqualsOperator()
            {
                var simplexA = new Simplex2D(Vector2.Zero);
                var simplexB = new Simplex2D(Vector2.One);

                (simplexA != simplexB).Should().BeTrue();
            }
Exemple #2
0
    private MapArray <int> GenerateLandMask(MapArray <int> bitmask)
    {
        var simplex = new Simplex2D(43);

        int gbt_radius = (int)Mathf.Max(ChunkOrder, Mathf.Ceil(2.0f * Mathf.Log(1.0f + 1.00f * Radius) / Mathf.Log(7.0f))) - ChunkOrder + 1;

        for (int i = 0; i < Utils.Pow(7, gbt_radius); i++)
        {
            for (int j = 0; j < ChunkSize; j++)
            {
                GBTHex  hex = new GBTHex(i * ChunkSize + j);
                Vector2 pos = hex.position;
                if (GetLandMaskValue(pos, simplex) > Threshold)
                {
                    bitmask[hex] |= 1;
                    foreach (GBTCorner corner in hex.GetCorners())
                    {
                        bitmask[corner] |= 1;
                    }
                }
                else
                {
                    bitmask[hex] |= 2;
                    foreach (GBTCorner corner in hex.GetCorners())
                    {
                        bitmask[corner] |= 2;
                    }
                }
            }
        }
        return(bitmask);
    }
Exemple #3
0
            public void ZeroSimplexEquals()
            {
                var simplexA = new Simplex2D(Vector2.One);
                var simplexB = new Simplex2D(Vector2.One);

                simplexA.Equals(simplexB).Should().BeTrue();
            }
Exemple #4
0
    private float GetLandMaskValue(Vector2 position, Simplex2D noise)
    {
        float noise_val = noise.GetFractalNoise(2.0f * position / Radius);
        float r         = position.magnitude / Radius;

        if (noise_val > max_noise_value)
        {
            max_noise_value = noise_val;
        }
        return((noise_val * (1.0f - Alpha) + noise_val * Alpha / r) * (1.0f - Mathf.Pow(Utils.Smoothstep(r / 2.0f), 5.0f)));
    }
Exemple #5
0
            public void ZeroSimplexNotEquals()
            {
                var simplexA = new Simplex2D(Vector2.Zero);
                var simplexB = new Simplex2D(Vector2.One);

                simplexA.Equals(simplexB).Should().BeFalse();

                var simplexC = new Simplex2D(Vector2.Zero, Vector2.One);

                simplexA.Equals(simplexC).Should().BeFalse();
            }
Exemple #6
0
            public void TwoSimplexNotEqualsOperator()
            {
                var simplexA = new Simplex2D(Vector2.One, Vector2.UnitY, Vector2.UnitX);
                var simplexB = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);

                (simplexA == simplexB).Should().BeFalse();

                var simplexC = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);
                var simplexD = new Simplex2D(Vector2.Zero, Vector2.UnitY, Vector2.UnitX);

                (simplexC == simplexD).Should().BeFalse();
            }
Exemple #7
0
            public void OneSimplexEqualsOperator()
            {
                var simplexA = new Simplex2D(Vector2.One, Vector2.Zero);
                var simplexB = new Simplex2D(Vector2.One, Vector2.Zero);

                (simplexA == simplexB).Should().BeTrue();

                var simplexC = new Simplex2D(Vector2.One, Vector2.Zero);
                var simplexD = new Simplex2D(Vector2.Zero, Vector2.One);

                (simplexC == simplexD).Should().BeTrue();
            }
Exemple #8
0
            public void OneSimplexEquals()
            {
                var simplexA = new Simplex2D(Vector2.One, Vector2.Zero);
                var simplexB = new Simplex2D(Vector2.One, Vector2.Zero);

                simplexA.Equals(simplexB).Should().BeTrue();

                var simplexC = new Simplex2D(Vector2.One, Vector2.Zero);
                var simplexD = new Simplex2D(Vector2.Zero, Vector2.One);

                simplexC.Equals(simplexD).Should().BeTrue();
            }
Exemple #9
0
            public void TwoSimplexNotEquals()
            {
                var simplexA = new Simplex2D(Vector2.One, Vector2.UnitY, Vector2.UnitX);
                var simplexB = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);

                simplexA.Equals(simplexB).Should().BeFalse();

                var simplexC = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);
                var simplexD = new Simplex2D(Vector2.Zero, Vector2.UnitY, Vector2.UnitX);

                simplexC.Equals(simplexD).Should().BeFalse();

                var simplexE = new Simplex2D(Vector2.Zero);

                simplexA.Equals(simplexE).Should().BeFalse();
            }
Exemple #10
0
            public void TwoSimplexEquals()
            {
                var simplexA = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);

                var simplexB = new Simplex2D(Vector2.One, Vector2.Zero, Vector2.UnitX);

                simplexA.Equals(simplexB).Should().BeTrue();

                var simplexC = new Simplex2D(Vector2.Zero, Vector2.One, Vector2.UnitX);

                simplexA.Equals(simplexC).Should().BeTrue();

                var simplexD = new Simplex2D(Vector2.UnitX, Vector2.Zero, Vector2.One);

                simplexA.Equals(simplexD).Should().BeTrue();

                var simplexE = new Simplex2D(Vector2.One, Vector2.UnitX, Vector2.Zero);

                simplexA.Equals(simplexE).Should().BeTrue();

                var simplexF = new Simplex2D(Vector2.Zero, Vector2.UnitX, Vector2.One);

                simplexA.Equals(simplexF).Should().BeTrue();
            }
Exemple #11
0
 public LGJKStrategy2D()
 {
     simplex = new Simplex2D();
     epa     = new EPA2D();
     safety  = new List <EPAFace2D>();
 }
Exemple #12
0
    private List <RiverNode> GenerateDownslopes(MapArray <int> bitmask)
    {
        var simplex = new Simplex2D(52562);

        MapArray <float> weights = new MapArray <float>(1000.0f);
        var rivernet             = new List <RiverNode>();
        var node_lookup          = new Dictionary <GBTCorner, RiverNode>();
        var queue = new BinaryMinHeap <QueueElement <RiverNode> >();

        // Assign weights to each land vertex and add coast vertices to the queue.
        foreach (KeyValuePair <GBTCorner, int> kvp in bitmask.GetCornerEnumerator())
        {
            if ((kvp.Value & 1) > 0)
            {
                weights[kvp.Key] = simplex.GetFractalNoise(4.0f * kvp.Key.position / Radius);
                if ((kvp.Value & 2) > 0)
                {
                    RiverNode node = new RiverNode(kvp.Key);
                    queue.Push(new QueueElement <RiverNode>(weights[kvp.Key], node));
                    rivernet.Add(node);
                    node_lookup[kvp.Key] = node;
                }
            }
        }

        while (queue.Count > 0)
        {
            RiverNode node = queue.Pop().value;

            GBTCorner lowest        = new GBTCorner(-1);
            float     lowest_weight = 999.0f;

            // Find the neighboring land node with the lowest weight which has not already
            // been added to the network.
            foreach (GBTCorner adjacent in node.Vertex.GetAdjacent())
            {
                if (CheckValidAdjacent(node, adjacent, bitmask, node_lookup) && weights[adjacent] < lowest_weight)
                {
                    lowest_weight = weights[adjacent];
                    lowest        = adjacent;
                }
            }

            // Add the lowest node to the network, and push it and the into the queue.
            if (lowest.isValid())
            {
                var new_node = new RiverNode(lowest);
                new_node.Downslope = node;
                if (node.Left == null)
                {
                    node.Left = new_node;
                    // If the node hasn't been filled, add it to the queue again, but with a lower weight.
                    weights[node.Vertex] += 0.05f;
                    queue.Push(new QueueElement <RiverNode>(weights[node.Vertex], node));
                }
                else if (node.Right == null)
                {
                    node.Right = new_node;
                }
                node_lookup[lowest] = new_node;
                queue.Push(new QueueElement <RiverNode>(weights[lowest], new_node));
            }
        }

        return(rivernet);
    }