Как найти угол между двумя точек

Вступление

Итак, начать стоит с того, что Вы поставили некорректное условие, так как угол –

геометрическая фигура, образованная двумя лучами (сторонами угла), выходящими из одной точки (которая называется вершиной угла).

В свою очередь луч –

часть прямой, состоящая из данной точки и всех точек, лежащих по одну сторону от неё. Любая точка на прямой разделяет прямую на два луча.

В свою же очередь одна единственная прямая проходит через 2 точки => для построения угла требуется части 2-х пересекающихся прямых (с одной общей точкой) => 2 * 2 – 1 = 3 точки

Таким образом мы получаем очевидный для всех факт: не может быть между двумя точками какого-либо угла


Немного теории

Отойдем ненадолго от разъяснений геометрии за N класс средней школы и все таки попытаемся догадаться, что же Вам нужно

Как я понимаю, Вы моделируете движение машины в плоскости xOy. Так как машина движется, она имеет некоторый вектор, характеризующий ее перемещение.

Предположу, что машина выехала из точки (0; 0) => если ее текущие координаты равны (x; y), то вектор перемещения равен { x – 0; y – 0; } = { x; y; }

Однако так как Вам требуется найти угол для поворота машины, Вам бы следовало использовать вектор ее скорости, но Вы нас обделили информацией о нем, так что предположу, что он сонаправлен с вектором перемещения

Итак. На данном шаге у нас есть вектор и точка, итого: 3 точки. Для расчета угла более чем достаточно

Далее находим направляющий вектор из начала координат в необходимую точку и находим наименьший угол между двумя имеющимися векторами (a и b) по формуле:

cos(α) = (a * b) / (|a| * |b|)

Пример

Попробуем на примере:

Пусть машина располагается в точке (1; 2.5), а пункт назначения – в точке (3; 3):

пример

a = { 1; 2.5 }
b = { 3; 3 }

cos(α) = (1*3 + 2.5*3) / (sqrt(1*1 + 2.5*2.5) * sqrt(3*3 + 3*3)) ≈ 0.91914503001

=>

α = arccos(0.91914503001) ≈ 0.404891786 rad ≈ 23.1985905 deg

Вот мы и получили заветный угол, который примерно равен 23 градусам

На сием курс геометрии окончен, переходим к программной реализации


Реализация

Набросаем такую функцию:

private static double GetAngle(Point Machine, Point Destination)
{
    // Получим косинус угла по формуле
    double cos = Math.Round((Machine.X * Destination.X + Machine.Y * Destination.Y) / (Math.Sqrt(Machine.X * Machine.X + Machine.Y * Machine.Y) * Math.Sqrt(Destination.X * Destination.X + Destination.Y * Destination.Y)), 9);
    // Вернем arccos полученного значения (в радианах!)
    return Math.Acos(cos);
}

Судя по значениям в Вашем примере, которые явно больше единицы, Вы используете не радианную, а градусную меру, а посему значение, которое вернет Вам функция, необходимо будет преобразовать по формуле:

dAngle = rAngle * 180 / Pi

То есть так:

// Переведем угол в градусы
private static double ToDegrees(double Angle) => Angle * 180 / Math.PI;

Протестируем:

Пусть машина располагается в точке (-3; -3), а пункт назначения – в точке (3; 3):

пример2

Найдем угол:

Console.WriteLine(ToDegrees(GetAngle(new Point(-3, -3), new Point(3, 3)))); // 180

180 градусов, что, очевидно, является чистейшей правдой!


Итоги

Старайтесь не забывать, что программирование состоит не только из набора текста, но и из применения знаний некой предметной области, с которой Вы соприкасаетесь в рамках проекта.

Чего-то не знаете? Читайте и узнавайте по теме как можно больше!

