请教三个球在容器内运动的程序?!

liusahara 2011-06-27 05:40:46
我是用三个圆形的label分别为label1,label2,label3做球,容器就是form,有一个timer1,还有一个text=“move”的button。球与壁的碰撞没有问题,只是球与球之间的碰撞不知道哪里出问题了。
请高手帮我看下,运行环境:vs2005

Public Class Form1
Declare Function GetActiveWindow Lib "user32" () As Integer
Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Integer, _
ByVal hRgn As Integer, _
ByVal bRedraw As Boolean) As Integer
Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Integer, _
ByVal Y1 As Integer, _
ByVal X2 As Integer, _
ByVal Y2 As Integer) As Integer
Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Integer, _
ByVal Y1 As Integer, _
ByVal X2 As Integer, _
ByVal Y2 As Integer) As Integer
Declare Function GetWindow Lib "user32" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Const PI = 3.14159
Dim dx As Integer, dy As Integer
Dim dx1 As Integer, dy1 As Integer
'Dim ilal As Integer
'Dim idxdy As Integer
'Dim lal(2) As Label
'Dim dx(2) As Long
'Dim dy(2) As Long
Dim point(1) As Point
Dim distance As Integer
Dim dz As Single, dtan As Single, dpz As Single
Dim slal As Single, spint As Single
Dim tlalx As Single, tlaly As Single
Dim tpintx As Single, tpinty As Single
Dim nlalx As Single, nlaly As Single
Dim npintx As Single, npinty As Single
Dim angle2 As Single, angle1 As Single, angle3 As Single
Dim angle2l As Single, angle1l As Single, angle3l As Single

Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
'TextBox1.Text = Me.Bottom & " " & Me.Top & " " & Me.Height
'TextBox2.Text = Me.Left & " " & Me.Right & " " & Me.Width
Dim myhwnd, r1 As Integer, i As Integer
myhwnd = GetActiveWindow()
myhwnd = GetWindow(myhwnd, GW_CHILD)
r1 = CreateEllipticRgn(0, 0, 50, 50)
Call SetWindowRgn(myhwnd, r1, True)
For i = 0 To 1
myhwnd = GetWindow(myhwnd, GW_HWNDNEXT)
r1 = CreateEllipticRgn(0, 0, 50, 50)
Call SetWindowRgn(myhwnd, r1, True)
Next
End Sub

...全文
60 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liusahara 2011-06-29
  • 打赏
  • 举报
回复
//label是一个球,pint参数是另外一个球的球心坐标,dlx是label球的在x轴上的速度,dly是label球的
//在y轴上的速度,dpx是pint球的在x轴上的速度,dpy是pint球的在x轴上的速度
Function MoveAfterHitBall(ByVal lal As Label, ByVal pint As Point, ByVal dlx As Long, ByVal dly As Long, ByVal dpx As Long, ByVal dpy As Long) As Long
Dim dz As Long, dtan As Long, dpz As Long
Dim slal As Long, spint As Long //slal是球label的速度的大小,spint是球pint的速度大小
Dim tlalx As Long, tlaly As Long
Dim tpintx As Long, tpinty As Long //t是两球心的连线上的向量,tpintx为球pint在t向量方向上的速度分量
Dim nlalx As Long, nlaly As Long //nlalx为球label在n向量方向上的速度分量。
Dim npintx As Long, npinty As Long //n是与t向量垂直方向上的向量,npintx为球pint在n向量方向上的速度分量
Dim angle2 As Long, angle1 As Long, angle3 As Long //球pint的三个角
Dim angle2l As Long, angle1l As Long, angle3l As Long //球label的三个角
If dpy <> 0 Then
dpz = dpx / dpy
End If
If dly <> 0 Then
dz = dlx / dly
End If

