用vb写多个小球碰撞的情况(类似于泡泡状的屏保)
答案:1 悬赏:0 手机版
解决时间 2021-03-04 23:31
- 提问者网友:聂風
- 2021-03-04 13:58
用vb写多个小球碰撞的情况(类似于泡泡状的屏保)
最佳答案
- 五星知识达人网友:愁杀梦里人
- 2021-03-04 15:21
由于百度提问有字数限制,换个帐号继续把刚才的发完
If d <= 2 * r Then
If k <> l Then
vk = Sqr((dx(k) ^ 2 + dy(k) ^ 2))
vl = Sqr((dx(l) ^ 2 + dy(l) ^ 2))
sina = (yk - yl) / d
cosa = (xk - xl) / d
sinbk = dx(k) / vk
cosbk = dy(k) / vk
sinbl = dx(l) / vl
cosbl = dy(l) / vl
sin2a = 2 * sina * cosa
cos2a = cosa ^ 2 - sina ^ 2
sin2abk = sin2a * cosbk + sinbk * cos2a
cos2abk = cosbk * cos2a - sin2a * sinbk
sin2abl = sin2a * cosbl + sinbl * cos2a
cos2abl = cosbl * cos2a - sin2a * sinbl
dx(k) = vk * sin2abk
dy(k) = vk * cos2abk
dx(l) = vk * sin2abl
dy(l) = vk * cos2abl
End If
End If
Next
If Shape1(k).Top < 0 Then’以下是避免小球超出屏幕,经验证,没有问题
dy(k) = -dy(k)
End If
If Shape1(k).Top > Me.Height - Shape1(k).Height - 900 Then
dy(k) = -dy(k)
End If
If Shape1(k).Left > Me.Width - Shape1(k).Width - 200 Then
dx(k) = -dx(k)
End If
If Shape1(k).Left < 0 Then
dx(k) = -dx(k)
End If
Shape1(k).Top = Shape1(k).Top + dy(k)‘让小球移动
Shape1(k).Left = Shape1(k).Left + dx(k)
Next
End Sub
相撞时改变方向的公式是我自己算的,由于小球的半径都相同,不考虑质量,所以还算好算,应该是对的。问题在于运行的时候,好像所有的小球相互隔着好远就出现了碰撞才有的现象(速度方向改变),而且据我观察它们速度方向的改变是对的(就是说经观察如果它们真的撞上的话)。所以我怀疑是距离方面出了问题。求大神解答。
说明:a是公切线与竖直方向的夹角,bk,bl分别是两个小球原来的方向与竖直方向夹角,2abk就是2a+bk,2abl就是2a+bl,dx,dy是每个方向每次移动距离,vl,vk可以简单理解为速度,d是球心距
If d <= 2 * r Then
If k <> l Then
vk = Sqr((dx(k) ^ 2 + dy(k) ^ 2))
vl = Sqr((dx(l) ^ 2 + dy(l) ^ 2))
sina = (yk - yl) / d
cosa = (xk - xl) / d
sinbk = dx(k) / vk
cosbk = dy(k) / vk
sinbl = dx(l) / vl
cosbl = dy(l) / vl
sin2a = 2 * sina * cosa
cos2a = cosa ^ 2 - sina ^ 2
sin2abk = sin2a * cosbk + sinbk * cos2a
cos2abk = cosbk * cos2a - sin2a * sinbk
sin2abl = sin2a * cosbl + sinbl * cos2a
cos2abl = cosbl * cos2a - sin2a * sinbl
dx(k) = vk * sin2abk
dy(k) = vk * cos2abk
dx(l) = vk * sin2abl
dy(l) = vk * cos2abl
End If
End If
Next
If Shape1(k).Top < 0 Then’以下是避免小球超出屏幕,经验证,没有问题
dy(k) = -dy(k)
End If
If Shape1(k).Top > Me.Height - Shape1(k).Height - 900 Then
dy(k) = -dy(k)
End If
If Shape1(k).Left > Me.Width - Shape1(k).Width - 200 Then
dx(k) = -dx(k)
End If
If Shape1(k).Left < 0 Then
dx(k) = -dx(k)
End If
Shape1(k).Top = Shape1(k).Top + dy(k)‘让小球移动
Shape1(k).Left = Shape1(k).Left + dx(k)
Next
End Sub
相撞时改变方向的公式是我自己算的,由于小球的半径都相同,不考虑质量,所以还算好算,应该是对的。问题在于运行的时候,好像所有的小球相互隔着好远就出现了碰撞才有的现象(速度方向改变),而且据我观察它们速度方向的改变是对的(就是说经观察如果它们真的撞上的话)。所以我怀疑是距离方面出了问题。求大神解答。
说明:a是公切线与竖直方向的夹角,bk,bl分别是两个小球原来的方向与竖直方向夹角,2abk就是2a+bk,2abl就是2a+bl,dx,dy是每个方向每次移动距离,vl,vk可以简单理解为速度,d是球心距
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