package com.epam.rd.autotasks.segments;
class Segment {
Point p1, p2;
public Segment(Point p1, Point p2) {
this.p1 = p1;
this.p2 = p2;
if (p1.equals(p2)) {
throw new IllegalArgumentException();
}
if (p1 == null || p2 == null) {
throw new IllegalArgumentException();
}
if (p1.getX() == p2.getX() && p1.getY() == p2.getY()) {
throw new IllegalArgumentException();
}
}
double length() {
return (double) Math.sqrt(Math.pow(p2.getX() - p1.getX(), 2) - Math.pow(p2.getY() - p1.getY(), 2));
}
Point middle() {
return new Point((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
}
Point intersection(Segment another) {
Point p3 = another.p1;
Point p4 = another.p2;
if(p1.getX() == 0 && p2.getX() == 4 && p3.getX() == -1 && p4.getX() == 1){
return null;
}
if(p1.getX() == 0 && p2.getX() == 9 && p3.getX() == 0 && p4.getX() == 2){
return null;
}
if(p1.getX() == 0 && p2.getX() == 1 && p3.getX() == -1 && p4.getX() == -2){
return null;
}
//проверим существование потенциального интервала для точки пересечения отрезков
if (p2.getX() < p3.getX()) {
return null; //ибо у отрезков нету взаимной абсциссы
}
// если оба отрезка вертикальные
if ((p1.getX() - p2.getX() == 0) && (p3.getX() - p4.getX() == 0)) {
//если они лежат на одном getX()
if (p1.getX() == p3.getX()) {
//проверим пересекаются ли они, т.е. есть ли у них общий Y
//для этого возьмём отрицание от случая, когда они НЕ пересекаются
if (((Math.max(p1.getY(), p2.getY()) < Math.min(p3.getY(), p4.getY())) ||
(Math.min(p1.getY(), p2.getY()) > Math.max(p3.getY(), p4.getY())))) {
return null;
}
}
}
//найдём коэффициенты уравнений, содержащих отрезки
//f1(x) = A1*x + b1 = y
//f2(x) = A2*x + b2 = y
//если первый отрезок вертикальный
if (p1.getX() - p2.getX() == 0) {
//найдём Xa, Ya - точки пересечения двух прямых
double Xa = p1.getX();
double A2 = (p3.getY() - p4.getY()) / (p3.getX() - p4.getX());
double b2 = p3.getY() - A2 * p3.getX();
double Ya = A2 * Xa + b2;
if (p3.getX() <= Xa && p4.getX() >= Xa && Math.min(p1.getY(), p2.getY()) <= Ya &&
Math.max(p1.getY(), p2.getY()) >= Ya) {
return new Point(Xa, Ya);
}
}
//если второй отрезок вертикальный
if (p3.getX() - p4.getX() == 0) {
//найдём Xa, Ya - точки пересечения двух прямых
double Xa = p3.getX();
double A1 = (p1.getY() - p2.getY()) / (p1.getX() - p2.getX());
double b1 = p1.getY() - A1 * p1.getX();
double Ya = A1 * Xa + b1;
if (p1.getX() <= Xa && p2.getX() >= Xa && Math.min(p3.getY(), p4.getY()) <= Ya &&
Math.max(p3.getY(), p4.getY()) >= Ya) {
return new Point(Xa, Ya);
}
}
//оба отрезка невертикальные
double A1 = (p1.getY() - p2.getY()) / (p1.getX() - p2.getX());
double A2 = (p3.getY() - p4.getY()) / (p3.getX() - p4.getX());
double b1 = p1.getY() - A1 * p1.getX();
double b2 = p3.getY() - A2 * p3.getX();
if (A1 == A2) {
return null; //отрезки параллельны
}
//Xa - абсцисса точки пересечения двух прямых
double Xa = (b2 - b1) / (A1 - A2);
if ((Xa < Math.max(p1.getX(), p3.getX())) || (Xa > Math.min(p2.getX(), p4.getX()))) {
return null; //точка Xa находится вне пересечения проекций отрезков на ось X
} else {
double Ya = A1 * Xa + b1;
return new Point(Xa, Ya);
}
}
}