И да, подчеркну, что представленный выше метод будет работать только если Ваша машинка прямолинейно удаляется от начала координат (т.е. векторы перемещения и скорости сонаправлены), однако стоит машине развернуться и поехать в сторону точки (0; 0), как все сломается!
Чтобы решить проблему, Вам необходимо знать, в какую сторону движется автомобиль. Я не знаю деталей Вашей реализации, так что могу предложить кэшировать предыдущую точку, в которой был автомобиль, после чего уже передвигать его на новую. Тем самым Вы спокойно в любой момент времени найдете вектор скорости машины и примените его в расписанном выше алгоритме

Как найти угол между точками на «почти единичной окружности»?

Есть пространство 500х500, с центром O(250, 250)
Есть точка А(112,392)

Как найти угол a ?

Такая формула возвращает всегда угол от 0 до 90:

Необходимо, чтобы функция возвращала угол от 0 до 360 в какой бы четверти не была точка А.
Тригонометрию прогуливал в школе, увы.

Вычислить угол между двумя точками широты/долготы

Есть ли способ вычислить угол между двумя точками широты/долготы?

То, что я пытаюсь достичь, – это знать, куда движется пользователь. Например, пользователь движется на север, юг, юго-восток и т.д.

Но у меня есть только две точки (Lng/Ltd)

ОТВЕТЫ

Ответ 1

используя эту ссылку для расчета угла:

Ответ 2

Вы просто можете использовать карты google для расчета:

Ответ 3

Общая формула для вычисления угла (подшипника) между двумя точками выглядит следующим образом:

Обратите внимание, что угол (θ) должен быть преобразован в радианы перед использованием этой формулы и Δlong = long2 – long1.

atan2 – общая функция, встречающаяся почти во всех языках программирования (в основном в Math-пакете/библиотеке). Обычно существуют также функции преобразования между градусами и радианами (также в Math-пакете/библиотеке).

Помните, что atan2 возвращает значения в диапазоне -π. + π, чтобы преобразовать результат в компас, вам нужно умножить θ на 180/π, затем используйте (θ + 360)% 360, где% является операцией деления модуля, возвращающей остальную часть деления.

Следующая ссылка является хорошим ресурсом для формул, включающих широты и долготы. Они также предоставляют Javascript реализацию своих формул. Фактически, этот ответ основан на информации с этой страницы:

Ответ 4

Основываясь на ответе Nayanesh Gupte, ниже приведена реализация на Python того, как рассчитать angular между двумя точками, определяемыми их широтой и долготой:

Где angular 0 градусов указывает направление на север.

Ответ 5

Пример кода javascript, если расстояние между точками меньше –

Ответ 6

В Javascript я создаю имя функции angleFromCoordinate в котором я angleFromCoordinate два значения lat/lng. Эта функция будет возвращать ангела между этими двумя широтами

Фрагмент рабочего кода

Ответ 7

Я думаю, что вам нужны вычисления для Great Circle.

Ответ 8

Ответ 9

Если вы используете Google Maps (Android), есть простой способ – использовать SphericalUtil

Рассмотрим, что у нас есть 2 точки и его широта и долгота Затем создайте его объект Latlng

После получения 2 очков, используйте sperical util для определения угла

SpericalValue – это angular. Предположим, у вас есть значок автомобиля и поверните его в соответствии с направлением движения. Здесь его от latLng1 до latLng2 затем

используйте метод ниже, чтобы повернуть

Простой способ получить убер как вращающиеся иконки

Примечание. – Возможно, вам придется добавить смещение, скажем, 90 градусов, если значок маркера не направлен на ноль градусов

Android sphericalutil с открытым исходным кодом, если вы используете Java, обратитесь к нему, вы можете использовать его.

Ответ 10

Возможно, это то, что вы хотите:

Ответ 11

Для тех, кто использует C/С++, ниже приведен протестированный код:

Ответ 12

Если кому-то нужен код PHP для этой функции:

Ответ 13

Чтобы предоставить заголовок, вам нужно вычислить несущий.

Чтобы понять значение подшипника, прочитайте в этой статье.

В соответствии с этой статьей (раздел подшипника) формула:

