коллинеарность и пересечение двух сегментов

Здраствуйте, я сделал метод для определения интерсекцию двух сегментов, вроде работает нормально. Но есть проблема, есть пару проверок в методе и одна из проверок выдает NullPointerException.

   public static class Main {
        public static void main(String[] args) {


            {
                Segment first = new Segment(new Point(0, 0), new Point(0, 0));
                Segment second = new Segment(new Point(0, 0), new Point(0, 0));
                Point intersection = first.intersection(second);

                System.out.println(intersection.getX());
                System.out.println(intersection.getY());
            }


        }
    }

Когда вот вводиться координаты 0 и прошу напечатать координаты бросает NullPointerException. в части коде:

if (Math.abs(div) < 1.0e-10)
            return null;


public Segment(Point start, Point end) {
        if (start == null || end == null)
            throw new IllegalArgumentException("Arguments can't be null");
        if (start.equals(end))
            throw new IllegalArgumentException("The points must differ");
        this.start = start;
        this.end = end;

Что делать как решить проблему?


Ответы (2 шт):

Автор решения: Pentiux
System.out.println(intersection == null);

так у вас всегда тут будет объект

Point intersection = first.intersection(second);

вот и получаете false

→ Ссылка
Автор решения: MBo

Ну у вас отрезки не параллельны, детерминант не равен нулю, тогда вы считаете точку пересечения прямых, на которых лежат отрезки. Но эта точка может быть за пределами самих отрезков - это надо проверять.

И вот это If segments are collinear, return null. у вас не выполняется - возвращайте null в случае нулевого детерминанта.

Пример

Код писал прямо здесь, могут быть ошибки в языке и логике:

public static Point SegIntersection(double x11, double y11, double x12, double y12,
                                    double x21, double y21, double x22, double y22)
    {
        double dx1 = x12-x11;
        double dy1 = y12-y11;
        double dx2 = x22-x21;
        double dy2 = y22-y21;
        double dxx = x11-x21;
        double dyy = y11-y21;
        double div, t, s;
  
        div = dy2*dx1-dx2*dy1;
        if (Math.abs(div) < 1.0e-10) //better to compare abs(div) with small Eps
           return null;  //collinear case
        
        t = (dx1*dyy-dy1*dxx) / div;
        if (t < 0 || t > 1.0)
            return null; //intersection outside the first segment
        s = (dx2*dyy-dy2*dxx) / div;
        if (s < 0 || s > 1.0)  
            return null;  //intersection outside the second segment
        return new Point(x11 + s * dx1, y11 + s * dy1);
    }

Быстрая проверка показывает верную работу для четырёх разных случаев.

→ Ссылка