Option Explicit
Const Pi = 245850922 / 78256779 ' Sin(Pi) = 1,22460635382238E-16
' Tandis que: Sin(3.14159265358979) = 32,3108510433268 E-16
Const Pi×2 = 2 * Pi
Private Sub CommandButton1_Click()
Dim T0 As Single, T1 As Single, N&
T0 = VBA.Timer
For N = 1 To 50
Frame2.Left = IntpoRal(N, 0, 266, 50, 6)
Do: DoEvents: T1 = VBA.Timer: Loop Until T1 <> T0
T0 = T1: Next N
End Sub
Private Sub CommandButton2_Click()
Dim T0 As Single, T1 As Single, N&
T0 = VBA.Timer
For N = 1 To 50
Frame2.Left = IntpoAcc(N, 0, 6, 50, 266)
Do: DoEvents: T1 = VBA.Timer: Loop Until T1 <> T0
T0 = T1: Next N
End Sub
Private Sub UserForm_Initialize()
Me.Width = 262
Frame2.Left = 266
Frame2.Top = 6
End Sub
'
Function IntpoCyc(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
ByVal X2 As Double, ByVal Y2 As Double) As Double
IntpoCyc = Y1 + (Y2 - Y1) * Cyclo((X - X1) / (X2 - X1))
End Function
Function Cyclo(ByVal X As Double) As Double: Cyclo = Min(Max(0, X - Sin(X * Pi×2) / Pi×2), 1): End Function
Function IntpoRal(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
ByVal X2 As Double, ByVal Y2 As Double) As Double
IntpoRal = Y1 + (Y2 - Y1) * CycRal((X - X1) / (X2 - X1))
End Function
Function CycRal(ByVal X As Double) As Double: CycRal = Min(X * 2, X + Sin(X * Pi) / Pi, 1): End Function
Function IntpoAcc(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
ByVal X2 As Double, ByVal Y2 As Double) As Double
IntpoAcc = Y1 + (Y2 - Y1) * CycAcc((X - X1) / (X2 - X1))
End Function
Function CycAcc(ByVal X As Double) As Double: CycAcc = Max(0, X - Sin(X * Pi) / Pi, X * 2 - 1): End Function
'
Function Max(ByVal Vr As Variant, ParamArray Vs() As Variant) As Variant
Dim N As Long: For N = 0 To UBound(Vs): If Vs(N) > Vr Then Vr = Vs(N)
Next N: Max = Vr: End Function
Function Min(ByVal Vr As Variant, ParamArray Vs() As Variant) As Variant
Dim N As Long: For N = 0 To UBound(Vs): If Vs(N) < Vr Then Vr = Vs(N)
Next N: Min = Vr: End Function