Example #1
0
        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);
        }