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