Как найти, какой прямоугольник ближе всего к точке

Если у меня есть два объекта System.Drawing.Rectangle на холсте и Point, как наилучший способ вычислить, какой Rectangle (любая часть Rectangle, а не только его Location Point) ближе всего к этому Point?

Пример из модульного теста:

Rectangle one = new Rectangle (0, 0, 10, 10);

Rectangle two = new Rectangle (20, 20, 10, 10);

Point point = new Point(14, 14);

Rectangle actual = ClosestToPoint(point, one, two);

// should be closer to one since one's bottom right is at (10, 10)
Assert.That(actual, Is.SameAs(one));

// method to write
public Rectangle ClosestToPoint(Point p, params Rectangle[] rectangles) { } 

person Michael Hedgpeth    schedule 22.11.2010    source источник
comment
Используйте лист бумаги и карандаш, чтобы разобраться в этом. Существует ограниченное количество сценариев. В противном случае это неоднозначный вопрос, вам нужно указать, что происходит, когда точка находится внутри одного или нескольких прямоугольников.   -  person Hans Passant    schedule 23.11.2010
comment
Некоторые ответы также можно найти здесь: «вычисление расстояния между точкой и ближайшей точкой прямоугольного прямоугольника»> stackoverflow.com/questions/5254838/   -  person Mo0gles    schedule 22.04.2014


Ответы (3)


расстояние до прямоугольника = min (расстояние до каждого из 4 сегментов линии, являющихся краями прямоугольника)

Чтобы узнать расстояние до линейного сегмента, см. этот вопрос

person mbeckish    schedule 22.11.2010
comment
Если я что-то не упустил, это дает неправильный ответ, если точка находится внутри прямоугольника. - person CAFxX; 07.03.2013
comment
@CAFxX - зависит от того, как вы хотите определить расстояние до прямоугольника. Если вы думаете о прямоугольниках как о телах, то вы, вероятно, захотите определить расстояние как 0, когда точка находится внутри прямоугольника. Однако я уверен, что есть случаи, когда вы хотите, чтобы расстояние определялось как расстояние до ближайшего края, независимо от того, находится ли точка внутри прямоугольника. - person mbeckish; 07.03.2013

Это для измерения расстояния между двумя точками, поэтому возьмите координатную точку из вашего прямоугольника (это зависит от вас, потому что я не знаю, что ближе всего для вас):

   public int Distance2D(int x1, int y1, int x2, int y2)
   {

    int result = 0;
    double part1 = Math.Pow((x2 - x1), 2);

    double part2 = Math.Pow((y2 - y1), 2);
    double underRadical = part1 + part2;
    result = (int)Math.Sqrt(underRadical);

     return result;
   }
person dexter    schedule 22.11.2010
comment
Настоящий вопрос заключается в том, какие точки я должен выбрать, а не в том, как рассчитать расстояние. - person Ahmet Kakıcı; 23.11.2010
comment
Я полагаю, тогда возникает вопрос, как мне найти, какая точка прямоугольника ближе всего к данной точке. Тогда, как вы говорите, нужно просто найти ближайшее расстояние между одной точкой и ближайшими точками ко всем прямоугольникам. - person Michael Hedgpeth; 23.11.2010

Хм. Я думаю о том, чтобы перебрать ваш массив прямоугольников и сохранить каждый индекс X и Y в списке. Затем вы можете просмотреть список и сделать что-то abs(min(i.getX() - point)). Если они равны, проверьте min(y).

person 08Hawkeye    schedule 22.11.2010
comment
нет необходимости вычислять расстояние от точки до точки достаточно линии до точки - person Ahmet Kakıcı; 23.11.2010