Вот пример того, как вычислить угол (в градусах) между двумя точками, выраженный в Lat/Lon. (сделано на С#)

Скажем, Point – простой класс с двумя атрибутами double X (для долготы) и Y (для широты).

Используя следующие методы:

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

Ответ 14

Если вам требуется точный метод для эллипсоида вращения (т.е. WGS 84), алгоритмы становятся действительно тяжелыми. Вы можете воспользоваться GeographicLib, которая была реализована в C/C++, Java, JavaScript, Python, Matlab/Octave и других.

геодезический

Геодезическая – это кратчайший путь между двумя точками на изогнутой поверхности. Это наиболее распространенная интерпретация того, куда “направляется пользователь” (из вопроса), поскольку она является самой короткой и наиболее прямой. Обратный геодезический расчет можно решить с помощью GeodSolve. Вы также можете использовать онлайн-интерфейс. Этот инструмент имеет вход/выход:

lat1 lon1 lat2 lon2 → azi1 azi2 s12

Где lat1 lon1 – пара координат для первой точки, а lat2 lon2 – пара координат для второй точки. Все единицы даны в градусах (не в радианах). Результат, azi1 или α 1, представляет собой азимут (он же азимут) от начальной точки в градусах по часовой стрелке с севера. Второй азимут находится во второй точке, поскольку угол между двумя точками вдоль геодезической не является постоянным. А s12 – это расстояние между двумя точками в метрах с точностью до 15 нм.

Прямая линия

Прямая линия соединяет две координатные точки с постоянным азимутом (или азимутом). Вычисление обратной прямой линии может быть решено с помощью RhumbSolve. Вы также можете использовать онлайн-интерфейс. Этот инструмент имеет вход/выход:

lat1 lon1 lat2 lon2 → azi12 s12

Эти параметры такие же, как у GeodSolve, за исключением того, что azi12 является постоянным углом между точками.

Ответ 15

Удостоверьтесь в том, что его нисходящая линия не имеет большого радиуса начальные изменения подшипника в зависимости от расстояния

Ответ 16

Рассмотрение ответа Nayanesh Gupte и его комментариев. Я изменил часть кода и написал его в PHP .

  • широта и долгота были преобразованы в радиан внутри функции.

Всё про окружность и круг

Окружность – это геометрическое место точек плоскости, равноудаленных от некоторой заданной точки (центра окружности). Расстояние между любой точкой окружности и ее центром называется радиусом окружности (радиус обозначают буквой R).
Значит, окружность — это линия на плоскости, каждая точка которой расположена на одинаковом расстоянии от центра окружности.

Кругом называется часть плоскости, ограниченная окружностью и включающая ее центр.

Отрезок, соединяющий две точки окружности, называется хордой. Хорда, проходящая через центр окружности, представляет собой диаметр. Диаметр окружности равен ее удвоенному радиусу: D = 2R.

Точка пересечения двух хорд делит каждую хорду на отрезки, произведение которых одинаково: a1a2 = b1b2

Касательная к окружности всегда перпендикулярна радиусу, проведенному в точку касания.

Отрезки касательных к окружности, проведенные из одной точки, равны: AB = AC, центр окружности лежит на биссектрисе угла BAC.

Квадрат касательной равен произведению секущей на ее внешнюю часть

Центральный угол – это угол, вершина которого совпадает с центром окружности.

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

Мерой дуги (в градусах или радианах) является центральный угол, опирающийся на данную дугу.

Вписанный угол это угол, вершина которого лежит на окружности, а cтороны угла пересекают ее.

Вписанный угол равен половине центрального, если оба угла опираются на одну и ту же дугу окружности.
Внутренние углы, опирающиеся на одну и ту же дугу, равны.

Сектором круга называется геометрическая фигура, ограниченная двумя радиусами и дугой, на которую опираются данные радиусы.

Периметр сектора: P = s + 2R.

Площадь сектора: S = Rs/2 = ПR 2 а/360°.

Сегментом круга называется геометрическая фигура, ограниченная хордой и стягиваемой ею дугой.

[spoiler title=”источники:”]

http://ask-dev.ru/info/394052/calculate-angle-between-two-latitudelongitude-points

http://www.stranamam.ru/post/8974384/

[/spoiler]

my-nickname

Как узнать угол между двумя точками?

Мне надо провести линию от точки до точки. Длину линии я узнал, как теперь получить угол наклона?
https://jsfiddle.net/slavik_210/bvqLc3wx/13/


  • Вопрос задан

    более трёх лет назад

  • 3649 просмотров


Комментировать


Решения вопроса 2

delphinpro

Строго говоря, между двумя точками не может быть никакого угла.

DirecTwiX

DTX

@DirecTwiX

“display: flex;” уже предлагали?

tgA = dy/dx
A = arctg(dy/dx)

Пригласить эксперта


Похожие вопросы


  • Показать ещё
    Загружается…

20 мая 2023, в 15:39

1000 руб./в час

20 мая 2023, в 15:37

750 руб./в час

20 мая 2023, в 14:47

5000 руб./за проект

Минуточку внимания



Мастер

(1750),
закрыт



10 лет назад

Дополнен 10 лет назад

одна точка лежит в начале координат, нужно найти угол второй точки относительно оси 0х

Алик Гайбуллаев

Мастер

(1795)


10 лет назад

Если вы про угол между осью ОХ и прямой, проходящей через данную точку и начало координат, то формула такая: arctg(y/x). Но тут надо быть осторожным, т. к. при отрицательном у, угол тоже будет отрицательным и при х=0 угол будет равен 90 гр. (а тангенс в этом случае не существует) , нужно ставить условия, например:
При х>0 а=arctg(|y|/x), при x<0 a=pi-arctg(|y/x|) а при x=0 а=pi/2; (в радианах)

Угол между векторами

Определение

Угол между векторами — это угол между отрезками, которые изображают эти две направляющие и которые отложены от одной точки пространства. Другими словами — это кратчайший путь, на который можно повернуть один из векторов вокруг его начала до положения общей направленности со вторым.

Угол между векторами

 

На изображении это α, который также можно обозначить следующим образом:

(left(widehat{overrightarrow a;overrightarrow b}right))

Осторожно! Если преподаватель обнаружит плагиат в работе, не избежать крупных проблем (вплоть до отчисления). Если нет возможности написать самому, закажите тут.

Как и любой другой угол, векторный может быть представлен в нескольких вариациях.

Острый:

Острый угол между векторами

 

Тупой:

Тупой угол между векторами

 

Прямой:

Прямой угол

 

С величиной (0^circ) (то есть, векторы сонаправлены):

0 градусов

 

С величиной (180^circ) (векторы направлены в противоположные стороны):

180 градусов

 

Нахождение угла между векторами

Как правило, угол между ( overrightarrow a) и (overrightarrow b) можно найти с помощью скалярного произведения или теоремы косинусов для треугольника, который был построен на основе двух этих направляющих.

Определение

Скалярное произведение — это число, которое равно произведению двух направляющих на косинус угла между ними.

Формула скалярного произведения:

(left(overrightarrow a;overrightarrow bright)=left|overrightarrow aright|timesleft|overrightarrow bright|timescosleft(widehat{overrightarrow a;overrightarrow b}right))

  1. Если α — острый, то СП (скалярное произведение) будет положительным числом (cos острого угла — положительное число).
  2. Если векторы имеют общую направленность, то есть угол между ними равен (0^circ), а косинус — 1, то СП будет тоже положительным.
  3. Если α — тупой, то скалярное произведение будет отрицательным (cos тупого угла — отрицательное число).
  4. Если α равен (180^circ), то есть векторы противоположно направлены, то СП тоже отрицательно, потому что cos данного угла равен 1.
  5. Если α — прямой, то СП равно 0, так как косинус (90^circ) равен 0.

В случае, если overrightarrow a и overrightarrow b не нулевые, можно найти косинус α между ними, опираясь на формулу:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|})

