private static float GetVectorLengthOfProjection(AxisPack3 axis, Vector3 projection) { float result = Enumerable.Range(0, 3) .Select(x => GetVectorLengthOfProjection(projection, axis[x])) .Sum(); return(result); }
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); }