public static ShxArc FromArcCommand(ShxGlyphCommandArc a, ref ShxPoint lastPoint) { var offset = new ShxPoint(a.XDisplacement, a.YDisplacement); var chordLength = offset.Length; var perpendicularHeight = Math.Abs(a.Bulge) * chordLength / 254.0; var isCounterClockwise = a.Bulge >= 0.0; var perpendicularVector = offset.Perpendicular.Normalized * perpendicularHeight; var startPoint = lastPoint; var midPoint = startPoint + offset.MidPoint + perpendicularVector; var endPoint = startPoint + offset; lastPoint = endPoint; var radius = (perpendicularHeight / 2.0) + (chordLength * chordLength / (8.0 * perpendicularHeight)); var center = midPoint - (perpendicularVector.Normalized * radius); var arcAngle = 2.0 * Math.Asin(chordLength / (2.0 * radius)); if (!isCounterClockwise) { var temp = startPoint; startPoint = endPoint; endPoint = temp; } var startPointVector = startPoint - center; var startAngle = Math.Atan2(startPointVector.Y, startPointVector.X); var endPointVector = endPoint - center; var endAngle = Math.Atan2(endPointVector.Y, endPointVector.X); var arc = new ShxArc(center, radius, startAngle, endAngle); return(arc); }
public void ProcessArc(ShxGlyphCommandArc a) { var arc = FromArcCommand(a, ref _lastPoint); if (_isDrawing) { Paths.Add(arc); } }