Расчет угла, если вектор задан координатами

В случае, когда направляющие расположены на двухмерной плоскости с заданными координатами в виде (overrightarrow a=left(a_x;a_yright)) и (overrightarrow b=left(b_x;b_yright)), то угол между ними можно найти следующим образом:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}})

Если же координаты находятся в трехмерном пространстве и заданы в виде:

(overrightarrow a=left(a_x;a_y;a_zright))

( overrightarrow b=left(b_x;b_y;b_zright))

то формула принимает такой вид:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y+a_zcdot b_z}{sqrt{a_x^2+a_y^2+a_z^2}cdotsqrt{b_x^2+b_y^2+b_z^2}})

Расчет угла, если заданы три точки в прямоугольной системе координат

В этом случае проще будет разобраться с объяснениями сразу на примере.

Допустим, нам известны три точки и их координаты: A(3,-2), B(2,1), C (6,-1). Нужно найти косинус угла между (overrightarrow{AC}) и (overrightarrow{BC}).

Решение

Для начала найдем их координаты по известным координатам заданных точек:

(overrightarrow{AC}=(6-3, -1-(-2))=(3,1))

(overrightarrow{BC}=(6-2, -1-1)=(4,-2))

После этого уже можем применить формулу для определения косинуса угла на плоскости и подставить известные значения:

