


做得是一個動的凸輪 就是在轉動程序中會一閃一閃的
這是我設定的程式
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 If
Xs = -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小白 前幾天剛開始學的
uj5u.com熱心網友回復:
閃就閃了,課程設計無所謂這些的,有興趣的話找找雙緩沖的介紹uj5u.com熱心網友回復:
matlab何在。。。uj5u.com熱心網友回復:
Picture1如果設定aotoredraw=false,.Cls在任何情況下都會造成閃爍Picture1的aotoredraw設定為true,繪畫完畢,呼叫Picture1。refresh試試
uj5u.com熱心網友回復:
2# +10086
不要直接在目標picturebox控制元件上繪圖,因為繪制需要時間,所以看起來一閃一閃的。
解決辦法是再準備一個picturebox(GDI熟悉的話,當然DC也可以),先在這個picturebox上都畫好,然后整體paint到目標picturebox上。這樣即使繪制花時間,看到的也只是卡一下,但不會出現閃爍的情況了。
uj5u.com熱心網友回復:
1)同#3,AutoRedraw + Refresh 就是用緩沖畫圖,VB 已經實作的。2)還有計時器實際頻率只能做到18次/秒,你設得最高也只不過多次重繪連續呼叫而已。要控制影片速度不如固定頻率、變更步長更有效。
uj5u.com熱心網友回復:
影片要考慮人眼的視覺暫留效應。要不閃爍,至少要達到 16 幀/秒以上。電影的幀數是 24 幀/秒。如果是固定程序,不要現場繪制,可以事先繪制好,保存在 ImageList 中,演示時逐幅加載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/99646.html
標籤:控件
