Итак, как обещал, проведено небольшое упражнение по выведению формул навигации по маячкам. Задачу поручил сыну
, и вот что он вывел.
Итак,
Дано:
1) три точки (A,B,C) с известными координатами ((XA;YA), (XB;YB), (XC;YC));
2) два угла (AB, BC), под которыми каждая пара точек видна из искомой
Найти:
Координаты искомой точки D (XD, YD).
Для решения нам понадобится теорема о вписанном угле и её следствия (
https://ru.wikipedia.org/wiki/%D0%92%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%83%D0%B3%D0%BE%D0%BB).
"Вписанные углы, опирающиеся на одну дугу, равны." - это очень важно и означает, что все точки, из которых точки А и B видны под одним углом AB находятся на дуге окружности, проходящей через A и B. То есть, как только мы измерили угол AB мы сразу же поняли, что мы находимся где-то на этой окружности. И чтобы найти конкретную точку на этой окружности остаётся замерить ещё один угол и построить пересечение окружностей. В этом, собственно и вся задача - по каждому из углов построить окружность и найти точку их пересечения, всё!
Дальше идёт несколько страниц выкладок (в популярной книжке предлагается в таких случаях в этом месте писать "очевидно что"
) и вот итоговые формулы:
- Код: Выделить всё
XD = XA + 2T*(YR1-YR2)
YD = YA + 2T*(XR2-XR1)
где
T = ((YA-YR1)*(XR1-XR2)+(XA-XR1)*(YR2-YR1)) / ((YR1-YR2)^2 +(XR2-XR1)^2);
XR1 = (XA + XB + ctg(AB)*(YB-YA))/2;
YR1 = (YA + YB + ctg(AB)*(XA-XB))/2;
XR2 = (XA + XC + ctg(AC)*(YC-YA))/2;
YR2 = (YA + YC + ctg(AC)*(XA-XC))/2;
Надеюсь, нигде не опечатался.
Важные выводы, которые надо учесть.
1) Углы надо мерить с учётом знака. Т.е По часовой стрелке если А левее B, то AB - положительный, а BA - отрицательный. А то окажетесь по другую сторону точек A и B.
2) Информации по трём точкам не достаточно. Как только робот окажется на окружности, проходящей через все три точки A, B, C, так он не сможет определить свою координату. Сможет только сказать что он где-то на этой окружности. С этой окружности все точки видны под одинаковыми углами. Технически это можно решить разными способами, важно знать об этом.
3) Следствие из 2). Если у вас прямоугольная комната и вы разместите 3 или 4 маячка по углам - в углах робот не сможет понять (без дополнительной информации) где он находится. Только сможет понять что он где-то на окружности.
4) Следствие из 2). Если размещать 4 маячка, то надо их размещать так, чтобы они не лежали на одной окружности.
Как видим, формулы получились громоздкими, но не ресурсоёмкими. Кроме вычисления котангенса там ничего не нагрузит процессор.