2014-02-07 74 views
0

林想知道你们中的任何人是否可以看看我的方法代码,并帮助我找出是什么原因造成的?这是一个简单的任务,可以确定是否两个矩形重叠/拦截/触摸海誓山盟。我在论坛上搜索并研究了分离轴测试/定理。有用。部分地。但是,当我有两个不具有相同尺寸的矩形时,会发生问题。 继承人的代码:故障排除方法

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-句子。一个检查x轴,另一个检查y轴。如果圆圈之间的距离小于0,它们会重叠。当圆圈具有相同的尺寸时,它可以正常工作,但如果一个圆圈的eksample的高度较大。它在远处时“重叠”。

任何可以促使我朝着正确的方向解决这个问题的输入是令人满意的!

Heres what the program looks like

+1

我无法重现您的问题。可能你的错误是在代码的另一部分。 (也许在'MyRectangle2D'中有一个错误的getter或setter?) – Kayz

+0

是的,那很可能。生病了看着它! – Surangie

回答

0

的错误是在我的包含方法。

我本来应该减去两个矩形的centerToPerimeterXDistance。 但相反,我有centerToPerimeter_Y_Distance混入。只是将其更改为X.它像一个魅力:D

0

我不知道你是否在谈论第二段“圈”。无可否认,我目前还没有完全理解您实际在计算的内容。

然而,suggestsion:对于相交测试,一些小的辅助方法可能会有所帮助...:

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; 
} 
+0

它应该是第二段中的矩形,对不起:P – Surangie