【问题标题】:Perfect circle to perfect circle and Perfect circle to straight line collision HANDLING in JavaJava中的完美圆到完美圆和完美圆到直线碰撞处理
【发布时间】:2011-03-14 09:11:55
【问题描述】:

我是 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 中绘制

提前感谢您的帮助

【问题讨论】:

    标签: java 2d collision-detection collision


    【解决方案1】:

    为了计算 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)。

    一张来自 Wikipedia 的关于我们正在做的事情的图片(P 是入射矢量,Q 是反射矢量):

    这是伪代码中的全部内容:

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

    如果有任何不清楚的地方,请告诉我。 :) 另外,虽然这对墙壁来说有点过头了,但是当你进行球-球碰撞时,你需要计算法线,所以这并不是完全浪费......

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        相关资源
        最近更新 更多