示例#1
0
        public void ProcessArc(ShxGlyphCommandOctantArc a)
        {
            var arc = FromArcCommand(a, ref _lastPoint);

            if (_isDrawing)
            {
                Paths.Add(arc);
            }
        }
示例#2
0
        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));
        }