如何移动相交的矩形?
How to move rectangles that intersect?
我想做的是创建一种方法,每次检查矩形数组中的两个矩形是否相交,以及它们是否确实将两个矩形中的一个重新定位在框架上的其他位置,但不在另一个矩形上方.
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);
}
}
如果你运行它几次最终一些矩形会覆盖另一个。
这不是您的情况的最佳解决方案,但它会帮助您修复基于随机绘制的代码。
- 假设您有 N 个不相交的矩形。
- 要添加新的 N+1 矩形,您必须检查它是否与之前的 N 矩形相交,然后添加它。
因此在您的情况下,基于随机绘画的算法将如下所示:
- 您正在生成矩形的随机位置 K
- 对于从 1 到 K-1 的所有矩形,您检查它们是否与可能的矩形 K 相交
- 如果有交叉路口,您将回到#1。
- 如果没有交点,您将添加此矩形并重复矩形的所有步骤 K+1
但请注意,如果 canvas.
上没有足够的 space,您可能会陷入 运行 无限循环
您可以考虑一种算法来确定新矩形的合适位置,或者发现没有 space 适合它的位置。稍后你可以用你的新方法(策略模式)替换你的随机方法。
我想做的是创建一种方法,每次检查矩形数组中的两个矩形是否相交,以及它们是否确实将两个矩形中的一个重新定位在框架上的其他位置,但不在另一个矩形上方.
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);
}
}
如果你运行它几次最终一些矩形会覆盖另一个。
这不是您的情况的最佳解决方案,但它会帮助您修复基于随机绘制的代码。
- 假设您有 N 个不相交的矩形。
- 要添加新的 N+1 矩形,您必须检查它是否与之前的 N 矩形相交,然后添加它。
因此在您的情况下,基于随机绘画的算法将如下所示:
- 您正在生成矩形的随机位置 K
- 对于从 1 到 K-1 的所有矩形,您检查它们是否与可能的矩形 K 相交
- 如果有交叉路口,您将回到#1。
- 如果没有交点,您将添加此矩形并重复矩形的所有步骤 K+1
但请注意,如果 canvas.
上没有足够的 space,您可能会陷入 运行 无限循环您可以考虑一种算法来确定新矩形的合适位置,或者发现没有 space 适合它的位置。稍后你可以用你的新方法(策略模式)替换你的随机方法。