2015-12-15 8 views
0

У меня есть arraylist RecArray объектов с каждым объектом, содержащим два значения int, один для ширины и высоты прямоугольника. Высота и ширина каждого прямоугольника кратны десяти. прямоугольники должны быть переданы на поверхность, как в данном порядке, в RecArray слева направо и сверху вниз. моя проблема в том, что я не могу найти координаты x, y следующего прямоугольника. то, что я пытаюсь сделать, начиная с координаты (0,0), я генерирую первый прямоугольник, добавляю его к arraylist RecList. Затем я устанавливаю координаты x и y. x становится x = x+RecArray.get(0).getLength1() + 1. если x больше ширины поверхности jpanel, тогда он становится 0, а y становится y = y + 10. начиная со второго объекта в RecArray, я пытаюсь создать прямоугольники с заданными координатами и шириной & height. Затем я пытаюсь сравнить их со всеми предыдущими прямоугольниками, чтобы увидеть, есть ли перекрытие. если нет перекрытия, прямоугольник будет нарисован, если будет перекрытие, координата x rec будет x = RecList.get(j).width+1, и если это превышает ширину x, становится 0, а y равно y=y+10. Затем я снова создаю текущий прямоугольник с новыми координатами и сравню с другими прямоугольниками в RecList, пока я не найду нужное место для текущего прямоугольника. Я занимался этой проблемой в течение последних 5 дней, и мне действительно надоели. я был бы очень признателен за любые подсказки. и, пожалуйста, будьте терпеливы со мной. im все еще обучение программирования.Как определить координаты следующего прямоугольника на JPanel

super.paintComponent(g); 
Graphics2D g2 = (Graphics2D) g;  
Rectangle rec = new Rectangle(x, y, RecArray.get(0).getWidth(), 
       RecArray.get(0).getHeight()); 
