È possibile farlo calcolando gli angoli.
Supponiamo che i tuoi endpoint siano (x1, y1) e (x2, y2) e che il tuo punto sia (x, y).
Poi si creano due vettori, da un estremo all'altro, e un endpoint al punto:
vec1 = (x - x1, y - y1);
vec2 = (x2 - x1, y2 - y1);
Calcolare il prodotto scalare:
double dotp = (x-x1) * (x2-x1) + (y-y1) * (y2 - y1);
Ora il prodotto scalare diviso per grandezza dà tu il coseno dell'angolo:
double theta = Math.acos((dtop)/(Math.sqrt((x-x1) * (x-x1) + (y-y1) * (y-y1))
* Math.sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1))));
Ora il trucco è che se il tuo angolo è grande er quanto PI/2
, si sono 'fuori'
public static boolean check(double x, double y, double x1, double y1,
double x2, double y2) {
// vectors are (dx1, dy1) and (dx2, dy2)
double dx1 = x - x1, dx2 = x2 - x1, dy1 = y - y1, dy2 = y2 - y1;
double dotp = dx1 * dx2 + dy1 * dy2;
double theta = Math.acos(dotp/(Math.sqrt(dx1 * dx1 + dy1 * dy1)
* Math.sqrt(dx2 * dx2 + dy2 * dy2)));
theta = Math.abs(theta);
if (theta > (Math.PI/2))
return false;
dx1 = x - x2;
dx2 = x1 - x2;
dy1 = y - y2;
dy2 = y1 - y2;
dotp = dx1 * dx2 + dy1 * dy2;
theta = Math.acos(dotp/(Math.sqrt(dx1 * dx1 + dy1 * dy1)
* Math.sqrt(dx2 * dx2 + dy2 * dy2)));
theta = Math.abs(theta);
if (theta > (Math.PI/2))
return false;
return true;
}
Grazie, ha funzionato come un fascino, semplice ed efficiente – Xkynar