public void ProcessArc(ShxGlyphCommandOctantArc a) { var arc = FromArcCommand(a, ref _lastPoint); if (_isDrawing) { Paths.Add(arc); } }
public static ShxArc FromArcCommand(ShxGlyphCommandOctantArc a, ref ShxPoint lastPoint) { var octantCount = a.OctantCount; if (octantCount == 0) { // 0 means full circle octantCount = 8; } var endingOctant = a.IsCounterClockwise ? a.StartingOctant + octantCount : a.StartingOctant - octantCount; while (endingOctant < 0) { endingOctant += 8; } var startVector = OctantArcVectors[a.StartingOctant % 8] * a.Radius; var endVector = OctantArcVectors[endingOctant % 8] * a.Radius; if (a.OctantCount < 0) { var temp = startVector; startVector = endVector; endVector = temp; } var center = lastPoint - startVector; lastPoint = center + endVector; var startAngle = Math.Atan2(startVector.Y, startVector.X); var endAngle = Math.Atan2(endVector.Y, endVector.X); if (!a.IsCounterClockwise) { var temp = startAngle; startAngle = endAngle; endAngle = temp; } while (endAngle <= startAngle) { endAngle += Math.PI * 2.0; } return(new ShxArc(center, a.Radius, startAngle, endAngle)); }