Exemplo n.º 1
0
        /// <summary>
        /// Determines if a collision has occurred on an Axis of one of the
        /// planes parallel to the Rectangle
        /// </summary>
        /// <param name="theRectangle"></param>
        /// <param name="aAxis"></param>
        /// <returns></returns>
        public bool IsAxisCollision(RotatedRectangle theRectangle, Vector2 aAxis)
        {
            //Project the corners of the Rectangle we are checking on to the Axis and
                //get a scalar value of that project we can then use for comparison
                List<int> aRectangleAScalars = new List<int>();
                aRectangleAScalars.Add(GenerateScalar(theRectangle.UpperLeftCorner(), aAxis));
                aRectangleAScalars.Add(GenerateScalar(theRectangle.UpperRightCorner(), aAxis));
                aRectangleAScalars.Add(GenerateScalar(theRectangle.LowerLeftCorner(), aAxis));
                aRectangleAScalars.Add(GenerateScalar(theRectangle.LowerRightCorner(), aAxis));

                //Project the corners of the current Rectangle on to the Axis and
                //get a scalar value of that project we can then use for comparison
                List<int> aRectangleBScalars = new List<int>();
                aRectangleBScalars.Add(GenerateScalar(UpperLeftCorner(), aAxis));
                aRectangleBScalars.Add(GenerateScalar(UpperRightCorner(), aAxis));
                aRectangleBScalars.Add(GenerateScalar(LowerLeftCorner(), aAxis));
                aRectangleBScalars.Add(GenerateScalar(LowerRightCorner(), aAxis));

                //Get the Maximum and Minium Scalar values for each of the Rectangles
                int aRectangleAMinimum = aRectangleAScalars.Min();
                int aRectangleAMaximum = aRectangleAScalars.Max();
                int aRectangleBMinimum = aRectangleBScalars.Min();
                int aRectangleBMaximum = aRectangleBScalars.Max();

                //If we have overlaps between the Rectangles (i.e. Min of B is less than Max of A)
                //then we are detecting a collision between the rectangles on this Axis
                if (aRectangleBMinimum <= aRectangleAMaximum && aRectangleBMaximum >= aRectangleAMaximum)
                {
                    return true;
                }
                else if (aRectangleAMinimum <= aRectangleBMaximum && aRectangleAMaximum >= aRectangleBMaximum)
                {
                    return true;
                }

                return false;
        }