示例#1
0
文件: WpfArc.cs 项目: kamaloff/Core2D
        public WpfArc(Point2 p1, Point2 p2, Point2 p3, Point2 p4)
        {
            var    rect    = Rect2.FromPoints(p1, p2);
            var    center  = new Point2(rect.X + rect.Width / 2.0, rect.Y + rect.Height / 2.0);
            double offsetX = center.X - rect.X;
            double offsetY = center.Y - rect.Y;

            double minLenght = (double)Math.Max(offsetX, offsetY);

            double length1 = center.DistanceTo(p3);
            double p3x     = p3.X + (p3.X - center.X) / length1 * minLenght;
            double p3y     = p3.Y + (p3.Y - center.Y) / length1 * minLenght;

            double length2 = center.DistanceTo(p4);
            double p4x     = p4.X + (p4.X - center.X) / length2 * minLenght;
            double p4y     = p4.Y + (p4.Y - center.Y) / length2 * minLenght;

            IList <Point2> p3i;
            IList <Point2> p4i;

            Line2.LineIntersectsWithEllipse(center, new Point2(p3x, p3y), rect, true, out p3i);
            Line2.LineIntersectsWithEllipse(center, new Point2(p4x, p4y), rect, true, out p4i);
            Point2 start;
            Point2 end;

            if (p3i != null && p3i.Count == 1)
            {
                start = p3i.FirstOrDefault();
            }
            else
            {
                start = new Point2(p3x, p3y);
            }

            if (p4i != null && p4i.Count == 1)
            {
                end = p4i.FirstOrDefault();
            }
            else
            {
                end = new Point2(p4x, p4y);
            }

            double angle      = Line2.AngleBetween(center, start, center, end);
            bool   isLargeArc = angle > 180.0;

            double helperLenght = 60.0;

            double lengthStart = center.DistanceTo(start);
            double p3hx        = start.X + (start.X - center.X) / lengthStart * helperLenght;
            double p3hy        = start.Y + (start.Y - center.Y) / lengthStart * helperLenght;

            double lengthEnd = center.DistanceTo(end);
            double p4hx      = end.X + (end.X - center.X) / lengthEnd * helperLenght;
            double p4hy      = end.Y + (end.Y - center.Y) / lengthEnd * helperLenght;

            P1         = p1;
            P2         = p2;
            P3         = new Point2(p3hx, p3hy);
            P4         = new Point2(p4hx, p4hy);
            Rect       = rect;
            Center     = center;
            Start      = start;
            End        = end;
            Radius     = new Size2(offsetX, offsetY);
            IsLargeArc = isLargeArc;
            Angle      = angle;
        }