2014-02-18 3 views
3

У меня есть код, который ищет минимальное и максимальное значения в списке строк. Мне нужно это, чтобы найти центр прямоугольника, который ограничивает мой сложный рисунок.Как упростить мой код? (Поиск минимальных и максимальных координат в списке строк)

Моя часть кода выглядит следующим образом:

if (line.X1 < Min.X) Min.X = line.X1; 
if (line.Y1 < Min.Y) Min.Y = line.Y1; 
if (line.X2 < Min.X) Min.X = line.X2; 
if (line.Y2 < Min.Y) Min.Y = line.Y2; 

Я не нравится этот уродливый код копировать-вставить. Как я могу упростить это/сделать его более элегантным?

+0

Вы можете использовать LINQ. Вы пробовали это? Возможно, что-то вроде этого: http://stackoverflow.com/questions/1107868/linq-min-max – Aaron

+1

Из любопытства почему бы не использовать массив? Если вы используете массив, вы можете использовать linq для его запроса. –

+0

Боковое примечание: я не думаю, что min/max поможет вам с «центром» (также это зависит от вашего определения центра ...). –

ответ

1

Учитывая следующие заселена переменная:

List<Line> lines; 

Получить значения X и значений Y:

var xValues = lines.SelectMany(line => new[] { line.X1, line.X2 }); 
var yValues = lines.SelectMany(line => new[] { line.Y1, line.Y2 }); 

Затем получают минимальное и максимум каждого:

var leastX = xValues.Min(); 
var greatestX = xValues.Max(); 
var leastY = yValues.Min(); 
var greatestY = yValues.Max(); 

Обратите внимание, что этот код не проверен.

+0

Я тестировал его частично, кажется, работает правильно. – Kamil

3

Как о чем-то вроде этого:

var xList = {line.X1, line.X2, ...}; 
var yList = {line.Y1, line.Y2, ...}; 

Min.X = xList.Min(); 
Min.Y = yList.Min(); 
+0

Это хороший ответ и хорошее предложение, но я должен был принять ответ с более подробной информацией и некоторым описанием. – Kamil

1

Вот еще один вариант только с помощью Math.Min:

Min.X = Math.Min(line.X2, Math.Min(line.X1, Min.X)); 
Min.Y = Math.Min(line.Y2, Math.Min(line.Y1, Min.Y)); 
1

Дизайн ваших классов уже имеет некоторое дублирование; определение вашего Line класса из Point дублируется в X1, X2 и т.д.

Если ваш дизайн выглядит примерно так:

class Point 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

class Line 
{ 
    public Point Start { get; set; } 
    public Point End { get; set; } 

    public IEnumerable<Point> Endpoints 
    { 
     get 
     { 
      return new[] { Start, End }; 
     } 
    } 
} 

Вы могли бы реализовать свой расчет, как это:

class ExtremetiesDeterminer 
{ 
    private IEnumerable<Point> endpoints; 

    public Line DetermineBoundaries(IEnumerable<Line> complicatedShapeLines) 
    { 
     endpoints = complicatedShapeLines.SelectMany(line => line.Endpoints); 

     return new Line 
     { 
      Start = FindExtremety(Enumerable.Min), 
      End = FindExtremety(Enumerable.Max) 
     }; 
    } 

    private Point FindExtremety(
     SingleAxisExtremetyDeterminer findSingleAxisExtremety) 
    { 
     return new Point 
     { 
      X = findSingleAxisExtremety(endpoints, point => point.X), 
      Y = findSingleAxisExtremety(endpoints, point => point.Y) 
     }; 
    } 

    public delegate int SingleAxisExtremetyDeterminer(
     IEnumerable<Point> points, Func<Point, int> getCoordinate); 
} 

Обратите внимание, что это уменьшает дублирование. Вероятно, вы захотите настроить это в зависимости от того, как это взаимодействует с остальной частью вашего кода.

Смежные вопросы