コード例 #1
0
ファイル: ShxCommandProcessor.cs プロジェクト: ixmilia/shx
        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
ファイル: ShxCommandProcessor.cs プロジェクト: ixmilia/shx
        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);
        }