Ich bin ein Flash-Actionscript-Spieleentwickler, der mit Mathematik ein bisschen rückständig ist, obwohl ich Physik sowohl interessant als auch cool finde.
Als Referenz ist dies ein ähnliches Spiel wie das, das ich mache: Unangled Flash-Spiel
Ich habe dieses entwirrte Spiel fast zur vollständigen Vervollständigung der Logik gemacht. Wenn sich zwei Linien kreuzen, brauche ich diese gekreuzten oder verworrenen Linien, um eine andere Farbe zu zeigen. rot.
Es wäre wirklich nett von Ihnen, wenn Sie einen Algorithmus zur Erkennung von Liniensegmentkollisionen vorschlagen könnten . Ich bin im Grunde eine Person, die lieber 'visuell' als 'arithmetisch' denkt :)
Bearbeiten: Ich möchte ein paar Diagramme hinzufügen, um die Idee klarer zu vermitteln
PS Ich versuche eine Funktion als zu machen
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Danke im Voraus.
Antworten:
Ich verwende die folgende Methode, die so ziemlich nur eine Implementierung dieses Algorithmus ist . Es ist in C #, aber die Übersetzung in ActionScript sollte trivial sein.
Es gibt jedoch ein subtiles Problem mit dem Algorithmus. In diesem Fall stimmen zwei Zeilen überein, überlappen sich jedoch nicht. Der Algorithmus gibt in diesem Fall immer noch eine Schnittmenge zurück. Wenn Sie sich für diesen Fall interessieren, glaube ich, dass diese Antwort auf stackoverflow eine komplexere Version hat, die sich damit befasst.
Bearbeiten
Das ist seltsam, ich habe es getestet und es funktioniert für mich mit Ausnahme des oben beschriebenen Einzelfalls. Mit genau der gleichen Version, die ich oben gepostet habe, habe ich die folgenden Ergebnisse erhalten, als ich es für eine Probefahrt gemacht habe:
quelle
Ohne Abteilungen! Also kein Problem mit Präzision oder Division durch Null.
Liniensegment 1 ist A nach B Liniensegment 2 ist C nach D
Eine Linie ist eine nie endende Linie, das Liniensegment ist ein definierter Teil dieser Linie.
Überprüfen Sie, ob sich die beiden Begrenzungsrahmen überschneiden: Wenn keine Überschneidung -> Kein Kreuz! (Berechnung abgeschlossen, Rückgabe falsch)
Überprüfen Sie, ob die Linie seg 1 die Linie seg 2 überspannt und ob die Linie seg 2 die Linie seg 1 überspannt (dh das Liniensegment 1 befindet sich auf beiden Seiten der Linie, die durch das Liniensegment 2 definiert ist).
Dies kann erreicht werden, indem alle Punkte mit -A übersetzt werden (dh Sie verschieben die 2 Linien so, dass A in Origo ist (0,0)).
Dann prüfen Sie, ob sich die Punkte C und D auf verschiedenen Seiten der durch 0,0 bis B definierten Linie befinden
Wenn Sie noch kein "Kein Kreuz" haben, verwenden Sie weiterhin nicht A, B gegen C, D, sondern C, D gegen A, B (gleiche Berechnungen, tauschen Sie einfach A und C, B und D aus), wenn es keine gibt "Kein Kreuz!" dann hast du eine kreuzung!
Ich suchte nach den genauen Berechnungen für das Kreuzprodukt und fand diesen Blogeintrag , der auch die Methode erklärt.
quelle
Ich möchte nur sagen, ich brauchte es für mein Gamemaker Studio-Spiel und es funktioniert gut:
quelle
Die akzeptierte Antwort ergab in diesem Fall eine falsche Antwort:
Diese Linien kreuzen sich offensichtlich nicht, aber entsprechend der Funktion in der "richtigen Antwort" kreuzen sich die Linien.
Das benutze ich:
gibt 0 zurück = die Linien schneiden sich nicht
gibt> 0 zurück = die Linien schneiden sich
Aktualisieren Sie, um die Frage zu beantworten:
Ich habe diesen Code nicht selbst erstellt. Es ist über 5 Jahre alt und ich weiß nicht, was die ursprüngliche Quelle ist. Aber..
Ich denke, der Rückgabewert ist die relative Position der ersten Zeile, in der sie sich kreuzen (um es schlecht zu erklären). Um den Schnittpunkt zu berechnen, könnten Sie wahrscheinlich lerp wie folgt verwenden:
(Ich habe das nicht getestet)
quelle