Citat:
Ursprungligen postat av
Tratten52
Hur räknar man ut den exakta distansen (storcirkeln) mellan Treriksröset och Smygehuk på 3000m höjd öh med hjälp av sfärisk geometri?
Citat:
Ursprungligen postat av
Neksnor
Nu blev det fel med med vinklarna!
Treriksröset: 69°N, 21°Ö
Smygehuk: 55°N, 13°Ö
Jorden radie: 6 371 km, sedan ska vi upp 3 km = 6374 km.
Latituden är inga konstigheter, vinkelskillnaden mellan latituderna är 69-55 = 14°, alltså 14/360 = 0,0389 varv. Hade platserna legat på samma longitud så hade avståndet varit 𝝿*2*6374*14/360 ≈ 1557 km.
När det gäller longituden kan man inte räkna så, 1° vid ekvatorn är "längre" än samma grad vid polcirkeln.
Jag har för mig att jag tidigare löste det hela genom att utgå från Guineabukten, där (den godtyckliga) Greenwichmeridianen möter ekvatorn, använda det som en sorts nollpunkt och skapa vektorer till de två punkterna. Jag minns att jag hade en funktion i mitt lilla program som räknade ut kryssprodukten.
Jag hittade mitt lilla program! (Haskell, delar av koden)
Latituder och longituder görs om till radianer, alltså "vanliga" decimaltal, sedan görs de båda positionerna om till vektorer. Jag använde 6371 som jordens radie, men i det här fallet (3000 meters höjd) får man räkna med 6371+3=6374. Och det var tydligen skalärprodukten (
dot3) som behövdes.
Kod:
lat2Rad :: Latitude -> Float
lat2Rad (N d) = d * pi / 180
lat2Rad (S d) = (-1) * d * pi / 180
long2Rad :: Longitude -> Float
long2Rad (E d) = d * pi / 180
long2Rad (W d) = (-1) * d * pi / 180
type V3 = (Float,Float,Float)
--X-axis is (N 0, E 0) to (N 0, E 180)
--Y-axis is (N 0, W 90) to (N 0, E 90)
--Z-axis is (N 90, E 0) to (S 90, E 0)
position2Vector :: Position -> V3
position2Vector (Position la lo) = (x,y,z)
where
r = earthRadius
a = lat2Rad la
b = long2Rad lo
x = r * (cos a) * (cos b)
y = r * (cos a) * (sin b)
z = r * (sin a)
dot3 :: V3 -> V3 -> Float
dot3 (x1,y1,z1) (x2,y2,z2) = x1*x2+y1*y2+z1*z2
Sedan matas allt in i
Kod:
position2Position :: Position -> Position -> Float
position2Position p1 p2 = r * (acos $ (dot3 v1 v2) / (r^2))
where
r = earthRadius
v1 = position2Vector p1
v2 = position2Vector p2
Vilket blir
6374 * (arccos (X/(6374^2)))
där
X är skälärprodukten av positionerna uttryckta som vektorer.
Tyvärr har jag inte Haskell installerat, men jag har jämfört programmet med bland annat Google Earth och det stämmer bra för att vara en förenkling (sfärisk planet mm).