2016-04-11 9 views
1

Angenommen, ich habe ein Rechteck mit einem Punkt (die obere linke Ecke) definiert ist, und eine Breite und Höhe wie diese (in C++):Rectangle Kollision bestimmt Seite

class Rectangle 
{ 
public: 
    Rectangle(float _x, float _y, float _width, float _height); 
    ~Rectangle(); 

    float X, Y, Width, Height; 

    bool intersects(Rectangle& _rect) 
    { 
     return (
     (X < _rect.X + _rect.Width)&& 
     (X + Width > _rect.X)&& 
     (Y < _rect.Y + _rect.Height)&& 
     (Y + Height > _rect.Y) 
     ); 
    } 
} 

Die obige intersects Funktion gibt wahr zurück, wenn die Rechtecke überlappen - wenn sie kollidieren. Aber was, wenn ich herausfinden möchte, welche Seite des Rechtecks ​​das andere Rechteck kollidiert mit? Wie würde ich das machen (effizient, aber keine Priorität)?

+0

Ihre Funktion gibt 'true' zurück, wenn Rechteck A vollständig innerhalb des Rechtecks ​​B ist. Auf welcher Seite" kollidieren "sie? Was ist mit Rechtecken mit zwei überlappenden Seiten? – dasblinkenlight

+0

... oder wenn eine Ecke eines Rechtecks ​​vollständig innerhalb der anderen liegt, wobei die anderen drei Ecken vollständig außerhalb liegen. Was jetzt? –

+0

Nun, das ist nur allgemein zu testen, ob sie sich "berühren". Was für mich ausreichend ist. Wenn ein Rechteck innerhalb eines anderen Reckrangels ist und dies wahr zurückgibt, ist das für mich akzeptabel. Aber ich möchte mit dieser Art von Rechteck wissen, wie ich auf eine richtige Kollision prüfen kann, das heißt, herauszufinden, welche Seite mit einem anderen Rechteck kollidiert. – calcyss

Antwort

1

Im Falle einer Kollision wird, gibt es 16 verschiedene Varianten enter image description here erkannt

Wie ich diesen Tisch bekam? Es gibt 4 verschiedene Plätze für die linke obere Ecke des roten Rechtecks. Erste Zeile ist erste Variante, zweite Zeile - zweite Variante und so weiter. Auch dort sind 4 diff. Plätze für die rechte untere Ecke der roten Rect. Und ich lege auch jede Variante in eine separate Spalte.
Zum Beispiel wollen wir wissen, ob die Oberseite von (* dies) (sei es rot) mit _rect kollidiere (sei blau). Das gilt für die Varianten 9,10,11,12,14,16. Also der Fall ist
(_rect.Y < Y < _rect.Y + _rect.Height) && (X < _rect.X || X + Width > _rect.X + _rect.Width)

+0

können Sie bitte Zahlen zu den einzelnen Fällen hinzufügen? Ich verstehe nicht ganz Ihr Nummerierungsschema, danke für die Antwort! – calcyss

+0

@calcyss Varianten auf der ersten Zeile sind 1,2,3,4; auf der zweiten - 5,6,7,8 abd so weiter – Pavel