Możesz to zrobić, obliczając kąty.
Załóżmy, że Twoje punkty końcowe to (x1, y1) i (x2, y2), a twój punkt to (x, y).
Następnie należy utworzyć dwa wektory, z jednego punktu końcowego do drugiego i jednego punktu końcowego do punktu:
vec1 = (x - x1, y - y1);
vec2 = (x2 - x1, y2 - y1);
obliczyć iloczyn skalarny:
double dotp = (x-x1) * (x2-x1) + (y-y1) * (y2 - y1);
Teraz produkt kropka podzielona przez wielkość daje Ci cosinus kąta:
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))));
Teraz lewa jest tak, że jeśli kąt jest wielki er niż PI/2
, jesteś „out”
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;
}
Dziękuję, pracowałeś jak czar, prosty i skuteczny – Xkynar