如何检测一个新圆与另一个已经在 for 循环中创建的圆的碰撞?
How can I detect a collision of a new circle with another circle already created in a for-loop?
我正在我的构造函数中创建 25 个圆圈,并希望在这个圆圈创建部分进行碰撞检测,这样圆圈就不会发生碰撞。碰撞检测已经开始工作,但我没有将其纳入我的圆圈创建部分。
这是我要创建 25 个圆圈的构造函数:
public Drawing(Context context) {
super(context);
this.ctx = context;
viking = new Circle(160,160, 33, "viking", "green", false);
for(int k = 0; k < circles.length; k++) {
int randomX = r.nextInt(500);
int randomY = r.nextInt(750);
circles[k] = new Circle(randomX, randomY, 33, "Circle"+k, "blue", false);
circles[k].setX(randomX);
circles[k].setY(randomY);
setDrawColor(circles[k]);
//Collision Detection
for(int z = 0; z<k;z++) {
if(detectCollision(circles[k], circles[z]) == true)
{
break;
}
}
}
pMe.setColor(Color.GREEN);
p1.setColor(Color.GREEN);
p2.setColor(Color.BLUE);
p3.setColor(Color.RED);
}
碰撞检测如下所示:
public static boolean detectCollision(Circle c1, Circle circleOpponent) {
dx = circleOpponent.getX() - c1.getX();
dy = circleOpponent.getY() - c1.getY();
radiusSum = circleOpponent.getR() + c1.getR();
return dx * dx + dy * dy <= radiusSum * radiusSum; // true if collision
}
"new Circle" 中的值是 x 和 y 位置、半径、名称、颜色和 isDrawn 值。
有谁知道我必须在 for 循环中更正或调整什么?
感谢帮助!
我假设在检测到碰撞的情况下,您想忽略新创建的圆圈并继续创建圆圈,直到达到 25 个圆圈。因此,您的最外层循环应该是一个 while 循环。此外,当您发现它不与任何现有圆圈碰撞时,您应该只将圆圈添加到数组中。从而引入一个候选变量。使用continue语句进入外循环的下一次迭代。
int createdCircles = 0;
outer: while (createdCircles < 25) {
Circle candidate = new Circle(...);
inner: for (int z = 0; ...) {
if (detectCollision(...)) continue outer;
}
circles[createdCircles] = candidate;
createdCircles++;
}
我正在我的构造函数中创建 25 个圆圈,并希望在这个圆圈创建部分进行碰撞检测,这样圆圈就不会发生碰撞。碰撞检测已经开始工作,但我没有将其纳入我的圆圈创建部分。
这是我要创建 25 个圆圈的构造函数:
public Drawing(Context context) {
super(context);
this.ctx = context;
viking = new Circle(160,160, 33, "viking", "green", false);
for(int k = 0; k < circles.length; k++) {
int randomX = r.nextInt(500);
int randomY = r.nextInt(750);
circles[k] = new Circle(randomX, randomY, 33, "Circle"+k, "blue", false);
circles[k].setX(randomX);
circles[k].setY(randomY);
setDrawColor(circles[k]);
//Collision Detection
for(int z = 0; z<k;z++) {
if(detectCollision(circles[k], circles[z]) == true)
{
break;
}
}
}
pMe.setColor(Color.GREEN);
p1.setColor(Color.GREEN);
p2.setColor(Color.BLUE);
p3.setColor(Color.RED);
}
碰撞检测如下所示:
public static boolean detectCollision(Circle c1, Circle circleOpponent) {
dx = circleOpponent.getX() - c1.getX();
dy = circleOpponent.getY() - c1.getY();
radiusSum = circleOpponent.getR() + c1.getR();
return dx * dx + dy * dy <= radiusSum * radiusSum; // true if collision
}
"new Circle" 中的值是 x 和 y 位置、半径、名称、颜色和 isDrawn 值。
有谁知道我必须在 for 循环中更正或调整什么?
感谢帮助!
我假设在检测到碰撞的情况下,您想忽略新创建的圆圈并继续创建圆圈,直到达到 25 个圆圈。因此,您的最外层循环应该是一个 while 循环。此外,当您发现它不与任何现有圆圈碰撞时,您应该只将圆圈添加到数组中。从而引入一个候选变量。使用continue语句进入外循环的下一次迭代。
int createdCircles = 0;
outer: while (createdCircles < 25) {
Circle candidate = new Circle(...);
inner: for (int z = 0; ...) {
if (detectCollision(...)) continue outer;
}
circles[createdCircles] = candidate;
createdCircles++;
}