Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阵列中最近元素的检测_Java_Arrays_For Loop_Indexing_Distance - Fatal编程技术网

Java 阵列中最近元素的检测

Java 阵列中最近元素的检测,java,arrays,for-loop,indexing,distance,Java,Arrays,For Loop,Indexing,Distance,我在检测一组块中距离玩家最近的元素(使用圆圈)时遇到问题 到目前为止,我得到的是: public static int closestBarrier(GameObject object, GameObject[] barriers) { int closest = -1; float minDistSq = Float.MAX_VALUE;// ridiculously large value to start for (int i = 0; i < barrier

我在检测一组块中距离玩家最近的元素(使用圆圈)时遇到问题

到目前为止,我得到的是:

public static int closestBarrier(GameObject object, GameObject[] barriers) {
    int closest = -1;
    float minDistSq = Float.MAX_VALUE;// ridiculously large value to start
    for (int i = 0; i < barriers.length; i++) {

        float barrierRadius = barriers[i].getWidth() / 2;
        float objectRadius = object.getWidth() / 2;

        GameObject curr = barriers[i];// current
        float dx = (object.getX()) - ((curr.getX()));
        float dy = (object.getY()) - ((curr.getY()));
        float distSq = (((dx * dx + dy * dy) - objectRadius) - barrierRadius)  ;// use the squared distance
        if (distSq < minDistSq) {// find the smallest and remember the id
            minDistSq = distSq;
            closest = i;
        }
    }

    return closest;
}

您的代码是正确的,您编写的测试是错误的-屏障2比屏障3更接近90100

障碍2:

(90-15)^2+(100-20)^2

12025

障碍3:

(100-90)^2+(210-100)^2

12200

12025<12200->屏障2更近

编辑:在编辑后的答案中,您忘记了将objectRadius和barrierRadius平方。e、 g

float distSq=((dx*dx+dy*dy)-objectRadius-barrieradius)


在这一行中,您有dx^2,dy^2,但只有非平方objectRadius和barrierRadius。

我知道测试是正确的,但我无法理解为什么我的代码是错误的,为什么它只是最后一个失败的代码。你能给我指引正确的方向吗?@dan boy你的代码是正确的,测试报告屏障2更近了,因为屏障2更近了(见我在答案中的计算),但我应该测量到屏障的边缘,而不是中心。。也许是因为障碍物的宽度,所以计算不正确?@dan boy我不知道你的代码中使用了什么宽度,所以我只使用了障碍物的位置。您的代码错误,或者您没有提供与问题相关的所有代码。我刚刚更新了上面的代码,但错误仍然存在。还有什么我能帮忙的吗?
    public final void testClosestBarrier() {
    // Closest to first
    GameObject player = new GameObject(0,1);
    player.setWidth(2);
    GameObject[] barriers = new GameObject[4];
    barriers[0] = new GameObject(8,9);
    barriers[0].setWidth(3);
    barriers[1] = new GameObject(10,15);
    barriers[1].setWidth(2);
    barriers[2] = new GameObject(15,20);
    barriers[2].setWidth(5);
    barriers[3] = new GameObject(100,210);
    barriers[3].setWidth(10);
    assertEquals("Player closest to first barrier",0,
            Submission.closestBarrier(player,barriers));

    // Closest to second
    player.setX(12);
    player.setY(12);
    assertEquals("Player closest to second barrier",1,
            Submission.closestBarrier(player,barriers));

    // Closest to third
    player.setX(12);
    player.setY(20);
    assertEquals("Player closest to third barrier",2,
            Submission.closestBarrier(player,barriers));

    // Closest to fourth
    player.setX(90);
    player.setY(100);
    assertEquals("Player closest to fourth barrier",3,
            Submission.closestBarrier(player,barriers));

}