Понимание скорости и реализации алгоритма Boids?
Поэтому я работаю над переносом Boids на Brightscript, основываясь на псевдокоде здесь.
Я пытаюсь понять структуры данных, например, Velocity одно значение, или это 3D-значение? (т.е. velocity={x,y,z}
)
Кажется, что псевдокод, кажется, смешивает это, где иногда имеет уравнение, которое включает в себя как векторы, так и элементы с одним значением:
v1 = rule1(b)
v2 = rule2(b)
v3 = rule3(b)
b.velocity = b.velocity + v1 + v2 + v3
Если Velocity является трехсторонним значением, это будет иметь смысл, но я не уверен.
Итак, мой первый вопрос: на основе приведенного выше псевдокода это правильная структура данных для одного boid?
boid={position:{px:0,py:0,pz:0},velocity:{x:0,y:0,z:0},vector:{x:0,y:0,z:0},pc:{x:0,y:0,z:0},pv:{x:0,y:0,z:0})
где pc
= воспринимаемый центр, и pv
= воспринимаемая скорость.
Я реализовал vector_add
, vector_sub
, vector_div
и векторные булевы функции.
Причина, по которой я начинаю с этого псевдокода, заключается в том, что я не смог найти ничего более удобного для чтения, но он все еще оставляет много вопросов, поскольку структуры данных не определены явно для каждой переменной.
(править) Вот хороший пример того, о чем я говорю:
IF |b.position - bJ.position| < 100 THEN
если b.position - b[j].position
являются трехмерными координатами, как их можно считать "менее 100", если они не < {100,100,100}
?
2 ответа
Скорость
Если вы посмотрите на их псевдокод для сложения и вычитания векторов, они явно выполняют эти операции над трехмерными векторами, например
PROCEDURE Vector_Add(Vector v1, Vector v2)
Vector v
v.x = v1.x + v2.x
v.y = v1.y + v2.y
v.z = v1.z + v2.z
RETURN v
END PROCEDURE
В разделе " Дополнительные функции " также сказано:
... все сложения и вычитания в приведенном выше псевдокоде являются векторными операциями
Таким образом, мы можем предположить, b.velocity = b.velocity + v1 + v2 + v3 + ...
это векторное сложение для 3D векторов.
Векторная величина
Вычитание двух векторов называется разностью между векторами и создает новый вектор. В вашем случае пусть diffB = b.position - bJ.position
,
Сейчас |b.position - bJ.position|
эквивалентно |diffB|
и принимает величину вектора разности diffB
, а не абсолютное значение "единственного значения" (называемого скалярным). Величина также называется векторной длиной или нормой.
Что может сбивать с толку, так это то, что величина вектора обозначается теми же обозначениями, что и абсолютное значение. Так diffB
вектор разности, и |diffB|
это величина этого вектора. Величина определяется для вектора v
в евклидовом пространстве |v| = sqrt(x1^2 + ... + xn^2)
,
Итак, для вашего 3D вектора diffB
:
|diffB| = sqrt(x1^2 + x2^2 + x3^2) = sqrt(x^2 + y^2 + z^2)
Так как результатом квадратного корня является скаляр, он может явно удовлетворить < 100
,
Так что да, я считаю, что скорость - это трехмерный вектор velocity = {x1, x2, x3}
и хотя я не провёл тщательного анализа псевдокода boid, ваша структура данных выглядит правильно.
Что здесь выражается выражением:
|b.position - bJ.position|
На самом деле скаляр от разности двух векторов.
Этот скаляр является единственным значением и поэтому может быть < 100.