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

Вступление

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

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

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

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

В свою же очередь одна единственная прямая проходит через 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), как все сломается!
Чтобы решить проблему, Вам необходимо знать, в какую сторону движется автомобиль. Я не знаю деталей Вашей реализации, так что могу предложить кэшировать предыдущую точку, в которой был автомобиль, после чего уже передвигать его на новую. Тем самым Вы спокойно в любой момент времени найдете вектор скорости машины и примените его в расписанном выше алгоритме

If your are using google maps(Android), there is an easy way — Use SphericalUtil

double angle = SphericalUtil.computeHeading(fromLatLng, toLatLng);

Consider we have 2 points and its lat and lng
Then create its Latlng object

LatLng latlng = new LatLng(latValue, lngValue);

After getting Latlng of 2 points, use sperical util to get angle

//import com.google.maps.android.SphericalUtil;
double sphericalValue = SphericalUtil.computeHeading(latLng1, latLng2);

SpericalValue is the angle.
Consider you have a car icon and turn it accordingly to the direction its going. Here its from latLng1 to latLng2 then

Bitmap vehiclePin = rotateIconBitmap(sphericalValue);
mMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).position(latLng2))
               .setIcon(BitmapDescriptorFactory.fromBitmap(vehiclePin));

use the method below to rotate

    Bitmap rotateIconBitmap(double angle) {
       Bitmap source = BitmapFactory.decodeResource(getResources(), 
                                          R.drawable.ic_vehicle_say_car);
       Matrix matrix = new Matrix();
       matrix.postRotate((float) angle);
       return Bitmap.createBitmap(source, 0, 0, 
                    source.getWidth(), source.getHeight(), matrix, true);
    }

enter image description here

Easy way to achieve uber like rotated icons

Note:- You may have to add an offset of say 90 degree if the marker icon is not pointed to zero degree

The android sphericalutil is open source, refer it if you are using java, you can make use of it.

https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/SphericalUtil.java

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

Есть пространство 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°.

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

источники:

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

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

-24 / 7 / 3

Регистрация: 06.04.2011

Сообщений: 85

1

02.01.2013, 04:25. Показов 37361. Ответов 2


Студворк — интернет-сервис помощи студентам

Есть две точки, допустим Point1(45, 45) и Point2(90, 0) как найти их угол?
Итак понятно что он равен 135, но я не знаю формулу чтобы его высчитывать с другими координата.

Кликните здесь для просмотра всего текста

В школе много прогуливал.

Миниатюры

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



0



Sylvos

-24 / 7 / 3

Регистрация: 06.04.2011

Сообщений: 85

02.01.2013, 07:35

 [ТС]

2

Все уже не надо, просто использую встроенную функцию C#.

C#
1
2
3
4
double x1 = Point1.x, y1 = Point1.y;
double x2 = Point2.x, y2 = Point2.y;
double A = Math.Atan2(y1 - y2, x1 - x2) / Math.PI * 180;
A = (A < 0) ? A + 360 : A;   //Без этого диапазон от 0...180 и -1...-180

Добавлено через 1 час 0 минут
Хочу еще спросить как узнать длину линии от Poin1 к Point2?

Добавлено через 9 минут
Расстояние = SQRT( (x2-x1)^2 + (y2-y1)^2 )



1



0 / 0 / 1

Регистрация: 08.02.2013

Сообщений: 51

21.03.2015, 21:05

3

Спасибо! Насчёт угла помогло очень.. правда я искал с Point1, Point2 и если бы ещё на 90 градусе была Point3 чтоб между Point2 — Point3 ними найти градус или радиант Point1. Если знаешь подскажи. К слову я школу не прогуливал, просто у соседа в 95 был комп и старкрафт меня засосал как первая крутая игра)



0



my-nickname

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

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


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

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

  • 3652 просмотра


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


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

delphinpro

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

DirecTwiX

DTX

@DirecTwiX

«display: flex;» уже предлагали?

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

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


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


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

30 мая 2023, в 00:55

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

30 мая 2023, в 00:34

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

29 мая 2023, в 23:21

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

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

Понравилась статья? Поделить с друзьями:
  • Kingdom come deliverance как найти работа
  • Как найти друга для девочек 11 лет
  • Как найти фактическое время работы
  • Как найти си бемоль мажор
  • Как найти второй монитор на компьютере