Определение скорости в симуляции боя

Новичок в программировании, для одного из моих первых проектов я слежу за кодом для симуляции boid, и я не уверен, что функции sin и cos делают в этой части кода.

N = numer of boids

angles = 2*math.pi*np.random.rand(N)

vel = np.array(list(zip(np.sin(angles), np.cos(angles))))

В общем, код устанавливает случайные векторы для boids, но почему сами по себе случайные углы недостаточны?

Что делают функции sin и cos, что важно для определения удельной скорости?

Предоставляет ли он техническое задание для индивидуально рассчитанных скоростей подачи?

2 ответа

Решение

TL;DR

angles являются массивом случайных направлений. cos а также sin разложить единичные векторы, указывающие вдоль этих направлений в их x а также y компоненты.

Более длинное объяснение

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

  1. инициализировать N случайные углы, равномерно распределенные между 0 и 2π, и
  2. для каждого угла theta, преобразовать единичный вектор (1, theta) от полярных координат до декартовых координат, для которых преобразование

    x = cos(theta)
    y = sin(theta)
    

Шаг 1. выполняется с

angles = 2 * math.pi * np.random.rand(N)

Шаг 2. можно разложить на

# arrays of x- and y-coordinates
velx = np.cos(angles)
vely = np.sin(angles)

# create (x, y) pairs and convert to np.array
vel = np.array(list(zip(velx, vely)))

Обратите внимание, что в вашем коде np.sin(angles) используется в качестве x-координаты, что не совсем правильно, но это не имеет значения, так как углы в любом случае случайны и равномерны.


Просто к вашему сведению, еще один способ создать (x, y) пары это

vel = np.vstack([velx, vely]).T

Это намного быстрее, так как он работает исключительно с объектами Numpy, без промежуточного Python list,


редактировать

Чтобы уточнить мою точку зрения относительно использования sin а также cos за x а также yвот картинка.

грех против соз

В верхнем ряду показаны векторы скорости для малых углов (0 < theta <π / 4), в этом случае обмен sin а также cos имеет значение, и вы должны быть осторожны, чтобы отслеживать, как вы хотите измерить угол.

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

В этом случае скорость - это не только (скалярная) скорость. Это вектор, так что он описывает как направление, так и скорость. Фактическая скорость в единицах / сек - это длина вектора скорости.

Кажется, что в этом коде (который похож на пример реализации здесь) начальная скорость каждого Boid равна 1, даже если они движутся во всех возможных направлениях.

То же самое происходит в этой реализации в обработке.

Другие вопросы по тегам