Esempio n. 1
0
        private static float GetVectorLengthOfProjection(AxisPack3 axis, Vector3 projection)
        {
            float result = Enumerable.Range(0, 3)
                           .Select(x => GetVectorLengthOfProjection(projection, axis[x]))
                           .Sum();

            return(result);
        }
Esempio n. 2
0
        public bool Overlaps(OrientedRect2D other)
        {
            var distanceAxis     = position - other.position;
            var thisUnitAxis     = new AxisPack3(rotation);
            var thisExtentsAxis  = new AxisPack3(extents, rotation);
            var otherUnitAxis    = new AxisPack3(other.rotation);
            var otherExtentsAxis = new AxisPack3(other.extents, other.rotation);

            //this
            for (int i = 0, iMax = 2; i < iMax; ++i)
            {
                var splitAxis = thisUnitAxis[i];
                var distance  = GetVectorLengthOfProjection(distanceAxis, splitAxis);
                distance -= this.extents[i];
                distance -= GetVectorLengthOfProjection(otherExtentsAxis, splitAxis);
                if (0.0f < distance)
                {
                    //NoHit
                    return(false);
                }
            }
            //other
            for (int i = 0, iMax = 2; i < iMax; ++i)
            {
                var splitAxis = otherUnitAxis[i];
                var distance  = GetVectorLengthOfProjection(distanceAxis, splitAxis);
                distance -= GetVectorLengthOfProjection(thisExtentsAxis, splitAxis);
                distance -= other.extents[i];
                if (0.0f < distance)
                {
                    //NoHit
                    return(false);
                }
            }
            //3rd split axis
            for (int i = 0, iMax = 2; i < iMax; ++i)
            {
                for (int k = 0, kMax = 2; k < kMax; ++k)
                {
                    var splitAxis = Vector3.Cross(thisUnitAxis[i], otherUnitAxis[k]);
                    var distance  = GetVectorLengthOfProjection(distanceAxis, splitAxis);
                    distance -= GetVectorLengthOfProjection(thisExtentsAxis, splitAxis);
                    distance -= GetVectorLengthOfProjection(otherExtentsAxis, splitAxis);
                    if (0.0f < distance)
                    {
                        //NoHit
                        return(false);
                    }
                }
            }

            //Hit
            return(true);
        }