угол против часовой стрелки между двумя векторами в cpp [duplicate]

Исправить исключение NullReferenceException можно с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.

Он используется для проверки нуля до выполнения доступа к члену (?. ) или index (? [).

Пример

  var name = p?.Spouse?.FirstName;

эквивалентен:

    if (p != null)
    {
        if (p.Spouse != null)
        {
            name = p.Spouse.FirstName;
        }
    }

В результате имя будет нулевым когда p равно null или когда p.Spouse имеет значение null.

В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.

Для получения дополнительной информации: Операторы с нулевым условием

26
задан Cerin 27 January 2010 в 21:34
поделиться

2 ответа

Если у вас есть функция atan2 () в вашей математической библиотеке по выбору:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
33
ответ дан Sparr 3 September 2018 в 14:06
поделиться
  • 1
    Что относительно a = (-1,1) и b = (-1, -1), где ответ должен быть pi / 2? Вы должны проверить, больше ли абсолютное значение pi, а затем добавить или вычесть 2 * pi, если это так. – Derek Ledbetter 27 January 2010 в 22:52
  • 2
    @Derek Хорошая добыча. Фактически я сам это обнаружил при реализации решения. – Cerin 28 January 2010 в 14:06
  • 3
    он не очень подходит, например, для компьютерной графики, потому что он путает -pi и pi, если у меня есть a = {-1, 0} и b = {0, 1}. – user2083364 17 October 2013 в 09:26
  • 4
    В степени, результат этого ответа должен быть [-180, 180], но некоторое время я обнаруживаю результат, например: 358.5. Ответ Дерека Ледбеттера отлично работает. – Helin Wang 10 January 2014 в 04:47

То, что вы хотите использовать, часто называют «продуктом точка-точка», т. е. найти вектор, перпендикулярный одному из векторов, а затем найти точечный продукт с другим вектором.

if(a.x*b.y - a.y*b.x < 0)
    angle = -angle;

Вы также можете сделать это:

angle = atan2( a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y );
50
ответ дан Derek Ledbetter 3 September 2018 в 14:06
поделиться
  • 1
    знаете ли вы, что второе уравнение всегда возвращает углы меньше 180º? – rraallvv 2 March 2013 в 18:32
  • 2
    Угол будет находиться между -pi и pi радианами, включительно. – Derek Ledbetter 6 March 2013 в 04:30
  • 3
    Человек, это все, что мне нужно! Работает безупречно в 2d, спасибо! – Gustavo Maciel 15 October 2013 в 01:09
  • 4
    Все остальные повторяющиеся вопросы должны быть связаны с этим вопросом и этим ответом; это так мало документировано (даже не содержит статьи в википедии) – bright-star 23 November 2013 в 06:23
  • 5
    Можете ли вы объяснить, как работает вторая версия? В частности, вы переходите в atan2. – Tara 27 April 2016 в 05:08
Другие вопросы по тегам:

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