我是Java的新手,但是决定开发一个有很多问题的应用程序。请记住,我对法线几乎一无所知,我在这种线程中已经提到很多。我也只学习代数1,并且懂一点三角(正弦,余弦和正切)。无论如何...
我涵盖了碰撞检测,使用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中绘制
谢谢您的帮助
最佳答案
您将必须了解法线是什么,以便计算Collison上的反射向量。幸运的是,它并不难理解。对于那里的数学问题,我会有点不精确,所以请不要为之而烦。 :)
法线只是与表面正交(成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.xV1.x + N.yV1.y)。
维基百科上关于我们正在做的事情的图片(P是入射矢量,Q是反射矢量):
这是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);
让我知道是否有任何不清楚的地方。 :)而且,尽管这对于墙壁来说是一种过大的杀伤力,但是当您进行球与球的碰撞时,您将需要计算法线,因此这不是一个总的浪费...
关于java - Java中的完美圆到完美圆和完美圆到直线碰撞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3221472/