Как создать RectangleF, используя два PointF?

У меня есть две точки, как линия. Я хочу преобразовать его в прямоугольник. Как я должен это делать?

Например, вот как я рисую линию. Но я хочу, чтобы это было Rectangle

    private PointF start, end;
    protected override void OnMouseDown(MouseEventArgs e)
    {
        start.X = e.X;
        start.Y = e.Y;
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        end.X = e.X;
        end.Y = e.Y;

        Invalidate();
    }

person Rye    schedule 05.11.2010    source источник


Ответы (2)


Как насчет:

new RectangleF(Math.Min(start.X, end.X),
               Math.Min(start.Y, end.Y),
               Math.Abs(start.X - end.X),
               Math.Abs(start.Y - end.Y));

По сути, это гарантирует, что вы действительно представляете левый верхний угол как «начало», даже если пользователь создал линию из левого нижнего угла в правый верхний.

person Jon Skeet    schedule 05.11.2010

Более четкая версия ответа Джона с использованием FromLTRB:

    /// <summary>
    /// Creates a rectangle based on two points.
    /// </summary>
    /// <param name="p1">Point 1</param>
    /// <param name="p2">Point 2</param>
    /// <returns>Rectangle</returns>
    public static RectangleF GetRectangle(PointF p1, PointF p2)
    {
        float top = Math.Min(p1.Y, p2.Y);
        float bottom = Math.Max(p1.Y, p2.Y);
        float left = Math.Min(p1.X, p2.X);
        float right = Math.Max(p1.X, p2.X);

        RectangleF rect = RectangleF.FromLTRB(left, top, right, bottom);

        return rect;
    }
person Pedro77    schedule 07.08.2014