【问题标题】:Help with simple method, Java帮助简单的方法,Java
【发布时间】:2010-10-16 02:17:22
【问题描述】:

这真是一个愚蠢的问题,但我一直盯着这个问题太久了,我就是不知道问题是什么:

/**
     * 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));

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

【问题讨论】:

  • 这个测试用例中g1.getX()和g1.getY()的值是多少?
  • 哦,对不起,x=100 和 y=1000

标签: java methods object


【解决方案1】:

根据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);       
}

【讨论】:

    【解决方案2】:

    如果 deltaXdeltaY 都介于 0 和 16 之间,您将返回 true。但不能保证 sin()cos() 返回正数。

    【讨论】:

      【解决方案3】:

      看起来 deltaX 和 deltaY 大约有一半的时间为负数,因此您的测试大约有 3/4 的时间会失败。

      【讨论】:

        【解决方案4】:

        如果你想要不管方向的距离,你不应该有:

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

        如果您的目标在 16px 之内但在左侧或上方,您将获得负 delta 值,并且该方法将返回 false。

        【讨论】:

          猜你喜欢
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多