2010-04-19 9 views
1

Эй, все. Я вычисляю угол между двумя векторами, а иногда Math.Acos() возвращает NaN, когда он вводится за пределы (-1> input & & input> 1) для косинуса. Что именно это значит? Кто-нибудь сможет объяснить, что происходит? Любая помощь приветствуется!Как интерпретировать ситуации, когда Math.Acos() сообщает о некорректном вводе?

Вот мой метод:

public double AngleBetween(vector b) 
    { 
     var dotProd = this.Dot(b); 
     var lenProd = this.Len*b.Len; 
     var divOperation = dotProd/lenProd; 

     // http://msdn.microsoft.com/en-us/library/system.math.acos.aspx 
     return Math.Acos(divOperation) * (180.0/Math.PI); 
    } 

Вот моя реализация Dot и Len:

public double Dot(vector b) 
    { 
     // x's and y's are lattitudes and longitudes (respectively) 
     return (this.From.x*b.From.x + this.From.y*b.From.y); 
    } 

    public double Len{ 
     get 
     { 
      // geo is of type SqlGeography (MS SQL 2008 Spatial Type) with an SRID of 4326 
      return geo.STLength().Value; 
     } 
    } 
+0

nitpick: условие вне пределов должно быть записано: '(-1> input || input> 1)' или даже '! (- 1 <= input && input <= 1)'. – MatrixFrog

+2

Но пара (широта, долгота) не является двумерным вектором, они представляют собой измерения угла в 3D. Итак, что вы пытаетесь найти? Возможно, внутренний угол в центре земли или подшипник между ними? Эта формула тоже не поможет. –

+0

Кроме того, что такое «От»? Для объекта 2D Vector вы ожидаете, что он будет содержать значения x и y, а метод Dot будет именно этим. X * другой.X + это.Y * прочее.Y. Вы также ожидаете, что метод Len просто вернет sqrt (x * x + y * y), а не какое-то значение, вычисленное из чего-то другого. –

ответ

2

У вас есть векторы, из которых divOperation окажется < -1 или> 1? Тогда я думаю, вы должны проверить свои реализации Dot и Len.

+0

Я добавил точку и len к вопросу. Посмотрите и скажите мне, что вы думаете. – bitcycle

+0

О, я только это заметил. Я оставил ключевую часть метода dot(). – bitcycle

+0

@Sean, можете ли вы опубликовать объяснение того, что было для этой важной части, для тех из нас, которые могут быть любопытными? – MatrixFrog

0

NaN means "not a number". Математически вы не можете взять arccosine из числа, которое находится за пределами диапазона [-1, 1] (или, может быть, вы можете, но результат сложный - я не помню), поэтому результат попыток сделать это не сколько угодно.

+0

Итак, что это говорит о двух векторах и их соответствующих направлениях? – bitcycle

+0

Хороший вопрос. Можете ли вы предоставить пару образцов векторов, для которых это не удается? – MatrixFrog

1

Поскольку Cos угла всегда находится между -1 и +1, невозможно вычислить обратную функцию (Acos) значения вне этого диапазона ИЛИ это означает, что вы передали NaN функции ACos.

Я подозреваю, что в этом случае это последняя - одна из ваших длин, вероятно, равна нулю.

 Смежные вопросы

  • Нет связанных вопросов^_^