Esempio n. 1
0
        internal Vector CalculateMoveByNearbyLions(List <Vector> vectorsLionToAntelope)
        {
            var vectorsWeighedByDistance = WeighByDistance(vectorsLionToAntelope);
            var resultingVector          = new VectorDouble(0, 0);

            foreach (var processedVector in vectorsWeighedByDistance)
            {
                var signedAngleResultToCurrentRadians = _vectorMath.SignedAngleBetween(resultingVector, processedVector);

                var currentAngleAbs = Math.Abs(signedAngleResultToCurrentRadians);
                if (currentAngleAbs < Constants.DELTA)
                {
                    resultingVector += processedVector;
                    continue;
                }

                if (currentAngleAbs >= Math.PI - Constants.DELTA && currentAngleAbs <= Math.PI + Constants.DELTA)
                {
                    Perform180DegreeLogics(ref signedAngleResultToCurrentRadians, vectorsWeighedByDistance,
                                           processedVector);
                }

                // ToDo: weigh angle by distance.
                signedAngleResultToCurrentRadians /= 2;

                resultingVector = _vectorMath.RotateClockwise(resultingVector, signedAngleResultToCurrentRadians) +
                                  _vectorMath.RotateClockwise(processedVector, -signedAngleResultToCurrentRadians);
            }
            resultingVector = _vectorMath.NormalizeDouble(resultingVector);

            return(new Vector(resultingVector));
        }