Я работаю над методом python, который должен вернуть координаты перехвата (точки столкновения) для двух касающихся кругов. Метод работает так, как ожидалось, но он кажется слишком дорогостоящим для своей цели.Как бы оптимизировать этот метод для обнаружения столкновений точек?
Должна быть только одна точка перехвата, и размеры этих кругов могут различаться.
def getPointOfContact(self, body):
a1 = min(self.pos.x, body.pos.x) # The x value of the centre of the left-most circle
b1 = min(self.pos.y, body.pos.y) # The y value of the up-most circle
a2 = max(self.pos.x, body.pos.x) # The x value of the right-most circle
b2 = max(self.pos.y, body.pos.y) # The y value of the down-most circle
dx = a2-a1 # (Delta x) The difference in x positions
dy = b2-b1 # (Delta y) The difference in y positions
if dy == 0: # In case of no difference in y,
m = 0 # Gradient is "zero"
elif dx == 0: # In case of no difference in x,
m = float("inf") # Gradient is "infinity"
else:
m = dy/dx # Gradient
if a1 == self.pos.x: # Such that left-most circle's radius is used
r1 = (self.size.x)/2
else:
r1 = (body.size.x)/2
# Calculates the x position of intersection using trig
x = a1+(r1*math.cos(math.atan(m)))
if b1 == self.pos.y: # Such that up-most circle's radius is used
r1 = (self.size.x)/2
else:
r1 = (body.size.x)/2
# Calculates the y position of intersection using trig
y = b1+(r1*math.sin(math.atan(m)))
return (int(x), int(y)) # Returns the coordinates as a tuple of integers
Фактический расчет на самом деле довольно прямолинейный. Он просто добавляет x и y компоненты смещения радиусов к координате центра круга.
Проблема заключается в том, что для того, чтобы расчет был действительным, должно быть много места, т. Е. Используемый круг должен иметь наименьший компонент, а радиус (r1) сильно соответствует кругу.
Будет ли способ упрощения метода или даже более дешевой техники вообще?
Заранее спасибо.
Возможно, лучшее место, как есть в [Обзор кода] (http://codereview.stackexchange.com/) –
Если код работает по назначению и вам нужен обзор вашего кода, да, это будет хороший вопрос для обзора кода. Вы можете отправить свой вопрос там, если вы сделаете это, лучше всего удалить его, чтобы у нас не было дубликатов. – Phrancis
@Phrancis, был бы способ передвинуть его туда, не удаляя? –