求教各位,如何在Vb里实现点的x,y坐标曲线运动?想了很久一直无法解决,根据曲线运动的公式演变了很多种计算方法都不成功。

解决方案 »

  1.   

    Private Type POINTAPI
    x As Single
    y As Single
    End Type
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Dim p(200) As POINTAPI
    Private Sub Command1_Click()
    Dim i As Long
    For i = 0 To 200DoEvents
    Sleep 10
    p(i).x = i
    p(i).y = 1 + Sin(i / 5)
    Picture1.CurrentX = p(i).x
    Picture1.CurrentY = p(i).y
    If i > 0 Then Picture1.Line (p(i).x, p(i).y)-(p(i - 1).x, p(i - 1).y), vbRed
    Next
    End SubPrivate Sub Form_Load()
    Picture1.Scale (0, 0)-(100, 2)
    Picture1.AutoRedraw = True
    End Sub
      

  2.   

    楼上的老大,真是高手,我看到他好多文章,好棒的!嘿嘿。。向他学习,但是对于:
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    这个不是很懂,能否解释一下呢?呵。。我顺便也搞了个:没有楼上的思想好!
    画个shape1控件 command1 代码如下:
    ————————————————————————————————
    Private Sub Command1_Click()
    Scale (-1000, 1000)-(4000, -1000)For x = -1000 To 3600 Step 0.01y = Sin(x / 180 * 3.1415926) * (0.25 * x)
    PSet (x, y)Shape1.Left = x
    Shape1.Top = y
    NextEnd Sub
      

  3.   

    首先谢谢楼上的各位,但问题并非这么简单,这是一个模拟飞机飞行的曲线运动,飞机以点为代表,以form为模拟天空,现在要解决的就是这个飞机点在这个天空form上根据加速度、初速度、时间等物理学上的参数加入的情况下的曲线运动。
    这是我实验的几个计算方法,可不正确,列出来希望大家指正
    Vx = Abs(v0) * Cos(Abs(160)): Vy = Abs(v0) * Sin(Abs(160))   '设计加速度的夹角是160,v0是初速度,aSpeed是加速度。
    Ax = Abs(aSpeed) * Cos(Abs(160)): Ay = Abs(aSpeed) * Cos(Abs(160))
    Sx = (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2): Sy = drY + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)
    rX = drX + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2):rY = drY + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2)  'drx,dry是飞机的启点坐标
        Me.DrawWidth = 3
        Me.PSet (Sx, Sy), RGB(2550, 2550, 0)
        Me.DrawWidth = 1
      

  4.   

    首先谢谢楼上的各位,但问题并非这么简单,这是一个模拟飞机飞行的曲线运动,飞机以点为代表,以form为模拟天空,现在要解决的就是这个飞机点在这个天空form上根据加速度、初速度、时间等物理学上的参数加入的情况下的曲线运动。
    这是我实验的几个计算方法,可不正确,列出来希望大家指正
    Vx = Abs(v0) * Cos(Abs(160)): Vy = Abs(v0) * Sin(Abs(160))   '设计加速度的夹角是160,v0是初速度,aSpeed是加速度。
    Ax = Abs(aSpeed) * Cos(Abs(160)): Ay = Abs(aSpeed) * Cos(Abs(160))
    Sx = (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2): Sy = drY + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)
    rX = drX + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2):rY = drY + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2)  'drx,dry是飞机的启点坐标
        Me.DrawWidth = 3
        Me.PSet (Sx, Sy), RGB(2550, 2550, 0)
        Me.DrawWidth = 1
    -----------------------------------------
    没看出你的代码与时间的关系
      

  5.   

    实际上那个贴出来的语句是一个函数,然后在Timer控件中调用,至于时间是自己自动递增的 在Timer控件中aSpeed = aSpeed + 0.2 然后在Timer控件中传递给这个函数
      

  6.   

    Dim aspeed As Single
    Private Sub Form_Load()
    Timer1.Enabled = True
    Timer1.Interval = 10
       Me.DrawWidth = 3
       Me.Scale (-10000, -10000)-(0, 0)
       Me.AutoRedraw = True
       Me.WindowState = 2
    End Sub
    Sub xxx(ByVal aspeed As Single)
    v0 = 0
    drAlpha = 45
    drx = 0
    dry = 0
    Vx = Abs(v0) * Cos(Abs(160)): Vy = Abs(v0) * Sin(Abs(160))   '设计加速度的夹角是160,v0是初速度,aSpeed是加速度。
    Ax = Abs(aspeed) * Cos(Abs(160)): Ay = Abs(aspeed) * Cos(Abs(160))
    sx = (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2): sy = dry + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)
    rX = drx + (sx * drAlpha) + 1 / 2 * (sy * drAlpha ^ 2): rY = dry + (sx * drAlpha) + 1 / 2 * (sy * drAlpha ^ 2)  'drx,dry是飞机的启点坐标    Me.PSet (sx, sy), RGB(2550, 2550, 0)
        Me.DrawWidth = 2End SubPrivate Sub Timer1_Timer()
    aspeed = aspeed + 0.2
    xxx aspeed
    End Sub
      

  7.   

    不行啊,这样还是没有达到曲线运动的效果呀
    因为这个曲线要受到加速度的影响,产生有方向的曲线运动
    Private Sub Form_Load()Me.AutoRedraw = True: Me.BackColor = 0
    Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
    aTime = 0
    v0 = 3 
    aSpeed = 1 
    aNGular = 120End Sub
    Private Sub Timer1_Timer()
    Static sAlpha As Single, Sx As Long, Sy As Long
    Dim pY, pX As Double
    aTime = aTime + 0.2DrawPoint Me.Width / 2, Me.Height / 2, 100, aTimeEnd Sub
    Private Sub DrawPoint(ByVal drX As Long, ByVal drY As Long, ByVal drRds As Integer, ByVal drAlpha As Single)
    Vx = Abs(v0) * Cos(Abs(160)): Vy = Abs(v0) * Sin(Abs(160))   '设计加速度的夹角是160,v0是初速度,aSpeed是加速度。
    Ax = Abs(aSpeed) * Cos(Abs(160)): Ay = Abs(aSpeed) * Cos(Abs(160))
    Sx = (Vx * drAlpha) + 1 / 2 * (Ax * drAlpha ^ 2): Sy = drY + (Vy * drAlpha) + 1 / 2 * (Ay * drAlpha ^ 2)
    rX = drX + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2):rY = drY + (Sx * drAlpha) + 1 / 2 * (Sy * drAlpha ^ 2)  'drx,dry是飞机的启点坐标而rx,ry这个公式是直线加速度运行的计算公式
        Me.DrawWidth = 3
        Me.PSet (Sx, Sy), RGB(2550, 2550, 0)
        Me.DrawWidth = 1End Sub
      

  8.   

    Vx=|V|*cos@    ax=|a|*cos@
    Vy=|V|*sin@    ay=|a|*sin@  
    Sx=Vxt+1/2axt2
    Sy=Vyt+1/2ayt2 
    注:|v|代表取V初速度的绝对值、@是初速度和加速度的夹角、t2代表时间t的平方。
      

  9.   

    let |a|/|v|=k,then
    sy/sx=(Vyt+1/2ayt2 )/(Vxt+1/2axt2)=(|V|*sin@t+1/2*k*|v|sin@t2 )/(|V|*cos@t+1/2*k*|v|cos@t2 )=tg@当然是直线了