Определение скорости в симуляции боя
Новичок в программировании, для одного из моих первых проектов я слежу за кодом для симуляции 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
векторы удельной скорости, указывающие в случайных направлениях. Самый логичный (и самый простой) способ сделать это
- инициализировать
N
случайные углы, равномерно распределенные между 0 и 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, даже если они движутся во всех возможных направлениях.
То же самое происходит в этой реализации в обработке.