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