Ich habe gerade die Kollisionserkennung mit SAT implementiert und dieser Artikel als Referenz zu meiner Implementierung. Die Erkennung funktioniert wie erwartet, aber ich muss wissen, wo beide Rechtecke zusammenstoßen.
Ich muss das Zentrum der Kreuzung finden, den schwarzen Punkt auf dem Bild oben (aber ich habe auch keinen Kreuzungsbereich). Ich habe einige Artikel darüber gefunden, aber alle beinhalten die Vermeidung der Überlappung oder irgendeine Art von Geschwindigkeit, ich brauche das nicht.
Die Informationen, die ich über die Rechtecke habe, sind die vier Punkte, die sie repräsentieren, die Koordinaten upper right
, upper left
, lower right
und lower left
. Ich versuche einen Algorithmus zu finden, der mir die Schnittmenge dieser Punkte geben kann.
Ich muss nur ein Bild darüber setzen. Wie zwei Autos abgestürzt sind, habe ich ein Bild oben auf das Kollisionszentrum gelegt. Irgendwelche Ideen?
Es gibt noch eine andere Möglichkeit, den Massenschwerpunkt des Kollisionsgebietes durch Abtasten von Punkten zu finden.
Erstellen Sie die folgende Funktion:
%Vor%Definieren Sie ein Suchrechteck als:
%Vor%Dabei sind x und y die Koordinaten beider Rechtecke.
Sie definieren jetzt einen Schritt, um den Suchbereich wie ein Netz zu teilen. Ich schlage vor, dass Sie AVG (W, H) / 2 verwenden, wobei W und H die Breite und Höhe des Suchbereichs sind.
Dann iterieren Sie die Gitterpunkte, die für jeden gefunden werden, wenn er sich innerhalb des Kollisionsbereichs befindet:
%Vor%Definieren:
%Vor%Dann:
Und du kannst das natürlich auch mit Y machen. Hier ist ein illustratives Beispiel für diesen Ansatz:
Sie müssen den Schnittpunkt der Grenzen der Boxen mit Hilfe der Gleichung / des Algorithmus von Linie zu Linie schneiden.
Sobald Sie die Punkte haben, die Sie kreuzen, könnte mit dem Durchschnitt dieser Punkte oder dem Zentrum, das eine bestimmte Richtung gegeben wird, möglicherweise in Ordnung sein. Die Mitte ist in der Frage ein wenig vage.
Edit: Außerdem müssen Sie herausfinden, ob eine der Ecken eines der beiden Rechtecke innerhalb des anderen liegt (dies sollte leicht genug sein, um selbst aus den Schnittpunkten heraus zu arbeiten). Dies sollte bei der Berechnung des "durchschnittlichen" Mittelpunkts mit den Schnittpunkten addiert werden.
Dies ist schwierig, weil unregelmäßige Polygone kein definiertes Zentrum haben. Da Ihre Polygone (im Falle von Rechtecken) garantiert konvex sind, können Sie wahrscheinlich die Ecken des Polygons finden, das die Kollision umfasst (die Ecken der ursprünglichen Formen oder Schnittpunkte der Kanten enthalten können) und sie mitteln, um sie zu erhalten. .. etwas. Es wird wahrscheinlich vage nah an dem sein, wo man das "Zentrum" erwarten würde, und für reguläre Polygone würde es wahrscheinlich genau übereinstimmen, aber ob es mathematisch etwas anderes bedeuten würde, ist ein bisschen eine andere Geschichte.
Ich habe mathematisch getüftelt und das Folgende entwickelt, das das Glätteproblem löst, wenn Punkte erscheinen und verschwinden (wie es passieren kann, wenn die Bewegung einer Hitbox bewirkt, dass ein Rechteck zu einem Dreieck wird oder umgekehrt). Ohne dieses Extra wird beim Hinzufügen und Entfernen von Ecken der Schwerpunkt springen.
Das Diagramm zeigt zwei Rechtecke, R und B (für Rot und Blau). Die Kreuzung streicht einen Bereich G (für Grün). Die Ungewichteten und Gewichteten Zentren (beide Violett) werden mit den folgenden Methoden berechnet:
%Vor%Eine gewichtete Ecke eines Polygons ist definiert als die Koordinaten der Ecke, gewichtet mit der Sinuslinie des Winkels der Ecke.
Dieses Polygon hat zwei 90-Grad-Winkel, einen Winkel von 59,03 Grad und einen Winkel von 120,96 Grad. (Die beiden nicht rechten Winkel haben den gleichen Sinus, sin (Ɵ) = 0.8574929 ...
Die Koordinaten des gewichteten Zentrums sind somit:
%Vor%Mit dem mitgelieferten Beispiel ist der Unterschied nicht sehr auffällig, aber wenn die 4gon viel näher an einem 3gon wären, würde es eine signifikante Abweichung geben.
Wenn Sie die tatsächlichen Koordinaten der Region nicht kennen müssen, können Sie zwei CALayer
s erstellen, deren Rahmen die Rechtecke sind, und eine verwenden, um die andere zu maskieren. Wenn Sie ein Bild in dem maskierten Bild festlegen, wird es nur in dem Bereich angezeigt, in dem sie sich überlappen.