Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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());
    }