Angenommen, point1
und point2
sind unterschiedlich, prüfen Sie zuerst, ob der Punkt auf der Linie liegt. Dazu benötigen Sie einfach ein "Cross-Produkt" der Vektoren point1 -> currPoint
und point1 -> point2
.
dxc = currPoint.x - point1.x;
dyc = currPoint.y - point1.y;
dxl = point2.x - point1.x;
dyl = point2.y - point1.y;
cross = dxc * dyl - dyc * dxl;
Ihr Punkt liegt auf der Linie, wenn und nur wenn cross
gleich Null ist.
if (cross != 0)
return false;
Nun, wie Sie wissen, dass der Punkt auf der Linie nicht liegt, ist es an der Zeit zu prüfen, ob es zwischen den ursprünglichen Punkten liegt. Dies kann leicht durch einen Vergleich der x
Koordinaten durchgeführt werden, wenn die Leitung „mehr horizontal als vertikal“, oder y
Koordinaten sonst
if (abs(dxl) >= abs(dyl))
return dxl > 0 ?
point1.x <= currPoint.x && currPoint.x <= point2.x :
point2.x <= currPoint.x && currPoint.x <= point1.x;
else
return dyl > 0 ?
point1.y <= currPoint.y && currPoint.y <= point2.y :
point2.y <= currPoint.y && currPoint.y <= point1.y;
anzumerken, dass der obige Algorithmus, wenn vollständig integral wenn die Eingangsdaten integriert ist, ist es nämlich erfordert keine Gleitkommaberechnungen für ganzzahlige Eingaben. Vorsicht vor einem möglichen Überlauf bei der Berechnung cross
obwohl.
P.S. Dieser Algorithmus ist absolut präzise, dh Punkte, die sehr nahe an der Linie, aber nicht genau an der Linie liegen, werden verworfen. Manchmal ist das nicht nötig. Aber das ist eine andere Geschichte.
Es gibt einige gute Antworten unten, aber ich dachte, dass ich darauf hinweisen würde, dass Sie achten sollten für Schwimm punktgenaue Probleme. Unabhängig davon, welche Methode Sie verwenden, müssen Sie wahrscheinlich eine kleine Fehlermenge zulassen, wenn Sie zum Beispiel testen, ob zwei verschiedene Steigungen gleich sind. –
@Adrian McCarthy: Das ist das Hauptproblem bei den pistenbasierten Methoden. Die Steigung ändert sich ungleichmäßig mit dem Winkel: Je näher die Linie an der Vertikalen liegt, desto schneller wächst die Steigung (nicht einmal der Spezialfall mit vertikaler und fast vertikaler Linie). Es gibt einfach keine gute pistenbasierte Strategie.Ich würde Pisten-basierte Methoden um jeden Preis vermeiden. – AnT