防止矩形重叠

时间:2015-12-19 17:13:47

标签: java

我目前正在尝试为数据库创建一个小型Entity-Relationship-Modell创建工具。 为避免错误,我尝试不允许矩形与另一个矩形重叠。

我的大部分代码都工作了,几乎可以检测到所有的共谋,但在一种情况下,我仍然可以重叠它们,而且我不知道如何解决这个错误。

问题是它只能看到矩形而不是两者。但我真的不知道如何拦截这种情况。

对我来说奇怪的是我的调试行

    boolean Move(Point point) {
    boolean moved = false;
    boolean foundone = false;
    for (ERMRectangle rectangle : Rectangles) {
        if (rectangle.selected) {
            foundone = true;
            moved = true;
            //calculated new Rectangle after Move
            Rectangle Temp = new Rectangle();
            Temp.x = point.x + rectangle.click.x;
            Temp.width = rectangle.position.width;
            Temp.height = rectangle.position.height;
            Temp.y = point.y + rectangle.click.y;
            for (ERMRectangle rectangle2 : Rectangles) {
                if (rectangle != rectangle2 && rectangle2.position.intersects(Temp))//prevent overlapping
                {
                    Rectangle intersection = rectangle2.position.intersection(Temp);

                    if (intersection.height > intersection.width) {

                        Temp.x = rectangle2.position.x - rectangle2.position.width;
                        if (intersection.x != rectangle2.position.x) {
                            Temp.x = rectangle2.position.x + rectangle2.position.width;
                        }

                    } else {
                        Temp.y = rectangle2.position.y - rectangle2.position.height;
                        if (intersection.y != rectangle2.position.y) {
                            Temp.y = rectangle2.position.y + rectangle2.position.height;
                        }

                    }

                }
                if(rectangle != rectangle2 && rectangle2.position.intersects(Temp))
                {
                    System.out.println("still intersects?");
                }
            }

            rectangle.position = Temp;
        }
    }

    return moved;
}

永远不会触发。有人可以帮我解决这个错误吗?

recommended method of switching screens

每次移动Rectangle时都会触发此函数。 Selected属性是一个布尔值,它表示我正在移动哪个矩形。 然后我检查它在哪一侧重叠并恢复到原来的位置。

import java.awt.Rectangle; 

public class ERMRectangle {
    public Rectangle position;
    public boolean selected;
    public Point click;
}

ERMRectangle 类:

json_string = '{"name": "my name", "age": 5}'

object = JSON.parse(json_string)
object["name"] => "my name"

编辑:我通过在我的方法中添加一个for循环来解决它,它检查它是否仍然相交矩形并恢复x和y cordinnates。

2 个答案:

答案 0 :(得分:1)

如果在任何时刻,只有一个矩形移动(由用户拖动),则不需要使用嵌套循环来检查n平方时间的碰撞。

你需要的只是你的ERMRectangle类中的这样一个方法:

这些代码假设您的ERMRectangle类从Java扩展Rectangle类

public boolean isColliding(ArrayList<ERMRectangle> rects)
{
    for(ERMRectangle r : rects)
        if(this != r && this.intersects(r))
            return true;
    return false;
}

然后,您可以在鼠标侦听器的isColliding()中为您的矩形调用mouseReleased(MouseEvent e),并在检测到碰撞时触发必要的操作。因此,拖动后每次释放鼠标时,都会检查刚刚移动的矩形上的碰撞。

要在拖动时检查碰撞,请将与mouseReleased(MouseEvent e)中相似的代码放入mouseDragged(MouseEvent e)。当您拖动矩形时,这将进行实时碰撞检测。

答案 1 :(得分:0)

我自己回答: 我通过在我的方法中添加一个for循环来解决它,它检查它是否仍然相交矩形并恢复x和y cordinnates。 黑客和丑陋,但它的工作原理。

      for (ERMRectangle rectangle2 : Rectangles) {
                if (rectangle != rectangle2 && rectangle2.position.intersects(Temp))//prevent overlapping
                {
                   Temp.x=rectangle.position.x ;
                   Temp.y=rectangle.position.y;

                }

            }
相关问题