/// <summary>
        /// Check if the current solution is correct by checking if every sheep is within the correct area
        /// </summary>
        /// <param name="vd">The vertical decomposition</param>
        /// <returns>Number of wrong sheep</returns>
        public int CheckSolution(VerticalDecomposition vd)
        {
            int wrong = 0;

            foreach (GameObject sheep in this.m_sheep)
            {
                Vector2 sheep_pos = new Vector2(sheep.transform.position.x, sheep.transform.position.y);
                // Check if the owner of the area that the sheep is located in is equal to the sheeps owner
                Trapezoid trap = vd.Search(sheep_pos);
                Face      area = trap.bottom.face;
                // Debug.Log("Face corresponding to the area of the sheep position: " + area + "\nArea owner: " + area.owner + "\n" + trap.show());
                if (area.owner != sheep.GetComponent <OwnerScript>().GetOwner())
                {
                    wrong += 1;
                }
            }

            Debug.LogAssertion("The current solution is " + (wrong == 0 ? "correct!" : "wrong!") + "\n"
                               + (this.m_sheep.Count - wrong) + " out of " + this.m_sheep.Count + " correct");

            // Update shepherd count text
            UpdateText(wrong);

            continueButton.SetActive(wrong == 0);
            return(wrong);
        }
        // Random endless level generation
        // Determines the amount of shepherds placed based on the current level number
        private ShepherdLevel CreateEndlessLevel(int level)
        {
            // create the output scriptable object
            var asset = ScriptableObject.CreateInstance <ShepherdLevel>();

            // place the shepherds and sheep randomly
            List <Vector2> shepherds = RandomPos(level + 4);
            List <Vector2> sheep     = RandomPos(2 * (level + 4));

            // Print locations
            string sls = "Shepherd locations: \n";

            foreach (Vector2 v in shepherds)
            {
                sls += "(" + v.x + ", " + v.y + "), ";
            }
            Debug.Log(sls);
            string shls = "Sheep locations: \n";

            foreach (Vector2 v in sheep)
            {
                shls += "(" + v.x + ", " + v.y + "), ";
            }
            Debug.Log(shls);

            // Construct the voronoi diagram corresponding to the shepherd locations
            StartVoronoi();
            foreach (Vector2 me in shepherds)
            {
                // Add vertex to the triangulation and update the voronoi
                Delaunay.AddVertex(m_delaunay, me);
                m_delaunay.SetOwner(me, Random.Range(0, 4));
                m_dcel = Voronoi.Create(m_delaunay);
            }

            // Create vertical decomposition
            VerticalDecomposition vd = VertDecomp(m_dcel);

            // Use the vertical decomposition to determine the ownership of each sheep
            // and add the sheep to the level
            foreach (Vector2 s in sheep)
            {
                Trapezoid trap = vd.Search(s);
                Face      area = trap.bottom.face;
                int       i    = area.owner;
                asset.addSheep(s, i);
            }

            // Normalize coordinates
            var rect = BoundingBoxComputer.FromPoints(asset.SheepList);

            asset.SheepList = Normalize(rect, 6f, asset.SheepList);

            // Set shepherd budget
            asset.setBudget(shepherds.Count);

            return(asset);
        }