Juzer Krzysztof Naworyta <***@datacomp.com.pl> napisał
| (...)
|| Dręczyło mnie to! Googlałem, ale jakoś nic nie utrafiłem ...
|| W domu książek matematycznych już ani jednej, pozostawione u różnych
|| krewnych i znajomych ...
||
|| Zagryzłem zęby, wziąłem ołówek i po kilku pyfkach nagryzmoliłem wzór:
||
|| OdlGeog = ArcCos(Cos(dTheta) * Cos(dFi)) * R
|
| Już wiem, że jest do doopy !
|
| Z tym dTheta za bardzo sobie uprościłem i dla dwóch przeciwległych
| punktów koło bieguna, odległych o 2 metry, funkcja zwraca mi pół
| równika!
|
| Ech, żebym pamiętał jak się "obraca" współrzędne sferyczne ...
Dobra, nie bez pomocy googla (jednak temat na najprzeróżniejszych grupach
żeglarsko/nawigacyjnych czy astronomicznych jest wałkowany non-stop!) -
udało się ! (chyba)
Przy okazji:
- przypomniałem sobie o iloczynie skalarnym wektorów i kącie między nimi
- dowiedziałem się co to jest mila morska!
To jedna minuta odległości kątowej!
(a nie jakieś pierdy, że to prawie dwa kilometry)
- dowiedziałem się dlaczego "długość geograficzna" to coś w poziomie a
"szerokość" w pionie!
(to od długości i szerokości Morza Śródziemnego, ha!)
<dygresja mode>
Kurde, tyle niepotrzebnych rzeczy wkuwało sie na geografii: roczniki
statystyczne i inne bzdury ...
Miałem straszną psorkę - postrach w województwie! I co z tego? Wkute
wylatywało góra po tygodniu/miesiącu ...
Gdyby "psorka" wyjaśniła, że to ze starożytności, człek by zapamiętał na
całe życie i nigdy się nie mylił ...)
Czemu nauczyciele nie okraszają wiedzy takimi smaczkami przeróżnymi ???
Odpowiedź jest chyba jedna: w swej większości oni pojęcia o nich nie mają!
Żenada ...
</dygresja mode>
Wzór nadal zakłada, że Ziemia jest idealną sferą. Jak komus to nie
wystarcza, niech googla dalej.
Promień Ziemi można przyjąć jako średnią z promienia równikowego i
"biegunowego" a nie wyliczać z długości równika ... Można jakieś geoidy i
inne przybliżenia kształtu Ziemi ...
Pytanie ino jaki jest błąd ... Bo dla odległości między miastami +-5 km to
chyba zupełnie akceptowalna ta idealna sfera.
Gorzej jak ktoś chce coś wyliczać na podstawie wpółrzędnych z GPS ...
Dobra, koniec gadania, poniżej modulik:
************* modulik nr 2 **************
Option Compare Database
Option Explicit
Type KAT
stopnie As Integer
minuty As Integer
sekundy As Integer
NorthEast As Boolean
End Type
Type PUNKT
lon As KAT 'długość (długość morza śródziemnom., czyli w poziomie!)
lat As KAT 'szerokość (szerokość morza śródziemnom., czyli w pionie!)
End Type
Function OdlGeog(p1 As PUNKT, p2 As PUNKT) As Double
Dim R As Double
R = 40000 / 2 / Pi ' promien ziemi (niedokładny)
OdlGeog = R * ArcCos(Sin(Deg2Rad(p2.lon)) * Sin(Deg2Rad(p1.lon)) _
+ Cos(Deg2Rad(p2.lon)) * Cos(Deg2Rad(p1.lon)) _
* Cos(Deg2Rad(p1.lat) - Deg2Rad(p2.lat)))
End Function
Function ArcCos(X)
If Abs(X) = 1 Then
ArcCos = -Sgn(X) * Pi
Else
ArcCos = Atn(-X / Sqr(-X * X + 1)) + Pi / 2
End If
End Function
Function Deg2Rad(k As KAT) As Double
Deg2Rad = (k.stopnie + k.minuty / 60& + k.sekundy / 3600&) _
* 2 * Pi / 360& * IIf(k.NorthEast, 1, -1)
End Function
Function Pi() As Double
Pi = 4 * Atn(1)
End Function
Function test()
Dim warszawa As PUNKT
Dim krakow As PUNKT
Dim seattle As PUNKT
With warszawa
With .lat
.stopnie = 21: .minuty = 2: .NorthEast = True
End With
With .lon
.stopnie = 52: .minuty = 13: .NorthEast = True
End With
End With
With krakow
With .lat
.stopnie = 19: .minuty = 57: .NorthEast = True
End With
With .lon
.stopnie = 50: .minuty = 4: .NorthEast = True
End With
End With
With seattle
With .lat
.stopnie = 122: .minuty = 20: .NorthEast = False
End With
With .lon
.stopnie = 47: .minuty = 36: .NorthEast = True
End With
End With
Debug.Print "wa-wa - krakow:", Round(OdlGeog(warszawa, krakow), 2)
Debug.Print "seattle - krakow:", Round(OdlGeog(krakow, seattle), 2)
Dim pk1 As PUNKT
Dim pk2 As PUNKT
With pk1
With .lat
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 89: .minuty = 59: .NorthEast = True
End With
End With
With pk2
With .lat
.stopnie = 180: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 89: .minuty = 59: .NorthEast = True
End With
End With
Debug.Print "pk1 - pk2:", Round(OdlGeog(pk1, pk2), 2)
With pk1
With .lat
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
End With
With pk2
With .lat
.stopnie = 180: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
End With
Debug.Print "pk1 - pk2:", Round(OdlGeog(pk1, pk2), 2)
Dim zero As PUNKT
Dim mila1 As PUNKT
Dim mila2 As PUNKT
With zero
With .lat
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
End With
With mila1
With .lat
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
With .lon
.stopnie = 0: .minuty = 1: .NorthEast = True
End With
End With
With mila2
With .lat
.stopnie = 0: .minuty = 1: .NorthEast = True
End With
With .lon
.stopnie = 0: .minuty = 0: .NorthEast = True
End With
End With
Debug.Print "mila morska1:", Round(OdlGeog(zero, mila1), 3)
Debug.Print "mila morska2:", Round(OdlGeog(zero, mila2), 3)
End Function
*********** koniec modulika **********
kw: szerokosc, dlugosc geograficzna, odleglosc katowa, sfera
--
KN
(MVP, M$ Office Access)
archiwum grupy:
http://groups.google.pl/advanced_group_search
(grupa: pl*msaccess)