Точка пересечения двух сегментов
//Не проходит тесты:
/* Arguments.of(
new Segment(new Point(2, 5), new Point(0.5, 1.5)),
new Segment(new Point(0, 2), new Point(5, 5)),
new Point(0.9615384615384616, 2.576923076923077)
),
Arguments.of(
new Segment(new Point(2, 5), new Point(0.5, 1.5)),
new Segment(new Point(0, 2), new Point(2, 5)),
new Point(2, 5)
),
Arguments.of(
new Segment(new Point(-3, 0.5), new Point(0.5, 1.5)),
new Segment(new Point(0, 2), new Point(-3, -1.5)),
new Point(-0.7297297297297297, 1.1486486486486487)
),*/
class Point {
private double x;
private double y;
public Point(final double x, final double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
}
class Segment {
private final Point start;
private final Point end;
public Segment(Point start, Point end) {
if (start == null || end == null)
throw new IllegalArgumentException("Arguments can't be null");
if (start.getX() == end.getX() && start.getY() == end.getY())
throw new IllegalArgumentException("The points must differ");
this.start = start;
this.end = end;
}
double length() {
double xDistanceSquare = Math.pow(start.getX() - end.getX(), 2);
double yDistanceSquare = Math.pow(start.getY() - end.getY(), 2);
return Math.sqrt(xDistanceSquare + yDistanceSquare);
}
Point middle() {
double x1 = start.getX();
double x2 = end.getX();
double y1 = start.getY();
double y2 = end.getY();
return new Point((x1 + x2) / 2, (y1 + y2) / 2);
}
Point intersection(Segment another) {
double x1 = start.getX();
double x2 = end.getX();
double y1 = start.getY();
double y2 = end.getY();
double x3 = another.start.getX();
double x4 = another.end.getX();
double y3 = another.start.getY();
double y4 = another.end.getY();
double a1 = y2 - y1; // y2 - y1
double b1 = x1 - x2; //x1 - x2
double c1 = a1 * x1 + b1 * y1; //a1 * x1 + b1 *y1
double a2 = y4 - y3; // y4 - y3
double b2 = x3 - x4; // x3 - x4
double c2 = a2 * x3 + b2 * y3; // a2 * x3 + b2 * y3
double delta = (a1 * b2) - (a2 * b1);
double xPoint = (b2 * c1 - b1 * c2) / delta;
double yPoint = (a1 * c2 - a2 * c1) / delta;
/* if (x2 < x3){
return null;
}*/
if ((x1 - x2 == 0) && (x3 - x4 == 0)) {
if (x1 == x3) {
if (!((Math.max(y1, y2) < Math.min(y3, y4)) || (Math.min(y1, y2) > Math.max(y3, y4)))) {
return new Point(xPoint, yPoint);
}
}
if (x1 != x3){
return null;
}
return null;
}
if (x1 - x2 == 0) {
double a22 = (y3 - y4) / (x3 - x4);
double b22 = y3 - a22 * x3;
double yA = a22 * x1 + b22;
if (x3 <= x1 && x4 >= x1 && Math.min(y1, y2) <= yA && Math.max(y1, y2) >= yA) {
return new Point(xPoint, yPoint);
}
return null;
}
if (x3 - x4 == 0) {
double a22 = (y1 - y2) / (x1 - x2);
double b22 = y1 - a22 * x1;
double yA = a22 * x3 + b22;
if (x1 <= x3 && x2 >= x3 && Math.min(y3, y4) <= yA && Math.max(y3, y4) >= yA) {
return new Point(xPoint, yPoint);
}
return null;
}
double a11 = (y1 - y2)/(x1 - x2);
double a22 = (y3 - y4)/(x3 - x4);
double b11 = y1 - a11*x1;
double b22 = y3- a22*x3;
if (a11 == a22){
return null;
}
double xL = (b22 -b11)/(a11 -a22);
if ((xL < Math.max(x1,x3)) || (xL > Math.min(x2,x4))){
return null;
}
else {
return new Point(xPoint, yPoint);
}
}
}
Класс Main
package com.epam.rd.autotasks.segments;
public class Main {
public static void main(String[] args) {
{
double length = new Segment(new Point(0, 0), new Point(3, 4)).length();
System.out.println(length);
}
{
Segment first = new Segment(new Point(0, 0), new Point(4, 4));
Segment second = new Segment(new Point(2, 0), new Point(0, 2));
Point intersection = first.intersection(second);
System.out.println(intersection.getX());
System.out.println(intersection.getY());
}
{
Segment first = new Segment(new Point(0, 0), new Point(4, 0));
Segment second = new Segment(new Point(2, 1), new Point(1, 2));
Point intersection = first.intersection(second);
System.out.println(intersection == null);
}
}
}