Vérifiez si le produit vectoriel de (b-a) et (c-a) est de 0. Ah, attendez, vous dites que vous voulez savoir si c'est sur la ligne de segment, pas la même ligne. C'est un peu plus de travail et je n'ai pas de temps pour la réponse je vais supprimer cette réponse partielle après que quelqu'un remplit un bon.
Mise à jour: Deux remarques: tout d'abord, Brian Hayes chapitre dans Belle du Code couvre la conception de l'espace pour une colinéarité-fonction de test -- utile de fond. Deuxièmement, [points qui ont depuis été répondu].
Mise à jour 2: j'aime vincent approche mieux maintenant (et je suis gênée
Je ne l'ai pas vu). Mais la comparaison pourrait encore être fait d'une manière plus propre, je pense que, comme ceci:
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
Mise à jour 3: Brian Hayes a souligné que, vous avez besoin seulement de plage de cocher une case de coordonnées, une fois que vous connaissez les points sont colinéaires. (Auparavant, mon code était "and
" au lieu de "if a.x != b.x
".)