我目前正在尝试为数据库创建一个小型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。
答案 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;
}
}