当前位置: 首页 > 知识库问答 >
问题:

动圆与非动圆的JAVA弹性碰撞

谭锐藻
2023-03-14
public void collision(Orb o)
{
    //the orb's center point
    Point oc=new Point(o.getTopLeft().x+o.getWidth()/2,o.getTopLeft().y+o.getWidth()/2);
    //the shot's center point
    Point sc=new Point(topLeft.x+width/2,topLeft.y+width/2);

    //variables vx and vy are the shot's velocity on axis x and y
    if(oc.x==sc.x)
    {
        vy=-vy;
        return ;
    }

    if(oc.y==sc.y)
    {
        vx=-vx;
        return ;
    }

    // o.getWidth() returns the orb's width, width is the shot's width

    double angle=0;  //here should be some sort of calculation of the shot's angle
    setAngle(angle);
}

public void setAngle(double angle)
{
    double v=Math.sqrt(vx*vx+vy*vy);
    vx=Math.cos(Math.toRadians(angle))*v;
    vy=-Math.sin(Math.toRadians(angle))*v;
}

提前感谢所有的帮助者

共有1个答案

宣煜
2023-03-14

在碰撞点上,动量、角动量和能量都保持不变。设置m1,m2为盘的质量,P1=(p1x,p1y),P2=(p2x,p2y)为碰撞时盘的中心位置,u1,u2为碰撞前的速度,v1,v2为碰撞后的速度。那么守恒定律要求

0 = m1*(u1-v1)+m2*(u2-v2)
0 = m1*cross(p1,u1-v1)+m2*cross(p2,u2-v2)
0 = m1*dot(u1-v1,u1+v1)+m2*dot(u2-v2,u2+v2)

使用第一个方程消除u2-v2

0 = m1*cross(p1-p2,u1-v1)
0 = m1*dot(u1-v1,u1+v1-u2-v2)

第一个告诉我们(u1-v1)和(u2-v2)是(p1-p2)的倍数,冲量交换是在法向或径向,没有切向相互作用。冲量和能量守恒现在导致一个相互作用常数a,这样

u1-v1 = m2*a*(p1-p2)
u2-v2 = m1*a*(p2-p1)
0 = dot(m2*a*(p1-p2), 2*u1-m2*a*(p1-p2)-2*u2+m1*a*(p2-p1))
2 * dot(p1-p2, u1-u2) = (m1+m2) * dot(p1-p2,p1-p2) * a
b = dot(p1-p2, u1-u2) / dot(p1-p2, p1-p2)
a = 2/(m1+m2) * b

v1 = u1 - 2 * m2/(m1+m2) * b * (p1-p2)
v2 = u2 - 2 * m1/(m1+m2) * b * (p2-p1)
dot(p1-p2, p1-p2) = (r1+r2)^2

根据您的代码,oc{x,y}包含固定磁盘或圆球的中心,sc{x,y}包含中心,{vx,vy}包含移动磁盘的速度。

>

  • computedc={sc.x-oc.x,sc.y-oc.y}dist2=dc.x*dc.x+dc.y*dc.y

    1.检查sqrt(dist2)是否足够接近sc.radius+oc.radius。通常的说法是比较方格更有效。如果dist2太小,则微调交点的位置。

  •  类似资料:
    • 为了计算x和y速度,我求解了一个动量守恒和动能守恒方程组。 顺便说一下,这些方程没有考虑圆的“形状”。 所以我通过求两个圆相交的切线来计算回弹角。 现在我有两个不同的最终速度方向:一个是用动量定律计算的,一个是用回弹计算的。 我不知道怎么把两种速度结合起来才能得到最后一种

    • 我正在编写软件,扩展圆-矩形碰撞检测(交集),以包括对碰撞的响应。圆边和圆矩形是相当直接的。但一圈又一圈地把我难住了。 例如,在离散事件模拟中,让两个圆碰撞,一个红一个绿。我们可能会出现以下情况: 在它们碰撞后,我们可以立即: 这里的RIP和GIP是在前一个时钟滴答的圆圈的位置。在当前时钟滴答时,在RDP和GDP处检测到冲突。然而,当两个圆位于RCP和GCP时,碰撞发生在时钟滴答之间。在时钟滴答声

    • 有没有数学方法可以求出两个圆圈碰撞所需要的时间?如果我能得到那个时间值,我就能把圆圈移动到那个时候的位置,然后在那个点上碰撞它们。 编辑:等速

    • 我有一个问题,碰撞检测一个圆和一个矩形。我曾尝试用勾股定理来解决这个问题。但所有查询都不起作用。矩形与圆的矩形包围盒发生碰撞。

    • 我正在编写一个游戏,涉及碰撞的一个移动的圆,由用户控制,和一个移动的矩形,由计算机控制。 完整的代码可以在这里找到:游戏 我在圆和矩形之间的碰撞检测方面遇到了麻烦。当矩形是静态的,碰撞检测工作完美。当圆和矩形的边缘在任一边接触时,程序就会按照它应该的方式进行操作。 这是碰撞检测功能。 谢谢。

    • 我正在将游戏原型中的对象建模为圆圈。每个物体都有质量、半径、速度和位置。没有两个物体具有相同的质量和半径。 我必须遵循计算它们之间弹性碰撞的代码,但我注意到,结果总是好像圆圈相互撞击一样。 我需要处理这样的情况,其中一个圆以一个斜角撞到另一个圆(如果需要的话,我可以稍后再画一个图),比如当一个小圆经过时,它几乎没有碰到一个大圆的边缘。 我如何修改我的碰撞算法来解释一个圆击中另一个的位置?