2015-12-15 98 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)。 –