Вычисление азимута и угла между двумя прямыми для прямоугольных координат

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/aveazimuth.html


Немного геометрии для решения задачи нахождения азимута, используемый код может применяться в других расширениях.

<right>спасибо Алексею Таченкову за помощь с геометрией</right>

Вычисление азимута

Азимут - взятый из одной точки на другую - есть угол отклонения прямой, полученной соединением двух данных точек (А и B), от прямой проведенной на север из точки номер один, угол считается по часовой стрелке.

Azimuth-01.gif

A {X1,Y1}
B {X2,Y2}
C {X1,Y2}

Расстояние между двумя точками:

Azimuth-02.gif

Исходя из теоремы косинусов и теоремы Пифагора:

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+бета

Azimuth-03.gif

Вычислениям приведенным выше соответствует следующий код на языке 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

Вычисление угла между двумя прямыми (тремя точками)

Azimuth-04.gif

Из теоремы косинусов:

Azimuth-05.gif

На 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


Ссылки по теме