Помогите с простым методом, Java - PullRequest
1 голос
/ 16 октября 2010

Это действительно глупый вопрос, но я слишком долго смотрел на эту проблему и просто не могу понять, в чем проблема:

/**
     * 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 ]

3 голосов
/ 16 октября 2010

Основываясь на javadoc метода overlap, вам нужно принять абсолютное значение targetX-x и targetY-y и вернуть true, если оба значения меньше или равны 16.

Так это будет выглядеть так:

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);       
}
2 голосов
/ 16 октября 2010

Похоже, что deltaX и deltaY будут иметь отрицательное значение примерно половину времени, и поэтому ваш тест не пройдёт примерно 3/4 времени.

2 голосов
/ 16 октября 2010

Вы возвращаете true, если deltaX и deltaY каждый находится между 0 и 16. Но sin() и cos() не гарантированно возвращают положительные числа.

0 голосов
/ 16 октября 2010

Если вы хотите, чтобы расстояние независимо от направления не было:

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

Если ваша цель находится в пределах 16px, но слева или выше, вы получите отрицательное значение дельты и метод вернет false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...