Supponendo che point1
e point2
siano diversi, in primo luogo si controlla se il punto si trova sulla linea. Per questo è sufficiente un "cross-product" di vettori point1 -> currPoint
e 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;
Il punto si trova sulla linea se e solo se cross
è uguale a zero.
if (cross != 0)
return false;
Ora, come lei sa che il punto non si trovano sulla linea, è il momento di verificare se esso si trova tra i punti originali. Questo può essere fatto facilmente confrontando le coordinate x
, se la linea è "più orizzontale che verticale", o y
coordinate altrimenti
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;
noti che l'algoritmo precedente se interamente integrale se i dati di input è solidale, cioè non richiede calcoli in virgola mobile per l'input intero. Attenzione al potenziale trabocco quando si calcola lo cross
.
P.S. Questo algoritmo è assolutamente preciso, il che significa che rifiuterà punti che si trovano molto vicino alla linea, ma non precisamente sulla linea. A volte questo non è ciò che è necessario. Ma questa è una storia diversa.
Ci sono alcune buone risposte qui sotto, ma ho pensato di sottolineare che si dovrebbe guardare fuori per il galleggiamento problemi di precisione del punto. Qualunque sia il metodo che utilizzi, probabilmente dovrai consentire una piccola quantità di errori quando, ad esempio, verifichi se due pendenze diverse sono le stesse. –
@Adrian McCarthy: Questo è il problema principale con i metodi basati sulla pendenza. La pendenza cambia in modo non uniforme con l'angolo: più la linea si avvicina alla verticale, più velocemente aumenta la pendenza (nemmeno menzionando il caso speciale con linea verticale e quasi verticale). Semplicemente non esiste una buona strategia basata sulla pendenza.Eviterei i metodi basati sulla pendenza a tutti i costi. – AnT