排除方法故障

时间:2014-02-07 15:00:40

标签: java methods

我想知道你们中是否有人可以查看我的方法代码并帮助我找出导致错误的原因?这是一个简单的任务,关于确定两个矩形是否重叠/拦截/触摸彼此。我在论坛上四处搜索并研究了分离轴测试/定理。有用。部分地。但是当我有两个不具有相同尺寸的矩形时会出现问题。 下面是代码:

    public boolean contains(MyRectangle2D x, MyRectangle2D y){

    if(Math.abs(xAxisDistance(x, y)) - Math.abs(centerToPerimeterXDistance(x)) - Math.abs(centerToPerimeterYDistance(y)) > 0)
        return false;
    if(Math.abs(yAxisDistance(x, y)) - Math.abs(centerToPerimeterXDistance(x)) - Math.abs(centerToPerimeterYDistance(y)) > 0)
        return false;
    else
        return true;
}

public double xAxisDistance(MyRectangle2D x, MyRectangle2D y){
    return x.getXCenter() - y.getXCenter();
}
public double yAxisDistance(MyRectangle2D x, MyRectangle2D y){
    return x.getYCenter() - y.getYCenter();
}
public double centerToPerimeterXDistance(MyRectangle2D x){
    return x.getWidth()/2;

}

public double centerToPerimeterYDistance(MyRectangle2D x){
    return x.getHeight()/2;
}

简而言之:我有两个if-sentence。一检查x轴,另一检查y轴。如果圆之间的距离小于0.它们重叠。当圆圈具有相同的尺寸时,它可以正常工作,但如果一个圆圈具有更大的高度,则eksample。当它遥远时它会“重叠”。

任何可以让我朝着正确的方向努力解决这个问题的输入都是有意义的!

Heres what the program looks like

2 个答案:

答案 0 :(得分:0)

我想知道你是否在谈论第二段中的“圈子”。诚然,我并不完全明白你目前在那里计算的是什么。

然而,建议:对于交叉测试,一些小帮助方法可能......有用:

private static float getMinX(MyRectangle2D r)
{
    return r.getXCenter() - r.getWidth() / 2;
}
private static float getMinY(MyRectangle2D r)
{
    return r.getYCenter() - r.getHeight() / 2;
}
private static float getMaxX(MyRectangle2D r) 
{ 
    return r.getXCenter() + r.getWidth() / 2; 
}
private static float getMaxY(MyRectangle2D r) 
{ 
    return r.getYCenter() + r.getHeight() / 2; 
}

通过这些,交叉测试变得非常简单:

private static boolean intersect(MyRectangle r0, MyRectangle r1)
{
    if (getMaxX(r0) < getMinX(r1)) return false; 
    if (getMaxY(r0) < getMinY(r1)) return false; 
    if (getMinX(r0) > getMaxX(r1)) return false; 
    if (getMinX(r0) > getMaxY(r1)) return false; 
    return true;
}

答案 1 :(得分:0)

错误发生在我的包含方法中。

我应该减去两个矩形的centerToPerimeterXDistance。 但我把centerToPerimeter_Y_Distance混合在一起。只需将其改为X.它就像一个魅力:D