1Attribute VB_Name = "Geodesic"
2Option Explicit
3
4'   Declare the DLL functions
5
6Private Declare PtrSafe Sub gdirect Lib "cgeodesic.dll" _
7(ByVal lat1 As Double, ByVal lon1 As Double, _
8 ByVal azi1 As Double, ByVal s12 As Double, _
9 ByRef lat2 As Double, ByRef lon2 As Double, ByRef azi2 As Double)
10
11Private Declare PtrSafe Sub ginverse Lib "cgeodesic.dll" _
12(ByVal lat1 As Double, ByVal lon1 As Double, _
13 ByVal lat2 As Double, ByVal lon2 As Double, _
14 ByRef s12 As Double, ByRef azi1 As Double, ByRef azi2 As Double)
15
16Private Declare PtrSafe Sub rdirect Lib "cgeodesic.dll" _
17(ByVal lat1 As Double, ByVal lon1 As Double, _
18 ByVal azi12 As Double, ByVal s12 As Double, _
19 ByRef lat2 As Double, ByRef lon2 As Double)
20
21Private Declare PtrSafe Sub rinverse Lib "cgeodesic.dll" _
22(ByVal lat1 As Double, ByVal lon1 As Double, _
23 ByVal lat2 As Double, ByVal lon2 As Double, _
24 ByRef s12 As Double, ByRef azi12 As Double)
25
26'   Define the custom worksheet functions that call the DLL functions
27
28Function geodesic_direct_lat2(lat1 As Double, lon1 As Double, _
29                              azi1 As Double, s12 As Double) As Double
30  Attribute geodesic_direct_lat2.VB_Description = _
31    "Solves direct geodesic problem for lat2."
32  Dim lat2 As Double
33  Dim lon2 As Double
34  Dim azi2 As Double
35  Call gdirect(lat1, lon1, azi1, s12, lat2, lon2, azi2)
36  geodesic_direct_lat2 = lat2
37End Function
38
39Function geodesic_direct_lon2(lat1 As Double, lon1 As Double, _
40                              azi1 As Double, s12 As Double) As Double
41  Attribute geodesic_direct_lon2.VB_Description = _
42    "Solves direct geodesic problem for lon2."
43  Dim lat2 As Double
44  Dim lon2 As Double
45  Dim azi2 As Double
46  Call gdirect(lat1, lon1, azi1, s12, lat2, lon2, azi2)
47  geodesic_direct_lon2 = lon2
48End Function
49
50Function geodesic_direct_azi2(lat1 As Double, lon1 As Double, _
51                              azi1 As Double, s12 As Double) As Double
52  Attribute geodesic_direct_azi2.VB_Description = _
53    "Solves direct geodesic problem for azi2."
54  Dim lat2 As Double
55  Dim lon2 As Double
56  Dim azi2 As Double
57  Call gdirect(lat1, lon1, azi1, s12, lat2, lon2, azi2)
58  geodesic_direct_azi2 = azi2
59End Function
60
61Function geodesic_inverse_s12(lat1 As Double, lon1 As Double, _
62                              lat2 As Double, lon2 As Double) As Double
63  Attribute geodesic_inverse_s12.VB_Description = _
64    "Solves inverse geodesic problem for s12."
65  Dim s12 As Double
66  Dim azi1 As Double
67  Dim azi2 As Double
68  Call ginverse(lat1, lon1, lat2, lon2, s12, azi1, azi2)
69  geodesic_inverse_s12 = s12
70End Function
71
72Function geodesic_inverse_azi1(lat1 As Double, lon1 As Double, _
73                               lat2 As Double, lon2 As Double) As Double
74  Attribute geodesic_inverse_azi1.VB_Description = _
75    "Solves inverse geodesic problem for azi1."
76  Dim s12 As Double
77  Dim azi1 As Double
78  Dim azi2 As Double
79  Call ginverse(lat1, lon1, lat2, lon2, s12, azi1, azi2)
80  geodesic_inverse_azi1 = azi1
81End Function
82
83Function geodesic_inverse_azi2(lat1 As Double, lon1 As Double, _
84                               lat2 As Double, lon2 As Double) As Double
85  Attribute geodesic_inverse_azi2.VB_Description = _
86    "Solves inverse geodesic problem for azi2."
87  Dim s12 As Double
88  Dim azi1 As Double
89  Dim azi2 As Double
90  Call ginverse(lat1, lon1, lat2, lon2, s12, azi1, azi2)
91  geodesic_inverse_azi2 = azi2
92End Function
93
94Function rhumb_direct_lat2(lat1 As Double, lon1 As Double, _
95                           azi12 As Double, s12 As Double) As Double
96  Attribute rhumb_direct_lat2.VB_Description = _
97    "Solves direct rhumb problem for lat2."
98  Dim lat2 As Double
99  Dim lon2 As Double
100  Call rdirect(lat1, lon1, azi12, s12, lat2, lon2)
101  rhumb_direct_lat2 = lat2
102End Function
103
104Function rhumb_direct_lon2(lat1 As Double, lon1 As Double, _
105                           azi12 As Double, s12 As Double) As Double
106  Attribute rhumb_direct_lon2.VB_Description = _
107    "Solves direct rhumb problem for lon2."
108  Dim lat2 As Double
109  Dim lon2 As Double
110  Call rdirect(lat1, lon1, azi12, s12, lat2, lon2)
111  rhumb_direct_lon2 = lon2
112End Function
113
114Function rhumb_inverse_s12(lat1 As Double, lon1 As Double, _
115                           lat2 As Double, lon2 As Double) As Double
116  Attribute rhumb_inverse_s12.VB_Description = _
117    "Solves inverse rhumb problem for s12."
118  Dim s12 As Double
119  Dim azi12 As Double
120  Call rinverse(lat1, lon1, lat2, lon2, s12, azi12)
121  rhumb_inverse_s12 = s12
122End Function
123
124Function rhumb_inverse_azi12(lat1 As Double, lon1 As Double, _
125                             lat2 As Double, lon2 As Double) As Double
126  Attribute rhumb_inverse_azi12.VB_Description = _
127    "Solves inverse rhumb problem for azi12."
128  Dim s12 As Double
129  Dim azi12 As Double
130  Call rinverse(lat1, lon1, lat2, lon2, s12, azi12)
131  rhumb_inverse_azi12 = azi12
132End Function
133