private double SimplifyVertex(VWVertex vwLine)
        {
            // Scan vertices in line and remove the one with smallest effective area.
            // TODO: use an appropriate data structure to optimize finding the smallest area vertex
            VWVertex curr      = vwLine;
            double   minArea   = curr.GetArea();
            VWVertex minVertex = null;

            while (curr != null)
            {
                double area = curr.GetArea();
                if (area < minArea)
                {
                    minArea   = area;
                    minVertex = curr;
                }
                curr = curr.Next;
            }
            if (minVertex != null && minArea < _tolerance)
            {
                minVertex.Remove();
            }
            if (!vwLine.IsLive)
            {
                return(-1);
            }
            return(minArea);
        }
            public Coordinate[] GetCoordinates()
            {
                CoordinateList coords = new CoordinateList();
                VWVertex       curr   = this;

                do
                {
                    coords.Add(curr._pt, false);
                    curr = curr.Next;
                }while (curr != null);
                return(coords.ToCoordinateArray());
            }
        public Coordinate[] Simplify()
        {
            VWVertex vwLine  = VWVertex.BuildLine(_pts);
            double   minArea = _tolerance;

            do
            {
                minArea = SimplifyVertex(vwLine);
            }while (minArea < _tolerance);
            Coordinate[] simp = vwLine.GetCoordinates();
            // ensure computed value is a valid line
            if (simp.Length >= 2)
            {
                return(simp);
            }
            return(new[] { simp[0], new Coordinate(simp[0]) });
        }
 public static VWVertex BuildLine(Coordinate[] pts)
 {
     VWVertex first = null;
     VWVertex prev = null;
     foreach (Coordinate c in pts)
     {
         VWVertex v = new VWVertex(c);
         if (first == null)
             first = v;
         v.Prev = prev;
         if (prev != null)
         {
             prev.Next = v;
             prev.UpdateArea();
         }
         prev = v;
     }
     return first;
 }
            public static VWVertex BuildLine(Coordinate[] pts)
            {
                VWVertex first = null;
                VWVertex prev  = null;

                foreach (Coordinate c in pts)
                {
                    VWVertex v = new VWVertex(c);
                    if (first == null)
                    {
                        first = v;
                    }
                    v.Prev = prev;
                    if (prev != null)
                    {
                        prev.Next = v;
                        prev.UpdateArea();
                    }
                    prev = v;
                }
                return(first);
            }
 private double SimplifyVertex(VWVertex vwLine)
 {
     // Scan vertices in line and remove the one with smallest effective area.
     // TODO: use an appropriate data structure to optimize finding the smallest area vertex
     VWVertex curr = vwLine;
     double minArea = curr.GetArea();
     VWVertex minVertex = null;
     while (curr != null)
     {
         double area = curr.GetArea();
         if (area < minArea)
         {
             minArea = area;
             minVertex = curr;
         }
         curr = curr.Next;
     }
     if (minVertex != null && minArea < _tolerance)
         minVertex.Remove();
     if (!vwLine.IsLive)
         return -1;
     return minArea;
 }
            public VWVertex Remove()
            {
                VWVertex tmpPrev = Prev;
                var      tmpNext = Next;
                VWVertex result  = null;

                if (Prev != null)
                {
                    Prev.Next = tmpNext;
                    Prev.UpdateArea();
                    result = Prev;
                }
                if (Next != null)
                {
                    Next.Prev = tmpPrev;
                    Next.UpdateArea();
                    if (result == null)
                    {
                        result = Next;
                    }
                }
                _isLive = false;
                return(result);
            }