Используйте LINQ, чтобы найти ограничивающий прямоугольник для списка PointF в C#
В этом примере показано, как использовать LINQ, чтобы найти ограничивающий прямоугольник для списка PointF. Когда вы нажимаете на PictureBox программы, он добавляет точки в список и показывает ограничивающий прямоугольник.
Следующий метод находит ограничивающий прямоугольник.
// Найдите ограничивающий прямоугольник списка. private Rectangle BoundingBox(IEnumerablepoints) { 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 tt >. р>
Метод сначала делает запрос 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)); }