2013-03-20 2 views
0

Итак, я работаю над назначением Java, где мне нужно было создать класс Rectangle, который использовался в программе, которая рисует перекрывающиеся прямоугольники и где перекрываются прямоугольники, новый прямоугольник рисуется с новым цветом. Я включил ссылку на описание HW, поскольку, как я полагал, проще всего просто взглянуть на это, чем пытаться объяснить. http://myslu.stlawu.edu/~ltorrey/courses/spring13/cs219/hw/hw6.htmlJava-помощь: перекрывающиеся прямоугольники, которые рисуют новый цвет, где прямоугольники перекрываются

В настоящее время я застрял на создании метода getOverlap, который рисует новые перекрывающиеся прямоугольник. Мне пришлось создать метод рисования, который, очевидно, рисует прямоугольники и путается, определяет ли метод getOverlap новые параметры для ранее определенных переменных и затем перенаправляется в метод draw? Любая помощь будет принята с благодарностью.

+0

Это не имеет четкий вопрос. Голосование закрывается как «не настоящий вопрос». –

+0

спасибо, что оценили его – user2189162

+1

Можете ли вы использовать метод 'intersection()' 'java.awt.Rectangle'? – trashgod

ответ

4

С помощью небольшого разумного использования Area вы можете получить API Graphics2D, чтобы сделать это за вас.

В принципе, я создаю Area, что является результатом операции exclusiveOR на двух прямоугольниках. Я затем вычесть это из Area, что является результатом сложения двух прямоугольников вместе

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.geom.Area; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class OverlappingRectangles { 

    public static void main(String[] args) { 
     new OverlappingRectangles(); 
    } 

    public OverlappingRectangles() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      Rectangle r1 = new Rectangle(0, 0, 150, 150); 
      Rectangle r2 = new Rectangle(50, 50, 150, 150); 

      g2d.setColor(Color.RED); 
      g2d.fill(r1); 
      g2d.setColor(Color.BLUE); 
      g2d.fill(r2); 

      Area a1 = new Area(r1); 
      a1.exclusiveOr(new Area(r2)); 
      Area a2 = new Area(r2); 
      a2.add(new Area(r1)); 
      a2.subtract(a1); 

      g2d.setColor(Color.GREEN); 
      g2d.fill(a2); 

      g2d.dispose(); 
     } 
    } 

} 
+0

+1 для 'Area'; Я смотрел на 'java.awt.Rectangle', но я перестал практиковать повторный факторинг в своей среде IDE. – trashgod

+0

@trashgod Пришлось избавиться от реализации перетаскиваемых групп столбцов в заголовке таблицы ... – MadProgrammer

+0

+1, круто. Я смотрел API-интерфейс Shape в выходные, задаваясь вопросом, когда вы можете использовать Area. Хороший пример, хотя его можно упростить еще больше. Смотрите мои выводы. – camickr

3

Играя с кодом MadProgrammer, я нашел несколько простых способов сделать это:

спользование Площадь:

Area yellow = new Area(r1); 
yellow.intersect(new Area(r2)); 
g2d.setColor(Color.YELLOW); 
g2d.fill(yellow); 

Или, используя другой прямоугольник:

Rectangle green = r1.intersection(r2); 
g2d.setColor(Color.GREEN); 
g2d.fill(green); 
+1

* вытаскивает волосы * Я искал для этого время! – MadProgrammer

2

Если java.awt.Rectangle разрешено, вот схема того, как вы можете использовать его в своей реализации:

private static class Rectangle { 
    private int x1, y1, x2, y2, r, g, b; 
    private java.awt.Rectangle r1 = new java.awt.Rectangle(); 
    private java.awt.Rectangle r2 = new java.awt.Rectangle(); 
    private java.awt.Rectangle r3; 

    public Rectangle(int x1, int y1, int x2, int y2, int r, int g, int b) { 
     ... 
    } 

    private void draw(Graphics page) { 
     ... 
    } 

    private boolean overlapsWith(Rectangle r) { 
     r1.setBounds(...); 
     r2.setBounds(...); 
     return r1.intersects(r2); 
    } 

    private Rectangle getOverlap(Rectangle r) { 
     r1.setBounds(...); 
     r2.setBounds(...); 
     r3 = r1.intersection(r2); 
     return new Rectangle(...); 
    } 
Смежные вопросы