2015-12-15 62 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中的第二个对象开始,我尝试生成具有给定坐标和高度的宽度的矩形。然后我尝试将它们与以前的所有矩形进行比较,看看是否有重叠。如果没有重叠,则绘制矩形,如果有重叠,则rec的x坐标变为x = RecList.get(j).width+1,并且如果超出宽度x变为0且y为y=y+10。然后我使用新坐标重新生成当前矩形,并再次与RecList中的其他矩形进行比较,直到找到当前矩形的正确位置为止。过去5天中,该问题一直处理该问题,现在我真的很厌倦了。我会非常感激任何tipps。请耐心等待。我还在学习编程。如何确定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!即时编辑它马上。 – melar

+0

创建[Rectangle]的列表(http://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html)。计算一次**的X,Y坐标**。根据需要多次绘制矩形。 –

回答

0

分离出您的矩形列表。计算X,Y坐标一次

因为我没有你的对象类,所以我使用了Dimension类,它包含一个宽度和一个长度。我使用Rectangle类来保存最终将在您的Swing GUI中绘制的对象。

分而治之。分离出您的GUI模型,视图和控制器。这样,您可以一次关注一块拼图。

这里是我的测试代码的结果时,我按照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装箱问题]的解决方案(https://en.wikipedia.org/wiki/Bin_packing_problem)。 –