// Alignment // Calculates the average velocity of boids in the field of vision and // manipulates the velocity of the current boid in order to match it Pvector Boid::Alignment(vector<Boid> Boids) { float neighbordist = desAli; // Field of vision Pvector sum(0, 0); int count = 0; for (int i = 0; i < Boids.size(); i++) { float d = location.distance(Boids[i].location); if ((d > 0) && (d < neighbordist)) { // 0 < d < 50 sum.addVector(Boids[i].velocity); count++; } } // If there are boids close enough for alignment... if (count > 0) { sum.divScalar(static_cast<float>(count));// Divide sum by the number of close boids (average of velocity) sum.normalize(); // Turn sum into a unit vector, and sum.mulScalar(maxSpeed); // Multiply by maxSpeed // Steer = Desired - Velocity Pvector steer; steer = steer.subTwoVector(sum, velocity); //sum = desired(average) steer.limit(maxForce); return steer; } else { Pvector temp(0, 0); return temp; } }
// Alignment calculates the average velocity in the field of view and // manipulates the velocity of the Boid passed as parameter to adjust to that // of nearby boids. Pvector Boid::Alignment(vector<Boid> Boids) { // If the boid we're looking at is a predator, do not run the alignment // algorithm //if (predator == true) // return Pvector(0,0); float neighbordist = 140; float neighbordist2 = 140; Pvector sum(0, 0); int count = 0; for (int i = 0; i < Boids.size(); i++) { float d = location.distance(Boids[i].location); if ((d > 0) && (d < neighbordist2) && boidType == FACTORY) // 0 < d < 50 { sum.addVector(Boids[i].velocity); count++; } if ((d > 0) && (d < neighbordist) && boidType == FLOCK) // 0 < d < 50 { sum.addVector(Boids[i].velocity); count++; } } // If there are boids close enough for alignment... if (count > 0) { sum.divScalar((float)count);// Divide sum by the number of close boids (average of velocity) sum.normalize(); // Turn sum into a unit vector, and sum.mulScalar(maxSpeed); // Multiply by maxSpeed // Steer = Desired - Velocity Pvector steer; steer = steer.subTwoVector(sum, velocity); //sum = desired(average) steer.limit(maxForce); return steer; } else { Pvector temp(0, 0); return temp; } }