2016-05-09 10 views
0

Ich erstelle eine zwei 2D Simulation und ich muss feststellen, ob 2 bewegliche Objekte A und B Pfade kreuzen. A bewegt sich mit einer konstanten Geschwindigkeit Va und B mit Vb.2D-Objekt Kollision

Ich bin in der Lage, den Punkt zu bestimmen, wo der Pfad des Objekts schneiden, aber ich kann nicht herausfinden, ob sie tatsächlich kollidieren werden.

ich den Punkt der Kollision berechnet

This formula

verwenden und das gleiche für y

+0

hängt von der Form der Objekte ab. sind sie AABBs, Kugeln, konvexe, Splines oder generische Punkthüllen? –

+0

sie sind Rechtecke –

Antwort

1

Lassen Sie uns bei zwei Achsen-Ausrichtung Rechtecke betrachten. Sie schneiden sich, wenn sich Projektionen von beiden zur X-Achse schneiden und Projektionen von beiden zur Y-Achse schneiden. enter image description here

erste Rechteck-Koordinaten (Ax1, Ay1), (Ax2, Ay2), Geschwindigkeitsvektor (VAX Vay)
zweite Rechteck-Koordinaten (Bx1, By1), (Bx2, By2), Geschwindigkeitsvektor (VBx, VBy)

Zeitintervall, wenn X-Vorsprünge schneiden:

Ax2+VAx*t1=Bx1+VBx*t1 
t1=(Bx1-Ax2)/(VAx-VBx) 
t2=(Bx2-Ax1)/(VAx-VBx) 

Interval Ix=(t1,t2) (oder (t2, t1), wenn t2 < t1)

F oder Y-Projektionen

u1=(By1-Ay2)/(VAy-VBy) 
u2=(By2-Ay1)/(VAy-VBy) 

Intervall ist Iy=(u1,u2) (oder (u2, u1), wenn u2 < u1)

Überprüfen Sie, ob diese zwei Zeitbereiche Ix und Iy schneiden. Wenn sie dies tun, kollidieren Objekte. Diese

+0

ich denke, ich habe es die Idee ... ich werde versuchen, es jetzt umzusetzen, vielen Dank –

0

ist, wie ich es haben Setup in meinem Code, obwohl es wahrscheinlich nicht einfach diese zu Ihrem Code hinzufügen arbeiten, dies wird hoffentlich helfen Ihnen Sinn der Mathematik machen:

rectangleIntersect() gibt wahr, wenn die beiden Objekte sich gekreuzt haben.

public static boolean intersectRange(int min, int max, int min2, int max2){ 
    return Math.max(min, max) >= Math.min(min2, max2) && 
      Math.min(min, max) <= Math.max(min2, max2); 
} 

public static boolean intersectRange(float min, float max, float min2, float max2){ 
    return Math.max(min, max) >= Math.min(min2, max2) && 
      Math.min(min, max) <= Math.max(min2, max2); 
} 

public static boolean rectangleIntersect(Rectangle rect, Rectangle rect2){ 
    return intersectRange(rect.getX(), rect.getX() + rect.getWidth(), rect2.getX(), rect2.getX() + rect2.getWidth()) && 
      intersectRange(rect.getY(), rect.getY() + rect.getHeight(), rect2.getY(), rect2.getY() + rect2.getHeight()); 
}