帮助简单的方法,Java

时间:2010-10-16 02:17:22

标签: java methods object

这真是一个愚蠢的问题,但我一直盯着这个问题太久了,我只是想弄清楚问题是什么:

/**
     * public boolean overlap(int targetX, int targetY) {
     * Returns true if the target position is sufficient close to this ghost
     * If target position is 16 pixels or less in the x direction
     * and similarly in y direction, return true. Otherwise return false
     * 
     * @param targetX
     * @param targetY
     * @return
     */
    public boolean overlap(int targetX, int targetY){
        double x=this.getX();
        double y=this.getY();
        double deltaX=targetX-x;
        double deltaY=targetY-y;
        if(deltaX<=16 && deltaX>=0 && deltaY<=16 && deltaY>=0)
            return true;
        else
            return false;       
    }

这应该正常吗?但它没有。如果我运行此测试,它将失败assertTrue。 (g1.x = 100和g1.y = 1000)

    double theta = 2 * Math.PI * Math.random();
    int x = 100 + (int) (16 * Math.cos(theta));
    int y = 1000 + (int) (16 * Math.sin(theta));
    assertTrue(g1.overlap(x, y));

有人看到我不喜欢的东西吗?

4 个答案:

答案 0 :(得分:3)

根据overlap方法的javadoc,您需要取targetX-xtargetY-y的绝对值,如果两者都小于或等于16,则返回true

所以它看起来像:

public boolean overlap(int targetX, int targetY){
    double x=this.getX();
    double y=this.getY();
    double deltaX = Math.abs(targetX-x);
    double deltaY = Math.abs(targetY-y);

    return (deltaX<=16 && deltaY<=16);       
}

答案 1 :(得分:2)

如果truedeltaX各自介于0和16之间,则会返回deltaY。但sin()cos()无法保证返回正值号。

答案 2 :(得分:2)

看起来deltaX和deltaY大约是一半时间的负值,所以你的测试将在3/4的时间内失败。

答案 3 :(得分:0)

如果你想要的距离不分方向你不应该:

deltaX = Math.abs(targetX-x);
deltaY = Math.abs(targetY-y);

如果您的目标位于16px范围内但向左或以上,则会得到负的delta值,并且该方法将返回false。