Вычисление агента на дальних концах конуса зрения

Image1


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

  • Стена (серые агенты) находятся в постоянном месте на вершине мира.
  • Синие агенты всегда прямо внизу, но на разном расстоянии. Но они находятся в стороне от зазора, но тем не менее могут быть повернуты так, чтобы они были обращены к зазору.
  • Что конус зрения у всех синих черепах одинаковый.

На приведенных выше рисунках изображен конус зрения синего агента. Я хочу рассчитать серую стену, которая соответствует концам конуса зрения, то есть одну справа и одну слева. Также я могу как-то вычислить координату x в этой точке. Не координата серого агента, так как это было бы приблизительно.

Для вычислений:

Координаты x указывают, где крайние точки конуса зрения пересекаются с серыми черепахами. Или те серые черепахи, которых они пересекают.

Грубый рисунок:

Итак, я хочу вычислить x_1 и x_2 на рисунке ниже. Один из способов, предложенный @JenB, мог бы разделить его на три случая и вычислить A в каждом случае (в основном слева или справа). Тогда используйте тригонометрию. Я прав. Есть ли и другие способы? введите здесь описание изображения


person Abhishek Bhatia    schedule 02.01.2015    source источник
comment
Не могли бы вы объяснить, почему вам нужно нетригонометрическое решение? Кстати, A вычисляется одинаково для всех случаев, как и длина смещения x. Единственная причина, по которой вам нужны случаи, — решить, следует ли добавить или вычесть смещение из xcor агента, и вы можете сделать это с помощью простого «если» в конце вычислений.   -  person JenB    schedule 04.01.2015


Ответы (3)


Если это двумерная задача, то это просто случай пересечения линий.

Я бы не стал использовать несколько случаев; это очень подвержено ошибкам.

У вас будет линия, описывающая стену черепах, и две линии, описывающие границы поля зрения. Вы можете сформулировать каждую из этих трех линий в параметрической форме как [o.x,o.y] + [v.x, v.y] * s, что представляет собой фиксированную точку [o.x,o.y] плюс вектор нормали [v.x,v.y], масштабированный на s.

Стена черепах определена только для определенного домена «s»; скажем, домен wall.s = [от 0 до 0,4 и от 0,6 до 1]

Я бы описал, как находить точки пересечения, но пересечения параметрических 2D-линий — это довольно стандартная плата за проезд, и лучше показано в формате PDF, поэтому я отсылаю вас к этому... http://www.ahinson.com/algorithms_general/Sections/Geometry/ParametricLineIntersection.pdf (помните, что нельзя делить на нуль)

Как только вы узнаете значения параметров масштабирования «left.wall.s» и «right.wall.s», вы можете сказать, находится ли область стены черепахи в поле зрения игрока. Также вы можете определить точки пересечения, просто подключившись к формулам параметрической линии.

person dwn    schedule 04.01.2015
comment
Пример кода для пересечения двух линий в общем в NetLogo см. в разделах «Пример пересечения линий» и «Пример пересечения ссылок» (в разделе «Примеры кода» в библиотеке моделей NetLogo). @Abhishek, однако, обратите внимание, что в вашем случае одна из линий горизонтальна. Математика для этого проще, чем математика для общего случая, поэтому начинать с общей формулы может быть не самым простым путем к решению. - person Seth Tisue; 04.01.2015

Ответ dw охватывает вычисление точной точки пересечения.

Вы сказали, что вам также интересно просто узнать, на каком патче лежит ответ. Вот код для этого:

to setup
  clear-all
  create-turtles 1 [
    set heading -30 + random 60
  ]
  ask turtles [
    ;; show center of vision cone
    ask boundary-patch [ set pcolor red ]
    ;; show edges of 20 degree vision cone
    lt 10
    ask boundary-patch [ set pcolor blue ]
    rt 20
    ask boundary-patch [ set pcolor blue ]
    ;; restore turtle's original heading
    lt 10
  ]
end

;; answers the question, what patch on the top row of the
;; world is the turtle currently facing?

to-report boundary-patch  ;; turtle procedure
  let n 0
  while [true] [
    let target patch-ahead n
    if target = nobody or [pycor = max-pycor] of target [
      report target
    ]
    set n n + 1
  ]
end

Пример результата:
sample

Конечно, на самом деле было бы более эффективно вычислять ответ напрямую, с помощью формулы. (С необязательным этапом округления в конце, в зависимости от того, хотите ли вы точку или патч.) Но этот код показывает, как это сделать без каких-либо сложных математических вычислений.

person Seth Tisue    schedule 04.01.2015
comment
Спасибо. Выглядит хорошо. Но проблема в том, что стены — это черепахи, а не заплатки. И в моем случае я посчитал заплатки довольно большими по сравнению с размерами стен (в 5 раз). Так что черепахи тоже не помогают. - person Abhishek Bhatia; 06.01.2015
comment
В этом случае вы должны сначала вычислить точную точку пересечения с помощью тригонометрии. - person Seth Tisue; 06.01.2015
comment
@SethTissue Да. Проверьте новый ответ. - person Abhishek Bhatia; 06.01.2015

Следующий тригонометрический подход (предложенный @JenB) отлично работает:

 to-report calx2 [x0 y0 x1 y1 A]
      report x0 + (y1 - y0) * tan ( A + atan (x1 - x0) (y1 - y0))
    end

to start    
  ask turtles[
         set corner-1 list calx2  xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) (-45) ([pycor] of patch-goal - 0.4) 
         set corner-2 list calx2  xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) ( 45) ([pycor] of patch-goal - 0.4) 

    ]

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

person Abhishek Bhatia    schedule 06.01.2015