2016-11-10 10 views
1

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

Возможно, кто-то может помочь мне с некоторыми умными (и эффективными) формулами, которые могут быть использованы для расчета расстояния между двумя прямоугольниками?

Примеры:

enter image description here

Расстояние между A и B длина линии 1. Расстояние между A и C - это длина линии 2. и т. д.

Я использую python для реализации всего. Если уже существует функция (например, в scipy), и кто-то ее знает, это также было бы здорово.

Спасибо

+0

Существует уже вопрос с ответом: http://stackoverflow.com/questions/8224470/calculating-manhattan-distance#8224516 Это может быть Java, но он легко превращается в python –

+0

Я нашел python один http://stackoverflow.com/questions/35363811/manhattan-distance-python –

+0

Это не поможет напрямую, так как вы получаете только расстояние между узлами. К сожалению, минимальное расстояние между двумя прямоугольниками будет только расстоянием между ближайшими угловыми точками, если один прямоугольник не находится в «тени» другого. Однако, если это не так, вам нужно проецировать только на возможный край и получить потенциально две промежуточные точки для определения расстояния. Btw, в этом случае расстояние будет эвклидовым расстоянием – Quickbeam2k1

ответ

2

Я предлагаю, вы работаете с центральными точками прямоугольников и прямоугольник шириной для вычисления расстояния. В основном вы должны выяснить, какие углы (края) прямоугольников использовать для вычисления. все остальное просто. Быстрый пример:

class Rect: 
    def __init__(self,cpt,w,h): 
     self.x = cpt[0] 
     self.y = cpt[1] 
     self.w = w 
     self.h = h 

    def dist(self,other): 
     #overlaps in x or y: 
     if abs(self.x - other.x) <= (self.w + other.w): 
      dx = 0; 
     else: 
      dx = abs(self.x - other.x) - (self.w + other.w) 
     # 
     if abs(self.y - other.y) <= (self.h + other.h): 
      dy = 0; 
     else: 
      dy = abs(self.y - other.y) - (self.h + other.h) 
     return dx + dy 

#example: 
A = Rect((0,0),2,1) 
B = Rect((4,5),1,2) 
C = Rect((-1,-5),1,1) 

print(A.dist(C)) 
print(A.dist(B)) 
print(B.dist(C)) 
+0

Я играл с вами кодом и, похоже, работал :) Спасибо! –

+1

вы также можете довольно легко получить «реальное/диагональное» расстояние между прямоугольниками, просто измените оператор return на: 'return sqrt (dx ** 2 + dy ** 2)' и используйте математический или numpy-модуль для корня – LynxLike

+0

Спасибо для этого дополнительного намека :) Btw: Мне очень нравится ваш код. Это довольно просто и легко понять. –