示例#1
0
        public override void Run(System.Collections.Generic.List <CGUtilities.Point> points, System.Collections.Generic.List <CGUtilities.Line> lines, System.Collections.Generic.List <CGUtilities.Polygon> polygons, ref System.Collections.Generic.List <CGUtilities.Point> outPoints, ref System.Collections.Generic.List <CGUtilities.Line> outLines, ref System.Collections.Generic.List <CGUtilities.Polygon> outPolygons)
        {
            //outPoints.Add(new Point(0, 0));
            List <Point> pts = new List <Point>();

            foreach (var line in polygons[0].lines)
            {
                pts.Add(line.Start);
            }

            HelperMethods.CheckMakeCCW(ref pts);

            if (!HelperMethods.IsYMonotone(pts))
            {
                Console.WriteLine("The Polygon is not Y Monoton");
                return;
            }
            DCEL dcel = new DCEL(pts);

            var st = new Stack <Vertex>();

            var sortedVertices = dcel.Sort();

            st.Push(sortedVertices[0]);
            st.Push(sortedVertices[1]);

            for (int i = 2; i < sortedVertices.Count - 1; ++i)
            {
                if (st.Peek().side != sortedVertices[i].side)
                {
                    while (st.Count > 1)
                    {
                        var tmp = st.Pop();
                        outLines.Add(new Line(sortedVertices[i].Position, tmp.Position));
                        dcel.AddHalfEdge(sortedVertices[i], tmp);
                    }
                    st.Pop();
                    st.Push(sortedVertices[i - 1]);
                    st.Push(sortedVertices[i]);
                }
                else
                {
                    if (IsConvex(st.Peek().Position, st.GetSecondTop().Position, sortedVertices[i].Position, st.Peek().side))
                    {
                        st.Push(sortedVertices[i]);
                    }
                    else
                    {
                        Vertex tmp = st.Pop();
                        while (st.Count >= 1 && IsConvex(tmp.Position, st.Peek().Position, sortedVertices[i].Position,
                                                         sortedVertices[i].side == Chain.LEFT ? Chain.RIGHT : Chain.LEFT))
                        {
                            tmp = st.Pop();
                            outLines.Add(new Line(sortedVertices[i].Position, tmp.Position));

                            dcel.AddHalfEdge(sortedVertices[i], tmp);
                        }
                        st.Push(tmp);
                        st.Push(sortedVertices[i]);
                    }
                }
            }
            //var edge = dcel.Faces[1].edge;
            //var next = edge.Next;
            //var start = edge.Origin;
            //outPoints.Add(edge.Origin.Position);
            //while (start.ID != next.Origin.ID )
            //{
            //    outPoints.Add(next.Origin.Position);
            //    next = next.Next;
            //}

            //Console.WriteLine(st.Count);
        }