做得是一个动的凸轮 就是在转动过程中会一闪一闪的
这是我设置的程序
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小白 前几天刚开始学的
这是我设置的程序
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小白 前几天刚开始学的
解决办法是再准备一个picturebox(GDI熟悉的话,当然DC也可以),先在这个picturebox上都画好,然后整体paint到目标picturebox上。这样即使绘制花时间,看到的也只是卡一下,但不会出现闪烁的情况了。
2)还有计时器实际频率只能做到18次/秒,你设得最高也只不过多次刷新连续调用而已。要控制动画速度不如固定频率、变更步长更有效。