【问题标题】:Detecting closest element in array检测数组中最近的元素
【发布时间】:2013-03-17 01:24:43
【问题描述】:

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

到目前为止我所拥有的是:

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。这是测试(它“最接近第四”失败:

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

}

【问题讨论】:

    标签: java arrays for-loop indexing distance


    【解决方案1】:

    您的代码是正确的,而您编写的测试是错误的 - 障碍 2 比障碍 3 更接近 90,100。

    障碍 2:

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

    12025

    障碍 3:

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

    12200

    12025 屏障 2 更近了

    编辑:在您编辑的答案中,您忘记将 objectRadius 和 barrierRadius 平方。例如

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

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

    【讨论】:

    • 我知道测试是正确的,但我无法弄清楚为什么我的代码是错误的,以及为什么它只是最后一个失败。你能指导我正确的方向吗?
    • @dan boy 您的代码是正确的,测试报告说屏障 2 更接近,因为屏障 2 更接近(请参阅我在答案中的计算)
    • 但是我应该测量到障碍物的边缘,而不是中心。也许由于障碍物的宽度,它没有正确计算它?
    • @dan 男孩我看不到您的代码中在哪里使用了宽度,所以我只使用了障碍位置。您的代码有误,或者您没有提供与问题相关的所有代码。
    • 我刚刚更新了上面的代码,但错误仍然存​​在。还有什么我可以提供的帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-08-24
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多