【问题标题】:How to move rectangles that intersect?如何移动相交的矩形?
【发布时间】:2015-03-15 17:54:09
【问题描述】:

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

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);
    }


}

如果你运行它几次,最终一些矩形会覆盖另一个。

【问题讨论】:

  • 你真的认为重叠矩形的随机移动总是会将其重新定位到没有矩形的地方吗?
  • 您在 for 循环中完成整个操作,它只会重新创建一次矩形。现在让我们假设,你在外循环的最后一个矩形。而你在内部forloop的最后一轮。你是矩形与另一个矩形相交,你重新创建它并且循环中断。但您没有检查新矩形是否与任何矩形相交
  • 那么,我该怎么做呢?
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • 好的,我试试看

标签: java arrays swing rectangles


【解决方案1】:

这不是您的情况的最佳解决方案,但它会帮助您根据随机绘制修复您的代码。

  1. 假设您有 N 个不相交的矩形。
  2. 要添加一个新的 N+1 矩形,您必须检查它是否与之前的 N 个矩形相交,然后再添加它。

因此,在您的情况下,您的基于随机绘制的算法将如下所示:

  1. 您正在生成矩形 K 的随机位置
  2. 对于从 1K-1 的所有矩形,请检查它们是否与可能的矩形 K 相交
  3. 如果有交叉路口,您将返回#1。
  4. 如果没有交叉点,则添加此矩形并重复矩形 K+1 的所有步骤

但请注意,如果您的画布上没有足够的空间,您最终可能会运行无限循环。

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

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-03-31
    • 2023-03-12
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多