Следующий код получил 2 функции. (спасибо @AlexRudenko, который помог мне)
Они оба получают сегмент, линию (необязательно бесконечный). В дополнение к тому, который у них уже есть. Первая функция проверяет, существует ли точка пересечения (только одна), и возвращает логическое значение. Второй должен проверить то же самое и вернуть саму точку.
// Returns true if the lines intersect, false otherwise
public boolean isIntersecting(Line other) {
if (equals(other)){
return false;
}
double x11 = this.start.getX();
double y11 = this.start.getY();
double x12 = this.end.getX();
double y12 = this.end.getY();
double x21 = other.start.getX();
double y21 = other.start.getY();
double x22 = other.end.getX();
double y22 = other.end.getY();
if (x11 == x12 && x21 == x22) { // both lines are constant x
// no intersection point
return false;
} else if (x11 == x12 || x21 == x22) { // either line is constant x
double x;
double m;
double b;
if (x11 == x12) { // first line is constant x, second is sloped
x = x11;
m = (y22 - y21) / (x22 - x21);
b = (x22 * y21 - x21 * y22) / (x22 - x21);
} else { // second line is constant x, first is sloped
x = x21;
m = (y12 - y11) / (x12 - x11);
b = (x12 * y11 - x11 * y12) / (x12 - x11);
}
double y = m * x + b;
Point.intersection = new Point (x,y);
return true;
} else { // both lines are sloped
double m1 = (y12 - y11) / (x12 - x11);
double b1 = (x12 * y11 - x11 * y12) / (x12 - x11);
double m2 = (y22 - y21) / (x22 - x21);
double b2 = (x22 * y21 - x21 * y22) / (x22 - x21);
if ((long) m1 == (long) m2) {
// no intersection point
return false;
}
// calculating intersection coordinates
double x = (b2 - b1)/(m1 - m2);
double y = m1 * x + b1; // or m2 * x + b2
Point.intersection = new Point (x,y);
return true;
}
}
// Returns the intersection point if the lines intersect,
// and null otherwise.
public Point intersectionWith(Line other) {
if (isIntersecting(other)) {
return Point.intersection;
}
return null;
}
Я думал о том, чтобы "сохранить" точку в переменной stati c в первой функции перед возвратом "истинного" значения, и затем используя эту переменную stati c, чтобы «вытянуть» точку во второй функции и вернуть ее значения.
Кроме того, считаете ли вы, что в отношении отрезков, а не бесконечных линий, я должен добавить больше условий к первая функция? Я имею в виду, да, скажем, оба имеют одинаковый наклон, но это не значит, что они не могут иметь только одну точку пересечения. Потому что, если мы говорим о Line1: (1,0) (1,2) и Line2: (1,2) (1,3) Они оба имеют одинаковый наклон, но они все еще имеют точку пересечения в (1,2 ). Так что, как вы думаете, я должен добавить в код, чтобы устранить все эти случаи? Я подумал о чем-то вроде:
if(!this.start().equals(line.start())
||!this.start().equals(line.end())
||!this.end().equals(line.start())
||!this.end().equals(line.end()))
return false;
Думаю, мне следует добавить небольшую проверку, которая проверяет, находится ли точка пересечения на обоих сегментах. Я должен взять значения X & Y точки пересечения и проверить, находится ли значение X между значением X начальной точки и значением X конечной точки (на обоих сегментах), и выполнить ту же проверку для значения Y. Что вы думаете?
Спасибо.