gpt4 book ai didi

algorithm - 圆圈碰撞问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:19 29 4
gpt4 key购买 nike

我在圆-圆碰撞检测上遇到了问题,我使用了下面的算法

func collision(id,other.id)
{

var vaP1,vaP2,dis,va1,vb1,va2,vb2,vp1,vp2,dx,dy,dt;


if (id!=other.id)

{
dx=other.x-x;
dy=other.y-y;
dis=sqrt(sqr(dx)+sqr(dy));

if dis<=radius+other.radius
{
//normalize
dx/=dis;
dy/=dis;

//calculate the component of velocity in the direction
vp1=hspeed*dx+vspeed*dy;
vp2=other.hspeed*dx+other.vspeed*dy;

if (vp1-vp2)!=0
{
dt=(radius+other.radius-dis)/(vp1-vp2);

//move the balls back so they just touch
x-=hspeed*dt;
y-=vspeed*dt;
other.x-=other.hspeed*dt;
other.y-=other.vspeed*dt;

//projection of the velocities in these axes
va1=(hspeed*dx+vspeed*dy);
vb1=(vspeed*dx-hspeed*dy);
va2=(other.hspeed*dx+other.vspeed*dy);
vb2=(other.vspeed*dx-other.hspeed*dy);

//new velocities in these axes. take into account the mass of each ball.
vaP1=(va1+bounce*(va2-va1))/(1+mass/other.mass);
vaP2=(va2+other.bounce*(va1-va2))/(1+other.mass/mass);

hspeed=vaP1*dx-vb1*dy;
vspeed=vaP1*dy+vb1*dx;
other.hspeed=vaP2*dx-vb2*dy;
other.vspeed=vaP2*dy+vb2*dx;

//we moved the balls back in time, so we need to move them forward
x+=hspeed*dt;
y+=vspeed*dt;
other.x+=other.hspeed*dt;
other.y+=other.vspeed*dt;
}
}
}

x=ball 1 x-position

y=ball 1 y-position

other.x= ball 2 x position

other.y=ball 2 y position

当我有一个 40 x 40 像素的球图像并且球中心为 (20,20) 意味着图像仅包含球时,此算法运行良好。但是当图像大小为 80 x 80 时出现问题。球中心位置为(60,60),表示球在右下角,半径为20。在这种情况下会发生多次碰撞,表示部分



x+=hspeed*dt;

y+=vspeed*dt;

other.x+=other.hspeed*dt;

other.y+=other.vspeed*dt;

无法分离球/速度不会根据碰撞而改变。我已经改变了 x 的值,它是图像 40,40 的中心到 60,60 球的中心加上 20。但结果是一样的。任何人都可以告诉我问题是什么。我认为算法是正确的,因为它有效在所有其他情况下都很好,很多人使用这个算法。问题是将位置从图像中心更改为球中心。我应该为此做什么校正???或任何想法。如果有人想帮助请给我电子邮件地址,以便我可以发送我的完整项目。

最佳答案

我没有精神力来消化你的整个问题,但这是我关于如何解决你的问题的 2 美分

1) 检测圆与另一个圆碰撞的最简单方法是检查它们的距离是否小于组合圆的半径。 (我的数学可能有误,如果我错了请纠正我)

Circle c1,c2;
float distance = DISTANCE(c1.center,c2.center);
if(distance < c1.radius + c2.radius)
{
// collision .. BOOOOOOM
}

2) 尽量使用准确的数据类型。尽量不要在不检查上溢、下溢和小数点的情况下将 float 转换为整数。更好的是,只需使用 float 。

3) 写日志并追踪你的值(value)观。看看有没有明显的数学错误。

4) 将您的代码分解为最简单的部分。尝试删除所有速度计算以获得最简单的运动来帮助您进行调试。

关于algorithm - 圆圈碰撞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857938/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com