2010-10-16 77 views
1

这真是一个愚蠢的问题,但我已经在这个问题的方式一直盯着太久,我只是无法弄清楚的问题是什么:帮助有简单的方法,Java的

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

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

+1

在这个测试用例中,g1.getX()和g1.getY()的值是什么? – marcosbeirigo 2010-10-16 02:23:40

+0

哦对不起,他们x = 100和y = 1000 – Snowman 2010-10-16 02:26:08

回答

3

基础上overlap方法的javadoc,你需要采取的targetX-xtargetY-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);  
} 
+0

哦,是的,这是它,谢谢! – Snowman 2010-10-16 02:34:23

2

你返回true如果deltaXdeltaY是每间0 16.但sin()cos()不保证返回正数。

+0

呃!谢谢..... – Snowman 2010-10-16 02:34:47

2

貌似DELTAX和移动deltaY将是负面的半个月左右的时间,所以您的测试将失败的时间约3/4。

0

如果你想的距离与方向无关你不应该有:

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

如果你的目标是16像素内,但向左或以上,你会得到一个负增量值和方法将返回false 。