public static bool Overlaps(RectOriented rectOriented, Rect target) { for (int i = 0; i < 4; i++) { if (target.Contains(rectOriented.OrientedPoints[i], true)) { return(true); } } var points = GetPointsRect(target); var inverRotation = Quaternion.Inverse(rectOriented.Rotation); for (int i = 0; i < 4; i++) { points[i].x -= rectOriented.OriginePivot.x; points[i].y -= rectOriented.OriginePivot.y; Vector2 pointRect = (inverRotation * points[i]) + rectOriented.OriginePivot; if (rectOriented.OriginRect.Contains(pointRect)) { return(true); } } return(false); }
public IEntity[] HitInRect(RectOriented rect) { var hitted = new List <IPawnCollision>(); var pos = new Vector2Int(); var bl = rect.BLContainerPointOriented + SizeMap; var tr = rect.TRContainerPointOriented + SizeMap; var begX = (int)(bl.x / NCollumns); var endX = (int)(tr.x / NCollumns); var begY = (int)(bl.y / NLines); var endY = (int)(tr.y / NLines); for (int j = begX; j <= endX; j++) { for (int z = begY; z <= endY; z++) { pos.Set(z, j); List <IPawnCollision> entities; if (!_map.TryGetValue(pos, out entities)) { continue; } for (int i = entities.Count - 1; i >= 0; --i) { if (hitted.Contains(entities[i])) { continue; } hitted.Add(entities[i]); } } } if (hitted.Count == 0) { return(null); } var dataUniqueHit = hitted.Distinct().Where(item => RectOriented.Overlaps(rect, item.GetRectCollision())); if (dataUniqueHit == null) { return(null); } return(dataUniqueHit.Select(item => item.GetEntity()).ToArray()); }