Prüfen Sie, ob das Kreuzprodukt von b-a
y c-a
es 0
: Das bedeutet, dass alle Punkte kollinear sind. Wenn das der Fall ist, prüfen Sie, ob c
Die Koordinaten liegen zwischen a
und b
's. Verwenden Sie entweder die x- oder die y-Koordinaten, solange a
y b
auf dieser Achse getrennt sind (oder sie sind auf beiden gleich).
def is_on(a, b, c):
"Return true iff point c intersects the line segment from a to b."
# (or the degenerate case that all 3 points are coincident)
return (collinear(a, b, c)
and (within(a.x, c.x, b.x) if a.x != b.x else
within(a.y, c.y, b.y)))
def collinear(a, b, c):
"Return true iff a, b, and c all lie on the same line."
return (b.x - a.x) * (c.y - a.y) == (c.x - a.x) * (b.y - a.y)
def within(p, q, r):
"Return true iff q is between p and r (inclusive)."
return p <= q <= r or r <= q <= p
Diese Antwort war ein Durcheinander von drei Aktualisierungen. Die wertvollen Informationen von ihnen: Brian Hayes's Kapitel in Schöner Code deckt den Entwurfsraum für eine Kollinearitätstestfunktion ab - nützlicher Hintergrund. Vincents Antwort dazu beigetragen, diese zu verbessern. Und es war Hayes, der vorschlug, nur eine der x- oder y-Koordinaten zu testen; ursprünglich hatte der Code and
anstelle von if a.x != b.x else
.
(Dies ist für exakte Arithmetik mit ganzen oder rationalen Zahlen kodiert; wenn Sie stattdessen Fließkommazahlen übergeben, wird es Probleme mit Rundungsfehlern geben. Ich bin mir nicht einmal sicher, wie man den Abstand von 2-D-Punkten in Fließkomma-Koordinaten definieren kann).
4 Stimmen
Ich sehe in diesen Antworten sehr viel Länge = sqrt(x); das mag funktionieren, aber es ist nicht schnell. Erwägen Sie die Verwendung von length-squared; wenn Sie nur quadrierte Längenwerte miteinander vergleichen, gibt es keinen Genauigkeitsverlust, und Sie sparen langsame Aufrufe von sqrt().
1 Stimmen
Wird der Punkt c auch durch 2 ganze Zahlen dargestellt? Wenn ja, wollen Sie dann wissen, ob c genau auf einer echten Geraden zwischen a und b liegt oder auf der Rasterannäherung der Geraden zwischen a und b? Dies ist eine wichtige Klarstellung.
0 Stimmen
Eine ähnliche Frage wurde hier gestellt: stackoverflow.com/q/31346862/1914034 mit einer Lösung, wenn ein Pufferabstand zur Linie erforderlich ist
0 Stimmen
Verwandt: Ermitteln, ob der Shapely-Punkt innerhalb eines LineString/MultiLineString liegt
2 Stimmen
Warnung an zukünftige Leser: Eine ganze Reihe von Antworten sind falsch oder unvollständig. Ein paar Randfälle, die häufig nicht funktionieren, sind horizontale und vertikale Linien.