如何确定JPanel上下一个矩形的坐标

时间:2015-12-15 12:46:01

标签: java graphics rect coordinate

我有一个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。请耐心等待我。我还在学习编程。

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)矩形坐标的方式显然是错误的。我的算法工作方式不会得到我想要的结果。我希望我的矩形整齐地放在彼此旁边/上面/下面而不重叠,但事实并非如此。

1 个答案:

答案 0 :(得分: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;
    }

}