(cosleft(widehat{overrightarrow{AC};overrightarrow{BC}}right)=frac{(overrightarrow{AC};;overrightarrow{BC})}{left|overrightarrow{AC}right|cdotleft|overrightarrow{BC}right|}=frac{3cdot4+1cdot(-2)}{sqrt{3^2+1^2}cdotsqrt{4^2+{(-2)}^2}}=frac{10}{sqrt{10}cdot2sqrt5}=frac{10}{10sqrt2}=frac1{sqrt2})

Ответ: (cosleft(widehat{overrightarrow{AC};overrightarrow{BC}}right)=frac1{sqrt2}.)

Примеры решения задач

Для наглядности, взглянем на примеры решения задач по данной теме.

Задача 1

Известно, что (overrightarrow a) и (overrightarrow b). Их длины равны 3 и 6 соответственно, а скалярное произведение равно -9. Нужно найти cos угла между векторами и его величину.

Решение

Применим формулу:

( cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|})

Подставим известные значения:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{-9}{3cdot6}=-frac12)

Далее найдем угол между данными векторами:

(arccosleft(-frac12right)=frac{3pi}4)

Ответ: (left(widehat{overrightarrow a;overrightarrow b}right)=-frac12,;left(widehat{overrightarrow a;overrightarrow b}right)=frac{3pi}4.)

Задача 2

В пространстве даны координаты (overrightarrow a=(8; -11; 7)) и (overrightarrow b=(-2; -7; 8)). Вычислить угол α между ними.

Решение

Используем формулу для нахождения косинуса угла между направляющими в трехмерной системе координат:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y+a_zcdot b_z}{sqrt{a_x^2+a_y^2+a_z^2}cdotsqrt{b_x^2+b_y^2+b_z^2}})

Подставляем значения и получаем:

(cosleft(alpharight)=frac{8cdot(-2)+(-11)cdot(-7)+7cdot8}{sqrt{8^2+{(-11)}^2+7^2}cdotsqrt{{(-2)}^2+{(-7)}^2+8^2}}=frac{117}{sqrt{234}cdotsqrt{117}}=frac{sqrt{117}}{sqrt{234}}=frac1{sqrt2}=frac2{sqrt2})

Теперь находим угол α:

(alpha=arccosleft(frac2{sqrt2}right)=45^circ)

Ответ: (45^circ).

Задача 3

Известны (overrightarrow a=(3; 4)) и (overrightarrow b=(2; 5)). Найти угол между ними.

Решение

Для расчета используем формулу:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}})

Подставим известные значения и получим:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}}=frac{3cdot2+4cdot5}{sqrt{3^2+4^2}cdotsqrt{2^2+5^2}}=frac{26}{sqrt{25}cdotsqrt{29}}=frac{26}{5sqrt{29}})

Ответ: (cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{26}{5sqrt{29}})

Добавить комментарий