public void MissingEdgeInDictionary()
        {
            var builder = PlanePolygonBuilder.CreatePolygonBuilder();

            builder.AddEdge(new Vector3(1.88157800f, 0.28075720f, 0), new Vector3(1.61366200f, -0.06876162f, 0));
            builder.AddEdge(new Vector3(2.00597400f, 0.44304200f, 0), new Vector3(1.88157800f, 0.28075720f, 0));
            builder.AddEdge(new Vector3(-0.36652940f, 1.35938300f, 0), new Vector3(0.46412470f, 2.44304200f, 0));
            builder.AddEdge(new Vector3(-0.87735590f, 0.69296650f, 0), new Vector3(-0.36652910f, 1.35938300f, 0));
            builder.AddEdge(new Vector3(-0.49218100f, 0.19333940f, 0), new Vector3(-0.87735590f, 0.69296650f, 0));
            builder.AddEdge(new Vector3(0.00744601f, -0.45474870f, 0), new Vector3(-0.49218100f, 0.19333940f, 0));
            builder.AddEdge(new Vector3(1.14250100f, -0.18199130f, 0), new Vector3(0.21764320f, -0.40423650f, 0));
            builder.AddEdge(new Vector3(1.61366200f, -0.06876162f, 0), new Vector3(1.14250100f, -0.18199130f, 0));
            builder.AddEdge(new Vector3(0.21764320f, -0.40423650f, 0), new Vector3(0.00744601f, -0.45474870f, 0));
            builder.AddEdge(new Vector3(0.46412470f, 2.44304200f, 0), new Vector3(1.09203400f, 1.62855300f, 0));
            builder.AddEdge(new Vector3(1.09203400f, 1.62855300f, 0), new Vector3(2.00597400f, 0.44304200f, 0));
            builder.AddEdge(new Vector3(1.14250100f, -0.18199130f, 0), new Vector3(1.06736400f, 1.22428300f, 0));
            builder.AddEdge(new Vector3(0.50145080f, 1.27333500f, 0), new Vector3(-0.01388439f, 1.31800400f, 0));
            builder.AddEdge(new Vector3(1.06736400f, 1.22428300f, 0), new Vector3(0.50145070f, 1.27333500f, 0));
            builder.AddEdge(new Vector3(0.01580662f, 0.76231190f, 0), new Vector3(0.06125379f, -0.08827398f, 0));
            builder.AddEdge(new Vector3(-0.01388440f, 1.31800400f, 0), new Vector3(0.01580662f, 0.76231190f, 0));
            builder.AddEdge(new Vector3(0.17275270f, -0.09793866f, 0), new Vector3(1.14250100f, -0.18199130f, 0));
            builder.AddEdge(new Vector3(0.06125382f, -0.08827414f, 0), new Vector3(0.17275270f, -0.09793866f, 0));

            var polygon = builder.BuildPolygon();

            Assert.IsNotNull(polygon);
        }
        public void EdgesWithTwoTouchingPolygons()
        {
            var builder = PlanePolygonBuilder.CreatePolygonBuilder();

            builder.AddEdge(new Vector3(1.363289f, 0.325342f, 0), new Vector3(0.532633f, -0.758319f, 0));
            builder.AddEdge(new Vector3(1.874113f, 0.991756f, 0), new Vector3(1.363289f, 0.325342f, 0));
            builder.AddEdge(new Vector3(-0.884818f, 1.403969f, 0), new Vector3(-0.616898f, 1.753494f, 0));
            builder.AddEdge(new Vector3(-1.009216f, 1.241681f, 0), new Vector3(-0.884818f, 1.403969f, 0));
            builder.AddEdge(new Vector3(-0.256794f, 0.265680f, 0), new Vector3(-1.009216f, 1.241681f, 0));
            builder.AddEdge(new Vector3(0.532633f, -0.758319f, 0), new Vector3(-0.256793f, 0.265680f, 0));
            builder.AddEdge(new Vector3(0.989307f, 2.139478f, 0), new Vector3(1.874113f, 0.991756f, 0));
            builder.AddEdge(new Vector3(-0.616898f, 1.753494f, 0), new Vector3(-0.145745f, 1.866717f, 0));
            builder.AddEdge(new Vector3(-0.145745f, 1.866717f, 0), new Vector3(0.779111f, 2.088966f, 0));
            builder.AddEdge(new Vector3(0.779111f, 2.088966f, 0), new Vector3(0.989307f, 2.139478f, 0));
            builder.AddEdge(new Vector3(0.951598f, 1.471772f, 0), new Vector3(0.935504f, 1.772997f, 0));
            builder.AddEdge(new Vector3(1.010642f, 0.366718f, 0), new Vector3(0.951598f, 1.471772f, 0));
            builder.AddEdge(new Vector3(0.935504f, 1.772997f, 0), new Vector3(-0.145745f, 1.866717f, 0));
            builder.AddEdge(new Vector3(-0.094393f, 0.905628f, 0), new Vector3(-0.070607f, 0.460440f, 0));
            builder.AddEdge(new Vector3(-0.145745f, 1.866717f, 0), new Vector3(-0.094393f, 0.905628f, 0));
            builder.AddEdge(new Vector3(0.449942f, 0.415320f, 0), new Vector3(1.010642f, 0.366718f, 0));
            builder.AddEdge(new Vector3(-0.070607f, 0.460440f, 0), new Vector3(0.449942f, 0.415320f, 0));

            var polygon = builder.BuildPolygon().Polygon;

            Assert.AreEqual(1, polygon.SubPolygonIds.Count());

            var triangulator = new PolygonTriangulator(polygon);
            var splits       = triangulator.GetSplits();

            Assert.IsNotNull(splits);

            var triangles = triangulator.BuildTriangles();

            Assert.IsNotNull(triangles);
        }
        public void BuildPolygonFromEdges()
        {
            var clockwise = new[]
            {
                new Vertex(1, 1),
                new Vertex(2.5f, 2),
                new Vertex(2, 2),
                new Vertex(1, 3),
                new Vertex(2, 4),
                new Vertex(4, 4),
                new Vertex(1.5f, 3),
                new Vertex(2.5f, 3),
                new Vertex(4, 3.5f),
//                new Vertex(2.25f, 2.5f),
                new Vertex(3, 2.5f),
                new Vertex(4, 1.5f),
                new Vertex(3.5f, 1),
                new Vertex(2.5f, 1),
            };

            var builder = PlanePolygonBuilder.CreatePolygonBuilder();
            var last    = clockwise.Last();

            foreach (var vertex in clockwise)
            {
                builder.AddEdge(new Vector3(last.X, last.Y, 0), new Vector3(vertex.X, vertex.Y, 0));
                last = vertex;
            }

            var result = builder.BuildPolygon();

            Assert.AreEqual("5 0 6 3 1 4 12 2 7 11 8 10 9", string.Join(" ", result.Polygon.SubPolygonVertices(0)));
        }
        /// <summary>
        /// The infamous form number one
        /// </summary>
        /// <returns>the polygon</returns>
        public static Polygon Form1()
        {
            var clockwise = new[]
            {
                new Vertex(1, 1),
                new Vertex(2.5f, 2),
                new Vertex(2, 2),
                new Vertex(1, 3),
                new Vertex(2, 4),
                new Vertex(4, 4),
                new Vertex(1.5f, 3),
                new Vertex(2.7f, 3),
                new Vertex(4, 3.5f),
                new Vertex(3, 2.5f),
                new Vertex(4, 1.5f),
                new Vertex(3.5f, 1),
                new Vertex(2.3f, 1),
            };

            var polygonBuilder = PlanePolygonBuilder.CreatePolygonBuilder();
            var last           = clockwise.Last();

            foreach (var vertex in clockwise)
            {
                polygonBuilder.AddEdge(new Vector3(last.X, last.Y, 0), new Vector3(vertex.X, vertex.Y, 0));
                last = vertex;
            }

            return(polygonBuilder.BuildPolygon().Polygon);
        }
        public static Polygon UnityError6()
        {
            ////var vertices = new[]
            ////{
            ////    new Vertex(0.97032920f, 0.81851240f),
            ////    new Vertex(0.97592230f, 0.92531130f),
            ////    new Vertex(1.01729100f, 1.71523700f),
            ////    new Vertex(1.02747200f, 1.90963600f),
            ////    new Vertex(1.07189700f, 2.75792400f),
            ////    new Vertex(1.07534400f, 2.82374700f),
            ////    new Vertex(1.26485600f, 1.71643700f),
            ////    new Vertex(1.38595200f, 0.79852870f),
            ////    new Vertex(2.90666200f, 2.73569500f),
            ////    new Vertex(2.97032900f, 0.72234950f),
            ////    new Vertex(2.97468800f, 0.80557190f),
            ////    new Vertex(3.02283700f, 1.72496800f),
            ////    new Vertex(3.07318800f, 2.68641600f),
            ////    new Vertex(3.07534400f, 2.72758500f),
            ////};
            ////var polygon = Polygon.Build(vertices)
            ////    .AddVertices(6, 11, 10, 9, 7, 0, 1, 2)
            ////    .ClosePartialPolygon()
            ////    .AddVertices(12, 11, 3, 4, 5, 8, 13)
            ////    .ClosePartialPolygon()
            ////    .Close(11);

            var builder = PlanePolygonBuilder.CreatePolygonBuilder();

            builder.AddEdge(new Vector3(1.38595200f, 0.79852870f, 0), new Vector3(0.97032920f, 0.81851240f, 0));
            builder.AddEdge(new Vector3(2.97032900f, 0.72234950f, 0), new Vector3(1.38595200f, 0.79852870f, 0));
            builder.AddEdge(new Vector3(3.02283700f, 1.72496800f, 0), new Vector3(2.97468800f, 0.80557190f, 0));
            builder.AddEdge(new Vector3(3.07318800f, 2.68641600f, 0), new Vector3(3.02283700f, 1.72496800f, 0));
            builder.AddEdge(new Vector3(3.07534400f, 2.72758500f, 0), new Vector3(3.07318800f, 2.68641600f, 0));
            builder.AddEdge(new Vector3(2.97468800f, 0.80557190f, 0), new Vector3(2.97032900f, 0.72234950f, 0));
            builder.AddEdge(new Vector3(2.90666200f, 2.73569500f, 0), new Vector3(3.07534400f, 2.72758500f, 0));
            builder.AddEdge(new Vector3(1.07534400f, 2.82374700f, 0), new Vector3(2.90666200f, 2.73569500f, 0));
            builder.AddEdge(new Vector3(1.02747200f, 1.90963600f, 0), new Vector3(1.07189700f, 2.75792400f, 0));
            builder.AddEdge(new Vector3(0.97592230f, 0.92531120f, 0), new Vector3(1.01729100f, 1.71523700f, 0));
            builder.AddEdge(new Vector3(0.97032920f, 0.81851240f, 0), new Vector3(0.97592230f, 0.92531130f, 0));
            builder.AddEdge(new Vector3(1.07189700f, 2.75792400f, 0), new Vector3(1.07534400f, 2.82374700f, 0));
            builder.AddEdge(new Vector3(3.02283700f, 1.72496800f, 0), new Vector3(1.02747200f, 1.90963600f, 0));
            builder.AddEdge(new Vector3(1.26485600f, 1.71643700f, 0), new Vector3(3.02283700f, 1.72496800f, 0));
            builder.AddEdge(new Vector3(1.01729100f, 1.71523700f, 0), new Vector3(1.26485600f, 1.71643700f, 0));
            var result = builder.BuildPolygon();

            return(result.Polygon);
        }