Вычисление азимута и угла между двумя прямыми для прямоугольных координат
Немного геометрии для решения задачи нахождения азимута, используемый код может применяться в других расширениях. |
спасибо Алексею Таченкову за помощь
с геометрией
Вычисление азимута
Азимут - взятый из одной точки на другую - есть угол
отклонения прямой, полученной соединением двух данных точек
(А и B), от прямой проведенной на север из точки номер один, угол
считается по часовой стрелке.
A {X1,Y1}
B {X2,Y2}
C {X1,Y2}
Расстояние между двумя точками:

Исходя из теоремы косинусов и теоремы Пифагора:
BC2 = AB2+AC2 - 2AB*AC*cos(бета)
AB2 = AC2+BC2 (так как треугольник прямоугольный)
бета = arccos(AC/AB)
Существует 4 возможных варианта зависящих от взаимного
расположения точек A и B, в данном примере мы определяем азимут от точки А на точку B, dX = X1 - X2, dY = Y1 - Y2:
1. Точка B находится выше и правее точки А, dX < 0, dY < 0 (рис.1).
Азимут (альфа) = 90-бета
2. Точка B находится ниже и правее точки
А,dX < 0, dY > 0 (рис. 2)
Азимут (альфа) = 90+бета
3. Точка B находится ниже и левее точки
A, dX > 0, dY > 0 (рис. 3)
Азимут (альфа) = 270-бета
4. Точка B находится выше и левее точки
A, dX > 0, dY < 0 (рис. 4)
Азимут (альфа) = 270+бета

Вычислениям приведенным выше соответствует следующий
код на языке Avenue (pt2 - точка А, pt1 - точка B):
dX = pt2.getx - pt1.getx
dY = pt2.gety - pt1.gety
dist = ((dX*dX) + (dY*dY)).sqrt
dXa = dX.abs
beta = (dXa / dist).ACos.AsDegrees
if (dX > 0) then
if (dY < 0) then
angle = 270 + beta
else
angle = 270 - beta
end
else
if (dY < 0) then
angle = 90 - beta
else
angle = 90 + beta
end
end |
Вычисление угла между двумя прямыми (тремя точками)
Из
теоремы косинусов:

На Avenue:
ab = a.distance(b)
bc = b.distance(c)
ac = a.distance(c)
alpha = (((ab^2)+(ac^2) - (bc^2))/(2*ab*ac)).ACos.AsDegrees |
Обсудить в форуме (Комментариев - 2)
См. также:
Вычисление расстояний на сфере >>>
Вычисление азимута из одной точки на другую и угла образованного тремя точками на сфере >>>
|
Последнее обновление: August 01 2007 (Наверх) |