If (lal.Left + 25 - pint.X) <> 0 Then
dtan = ((lal.Top + 25 - pint.Y) / (lal.Left + 25 - pint.X))
End If
angle2 = PI / 2 - Math.Atan(dpz) - Math.Atan(dtan)
angle1 = Math.Atan(dpz)
angle3 = Math.Atan(dtan)
angle1l = Math.Atan(dz)
angle2l = Math.Atan(dz) + Math.Atan(dtan)
angle3l = angle3
slal = Math.Sqrt(dlx ^ 2 + dly ^ 2)
spint = Math.Sqrt(dpx ^ 2 + dpy ^ 2)
tpintx = Math.Cos(angle3) * (Math.Cos(angle2) * spint)
tpinty = Math.Sin(angle3) * (Math.Cos(angle2) * spint)
npintx = Math.Cos(PI / 2 - angle3) * (Math.Sin(angle2) * spint)
npinty = Math.Sin(PI / 2 - angle3) * (Math.Sin(angle2) * spint)
tlalx = Math.Cos(angle3l) * (Math.Cos(angle2) * slal)
tlaly = Math.Sin(angle3l) * (Math.Cos(angle2) * slal)
nlalx = Math.Cos(PI / 2 - angle3l) * (Math.Sin(angle2) * slal)
nlaly = Math.Sin(PI / 2 - angle3l) * (Math.Sin(angle2) * slal)
dx(ilal) = nlalx + tpintx
dy(ilal) = nlaly + tpinty
dx(idxdy) = npintx + tlalx
dy(idxdy) = npinty + tlaly
Return 0
End Function
liusahara 2011-06-29
  • 打赏
  • 举报
回复
关于球与球碰撞的模拟,涉及动量守恒,动能守恒,向量计算等问题。实现代码在下面的函数中:
Function MoveAfterHitBall(ByVal lal As Label, ByVal pint As Point, ByVal dlx As Long, ByVal dly As Long, ByVal dpx As Long, ByVal dpy As Long) As Long
Dim dz As Long, dtan As Long, dpz As Long
Dim slal As Long, spint As Long
Dim tlalx As Long, tlaly As Long
Dim tpintx As Long, tpinty As Long
Dim nlalx As Long, nlaly As Long
Dim npintx As Long, npinty As Long
Dim angle2 As Long, angle1 As Long, angle3 As Long
Dim angle2l As Long, angle1l As Long, angle3l As Long
angle2 = PI / 2 - Math.Atan(dpz) - Math.Atan(dtan)
angle1 = Math.Atan(dpz)
angle3 = Math.Atan(dtan)
angle1l = Math.Atan(dz)
angle2l = Math.Atan(dz) + Math.Atan(dtan)
angle3l = angle3
slal = Math.Sqrt(dlx ^ 2 + dly ^ 2)
spint = Math.Sqrt(dpx ^ 2 + dpy ^ 2)
If dpy <> 0 Then
dpz = dpx / dpy
End If
If dly <> 0 Then
dz = dlx / dly
End If

If (lal.Left + 25 - pint.X) <> 0 Then
dtan = ((lal.Top + 25 - pint.Y) / (lal.Left + 25 - pint.X))
End If
tpintx = Math.Cos(angle3) * (Math.Cos(angle2) * spint)
tpinty = Math.Sin(angle3) * (Math.Cos(angle2) * spint)
npintx = Math.Cos(PI / 2 - angle3) * (Math.Sin(angle2) * spint)
npinty = Math.Sin(PI / 2 - angle3) * (Math.Sin(angle2) * spint)
tlalx = Math.Cos(angle3l) * (Math.Cos(angle2) * slal)
tlaly = Math.Sin(angle3l) * (Math.Cos(angle2) * slal)
nlalx = Math.Cos(PI / 2 - angle3l) * (Math.Sin(angle2) * slal)
nlaly = Math.Sin(PI / 2 - angle3l) * (Math.Sin(angle2) * slal)
dx(ilal) = nlalx + tpintx
dy(ilal) = nlaly + tpinty
dx(idxdy) = npintx + tlalx
dy(idxdy) = npinty + tlaly
Return 0
End Function
liusahara 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fangxinggood 的回复:]
http://blog.csdn.net/fangxinggood/archive/2010/10/12/5936966.aspx
[/Quote]

谢谢啦!
ruanwei1987 2011-06-27
  • 打赏
  • 举报
回复
什么情况

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