2014-12-10 2 views
4

Почему этот код:Неправильный выход intersectsLine из Line2D в Java

Line2D line1 = new Line2D.Double(464.9298111721873, 103.78661133348942, 684.8391765253534, -155.44752172931908); 

Line2D line2 = new Line2D.Double(414.16903384086487, 163.62456359144306, 393.52528378472925, 187.95988300984624); 

line1.intersectsLine(line2); 

возвращение верно?

Ясно, что координаты x между линиями разнесены и не пересекаются. Я нарисовал их на поворотной панели, и они разделены, но выглядят так, как будто они коллинеарны. Это проблема? Я пробовал тестирование на простых коллинеарных линиях (например, (1, 3, 4, 3), (6, 3, 8, 3)), и, похоже, он работает нормально.

+0

Извините за мой неправильный ответ: если бы линии, а не линии сегментов, эти линии будут накладываться ... Но 'Line2D' должны быть линейными сегментами ... Таким образом, эти строки должны быть разделены ... – francis

ответ

2

Java Docs сказать, что метод Line2D класса:

public boolean intersects(double x, double y, double w, double h) 

испытания, если внутренняя часть Shape пересекает внутреннюю часть указанной прямоугольной области. Для этого он использует метод Shape.intersects(), однако расчеты для точного определения этого пересечения очень дороги.

Это означает, что для некоторых Shapes этот метод может возвращать верно, даже если прямоугольная область не пересекается с Shape.

Хотя вы используете метод itersectsLine(), как intersects() и intersectsLine() использовать же дорогой метод под поверхностью. Метод вызывается linesIntersect() и specified here на линии 298

Area класса выполняет более точные расчеты геометрического пересечения, чем большинство Shape объектов и, следовательно, может быть использован, если требуется более точный ответ. Например:

boolean intersectionExists(Shape shape1, Shape shape2) { 
    Area area1 = new Area(shape1); 
    area1.intersect(new Area(shape2)); 
    return !area1.isEmpty(); 
} 

Испытано используя свои значения:

public static void main(String[] args) { 
    Line2D line1 = new Line2D.Double(464.9298111721873, 103.78661133348942, 684.8391765253534, -155.44752172931908); 
    Line2D line2 = new Line2D.Double(414.16903384086487, 163.62456359144306, 393.52528378472925, 187.95988300984624); 
    System.out.println("Lines intersect? " + intersectionExists(line1, line2)); 
} 

Выход:

Lines intersect? false 
+0

Я не использую Line2D.intersects, но Line2D.intersectsLine, который реализуется совершенно по-другому (и, в бит пути неясно мне). –

+0

@IvanBestvina проверить мои правки balkanac :) – nem035

+0

спасибо! Все еще удивляюсь, почему он думает, что такие отдаленные линии пересекаются. –

Смежные вопросы