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 static ShxArc FromArcCommand(ShxGlyphCommandFractionalArc a, ref ShxPoint lastPoint) { var radius = a.HighRadius * 256.0 + a.Radius; var startOctantAngle = a.StartingOctant * 45.0; var endOctantAngle = (a.StartingOctant + a.OctantCount - 1) * 45.0; var startAngleDegrees = (45.0 * a.StartOffset / 256.0) + startOctantAngle; var startAngleRadians = startAngleDegrees * Math.PI / 180.0; var endAngleDegrees = (45.0 * a.EndOffset / 256.0) + endOctantAngle; var endAngleRadians = endAngleDegrees * Math.PI / 180.0; var startVector = ShxPoint.FromAngleRadians(startAngleRadians) * radius; var endVector = ShxPoint.FromAngleRadians(endAngleRadians) * radius; var center = lastPoint - startVector; lastPoint = center + endVector; var arc = new ShxArc(center, radius, startAngleRadians, endAngleRadians); return(arc); }