Угол между двумя 2d векторами, разница между двумя методами? - PullRequest
8 голосов
/ 19 апреля 2010

У меня есть этот фрагмент кода, и мне интересно, почему результаты первого метода отличаются от результатов второго метода при одинаковом вводе?

public double AngleBetween_1(vector a, vector b) {
  var dotProd = a.Dot(b);
  var lenProd = a.Len*b.Len;
  var divOperation = dotProd/lenProd;
  return Math.Acos(divOperation) * (180.0 / Math.PI);
}

public double AngleBetween_2(vector a, vector b) {
  var dotProd = a.Dot(b);
  var lenProd = a.Len*b.Len;
  var divOperation = dotProd/lenProd;
  return (1/Math.Cos(divOperation)) * (180.0 / Math.PI);
}

Ответы [ 3 ]

16 голосов
/ 19 апреля 2010

Это потому, что первый метод правильный, а второй метод неправильный.

Вы можете заметить, что функция arccosine иногда пишется как «acos», а иногда «cos -1 ». Это своеобразная математическая запись: «cos -1 » на самом деле является арккозином, а НЕ является обратной величиной косинуса (который является секущим).

Однако, если вы когда-нибудь увидите «cos 2 », то это квадрат косинуса, а «cos 3 » - куб косинуса. Обозначения для тригонометрических функций странные таким образом. Большинство операторов используют верхние индексы для указания повторного применения.

5 голосов
/ 19 апреля 2010

Math.Acos(divOperation) не эквивалентно 1/Math.Cos(divOperation). arccos - это обратная функция от cos, а не мультипликативная обратная.

3 голосов
/ 19 апреля 2010

Возможно, потому что acos (x) ≠ 1 / cos (x).

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