Java 是否有更好的方法来通过对一组对象执行碰撞检测?
所以我使用Java(处理),我有一个对象数组,我需要它们能够与自身发生冲突,但我不太确定如何有效地做到这一点。我有一个基本的方法,但它写得很差,不允许使用动态数组 我目前有一个静态数组,但我希望在未来有一个动态数组。我目前运行的方法通过检查每个可能的组合来检测碰撞。将始终有3个对象,并且不可能少于3个 这是我的密码:Java 是否有更好的方法来通过对一组对象执行碰撞检测?,java,arrays,class,oop,object,Java,Arrays,Class,Oop,Object,所以我使用Java(处理),我有一个对象数组,我需要它们能够与自身发生冲突,但我不太确定如何有效地做到这一点。我有一个基本的方法,但它写得很差,不允许使用动态数组 我目前有一个静态数组,但我希望在未来有一个动态数组。我目前运行的方法通过检查每个可能的组合来检测碰撞。将始终有3个对象,并且不可能少于3个 这是我的密码: Circle[] arrayOfCircles = new Circle[3]; //declare array void setup() { size(1000, 100
Circle[] arrayOfCircles = new Circle[3]; //declare array
void setup() {
size(1000, 1000);
for (int i = 0; i < arrayOfCircles.length; i++) {
createPuck(i);
} // creates objects
}
void createPuck(int i) {
float speedY;
float speedX;
if (tempSpeedX == 0 && tempSpeedY == 0) {
speedY = createSpeedY();
speedY = speedY * multiplier;
speedX = 3 * multiplier;
} else {
speedX = tempSpeedX;
speedY = tempSpeedY;
tempSpeedX = 0;
tempSpeedY = 0;
}
arrayOfPucks[i] = new Puck(width, int(random(0, height)), speedX, speedY);
}
int createSpeedY() {
int tempSpeed = int(random(-3, 3));
do {
if (tempSpeed == 0) {
tempSpeed = int(random(-3, 3));
}
} while (tempSpeed == 0);
return tempSpeed;
}
void draw() {
detectCollisions();
}
void detectCollisions() {
for (int i = 0; i < arrayOfCircles.length; i++) {
boolean collision = false;
if (i==0) {
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+1]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+1]);
}
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+2]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+2]);
}
} else if (i==1) {
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-1]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-1]);
}
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+1]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+1]);
}
} else if (i==2) {
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-1]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-1]);
}
collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-2]);
if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-2]);
}
} // end of if
} // end of for loop
} // end of function
class Circle {
float x, y;
float speedX, speedY;
final int radius = 10;
Circle(float x, float y, float speedX, float speedY) {
this.x = x;
this.y = y;
this.speedX = speedX;
this.speedY = speedY;
}
// constructor
void move() {
this.x = this.x-speedX; //move left
this.y = this.y-speedY;
}
//methods
void render() {
fill(0);
ellipse(this.x, this.y, this.radius, this.radius);
}
void bounce() {
this.speedX = this.speedX * -1;
this.speedY = this.speedY * -1;
}
boolean detectSelfCollision(Puck other) {
for (int i = 0; i == 2; i++) {
}
float distX = this.x - other.x;
float distY = this.y - other.y;
float distance = sqrt( (distX*distX) + (distY*distY) );
if (distance <= radius*2) {
return true;
} else {
return false;
}
}
}
Circle[]arrayOfCircles=新的圆[3]//声明数组
无效设置(){
大小(10001000);
对于(int i=0;i 如果(距离您的检测碰撞()
方法可以重写:
public void detectCollisions() {
for (int i = 0; i < circles.length; i++)
for (int j = 0; j < circles.length; j++)
if (i != j && circles[i].detectCollision(circles[j]))
circles[i].bounce(circles[j]);
}
public void detectCollisions(){
对于(int i=0;i
你能提供你的圈
课程吗?如果代码有效,并且你正在寻找改进的方法,那么这将是一个更好的提问场所。如果你决定把它移到那里,一定要遵守他们的提问标准。@oleg.cherednik更新了代码部分。@JohnBollinger谢谢,我会看一看,问题是“我真的不知道我在找什么。嗯,就是这样,”乔纳森。如果你不知道你在找什么,那我们怎么知道呢?代码审查是关于“我如何使它更好?”问题。这就是更具体的问题。这正是我所要寻找的,非常感谢!“Johnathan Note,虽然这不是很好,因为它是N ^ 2次。这将是好的低圈数的圆,但会变得很快,因为你添加更多的圈子。如果你打算有很多圈子,然后考虑寻找更多的Effi。cient碰撞检测算法,请参阅