private PathFigure Smooth(PathFigure pathFigure) { if (pathFigure.Segments.Count <= 1) return pathFigure; // need at least 2 segments // The path is closed if the last end point equal the start point var startPoint = pathFigure.StartPoint; var endPoint = pathFigure.EndPoint(); bool isClosed = (startPoint == endPoint); if (isClosed && pathFigure.Segments.Count <= 2) return pathFigure; // need at least 3 segments to get a closed polygon var newPathFigure = new PathFigure { StartPoint = pathFigure.StartPoint, //IsFilled = pathFigure.IsFilled, Not initialized by framework IsFilled = IsFillSymbol, IsClosed = pathFigure.IsClosed }; int nbKnotPoints = isClosed ? pathFigure.Segments.Count : pathFigure.Segments.Count + 1; var knotPoints = new System.Windows.Point[nbKnotPoints]; int index = 0; knotPoints[index++] = startPoint; foreach (var segment in pathFigure.Segments) { if (index < nbKnotPoints) knotPoints[index++] = segment.EndPoint(); else { Debug.Assert(isClosed && index == nbKnotPoints); // should only happen for last segment when closed } } System.Windows.Point[] firstControls; System.Windows.Point[] secondControls; if (isClosed) ClosedBezierSpline.GetCurveControlPoints(knotPoints, out firstControls, out secondControls); else OpenBezierSpline.GetCurveControlPoints(knotPoints, out firstControls, out secondControls); int nbSegment = firstControls.Length; for (int i = 0; i < nbSegment; i++) { var point1 = firstControls[i]; var point2 = secondControls[i]; var point3 = (i + 1 >= nbKnotPoints ? knotPoints[0] : knotPoints[i + 1]); // Close the path if needed var bezierSegment = new BezierSegment { Point1 = point1, Point2 = point2, Point3 = point3 }; newPathFigure.Segments.Add(bezierSegment); } return newPathFigure; }
private void AddPatterns(PathGeometry path, PathFigure pathFigure) { pathFigure.IsFilled = IsFillSymbol; // should be done by the framework ?? if (AtStart) { if (BySegment) { var point = pathFigure.StartPoint; foreach (var segment in pathFigure.Segments) { if (segment.EndPoint() != point) { path.Concat(CreatePattern(point, segment.OrientationAtStart(point) + 180)); point = segment.EndPoint(); } } } else path.Concat(CreatePattern(pathFigure.StartPoint, pathFigure.OrientationAtStart() + 180)); } if (AtEnd) { if (BySegment) { var point = pathFigure.StartPoint; foreach (var segment in pathFigure.Segments) { if (segment.EndPoint() != point) { path.Concat(CreatePattern(segment.EndPoint(), segment.OrientationAtEnd(point))); point = segment.EndPoint(); } } } else path.Concat(CreatePattern(pathFigure.EndPoint(), pathFigure.OrientationAtEnd())); } if (AtMiddle) { if (BySegment) { var point = pathFigure.StartPoint; foreach (var segment in pathFigure.Segments) { path.Concat(CreatePattern(segment.MiddlePoint(point), segment.OrientationAtMiddle(point))); point = segment.EndPoint(); } } else path.Concat(CreatePattern(pathFigure.MiddlePoint(), pathFigure.OrientationAtMiddle())); } }