Пример #1
0
        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);
        }
Пример #2
0
        public void ProcessArc(ShxGlyphCommandArc a)
        {
            var arc = FromArcCommand(a, ref _lastPoint);

            if (_isDrawing)
            {
                Paths.Add(arc);
            }
        }