Используйте LINQ, чтобы найти ограничивающий прямоугольник для списка PointF в C#

В этом примере показано, как использовать LINQ, чтобы найти ограничивающий прямоугольник для списка PointF. Когда вы нажимаете на PictureBox программы, он добавляет точки в список и показывает ограничивающий прямоугольник.

Следующий метод находит ограничивающий прямоугольник.

// Найдите ограничивающий прямоугольник списка.
private Rectangle BoundingBox(IEnumerable points)
{
    var x_query = from Point p in points select p.X;
    int xmin = x_query.Min();
    int xmax = x_query.Max();

    var y_query = from Point p in points select p.Y;
    int ymin = y_query.Min();
    int ymax = y_query.Max();

    return new Rectangle(xmin, ymin, xmax - xmin, ymax - ymin);
}

Обратите внимание, что метод принимает в качестве параметра an IEnumerable & lt; Point & gt;, поэтому он может принимать любой перечислимый объект в качестве параметра. В этом примере программа использует List & lt; Point & gt;, но метод также может обрабатывать массив Point или какой-либо другой класс коллекции, содержащий Point .

Метод сначала делает запрос LINQ для выбора координат точек X. Затем он использует методы Min и Max в запросе для получения минимального и максимального значений X.

Он повторяет эти шаги, чтобы получить минимальные и максимальные значения Y. Он заканчивается с использованием минимального и максимального значений для построения Rectangle, который он возвращает.

Обратите внимание, что LINQ откладывает выполнение до тех пор, пока запрос не понадобится. В этом случае запрос фактически не выполняется до тех пор, пока программа не вызовет Min, чтобы найти xmin.

Следующий код показывает, как программа использует метод BoundingBox.

// Нарисуем точки и ограничительную рамку.
private void picCanvas_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    // Нарисуем точки.
    foreach (Point point in Points)
        e.Graphics.DrawEllipse(Pens.Red,
            point.X - 2, point.Y - 2, 5, 5);

    // Нарисуем ограничительную рамку.
    if (Points.Count > 1)
        e.Graphics.DrawRectangle(Pens.Green,
            BoundingBox(Points));
}

Источник: http://csharphelper.com/blog/2014/11/use-linq-to-find-a-bounding-box-for-a-list-of-pointf-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector