Option Explicit
Private Const m_iTimes = 100000
Private Const PI = 3.14159265358979
Private Const HALFPI = 1.5707963267949
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim l As Long
Dim ang As Single
Dim t1 As Long, t2 As Long, t3 As Long, t4 As Long
Randomize Timer
t1 = GetTickCount()
For l = 1 To m_iTimes
ang = GetAngle(Rnd, Rnd, Rnd, Rnd)
Next l
t2 = GetTickCount()
For l = 1 To m_iTimes
ang = GetAngle1(Rnd, Rnd, Rnd, Rnd)
Next l
t3 = GetTickCount()
For l = 1 To m_iTimes
ang = GetAngle2(Rnd, Rnd, Rnd, Rnd)
Next l
t4 = GetTickCount()
MsgBox "First function: " & (t2 - t1) & vbCrLf & _
"Second function: " & (t3 - t2) & vbCrLf & _
"Third function: " & (t4 - t3)
End Sub
Private Function GetAngle(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single) As Single
On Error Resume Next
Dim XDiff As Long
Dim YDiff As Long
Dim Angle As Single
XDiff = Abs(X1 - X2)
YDiff = Abs(Y2 - Y1)
Angle = Atn(XDiff / YDiff)
Angle = Angle * 180 / PI
If Y2 > Y1 Then Angle = 180 - Angle
If X2 < X1 Then Angle = 0 - Angle
If Angle < 0 Then Angle = 360 + Angle
If YDiff = 0 And X1 - X2 < 0 Then
Angle = 90
End If
If YDiff = 0 And X1 - X2 > 0 Then
Angle = 270
End If
GetAngle = Angle
End Function
Private Function GetAngle1(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double) As Double
On Error Resume Next
Dim XDiff As Double
Dim YDiff As Double
Dim Angle As Double
XDiff = Abs(X1 - X2)
YDiff = Abs(Y2 - Y1)
Angle = Atn(XDiff / YDiff)
Angle = Angle * 180 / PI
If Y2 > Y1 Then Angle = 180 - Angle
If X2 < X1 Then Angle = 0 - Angle
If Angle < 0 Then Angle = 360 + Angle
If YDiff = 0 And X1 - X2 < 0 Then
Angle = 90
End If
If YDiff = 0 And X1 - X2 > 0 Then
Angle = 270
End If
GetAngle1 = Angle
End Function
Private Function GetAngle2(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double) As Double
Dim XDiff As Double, YDiff As Double
XDiff = X2 - X1
YDiff = Y2 - Y1
GetAngle2 = Arctan2(YDiff, XDiff)
If GetAngle2 < 0 Then GetAngle2 = GetAngle2 + 2 * PI
GetAngle2 = GetAngle2 * 180 / PI
End Function
Public Function Arctan2(y As Double, x As Double) As Double
If x = 0 Then
If y > 0 Then
Arctan2 = HALFPI
Else
Arctan2 = -HALFPI
End If
ElseIf x > 0 Then
Arctan2 = Atn(y / x)
Else
If y < 0 Then
Arctan2 = Atn(y / x) - PI
Else
Arctan2 = Atn(y / x) + PI
End If
End If
End Function