Как разместить меньшие прямоугольники внутри большего прямоугольника с помощью Java?

Я наткнулся на проблему, которую я хотел бы решить с помощью Java. Пользователь вводит больший размер прямоугольника (т. е. L_width и L_height) и меньший размер прямоугольника (т. е. S_width и S_height). Я хотел бы разместить столько меньших прямоугольников внутри большего прямоугольника и показать это графически.

например: когда размер большего прямоугольника составляет 4 x 5, а размер меньшего прямоугольника составляет 2 x 2, тогда максимальное количество меньших прямоугольников, которые я мог бы разместить внутри большего прямоугольника, равно 4. Я хотел бы показать их графически .

Поскольку я новичок в java, я хотел знать, как я могу подойти к этой проблеме с программной точки зрения и какую концепцию я должен использовать для достижения того же.


Исходный код для вычисления максимального количества прямоугольников. Может ли кто-нибудь помочь мне показать этот результат графически, используя java

// Code Starts
import java.awt.Graphics;
import java.util.Scanner; 

import javax.swing.JComponent;
import javax.swing.JFrame;

//Class to store the output of layout
class layout{
    private int Cnt_BW_CW=0; // BoardWidth and CardWidth are arranged together
    private int Cnt_BW_CH=0;
    private int option=0;    // Option 1: width-width Option 2: width-height

    public int getCnt_BW_CW (){
        return Cnt_BW_CW;
    }
    public int getCnt_BW_CH (){
        return Cnt_BW_CH;
    }
    public int getoption (){
        return option;
    }

    public void setCnt_BW_CW (int newValue){
        Cnt_BW_CW = newValue;
    }
    public void setCnt_BW_CH (int newValue){
        Cnt_BW_CH = newValue;
    }
    public void setoption (int newValue){
        option = newValue;
    }
}

// Stores the Dimension
class Dimension{
    private float w,h;
    Scanner input = new Scanner( System.in );

    public Dimension(){
        System.out.print( "Enter Width: " ); 
        w = input.nextInt(); 
        System.out.print( "Enter Height: " ); 
        h = input.nextInt(); 
    }
    public Dimension(float width, float height){
        w = width;
        h = height;
    }
    public float getWidth (){
        return w;
    }
    public float getHeight (){
        return h;
    }
    public void setWidth (float newWidth){
        w = newWidth;
    }
    public void setHeight (float newHeight){
        h = newHeight;
    }
}

class MyCanvas extends JComponent {
    private static final long serialVersionUID = 1L;

    public void paint(Graphics g) {
        g.drawRect (10, 10, 200, 200);  
      }
}

public class boundedRect {
  @SuppressWarnings("unused")

  public static void main(String[] a) {
    Dimension Board = new Dimension();
    Dimension Card = new Dimension();
    int Cnt =0;

    Cnt = NumOfRect(Board, Card);
    System.out.printf( "Number of Cards:%d",Cnt );

    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 300,300);
    window.getContentPane().add(new MyCanvas());
    window.setVisible(true);
  }

  public static int NumOfRect(Dimension b,Dimension c){
      float bw,bh,cw,ch;
      int bw_cw,bh_ch,bw_ch,bh_cw;
      int SameDimensionCnt,DiffDimensionCnt;
      int count;
      layout Result = new layout();

      bw =b.getWidth(); bh = b.getHeight();
      cw =c.getWidth(); ch = c.getHeight();

      if (bw < cw || bh < ch){
          System.out.println( "Board and Card Dimension mismatch" );
          System.exit(0);
      }

      bw_cw = (int)Math.floor(bw/cw);
      bh_ch = (int)Math.floor(bh/ch);
      SameDimensionCnt = bw_cw * bh_ch; 
      Result.setCnt_BW_CW(SameDimensionCnt);

      bw_ch = (int)Math.floor(bw/ch);
      bh_cw = (int)Math.floor(bh/cw);
      DiffDimensionCnt = bw_ch * bh_cw;
      Result.setCnt_BW_CH(DiffDimensionCnt);

      System.out.printf( "Matching BW x CW: %d\n",SameDimensionCnt );
      System.out.printf( "Matching BW x CH: %d\n",DiffDimensionCnt );

      if (SameDimensionCnt < DiffDimensionCnt ){
          count = DiffDimensionCnt;
          System.out.println( "Align Board Width and Card Height" );
          Result.setoption(2);
      }else {
          count = SameDimensionCnt;
          System.out.println( "Align Board Width and Card Width" );
          Result.setoption(1);
      }
      return count;
  }
}

person Learner    schedule 25.07.2012    source источник
comment
Я хотел знать, как я могу подойти к этой проблеме с точки зрения программирования Как бы вы подошли к ней с помощью карандаша и бумаги?   -  person Andrew Thompson    schedule 25.07.2012


Ответы (1)


Итак, вы хотите замостить большой прямоугольник несколькими меньшими прямоугольниками. Сначала определите класс для представления маленьких прямоугольников и создайте структуру данных (вероятно, ArrayList) для их хранения. Используйте вложенный цикл for, чтобы пройтись по области большого прямоугольника за S_width/S_height шагов и создать столько маленьких прямоугольников, сколько поместится. Добавляйте их в ArrayList по мере создания. Найдите ArrayList в Google, чтобы найти документы по Java, если они вам нужны.

Затем вам нужно написать код, чтобы нарисовать их на экране. Для этого найдите официальное руководство по Java в Google и прочитайте раздел о графике.

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

person Alex D    schedule 25.07.2012
comment
Вы можете прочитать docs.oracle.com/javase/tutorial/2d/ index.html для получения помощи по графике - ps. Лично я начинаю с JFrame, апплеты просто добавляют много дополнительных накладных расходов, с которыми вы действительно не хотите иметь дело сразу же. - person MadProgrammer; 25.07.2012
comment
В этом случае, вероятно, даже не нужно хранить маленькие прямоугольники (их можно вычислить на лету в простом цикле во время рисования). С более сложными формами вы хотите разделить рисование и расчет. - person Thilo; 25.07.2012
comment
@Thilo: Вы правы, но, поскольку ОП, очевидно, только учится программировать, я подумал, что такой способ поможет разбить задачу на более мелкие и более управляемые единицы. Если вы считаете, что другой способ лучше, опубликуйте ответ, и если ОП решит сделать это таким образом, он сможет выбрать ваш ответ. - person Alex D; 25.07.2012