private Point[] CalculateSteps(IPathOld path) { var stepDistance = 10; var pt1 = path.StartPoint; var pt2 = path.EndPoint; var origin = path.Origin; var radius = path.Radius; //calculate the angle of the start and end point from the origin var startPointAngle = GeometryHelper.GetAngleFromPoint(pt1, origin); var endPointAngle = GeometryHelper.GetAngleFromPoint(pt2, origin); var angleOfPoints = CalculateAngleOfPoints(startPointAngle, endPointAngle); //determine the length of the curve var circumference = Math.PI * radius; var divisor = 360 / angleOfPoints; //calculate the degrees of each step var numberOfStepsInCircle = Math.Floor(circumference / stepDistance); var stepAngle = 360 / numberOfStepsInCircle; int numberOfStepsInCurve = (int)Math.Floor(numberOfStepsInCircle / divisor); var currentAngle = startPointAngle; var result = new Point[numberOfStepsInCurve*2]; for (int i = 0; i < numberOfStepsInCurve; i++) { currentAngle += stepAngle; result[i*2] = GeometryHelper.GetPointAtAngle(origin, radius - (path.Width/4), currentAngle); result[i * 2 + 1] = GeometryHelper.GetPointAtAngle(origin, radius + (path.Width/4), currentAngle); } return result; }
public PathOutlineVisualOld(IPathOld path, Color color) { var brush = new SolidColorBrush(color); var pen = new Pen(brush, 1); var geometry = new StreamGeometry(); using (var gc = geometry.Open()) { gc.BeginFigure(path.StartBottomEdge, false, false); gc.LineTo(path.StartTopEdge, true, true); gc.ArcTo(path.EndTopEdge, new Size(path.Radius+(path.Width/2), path.Radius+(path.Width/2)), 1, false, SweepDirection.Clockwise, true, true); gc.LineTo(path.EndBottomEdge, true, true); gc.ArcTo(path.StartBottomEdge, new Size(path.Radius-(path.Width/2), path.Radius-(path.Width/2)), 1, false, SweepDirection.Counterclockwise, true, true); } using (var context = RenderOpen()) { context.DrawGeometry(brush, pen, geometry); var points = CalculateSteps(path); foreach (var point in points) { DrawPoint(point, Brushes.Blue, context); } } }