如何移动相交的矩形?

时间:2015-03-15 17:54:10

标签: java arrays swing rectangles

我想要做的是创建一个方法,每次检查矩形数组的两个矩形是否相交,以及它们是否重新定位框架上其他位置的两个矩形中的一个,而不是另一个矩形。< / p>

Random rand = new Random();

Rec[0] = new Rectangle(100,100,50,50);


for(int i = 0; i<recs.length; i++){
    for(int j = i+1; j<recs.length;j++){
        if(recs[i].intersects(recs[j])){
            recs[i] = new Rectangle(rand.nextInt(501),rand.nextInt(501),50,50);
            repaint();
        }
    }
}

帧大小为500x500 当我执行此代码时,它仍然具有相交的矩形。 我做错了什么?

包q1;

  import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.util.Random;

    import javax.swing.JComponent;

    public class RectangleComponent extends JComponent{
        public Rectangle[] recs;
        private Random rand;
        RectangleComponent(){
            rand = new Random();
            recs = new Rectangle[6];
//these two intersect
            recs[0] = new Rectangle(100,100,50,50); 
            recs[1] = new Rectangle(110,90,50,50);
//
            recs[2] = new Rectangle(200,200,50,50);
            recs[3] = new Rectangle(300,300,50,50);
            recs[4] = new Rectangle(400,400,50,50);
            recs[5] = new Rectangle(250,250,50,50);
            for(int i = 0; i<recs.length; i++){
                for(int j = i+1; j<recs.length;j++){
                    if(recs[i].intersects(recs[j])){
                        recs[i] = new Rectangle(rand.nextInt(501),rand.nextInt(501),50,50);
                        repaint();
                    }
                }
            }
        }
        public void paintComponent(Graphics g){
            Graphics2D g2 = (Graphics2D) g;
            for(Rectangle x : recs){
                g2.draw(x);
            }
        }

    }

import javax.swing.JFrame;

public class RectangleViewer {
    public static void main(String[]args){
        JFrame frame = new JFrame();
        RectangleComponent comp = new RectangleComponent();
        frame.add(comp);
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


}

如果你运行几次,最终会有一个矩形在另一个上面。

1 个答案:

答案 0 :(得分:0)

它不是您案例的最佳解决方案,但它可以帮助您根据随机画面修复代码。

  1. 假设你有 N 不相交的矩形。
  2. 要添加新的 N + 1 矩形,您必须检查它是否与之前的 N 矩形相交,然后添加它。
  3. 因此,在您的情况下,基于随机绘制的算法将如下所示:

    1. 您正在生成矩形 K
    2. 的随机位置
    3. 对于 1 K-1 的所有矩形,检查它们是否与可能的矩形 K
    4. 相交
    5. 如果有一个十字路口,你将回到#1。
    6. 如果没有交叉点,则添加此矩形并重复矩形的所有步骤 K + 1
    7. 但请注意,如果画布上没有足够的空间,最终可能会运行无限循环。

      您可以考虑一种算法,为新矩形确定一个好位置,或者发现它没有空间。稍后您可以使用新方法(策略模式)替换随机方法。