Отже, проблема зводиться до перетину лінії зі сферою, що легко.
Ось деталі. Вхідні дані - точки P1 = (lat1, lon1) і P2 = (lat2, lon2) на земній поверхні, що розглядаються як сфера, і два відповідні радіуси r1 і r2.
Перетворити (лат, lon) в (x, y, z) геоцентричні координати. Як завжди, тому що ми можемо вибрати одиниці вимірювання, у яких Земля має одиничний радіус,
x = cos(lon) cos(lat)
y = sin(lon) cos(lat)
z = sin(lat).
У прикладі P1 = (-90.234036 градусів, 37.673442 градусів) має геоцентричні координати x1 = (-0.00323306, -0.7915, 0.61116), а P2 = (-90.953669 ступінь, 36.109997 градусів) має геоцентричні координати x2 = (-0.0134464, -0.8080) , 0,589337).
Перетворіть радіуси r1 і r2 (які вимірюються вздовж сфери) в кути вздовж сфери. За визначенням, одна морська миля (НМ) - це 1/60 градусного рівня дуги (що становить pi / 180 * 1/60 = 0,0002908888 радіанів). Тому, як кути,
r1 = 107.5 / 60 Degree = 0.0312705 radian
r2 = 145 / 60 Degree = 0.0421788 radian
Геодезичний коло радіуса r1 навколо x1 є перетином поверхні Землі з евклідової сфери радіуса гріха (r1) з центром в Cos (r1) * x1.
Площина, що визначається перетином сфери радіуса sin (r1) навколо cos (r1) * x1, а земна поверхня перпендикулярна x1 і проходить через точку cos (r1) x1, звідки її рівняння x.x1 = cos (r1) ("." являє собою звичайний крапковий продукт ); аналогічно для іншої площини. На перетині цих двох площин буде унікальна точка x0, що є лінійною комбінацією x1 і x2. Записуючи x0 = a x1 + b * x2 два плоских рівняння
cos(r1) = x.x1 = (a*x1 + b*x2).x1 = a + b*(x2.x1)
cos(r2) = x.x2 = (a*x1 + b*x2).x2 = a*(x1.x2) + b
Використовуючи той факт, що x2.x1 = x1.x2, який я запишу як q, рішення (якщо воно існує) задається
a = (cos(r1) - cos(r2)*q) / (1 - q^2),
b = (cos(r2) - cos(r1)*q) / (1 - q^2).
У прикладі запуску я обчислюю a = 0,973503 і b = 0,0260194.
Очевидно, що нам потрібно q ^ 2! = 1. Це означає, що x1 і x2 не можуть бути ні однаковою, ні антиподальною.
Тепер усі інші точки на лінії перетину двох площин відрізняються від x0 деяким кратним вектора n, який взаємно перпендикулярний обом площинам. Хрестовий виріб
n = x1~Cross~x2
чи задана робота n є ненульовою: ще раз це означає, що x1 і x2 не є ні збігом, ні діаметрально протилежними. (Нам потрібно подбати про обчислення поперечного добутку з високою точністю, оскільки воно включає віднімання з великою кількістю скасування, коли х1 і х2 близькі один до одного.) У прикладі n = (0,0272194, -0,00631254, -0,00803124) .
Тому ми шукаємо до двох точок вигляду x0 + t * n, які лежать на земній поверхні: тобто їх довжина дорівнює 1. Еквівалентно, що їх довжина в квадраті дорівнює 1:
1 = squared length = (x0 + t*n).(x0 + t*n) = x0.x0 + 2t*x0.n + t^2*n.n = x0.x0 + t^2*n.n
Термін з x0.n зникає, оскільки x0 (будучи лінійною комбінацією x1 і x2) перпендикулярно n. Два рішення легко
t = sqrt((1 - x0.x0)/n.n)
і його негативний. Ще раз вимагається висока точність, тому що, коли x1 і x2 близькі, x0.x0 дуже близький до 1, що призводить до деякої втрати точності з плаваючою точкою. У прикладі t = 1,07509 або t = -1,07509. Тому дві точки перетину рівні
x0 + t*n = (0.0257661, -0.798332, 0.601666)
x0 - t*n = (-0.0327606, -0.784759, 0.618935)
Нарешті, ми можемо перетворити ці рішення назад у (lat, lon), перетворивши геоцентричні (x, y, z) в географічні координати:
lon = ArcTan(x,y)
lat = ArcTan(Sqrt[x^2+y^2], z)
Для довготи використовуйте узагальнені значення повернення арктангенту в діапазоні від -180 до 180 градусів (при обчислювальних програмах ця функція приймає як аргументи x, так і y, а не просто співвідношення y / x; її іноді називають "ATan2").
Я отримую два рішення (-88.151426, 36.989311) та (-92.390485, 38.238380), зображені на рисунку у вигляді жовтих крапок.
На осях відображаються геоцентричні координати (x, y, z). Сірий наліт - це частина земної поверхні від -95 до -87 градусів довготи, широта від 33 до 40 градусів (відмічена в один градус решіткою). Земна поверхня була зроблена частково прозорою для показу всіх трьох сфер. Правильність обчислених рішень очевидна тим, як жовті точки сидять на перетинах сфер.