Пример #1
0
 private static void ReplacePolySegments(PathSegmentCollection pathSegments)
 {
     for (int index1 = 0; index1 < pathSegments.Count; ++index1)
     {
         PathSegment     pathSegment     = pathSegments[index1];
         PolyLineSegment polyLineSegment = pathSegment as PolyLineSegment;
         if (polyLineSegment != null)
         {
             pathSegments.RemoveAt(index1);
             for (int index2 = 0; index2 < polyLineSegment.Points.Count; ++index2)
             {
                 LineSegment lineSegment = PathSegmentUtilities.CreateLineSegment(polyLineSegment.Points[index2], polyLineSegment.IsStroked);
                 pathSegments.Insert(index1, (PathSegment)lineSegment);
                 ++index1;
             }
             --index1;
         }
         PolyQuadraticBezierSegment quadraticBezierSegment1 = pathSegment as PolyQuadraticBezierSegment;
         if (quadraticBezierSegment1 != null)
         {
             pathSegments.RemoveAt(index1);
             int index2 = 0;
             while (index2 < quadraticBezierSegment1.Points.Count - 1)
             {
                 QuadraticBezierSegment quadraticBezierSegment2 = PathSegmentUtilities.CreateQuadraticBezierSegment(quadraticBezierSegment1.Points[index2], quadraticBezierSegment1.Points[index2 + 1], quadraticBezierSegment1.IsStroked);
                 pathSegments.Insert(index1, (PathSegment)quadraticBezierSegment2);
                 ++index1;
                 index2 += 2;
             }
             --index1;
         }
         PolyBezierSegment polyBezierSegment = pathSegment as PolyBezierSegment;
         if (polyBezierSegment != null)
         {
             pathSegments.RemoveAt(index1);
             int index2 = 0;
             while (index2 < polyBezierSegment.Points.Count - 2)
             {
                 BezierSegment bezierSegment = PathSegmentUtilities.CreateBezierSegment(polyBezierSegment.Points[index2], polyBezierSegment.Points[index2 + 1], polyBezierSegment.Points[index2 + 2], polyBezierSegment.IsStroked);
                 pathSegments.Insert(index1, (PathSegment)bezierSegment);
                 ++index1;
                 index2 += 3;
             }
             --index1;
         }
     }
 }
Пример #2
0
        private static void RemoveDegenerateSegments(PathFigure pathFigure, bool removeInvisible)
        {
            PathSegmentCollection segments = pathFigure.Segments;
            Point b          = pathFigure.StartPoint;
            Point startPoint = pathFigure.StartPoint;

            for (int index = 0; index < segments.Count; ++index)
            {
                PathSegment pathSegment = segments[index];
                LineSegment lineSegment;
                if ((lineSegment = pathSegment as LineSegment) != null)
                {
                    if (VectorUtilities.ArePathPointsVeryClose(lineSegment.Point, b) || removeInvisible && !lineSegment.IsStroked && pathFigure.Segments.Count == 1)
                    {
                        segments.RemoveAt(index--);
                    }
                    else
                    {
                        b = lineSegment.Point;
                    }
                }
                else
                {
                    QuadraticBezierSegment quadraticBezierSegment;
                    if ((quadraticBezierSegment = pathSegment as QuadraticBezierSegment) != null)
                    {
                        if (VectorUtilities.ArePathPointsVeryClose(quadraticBezierSegment.Point1, b) && VectorUtilities.ArePathPointsVeryClose(quadraticBezierSegment.Point2, b))
                        {
                            segments.RemoveAt(index--);
                        }
                        else
                        {
                            b = quadraticBezierSegment.Point2;
                        }
                    }
                    else
                    {
                        BezierSegment bezierSegment;
                        if ((bezierSegment = pathSegment as BezierSegment) != null)
                        {
                            if (VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point1, b) && VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point2, b) && VectorUtilities.ArePathPointsVeryClose(bezierSegment.Point3, b))
                            {
                                segments.RemoveAt(index--);
                            }
                            else
                            {
                                b = bezierSegment.Point3;
                            }
                        }
                    }
                }
            }
            if (segments.Count < 1)
            {
                return;
            }
            LineSegment lineSegment1 = segments[segments.Count - 1] as LineSegment;

            if (lineSegment1 == null || !pathFigure.IsClosed || !VectorUtilities.ArePathPointsVeryClose(startPoint, lineSegment1.Point))
            {
                return;
            }
            segments.RemoveAt(segments.Count - 1);
        }