public Ocean(int _fishNb, double _width, double _height) { MAX_WIDTH = _width; // Largeur de l'ocean. MAX_HEIGHT = _height; // Longueur de l'ocean. randomGenerator = new Random(); // Creation d'une liste obstacles vide. obstacles = new List <BadZone>(); // Creation de poissons. fishList = new FishAgent[_fishNb]; for (int i = 0; i < _fishNb; i++) { // PosX = _x; PosY = _y; speedX = Math.Cos(_dir); speedY = Math.Sin(_dir); (chacun est positionné et dirigé aléatoirement). fishList[i] = new FishAgent(randomGenerator.NextDouble() * MAX_WIDTH, randomGenerator.NextDouble() * MAX_HEIGHT, randomGenerator.NextDouble() * 2 * Math.PI); } }
/************************************************************************************************/ /******** S’il y a un poisson dans la zone très proche, on s’en éloigne (règle 3).********/ internal bool AvoidFish(FishAgent _fishAgent) // Eviter les opoissons. { double squareDistanceToFish = SquareDistanceTo(_fishAgent); // Calcul le vecteur unitaire entre l’agent et ce poisson. if (squareDistanceToFish < SQUARE_DISTANCE_MIN) // Si le poisson se trouve dans la zone d'Evitement. { // Calculer le vecteur direction Diff normalisé entre nous (This) et le poisson en Parametre. double diffX = (_fishAgent.PosX - PosX) / Math.Sqrt(squareDistanceToFish); double diffY = (_fishAgent.PosY - PosY) / Math.Sqrt(squareDistanceToFish); // On applique une modification de notre vecteur vitesse en y retranchant le quart de ce vecteur Diff. speedX = SpeedX - diffX / 4; // speedX = Math.Cos(_dir); speedY = SpeedY - diffY / 4; // speedY = Math.Sin(_dir); // Puis on normalise le vecteur direction. Normalize(); return(true); // On renvoie vrai si on a dû éviter une zone. } return(false); }
// Savoir si un autre poisson est proche, ie dans la zone d’alignement (donc entre la distance minimale et la distance maximale). private bool Near(FishAgent _fish) { double squareDistance = SquareDistanceTo(_fish); return(squareDistance < SQUARE_DISTANCE_MAX && squareDistance > SQUARE_DISTANCE_MIN); }