完美的圆形到完美的圆形和完美的圆形到直线碰撞在Java中处理

时间:2010-07-11 01:14:12

标签: java 2d collision-detection collision

我是Java的新手,但决定制作一个有一堆球弹跳的应用程序。请记住,我对法线几乎一无所知,我在这种线程中已经提到了很多。我也只拿代数1,并且知道一点点三角(sin,cosin和tangent)。反正...

我使用了碰撞检测
if (java.awt.geom.Point2D.distance(X1, Y1, X2, Y2) < ball1.radius + ball2.radius) {return true;} else {return false;}

if (ball.x + ball.radius > getWidth) {COLLISION}

所有四面墙的

等等

我需要做的是以半现实的方式处理这些碰撞,而不是切换速度和方向。

所有内容都是在JPanel中绘制的

感谢您的提前帮助

2 个答案:

答案 0 :(得分:4)

为了计算碰撞上的反射矢量,你将不得不理解法线是什么。幸运的是,这并不是很难理解。对于那里的数学,我会有点不精确,所以请不要打扰我。 :)

法线简单地是与表面正交(以90度角)的单位矢量(单位:具有幅度= 1)。您可以将法线可视化为直接从表面伸出的箭头。由于您的墙壁不倾斜,因此很容易找出它们的法线(假设屏幕的左上角是0,0):

top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)

我们需要做的是获取球的速度并沿着你击中的墙壁的法线向量“反射”它。反思的公式如下:

V2 = V1 - 2*N*(N.dot(V1))

V1是你的事件向量(在这种情况下你的旧速度),N是我们击中的墙的法线,V2是你的反射向量(你的新速度)。 “N.dot(V1)”是N和V1的“点积”,它只是(N.x V1.x + N.y V1.y)。

来自维基百科的图片我们正在做什么(P是事件向量,Q是反射向量):

alt text

这是psuedocode中的全部内容:

float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier

ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);

如果有什么不清楚,请告诉我。 :)此外,虽然这对于墙壁来说有点过分,但是当你进行球 - 球碰撞时你需要计算正常值,所以这不是一个完全浪费......

答案 1 :(得分:1)

您可能会喜欢使用矢量讨论弹性碰撞的文章2-Dimensional Elastic Collisions without Trigonometry。这个kinetic model实现了Java中的方法。