2016-06-25 7 views
0

enter image description here Я пытаюсь проверить, пересекает ли линия набор прямоугольников.Функция intersectsLine() не работает должным образом

Это мой код:

public class Test { 

    public static void main(String args[]) { 
     Rectangle2D.Double rectangle1 = new Rectangle2D.Double(32, 64, 32, 32);  
     Rectangle2D.Double rectangle2 = new Rectangle2D.Double(0, 32, 32, 32);  

     Line2D.Double line = new Line2D.Double(36, 63, 5, 12); 

     System.out.println(rectangle1.intersectsLine(line)); // outputs false. Why? 
     System.out.println(rectangle2.intersectsLine(line)); // outputs true as expected 
    } 
} 

Как вы можете видеть, точка старта (36, 63) находится в пределах rectangle1, но, по-видимому, этот отрезок не пересекает прямоугольник, она начинается в

.

Однако он пересекает прямоугольник, который хранит конечную точку (5, 12).

Любая идея, почему?

Как его получить, чтобы обнаружить пересечение?

+0

линия не пересекает первый прямоугольник, поэтому Java дает вам правильный ответ. Возможно, вы смущены тем, как работает конструктор Rectangle2D.Double? –

+0

Является ли это конструктором или функцией 'intersectsLine'? В любом случае, как я могу проверить, содержит ли Rectangle определенный сегмент линии? – Kingamere

+0

Это, конечно, конструктор. Метод пересечений работает надлежащим образом. –

ответ

2

Линия не пересекает прямоугольник1, и именно поэтому Java вернет вам правильный ответ. Нарисуйте линии в графическом интерфейсе и убедитесь сами. Возможно, вы запутались в конструкторе Rectangle2D.Double - последними параметрами являются ширина и высота.

Нарисуйте графический интерфейс и посмотрите; они почти касаются, но не совсем:

enter image description here

Рисунок как прямоугольниками:

enter image description here

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.*; 

import javax.swing.*; 

public class Test extends JPanel { 
    private static final int PREF_W = 850; 
    private static final int PREF_H = PREF_W; 
    Rectangle2D rectangle1 = new Rectangle2D.Double(32, 64, 32, 32);  
    // Rectangle2D rectangle2 = new Rectangle2D.Double(0, 32, 32, 32);  

    Line2D line = new Line2D.Double(36, 63, 5, 12); 

    public Test() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     double scale = 8.0; 
     g2.scale(scale, scale); // make it big to show it for you 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.draw(rectangle1); 
     // g2.draw(rectangle2); 
     g2.draw(line); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     Test mainPanel = new Test(); 

     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

Весьма интересно, когда я рисую прямоугольник2, а также прямоугольник1, общая картина не похожа на то, что я связал в моем вопросе выше. – Kingamere

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

  • Нет связанных вопросов^_^