Резкое движение при попытке реализовать правило 2 алгоритма boids

Моя реализация правило 2 из Боидс псевдокод производит точно противоположность желаемого поведения (боиды отталкиваются, как если бы у каждого из них было силовое поле):

Они будут слегка отклонены друг от друга, и на следующем шаге времени, если они все еще будут рядом, они будут раздвинуты дальше. Следовательно, результирующее отталкивание принимает форму плавного ускорения. Это хорошая идея, чтобы сохранить принцип обеспечения плавного движения. Если два боида расположены очень близко друг к другу, возможно, потому, что они летели очень быстро навстречу друг другу, учитывая, что их предыдущее движение также было ограничено этим правилом. Внезапно отделяя их друг от друга, так что движение каждого из них меняется на противоположное, это кажется неестественным, как будто они отскакивают от невидимых силовых полей друг друга. [Текст под правилом 2]

Насколько я не могу сказать, мой код должен делать то же самое, что и псевдокод

sf::Vector2f App::rule2(Boid* b)
{
sf::Vector2f c;

for(auto& boid : boidslist)
{
if(boid != b)
{
sf::Vector2f delta = boid->position - b->position;
if(std::sqrt(delta.x * delta.x + delta.y * delta.y) < 100)
{
c = c - (boid->position - b->position);
}
}
}
return c;
}

И вот моя функция обновления, чтобы доказать, что я тоже все делаю правильно:

void App::update(float dt)
{
sf::Vector2f v1, v2, v3;

for(auto& boid : boidslist)
{
v1 = rule1(boid);
v2 = rule2(boid);
boid->velocity = boid->velocity + v1 + v2 + v3;
boid->position = boid->position + (boid->velocity * dt * 0.1f);
}
}

PS: если вы хотите, вы можете проверить весь код (6 файлов) Вот

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …