Здесь много вопросов о пересечениях сегментов линии здесь, в stackoverflow, и вот еще один! Извините, но мне нужна помощь, чтобы понять, как рассчитать пересечения. Я прочитал несколько вопросов здесь и рассмотрел несколько примеров на других сайтах, но я все еще смущен и не понимаю! Мне не нравится копировать и вставлять код, не работая.
До сих пор я знаю, что я собираюсь сравнить точки каждого сегмента линии, такие как Ax, Ay, Bx, By, Cx, Cy, Dx, Dy. Может кто-нибудь объяснить мне, что я собираюсь рассчитать, каков будет результат вычисления, если есть пересечение?
Это один из примеров кода, который я видел. Я думаю, мне не нужна точка пересечения, просто чтобы узнать, пересекаются ли линии или нет.
public static Point lineIntersect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
double denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
if (denom == 0.0) { // Lines are parallel.
return null;
}
double ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3))/denom;
double ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3))/denom;
if (ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f) {
// Get the intersection point.
return new Point((int) (x1 + ua*(x2 - x1)), (int) (y1 + ua*(y2 - y1)));
}
return null;
}
Нужно ли также вычислять среднее значение, как в этом примере кода?
For lines through points (x0,y0) and (x1,y1), let xm = (x0+x1)/2, ym = (y0+y1)/2 (median of line segment).
Then a = (y1-y0) and b = (x0-x1).
If you evaluate c = a(x-xm)+b(y-ym), c=0 for (x,y) on the line, and the sign(c) tells you which side a point is on