Понимание скорости и реализации алгоритма 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.

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