Поиск объектов под определенным углом от другого объекта

Я пишу симуляцию на Python, которая включает в себя агентов, которые могут перемещаться в среде и имеют вектор скорости относительно среды. В среду также входят объекты другого типа (еда). Я хочу, чтобы агенты «видели» только пищу, которая находится на расстоянии r от агента, и только тогда, когда угол между едой и положительной осью x, тета, находится в пределах некоторого «поля зрения», которое определяется как +-альфа градусов от угла бета между вектором скорости и положительной осью X.

На иллюстрации, которую я добавил сюда, синяя стрелка — это вектор скорости, она образует угол бета с положительной осью x, и я хочу, чтобы агент видел только красные точки. когда я просто проверяю, является ли бета-альфа‹=тета‹=бета+альфа, я не получаю правильных результатов, когда диапазон (бета-альфа, бета+альфа) включает переход от отрицательных углов к положительным или от 2pi до 0 и наоборот наоборот

код:

dx = food.x - agent.x
dy = food.y - agent.y
theta = atan2(dy,dx)
alpha = pi/6.
Vx,Vy = agent.velocity[0], agent.velocity[1]
beta = atan2(Vy,Vx)
if (beta-alpha<=theta and theta<=beta+alpha):
    food.color = (255,0,0)
else:
    food.color = (0,0,0)

введите здесь описание изображения


person user1767774    schedule 04.05.2014    source источник
comment
Где твой код? Какие результаты делаете вы получаете?   -  person jonrsharpe    schedule 04.05.2014
comment
Не понял вот этого: only when the angle between the food and the positive x axis, theta. Какой это угол? Еда - это точка, верно, что вы подразумеваете под углом между точкой и линией? Какие две линии составляют угол тета?   -  person gaganbm    schedule 04.05.2014
comment
Вы правы, я не правильно описал. Я имел в виду угол между вектором, соединяющим агент и пищу, с положительной осью x. Джонршарп: Как я уже упоминал, я не получаю точных результатов, когда диапазон (бета-альфа, бета+альфа) включает переход от отрицательных углов к положительным или от 2pi до 0.   -  person user1767774    schedule 04.05.2014


Ответы (2)


Попробуйте исправить граничное условие, при котором alpha+beta и beta-alpha лежат по обе стороны от положительной оси x. Предполагая, что все ваши углы beta и theta лежат в диапазоне (0, 2 * Pi), это может сработать:

def checkMargingForTheta(alpha, beta, theta):
    low = beta - alpha
    high = beta + alpha

    if(high > 2*pi):
        high = high - 2*pi
    if(low < 0):
        low = 2*pi + low
    if(low > high):
        return (theta > low)
    else:
        return (low < theta and high > theta)
person gaganbm    schedule 04.05.2014
comment
Спасибо, это выглядит многообещающе, но... лежат ли бета и тета в диапазоне (0,2pi)? Я не уверен, но насколько я помню, atan2 возвращает ответ между -pi и pi... Я предполагаю, что должен каким-то образом сопоставить его с диапазоном (0,2pi)? - person user1767774; 04.05.2014
comment
Я не знаю, как ведет себя atan2. Но если это всегда положительный угол, он должен быть в диапазоне от 0 до 2PI. В любом случае, если он отрицательный, его можно преобразовать в диапазон от 0 до 2PI, просто добавив 2PI. - person gaganbm; 04.05.2014

Спасибо, gaganbm! для будущих читателей точный ответ:

  def Atan2(y,x): #changing atan2() range to (0,2pi)
   a = atan2(y,x)
   if (a<0):
    a+=2*PI
   return a

  def checkMargingForTheta(alpha, beta, theta):
    low = beta - alpha
    high = beta + alpha

    if(high > 2*pi):
        high = high - 2*pi
    if(low < 0):
        low = 2*pi + low
    if(low > high):
        if (theta > high):
          return (theta>low)  
        else:
          return (True)
    else:
        return (low < theta and high > theta)
person user1767774    schedule 05.05.2014