86 votes

Intersection rapide de rectangle à rectangle

Quel est le moyen le plus rapide de tester si deux rectangles se croisent ?


Une recherche sur Internet m'a permis de trouver cette phrase (WOOT !), mais je ne comprends pas comment l'écrire en Javascript, elle semble être écrite dans une ancienne forme de C++.

struct
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT; 

bool IntersectRect(const RECT * r1, const RECT * r2)
{
    return ! ( r2->left > r1->right
        || r2->right < r1->left
        || r2->top > r1->bottom
        || r2->bottom < r1->top
        );
}

5 votes

Je pense que vous avez fait une erreur de frappe dans votre copier/coller.

0 votes

Eh bien, c'est d'ici que ça vient et ça me semble identique tekpool.wordpress.com/2006/10/11/

5 votes

L'article original a une coquille. r2->right left n'a pas de sens. Il est peut-être cassé à cause de problèmes d'échappement HTML.

0voto

Langerz Points 61

J'ai utilisé un mélange de méthodes, pour détecter un plus petit rectangle à l'intérieur d'un grand rectangle. C'est une méthode nodejs et utilise la largeur/hauteur mais peut facilement être adaptée.

            isIntersectingRect: function (r1, r2) {
              var quickCheck = (r1.x <= r2.x + r2.w &&
                      r2.x <= r1.x + r1.w &&
                      r1.y <= r2.y + r2.h &&
                      r2.y <= r1.y + r1.h)
              if (quickCheck) return true;
              var x_overlap = Math.max(0, Math.min(r1.x + r1.w, r2.x + r2.w) - Math.max(r1.x, r2.x));
              var y_overlap = Math.max(0, Math.min(r1.y + r1.h, r2.y + r2.h) - Math.max(r1.y, r2.y));
              var overlapArea = x_overlap * y_overlap;
              return overlapArea == 0;
            }

0voto

SpeedOfSpin Points 732

La méthode actuelle de .NET est simplement

    public bool IsEmpty => _width < 0.0;   

    public bool IntersectsWith(Rect rect)
    {
        if (IsEmpty || rect.IsEmpty)
        {
            return false;
        }

        if (rect.Left <= Right && rect.Right >= Left && rect.Top <= Bottom)
        {
            return rect.Bottom >= Top;
        }

        return false;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X