2010-12-04 6 views
-1

J'ai deux objets dans un projet CSharp, qui présente des rectangles. Maintenant, je veux calculer si un objet croise un autre. Les objets ne peuvent pas tourner.Algorithme d'intersection

J'ai les méthodes suivantes:

getX(); 
getY(); 
getWidth(); 
getHeight(); 
+0

en double de cette question: http://stackoverflow.com/questions/306316/determine- if-two-rectangles-overlap-each-other –

+0

Ouais, je l'ai trouvé aussi ... Mais cette solution était trop compliquée pour moi ... – friedkiwi

+0

@YvanJANSSENS Parce qu'elle était en pseudocode et fournissait des explications approfondies au lieu d'une simple L'extrait de code C#? –

Répondre

2

Bien que cette est techniquement un double de cette autre question, je propose une solution plus élégante que ce qui était là affiché.

La façon dont je le regarderais serait du point de vue de la boîte englobante. Si la zone de délimitation est inférieure à la somme des hauteurs et que la somme skinnier des largeurs, ils doivent se croisent:

// assume we have a class with a constructor like so... 
class Rect 
{ 
    ... 
    void Rect(int top, int left, int bottom, int right) { ... } 
    ... 
} 

... 

private Rect GetBoundingRect(Rect r1, Rect r2) 
{ 
    int left = min(r1.getX(), r2.getX()); 
    int right = max(r1.getX()+r1.getWidth(), r2.getX()+r2.getWidth()); 
    int top = min(r1.getY(), r2.getY()); 
    int bottom = max(r1.getY()+r1.getHeight(), r2.getY()+r2.getHeight()); 
    return new Rect(top, left, bottom, right); 
} 

private bool CheckIfIntersect(Rect r1, Rect r2) 
{ 
    Rect bound = GetBoundingRect(r1,r2); 
    return (bound.getWidth() < r1.getWidth() + r2.getWidth()) && 
      (bound.getHeight() < r1.getHeight() + r2.getHeight()); 
}