/// <summary> /// https://stackoverflow.com/questions/16667072/how-to-draw-arc-with-radius-and-start-and-stop-angle /// </summary> /// <param name="drawing"></param> /// <param name="thisDC"></param> /// <param name="pen"></param> /// <param name="center"></param> /// <param name="radius"></param> /// <param name="startAngle"></param> /// <param name="endAngle"></param> /// <param name="mdoelToCanvas"></param> protected static void DrawArc(IDrawing drawing, DrawingContext thisDC, Pen pen, CADPoint center, double radius, double startAngle, double endAngle, bool mdoelToCanvas = true) { CADPoint centerInCanvas = mdoelToCanvas ? drawing.ModelToCanvas(center) : center; double radiusInCanvas = mdoelToCanvas ? drawing.ModelToCanvas(radius) : radius; double startAngleInCanvas = MathUtils.NormalizeRadianAngle(-startAngle); double endAngleInCanvas = MathUtils.NormalizeRadianAngle(-endAngle); // double angle = endAngle - startAngle; if (endAngle < startAngle) { angle += Utils.PI * 2; } if (radiusInCanvas > 0) { double a0 = startAngleInCanvas < 0 ? startAngleInCanvas + 2 * Math.PI : startAngleInCanvas; double a1 = endAngleInCanvas < 0 ? endAngleInCanvas + 2 * Math.PI : endAngleInCanvas; if (a1 < a0) { a1 += Math.PI * 2; } SweepDirection d = SweepDirection.Counterclockwise; bool large; bool SmallAngle = false; if (SmallAngle) { large = false; d = (a1 - a0) > Math.PI ? SweepDirection.Counterclockwise : SweepDirection.Clockwise; } else { large = (Math.Abs(a1 - a0) < Math.PI); } Point p0 = centerInCanvas.AsWPF() + new Vector(Math.Cos(a0), Math.Sin(a0)) * radiusInCanvas; Point p1 = centerInCanvas.AsWPF() + new Vector(Math.Cos(a1), Math.Sin(a1)) * radiusInCanvas; List <PathSegment> segments = new List <PathSegment> { new ArcSegment(p1, new Size(radiusInCanvas, radiusInCanvas), 0.0, large, d, true) }; List <PathFigure> figures = new List <PathFigure> { new PathFigure(p0, segments, true) { IsClosed = false } }; thisDC.DrawGeometry(null, pen, new PathGeometry(figures, FillRule.EvenOdd, null)); } }