做得是一个动的凸轮  就是在转动过程中会一闪一闪的
这是我设置的程序
Private Sub Timer1_Timer()
Timer1.Interval = Val(Text2.Text)  '定动画速度
Picture1.Cls
Picture1.DrawWidth = 1 '设置线条粗细
Picture1.Circle (0, 0), 5
Picture1.Circle (-350, 0), 5 '点出2个基点
Dim L1!, Xc!, Yc!, a!, b!, θ!, β!, α!, f!, Xn!, Yn!, g!, Xs!, Ys!, Xt!, Yt!, k!, p!, Xe!, Ye!, Rb!, Rr!, l!, f0!, Xc1!, Yc1!, Xn1!, Yn1!
L1 = 350
l = Text1.Text
Rr = Text3.Text
k = 180 - Text4.Text 'α+β的值
p = Text5.Text
c = c - 1
If c <= 0 Then
c = c + 360
End If
'a = (L1 ^ 2 + l ^ 2 - Rb ^ 2) / (2 * L1 * l)
'b= Atn(-a / Sqr(-a * a + 1)) + 2 * Atn(1),b=ψ0
Picture1.ForeColor = vbBlack
Picture1.Scale (-500, -500)-(500, 500)
Picture1.Line (-500, 0)-(500, 0)
Picture1.Line (0, -500)-(0, 500) '建立坐标系
Picture1.CurrentX = -80: Picture1.CurrentY = -50: Picture1.Print "(0,0)"
Picture1.CurrentX = -85: Picture1.CurrentY = -480: Picture1.Print "Y轴"
Picture1.CurrentX = 440: Picture1.CurrentY = 40: Picture1.Print "X轴"
If c > 0 And c <= 90 Then
 β = k - c / 3
 ElseIf c > 90 And c <= 180 Then
β = k - 30
 ElseIf c > 180 And c <= 270 Then
β = k - (90 - c / 3)
 ElseIf c > 270 And c <= 360 Then
β = k
End IfXs = -350 + l * Cos(β / 180 * π)
Ys = l * Sin(β / 180 * π) '定点(-350,0)到滚子圆心的直线方程式
Xt = -350 - 100 * Sin(π / 2 + (β - k) / 180 * π)
Yt = 100 * Cos(π / 2 + (β - k) / 180 * π) '定点(-350,0)到封装点的直线方程式
Xe = -350 + l * Cos((β + p) / 180 * π) * Cos(p / 180 * π)
Ye = l * Sin((β + p) / 180 * π) * Cos(p / 180 * π) '滚子斜干到滚子圆心的直线方程式
Picture1.ForeColor = vbBlue
Picture1.DrawWidth = 1.5
Picture1.Line (Xe, Ye)-(-350, 0)
Picture1.Line (Xe, -Ye)-(-350, 0)
Picture1.Line (Xe, Ye)-(Xs, Ys)
Picture1.Line (Xe, -Ye)-(Xs, -Ys)
Picture1.Line (Xt, Yt)-(-350, 0)
Picture1.Line (Xt, -Yt)-(-350, 0)
Picture1.Circle (Xs, Ys), Rr
Picture1.Circle (Xs, -Ys), Rr '画线和滚子
f0 = Sqr(L1 * L1 + l * l - 2 * l * L1 * Cos(k))
Xc1 = L1 * Sin((θ + c) / 180 * π) - l * Sin((k + θ + c) / 180 * π)
Yc1 = L1 * Cos((θ + c) / 180 * π) - l * Cos((k + θ + c) / 180 * π)
Xn1 = Xc + Rr * ((-L1 * Sin((θ + c) / 180 * π) + l * (g + 1) * Sin((k + c) / 180 * π)) / f0)
Yn1 = Yc - Rr * ((L1 * Cos((θ + c) / 180 * π) - l * (g + 1) * Cos((k + c) / 180 * π)) / f0)
For θ = 0 To 360 Step 0.6 'g=ψ(θ)的导数
If θ >= 0 And θ <= 90 Then
 α = θ / 3
 β = k - α
 g = -1 / 3
 ElseIf θ >= 90 And θ <= 180 Then
α = 30
β = k - α
g = 0
 ElseIf θ >= 180 And θ <= 270 Then
α = 90 - 1 / 3 * θ
β = k - α
g = 1 / 3
Else
α = 0
β = k - α
g = 0 'ψ(θ)=β-ψ0=k-α-ψ0
End If '奥尔法角α和贝塔角β的关系和ψ(θ)的导数g
Xc = L1 * Sin((θ + c) / 180 * π) - l * Sin((β + θ + c) / 180 * π)
Yc = L1 * Cos((θ + c) / 180 * π) - l * Cos((β + θ + c) / 180 * π) 'ψ(θ)+ψ0=β
Picture1.PSet (Xc, Yc), vbBlack '理论轮廓线
Picture1.PSet (Xc, -Yc), vbBlue
f = Sqr(L1 ^ 2 + l ^ 2 * (g + 1) ^ 2 - 2 * L1 * l * (g + 1) * Cos(β / 180 * π))
Xn = Xc + Rr * ((-L1 * Sin((θ + c) / 180 * π) + l * (g + 1) * Sin((β + θ + c) / 180 * π)) / f)
Yn = Yc - Rr * ((L1 * Cos((θ + c) / 180 * π) - l * (g + 1) * Cos((β + θ + c) / 180 * π)) / f)
Picture1.PSet (Xn, Yn), vbRed '理论轮廓线
Picture1.PSet (Xn, -Yn), vbYellow
    Xc1 = Xc
    Yc1 = Yc
    Xn1 = Xn
    Yn1 = Yn
Next θ
End Sub
在红色标记处是点点的步长,不知道是不是这个原因 我把STEP调大之后就差不多是点集形成不了直线,也就闪的不明显了
求大神帮忙   VB小白 前几天刚开始学的

解决方案 »

  1.   

    matlab何在
      

  2.   

    Picture1如果设置aotoredraw=false,.Cls在任何情况下都会造成闪烁Picture1的aotoredraw设置为true,绘画完毕,调用Picture1。refresh试试
      

  3.   

    2# +10086 不要直接在目标picturebox控件上绘图,因为绘制需要时间,所以看起来一闪一闪的。
    解决办法是再准备一个picturebox(GDI熟悉的话,当然DC也可以),先在这个picturebox上都画好,然后整体paint到目标picturebox上。这样即使绘制花时间,看到的也只是卡一下,但不会出现闪烁的情况了。
      

  4.   

    1)同#3,AutoRedraw + Refresh 就是用缓冲画图,VB 已经实现的。
    2)还有计时器实际频率只能做到18次/秒,你设得最高也只不过多次刷新连续调用而已。要控制动画速度不如固定频率、变更步长更有效。
      

  5.   

    动画要考虑人眼的视觉暂留效应。要不闪烁,至少要达到 16 帧/秒以上。电影的帧数是 24 帧/秒。如果是固定过程,不要现场绘制,可以事先绘制好,保存在 ImageList 中,演示时逐幅加载。