2

ブロックの配列でプレイヤーに最も近い要素を検出する際に問題が発生しています (円を使用)。

私がこれまでに持っているものは次のとおりです。

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

ほとんどのテストに合格しますが、最後のテストでは、最も近いものの返されたインデックスは、予想される 3 ではなく 2 です。テストは次のとおりです (「4 番目に近い」に失敗しています:

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

}
4

1 に答える 1

1

コードは正しく、作成したテストは間違っています。バリア 2 はバリア 3 よりも 90,100 に近いです。

バリア 2:

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

12025

障壁 3:

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

12200

12025 < 12200 -> バリア 2 が近い

編集:編集した回答では、objectRadius と barrierRadius を二乗するのを忘れていました。例えば

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

この行には、dx^2、dy^2 がありますが、2 乗されていない objectRadius と barrierRadius のみです。

于 2013-03-27T02:36:34.427 に答える