RecList.add(rec); 
recPaint(g2,RecArray.get(0)); 
x = x + RecArray.get(0).getWidth() + 1; 
int i; 
for (i = 1; i < RecArray.size(); i++) { 
    if (x >= this.getArea().getWidth()) { 
     x = 0; 
     y = y + 10; 
    }  
    Rectangle rec1 = new Rectangle(x, y, RecArray.get(i) 
       .getWidth(), RecArray.get(i).getheight()); 
    for (int j= 0; j < RecList.size(); j++) { 
     if (!recIntersect(rec1, RecList.get(j))) { 
     RecList.add(rec1); 
     recPaint(g2,RecArray.get(i)); 
     break; 
     } 
     else { 
      x = RecList.get(j).width; 
      if (x >= this.getFlaeche().getLength1()) { 
       x = 0; 
       y = y + 10; 
      } 
      rec1 = new Rectangle(x, y,RecArray.get(i). .getWidth(), 
       RecArray.get(i).getHeight()); 
     } 
     x = x + RecArray.get(i).getWidth(); 
} 
//With this method using the given rec parameter a rectangle will be drawn on the g2 and filled in blue colour 
private void recPaint (Graphics2D g2, RecType rec){ 
     g2.setColor(Color.BLUE); 
     g2.fillRect(x, y, rec.getWidth(), 
     rec.getLength2()); 
     g2.setColor(Color.BLACK); 
     g2.drawRect(x, y, rec.getHeight(), 
     rec.getLength2()); 
} 
// returns true, if two rectangles overlap 
private boolean recIntersect(Rectangle rec1, Rectangle rec2) { 
    if(rec1.intersects(rec2)){ 
     return true; 
    } 
    return false; 
} 

Редакция: По-видимому, я не четко заявил, что моя проблема. моя проблема в том, что способ генерации (x, y) координат прямоугольников, очевидно, является неправильным. способ мой алгоритм работает, не получает результаты, которые я хочу. Я хочу, чтобы мои прямоугольники располагались аккуратно рядом с/над/ниже друг друга БЕЗ перекрытия, что не так.

+0

Вы подробно описали, что делает ваш текущий алгоритм, но я все еще уверен, что именно ваша проблема. Также попробуйте описать то, что вы хотите достичь в образном, понятном виде (например, «Я хочу заполнить свой JPanel своими прямоугольниками без наложения» или что-то еще, поскольку я не совсем понимаю вашу цель). –

+0

Thx! im редактируя его сразу. – melar

+0

Создайте список [Прямоугольник] (http://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html). Вычислите координаты X, Y ** один раз **. Нарисуйте Rectangles столько раз, сколько необходимо. –

ответ

0

Отделите свой список прямоугольников. Вычислите координаты X, Y один раз.

Поскольку у меня не было класса объектов, я использовал класс Dimension, который имеет ширину и длину. Я использовал класс Rectangle для хранения объектов, которые в конечном итоге будут рисоваться в вашем графическом интерфейсе Swing.

Разделить и победить. Отделите модель графического интерфейса пользователя, просмотр и контроллер (ы). Таким образом, вы можете сосредоточиться на одной части головоломки за раз.

Вот результаты моего тестового кода, когда я запустил его с областью рисования 500, 400.

java.awt.Rectangle[x=0,y=0,width=100,height=100] 
java.awt.Rectangle[x=100,y=0,width=20,height=10] 
java.awt.Rectangle[x=120,y=0,width=40,height=20] 
java.awt.Rectangle[x=160,y=0,width=60,height=40] 
java.awt.Rectangle[x=220,y=0,width=80,height=60] 
java.awt.Rectangle[x=300,y=0,width=20,height=10] 
java.awt.Rectangle[x=320,y=0,width=120,height=110] 

Вот результаты моего тестового кода, когда я запустил его с областью рисования 200 , 200.

java.awt.Rectangle[x=0,y=0,width=100,height=100] 
java.awt.Rectangle[x=100,y=0,width=20,height=10] 
java.awt.Rectangle[x=120,y=0,width=40,height=20] 
java.awt.Rectangle[x=0,y=100,width=60,height=40] 
java.awt.Rectangle[x=60,y=100,width=80,height=60] 
java.awt.Rectangle[x=140,y=100,width=20,height=10] 

И вот код. Я устанавливаю прямоугольники по оси X, пока не смогу поместить другой прямоугольник. Затем добавьте максимальную высоту в Y, сбросьте X до нуля, сбросьте максимальную высоту и установите следующий ряд прямоугольников.

Создайте тестовые приложения, как я сделал здесь, и убедитесь, что вы можете создать GUI-модель задолго до создания GUI-представления и GUI-контроллера.

package com.ggl.testing; 

import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.List; 

public class CalculatingRectangles { 

    public static void main(String[] args) { 
     CalculatingRectangles calculatingRectangles = new CalculatingRectangles(); 
     Dimension drawingArea = new Dimension(200, 200); 

     List<Dimension> dimensions = new ArrayList<>(); 
     dimensions.add(new Dimension(100, 100)); 
     dimensions.add(new Dimension(20, 10)); 
     dimensions.add(new Dimension(40, 20)); 
     dimensions.add(new Dimension(60, 40)); 
     dimensions.add(new Dimension(80, 60)); 
     dimensions.add(new Dimension(20, 10)); 
     dimensions.add(new Dimension(120, 110)); 

     List<Rectangle> rectangles = calculatingRectangles 
       .calculatingRectangles(drawingArea, dimensions); 
     System.out.println(displayRectangles(rectangles)); 
    } 

    private static String displayRectangles(List<Rectangle> rectangles) { 
     StringBuilder builder = new StringBuilder(); 
     for (Rectangle r : rectangles) { 
      builder.append(r); 
      builder.append(System.getProperty("line.separator")); 
     } 

     return builder.toString(); 
    } 

    public List<Rectangle> calculatingRectangles(Dimension drawingArea, 
      List<Dimension> dimensions) { 
     int width = drawingArea.width; 
     int height = drawingArea.height; 
     int x = 0; 
     int y = 0; 
     int index = 0; 
     int maxHeight = 0; 

     boolean hasRoom = dimensions.size() > index; 

     List<Rectangle> rectangles = new ArrayList<>(); 

     while (hasRoom) { 
      Dimension d = dimensions.get(index); 
      maxHeight = Math.max(maxHeight, d.height); 

      if ((x + d.width) <= width && (y + maxHeight) <= height) { 
       Rectangle r = new Rectangle(x, y, d.width, d.height); 
       x += d.width; 
       rectangles.add(r); 

       index++; 
       if (index >= dimensions.size()) { 
        hasRoom = false; 
       } 

      } else { 
       y += maxHeight; 
       if (y > height) { 
        hasRoom = false; 
       } 
       x = 0; 
      } 

     } 

     return rectangles; 
    } 

} 
+0

Привет, Гилберт. Thx для вашего ответа. но я все еще не уверен, что это дает мне то, что я хочу. я думаю, у меня есть проблема, вербализирующая его. поэтому вот ссылка, показывающая рисунок того, что я хочу получить. http://www.naturstein-paradies.eu/wp-content/uploads/2013/10/Verlegeplan_links_Travertin_roemischer_Verband.jpg, поскольку вы видите, что позиции (x, p) могут быть полностью случайными и не такими регулярными, как в приведенных выше примерах. как вы думаете, ваше решение по-прежнему относится к этому? Между прямоугольниками не допускаются пробелы. Еще раз спасибо за ваш огромный ответ! – melar

+0

Картина - это не то, что вы описали в своем вопросе. Вы ищете решение проблемы [Bin Packing] (https://en.wikipedia.org/wiki/Bin_packing_problem). –