Я искал некоторый псевдокод для boids и написал его на C++. Однако я нахожу, что бои иногда будут сталкиваться друг с другом. Я думал, что я запрограммировал его правильно, учитывая, насколько прост в psuedocode. Тем не менее, когда я показываю местоположения всех boids, некоторые из них имеют одинаковые координаты.Бои, сталкивающиеся друг с другом
псевдокод по ссылке:
PROCEDURE rule2(boid bJ)
Vector c = 0;
FOR EACH BOID b
IF b != bJ THEN
IF |b.position - bJ.position| < 100 THEN
c = c - (b.position - bJ.position)
END IF
END IF
END
RETURN c
END PROCEDURE
мой код:
std::pair <signed int, signed int> keep_distance(std::vector <Boid> & boids, Boid & boid){
signed int dx = 0;
signed int dy = 0;
for(Boid & b : boids){
if (boid != b){ // this checks an "id" number, not location
if (b.dist(boid) < MIN_DIST){
dx -= b.get_x() - boid.get_x();
dy -= b.get_y() - boid.get_y();
}
}
}
return std::pair <signed int, signed int> (dx, dy);
}
с
MIN_DIST = 100;
unsigned int Boid::dist(const Boid & b){
return (unsigned int) sqrt((b.x - x) * (b.x - x) + (b.y - y) * (b.y - y));
}
единственное существенное различие между этими двумя кодами должно быть, вместо того, чтобы vector c
, используя вместо этого компоненты.
порядок функций, которые я использую, чтобы переместить каждый Boid вокруг:
center_of_mass(boids, new_boids[i]); // rule 1
match_velocity(boids, new_boids[i]); // rule 3
keep_within_bound(new_boids[i]);
tendency_towards_place(new_boids[i], mouse_x, mouse_y);
keep_distance(boids, new_boids[i]); // rule 2
есть что-то очевидно, им не видеть? может быть, какая-то глупая векторная арифметика, я сделал не так?
'int' подписан по умолчанию, поэтому вы можете написать' int' вместо 'signed int', если хотите. –
, что серьезно не полезно – calccrypto